diff --git a/ESP32_AP-Flasher/src/serialap.cpp b/ESP32_AP-Flasher/src/serialap.cpp index 6b60afd0..3da7a1fe 100644 --- a/ESP32_AP-Flasher/src/serialap.cpp +++ b/ESP32_AP-Flasher/src/serialap.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "commstructs.h" #include "contentmanager.h" diff --git a/ESP32_AP-Flasher/src/web.cpp b/ESP32_AP-Flasher/src/web.cpp index 440c4d90..6720aa36 100644 --- a/ESP32_AP-Flasher/src/web.cpp +++ b/ESP32_AP-Flasher/src/web.cpp @@ -26,6 +26,7 @@ #include "tag_db.h" #include "udp.h" #include "wifimanager.h" +#include #ifdef HAS_EXT_FLASHER #include "webflasher.h" @@ -648,6 +649,28 @@ void init_web() { request->send(200, "text/plain", "Ok, saved"); }); + // Allow external time sync (e.g., from Home Assistant) without Internet + // Usage: POST /set_time with form field 'epoch' (UNIX time seconds) + server.on("/set_time", HTTP_POST, [](AsyncWebServerRequest *request) { + if (request->hasParam("epoch", true)) { + time_t epoch = static_cast(request->getParam("epoch", true)->value().toInt()); + if (epoch > 1600000000) { // basic sanity check (~2020-09-13) + struct timeval tv; + tv.tv_sec = epoch; + tv.tv_usec = 0; + settimeofday(&tv, nullptr); + logLine("Time set via /set_time"); + wsSendSysteminfo(); + request->send(200, "text/plain", "ok"); + return; + } else { + request->send(400, "text/plain", "invalid epoch"); + return; + } + } + request->send(400, "text/plain", "missing 'epoch'"); + }); + server.on("/set_var", HTTP_POST, [](AsyncWebServerRequest *request) { if (request->hasParam("key", true) && request->hasParam("val", true)) { std::string key = request->getParam("key", true)->value().c_str();