parse_p1 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 385d560b817db7e1f0e047f3783d8908525cdd8d
4
+ data.tar.gz: 9b0be70a66a5ee4f991b80acc0ec7ee5aa9969fd
5
+ SHA512:
6
+ metadata.gz: c70945d8d2cb78e3b6dc4401c8f0cb93ae6db1ed031614a0b31d25415b81bd68b2cc4624e3a7cda003862ecb2f33b2e125f6a4790831c8c4ba2c618d4c8809d2
7
+ data.tar.gz: 0d0a1f7e827738f43084f013a8978f9dcf11739228d63f396aad78b3b3e7ac3bd9d3126163e14ad3d25c61fedf05ce018dfe57edb3339f633f7d064d37875bd7
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ parse_p1
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.2
data/.travis.yml CHANGED
@@ -1,10 +1,9 @@
1
1
  rvm:
2
- - 1.9.3
3
- - 1.9.2
4
- - 1.8.7
2
+ - 2.1.6
3
+ - 2.2.2
5
4
 
6
5
  branches:
7
6
  only:
8
7
  - master
9
8
 
10
- script: "bundle exec rake test"
9
+ script: "bundle exec rake test"
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ * 0.1.1
2
+ Major refactor to simplify and increase robustness of parser, it now also handles the Landys & Gyr E350 meter
3
+
1
4
  * 0.1.0
2
5
  Parse Gas values with different OBIS codes because of RF module on Gas meter
3
6
 
@@ -9,7 +12,7 @@
9
12
 
10
13
  * 0.0.7
11
14
  Set encoding to UTF8
12
-
15
+
13
16
  * 0.0.6
14
17
  Added so called direct methods electra_import_normal, electra_import_low, electra_export_normal and electra_export_low
15
18
 
@@ -26,4 +29,4 @@
26
29
  Parsing of electricity and gas values
27
30
 
28
31
  * 0.0.1
29
- Initial release
32
+ Initial release
data/Gemfile CHANGED
@@ -1,6 +1,7 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gem 'rake', '~>0.9.2.2'
4
+ gem 'awesome_print'
4
5
 
5
6
  # Specify your gem's dependencies in parse_p1.gemspec
6
7
  gemspec
data/lib/parse_p1.rb CHANGED
@@ -9,6 +9,7 @@ if RUBY_VERSION =~ /1.9/
9
9
  end
10
10
 
11
11
  require 'date'
12
+ require 'awesome_print'
12
13
  require 'parse_p1/electricity'
13
14
  require 'parse_p1/gas'
14
15
  require 'parse_p1/base'
data/lib/parse_p1/base.rb CHANGED
@@ -7,27 +7,53 @@ module ParseP1
7
7
  include ParseP1::Electricity
8
8
  include ParseP1::Gas
9
9
 
10
- attr_reader :data
10
+ attr_reader :data, :device_id, :obis_records
11
11
 
12
12
  def initialize(data)
13
- @data = data
13
+ @data = data.split('/').last.split('!').first.split
14
+ @obis_records = {}
15
+ extract_obis_records(@data)
14
16
  end
15
17
 
16
18
  def valid?
17
- !data.match(/!/).nil? && !device_id.nil?
19
+ electra_meter_id.is_a?(String) && actual_electra.is_a?(Float) && gas_meter_id.is_a?(String) && gas_usage.is_a?(Float)
18
20
  end
19
21
 
20
22
  def device_id
21
- match_within_one_p1_record('\/([a-zA-Z]{3}\d{1}.+[a-zA-Z]{2}\d{3}-\d{4})')
23
+ data.shift
22
24
  end
23
25
 
24
26
  private
25
27
 
26
- def match_within_one_p1_record(pattern)
27
- data.match(/[\W|\w]*#{pattern}[\W|\w]*!/)
28
+ def extract_obis_records(data)
29
+ data.each do |item|
30
+ obis_values = item.split('(')
31
+ previous_values = []
32
+
33
+ key = extract_key(obis_values)
34
+
35
+ #Values without a key are associated with the last known key
36
+ if key.nil?
37
+ key = @obis_records.keys.last
38
+ previous_values = @obis_records[key] if key
39
+ end
40
+
41
+ @obis_records[key] = previous_values + cleanup(obis_values)
42
+ end
43
+ end
44
+
45
+ def extract_key(record)
46
+ record.first.match(obis_record_pattern)
28
47
  $1
29
48
  end
30
49
 
50
+ def cleanup(obis_values)
51
+ obis_values[1..-1].map {|value| value[-1] == ')' ? value.chop : value }
52
+ end
53
+
54
+ def obis_record_pattern
55
+ /(\d+-\d+:\d+\.\d+.\d+)/
56
+ end
31
57
  end
32
58
 
33
- end
59
+ end
@@ -5,76 +5,63 @@ module ParseP1
5
5
  module Electricity
6
6
 
7
7
  def electra_meter_id
8
- match_within_one_p1_record('0:96\.1\.1\S(\d{1}[A-Z]{1}\d{1,96})\S')
8
+ result = obis_records['0-0:96.1.1']
9
+ result.first if result
9
10
  end
10
11
 
11
12
  def electricity_tariff_indicator
12
- result = match_within_one_p1_record('0-0:96\.14\.0\S(\d{1,9})\S')
13
- result.to_i if result
13
+ get_electricity('0-0:96.14.0')
14
14
  end
15
15
 
16
16
  def electricity_actual_threshold
17
- electricity('0-0:17\.0\.0')
17
+ get_electricity('0-0:17.0.0')
18
18
  end
19
19
 
20
20
  def electra_import_low
21
- electricity(:type => :import, :tariff => :low)
21
+ get_electricity('1-0:1.8.1')
22
22
  end
23
23
 
24
24
  def electra_import_normal
25
- electricity(:type => :import, :tariff => :normal)
25
+ get_electricity('1-0:1.8.2')
26
26
  end
27
27
 
28
28
  def electra_export_low
29
- electricity(:type => :export, :tariff => :low)
29
+ get_electricity('1-0:2.8.1')
30
30
  end
31
31
 
32
32
  def electra_export_normal
33
- electricity(:type => :export, :tariff => :normal)
33
+ get_electricity('1-0:2.8.2')
34
34
  end
35
35
 
36
+ #Only for backward compatibility
36
37
  def actual_electra
37
- electricity(:type => :import, :actual => true)
38
+ electra_import_actual
39
+ end
40
+
41
+ def electra_import_actual
42
+ get_electricity('1-0:1.7.0') * 1000
43
+ end
44
+
45
+ def electra_export_actual
46
+ get_electricity('1-0:2.7.0') * 1000
38
47
  end
39
48
 
40
49
  def electricity(options)
41
- if options.is_a?(Hash)
42
- if options[:actual] == true
43
- get_actual_electricity(options[:type])
44
- else
45
- get_electricity("1-0:#{first_electricity_code(options[:type])}.8.#{second_electricity_code(options[:tariff])}")
46
- end
50
+ message = "electra_#{options[:type].to_s}_"
51
+ if options[:actual] == true
52
+ send(message + 'actual')
47
53
  else
48
- get_electricity(options)
54
+ send(message + "#{options[:tariff].to_s}")
49
55
  end
50
56
  end
51
57
 
52
58
  private
53
59
 
54
60
  def get_electricity(obis_code)
55
- data.match(/\/[\W|\w]*#{obis_code}\S(\d{1,9}\.\d{1,3})\S[\W|\w]*!/)
56
- $1.to_f if $1
57
- end
58
-
59
- def get_actual_electricity(type)
60
- power = get_electricity("1-0:#{first_electricity_code(type)}\.7\.0")
61
- (power * 1000).to_i if power#Return as watts instead of kW
62
- end
63
-
64
- def first_electricity_code(code)
65
- case code
66
- when :import; '1'
67
- when :export; '2'
68
- end
69
- end
70
-
71
- def second_electricity_code(tariff)
72
- case tariff
73
- when :low; 1
74
- when :normal; 2
75
- end
61
+ result = obis_records[obis_code]
62
+ result ? result.first.to_f : 0.0
76
63
  end
77
64
 
78
65
  end
79
66
 
80
- end
67
+ end
data/lib/parse_p1/gas.rb CHANGED
@@ -5,24 +5,39 @@ module ParseP1
5
5
  module Gas
6
6
 
7
7
  def gas_meter_id
8
- match_within_one_p1_record('[1|2]:96\.1\.0\S(\d{1,96})\S')
8
+ obis_records['0-1:96.1.0'].first
9
9
  end
10
10
 
11
11
  #Only 2 digits for year!
12
12
  def last_hourly_reading_gas
13
- result = match_within_one_p1_record('0-[1|2]:24\.3\.0\S(\d{12})\S')
13
+ result = get_gas(0)
14
14
  DateTime.new(('20'+result[0..1]).to_i, result[2..3].to_i, result[4..5].to_i, result[6..7].to_i, result[8..9].to_i) if result
15
15
  end
16
16
 
17
+ #TODO remove this silly method?
17
18
  def measurement_unit_gas
18
- match_within_one_p1_record('0-[1|2]:24\.2\.1\S\S(\w+)\S')
19
+ 'm3'
19
20
  end
20
21
 
21
22
  def gas_usage
22
- result = match_within_one_p1_record('\S0-[1|2]:24\.2\.1\S\S\w+\S\W{1,2}\S(\d{5}\.\d{3})\S')
23
+ result = get_gas(-1)
23
24
  result.to_f if result
24
25
  end
25
26
 
27
+ private
28
+
29
+ def get_gas(index_of_values)
30
+ gas_obis_codes.each do |obis_code|
31
+ @result = obis_records[obis_code]
32
+ break unless @result.nil?
33
+ end
34
+ @result[index_of_values] if @result
35
+ end
36
+
37
+ def gas_obis_codes
38
+ ['0-1:24.3.0', '0-1:24.2.1', '0-2:24.1.0', '0-2:24.3.0', '0-2:24.2.1', '0-2:24.4.0']
39
+ end
40
+
26
41
  end
27
42
 
28
- end
43
+ end
@@ -1,3 +1,3 @@
1
1
  module ParseP1
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/parse_p1.gemspec CHANGED
@@ -11,7 +11,6 @@ Gem::Specification.new do |s|
11
11
  s.summary = %q{Parsing P1 Companion Standard used by Dutch Smart Meters}
12
12
  s.description = %q{Parsing P1 Companion Standard used by Dutch Smart Meters. Used in combination with a Nanode posting the P1 data to emonWeb.org}
13
13
  s.licenses = ['MIT']
14
- s.rubyforge_project = "parse_p1"
15
14
 
16
15
  s.extra_rdoc_files = [
17
16
  'CHANGELOG',
@@ -24,6 +23,7 @@ Gem::Specification.new do |s|
24
23
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
24
  s.require_paths = ["lib"]
26
25
 
26
+ s.add_development_dependency 'minitest'
27
27
  s.add_development_dependency 'shoulda'
28
28
  s.add_development_dependency 'guard'
29
29
  s.add_development_dependency 'guard-test'
data/test/helper.rb CHANGED
@@ -7,6 +7,8 @@ rescue Bundler::BundlerError => e
7
7
  $stderr.puts "Run `bundle install` to install missing gems"
8
8
  exit e.status_code
9
9
  end
10
+
11
+ require 'minitest'
10
12
  require 'test/unit'
11
13
  require 'shoulda'
12
14
 
@@ -0,0 +1,99 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'helper'
4
+
5
+ class TestParseP1_IskraMT171Meter < Test::Unit::TestCase
6
+
7
+ setup do
8
+ @data = "/XMX5XMXABCE100085870\r\n\r\n0-0:96.1.1(31333836343734322020202020202020)\r\n1-0:1.8.1(00477.462*kWh)\r\n1-0:1.8.2(00546.069*kWh)\r\n1-0:2.8.1(00013.172*kWh)\r\n1-0:2.8.2(00031.349*kWh)\r\n0-0:96.14.0(0001)\r\n1-0:1.7.0(0000.23*kW)\r\n1-0:2.7.0(0000.00*kW)\r\n0-0:17.0.0(999*A)\r\n0-0:96.3.10(1)\r\n0-0:96.13.1()\r\n0-0:96.13.0()\r\n0-1:96.1.0(3238303131303038333134303934333133)\r\n0-1:24.1.0(03)\r\n0-1:24.3.0(131013140000)(08)(60)(1)(0-1:24.2.0)(m3)\r\n(00143.136)\r\n0-1:24.4.0(1)\r\n!"
9
+
10
+ @p1 = ParseP1::Base.new(@data)
11
+ end
12
+
13
+ should 'tell if string is P1 valid' do
14
+ assert_equal true, @p1.valid?
15
+ end
16
+
17
+ context 'Device identifiers' do
18
+
19
+ should 'return the device_id of the meter' do
20
+ assert_equal 'XMX5XMXABCE100085870', @p1.device_id
21
+ end
22
+
23
+ #Sn (n=0..96), octet string is NOT true
24
+ should 'return the electra meter identifier of the meter' do
25
+ assert_equal '31333836343734322020202020202020', @p1.electra_meter_id
26
+ end
27
+
28
+ #Sn (n=0..96) octet string
29
+ should 'return the gas meter identifier of the meter' do
30
+ assert_equal '3238303131303038333134303934333133', @p1.gas_meter_id
31
+ end
32
+
33
+ end
34
+
35
+ context 'Electricity data' do
36
+
37
+ #S4 tag 4 bit string is NOT true
38
+ should 'return the electricity tariff indicator' do
39
+ assert_equal 1, @p1.electricity_tariff_indicator
40
+ end
41
+
42
+ #F4(1,1)
43
+ should 'return the electricity actual threshold' do
44
+ assert_equal 999.0, @p1.electricity_actual_threshold
45
+ end
46
+
47
+ #F9 (3,3)
48
+ should 'return imported electricty with low tarif' do
49
+ assert_equal 477.462, @p1.electricity(:type => :import, :tariff => :low)
50
+ assert_equal 477.462, @p1.electra_import_low
51
+ end
52
+
53
+ #F9 (3,3)
54
+ should 'return imported electricty with normal tarif' do
55
+ assert_equal 546.069, @p1.electricity(:type => :import, :tariff => :normal)
56
+ assert_equal 546.069, @p1.electra_import_normal
57
+ end
58
+
59
+ #F9 (3,3)
60
+ should 'return electricty produced by client low tarif' do
61
+ assert_equal 13.172, @p1.electricity(:type => :export, :tariff => :low)
62
+ assert_equal 13.172, @p1.electra_export_low
63
+ end
64
+
65
+ #F9 (3,3)
66
+ should 'return electricty produced by client normal tarif' do
67
+ assert_equal 31.349, @p1.electricity(:type => :export, :tariff => :normal)
68
+ assert_equal 31.349, @p1.electra_export_normal
69
+ end
70
+
71
+ context 'Actual data' do
72
+
73
+ #F5 (3,3)
74
+ should 'return actual power imported' do
75
+ assert_equal 230, @p1.electricity(:type => :import, :actual => true)
76
+ assert_equal 230, @p1.actual_electra
77
+ end
78
+
79
+ end
80
+
81
+ end
82
+
83
+ context 'Gas data' do
84
+
85
+ should 'return the last hourly reading of gas usage' do
86
+ assert_equal DateTime.new(2013,10,13,14,0), @p1.last_hourly_reading_gas
87
+ end
88
+
89
+ should 'return the measurement unit of gas usage' do
90
+ assert_equal 'm3', @p1.measurement_unit_gas
91
+ end
92
+
93
+ should 'return the total usage of gas' do
94
+ assert_equal 143.136, @p1.gas_usage
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -0,0 +1,99 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'helper'
4
+
5
+ class TestParseP1LandisGyrE350 < Test::Unit::TestCase
6
+
7
+ setup do
8
+ @data = "/ABA5LGAAGGB231007559\n\n1-3:0.2.8(40)\n0-0:1.0.0(150407214315S)\n0-0:96.1.1(4190303034303031356660323031353135)\n1-0:1.8.1(002622.819*kWh)\n1-0:2.8.1(000079.439*kWh)\n1-0:1.8.2(001693.579*kWh)\n1-0:2.8.2(000215.374*kWh)\n0-0:96.14.0(0002)\n1-0:1.7.0(00.524*kW)\n1-0:2.7.0(01.230*kW)\n0-0:17.0.0(999.9*kW)\n0-0:96.3.10(1)\n0-0:96.7.21(00003)\n0-0:96.7.9(00001)\n1-0:99.97.0(1)(0-0:96.7.19)(150327114234W)(0000007487*s)\n1-0:32.32.0(00000)\n1-0:32.36.0(00000)\n0-0:96.13.1()\n0-0:96.13.0()\n1-0:31.7.0(002*A)\n1-0:21.7.0(00.524*kW)\n1-0:22.7.0(00.000*kW)\n0-1:24.1.0(003)\n0-1:96.1.0(4736303136353631323035999235153337)\n0-1:24.2.1(150407210000S)(02638.655*m3)\n0-1:24.4.0(1)\n!"
9
+ @p1 = ParseP1::Base.new(@data)
10
+ end
11
+
12
+ context 'Device identifiers' do
13
+
14
+ should 'return the device_id of the meter' do
15
+ assert_equal 'ABA5LGAAGGB231007559', @p1.device_id
16
+ end
17
+
18
+ should 'return the electra meter identifier of the meter' do
19
+ assert_equal '4190303034303031356660323031353135', @p1.electra_meter_id
20
+ end
21
+
22
+ should 'return the gas meter identifier of the meter' do
23
+ assert_equal '4736303136353631323035999235153337', @p1.gas_meter_id
24
+ end
25
+
26
+ end
27
+
28
+ context 'Electricity data' do
29
+
30
+ #S4 tag 4 bit string is NOT true
31
+ should 'return the electricity tariff indicator' do
32
+ assert_equal 2, @p1.electricity_tariff_indicator
33
+ end
34
+
35
+ #F4(1,1)
36
+ should 'return the electricity actual threshold' do
37
+ assert_equal 999.9, @p1.electricity_actual_threshold
38
+ end
39
+
40
+ #F9 (3,3)
41
+ should 'return imported electricty with low tarif' do
42
+ assert_equal 2622.819, @p1.electricity(:type => :import, :tariff => :low)
43
+ assert_equal 2622.819, @p1.electra_import_low
44
+ end
45
+
46
+ #F9 (3,3)
47
+ should 'return imported electricty with normal tarif' do
48
+ assert_equal 1693.579, @p1.electricity(:type => :import, :tariff => :normal)
49
+ assert_equal 1693.579, @p1.electra_import_normal
50
+ end
51
+
52
+ #F9 (3,3)
53
+ should 'return electricty produced by client low tarif' do
54
+ assert_equal 79.439, @p1.electricity(:type => :export, :tariff => :low)
55
+ assert_equal 79.439, @p1.electra_export_low
56
+ end
57
+
58
+ #F9 (3,3)
59
+ should 'return electricty produced by client normal tarif' do
60
+ assert_equal 215.374, @p1.electricity(:type => :export, :tariff => :normal)
61
+ assert_equal 215.374, @p1.electra_export_normal
62
+ end
63
+
64
+ context 'Actual data' do
65
+
66
+ #F5 (3,3)
67
+ should 'return actual power imported' do
68
+ assert_equal 524, @p1.electricity(:type => :import, :actual => true)
69
+ assert_equal 524, @p1.actual_electra
70
+ assert_equal 524, @p1.electra_import_actual
71
+ end
72
+
73
+ #F5 (3,3)
74
+ should 'return actual power in case of a low tarif' do
75
+ assert_equal 1230, @p1.electricity(:type => :export, :actual => true)
76
+ assert_equal 1230, @p1.electra_export_actual
77
+ end
78
+
79
+ end
80
+
81
+ end
82
+
83
+ context 'Gas data' do
84
+
85
+ should 'return the last hourly reading of gas usage' do
86
+ assert_equal DateTime.new(2015,4,7,21,0), @p1.last_hourly_reading_gas
87
+ end
88
+
89
+ should 'return the measurement unit of gas usage' do
90
+ assert_equal 'm3', @p1.measurement_unit_gas
91
+ end
92
+
93
+ should 'return the total usage of gas' do
94
+ assert_equal 2638.655, @p1.gas_usage
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -11,10 +11,6 @@ class TestParseP1 < Test::Unit::TestCase
11
11
  @p1 = ParseP1::Base.new(@data)
12
12
  end
13
13
 
14
- should 'return the p1_string' do
15
- assert_equal @data, @p1.data
16
- end
17
-
18
14
  should 'tell if string is P1 valid' do
19
15
  assert_equal true, @p1.valid?
20
16
  end
@@ -22,15 +18,16 @@ class TestParseP1 < Test::Unit::TestCase
22
18
  context 'Device identifiers' do
23
19
 
24
20
  should 'return the device_id of the meter' do
25
- assert_equal 'ABc1\1AB123-4567', @p1.device_id
21
+ assert_equal 'ABc1\1AB123-4567', @p1.device_id
26
22
  end
27
23
 
28
24
  #Sn (n=0..96), octet string is NOT true
29
25
  should 'return the electra meter identifier of the meter' do
26
+ # '4530303034303031353330323031353134'
30
27
  assert_equal '1A123456789012345678901234567890', @p1.electra_meter_id
31
28
  end
32
29
 
33
- #Sn (n=0..96) octet string
30
+ #Sn (n=0..96) octet string
34
31
  should 'return the gas meter identifier of the meter' do
35
32
  assert_equal '1234567890123456789012345678901234', @p1.gas_meter_id
36
33
  end
@@ -49,11 +46,6 @@ class TestParseP1 < Test::Unit::TestCase
49
46
  assert_equal 999.0, @p1.electricity_actual_threshold
50
47
  end
51
48
 
52
- #F9 (3,3)
53
- should 'return electricity with a corresponding obis code' do
54
- assert_equal 136.787, @p1.electricity('1-0:1.8.1')
55
- end
56
-
57
49
  #F9 (3,3)
58
50
  should 'return imported electricty with low tarif' do
59
51
  assert_equal 136.787, @p1.electricity(:type => :import, :tariff => :low)
@@ -83,12 +75,14 @@ class TestParseP1 < Test::Unit::TestCase
83
75
  #F5 (3,3)
84
76
  should 'return actual power imported' do
85
77
  assert_equal 3200, @p1.electricity(:type => :import, :actual => true)
86
- assert_equal 3200, @p1.actual_electra
78
+ assert_equal 3200, @p1.actual_electra #Still in use for backward compability
79
+ assert_equal 3200, @p1.electra_import_actual
87
80
  end
88
81
 
89
82
  #F5 (3,3)
90
83
  should 'return actual power in case of a low tarif' do
91
84
  assert_equal 120, @p1.electricity(:type => :export, :actual => true)
85
+ assert_equal 120, @p1.electra_export_actual
92
86
  end
93
87
 
94
88
  end
@@ -113,27 +107,15 @@ class TestParseP1 < Test::Unit::TestCase
113
107
 
114
108
  context 'Gas data send through RF (different OBIS codes)' do
115
109
 
116
- setup do
117
- #Different OBIS codes for RF gas measurement:
118
- # => 0-2:24.1.0
119
- # => 0-2:96.1.0
120
- # => 0-2:24.3.0
121
- # => 0-2:24.2.1
122
- # => 0-2:24.4.0
123
- data = "sBs\u0012C\u0002\u0002\nK*r\"CKR[Wh)\r\n1-0:2.8.1(00000.000*kWh)\r\n1-0:2.8.2(00000.\r\n/ABc1\\1AB123-4567\r\n\r\n0-0:96.1.1(1A123456789012345678901234567890)\r\n1-0:1.8.1(00136.787*kWh)\r\n1-0:1.8.2(00131.849*kWh)\r\n1-0:2.8.1(00002.345*kWh)\r\n1-0:2.8.2(00054.976*kWh)\r\n0-0:96.14.0(0002)\r\n1-0:1.7.0(0003.20*kW)\r\n1-0:2.7.0(0000.12*kW)\r\n0-0:17.0.0(0999.00*kW)\r\n0-0:96.3.10(1)\r\n0-0:96.13.1()\r\n0-0:96.13.0()\r\n0-2:24.1.0(3)\r\n0-2:96.1.0(1234567890123456789012345678901234)\r\n0-2:24.3.0(120502150000)(00)(60)(1)(0-2:24.2.1)(m3)\r\n(00092.112)\r\n0-2:24.4.0(1)\r\n!"
124
- @p2 = ParseP1::Base.new(@data)
125
- end
126
-
127
- should 'return the last hourly reading of gas usage' do
128
- assert_equal DateTime.new(2012,5,2,15,0), @p2.last_hourly_reading_gas
129
- end
130
-
131
- should 'return the measurement unit of gas usage' do
132
- assert_equal 'm3', @p2.measurement_unit_gas
133
- end
134
-
135
110
  should 'return the total usage of gas' do
136
- assert_equal 92.112, @p2.gas_usage
111
+ def p1_data(obis_code)
112
+ "sBs\u0012C\u0002\u0002\nK*r\"CKR[Wh)\r\n1-0:2.8.1(00000.000*kWh)\r\n1-0:2.8.2(00000.\r\n/ABc1\\1AB123-4567\r\n\r\n0-0:96.1.1(1A123456789012345678901234567890)\r\n1-0:1.8.1(00136.787*kWh)\r\n1-0:1.8.2(00131.849*kWh)\r\n1-0:2.8.1(00002.345*kWh)\r\n1-0:2.8.2(00054.976*kWh)\r\n0-0:96.14.0(0002)\r\n1-0:1.7.0(0003.20*kW)\r\n1-0:2.7.0(0000.12*kW)\r\n0-0:17.0.0(0999.00*kW)\r\n0-0:96.3.10(1)\r\n0-0:96.13.1()\r\n0-0:96.13.0()\r\n0-1:24.1.0(3)\r\n0-2:96.1.0(1234567890123456789012345678901234)\r\n" +obis_code + "(120502150000)(00)(60)(1)(0-2:24.2.1)(m3)\r\n(00092.112)\r\n0-1:24.4.0(1)\r\n!"
113
+ end
114
+
115
+ ['0-2:24.1.0', '0-2:24.3.0', '0-2:24.2.1', '0-2:24.4.0'].each do |obis_code|
116
+ p1 = ParseP1::Base.new(p1_data(obis_code))
117
+ assert_equal 92.112, p1.gas_usage
118
+ end
137
119
  end
138
120
 
139
121
  end
@@ -151,9 +133,9 @@ class TestParseP1 < Test::Unit::TestCase
151
133
  should 'tell if a very meshed string is P1 valid' do
152
134
  @irregular_data.each do |record|
153
135
  p1 = ParseP1::Base.new(record)
154
- assert_equal true, p1.valid?
136
+ assert p1.valid?
155
137
  assert p1.gas_usage.is_a?(Float)
156
- assert p1.actual_electra.is_a?(Integer)
138
+ assert p1.actual_electra.is_a?(Float)
157
139
  assert p1.device_id.is_a?(String)
158
140
  assert p1.electra_meter_id.is_a?(String)
159
141
  assert p1.gas_meter_id.is_a?(String)
@@ -166,4 +148,4 @@ class TestParseP1 < Test::Unit::TestCase
166
148
 
167
149
  end
168
150
 
169
- end
151
+ end
metadata CHANGED
@@ -1,62 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parse_p1
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Frank Oxener
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-15 00:00:00.000000000 Z
11
+ date: 2015-04-16 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: shoulda
16
29
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
30
  requirements:
19
- - - ! '>='
31
+ - - ">="
20
32
  - !ruby/object:Gem::Version
21
33
  version: '0'
22
34
  type: :development
23
35
  prerelease: false
24
36
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
37
  requirements:
27
- - - ! '>='
38
+ - - ">="
28
39
  - !ruby/object:Gem::Version
29
40
  version: '0'
30
41
  - !ruby/object:Gem::Dependency
31
42
  name: guard
32
43
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
44
  requirements:
35
- - - ! '>='
45
+ - - ">="
36
46
  - !ruby/object:Gem::Version
37
47
  version: '0'
38
48
  type: :development
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
- - - ! '>='
52
+ - - ">="
44
53
  - !ruby/object:Gem::Version
45
54
  version: '0'
46
55
  - !ruby/object:Gem::Dependency
47
56
  name: guard-test
48
57
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
58
  requirements:
51
- - - ! '>='
59
+ - - ">="
52
60
  - !ruby/object:Gem::Version
53
61
  version: '0'
54
62
  type: :development
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
65
  requirements:
59
- - - ! '>='
66
+ - - ">="
60
67
  - !ruby/object:Gem::Version
61
68
  version: '0'
62
69
  description: Parsing P1 Companion Standard used by Dutch Smart Meters. Used in combination
@@ -70,9 +77,10 @@ extra_rdoc_files:
70
77
  - LICENSE.txt
71
78
  - README.md
72
79
  files:
73
- - .gitignore
74
- - .rvmrc
75
- - .travis.yml
80
+ - ".gitignore"
81
+ - ".ruby-gemset"
82
+ - ".ruby-version"
83
+ - ".travis.yml"
76
84
  - CHANGELOG
77
85
  - Gemfile
78
86
  - Guardfile
@@ -90,38 +98,35 @@ files:
90
98
  - lib/parse_p1/version.rb
91
99
  - parse_p1.gemspec
92
100
  - test/helper.rb
101
+ - test/parse_p1_IskraMT171_meter_test.rb
102
+ - test/parse_p1_landisgyr_e350_test.rb
93
103
  - test/parse_p1_test.rb
94
104
  homepage: http://github.com/dovadi/parse_p1
95
105
  licenses:
96
106
  - MIT
107
+ metadata: {}
97
108
  post_install_message:
98
109
  rdoc_options: []
99
110
  require_paths:
100
111
  - lib
101
112
  required_ruby_version: !ruby/object:Gem::Requirement
102
- none: false
103
113
  requirements:
104
- - - ! '>='
114
+ - - ">="
105
115
  - !ruby/object:Gem::Version
106
116
  version: '0'
107
- segments:
108
- - 0
109
- hash: 1064997931082939182
110
117
  required_rubygems_version: !ruby/object:Gem::Requirement
111
- none: false
112
118
  requirements:
113
- - - ! '>='
119
+ - - ">="
114
120
  - !ruby/object:Gem::Version
115
121
  version: '0'
116
- segments:
117
- - 0
118
- hash: 1064997931082939182
119
122
  requirements: []
120
- rubyforge_project: parse_p1
121
- rubygems_version: 1.8.25
123
+ rubyforge_project:
124
+ rubygems_version: 2.4.5
122
125
  signing_key:
123
- specification_version: 3
126
+ specification_version: 4
124
127
  summary: Parsing P1 Companion Standard used by Dutch Smart Meters
125
128
  test_files:
126
129
  - test/helper.rb
130
+ - test/parse_p1_IskraMT171_meter_test.rb
131
+ - test/parse_p1_landisgyr_e350_test.rb
127
132
  - test/parse_p1_test.rb
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm use 1.9.3@parse_p1 --create