NTP Abruf ESP8266 Core 2.7.4

Hallo HotSystems,

vielen Dank für deine Antwort :slight_smile: . Auf der Seite von fips kann ich direkt keine Lösung für mein Problem finden. Er arbeitet bei seinen Beispielen ohne eine RTC. Wenn ich mein Sketch ohne die RTC nutze klappt es auch wunderbar mit der Callback Funktion - sie wird ja nur beim NTP Abruf aufgerufen.

Ich habe gerade das NTP Beispiel aus dem Core 3.0.2 nochmal angeschaut und die betreffenden Stellen rauskopiert, die zeigen was ich gerne auch auf dem Core 2.7.4 machen würde.

Ab dem Core 3.0.0 ist es möglich zu prüfen woher der Aufruf der Callback Funktion kam:

void time_is_set(bool from_sntp /* <= this parameter is optional */) {
  // any function is allowed in this callback

  if (from_sntp) {
    Serial.print("SNTP");
  } else {
    Serial.print("USER");
  }

}

Meine Idee war es jetzt diese Prüfung mit einer globalen Variable umzusetzen auf dem Core 2.7.4. Ich habe den Sketch von oben mal mit meiner Idee angepasst:

// 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
const char *TZstr = "CET-1CEST,M3.5.0,M10.5.0/3";

time_t tnow; // Beinhaltet die Epochzeit

bool from_sntp = true; // <=== NEU

// 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 --- ");

  if (from_sntp) { // <== NEU Abfrage woher der Aufruf kam
    /*
      An dieser Stelle wird die RTC mit Hilfe der Variable t gestellt.
    */
  }

  from_sntp = true;
}

void syncSystemzeit(void) {

/*
  Auf false setzen damit die Callback Funktion nicht nochmal
  die gerade abgerufene Zeit aus der RTC erneut in diese schreibt
*/
  from_sntp = false;

  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
}

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
  syncSystemzeit();

  // Zeitzone und NTP Server definieren
  configTime (TZstr, "pool.ntp.org");

  WiFi.mode (WIFI_STA);
  WiFi.begin (SSID, SSIDPWD);
}

void loop() {
}

Aber ist die Variante mit der globalen Variable so glücklich?

Lieben Gruß,
Björn