From bcea9698dd56317dd00ccbc6ba1b008dde302a5f Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Tue, 5 Sep 2023 08:57:15 +0200 Subject: [PATCH] Apply previous state when receiving only accumulated values from meter --- src/AmsToMqttBridge.cpp | 16 +++++++++++++--- src/IEC6205675.cpp | 4 +++- src/IEC6205675.h | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/AmsToMqttBridge.cpp b/src/AmsToMqttBridge.cpp index ee43c25b..4d93c7c3 100644 --- a/src/AmsToMqttBridge.cpp +++ b/src/AmsToMqttBridge.cpp @@ -1187,7 +1187,12 @@ bool readHanPort() { // Rudimentary detector for L&G proprietary format, this is terrible code... Fix later if(payload[0] == CosemTypeStructure && payload[2] == CosemTypeArray && payload[1] == payload[3]) { debugV_P(PSTR("LNG")); - data = new LNG(payload, meterState.getMeterType(), &meterConfig, ctx, &Debug); + LNG lngData = LNG(payload, meterState.getMeterType(), &meterConfig, ctx, &Debug); + if(lngData.getListType() >= 3) { + data = new AmsData(); + data->apply(meterState); + data->apply(lngData); + } } else if(payload[0] == CosemTypeStructure && payload[2] == CosemTypeLongUnsigned && payload[5] == CosemTypeLongUnsigned && @@ -1197,11 +1202,16 @@ bool readHanPort() { payload[17] == CosemTypeLongUnsigned ) { debugV_P(PSTR("LNG2")); - data = new LNG2(payload, meterState.getMeterType(), &meterConfig, ctx, &Debug); + LNG2 lngData = LNG2(payload, meterState.getMeterType(), &meterConfig, ctx, &Debug); + if(lngData.getListType() >= 3) { + data = new AmsData(); + data->apply(meterState); + data->apply(lngData); + } } else { debugV_P(PSTR("DLMS")); // TODO: Split IEC6205675 into DataParserKaifa and DataParserObis. This way we can add other means of parsing, for those other proprietary formats - data = new IEC6205675(payload, meterState.getMeterType(), &meterConfig, ctx); + data = new IEC6205675(payload, meterState.getMeterType(), &meterConfig, ctx, meterState); } } else if(ctx.type == DATA_TAG_DSMR) { data = new IEC6205621(payload, tz); diff --git a/src/IEC6205675.cpp b/src/IEC6205675.cpp index 780af2ea..027d6ee4 100644 --- a/src/IEC6205675.cpp +++ b/src/IEC6205675.cpp @@ -4,7 +4,7 @@ #include "ntohll.h" #include "Uptime.h" -IEC6205675::IEC6205675(const char* d, uint8_t useMeterType, MeterConfig* meterConfig, DataParserContext &ctx) { +IEC6205675::IEC6205675(const char* d, uint8_t useMeterType, MeterConfig* meterConfig, DataParserContext &ctx, AmsData &state) { float val; char str[64]; @@ -184,6 +184,8 @@ IEC6205675::IEC6205675(const char* d, uint8_t useMeterType, MeterConfig* meterCo lastUpdateMillis = millis64(); } else if(data->base.length == 0x0C) { + apply(state); + listType = 3; idx += 4; diff --git a/src/IEC6205675.h b/src/IEC6205675.h index d3b2aa10..dba6c333 100644 --- a/src/IEC6205675.h +++ b/src/IEC6205675.h @@ -15,7 +15,7 @@ struct AmsOctetTimestamp { class IEC6205675 : public AmsData { public: - IEC6205675(const char* payload, uint8_t useMeterType, MeterConfig* meterConfig, DataParserContext &ctx); + IEC6205675(const char* payload, uint8_t useMeterType, MeterConfig* meterConfig, DataParserContext &ctx, AmsData &state); private: CosemData* getCosemDataAt(uint8_t index, const char* ptr);