From 3bc9fa81a8c14839d8a5142df51996090b232f5e Mon Sep 17 00:00:00 2001 From: Yurii Date: Thu, 30 Jan 2025 01:25:05 +0300 Subject: [PATCH] feat: added ntp server and timezone settings --- gulpfile.js | 4 + src/MainTask.h | 15 ++ src/Settings.h | 5 + src/strings.h | 2 + src/utils.h | 22 ++ src_data/locales/en.json | 5 + src_data/locales/it.json | 5 + src_data/locales/ru.json | 5 + src_data/pages/settings.html | 41 ++++ src_data/timezones.json | 458 +++++++++++++++++++++++++++++++++++ 10 files changed, 562 insertions(+) create mode 100644 src_data/timezones.json diff --git a/gulpfile.js b/gulpfile.js index 586b62f..ac71154 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -34,6 +34,10 @@ let paths = { { src: 'src_data/locales/*.json', dest: 'data/static/locales/' + }, + { + src: 'src_data/*.json', + dest: 'data/static/' } ], static: [ diff --git a/src/MainTask.h b/src/MainTask.h index a0cc9c7..f581adb 100644 --- a/src/MainTask.h +++ b/src/MainTask.h @@ -38,6 +38,7 @@ protected: unsigned long heatingDisabledTime = 0; PumpStartReason extPumpStartReason = PumpStartReason::NONE; unsigned long externalPumpStartTime = 0; + bool ntpStarted = false; bool telnetStarted = false; bool emergencyDetected = false; unsigned long emergencyFlipTime = 0; @@ -109,6 +110,16 @@ protected: } if (network->isConnected()) { + if (!this->ntpStarted) { + if (strlen(settings.system.ntp.server)) { + configTime(0, 0, settings.system.ntp.server); + setenv("TZ", settings.system.ntp.timezone, 1); + tzset(); + + this->ntpStarted = true; + } + } + if (!this->telnetStarted && telnetStream != nullptr) { telnetStream->begin(23, false); this->telnetStarted = true; @@ -124,6 +135,10 @@ protected: Sensors::setConnectionStatusByType(Sensors::Type::MANUAL, !settings.mqtt.enabled || vars.mqtt.connected, false); } else { + if (this->ntpStarted) { + this->ntpStarted = false; + } + if (this->telnetStarted) { telnetStream->stop(); this->telnetStarted = false; diff --git a/src/Settings.h b/src/Settings.h index 9632c5b..dbae29b 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -36,6 +36,11 @@ struct Settings { unsigned short port = DEFAULT_TELNET_PORT; } telnet; + struct { + char server[49] = "pool.ntp.org"; + char timezone[49] = "UTC0"; + } ntp; + UnitSystem unitSystem = UnitSystem::METRIC; byte statusLedGpio = DEFAULT_STATUS_LED_GPIO; } system; diff --git a/src/strings.h b/src/strings.h index ba6fab0..306a397 100644 --- a/src/strings.h +++ b/src/strings.h @@ -135,6 +135,7 @@ const char S_MQTT[] PROGMEM = "mqtt"; const char S_NAME[] PROGMEM = "name"; const char S_NATIVE_HEATING_CONTROL[] PROGMEM = "nativeHeatingControl"; const char S_NETWORK[] PROGMEM = "network"; +const char S_NTP[] PROGMEM = "ntp"; const char S_N_FACTOR[] PROGMEM = "n_factor"; const char S_OFFSET[] PROGMEM = "offset"; const char S_ON_ENABLED_HEATING[] PROGMEM = "onEnabledHeating"; @@ -190,6 +191,7 @@ const char S_TEMPERATURE[] PROGMEM = "temperature"; const char S_THRESHOLD_HIGH[] PROGMEM = "thresholdHigh"; const char S_THRESHOLD_LOW[] PROGMEM = "thresholdLow"; const char S_THRESHOLD_TIME[] PROGMEM = "thresholdTime"; +const char S_TIMEZONE[] PROGMEM = "timezone"; const char S_TOTAL[] PROGMEM = "total"; const char S_TRESHOLD_TIME[] PROGMEM = "tresholdTime"; const char S_TURBO[] PROGMEM = "turbo"; diff --git a/src/utils.h b/src/utils.h index 7cf72e7..b51d1c2 100644 --- a/src/utils.h +++ b/src/utils.h @@ -359,6 +359,10 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) { telnet[FPSTR(S_ENABLED)] = src.system.telnet.enabled; telnet[FPSTR(S_PORT)] = src.system.telnet.port; + auto ntp = system[FPSTR(S_NTP)].to(); + ntp[FPSTR(S_SERVER)] = src.system.ntp.server; + ntp[FPSTR(S_TIMEZONE)] = src.system.ntp.timezone; + system[FPSTR(S_UNIT_SYSTEM)] = static_cast(src.system.unitSystem); system[FPSTR(S_STATUS_LED_GPIO)] = src.system.statusLedGpio; @@ -527,6 +531,24 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false } } + if (!src[FPSTR(S_SYSTEM)][FPSTR(S_NTP)][FPSTR(S_SERVER)].isNull()) { + String value = src[FPSTR(S_SYSTEM)][FPSTR(S_NTP)][FPSTR(S_SERVER)].as(); + + if (value.length() < sizeof(dst.system.ntp.server) && !value.equals(dst.system.ntp.server)) { + strcpy(dst.system.ntp.server, value.c_str()); + changed = true; + } + } + + if (!src[FPSTR(S_SYSTEM)][FPSTR(S_NTP)][FPSTR(S_TIMEZONE)].isNull()) { + String value = src[FPSTR(S_SYSTEM)][FPSTR(S_NTP)][FPSTR(S_TIMEZONE)].as(); + + if (value.length() < sizeof(dst.system.ntp.timezone) && !value.equals(dst.system.ntp.timezone)) { + strcpy(dst.system.ntp.timezone, value.c_str()); + changed = true; + } + } + if (!src[FPSTR(S_SYSTEM)][FPSTR(S_UNIT_SYSTEM)].isNull()) { uint8_t value = src[FPSTR(S_SYSTEM)][FPSTR(S_UNIT_SYSTEM)].as(); UnitSystem prevUnitSystem = dst.system.unitSystem; diff --git a/src_data/locales/en.json b/src_data/locales/en.json index ce55f43..4ee06ba 100644 --- a/src_data/locales/en.json +++ b/src_data/locales/en.json @@ -315,6 +315,11 @@ "title": "Telnet port", "note": "Default: 23" } + }, + "ntp": { + "server": "NTP server", + "timezone": "Timezone", + "timezonePresets": "Select preset..." } }, diff --git a/src_data/locales/it.json b/src_data/locales/it.json index 6907e9c..d8cbb16 100644 --- a/src_data/locales/it.json +++ b/src_data/locales/it.json @@ -315,6 +315,11 @@ "title": "Porta Telnet", "note": "Default: 23" } + }, + "ntp": { + "server": "NTP server", + "timezone": "Zona oraria", + "timezonePresets": "Seleziona preimpostato..." } }, diff --git a/src_data/locales/ru.json b/src_data/locales/ru.json index 26b10a1..8379c90 100644 --- a/src_data/locales/ru.json +++ b/src_data/locales/ru.json @@ -315,6 +315,11 @@ "title": "Telnet порт", "note": "По умолчанию: 23" } + }, + "ntp": { + "server": "NTP сервер", + "timezone": "Часовой пояс", + "timezonePresets": "Выберите пресет..." } }, diff --git a/src_data/pages/settings.html b/src_data/pages/settings.html index fa60548..6102774 100644 --- a/src_data/pages/settings.html +++ b/src_data/pages/settings.html @@ -85,6 +85,23 @@ +
+ + + +
+