diff --git a/src/app.cpp b/src/app.cpp index fc5f6b0f..73cdfabd 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -233,6 +233,14 @@ void app::tickNtpUpdate(void) { uint32_t midTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86400); // next midnight local time onceAt(std::bind(&app::tickMidnight, this), midTrig, "midNi"); } + if (mConfig->sys.schedReboot) { + uint32_t localTime = gTimezone.toLocal(mTimestamp); + uint32_t rebootTrig = gTimezone.toUTC(localTime - (localTime % 86400) + 86410); // reboot 10 secs after midnght + if (rebootTrig <= mTimestamp) { //necessary for times other than midnight to prevent reboot loop + rebootTrig += 86400; + } + onceAt(std::bind(&app::tickReboot, this), rebootTrig, "midRe"); + } } nxtTrig = isOK ? 43200 : 60; // depending on NTP update success check again in 12 h or in 1 min diff --git a/src/config/settings.h b/src/config/settings.h index 2f35295d..4d0ab505 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -64,6 +64,7 @@ typedef struct { char adminPwd[PWD_LEN]; uint16_t protectionMask; bool darkMode; + bool schedReboot; // wifi char stationSsid[SSID_LEN]; @@ -356,6 +357,7 @@ class settings { mCfg.sys.protectionMask = DEF_PROT_INDEX | DEF_PROT_LIVE | DEF_PROT_SERIAL | DEF_PROT_SETUP | DEF_PROT_UPDATE | DEF_PROT_SYSTEM | DEF_PROT_API | DEF_PROT_MQTT; mCfg.sys.darkMode = false; + mCfg.sys.schedReboot = false; // restore temp settings if(keepWifi) memcpy(&mCfg.sys, &tmp, sizeof(cfgSys_t)); @@ -438,6 +440,7 @@ class settings { obj[F("adm")] = mCfg.sys.adminPwd; obj[F("prot_mask")] = mCfg.sys.protectionMask; obj[F("dark")] = mCfg.sys.darkMode; + obj[F("reb")] = (bool) mCfg.sys.schedReboot; ah::ip2Char(mCfg.sys.ip.ip, buf); obj[F("ip")] = String(buf); ah::ip2Char(mCfg.sys.ip.mask, buf); obj[F("mask")] = String(buf); ah::ip2Char(mCfg.sys.ip.dns1, buf); obj[F("dns1")] = String(buf); @@ -452,6 +455,7 @@ class settings { getChar(obj, F("adm"), mCfg.sys.adminPwd, PWD_LEN); getVal(obj, F("prot_mask"), &mCfg.sys.protectionMask); getVal(obj, F("dark"), &mCfg.sys.darkMode); + getVal(obj, F("reb"), &mCfg.sys.schedReboot); if(obj.containsKey(F("ip"))) ah::ip2Arr(mCfg.sys.ip.ip, obj[F("ip")].as()); if(obj.containsKey(F("mask"))) ah::ip2Arr(mCfg.sys.ip.mask, obj[F("mask")].as()); if(obj.containsKey(F("dns1"))) ah::ip2Arr(mCfg.sys.ip.dns1, obj[F("dns1")].as()); diff --git a/src/web/RestApi.h b/src/web/RestApi.h index b95065b7..886d89e8 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -210,6 +210,7 @@ class RestApi { obj[F("hidd")] = mConfig->sys.isHidden; obj[F("device_name")] = mConfig->sys.deviceName; obj[F("dark_mode")] = (bool)mConfig->sys.darkMode; + obj[F("sched_reboot")] = (bool)mConfig->sys.schedReboot; obj[F("mac")] = WiFi.macAddress(); obj[F("hostname")] = mConfig->sys.deviceName; diff --git a/src/web/html/setup.html b/src/web/html/setup.html index 4f1f7b6a..c0f7cf83 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -18,6 +18,10 @@
Device Name
+
+
Reboot Ahoy at midnight
+
+
Dark Mode
@@ -634,6 +638,7 @@ document.getElementsByName(i[0])[0].value = obj[i[1]]; document.getElementsByName("hidd")[0].checked = obj["hidd"]; document.getElementsByName("darkMode")[0].checked = obj["dark_mode"]; + document.getElementsByName("schedReboot")[0].checked = obj["sched_reboot"]; e = document.getElementsByName("adminpwd")[0]; if(!obj["pwd_set"]) e.value = ""; diff --git a/src/web/web.h b/src/web/web.h index b8841f2e..f9f04291 100644 --- a/src/web/web.h +++ b/src/web/web.h @@ -454,6 +454,7 @@ class Web { if (request->arg("device") != "") request->arg("device").toCharArray(mConfig->sys.deviceName, DEVNAME_LEN); mConfig->sys.darkMode = (request->arg("darkMode") == "on"); + mConfig->sys.schedReboot = (request->arg("schedReboot") == "on"); // protection if (request->arg("adminpwd") != "{PWD}") {