diff --git a/include/WebApi.h b/include/WebApi.h index f2a91ba..cf5aa1a 100644 --- a/include/WebApi.h +++ b/include/WebApi.h @@ -34,6 +34,9 @@ private: void onInverterEdit(AsyncWebServerRequest* request); void onInverterDelete(AsyncWebServerRequest* request); + void onDtuAdminGet(AsyncWebServerRequest* request); + void onDtuAdminPost(AsyncWebServerRequest* request); + void onFirmwareUpdateFinish(AsyncWebServerRequest* request); void onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t *data, size_t len, bool final); }; diff --git a/src/WebApi.cpp b/src/WebApi.cpp index 7cc4652..fc47826 100644 --- a/src/WebApi.cpp +++ b/src/WebApi.cpp @@ -56,6 +56,9 @@ void WebApiClass::init() _server.on("/api/inverter/edit", HTTP_POST, std::bind(&WebApiClass::onInverterEdit, this, _1)); _server.on("/api/inverter/del", HTTP_POST, std::bind(&WebApiClass::onInverterDelete, this, _1)); + _server.on("/api/dtu/config", HTTP_GET, std::bind(&WebApiClass::onDtuAdminGet, this, _1)); + _server.on("/api/dtu/config", HTTP_POST, std::bind(&WebApiClass::onDtuAdminPost, this, _1)); + _server.on("/api/firmware/update", HTTP_POST, std::bind(&WebApiClass::onFirmwareUpdateFinish, this, _1), std::bind(&WebApiClass::onFirmwareUpdateUpload, this, _1, _2, _3, _4, _5, _6)); @@ -877,4 +880,91 @@ void WebApiClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request, String } } +void WebApiClass::onDtuAdminGet(AsyncWebServerRequest* request) +{ + AsyncJsonResponse* response = new AsyncJsonResponse(); + JsonObject root = response->getRoot(); + CONFIG_T& config = Configuration.get(); + + root[F("dtu_serial")] = config.Dtu_Serial; + root[F("dtu_pollinterval")] = config.Dtu_PollInterval; + root[F("dtu_palevel")] = config.Dtu_PaLevel; + + response->setLength(); + request->send(response); +} + +void WebApiClass::onDtuAdminPost(AsyncWebServerRequest* request) +{ + AsyncJsonResponse* response = new AsyncJsonResponse(); + JsonObject retMsg = response->getRoot(); + retMsg[F("type")] = F("warning"); + + if (!request->hasParam("data", true)) { + retMsg[F("message")] = F("No values found!"); + response->setLength(); + request->send(response); + return; + } + + String json = request->getParam("data", true)->value(); + + if (json.length() > 1024) { + retMsg[F("message")] = F("Data too large!"); + response->setLength(); + request->send(response); + return; + } + + DynamicJsonDocument root(1024); + DeserializationError error = deserializeJson(root, json); + + if (error) { + retMsg[F("message")] = F("Failed to parse data!"); + response->setLength(); + request->send(response); + return; + } + + if (!(root.containsKey("dtu_serial") && root.containsKey("dtu_pollinterval") && root.containsKey("dtu_palevel"))) { + retMsg[F("message")] = F("Values are missing!"); + response->setLength(); + request->send(response); + return; + } + + if (root[F("dtu_serial")].as() == 0) { + retMsg[F("message")] = F("Serial cannot be zero!"); + response->setLength(); + request->send(response); + return; + } + + if (root[F("dtu_pollinterval")].as() == 0) { + retMsg[F("message")] = F("Poll intervall must be greater zero!"); + response->setLength(); + request->send(response); + return; + } + + if (root[F("dtu_palevel")].as() > 3) { + retMsg[F("message")] = F("Invalid power level setting!"); + response->setLength(); + request->send(response); + return; + } + + CONFIG_T& config = Configuration.get(); + config.Dtu_Serial = root[F("dtu_serial")].as(); + config.Dtu_PollInterval = root[F("dtu_pollinterval")].as(); + config.Dtu_PaLevel = root[F("dtu_palevel")].as(); + Configuration.write(); + + retMsg[F("type")] = F("success"); + retMsg[F("message")] = F("Settings saved!"); + + response->setLength(); + request->send(response); +} + WebApiClass WebApi; \ No newline at end of file