|
|
@ -38,6 +38,7 @@ typedef struct { |
|
|
|
bool running; |
|
|
|
uint8_t lastIvId; |
|
|
|
uint8_t sub; |
|
|
|
uint8_t foundIvCnt; |
|
|
|
} discovery_t; |
|
|
|
|
|
|
|
template<class HMSYSTEM> |
|
|
@ -224,6 +225,7 @@ class PubMqtt { |
|
|
|
mDiscovery.running = true; |
|
|
|
mDiscovery.lastIvId = 0; |
|
|
|
mDiscovery.sub = 0; |
|
|
|
mDiscovery.foundIvCnt = 0; |
|
|
|
} |
|
|
|
|
|
|
|
void setPowerLimitAck(Inverter<> *iv) { |
|
|
@ -350,14 +352,16 @@ class PubMqtt { |
|
|
|
uint8_t fldTotal[4] = {FLD_PAC, FLD_YT, FLD_YD, FLD_PDC}; |
|
|
|
const char* unitTotal[4] = {"W", "kWh", "Wh", "W"}; |
|
|
|
|
|
|
|
String node_mac = WiFi.macAddress().substring(12,14)+ WiFi.macAddress().substring(15,17); |
|
|
|
String node_id = "AHOY_DTU_" + node_mac; |
|
|
|
String node_id = String(mDevName) + "_TOTAL"; |
|
|
|
bool total = (mDiscovery.lastIvId == MAX_NUM_INVERTERS); |
|
|
|
|
|
|
|
Inverter<> *iv = mSys->getInverterByPos(mDiscovery.lastIvId); |
|
|
|
record_t<> *rec; |
|
|
|
if (NULL != iv) |
|
|
|
if (NULL != iv) { |
|
|
|
rec = iv->getRecordStruct(RealTimeRunData_Debug); |
|
|
|
if(0 == mDiscovery.sub) |
|
|
|
mDiscovery.foundIvCnt++; |
|
|
|
} |
|
|
|
|
|
|
|
if ((NULL != iv) || total) { |
|
|
|
if (!total) { |
|
|
@ -412,7 +416,7 @@ class PubMqtt { |
|
|
|
if (!total) |
|
|
|
snprintf(topic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->config->name, rec->assign[mDiscovery.sub].ch, iv->getFieldName(mDiscovery.sub, rec)); |
|
|
|
else // total values
|
|
|
|
snprintf(topic, 64, "%s/sensor/%s/total_%s/config", MQTT_DISCOVERY_PREFIX, node_id.c_str(),fields[fldTotal[mDiscovery.sub]]); |
|
|
|
snprintf(topic, 64, "%s/sensor/%s/total_%s/config", MQTT_DISCOVERY_PREFIX, node_id.c_str(), fields[fldTotal[mDiscovery.sub]]); |
|
|
|
size_t size = measureJson(doc2) + 1; |
|
|
|
memset(buf, 0, size); |
|
|
|
serializeJson(doc2, buf, size); |
|
|
@ -420,18 +424,26 @@ class PubMqtt { |
|
|
|
|
|
|
|
if(++mDiscovery.sub == ((!total) ? (rec->length) : 4)) { |
|
|
|
mDiscovery.sub = 0; |
|
|
|
if(++mDiscovery.lastIvId == (MAX_NUM_INVERTERS + 1)) |
|
|
|
mDiscovery.running = false; |
|
|
|
checkDiscoveryEnd(); |
|
|
|
} |
|
|
|
} else { |
|
|
|
mDiscovery.sub = 0; |
|
|
|
if(++mDiscovery.lastIvId == (MAX_NUM_INVERTERS + 1)) |
|
|
|
mDiscovery.running = false; |
|
|
|
checkDiscoveryEnd(); |
|
|
|
} |
|
|
|
|
|
|
|
yield(); |
|
|
|
} |
|
|
|
|
|
|
|
void checkDiscoveryEnd(void) { |
|
|
|
if(++mDiscovery.lastIvId == MAX_NUM_INVERTERS) { |
|
|
|
// check if only one inverter was found, then don't create 'total' sensor
|
|
|
|
DPRINTLN(DBG_INFO, "found: " + String(mDiscovery.foundIvCnt)); |
|
|
|
if(mDiscovery.foundIvCnt == 1) |
|
|
|
mDiscovery.running = false; |
|
|
|
} else if(mDiscovery.lastIvId == (MAX_NUM_INVERTERS + 1)) |
|
|
|
mDiscovery.running = false; |
|
|
|
} |
|
|
|
|
|
|
|
const char *getFieldDeviceClass(uint8_t fieldId) { |
|
|
|
uint8_t pos = 0; |
|
|
|
for (; pos < DEVICE_CLS_ASSIGN_LIST_LEN; pos++) { |
|
|
|