Merge remote-tracking branch 'tbnobody/OpenDTU/master' into development
This commit is contained in:
commit
e91935ab38
@ -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.
|
||||
|
||||
@ -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))
|
||||
|
||||
|
||||
@ -33,7 +33,7 @@ private:
|
||||
FLD_PF,
|
||||
FLD_EFF,
|
||||
FLD_IRR,
|
||||
FLD_PRA
|
||||
FLD_Q
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -40,6 +40,6 @@ private:
|
||||
{ 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 }
|
||||
};
|
||||
};
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -70,3 +70,8 @@ bool HoymilesRadio::isIdle()
|
||||
{
|
||||
return !_busyFlag;
|
||||
}
|
||||
|
||||
bool HoymilesRadio::isQueueEmpty()
|
||||
{
|
||||
return _commandQueue.size() == 0;
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@ public:
|
||||
virtual void setDtuSerial(uint64_t serial);
|
||||
|
||||
bool isIdle();
|
||||
bool isQueueEmpty();
|
||||
bool isInitialized();
|
||||
|
||||
template <typename T>
|
||||
|
||||
@ -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 },
|
||||
|
||||
|
||||
@ -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 },
|
||||
|
||||
|
||||
@ -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 },
|
||||
|
||||
|
||||
@ -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 },
|
||||
|
||||
@ -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 },
|
||||
|
||||
|
||||
@ -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 },
|
||||
|
||||
|
||||
@ -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 },
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -65,8 +65,8 @@ void MqttHandleInverterTotalClass::loop()
|
||||
}
|
||||
|
||||
MqttSettings.publish("ac/power", String(totalAcPower, static_cast<unsigned int>(totalAcPowerDigits)));
|
||||
MqttSettings.publish("ac/yieldtotal", String(totalAcYieldDay, static_cast<unsigned int>(totalAcYieldDayDigits)));
|
||||
MqttSettings.publish("ac/yieldday", String(totalAcYieldTotal, static_cast<unsigned int>(totalAcYieldTotalDigits)));
|
||||
MqttSettings.publish("ac/yieldtotal", String(totalAcYieldTotal, static_cast<unsigned int>(totalAcYieldTotalDigits)));
|
||||
MqttSettings.publish("ac/yieldday", String(totalAcYieldDay, static_cast<unsigned int>(totalAcYieldDayDigits)));
|
||||
MqttSettings.publish("ac/is_valid", String(totalReachable));
|
||||
MqttSettings.publish("dc/power", String(totalDcPower, static_cast<unsigned int>(totalAcPowerDigits)));
|
||||
MqttSettings.publish("dc/irradiation", String(totalDcPowerIrrInst > 0 ? totalDcPowerIrr / totalDcPowerIrrInst * 100.0f : 0, 3));
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user