diff --git a/include/WebApi.h b/include/WebApi.h index e6920dc1..da512b34 100644 --- a/include/WebApi.h +++ b/include/WebApi.h @@ -24,6 +24,10 @@ private: void onNtpStatus(AsyncWebServerRequest* request); void onNtpAdminGet(AsyncWebServerRequest* request); void onNtpAdminPost(AsyncWebServerRequest* request); + + void onMqttStatus(AsyncWebServerRequest* request); + void onMqttAdminGet(AsyncWebServerRequest* request); + void onMqttAdminPost(AsyncWebServerRequest* request); }; extern WebApiClass WebApi; \ No newline at end of file diff --git a/include/defaults.h b/include/defaults.h index c5a28fd4..565349e8 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -26,4 +26,4 @@ #define MQTT_PORT 1883 #define MQTT_USER "" #define MQTT_PASSWORD "" -#define MQTT_TOPIC "stripe/" \ No newline at end of file +#define MQTT_TOPIC "solar/" \ No newline at end of file diff --git a/src/WebApi.cpp b/src/WebApi.cpp index 5972d85b..8a2ab30d 100644 --- a/src/WebApi.cpp +++ b/src/WebApi.cpp @@ -35,6 +35,10 @@ void WebApiClass::init() _server.on("/api/ntp/config", HTTP_GET, std::bind(&WebApiClass::onNtpAdminGet, this, _1)); _server.on("/api/ntp/config", HTTP_POST, std::bind(&WebApiClass::onNtpAdminPost, this, _1)); + _server.on("/api/mqtt/status", HTTP_GET, std::bind(&WebApiClass::onMqttStatus, this, _1)); + _server.on("/api/mqtt/config", HTTP_GET, std::bind(&WebApiClass::onMqttAdminGet, this, _1)); + _server.on("/api/mqtt/config", HTTP_POST, std::bind(&WebApiClass::onMqttAdminPost, this, _1)); + _server.serveStatic("/", LittleFS, "/", "max-age=86400").setDefaultFile("index.html"); _server.onNotFound(std::bind(&WebApiClass::onNotFound, this, _1)); _server.begin(); @@ -390,4 +394,80 @@ void WebApiClass::onNtpAdminPost(AsyncWebServerRequest* request) NtpSettings.setTimezone(); } +void WebApiClass::onMqttStatus(AsyncWebServerRequest* request) +{ + AsyncJsonResponse* response = new AsyncJsonResponse(); + JsonObject root = response->getRoot(); + CONFIG_T& config = Configuration.get(); + + root[F("mqtt_enabled")] = config.Mqtt_Enabled; + root[F("mqtt_hostname")] = config.Mqtt_Hostname; + root[F("mqtt_port")] = config.Mqtt_Port; + root[F("mqtt_username")] = config.Mqtt_Username; + root[F("mqtt_topic")] = config.Mqtt_Topic; + + response->setLength(); + request->send(response); +} + +void WebApiClass::onMqttAdminGet(AsyncWebServerRequest* request) +{ + AsyncJsonResponse* response = new AsyncJsonResponse(); + JsonObject root = response->getRoot(); + CONFIG_T& config = Configuration.get(); + + root[F("mqtt_enabled")] = config.Mqtt_Enabled; + root[F("mqtt_hostname")] = config.Mqtt_Hostname; + root[F("mqtt_port")] = config.Mqtt_Port; + root[F("mqtt_username")] = config.Mqtt_Username; + root[F("mqtt_password")] = config.Mqtt_Password; + root[F("mqtt_topic")] = config.Mqtt_Topic; + + response->setLength(); + request->send(response); +} + +void WebApiClass::onMqttAdminPost(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; + } + + CONFIG_T& config = Configuration.get(); + + // 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