diff --git a/lib/zaptec/state.rb b/lib/zaptec/state.rb index 763cfa4..5c6cd98 100644 --- a/lib/zaptec/state.rb +++ b/lib/zaptec/state.rb @@ -36,7 +36,10 @@ def session_identifier def operation_mode = charger_operation_mode def meter_reading - @meter_reading ||= MeterReading.parse(@data.fetch(:SignedMeterValue)) + signed_meter_value = @data[:SignedMeterValue] + return if signed_meter_value.blank? + + @meter_reading ||= MeterReading.parse(signed_meter_value) end private diff --git a/spec/zaptec/state_spec.rb b/spec/zaptec/state_spec.rb index 61ea99c..d3e1cd0 100644 --- a/spec/zaptec/state_spec.rb +++ b/spec/zaptec/state_spec.rb @@ -18,4 +18,34 @@ expect(state).not_to be_final_stop_active end end + + describe "#meter_reading" do + it "parses the signed meter value when present" do + state = Zaptec::State.new(SignedMeterValue: example_meter_reading) + + expect(state.meter_reading).to have_attributes(reading_kwh: 2935.6) + end + + it "is nil when the SignedMeterValue observation is missing from the API response" do + state = Zaptec::State.new({}) + + expect(state.meter_reading).to be_nil + end + end + + def example_meter_reading + <<~OCMF + OCMF|{ + "FV": "1.0", + "RD": [ + { + "TM": "2018-07-24T13:22:04,000+0200 S", + "RV": 2935.6, + "RU": "kWh", + "ST": "G" + } + ] + }|{"SD":"abc"} + OCMF + end end