From 991838ae2cd0934da1a81a66fbddd66316f8c6fe Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Wed, 10 Aug 2022 20:40:26 +0200 Subject: [PATCH] Added reactive power output and display --- include/MqttHassPublishing.h | 8 +++++--- include/MqttPublishing.h | 5 +++-- lib/Hoymiles/src/inverters/HM_1CH.h | 3 ++- lib/Hoymiles/src/inverters/HM_2CH.h | 5 +++-- lib/Hoymiles/src/inverters/HM_4CH.h | 5 +++-- lib/Hoymiles/src/parser/StatisticsParser.h | 6 ++++-- src/WebApi_ws_live.cpp | 1 + 7 files changed, 21 insertions(+), 12 deletions(-) diff --git a/include/MqttHassPublishing.h b/include/MqttHassPublishing.h index 2329f131..366f41c7 100644 --- a/include/MqttHassPublishing.h +++ b/include/MqttHassPublishing.h @@ -15,9 +15,10 @@ enum { DEVICE_CLS_VOLTAGE, DEVICE_CLS_FREQ, DEVICE_CLS_TEMP, - DEVICE_CLS_POWER_FACTOR + DEVICE_CLS_POWER_FACTOR, + DEVICE_CLS_REACTIVE_POWER }; -const char* const deviceClasses[] = { 0, "current", "energy", "power", "voltage", "frequency", "temperature", "power_factor" }; +const char* const deviceClasses[] = { 0, "current", "energy", "power", "voltage", "frequency", "temperature", "power_factor", "reactive_power" }; enum { STATE_CLS_NONE = 0, STATE_CLS_MEASUREMENT, @@ -44,7 +45,8 @@ const byteAssign_fieldDeviceClass_t deviceFieldAssignment[] = { { FLD_T, DEVICE_CLS_TEMP, STATE_CLS_MEASUREMENT }, { FLD_PCT, DEVICE_CLS_POWER_FACTOR, STATE_CLS_MEASUREMENT }, { FLD_EFF, DEVICE_CLS_NONE, STATE_CLS_NONE }, - { FLD_IRR, DEVICE_CLS_NONE, STATE_CLS_NONE } + { FLD_IRR, DEVICE_CLS_NONE, STATE_CLS_NONE }, + { FLD_PRA, DEVICE_CLS_REACTIVE_POWER, STATE_CLS_MEASUREMENT } }; #define DEVICE_CLS_ASSIGN_LIST_LEN (sizeof(deviceFieldAssignment) / sizeof(byteAssign_fieldDeviceClass_t)) diff --git a/include/MqttPublishing.h b/include/MqttPublishing.h index 54a755e7..efaddb74 100644 --- a/include/MqttPublishing.h +++ b/include/MqttPublishing.h @@ -19,7 +19,7 @@ private: uint32_t _lastPublishStats[INV_MAX_COUNT]; uint32_t _lastPublish; - uint8_t _publishFields[13] = { + uint8_t _publishFields[14] = { FLD_UDC, FLD_IDC, FLD_PDC, @@ -32,7 +32,8 @@ private: FLD_T, FLD_PCT, FLD_EFF, - FLD_IRR + FLD_IRR, + FLD_PRA }; }; diff --git a/lib/Hoymiles/src/inverters/HM_1CH.h b/lib/Hoymiles/src/inverters/HM_1CH.h index 7763a7c2..95874652 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.h +++ b/lib/Hoymiles/src/inverters/HM_1CH.h @@ -11,7 +11,7 @@ public: const uint8_t getAssignmentCount(); private: - const byteAssign_t byteAssignment[16] = { + const byteAssign_t byteAssignment[17] = { { FLD_UDC, UNIT_V, CH1, 2, 2, 10 }, { FLD_IDC, UNIT_A, CH1, 4, 2, 100 }, { FLD_PDC, UNIT_W, CH1, 6, 2, 10 }, @@ -22,6 +22,7 @@ private: { FLD_UAC, UNIT_V, CH0, 14, 2, 10 }, { FLD_IAC, UNIT_A, CH0, 22, 2, 100 }, { FLD_PAC, UNIT_W, CH0, 18, 2, 10 }, + { FLD_PRA, UNIT_VA, CH0, 20, 2, 10 }, { FLD_F, UNIT_HZ, CH0, 16, 2, 100 }, { FLD_T, UNIT_C, CH0, 26, 2, 10 }, { FLD_EVT_LOG, UNIT_CNT, CH0, 24, 2, 1 }, diff --git a/lib/Hoymiles/src/inverters/HM_2CH.h b/lib/Hoymiles/src/inverters/HM_2CH.h index 8792f280..e0562900 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.h +++ b/lib/Hoymiles/src/inverters/HM_2CH.h @@ -11,7 +11,7 @@ public: const uint8_t getAssignmentCount(); private: - const byteAssign_t byteAssignment[22] = { + const byteAssign_t byteAssignment[23] = { { FLD_UDC, UNIT_V, CH1, 2, 2, 10 }, { FLD_IDC, UNIT_A, CH1, 4, 2, 100 }, { FLD_PDC, UNIT_W, CH1, 6, 2, 10 }, @@ -29,9 +29,10 @@ private: { FLD_UAC, UNIT_V, CH0, 26, 2, 10 }, { FLD_IAC, UNIT_A, CH0, 34, 2, 100 }, { FLD_PAC, UNIT_W, CH0, 30, 2, 10 }, + { FLD_PRA, UNIT_VA, CH0, 32, 2, 10 }, { FLD_F, UNIT_HZ, CH0, 28, 2, 100 }, { FLD_T, UNIT_C, CH0, 38, 2, 10 }, - { FLD_EVT_LOG, UNIT_CNT, CH0, 40, 2, 1}, + { FLD_EVT_LOG, UNIT_CNT, CH0, 40, 2, 1 }, { FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC }, { FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC }, { FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC }, diff --git a/lib/Hoymiles/src/inverters/HM_4CH.h b/lib/Hoymiles/src/inverters/HM_4CH.h index 5262cf2c..9ae30c09 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.h +++ b/lib/Hoymiles/src/inverters/HM_4CH.h @@ -11,7 +11,7 @@ public: const uint8_t getAssignmentCount(); private: - const byteAssign_t byteAssignment[35] = { + const byteAssign_t byteAssignment[36] = { { FLD_UDC, UNIT_V, CH1, 2, 2, 10 }, { FLD_IDC, UNIT_A, CH1, 4, 2, 100 }, { FLD_PDC, UNIT_W, CH1, 8, 2, 10 }, @@ -43,10 +43,11 @@ private: { FLD_UAC, UNIT_V, CH0, 46, 2, 10 }, { FLD_IAC, UNIT_A, CH0, 54, 2, 100 }, { FLD_PAC, UNIT_W, CH0, 50, 2, 10 }, + { FLD_PRA, UNIT_VA, CH0, 52, 2, 10 }, { FLD_F, UNIT_HZ, CH0, 48, 2, 100 }, { FLD_PCT, UNIT_PCT, CH0, 56, 2, 10 }, { FLD_T, UNIT_C, CH0, 58, 2, 10 }, - { FLD_EVT_LOG, UNIT_CNT, CH0, 60, 2, 1}, + { FLD_EVT_LOG, UNIT_CNT, CH0, 60, 2, 1 }, { FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC }, { FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC }, { FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC }, diff --git a/lib/Hoymiles/src/parser/StatisticsParser.h b/lib/Hoymiles/src/parser/StatisticsParser.h index d253866a..32424a04 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.h +++ b/lib/Hoymiles/src/parser/StatisticsParser.h @@ -15,9 +15,10 @@ enum { UNIT_HZ, UNIT_C, UNIT_PCT, + UNIT_VA, UNIT_CNT }; -const char* const units[] = { "V", "A", "W", "Wh", "kWh", "Hz", "°C", "%", "" }; +const char* const units[] = { "V", "A", "W", "Wh", "kWh", "Hz", "°C", "%", "var", "" }; // field types enum { @@ -34,10 +35,11 @@ enum { FLD_PCT, FLD_EFF, FLD_IRR, + FLD_PRA, FLD_EVT_LOG }; const char* const fields[] = { "Voltage", "Current", "Power", "YieldDay", "YieldTotal", - "Voltage", "Current", "Power", "Frequency", "Temperature", "PowerFactor", "Efficiency", "Irradiation", "EventLogCount" }; + "Voltage", "Current", "Power", "Frequency", "Temperature", "PowerFactor", "Efficiency", "Irradiation", "ReactivePower", "EventLogCount" }; // indices to calculation functions, defined in hmInverter.h enum { diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index ce03d71c..2c38b87c 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -100,6 +100,7 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root) addField(root, i, inv, c, FLD_F); addField(root, i, inv, c, FLD_T); addField(root, i, inv, c, FLD_PCT); + addField(root, i, inv, c, FLD_PRA); addField(root, i, inv, c, FLD_EFF); addField(root, i, inv, c, FLD_IRR); }