/*
|
|
|
|
NTP MODULE
|
|
|
|
Copyright (C) 2016-2018 by Xose Pérez <xose dot perez at gmail dot com>
|
|
|
|
*/
|
|
|
|
#if NTP_SUPPORT
|
|
|
|
#include <TimeLib.h>
|
|
#include <NtpClientLib.h>
|
|
#include <WiFiClient.h>
|
|
#include <Ticker.h>
|
|
|
|
Ticker _ntp_delay;
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// NTP
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void _ntpWebSocketOnSend(JsonObject& root) {
|
|
root["time"] = ntpDateTime();
|
|
root["ntpVisible"] = 1;
|
|
root["ntpStatus"] = ntpConnected();
|
|
root["ntpServer1"] = getSetting("ntpServer1", NTP_SERVER);
|
|
root["ntpServer2"] = getSetting("ntpServer2");
|
|
root["ntpServer3"] = getSetting("ntpServer3");
|
|
root["ntpOffset"] = getSetting("ntpOffset", NTP_TIME_OFFSET).toInt();
|
|
root["ntpDST"] = getSetting("ntpDST", NTP_DAY_LIGHT).toInt() == 1;
|
|
}
|
|
|
|
void _ntpUpdate() {
|
|
#if WEB_SUPPORT
|
|
wsSend(_ntpWebSocketOnSend);
|
|
#endif
|
|
DEBUG_MSG_P(PSTR("[NTP] Time: %s\n"), (char *) ntpDateTime().c_str());
|
|
}
|
|
|
|
void _ntpConfigure() {
|
|
NTP.begin(
|
|
getSetting("ntpServer1", NTP_SERVER),
|
|
getSetting("ntpOffset", NTP_TIME_OFFSET).toInt(),
|
|
getSetting("ntpDST", NTP_DAY_LIGHT).toInt() == 1
|
|
);
|
|
if (getSetting("ntpServer2")) NTP.setNtpServerName(getSetting("ntpServer2"), 1);
|
|
if (getSetting("ntpServer3")) NTP.setNtpServerName(getSetting("ntpServer3"), 2);
|
|
NTP.setInterval(NTP_UPDATE_INTERVAL);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
bool ntpConnected() {
|
|
return (timeStatus() == timeSet);
|
|
}
|
|
|
|
String ntpDateTime() {
|
|
if (!ntpConnected()) return String("Not set");
|
|
String value = NTP.getTimeDateString();
|
|
int hour = value.substring(0, 2).toInt();
|
|
int minute = value.substring(3, 5).toInt();
|
|
int second = value.substring(6, 8).toInt();
|
|
int day = value.substring(9, 11).toInt();
|
|
int month = value.substring(12, 14).toInt();
|
|
int year = value.substring(15, 19).toInt();
|
|
char buffer[20];
|
|
snprintf_P(buffer, sizeof(buffer), PSTR("%04d-%02d-%02d %02d:%02d:%02d"), year, month, day, hour, minute, second);
|
|
return String(buffer);
|
|
}
|
|
|
|
void ntpSetup() {
|
|
|
|
NTP.onNTPSyncEvent([](NTPSyncEvent_t error) {
|
|
if (error) {
|
|
#if WEB_SUPPORT
|
|
wsSend_P(PSTR("{\"ntpStatus\": false}"));
|
|
#endif
|
|
if (error == noResponse) {
|
|
DEBUG_MSG_P(PSTR("[NTP] Error: NTP server not reachable\n"));
|
|
} else if (error == invalidAddress) {
|
|
DEBUG_MSG_P(PSTR("[NTP] Error: Invalid NTP server address\n"));
|
|
}
|
|
} else {
|
|
_ntp_delay.once_ms(100, _ntpUpdate);
|
|
}
|
|
});
|
|
|
|
wifiRegister([](justwifi_messages_t code, char * parameter) {
|
|
if (code == MESSAGE_CONNECTED) _ntpConfigure();
|
|
});
|
|
|
|
#if WEB_SUPPORT
|
|
wsOnSendRegister(_ntpWebSocketOnSend);
|
|
wsOnAfterParseRegister(_ntpConfigure);
|
|
#endif
|
|
|
|
// Register loop
|
|
espurnaRegisterLoop(ntpLoop);
|
|
|
|
}
|
|
|
|
void ntpLoop() {
|
|
now();
|
|
}
|
|
|
|
#endif // NTP_SUPPORT
|