Hallo,
ich benötige Eure Unterstützung beim NTP Zeit Abruf auf einem ESP8266 (NodeMCU) mit dem Core 2.7.4., da ich meinen Sketch meiner WordClock aufräume / neu schreibe.
Die Uhrzeit wird in UTC auf einer RTC gespeichert, welche ich in die Systemzeit mit Hilfe der Funktion settimeofday() lade. Dies klappt soweit auch super, allerdings ruft die Funktion immer - egal ob sie vom User oder vom SNTP Intervall aufgerufen wurde Ihre definierte Callback Funktion auf.
Das hat zur Folge, dass wenn ich die Uhrzeit aus der RTC lese und in die Systemzeit schreibe die Callback Funktion (time_is_set) die Systemzeit auch wieder in die RTC schreiben würde - was absolut keinen Sinn macht.
Habt ihr eine Idee wie ich prüfen kann ob die Funktion settimeofday() zum Stellen der Systemzeit mit Hilfe der RTC oder zum Abruf der NTP Zeit gestartet wurde? Die einzige Idee die ich aktuell habe wäre eine globale Variable die ich entsprechend vor dem Stellen der Systemzeit veränder und in der Funktion time_is_set() prüfe.
Ab dem ESP Core =>3.0.0 ist dieses Feature bereits vorhanden, dort kann man in der Callback Funktion über die bool from_sntp abfragen, ob der Abruf vom Intervall kam. Diesen Core kann ich aktuell aber nicht nutzen, da es hier massive Probleme mit der FastLED Lib gibt.
Vielen Dank schonmal für Eure Hilfe
!
Lieben Gruß,
Björn
// ESP8266 Core 2.7.4
#include <ESP8266WiFi.h>
#include <time.h> // time() ctime()
#include <sys/time.h> // struct timeval
#include <coredecls.h> // settimeofday_cb()
// WLAN Konfiguration
#define SSID ""
#define SSIDPWD ""
// Zeitzonen Konfiguration
// https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
// https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
const char *TZstr = "CET-1CEST,M3.5.0,M10.5.0/3";
time_t tnow; // Beinhaltet die Epochzeit
// Nach 10 Sekunden erfolgt die erste NTP Abfrage
uint32_t sntp_startup_delay_MS_rfc_not_less_than_60000 () {
return 10000;
}
void time_is_set (void) {
time_t t = time (nullptr);
Serial.println("--- Callback -> settimeofday() wurde aufgerufen --- ");
/*
An dieser Stelle wird die RTC mit Hilfe der Variable t gestellt.
Die RTC speichert die aktuelle Uhrzeit in UTC
*/
}
void setup() {
Serial.begin (115200);
Serial.print("\n\n");
// Callback Funktion definieren, die aufgerufen wird, wenn
// settimeofday() erfolgreich ausgeführt wurde.
settimeofday_cb(time_is_set);
// Uhrzeit aus der RTC auslesen und in die Systemzeit schreiben
time_t rtc_time_t = 1635552000; // 30.10.21 00:00:00 Uhr
timeval tv = { rtc_time_t, 0 };
settimeofday (&tv, NULL);
Serial.println("-> RTC Epoch Zeit wurde in die Systemzeit geladen \n");
yield(); // Zeit schaffen um direkt die Callback Funktion auszuführen
// Zeitzone und NTP Server definieren
configTime (TZstr, "pool.ntp.org");
WiFi.mode (WIFI_STA);
WiFi.begin (SSID, SSIDPWD);
}
void loop() {
tnow = time (nullptr); // Aktuelle Epoch Zeit UTC aus der Systemzeit auslesen
struct tm tm;
printf ("Lokale Uhrzeit: %s", asctime (localtime_r (&tnow, &tm)));
printf ("UTC / GMT: %s \n", asctime (gmtime_r (&tnow, &tm)));
delay(1000); // Dirty Delay - Nur für den Test...
}