diff --git a/src/WebApi.cpp b/src/WebApi.cpp index 8b6ee75..1f114f0 100644 --- a/src/WebApi.cpp +++ b/src/WebApi.cpp @@ -2,6 +2,7 @@ #include "ArduinoJson.h" #include "AsyncJson.h" #include "Configuration.h" +#include "Hoymiles.h" #include "MqttSettings.h" #include "NtpSettings.h" #include "Update.h" @@ -698,6 +699,8 @@ void WebApiClass::onInverterAdd(AsyncWebServerRequest* request) response->setLength(); request->send(response); + + Hoymiles.addInverter(inverter->Name, inverter->Serial); } void WebApiClass::onInverterEdit(AsyncWebServerRequest* request) @@ -739,7 +742,7 @@ void WebApiClass::onInverterEdit(AsyncWebServerRequest* request) return; } - if (root[F("id")].as() > INV_MAX_COUNT - 1) { + if (root[F("id")].as() > INV_MAX_COUNT - 1) { retMsg[F("message")] = F("Invalid ID specified!"); response->setLength(); request->send(response); @@ -760,7 +763,7 @@ void WebApiClass::onInverterEdit(AsyncWebServerRequest* request) return; } - INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[root[F("id")].as()]; + INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[root[F("id")].as()]; inverter.Serial = root[F("serial")].as(); strncpy(inverter.Name, root[F("name")].as().c_str(), INV_MAX_NAME_STRLEN); Configuration.write(); @@ -770,6 +773,10 @@ void WebApiClass::onInverterEdit(AsyncWebServerRequest* request) response->setLength(); request->send(response); + + std::shared_ptr inv = Hoymiles.getInverterByPos(root[F("id")].as()); + inv->setName(inverter.Name); + inv->setSerial(inverter.Serial); } void WebApiClass::onInverterDelete(AsyncWebServerRequest* request) @@ -811,14 +818,15 @@ void WebApiClass::onInverterDelete(AsyncWebServerRequest* request) return; } - if (root[F("id")].as() > INV_MAX_COUNT - 1) { + if (root[F("id")].as() > INV_MAX_COUNT - 1) { retMsg[F("message")] = F("Invalid ID specified!"); response->setLength(); request->send(response); return; } - INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[root[F("id")].as()]; + uint8_t inverter_id = root[F("id")].as(); + INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[inverter_id]; inverter.Serial = 0; strncpy(inverter.Name, "", 0); Configuration.write(); @@ -828,6 +836,8 @@ void WebApiClass::onInverterDelete(AsyncWebServerRequest* request) response->setLength(); request->send(response); + + Hoymiles.removeInverterByPos(inverter_id); } void WebApiClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request) @@ -886,7 +896,12 @@ void WebApiClass::onDtuAdminGet(AsyncWebServerRequest* request) JsonObject root = response->getRoot(); CONFIG_T& config = Configuration.get(); - root[F("dtu_serial")] = config.Dtu_Serial; + // DTU Serial is read as HEX + char buffer[sizeof(uint64_t) * 8 + 1]; + sprintf(buffer, "%0lx%08lx", + ((uint32_t)((config.Dtu_Serial >> 32) & 0xFFFFFFFF)), + ((uint32_t)(config.Dtu_Serial & 0xFFFFFFFF))); + root[F("dtu_serial")] = buffer; root[F("dtu_pollinterval")] = config.Dtu_PollInterval; root[F("dtu_palevel")] = config.Dtu_PaLevel; @@ -955,7 +970,9 @@ void WebApiClass::onDtuAdminPost(AsyncWebServerRequest* request) } CONFIG_T& config = Configuration.get(); - config.Dtu_Serial = root[F("dtu_serial")].as(); + char* t; + // Interpret the string as a hex value and convert it to uint64_t + config.Dtu_Serial = strtoll(root[F("dtu_serial")].as().c_str(), &t, 16); config.Dtu_PollInterval = root[F("dtu_pollinterval")].as(); config.Dtu_PaLevel = root[F("dtu_palevel")].as(); Configuration.write(); @@ -965,6 +982,10 @@ void WebApiClass::onDtuAdminPost(AsyncWebServerRequest* request) response->setLength(); request->send(response); + + Hoymiles.getRadio()->setPALevel((rf24_pa_dbm_e)config.Dtu_PaLevel); + Hoymiles.getRadio()->setDtuSerial(config.Dtu_Serial); + Hoymiles.setPollInterval(config.Dtu_PollInterval); } WebApiClass WebApi; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 79518d8..00ec035 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,5 @@ #include "Configuration.h" +#include "Hoymiles.h" #include "MqttSettings.h" #include "NtpSettings.h" #include "WebApi.h" @@ -61,9 +62,28 @@ void setup() Serial.print(F("Initialize WebApi... ")); WebApi.init(); Serial.println(F("done")); + + // Initialize inverter communication + Serial.print(F("Initialize Hoymiles interface... ")); + CONFIG_T& config = Configuration.get(); + Hoymiles.init(); + Hoymiles.getRadio()->setPALevel((rf24_pa_dbm_e)config.Dtu_PaLevel); + Hoymiles.getRadio()->setDtuSerial(config.Dtu_Serial); + Hoymiles.setPollInterval(config.Dtu_PollInterval); + + for (uint8_t i = 0; i < INV_MAX_COUNT; i++) { + if (config.Inverter[i].Serial > 0) { + Hoymiles.addInverter( + config.Inverter[i].Name, + config.Inverter[i].Serial); + } + } + Serial.println(F("done")); } void loop() { WiFiSettings.loop(); + + Hoymiles.loop(); } \ No newline at end of file