NTP Abruf ESP8266 Core 2.7.4


Edit:

Um es mit drei Sätzen auf den Punkt zubringen was ich möchte:

Die Funktion settimeofday_cb() setzt einen Callback, der jedes Mal ausgeführt wird, wenn settimeofday() aufgerufen wird. Die SNTP-Synchronisierung ändert die Systemzeit mit settimeofday () - was in Ordnung ist, aber wenn ich settimeofday () manuell ausführe, wird auch die Callback-Funktion aufgerufen. Es gibt keine Möglichkeit, um anzuzeigen, was die Quelle der Callback-Funktion war – Netzwerksynchronisierung oder manuelle Einstellung.


Ich versuch es nochmal anders zu erklären was ich vorhabe.

Mit dem Aufruf von

settimeofday_cb(time_is_set);

definiere ich die Callback-Funktion time_is_set(), die immer aufgerufen wird wenn die NTP Zeit automatisch - bedingt durch das Intervall - erfolgreich abgerufen wird. Somit kann ich kontrollieren, ob der Abruf geklappt hat und gleichzeitig die frisch abgerufene Zeit in die RTC schreiben.

Jetzt lese ich mir aber zwischen den Intervallen, wo die NTP Zeit abgerufen wird, aus der RTC die Epoch Zeit und aktualisiere damit die Systemzeit. Dies mache ich so:

  // Epoch Zeit aus der RTC in Systemzeit einlesen
  time_t rtc_time_t = 1635552000; 
  timeval tv = { rtc_time_t, 0 };
  settimeofday (&tv, NULL); // Epoch Zeit der RTC in die Systemzeit schreiben

Das klappt bis dahin auch alles wunderbar. Allerdings wird hier die Callback-Funktion auch aufgerufen, wenn ich die Zeit manuell aus der RTC in die Systemzeit einlesen. Und das hat zur folge, dass die gerade abgerufene Zeit aus der RTC durch die Callback-Funktion ( time_is_set() ) direkt auch weider in die RTC geschrieben wird.

Deshalb brauche ich eine Unterscheidung, ob Callback-Funktion aufgerufen wird weil das Intervall abgelaufen ist oder weil ich manuell per RTC die Systemzeit aktualisiere.

Da ging mein Gedanke an eine globale Variable die ich vor dem setzen der RTC Zeit in die Systemzeit anpasse, damit die Callback-Funktion mir nicht direkt wieder die vermeidlich gleiche Zeit in die RTC schreibt:

bool from_sntp = true;

void time_is_set (void) {
  time_t t = time (nullptr);
  Serial.println("--- Callback -> settimeofday() wurde aufgerufen --- ");

  if (from_sntp) { // Wenn false dann nicht die RTC beschreiben
    /*
      An dieser Stelle wird die RTC mit Hilfe der Variable t gestellt.
    */
  }

  from_sntp = true;
}

Nochmal vielen Dank für eure Antworten :slight_smile: