From 7cd52d5689cda98b1ec57c91a775d94eae7301cf Mon Sep 17 00:00:00 2001 From: Thomas Barnekov Date: Wed, 5 Oct 2022 23:53:40 +0200 Subject: [PATCH] Add individual power reading for all phases (include in HA) --- src/AmsData.cpp | 30 +++++++++++++++++++++++++ src/AmsData.h | 10 +++++++++ src/IEC6205675.cpp | 32 +++++++++++++++++++++++++++ src/IEC6205675.h | 6 +++++ src/mqtt/HomeAssistantMqttHandler.cpp | 6 +++++ src/mqtt/HomeAssistantStatic.h | 12 +++++++++- src/mqtt/JsonMqttHandler.cpp | 6 +++++ src/mqtt/RawMqttHandler.cpp | 18 +++++++++++++++ web/ha3.json | 6 +++++ web/json4.json | 6 +++++ 10 files changed, 131 insertions(+), 1 deletion(-) diff --git a/src/AmsData.cpp b/src/AmsData.cpp index f3db56e8..e6d536bf 100644 --- a/src/AmsData.cpp +++ b/src/AmsData.cpp @@ -45,6 +45,12 @@ void AmsData::apply(AmsData& other) { this->l1PowerFactor = other.getL1PowerFactor(); this->l2PowerFactor = other.getL2PowerFactor(); this->l3PowerFactor = other.getL3PowerFactor(); + this->l1activeImportPower = other.getL1ActiveImportPower(); + this->l2activeImportPower = other.getL2ActiveImportPower(); + this->l3activeImportPower = other.getL3ActiveImportPower(); + this->l1activeExportPower = other.getL1ActiveExportPower(); + this->l2activeExportPower = other.getL2ActiveExportPower(); + this->l3activeExportPower = other.getL3ActiveExportPower(); case 3: this->meterTimestamp = other.getMeterTimestamp(); this->activeImportCounter = other.getActiveImportCounter(); @@ -161,6 +167,30 @@ float AmsData::getL3PowerFactor() { return this->l3PowerFactor; } +float AmsData::getL1ActiveImportPower() { + return this->l1activeImportPower; +} + +float AmsData::getL2ActiveImportPower() { + return this->l2activeImportPower; +} + +float AmsData::getL3ActiveImportPower() { + return this->l3activeImportPower; +} + +float AmsData::getL1ActiveExportPower() { + return this->l1activeExportPower; +} + +float AmsData::getL2ActiveExportPower() { + return this->l2activeExportPower; +} + +float AmsData::getL3ActiveExportPower() { + return this->l3activeExportPower; +} + double AmsData::getActiveImportCounter() { return this->activeImportCounter; } diff --git a/src/AmsData.h b/src/AmsData.h index 21d29827..9445472a 100644 --- a/src/AmsData.h +++ b/src/AmsData.h @@ -54,6 +54,14 @@ public: float getL2PowerFactor(); float getL3PowerFactor(); + float getL1ActiveImportPower(); + float getL2ActiveImportPower(); + float getL3ActiveImportPower(); + + float getL1ActiveExportPower(); + float getL2ActiveExportPower(); + float getL3ActiveExportPower(); + double getActiveImportCounter(); double getReactiveImportCounter(); double getActiveExportCounter(); @@ -71,6 +79,8 @@ protected: time_t meterTimestamp = 0; uint16_t activeImportPower = 0, reactiveImportPower = 0, activeExportPower = 0, reactiveExportPower = 0; 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; 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/src/IEC6205675.cpp b/src/IEC6205675.cpp index 8ebe54f8..10ebda8f 100644 --- a/src/IEC6205675.cpp +++ b/src/IEC6205675.cpp @@ -296,6 +296,38 @@ IEC6205675::IEC6205675(const char* d, uint8_t useMeterType, MeterConfig* meterCo l3PowerFactor = val; } + val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L1, sizeof(AMS_OBIS_ACTIVE_IMPORT_L1), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l1activeImportPower = val; + } + val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L2, sizeof(AMS_OBIS_ACTIVE_IMPORT_L2), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l2activeImportPower = val; + } + val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L3, sizeof(AMS_OBIS_ACTIVE_IMPORT_L3), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l3activeImportPower = val; + } + + val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L1, sizeof(AMS_OBIS_ACTIVE_EXPORT_L1), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l1activeExportPower = val; + } + val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L2, sizeof(AMS_OBIS_ACTIVE_EXPORT_L2), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l2activeExportPower = val; + } + val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L3, sizeof(AMS_OBIS_ACTIVE_EXPORT_L3), ((char *) (d))); + if (val != NOVALUE) { + listType = 4; + l3activeExportPower = val; + } + if(meterType == AmsTypeKamstrup) { if(listType >= 3) { activeImportCounter *= 10; diff --git a/src/IEC6205675.h b/src/IEC6205675.h index 3fb3df29..75cf0134 100644 --- a/src/IEC6205675.h +++ b/src/IEC6205675.h @@ -49,6 +49,12 @@ private: uint8_t AMS_OBIS_POWER_FACTOR_L1[4] = { 33, 7, 0, 255 }; uint8_t AMS_OBIS_POWER_FACTOR_L2[4] = { 53, 7, 0, 255 }; uint8_t AMS_OBIS_POWER_FACTOR_L3[4] = { 73, 7, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_IMPORT_L1[4] = { 21, 7, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_IMPORT_L2[4] = { 41, 7, 0, 255 }; + uint8_t AMS_OBIS_ACTIVE_IMPORT_L3[4] = { 61, 7, 0, 255 }; + 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 }; }; #endif diff --git a/src/mqtt/HomeAssistantMqttHandler.cpp b/src/mqtt/HomeAssistantMqttHandler.cpp index 64d7f6d8..6794946b 100644 --- a/src/mqtt/HomeAssistantMqttHandler.cpp +++ b/src/mqtt/HomeAssistantMqttHandler.cpp @@ -40,8 +40,14 @@ bool HomeAssistantMqttHandler::publish(AmsData* data, AmsData* previousState, En data->getMeterId().c_str(), meterModel.c_str(), data->getActiveImportPower(), + data->getL1ActiveImportPower(), + data->getL2ActiveImportPower(), + data->getL3ActiveImportPower(), data->getReactiveImportPower(), data->getActiveExportPower(), + data->getL1ActiveExportPower(), + data->getL2ActiveExportPower(), + data->getL3ActiveExportPower(), data->getReactiveExportPower(), data->getL1Current(), data->getL2Current(), diff --git a/src/mqtt/HomeAssistantStatic.h b/src/mqtt/HomeAssistantStatic.h index 4aa2b286..8f781d6f 100644 --- a/src/mqtt/HomeAssistantStatic.h +++ b/src/mqtt/HomeAssistantStatic.h @@ -13,14 +13,20 @@ struct HomeAssistantSensor { }; -const uint8_t HA_SENSOR_COUNT PROGMEM = 50; +const uint8_t HA_SENSOR_COUNT PROGMEM = 60; HomeAssistantSensor HA_SENSORS[HA_SENSOR_COUNT] PROGMEM = { {"Status", "/state", "rssi", "dBm", "signal_strength", "\"measurement\""}, {"Supply volt", "/state", "vcc", "V", "voltage", "\"measurement\""}, {"Temperature", "/state", "temp", "C", "temperature", "\"measurement\""}, {"Active import", "/power", "P", "W", "power", "\"measurement\""}, + {"L1 active import", "/power", "P1", "W", "power", "\"measurement\""}, + {"L2 active import", "/power", "P2", "W", "power", "\"measurement\""}, + {"L3 active import", "/power", "P3", "W", "power", "\"measurement\""}, {"Reactive import", "/power", "Q", "VAr", "reactive_power", "\"measurement\""}, {"Active export", "/power", "PO", "W", "power", "\"measurement\""}, + {"L1 active export", "/power", "PO1", "W", "power", "\"measurement\""}, + {"L2 active export", "/power", "PO2", "W", "power", "\"measurement\""}, + {"L3 active export", "/power", "PO3", "W", "power", "\"measurement\""}, {"Reactive export", "/power", "QO", "VAr", "reactive_power", "\"measurement\""}, {"L1 current", "/power", "I1", "A", "current", "\"measurement\""}, {"L2 current", "/power", "I2", "A", "current", "\"measurement\""}, @@ -32,6 +38,10 @@ HomeAssistantSensor HA_SENSORS[HA_SENSOR_COUNT] PROGMEM = { {"Accumulated active export", "/energy", "tPO", "kWh", "energy", "\"total_increasing\""}, {"Accumulated reactive import","/energy", "tQI", "kVArh","energy", "\"total_increasing\""}, {"Accumulated reactive export","/energy", "tQO", "kVArh","energy", "\"total_increasing\""}, + {"Power factor", "/power", "PF", "", "power_factor", "\"measurement\""}, + {"L1 power factor", "/power", "PF1", "", "power_factor", "\"measurement\""}, + {"L2 power factor", "/power", "PF2", "", "power_factor", "\"measurement\""}, + {"L3 power factor", "/power", "PF3", "", "power_factor", "\"measurement\""}, {"Price current hour", "/prices", "prices['0']", "", "monetary", ""}, {"Price next hour", "/prices", "prices['1']", "", "monetary", ""}, {"Price in two hour", "/prices", "prices['2']", "", "monetary", ""}, diff --git a/src/mqtt/JsonMqttHandler.cpp b/src/mqtt/JsonMqttHandler.cpp index 6329b389..1b406c93 100644 --- a/src/mqtt/JsonMqttHandler.cpp +++ b/src/mqtt/JsonMqttHandler.cpp @@ -111,8 +111,14 @@ bool JsonMqttHandler::publish(AmsData* data, AmsData* previousState, EnergyAccou data->getMeterId().c_str(), meterModel.c_str(), data->getActiveImportPower(), + data->getL1ActiveImportPower(), + data->getL2ActiveImportPower(), + data->getL3ActiveImportPower(), data->getReactiveImportPower(), data->getActiveExportPower(), + data->getL1ActiveExportPower(), + data->getL2ActiveExportPower(), + data->getL3ActiveExportPower(), data->getReactiveExportPower(), data->getL1Current(), data->getL2Current(), diff --git a/src/mqtt/RawMqttHandler.cpp b/src/mqtt/RawMqttHandler.cpp index c6763ed3..f2b681b4 100644 --- a/src/mqtt/RawMqttHandler.cpp +++ b/src/mqtt/RawMqttHandler.cpp @@ -11,6 +11,24 @@ bool RawMqttHandler::publish(AmsData* data, AmsData* meterState, EnergyAccountin } switch(data->getListType()) { case 4: + if(full || meterState->getL1ActiveImportPower() != data->getL1ActiveImportPower()) { + mqtt->publish(topic + "/meter/import/l1", String(data->getL1ActiveImportPower(), 2)); + } + if(full || meterState->getL2ActiveImportPower() != data->getL2ActiveImportPower()) { + mqtt->publish(topic + "/meter/import/l2", String(data->getL2ActiveImportPower(), 2)); + } + if(full || meterState->getL3ActiveImportPower() != data->getL3ActiveImportPower()) { + mqtt->publish(topic + "/meter/import/l3", String(data->getL3ActiveImportPower(), 2)); + } + if(full || meterState->getL1ActiveExportPower() != data->getL1ActiveExportPower()) { + mqtt->publish(topic + "/meter/export/l1", String(data->getL1ActiveExportPower(), 2)); + } + if(full || meterState->getL2ActiveExportPower() != data->getL2ActiveExportPower()) { + mqtt->publish(topic + "/meter/export/l2", String(data->getL2ActiveExportPower(), 2)); + } + if(full || meterState->getL3ActiveExportPower() != data->getL3ActiveExportPower()) { + mqtt->publish(topic + "/meter/export/l3", String(data->getL3ActiveExportPower(), 2)); + } if(full || meterState->getPowerFactor() != data->getPowerFactor()) { mqtt->publish(topic + "/meter/powerfactor", String(data->getPowerFactor(), 2)); } diff --git a/web/ha3.json b/web/ha3.json index 41fad56b..faee4724 100644 --- a/web/ha3.json +++ b/web/ha3.json @@ -3,8 +3,14 @@ "id" : "%s", "type" : "%s", "P" : %d, + "P1" : %.2f, + "P2" : %.2f, + "P3" : %.2f, "Q" : %d, "PO" : %d, + "PO1" : %.2f, + "PO2" : %.2f, + "PO3" : %.2f, "QO" : %d, "I1" : %.2f, "I2" : %.2f, diff --git a/web/json4.json b/web/json4.json index 701c06f4..cb61fb90 100644 --- a/web/json4.json +++ b/web/json4.json @@ -11,8 +11,14 @@ "id" : "%s", "type" : "%s", "P" : %d, + "P1" : %.2f, + "P2" : %.2f, + "P3" : %.2f, "Q" : %d, "PO" : %d, + "PO1" : %.2f, + "PO2" : %.2f, + "PO3" : %.2f, "QO" : %d, "I1" : %.2f, "I2" : %.2f,