diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index adb3191..bb7216d 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -5,6 +5,13 @@ InverterAbstract::InverterAbstract(uint64_t serial) { _serial.u64 = serial; + + char serial_buff[sizeof(uint64_t) * 8 + 1]; + snprintf(serial_buff, sizeof(serial_buff), "%0x%08x", + ((uint32_t)((serial >> 32) & 0xFFFFFFFF)), + ((uint32_t)(serial & 0xFFFFFFFF))); + _serialString = serial_buff; + _alarmLogParser.reset(new AlarmLogParser()); _devInfoParser.reset(new DevInfoParser()); _powerCommandParser.reset(new PowerCommandParser()); @@ -26,6 +33,11 @@ uint64_t InverterAbstract::serial() return _serial.u64; } +const String& InverterAbstract::serialString() +{ + return _serialString; +} + void InverterAbstract::setName(const char* name) { uint8_t len = strlen(name); diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 5d96270..5c9088b 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -33,6 +33,7 @@ public: explicit InverterAbstract(uint64_t serial); void init(); uint64_t serial(); + const String& serialString(); void setName(const char* name); const char* name(); virtual String typeName() = 0; @@ -64,6 +65,7 @@ public: private: serial_u _serial; + String _serialString; char _name[MAX_NAME_LENGTH] = ""; fragment_t _rxFragmentBuffer[MAX_RF_FRAGMENT_COUNT]; uint8_t _rxFragmentMaxPacketId = 0; diff --git a/src/MqttHassPublishing.cpp b/src/MqttHassPublishing.cpp index 8b8f507..60705b4 100644 --- a/src/MqttHassPublishing.cpp +++ b/src/MqttHassPublishing.cpp @@ -85,10 +85,7 @@ void MqttHassPublishingClass::publishField(std::shared_ptr inv return; } - char serial[sizeof(uint64_t) * 8 + 1]; - snprintf(serial, sizeof(serial), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); + String serial = inv->serialString(); String fieldName; if (channel == CH0 && fieldType.fieldId == FLD_PDC) { @@ -97,7 +94,7 @@ void MqttHassPublishingClass::publishField(std::shared_ptr inv fieldName = inv->Statistics()->getChannelFieldName(channel, fieldType.fieldId); } - String configTopic = "sensor/dtu_" + String(serial) + String configTopic = "sensor/dtu_" + serial + "/" + "ch" + String(channel) + "_" + fieldName + "/config"; @@ -117,7 +114,7 @@ void MqttHassPublishingClass::publishField(std::shared_ptr inv root[F("name")] = name; root[F("stat_t")] = stateTopic; root[F("unit_of_meas")] = inv->Statistics()->getChannelFieldUnit(channel, fieldType.fieldId); - root[F("uniq_id")] = String(serial) + "_ch" + String(channel) + "_" + fieldName; + root[F("uniq_id")] = serial + "_ch" + String(channel) + "_" + fieldName; JsonObject deviceObj = root.createNestedObject("dev"); createDeviceInfo(deviceObj, inv); @@ -142,24 +139,21 @@ void MqttHassPublishingClass::publishField(std::shared_ptr inv void MqttHassPublishingClass::publishInverterButton(std::shared_ptr inv, const char* caption, const char* icon, const char* category, const char* deviceClass, const char* subTopic, const char* payload) { - char serial[sizeof(uint64_t) * 8 + 1]; - snprintf(serial, sizeof(serial), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); + String serial = inv->serialString(); String buttonId = caption; buttonId.replace(" ", "_"); buttonId.toLowerCase(); - String configTopic = "button/dtu_" + String(serial) + String configTopic = "button/dtu_" + serial + "/" + buttonId + "/config"; - String cmdTopic = MqttSettings.getPrefix() + String(serial) + "/" + subTopic; + String cmdTopic = MqttSettings.getPrefix() + serial + "/" + subTopic; DynamicJsonDocument root(1024); root[F("name")] = caption; - root[F("uniq_id")] = String(serial) + "_" + buttonId; + root[F("uniq_id")] = serial + "_" + buttonId; if (strcmp(icon, "")) { root[F("ic")] = icon; } @@ -183,25 +177,22 @@ void MqttHassPublishingClass::publishInverterNumber( const char* commandTopic, const char* stateTopic, const char* unitOfMeasure, int16_t min, int16_t max) { - char serial[sizeof(uint64_t) * 8 + 1]; - snprintf(serial, sizeof(serial), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); + String serial = inv->serialString(); String buttonId = caption; buttonId.replace(" ", "_"); buttonId.toLowerCase(); - String configTopic = "number/dtu_" + String(serial) + String configTopic = "number/dtu_" + serial + "/" + buttonId + "/config"; - String cmdTopic = MqttSettings.getPrefix() + String(serial) + "/" + commandTopic; - String statTopic = MqttSettings.getPrefix() + String(serial) + "/" + stateTopic; + String cmdTopic = MqttSettings.getPrefix() + serial + "/" + commandTopic; + String statTopic = MqttSettings.getPrefix() + serial + "/" + stateTopic; DynamicJsonDocument root(1024); root[F("name")] = caption; - root[F("uniq_id")] = String(serial) + "_" + buttonId; + root[F("uniq_id")] = serial + "_" + buttonId; if (strcmp(icon, "")) { root[F("ic")] = icon; } @@ -222,24 +213,21 @@ void MqttHassPublishingClass::publishInverterNumber( void MqttHassPublishingClass::publishInverterBinarySensor(std::shared_ptr inv, const char* caption, const char* subTopic, const char* payload_on, const char* payload_off) { - char serial[sizeof(uint64_t) * 8 + 1]; - snprintf(serial, sizeof(serial), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); + String serial = inv->serialString(); String sensorId = caption; sensorId.replace(" ", "_"); sensorId.toLowerCase(); - String configTopic = "binary_sensor/dtu_" + String(serial) + String configTopic = "binary_sensor/dtu_" + serial + "/" + sensorId + "/config"; - String statTopic = MqttSettings.getPrefix() + String(serial) + "/" + subTopic; + String statTopic = MqttSettings.getPrefix() + serial + "/" + subTopic; DynamicJsonDocument root(1024); root[F("name")] = caption; - root[F("uniq_id")] = String(serial) + "_" + sensorId; + root[F("uniq_id")] = serial + "_" + sensorId; root[F("stat_t")] = statTopic; root[F("pl_on")] = payload_on; root[F("pl_off")] = payload_off; @@ -254,13 +242,8 @@ void MqttHassPublishingClass::publishInverterBinarySensor(std::shared_ptr inv) { - char serial[sizeof(uint64_t) * 8 + 1]; - snprintf(serial, sizeof(serial), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); - object[F("name")] = inv->name(); - object[F("ids")] = String(serial); + object[F("ids")] = inv->serialString(); object[F("cu")] = String(F("http://")) + WiFi.localIP().toString(); object[F("mf")] = F("OpenDTU"); object[F("mdl")] = inv->typeName(); diff --git a/src/MqttPublishing.cpp b/src/MqttPublishing.cpp index fc74b78..46819bc 100644 --- a/src/MqttPublishing.cpp +++ b/src/MqttPublishing.cpp @@ -33,11 +33,7 @@ void MqttPublishingClass::loop() for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { auto inv = Hoymiles.getInverterByPos(i); - char buffer[sizeof(uint64_t) * 8 + 1]; - snprintf(buffer, sizeof(buffer), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); - String subtopic = String(buffer); + String subtopic = inv->serialString(); // Name MqttSettings.publish(subtopic + "/name", inv->name()); @@ -110,12 +106,6 @@ String MqttPublishingClass::getTopic(std::shared_ptr inv, uint return String(""); } - char buffer[sizeof(uint64_t) * 8 + 1]; - snprintf(buffer, sizeof(buffer), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); - String invSerial = String(buffer); - String chanName; if (channel == 0 && fieldId == FLD_PDC) { chanName = "powerdc"; @@ -124,5 +114,5 @@ String MqttPublishingClass::getTopic(std::shared_ptr inv, uint chanName.toLowerCase(); } - return invSerial + "/" + String(channel) + "/" + chanName; + return inv->serialString() + "/" + String(channel) + "/" + chanName; } \ No newline at end of file diff --git a/src/WebApi_devinfo.cpp b/src/WebApi_devinfo.cpp index 318b2f0..93f2fa7 100644 --- a/src/WebApi_devinfo.cpp +++ b/src/WebApi_devinfo.cpp @@ -29,13 +29,7 @@ void WebApiDevInfoClass::onDevInfoStatus(AsyncWebServerRequest* request) for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { auto inv = Hoymiles.getInverterByPos(i); - // Inverter Serial is read as HEX - char buffer[sizeof(uint64_t) * 8 + 1]; - snprintf(buffer, sizeof(buffer), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); - - JsonObject devInfoObj = root[buffer].createNestedObject(); + JsonObject devInfoObj = root[inv->serialString()].createNestedObject(); devInfoObj[F("valid_data")] = inv->DevInfo()->getLastUpdate() > 0; devInfoObj[F("fw_bootloader_version")] = inv->DevInfo()->getFwBootloaderVersion(); devInfoObj[F("fw_build_version")] = inv->DevInfo()->getFwBuildVersion(); diff --git a/src/WebApi_eventlog.cpp b/src/WebApi_eventlog.cpp index edff3bb..9ba3c52 100644 --- a/src/WebApi_eventlog.cpp +++ b/src/WebApi_eventlog.cpp @@ -34,16 +34,12 @@ void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request) auto inv = Hoymiles.getInverterBySerial(serial); if (inv != nullptr) { - // Inverter Serial is read as HEX - char buffer[sizeof(uint64_t) * 8 + 1]; - snprintf(buffer, sizeof(buffer), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); + String serial = inv->serialString(); uint8_t logEntryCount = inv->EventLog()->getEntryCount(); - root[buffer]["count"] = logEntryCount; - JsonArray eventsArray = root[buffer].createNestedArray(F("events")); + root[serial]["count"] = logEntryCount; + JsonArray eventsArray = root[serial].createNestedArray(F("events")); for (uint8_t logEntry = 0; logEntry < logEntryCount; logEntry++) { JsonObject eventsObject = eventsArray.createNestedObject(); diff --git a/src/WebApi_limit.cpp b/src/WebApi_limit.cpp index cfcb21e..33bcd40 100644 --- a/src/WebApi_limit.cpp +++ b/src/WebApi_limit.cpp @@ -29,14 +29,10 @@ void WebApiLimitClass::onLimitStatus(AsyncWebServerRequest* request) for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { auto inv = Hoymiles.getInverterByPos(i); - // Inverter Serial is read as HEX - char buffer[sizeof(uint64_t) * 8 + 1]; - snprintf(buffer, sizeof(buffer), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); + String serial = inv->serialString(); - root[buffer]["limit_relative"] = inv->SystemConfigPara()->getLimitPercent(); - root[buffer]["max_power"] = inv->DevInfo()->getMaxPower(); + root[serial]["limit_relative"] = inv->SystemConfigPara()->getLimitPercent(); + root[serial]["max_power"] = inv->DevInfo()->getMaxPower(); LastCommandSuccess status = inv->SystemConfigPara()->getLastLimitCommandSuccess(); String limitStatus = "Unknown"; @@ -49,7 +45,7 @@ void WebApiLimitClass::onLimitStatus(AsyncWebServerRequest* request) else if (status == LastCommandSuccess::CMD_PENDING) { limitStatus = "Pending"; } - root[buffer]["limit_set_status"] = limitStatus; + root[serial]["limit_set_status"] = limitStatus; } response->setLength(); diff --git a/src/WebApi_power.cpp b/src/WebApi_power.cpp index 8ecda81..8e3c2bc 100644 --- a/src/WebApi_power.cpp +++ b/src/WebApi_power.cpp @@ -29,12 +29,6 @@ void WebApiPowerClass::onPowerStatus(AsyncWebServerRequest* request) for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { auto inv = Hoymiles.getInverterByPos(i); - // Inverter Serial is read as HEX - char buffer[sizeof(uint64_t) * 8 + 1]; - snprintf(buffer, sizeof(buffer), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); - LastCommandSuccess status = inv->PowerCommand()->getLastPowerCommandSuccess(); String limitStatus = "Unknown"; if (status == LastCommandSuccess::CMD_OK) { @@ -44,7 +38,7 @@ void WebApiPowerClass::onPowerStatus(AsyncWebServerRequest* request) } else if (status == LastCommandSuccess::CMD_PENDING) { limitStatus = "Pending"; } - root[buffer]["power_set_status"] = limitStatus; + root[inv->serialString()]["power_set_status"] = limitStatus; } response->setLength(); diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index 032c907..41ce2b5 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -77,12 +77,7 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root) for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { auto inv = Hoymiles.getInverterByPos(i); - char buffer[sizeof(uint64_t) * 8 + 1]; - snprintf(buffer, sizeof(buffer), "%0x%08x", - ((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)), - ((uint32_t)(inv->serial() & 0xFFFFFFFF))); - - root[i][F("serial")] = String(buffer); + root[i][F("serial")] = inv->serialString(); root[i][F("name")] = inv->name(); root[i][F("data_age")] = (millis() - inv->Statistics()->getLastUpdate()) / 1000; root[i][F("reachable")] = inv->isReachable();