#include "web_ui.h" #include #include #include "devices.h" #include "mqtt_link.h" #include "telemetry.h" static WebServer server(80); static const char PAGE_HTML[] PROGMEM = R"HTML( Гроубокс

Гроубокс

Температура
Влажность воздуха
нет данных
Влажность почвы
)HTML"; static void handleRoot() { server.send_P(200, "text/html", PAGE_HTML); } static void handleState() { JsonDocument doc; float temperature, humidity; bool hasReading = telemetryGetLast(temperature, humidity); JsonObject sensor = doc["sensor"].to(); sensor["has_reading"] = hasReading; if (hasReading) { sensor["temperature"] = temperature; sensor["humidity"] = humidity; } float soilPercent; bool hasSoilReading = telemetryGetLastSoil(soilPercent); JsonObject soil = doc["soil"].to(); soil["has_reading"] = hasSoilReading; if (hasSoilReading) { soil["percent"] = soilPercent; } JsonObject devicesObj = doc["devices"].to(); devicesGetState(devicesObj); String body; serializeJson(doc, body); server.send(200, "application/json", body); } static void handleCommand() { JsonDocument cmd; DeserializationError parseErr = deserializeJson(cmd, server.arg("plain")); if (parseErr) { server.send(400, "application/json", "{\"error\":\"invalid json\"}"); return; } String deviceId = cmd["device_id"] | ""; String action = cmd["action"] | ""; double level = cmd["level"] | 0.0; JsonDocument state; // Тот же путь применения команды и публикации ack, что и у MQTT-команд // (см. mqtt_link.cpp) — device shadow платформы остаётся консистентным // независимо от того, кто отдал команду: Laravel/rule-engine или веб-UI. if (!devicesApplyCommand(deviceId, action, level, state)) { server.send(404, "application/json", "{\"error\":\"unknown device or action\"}"); return; } mqttPublishAck(deviceId, state); String body; serializeJson(state, body); server.send(200, "application/json", body); } void webUiBegin() { server.on("/", HTTP_GET, handleRoot); server.on("/api/state", HTTP_GET, handleState); server.on("/api/command", HTTP_POST, handleCommand); server.begin(); Serial.println("[web] UI started on port 80"); } void webUiHandle() { server.handleClient(); }