Реализованы sensor-1 (DHT22, телеметрия temperature/humidity) и
реле-актуаторы light-1/pump-1/fan-1 (turn_on/turn_off/set_level) по
протоколу MQTT платформы home_automatization (devices/{id}/telemetry|commands|ack).
48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
#include "time_sync.h"
|
|
|
|
#include <time.h>
|
|
|
|
static bool timeReady = false;
|
|
|
|
void timeSyncBegin() {
|
|
// UTC, без летнего времени — платформа хранит и парсит время в UTC.
|
|
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
|
|
|
|
Serial.print("[time] syncing via NTP");
|
|
time_t now = time(nullptr);
|
|
unsigned long start = millis();
|
|
// 8 * 3600 — грубая нижняя граница правдоподобного unix-времени,
|
|
// пока NTP не ответит time() возвращает эпоху около 0.
|
|
while (now < 8 * 3600 && millis() - start < 15000) {
|
|
delay(250);
|
|
Serial.print(".");
|
|
now = time(nullptr);
|
|
}
|
|
Serial.println();
|
|
|
|
timeReady = now >= 8 * 3600;
|
|
if (timeReady) {
|
|
Serial.println("[time] synced");
|
|
} else {
|
|
Serial.println("[time] sync timed out, will retry in background");
|
|
}
|
|
}
|
|
|
|
bool timeSyncIsReady() {
|
|
if (!timeReady) {
|
|
time_t now = time(nullptr);
|
|
timeReady = now >= 8 * 3600;
|
|
}
|
|
return timeReady;
|
|
}
|
|
|
|
String nowRFC3339() {
|
|
time_t now = time(nullptr);
|
|
struct tm tmStruct;
|
|
gmtime_r(&now, &tmStruct);
|
|
|
|
char buf[21];
|
|
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", &tmStruct);
|
|
return String(buf);
|
|
}
|