From 1b5235d36eafaefe77fb554b98ed115092634eeb Mon Sep 17 00:00:00 2001 From: Thomas Popp Date: Sun, 13 Oct 2024 20:27:09 +0200 Subject: [PATCH] fix(aquamqtt): fix broken ntp update --- AquaMQTT/src/handler/RTC.cpp | 66 ++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/AquaMQTT/src/handler/RTC.cpp b/AquaMQTT/src/handler/RTC.cpp index b27aba7..dbed0e9 100644 --- a/AquaMQTT/src/handler/RTC.cpp +++ b/AquaMQTT/src/handler/RTC.cpp @@ -21,43 +21,51 @@ void RTCHandler::setup() void RTCHandler::loop() { - if (timeStatus() != timeSet) + // do a ntp update if case time is not set or last ntp update is an hour ago + if (timeStatus() != timeSet || (millis() - mLastNTPUpdate) >= 3600000) { - if ((millis() - mLastNTPUpdate) >= 3600000) + mLastNTPUpdate = millis(); + struct tm timeinfo { - mLastNTPUpdate = millis(); - struct tm timeinfo - { - }; - if (getLocalTime(&timeinfo, 5000)) - { - setTime(timeinfo.tm_hour, - timeinfo.tm_min, - timeinfo.tm_sec, - timeinfo.tm_mday, - timeinfo.tm_mon + 1, - timeinfo.tm_year + 1900); - if (mFoundRTC) - { - mRTC.adjust(DateTime(now())); - } - } - else if (mFoundRTC) + }; + + // success getting time via ntp + if (getLocalTime(&timeinfo, 5000)) + { + // set local time in lib (PaulStoffregen/Time) + setTime(timeinfo.tm_hour, + timeinfo.tm_min, + timeinfo.tm_sec, + timeinfo.tm_mday, + timeinfo.tm_mon + 1, + timeinfo.tm_year + 1900); + + // store the new time to the rtc + if (mFoundRTC) { - setTime(mRTC.now().unixtime()); + mRTC.adjust(DateTime(now())); } } + // ntp update failed, but we have a hardware rtc + else if (mFoundRTC) + { + // set local time in lib from RTC + setTime(mRTC.now().unixtime()); + } } - else if (config::OVERRIDE_TIME_AND_DATE_IN_MITM && (millis() - mLastStateUpdate) > 500) + + // if time is known (either from RTC or NTP), then update the state + if (timeStatus() == timeSet && config::OVERRIDE_TIME_AND_DATE_IN_MITM && ((millis() - mLastStateUpdate) > 1000)) { - mLastStateUpdate = now(); + mLastStateUpdate = millis(); + time_t timeUpdate = now(); aquamqtt::HMIStateProxy::getInstance().updateTime( - second(mLastStateUpdate), - minute(mLastStateUpdate), - hour(mLastStateUpdate), - day(mLastStateUpdate), - month(mLastStateUpdate), - year(mLastStateUpdate)); + second(timeUpdate), + minute(timeUpdate), + hour(timeUpdate), + day(timeUpdate), + month(timeUpdate), + year(timeUpdate)); } }