diff --git a/lib/AmsConfiguration/include/AmsConfiguration.h b/lib/AmsConfiguration/include/AmsConfiguration.h index c124139f..cbbcb8f2 100644 --- a/lib/AmsConfiguration/include/AmsConfiguration.h +++ b/lib/AmsConfiguration/include/AmsConfiguration.h @@ -61,7 +61,8 @@ struct WiFiConfig { uint8_t power; uint8_t sleep; uint8_t mode; -}; // 212 + bool autoreboot; +}; // 213 struct MqttConfig86 { char host[128]; diff --git a/lib/AmsConfiguration/src/AmsConfiguration.cpp b/lib/AmsConfiguration/src/AmsConfiguration.cpp index 3b7e18a0..8edc4817 100644 --- a/lib/AmsConfiguration/src/AmsConfiguration.cpp +++ b/lib/AmsConfiguration/src/AmsConfiguration.cpp @@ -54,6 +54,8 @@ bool AmsConfiguration::setWiFiConfig(WiFiConfig& config) { wifiChanged |= strcmp(config.hostname, existing.hostname) != 0; wifiChanged |= config.power != existing.power; wifiChanged |= config.sleep != existing.sleep; + wifiChanged |= config.mode != existing.mode; + wifiChanged |= config.autoreboot != existing.autoreboot; } else { wifiChanged = true; } @@ -883,6 +885,7 @@ bool AmsConfiguration::relocateConfig96() { WiFiConfig wifi; EEPROM.get(CONFIG_WIFI_START, wifi); wifi.mode = 1; // WIFI_STA + wifi.autoreboot = true; EEPROM.put(CONFIG_WIFI_START, wifi); NtpConfig ntp; diff --git a/lib/SvelteUi/app/src/lib/ConfigurationPanel.svelte b/lib/SvelteUi/app/src/lib/ConfigurationPanel.svelte index b7e450b2..1e423e1f 100644 --- a/lib/SvelteUi/app/src/lib/ConfigurationPanel.svelte +++ b/lib/SvelteUi/app/src/lib/ConfigurationPanel.svelte @@ -23,7 +23,7 @@ e: { e: false, k: '', a: '' }, m: { e: false, w: false, v: false, a: false, c: false } }, - w: { s: '', p: '', w: 0.0, z: 255 }, + w: { s: '', p: '', w: 0.0, z: 255, a: true }, n: { m: '', i: '', s: '', g: '', d1: '', d2: '', d: false, n1: '', n2: '', h: false }, @@ -335,6 +335,9 @@ +
+ +
Network diff --git a/lib/SvelteUi/app/src/lib/DataStores.js b/lib/SvelteUi/app/src/lib/DataStores.js index 2f271189..7970faa6 100644 --- a/lib/SvelteUi/app/src/lib/DataStores.js +++ b/lib/SvelteUi/app/src/lib/DataStores.js @@ -20,11 +20,12 @@ let sysinfo = { usrcfg: null, fwconsent: null, booting: false, - upgrading: false + upgrading: false, + security: 0 }; export const sysinfoStore = writable(sysinfo); export async function getSysinfo() { - const response = await fetchWithTimeout("/sysinfo.json"); + const response = await fetchWithTimeout("/sysinfo.json?t=" + Math.floor(Date.now() / 1000)); sysinfo = (await response.json()) sysinfoStore.set(sysinfo); }; diff --git a/lib/SvelteUi/app/src/lib/Header.svelte b/lib/SvelteUi/app/src/lib/Header.svelte index 024b4498..fd3d2f53 100644 --- a/lib/SvelteUi/app/src/lib/Header.svelte +++ b/lib/SvelteUi/app/src/lib/Header.svelte @@ -64,7 +64,7 @@ {#if data.me < 0}
{ 'MQTT: ' + mqttError(data.me) }
{/if} - {#if data.ee != 0} + {#if data.ee > 0 || data.ee < 0}
{ 'PriceAPI: ' + priceError(data.ee) }
{/if}
diff --git a/lib/SvelteUi/json/conf_wifi.json b/lib/SvelteUi/json/conf_wifi.json index 9071e9b7..3433a640 100644 --- a/lib/SvelteUi/json/conf_wifi.json +++ b/lib/SvelteUi/json/conf_wifi.json @@ -2,5 +2,6 @@ "s": "%s", "p": "%s", "w": %.1f, - "z": %d + "z": %d, + "a": %s }, diff --git a/lib/SvelteUi/json/favicon.base64 b/lib/SvelteUi/json/favicon.base64 new file mode 100644 index 00000000..c9f90807 --- /dev/null +++ b/lib/SvelteUi/json/favicon.base64 @@ -0,0 +1,96 @@ +AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/ +/v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+///////////////////////+/v7/2dG4/4tuIP+E +ZxT/x7mU//7+/v///////////////////////////////////////////////////////v78/4hs +Hv/b07v/6+fa/4VoF//w7eT//v7+//////////////////////////////////////////////// +//39+/+BZBL/7+zh//r69/+JbSD/6eXY//7+/v////////////////////////////////////// +///////////+/v7/wbOL/4dqGf+LcCL/qpVd//7+/v/+/v7////////////////////////////+ +/v7//v7+//7+/v/+/v7//v7+//7+/v/t6d7/6OLT//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ +/v/+/v7//v7+//7+/v/+/v7/+Pfy/7ysgP/x7ub//v7+//7+/v/39vL/wrOL/+vn2//+/v7//v7+ +//7+/v/+/v7//v7+//Dt5P/PxKT/9fTu//n49f+mklf/f2AL/5Z9Nv+ZgDz/gmMP/5mBPP/v6+H/ +/v7+//7+/v/+/v7//v7+//7+/v+WfTj/va2B/6KMUP/+/v7//v7+/+/r4f/Uyq3/0cap/+jj1P/+ +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/lXw3/8Cxhv+DZhT/1cuv//39/f/+/v7///////7+ +/v/+/v7//v7+/+LbyP+eh0f/6eXX/////v/+/v7//////+7r4P/Lv53/yLuX/4hsHP+PdCj/taJx +/8i7lv/JvZn/uql6/5d+OP+CZBD/vKyA//v7+f/k3sz/p5JY/9HHqP/49/T//v7+///////6+vf/ +1Muv/7Sib/+jjU//oYtM/6+cZ//NwaD/9vTu//7+/v/+/v7/nIVF/+Haxf+QdSv/iGwc/7Ceaf/y +7+f//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/49/P/v7CF/4FiDv+Xfzr/ootO/+zo +3P+kj1P/gGIN/6mVW//Qxab/6uXY//f28f/49/P/7ure/9bMsf+yn2v/hWcV/5h/O//h2sb/9PLr +//39/f/+/v7//v7+/+nk1v+6qnz/l345/4BiDf98XAP/fFwD/35fCP+Sdy7/sqBt/+DYxP/+/v7/ +/v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3/9/Xw//X07v/8/Pv//v7+//7+/v/+ +/v7//v7+//7+/v/+/v7//v7+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA/v7+//7+/v///////v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+///////+/v7/ +/v7+//7+/v/+/v7//v7+//7+/v/+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v// +/////v7+//7+/v/+/v7//v7+//7+/v///////v7+//////////////////////////////////// +//////////////7+/v/+/v3//f38//z9/P/+/v3//v7+//////////////////////////////// +///////////////////////////////////////+/v7///////////////////////////////// +//////////////////7///7+/v/+/v7/7+zi/6yYYf+GaBf/gGIM/5mBPf/Yz7T//v7+//7+/v// +/////////////////////////////////////////////////////////////////////v7+//7+ +/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//f7+/+7r4P+JbR//fFsC/31cBP99XQX/fFsD +/3xcBf/JvZr//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/ +/v7+//7+/v/+/v7//v7+///////+/v7//v7+//7+/v///////v7+//7+/v/+/v7/qJRb/3xbA/+a +gT7/6OTV//Ty6/+9roL/e1wE/4FjEf/08en//v7+//7+/v/+/v7///////7+/v/+/v7//v7+//7+ +/v/+/v7//v7+//7+/v///////v7+//////////////////////////////////////////////7/ +//v79/+BZBT/fF0H/+vn2//+/v7//v7+//3+/f+bhEP/fFsD/9DGqf/+/v7//v7+//////////// +/////////////////////////////////////////////////v7+//7+/v/+/v7//v7+//7+/v/+ +/v7//v7+//7+/v/+/v7/+fjz/3xeCv9+Xwz/+fjx//7+/v/+/v7//v7+/6mWX/98WwP/yb2b//7+ +/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+ +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/fz/kHcw/3tbA//Hu5f//f79//3+/f/v6+D/ +hWgY/3tbBP/h28n//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+ +/v7//v7+//7+/v/+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/Ow6L/e1wE/31d +B/+ljlL/sJ1o/4dqGf97XAL/nYZH//7+/P/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7///// +//7+/v/+/v7///////7+/v/+/v7///////////////////////////////////////////////// +/v7+//39/f/AsYj/f2AK/3tbA/97XAP/e1wD/5uEQ//z8Oj//v7+//////////////////////// +/////v7+/////////////////////////////////////////////v7+//////////////////// +///////////////////+/////v7+//7+/v/u6+D/yr6c/8S3kP/e18H//f38//7+/v///v7///// +//////////////////////////////////////////////////////////////////7+/v/+/v7/ +/v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+ +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ +/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/w7OP/+ffz//7+/v/+/v7//v7+ +//7+/v/+/v7//v7+//7+/v/+/v7//v79/+zo3f/8/Pv//v7+//7+/v/+/v7//v7+//7+/v/+/v7/ +/v7+//7+/v/+/v7//v7+//7+/v////////////7+/v/////////////////+/v7/5eDP/35fCf+L +biL/z8Sk//r69//+/v7//v7+//7+/v/+/v7//P79/+Xfz/+ijE//e1wE/7amdv/9/v7//v7+//// +//////////////////////////////////////////////7+/v/+/v7//v7+//7+/v/+/v7//v7+ +//7+/v/r59r/hGYV/3tbA/98WwP/hmoZ/6eSV/+6qnv/va2C/7Ceaf+TejH/fFwF/3xbA/98XAT/ +wbOL//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//Pz7/8i7l/+c +hEP/o41Q/9vUvf/9/f3//f79//7+/v/u6+H/rZpj/4BgC/97XAP/fFsC/3xcA/98WwL/fFsD/3xb +A/97XAT/lnw2/9jPtf/+/v3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+ +//7+/v+/sYj/e1wD/4psHf+CZRH/fl4K/+Daxv/+/v7//v7+//7+/v/+/v3/8vDn/8zBn/+xnmr/ +ooxO/6CISf+plVz/wLKI/+Pezf/9/fz//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+///////+ +/v7//v7+//7+/v/+/v7//v7+/4pvIv+SejP/+/r3/+zp3P99Xgn/rZtm//7+/v////////7///7+ +/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v///////v7+///////+/v7//v7+ +///////////////////////+/v7/////////////////iW0f/5V8N//7/Pn/8Ozi/31fC/+YgT7/ ++fj0//7+/f/+/v7//v7+///////////////////////////////////////////////////////+ +/v7//f79/9fOtf+qlmD/6+fZ//7+/v////////////////////////////////+7rID/fFsE/41z +J/+GaRf/e1sD/3tcAv+Ncib/z8Wl//z7+f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+ +//7+/v/+/v7//v79/+fh0f+lkFP/fFwE/3xbA/+9roT//v7+//7+/v/+/v7//v7+//7+/v/+/v7/ +/v7+//z8+v/Cs4v/lX03/5yEQ/+1pHL/gGIO/3xcA/97XAP/i28i/7moef/g2MP/+Pfz//7+/v/+ +/v7//v7+//7+/v/8/Pv/6+bZ/8m8mP+dhUP/fF0G/3xbA/98XAP/ooxQ//Pw6f/+/v7//v7+//z8 ++v/Z0bj/zcKi/+/s4v/+/v7//v7+//7+/v/9/v7//f7+//3+/v/t6d7/rJlh/35fCf98WwP/e1sD +/3xcA/9/YAr/jXEj/5d+N/+YgDr/kXct/4NlEv97XAT/fFwD/3xbA/97WwP/lHs1/9bNsv/9/fz/ +/v7+//7+/v/5+PT/m4RE/3tbBP97WwP/gGIO/9fOtf/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+ +/v7/7+zi/8CxiP+Wfjj/fl8I/3tbA/98WwP/e1wC/3tbA/98WwP/fFsD/3xcA/+LbiH/r5xn/97W +wP/8/fv//v7+//7+/v/+/v7//v7+/8e8mf97XAP/uKd4/9nQt/+JbSD/i3Aj//X07v/w7eT//v7+ +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//3+/f/19O7/4NnE/87EpP/GuJT/xLeQ/8q+nP/Z0Lb/ +7erf//z8+//+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7/tKNz/3lbBf/28+n//f7+/66cZ/97 +XAP/jXIm/39gCv+9r4T/+fn2//3+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ +/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v39/93Vvv+McSb/e1wD +/6SPVP/CtYz/gmUS/5R6NP+Zgj7/elsD/3xbA/+Ncyn/0MWn//v7+f/9/v7//v7+//7+/v////// +///////////////////////////////////////////////////////+/v/9/v7//v7+/+fi0v+l +kFb/fF0F/3tbAv+AYAv/fFwF/3tbA/+LbyL/5eDP//r69v+7rID/f2EL/3xbA/98XAP/jHEk/7+x +h//t6d3//v7+//7+/v/+/v7//v7+//////////////////////////////////7+/v/9/v7/+Pfz +/9LIqv+giUn/fV0F/3tbA/97WwP/nYdG/+vm2f/w7OL/5N/O//v6+P/+/v7//v7+//7+/v/t6N3/ +q5hg/35fCP98WwP/fFwD/3xcBP+SeC//sqBt/83Anv/g2MT/7end//Px6v/08uv/8O3j/+Xgzv/W +yq7/va2C/5+ISP+BYw7/e1sD/3tbA/98WwP/lHs0/9XMsf/9/f3//v7+//7+/v/+/v7//v7+//7+ +/v/+/v7//v7+//7+/v/+/v7/7uvg/7uqff+McCL/fFsD/3tbA/98XAP/e1wD/3tcA/98XAP/fF0E +/3xdBf98XAT/e1sD/3tbA/97WwP/e1wD/3xcAv+BYg3/qJJY/9vTu//9/fz//v7+//7+/v/+/v7/ +/v7+//7+/v///////v7+///////////////////////+/v7//v79//z9/P/k3s3/wrOK/6WPU/+N +cib/fl4I/3xcA/97WwP/e1wC/3tcAv98XAP/hmkY/5qCP/+2pHT/1syy//f28f/+/v7///////// +/////////////////////////////////////////v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+ +//7+/v/+/v7//f79//7+/f/7+/r/8u/n/+zo2v/r5tn/7uvi//j38//9/f3//v7+//7+/v/+/v7/ +/v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+ +/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ +/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+ +/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAA diff --git a/lib/SvelteUi/src/AmsWebServer.cpp b/lib/SvelteUi/src/AmsWebServer.cpp index a2385992..4f79c38e 100644 --- a/lib/SvelteUi/src/AmsWebServer.cpp +++ b/lib/SvelteUi/src/AmsWebServer.cpp @@ -185,6 +185,7 @@ void AmsWebServer::githubSvg() { void AmsWebServer::faviconIco() { if(debugger->isActive(RemoteDebug::DEBUG)) debugger->printf("Serving /favicon.ico over http...\n"); + notFound(); //TODO } @@ -271,12 +272,22 @@ void AmsWebServer::sysinfoJson() { ESP.restart(); #endif performRestart = false; + } else { + time_t now = time(nullptr); + if(now < BUILD_EPOCH && server.hasArg(F("t"))) { + time_t clientTime = server.arg(F("t")).toInt(); + if(clientTime > BUILD_EPOCH) { + timeval tv { clientTime, 0}; + settimeofday(&tv, nullptr); + if(debugger->isActive(RemoteDebug::INFO)) debugger->printf("Internal clock synchronized with client\n"); + } + } } } void AmsWebServer::dataJson() { if(debugger->isActive(RemoteDebug::DEBUG)) debugger->printf("Serving /data.json over http...\n"); - uint64_t now = millis64(); + uint64_t millis = millis64(); if(!checkSecurity(2)) return; @@ -311,11 +322,11 @@ void AmsWebServer::dataJson() { uint8_t hanStatus; if(meterState->getLastError() < 0) { hanStatus = 3; - } else if((meterConfig->baud == 0 || meterState->getLastUpdateMillis() == 0) && now < 15000) { + } else if((meterConfig->baud == 0 || meterState->getLastUpdateMillis() == 0) && millis < 15000) { hanStatus = 0; - } else if(now - meterState->getLastUpdateMillis() < 15000) { + } else if(millis - meterState->getLastUpdateMillis() < 15000) { hanStatus = 1; - } else if(now - meterState->getLastUpdateMillis() < 30000) { + } else if(millis - meterState->getLastUpdateMillis() < 30000) { hanStatus = 2; } else { hanStatus = 3; @@ -351,6 +362,8 @@ void AmsWebServer::dataJson() { peaks += String(ea->getPeak(i).value / 100.0); } + time_t now = time(nullptr); + snprintf_P(buf, BufferSize, DATA_JSON, maxPwr == 0 ? meterState->isThreePhase() ? 20000 : 10000 : maxPwr, meterConfig->productionCapacity, @@ -376,7 +389,7 @@ void AmsWebServer::dataJson() { vcc, rssi, hw->getTemperature(), - (uint32_t) (now / 1000), + (uint32_t) (millis / 1000), ESP.getFreeHeap(), espStatus, hanStatus, @@ -404,7 +417,7 @@ void AmsWebServer::dataJson() { priceRegion.c_str(), meterState->getLastError(), eapi == NULL ? 0 : eapi->getLastError(), - (uint32_t) time(nullptr) + (uint32_t) now ); server.sendHeader(HEADER_CACHE_CONTROL, CACHE_CONTROL_NO_CACHE); @@ -786,7 +799,8 @@ void AmsWebServer::configurationJson() { wifiConfig.ssid, strlen(wifiConfig.psk) > 0 ? "***" : "", wifiConfig.power / 10.0, - wifiConfig.sleep + wifiConfig.sleep, + wifiConfig.autoreboot ? "true" : "false" ); server.sendContent(buf); snprintf_P(buf, BufferSize, CONF_NET_JSON, @@ -1081,6 +1095,7 @@ void AmsWebServer::handleSave() { } wifi.power = server.arg(F("ww")).toFloat() * 10; wifi.sleep = server.arg(F("wz")).toInt(); + wifi.autoreboot = server.hasArg(F("wa")) && server.arg(F("wa")) == F("true"); config->setWiFiConfig(wifi); if(server.hasArg(F("nm")) && server.arg(F("nm")) == "static") { diff --git a/src/AmsToMqttBridge.ino b/src/AmsToMqttBridge.ino index a2d11865..3cd38730 100644 --- a/src/AmsToMqttBridge.ino +++ b/src/AmsToMqttBridge.ino @@ -1016,8 +1016,14 @@ void WiFi_connect() { lastWifiRetry = millis(); if (WiFi.status() != WL_CONNECTED) { + WiFiConfig wifi; + if(!config.getWiFiConfig(wifi) || strlen(wifi.ssid) == 0) { + swapWifiMode(); + return; + } + if(WiFi.getMode() != WIFI_OFF) { - if(wifiReconnectCount > 3) { + if(wifiReconnectCount > 3 && wifi.autoreboot) { ESP.restart(); return; } @@ -1056,12 +1062,6 @@ void WiFi_connect() { } wifiTimeout = WIFI_CONNECTION_TIMEOUT; - WiFiConfig wifi; - if(!config.getWiFiConfig(wifi) || strlen(wifi.ssid) == 0) { - swapWifiMode(); - return; - } - if (Debug.isActive(RemoteDebug::INFO)) debugI("Connecting to WiFi network: %s", wifi.ssid); wifiReconnectCount++;