From 7cbcbd4bc8d8adf22f9b7d0f74af5420210442b4 Mon Sep 17 00:00:00 2001 From: Conrad Juhl Andersen Date: Thu, 20 Jul 2023 13:04:27 +0200 Subject: [PATCH] Added support for getting accumulated energy for phases (Kamstrup) --- lib/AmsData/include/AmsData.h | 10 ++++++ lib/AmsData/src/AmsData.cpp | 30 ++++++++++++++++++ lib/RawMqttHandler/src/RawMqttHandler.cpp | 18 +++++++++++ src/IEC6205675.cpp | 38 +++++++++++++++++++++++ src/IEC6205675.h | 6 ++++ 5 files changed, 102 insertions(+) diff --git a/lib/AmsData/include/AmsData.h b/lib/AmsData/include/AmsData.h index 61d07805..90813991 100644 --- a/lib/AmsData/include/AmsData.h +++ b/lib/AmsData/include/AmsData.h @@ -61,6 +61,14 @@ public: float getL2ActiveExportPower(); float getL3ActiveExportPower(); + double getL1ActiveImportCounter(); + double getL2ActiveImportCounter(); + double getL3ActiveImportCounter(); + + double getL1ActiveExportCounter(); + double getL2ActiveExportCounter(); + double getL3ActiveExportCounter(); + double getActiveImportCounter(); double getReactiveImportCounter(); double getActiveExportCounter(); @@ -83,6 +91,8 @@ protected: float l1voltage = 0, l2voltage = 0, l3voltage = 0, l1current = 0, l2current = 0, l3current = 0; float l1activeImportPower = 0, l2activeImportPower = 0, l3activeImportPower = 0; float l1activeExportPower = 0, l2activeExportPower = 0, l3activeExportPower = 0; + double l1activeImportCounter = 0, l2activeImportCounter = 0, l3activeImportCounter; + double l1activeExportCounter = 0, l2activeExportCounter = 0, l3activeExportCounter; float powerFactor = 0, l1PowerFactor = 0, l2PowerFactor = 0, l3PowerFactor = 0; double activeImportCounter = 0, reactiveImportCounter = 0, activeExportCounter = 0, reactiveExportCounter = 0; bool threePhase = false, twoPhase = false, counterEstimated = false; diff --git a/lib/AmsData/src/AmsData.cpp b/lib/AmsData/src/AmsData.cpp index bc2a2491..942be446 100644 --- a/lib/AmsData/src/AmsData.cpp +++ b/lib/AmsData/src/AmsData.cpp @@ -51,6 +51,12 @@ void AmsData::apply(AmsData& other) { this->l1activeExportPower = other.getL1ActiveExportPower(); this->l2activeExportPower = other.getL2ActiveExportPower(); this->l3activeExportPower = other.getL3ActiveExportPower(); + this->l1activeImportCounter = other.getL1ActiveImportCounter(); + this->l2activeImportCounter = other.getL2ActiveImportCounter(); + this->l3activeImportCounter = other.getL3ActiveImportCounter(); + this->l1activeExportCounter = other.getL1ActiveExportCounter(); + this->l2activeExportCounter = other.getL2ActiveExportCounter(); + this->l3activeExportCounter = other.getL3ActiveExportCounter(); case 3: this->meterTimestamp = other.getMeterTimestamp(); this->activeImportCounter = other.getActiveImportCounter(); @@ -194,6 +200,30 @@ float AmsData::getL3ActiveExportPower() { return this->l3activeExportPower; } +double AmsData::getL1ActiveImportCounter() { + return this->l1activeImportCounter; +} + +double AmsData::getL2ActiveImportCounter() { + return this->l2activeImportCounter; +} + +double AmsData::getL3ActiveImportCounter() { + return this->l3activeImportCounter; +} + +double AmsData::getL1ActiveExportCounter() { + return this->l1activeExportCounter; +} + +double AmsData::getL2ActiveExportCounter() { + return this->l2activeExportCounter; +} + +double AmsData::getL3ActiveExportCounter() { + return this->l3activeExportCounter; +} + double AmsData::getActiveImportCounter() { return this->activeImportCounter; } diff --git a/lib/RawMqttHandler/src/RawMqttHandler.cpp b/lib/RawMqttHandler/src/RawMqttHandler.cpp index a906dfb3..96cba1fb 100644 --- a/lib/RawMqttHandler/src/RawMqttHandler.cpp +++ b/lib/RawMqttHandler/src/RawMqttHandler.cpp @@ -106,6 +106,24 @@ bool RawMqttHandler::publishList4(AmsData* data, AmsData* meterState) { if(full || meterState->getL3ActiveExportPower() != data->getL3ActiveExportPower()) { mqtt->publish(topic + "/meter/export/l3", String(data->getL3ActiveExportPower(), 2)); } + if(full || meterState->getL1ActiveImportCounter() != data->getL1ActiveImportCounter()) { + mqtt->publish(topic + "/meter/import/l1/accumulated", String(data->getL1ActiveImportCounter(), 2)); + } + if(full || meterState->getL2ActiveImportCounter() != data->getL2ActiveImportCounter()) { + mqtt->publish(topic + "/meter/import/l2/accumulated", String(data->getL2ActiveImportCounter(), 2)); + } + if(full || meterState->getL3ActiveImportCounter() != data->getL3ActiveImportCounter()) { + mqtt->publish(topic + "/meter/import/l3/accumulated", String(data->getL3ActiveImportCounter(), 2)); + } + if(full || meterState->getL1ActiveExportCounter() != data->getL1ActiveExportCounter()) { + mqtt->publish(topic + "/meter/export/l1/accumulated", String(data->getL1ActiveExportCounter(), 2)); + } + if(full || meterState->getL2ActiveExportCounter() != data->getL2ActiveExportCounter()) { + mqtt->publish(topic + "/meter/export/l2/accumulated", String(data->getL2ActiveExportCounter(), 2)); + } + if(full || meterState->getL3ActiveExportCounter() != data->getL3ActiveExportCounter()) { + mqtt->publish(topic + "/meter/export/l3/accumulated", String(data->getL3ActiveExportCounter(), 2)); + } if(full || meterState->getPowerFactor() != data->getPowerFactor()) { mqtt->publish(topic + "/meter/powerfactor", String(data->getPowerFactor(), 2)); } diff --git a/src/IEC6205675.cpp b/src/IEC6205675.cpp index fb3ffdd2..bedfe354 100644 --- a/src/IEC6205675.cpp +++ b/src/IEC6205675.cpp @@ -331,6 +331,38 @@ IEC6205675::IEC6205675(const char* d, uint8_t useMeterType, MeterConfig* meterCo listType = 4; l3activeExportPower = val; } + val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L1_COUNT, sizeof(AMS_OBIS_ACTIVE_IMPORT_L1_COUNT), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l1activeImportCounter = val/1000; + } + val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L2_COUNT, sizeof(AMS_OBIS_ACTIVE_IMPORT_L2_COUNT), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l2activeImportCounter = val/1000; + } + val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L3_COUNT, sizeof(AMS_OBIS_ACTIVE_IMPORT_L3_COUNT), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l3activeImportCounter = val/1000; + } + val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L1_COUNT, sizeof(AMS_OBIS_ACTIVE_EXPORT_L1_COUNT), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l1activeExportCounter = val/1000; + } + val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L2_COUNT, sizeof(AMS_OBIS_ACTIVE_EXPORT_L2_COUNT), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l2activeExportCounter = val/1000; + } + val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L2_COUNT, sizeof(AMS_OBIS_ACTIVE_EXPORT_L2_COUNT), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l3activeExportCounter = val/1000; + } + + if(meterType == AmsTypeKamstrup) { if(listType >= 3) { @@ -338,6 +370,12 @@ IEC6205675::IEC6205675(const char* d, uint8_t useMeterType, MeterConfig* meterCo activeExportCounter *= 10; reactiveImportCounter *= 10; reactiveExportCounter *= 10; + l1activeImportCounter *= 10; + l2activeImportCounter *= 10; + l3activeImportCounter *= 10; + l1activeExportCounter *= 10; + l2activeExportCounter *= 10; + l3activeExportCounter *= 10; } if(l1current != 0) l1current /= 100; diff --git a/src/IEC6205675.h b/src/IEC6205675.h index d3b2aa10..292bca0f 100644 --- a/src/IEC6205675.h +++ b/src/IEC6205675.h @@ -55,6 +55,12 @@ private: uint8_t AMS_OBIS_ACTIVE_EXPORT_L1[4] = { 22, 7, 0, 255 }; uint8_t AMS_OBIS_ACTIVE_EXPORT_L2[4] = { 42, 7, 0, 255 }; uint8_t AMS_OBIS_ACTIVE_EXPORT_L3[4] = { 62, 7, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_IMPORT_L1_COUNT[4] = { 21, 8, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_IMPORT_L2_COUNT[4] = { 41, 8, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_IMPORT_L3_COUNT[4] = { 61, 8, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_EXPORT_L1_COUNT[4] = { 22, 8, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_EXPORT_L2_COUNT[4] = { 42, 8, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_EXPORT_L3_COUNT[4] = { 62, 8, 0, 255 }; }; #endif