diff --git a/docs/MQTT_Topics.md b/docs/MQTT_Topics.md index 185aec3d3..4ae2779ef 100644 --- a/docs/MQTT_Topics.md +++ b/docs/MQTT_Topics.md @@ -13,6 +13,20 @@ Serial will be replaced with the serial number of the respective device. | dtu/status | R | Indicates whether OpenDTU network is reachable | online / offline | | dtu/uptime | R | Time in seconds since startup | seconds | +## Inverter total topicss + +Enabled inverter means, that only inverters with "Poll inverter data" enabled are considered. + +| Topic | R / W | Description | Value / Unit | +| --------------------------------------- | ----- | ---------------------------------------------------- | -------------------------- | +| ac/power | R | Sum of AC active power of all enabled inverters | W | +| ac/yieldtotal | R | Sum of energy converted to AC since reset watt hours of all enabled inverters | Kilo watt hours (kWh) | +| ac/yieldday | R | Sum of energy converted to AC per day in watt hours of all enabled inverters | Watt hours (Wh) +| ac/is_valid | R | Indicator whether all enabled inverters where reachable | 0 or 1 | +| dc/power | R | Sum of DC power of all enabled inverters | Watt (W) | +| dc/irradiation | R | Produced power of all enabled inverter stripes with defined irradiation settings divided by sum of all enabled inverters irradiation | % | +| dc/is_valid | R | Indicator whether all enabled inverters where reachable | 0 or 1 | + ## Inverter specific topics serial will be replaced with the serial number of the inverter. diff --git a/include/MqttHandleHass.h b/include/MqttHandleHass.h index 45d11cfbc..5bf7e71eb 100644 --- a/include/MqttHandleHass.h +++ b/include/MqttHandleHass.h @@ -44,7 +44,7 @@ const byteAssign_fieldDeviceClass_t deviceFieldAssignment[] = { { FLD_PF, DEVICE_CLS_POWER_FACTOR, STATE_CLS_MEASUREMENT }, { FLD_EFF, DEVICE_CLS_NONE, STATE_CLS_NONE }, { FLD_IRR, DEVICE_CLS_NONE, STATE_CLS_NONE }, - { FLD_PRA, DEVICE_CLS_REACTIVE_POWER, STATE_CLS_MEASUREMENT } + { FLD_Q, DEVICE_CLS_REACTIVE_POWER, STATE_CLS_MEASUREMENT } }; #define DEVICE_CLS_ASSIGN_LIST_LEN (sizeof(deviceFieldAssignment) / sizeof(byteAssign_fieldDeviceClass_t)) diff --git a/include/MqttHandleInverter.h b/include/MqttHandleInverter.h index 9df43cb77..ee4275037 100644 --- a/include/MqttHandleInverter.h +++ b/include/MqttHandleInverter.h @@ -33,7 +33,7 @@ class MqttHandleInverterClass { FLD_PF, FLD_EFF, FLD_IRR, - FLD_PRA + FLD_Q }; }; diff --git a/include/WebApi_prometheus.h b/include/WebApi_prometheus.h index f2b5b66a6..4a77acdd4 100644 --- a/include/WebApi_prometheus.h +++ b/include/WebApi_prometheus.h @@ -40,6 +40,6 @@ class WebApiPrometheusClass { { FLD_PF, METRIC_TYPE_GAUGE }, { FLD_EFF, METRIC_TYPE_GAUGE }, { FLD_IRR, METRIC_TYPE_GAUGE }, - { FLD_PRA, METRIC_TYPE_GAUGE } + { FLD_Q, METRIC_TYPE_GAUGE } }; }; \ No newline at end of file diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index 4ae3223d8..3a9999ff0 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -54,7 +54,7 @@ void HoymilesClass::loop() } } - if (iv != nullptr && iv->getRadio()->isInitialized() && iv->getRadio()->isIdle()) { + if (iv != nullptr && iv->getRadio()->isInitialized() && iv->getRadio()->isQueueEmpty()) { _messageOutput->print("Fetch inverter: "); _messageOutput->println(iv->serial(), HEX); diff --git a/lib/Hoymiles/src/HoymilesRadio.cpp b/lib/Hoymiles/src/HoymilesRadio.cpp index 117d45e95..8faf1727e 100644 --- a/lib/Hoymiles/src/HoymilesRadio.cpp +++ b/lib/Hoymiles/src/HoymilesRadio.cpp @@ -69,4 +69,9 @@ bool HoymilesRadio::isInitialized() bool HoymilesRadio::isIdle() { return !_busyFlag; -} \ No newline at end of file +} + +bool HoymilesRadio::isQueueEmpty() +{ + return _commandQueue.size() == 0; +} diff --git a/lib/Hoymiles/src/HoymilesRadio.h b/lib/Hoymiles/src/HoymilesRadio.h index 056b61c34..2ee2ad25f 100644 --- a/lib/Hoymiles/src/HoymilesRadio.h +++ b/lib/Hoymiles/src/HoymilesRadio.h @@ -12,6 +12,7 @@ class HoymilesRadio { virtual void setDtuSerial(uint64_t serial); bool isIdle(); + bool isQueueEmpty(); bool isInitialized(); template diff --git a/lib/Hoymiles/src/inverters/HMS_1CH.cpp b/lib/Hoymiles/src/inverters/HMS_1CH.cpp index 3ce8002ae..a935a60be 100644 --- a/lib/Hoymiles/src/inverters/HMS_1CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_1CH.cpp @@ -15,7 +15,7 @@ static const byteAssign_t byteAssignment[] = { { TYPE_AC, CH0, FLD_UAC, UNIT_V, 14, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_IAC, UNIT_A, 22, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PAC, UNIT_W, 18, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 20, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_Q, UNIT_VAR, 20, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_F, UNIT_HZ, 16, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 24, 2, 1000, false, 3 }, diff --git a/lib/Hoymiles/src/inverters/HMS_2CH.cpp b/lib/Hoymiles/src/inverters/HMS_2CH.cpp index ffd5311f0..12925d0f1 100644 --- a/lib/Hoymiles/src/inverters/HMS_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_2CH.cpp @@ -22,7 +22,7 @@ static const byteAssign_t byteAssignment[] = { { TYPE_AC, CH0, FLD_UAC, UNIT_V, 26, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_IAC, UNIT_A, 34, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PAC, UNIT_W, 30, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 32, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_Q, UNIT_VAR, 32, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_F, UNIT_HZ, 28, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 36, 2, 1000, false, 3 }, diff --git a/lib/Hoymiles/src/inverters/HMS_4CH.cpp b/lib/Hoymiles/src/inverters/HMS_4CH.cpp index c4f22ee57..b0ca62072 100644 --- a/lib/Hoymiles/src/inverters/HMS_4CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_4CH.cpp @@ -36,7 +36,7 @@ static const byteAssign_t byteAssignment[] = { { TYPE_AC, CH0, FLD_UAC, UNIT_V, 50, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_IAC, UNIT_A, 58, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PAC, UNIT_W, 54, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 56, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_Q, UNIT_VAR, 56, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_F, UNIT_HZ, 52, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 60, 2, 1000, false, 3 }, diff --git a/lib/Hoymiles/src/inverters/HMT_6CH.cpp b/lib/Hoymiles/src/inverters/HMT_6CH.cpp index b87218315..eea3353da 100644 --- a/lib/Hoymiles/src/inverters/HMT_6CH.cpp +++ b/lib/Hoymiles/src/inverters/HMT_6CH.cpp @@ -56,7 +56,7 @@ static const byteAssign_t byteAssignment[] = { { TYPE_AC, CH0, FLD_UAC_31, UNIT_V, 78, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_F, UNIT_HZ, 80, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PAC, UNIT_W, 82, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 84, 2, 10, true, 1 }, + { TYPE_AC, CH0, FLD_Q, UNIT_VAR, 84, 2, 10, true, 1 }, { TYPE_AC, CH0, FLD_IAC, UNIT_A, 86, 2, 100, false, 2 }, // dummy { TYPE_AC, CH0, FLD_IAC_1, UNIT_A, 86, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_IAC_2, UNIT_A, 88, 2, 100, false, 2 }, diff --git a/lib/Hoymiles/src/inverters/HM_1CH.cpp b/lib/Hoymiles/src/inverters/HM_1CH.cpp index 5513aead3..0d54e4450 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_1CH.cpp @@ -15,7 +15,7 @@ static const byteAssign_t byteAssignment[] = { { TYPE_AC, CH0, FLD_UAC, UNIT_V, 14, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_IAC, UNIT_A, 22, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PAC, UNIT_W, 18, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 20, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_Q, UNIT_VAR, 20, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_F, UNIT_HZ, 16, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 24, 2, 1000, false, 3 }, diff --git a/lib/Hoymiles/src/inverters/HM_2CH.cpp b/lib/Hoymiles/src/inverters/HM_2CH.cpp index e0ba644dc..01252992f 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_2CH.cpp @@ -23,7 +23,7 @@ static const byteAssign_t byteAssignment[] = { { TYPE_AC, CH0, FLD_UAC, UNIT_V, 26, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_IAC, UNIT_A, 34, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PAC, UNIT_W, 30, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 32, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_Q, UNIT_VAR, 32, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_F, UNIT_HZ, 28, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 36, 2, 1000, false, 3 }, diff --git a/lib/Hoymiles/src/inverters/HM_4CH.cpp b/lib/Hoymiles/src/inverters/HM_4CH.cpp index a81955453..5ac57b4c2 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_4CH.cpp @@ -36,7 +36,7 @@ static const byteAssign_t byteAssignment[] = { { TYPE_AC, CH0, FLD_UAC, UNIT_V, 46, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_IAC, UNIT_A, 54, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PAC, UNIT_W, 50, 2, 10, false, 1 }, - { TYPE_AC, CH0, FLD_PRA, UNIT_VA, 52, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_Q, UNIT_VAR, 52, 2, 10, false, 1 }, { TYPE_AC, CH0, FLD_F, UNIT_HZ, 48, 2, 100, false, 2 }, { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 56, 2, 1000, false, 3 }, diff --git a/lib/Hoymiles/src/parser/StatisticsParser.h b/lib/Hoymiles/src/parser/StatisticsParser.h index f4e51b6af..f4bf7ae02 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.h +++ b/lib/Hoymiles/src/parser/StatisticsParser.h @@ -17,7 +17,7 @@ enum UnitId_t { UNIT_HZ, UNIT_C, UNIT_PCT, - UNIT_VA, + UNIT_VAR, UNIT_NONE }; const char* const units[] = { "V", "A", "W", "Wh", "kWh", "Hz", "°C", "%", "var", "" }; @@ -37,7 +37,7 @@ enum FieldId_t { FLD_PF, FLD_EFF, FLD_IRR, - FLD_PRA, + FLD_Q, FLD_EVT_LOG, // HMT only FLD_UAC_1N, diff --git a/src/MqttHandleInverterTotal.cpp b/src/MqttHandleInverterTotal.cpp index 6d14576c3..a0c3a38c2 100644 --- a/src/MqttHandleInverterTotal.cpp +++ b/src/MqttHandleInverterTotal.cpp @@ -65,8 +65,8 @@ void MqttHandleInverterTotalClass::loop() } MqttSettings.publish("ac/power", String(totalAcPower, static_cast(totalAcPowerDigits))); - MqttSettings.publish("ac/yieldtotal", String(totalAcYieldDay, static_cast(totalAcYieldDayDigits))); - MqttSettings.publish("ac/yieldday", String(totalAcYieldTotal, static_cast(totalAcYieldTotalDigits))); + MqttSettings.publish("ac/yieldtotal", String(totalAcYieldTotal, static_cast(totalAcYieldTotalDigits))); + MqttSettings.publish("ac/yieldday", String(totalAcYieldDay, static_cast(totalAcYieldDayDigits))); MqttSettings.publish("ac/is_valid", String(totalReachable)); MqttSettings.publish("dc/power", String(totalDcPower, static_cast(totalAcPowerDigits))); MqttSettings.publish("dc/irradiation", String(totalDcPowerIrrInst > 0 ? totalDcPowerIrr / totalDcPowerIrrInst * 100.0f : 0, 3)); diff --git a/src/WebApi_prometheus.cpp b/src/WebApi_prometheus.cpp index 67ab09dd0..aee568472 100644 --- a/src/WebApi_prometheus.cpp +++ b/src/WebApi_prometheus.cpp @@ -86,7 +86,7 @@ void WebApiPrometheusClass::onPrometheusMetricsGet(AsyncWebServerRequest* reques addField(stream, serial, i, inv, t, c, FLD_F); addField(stream, serial, i, inv, t, c, FLD_T); addField(stream, serial, i, inv, t, c, FLD_PF); - addField(stream, serial, i, inv, t, c, FLD_PRA); + addField(stream, serial, i, inv, t, c, FLD_Q); addField(stream, serial, i, inv, t, c, FLD_EFF); addField(stream, serial, i, inv, t, c, FLD_IRR); } diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index 170e38c82..bcc49c336 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -147,7 +147,7 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root) addField(chanTypeObj, i, inv, t, c, FLD_F); addField(chanTypeObj, i, inv, t, c, FLD_T); addField(chanTypeObj, i, inv, t, c, FLD_PF); - addField(chanTypeObj, i, inv, t, c, FLD_PRA); + addField(chanTypeObj, i, inv, t, c, FLD_Q); addField(chanTypeObj, i, inv, t, c, FLD_EFF); if (t == TYPE_DC && inv->Statistics()->getStringMaxPower(c) > 0) { addField(chanTypeObj, i, inv, t, c, FLD_IRR);