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++;