mirror of
https://github.com/lumapu/ahoy.git
synced 2025-06-02 02:31:38 +02:00
Send totals values once
This commit is contained in:
parent
6e6ef9ff2c
commit
bd8de5f8f9
1 changed files with 36 additions and 20 deletions
|
@ -217,24 +217,39 @@ class PubMqtt {
|
||||||
uint8_t fldTotal[4] = {FLD_PAC, FLD_YT, FLD_YD, FLD_PDC};
|
uint8_t fldTotal[4] = {FLD_PAC, FLD_YT, FLD_YD, FLD_PDC};
|
||||||
const char* unitTotal[4] = {"W", "kWh", "Wh", "W"};
|
const char* unitTotal[4] = {"W", "kWh", "Wh", "W"};
|
||||||
|
|
||||||
for (uint8_t id = 0; id < mSys->getNumInverters(); id++) {
|
String node_mac = WiFi.macAddress().substring(12,14)+ WiFi.macAddress().substring(15,17);
|
||||||
Inverter<> *iv = mSys->getInverterByPos(id);
|
String node_id = "AHOY_DTU_" + node_mac;
|
||||||
if (NULL == iv)
|
bool total = false;
|
||||||
continue;
|
|
||||||
|
|
||||||
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug);
|
for (uint8_t id = 0; id < mSys->getNumInverters() ; id++) {
|
||||||
doc.clear();
|
doc.clear();
|
||||||
|
|
||||||
doc[F("name")] = iv->config->name;
|
if (total) // total become true at iv = NULL next cycle
|
||||||
doc[F("ids")] = String(iv->config->serial.u64, HEX);
|
continue;
|
||||||
|
|
||||||
|
Inverter<> *iv = mSys->getInverterByPos(id);
|
||||||
|
if (NULL == iv)
|
||||||
|
total = true;
|
||||||
|
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug);
|
||||||
|
|
||||||
|
if (!total) {
|
||||||
|
doc[F("name")] = iv->config->name;
|
||||||
|
doc[F("ids")] = String(iv->config->serial.u64, HEX);
|
||||||
|
doc[F("mdl")] = iv->config->name;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
doc[F("name")] = node_id;
|
||||||
|
doc[F("ids")] = node_id;
|
||||||
|
doc[F("mdl")] = node_id;
|
||||||
|
}
|
||||||
|
|
||||||
doc[F("cu")] = F("http://") + String(WiFi.localIP().toString());
|
doc[F("cu")] = F("http://") + String(WiFi.localIP().toString());
|
||||||
doc[F("mf")] = F("Hoymiles");
|
doc[F("mf")] = F("Hoymiles");
|
||||||
doc[F("mdl")] = iv->config->name;
|
|
||||||
JsonObject deviceObj = doc.as<JsonObject>(); // deviceObj is only pointer!?
|
JsonObject deviceObj = doc.as<JsonObject>(); // deviceObj is only pointer!?
|
||||||
|
|
||||||
for (uint8_t i = 0; i < (rec->length + 4); i++) {
|
for (uint8_t i = 0; i < ((!total) ? (rec->length) : (4) ) ; i++) {
|
||||||
const char *devCls, *stateCls;
|
const char *devCls, *stateCls;
|
||||||
if(i < rec->length) {
|
if (!total) {
|
||||||
if (rec->assign[i].ch == CH0)
|
if (rec->assign[i].ch == CH0)
|
||||||
snprintf(name, 32, "%s %s", iv->config->name, iv->getFieldName(i, rec));
|
snprintf(name, 32, "%s %s", iv->config->name, iv->getFieldName(i, rec));
|
||||||
else
|
else
|
||||||
|
@ -245,19 +260,20 @@ class PubMqtt {
|
||||||
devCls = getFieldDeviceClass(rec->assign[i].fieldId);
|
devCls = getFieldDeviceClass(rec->assign[i].fieldId);
|
||||||
stateCls = getFieldStateClass(rec->assign[i].fieldId);
|
stateCls = getFieldStateClass(rec->assign[i].fieldId);
|
||||||
}
|
}
|
||||||
|
|
||||||
else { // total values
|
else { // total values
|
||||||
snprintf(name, 32, "Total %s", fields[fldTotal[i-rec->length]]);
|
snprintf(name, 32, "Total %s", fields[fldTotal[i]]);
|
||||||
snprintf(topic, 64, "/%s", fields[fldTotal[i-rec->length]]);
|
snprintf(topic, 64, "/%s", fields[fldTotal[i]]);
|
||||||
snprintf(uniq_id, 32, "total_%s", fields[fldTotal[i-rec->length]]);
|
snprintf(uniq_id, 32, "total_%s", fields[fldTotal[i]]);
|
||||||
devCls = getFieldDeviceClass(fldTotal[i-rec->length]);
|
devCls = getFieldDeviceClass(fldTotal[i]);
|
||||||
stateCls = getFieldStateClass(fldTotal[i-rec->length]);
|
stateCls = getFieldStateClass(fldTotal[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicJsonDocument doc2(512);
|
DynamicJsonDocument doc2(512);
|
||||||
doc2[F("name")] = name;
|
doc2[F("name")] = name;
|
||||||
doc2[F("stat_t")] = String(mCfgMqtt->topic) + "/" + ((i < rec->length) ? String(iv->config->name) : "total" ) + String(topic);
|
doc2[F("stat_t")] = String(mCfgMqtt->topic) + "/" + ((!total) ? String(iv->config->name) : "total" ) + String(topic);
|
||||||
doc2[F("unit_of_meas")] = ((i < rec->length) ? (iv->getUnit(i,rec)) : (unitTotal[i-rec->length]));
|
doc2[F("unit_of_meas")] = ((!total) ? (iv->getUnit(i,rec)) : (unitTotal[i]));
|
||||||
doc2[F("uniq_id")] = String(iv->config->serial.u64, HEX) + "_" + uniq_id;
|
doc2[F("uniq_id")] = ((!total) ? (String(iv->config->serial.u64, HEX)) : (node_id)) + "_" + uniq_id;
|
||||||
doc2[F("dev")] = deviceObj;
|
doc2[F("dev")] = deviceObj;
|
||||||
doc2[F("exp_aft")] = MQTT_INTERVAL + 5; // add 5 sec if connection is bad or ESP too slow @TODO: stimmt das wirklich als expire!?
|
doc2[F("exp_aft")] = MQTT_INTERVAL + 5; // add 5 sec if connection is bad or ESP too slow @TODO: stimmt das wirklich als expire!?
|
||||||
if (devCls != NULL)
|
if (devCls != NULL)
|
||||||
|
@ -265,10 +281,10 @@ class PubMqtt {
|
||||||
if (stateCls != NULL)
|
if (stateCls != NULL)
|
||||||
doc2[F("stat_cla")] = String(stateCls);
|
doc2[F("stat_cla")] = String(stateCls);
|
||||||
|
|
||||||
if(i < rec->length)
|
if (!total)
|
||||||
snprintf(topic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->config->name, rec->assign[i].ch, iv->getFieldName(i, rec));
|
snprintf(topic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->config->name, rec->assign[i].ch, iv->getFieldName(i, rec));
|
||||||
else // total values
|
else // total values
|
||||||
snprintf(topic, 64, "%s/sensor/%s/total_%s/config", MQTT_DISCOVERY_PREFIX, iv->config->name, fields[fldTotal[i-rec->length]]);
|
snprintf(topic, 64, "%s/sensor/%s/total_%s/config", MQTT_DISCOVERY_PREFIX, node_id.c_str(),fields[fldTotal[i]]);
|
||||||
size_t size = measureJson(doc2) + 1;
|
size_t size = measureJson(doc2) + 1;
|
||||||
char *buf = new char[size];
|
char *buf = new char[size];
|
||||||
memset(buf, 0, size);
|
memset(buf, 0, size);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue