feat: NTP time sync writing to DS3231 (by IP, DNS-independent)

This LAN's router does not resolve external hostnames, so NTP uses
hard-coded Cloudflare/Google anycast IPs instead of names.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 21:05:29 +07:00
co-authored by Claude Opus 4.8
parent cb3a06382e
commit ea0256a5b9
4 changed files with 28 additions and 1 deletions
+22
View File
@@ -1,4 +1,7 @@
#include <RTClib.h>
#include <time.h>
#include <ESP8266WiFi.h>
#include "config.h"
#include "rtc_time.h"
static RTC_DS3231 rtc;
@@ -18,3 +21,22 @@ void rtcSet(const RtcTime& t) {
uint32_t rtcEpoch() {
return rtc.now().unixtime();
}
bool ntpSync(int tzOffsetMin) {
// NTP servers by IP to bypass DNS (this network doesn't resolve names reliably).
// Cloudflare (162.159.200.123) and Google (216.239.35.0/.4) are stable anycast.
configTime(tzOffsetMin * 60, 0, "162.159.200.123", "216.239.35.0", "216.239.35.4");
time_t now = time(nullptr);
int tries = 0;
while (now < 1700000000 && tries < 120) { // up to ~30 s
delay(250);
now = time(nullptr);
tries++;
}
if (now < 1700000000) return false;
struct tm* lt = localtime(&now);
rtcSet(RtcTime{ (uint16_t)(lt->tm_year + 1900), (uint8_t)(lt->tm_mon + 1),
(uint8_t)lt->tm_mday, (uint8_t)lt->tm_hour,
(uint8_t)lt->tm_min, (uint8_t)lt->tm_sec });
return true;
}