Lokale Uhrzeit mit dem ESP8266 und einem NTP Zeitserver (inklusive Sommer/Winterzeit)

Nachdem ich Code für den ESP8266 publiziert habe (klick), der einen NTP Zeitserver abfragt, sind immer wieder Anfragen gekommen. Die NTP Abfrage liefert UTC Zeit und die Fragesteller wollten eine Umrechnung auf lokale Zeit inklusive automatischer Sommer/Winterzeit Umstellung.
Ich es jetzt endlich mal geschafft aus einem noch nicht publizierten Projekt ein Demoprogramm für die Fragestellung zu bauen.

Der Demo-Code basiert auf dem Webserver Beispiel. Für die Uhrzeit Funktionalität werden drei Komponenten benutzt:
1. Der NTP Code aus dem o.g. Beispiel.
2. Die timelib Bibliothek von M. Margolis. Diese kann über die Arduino IDE installiert werden.
3. Die Timezone Bibliothek von J. Christensen. Diese muss manuell installiert werden; die Bibliothek gibt es hier: https://github.com/JChristensen/Timezone

Die Programmlogik:
In der timelib Bibliothek kann man einen sogenannten Sync-Provider definieren. Diese Funktion gibt die aktuelle Uhrzeit zurück. Weiterhin wird definiert, wie oft die Uhrzeit synchronisiert werden soll. Wir setzen das Intervall auf täglich (86400 Sekunden). In der Funktion wird die Zeit von einem NTP Server abgefragt. Die timelib Bibliothek ist damit auf UTC gesetzt.
Wenn die Webseite aufgerufen wird, wird die Zeit mit Hilfe der timezone Bibliothek umgerechnet. Die Funktionen der timelib können genutzt werden, um die umgerechnete Zeit in ein lesbares Format umzuwandeln.
Der ESP8266 Webserver ist per http://localtime/ erreichbar, wenn der Router lokale Netzwerknamen unterstützt (@Vodafone: Eure Easyboxen sollten das so langsam mal lernen – AVM kann’s doch auch). Ansonsten die IP aus dem seriellen Log nehmen.

Hier gibt es den Code: ESP_NTP_LocalTime_Demo

Viel Erfolg!

14 Gedanken zu „Lokale Uhrzeit mit dem ESP8266 und einem NTP Zeitserver (inklusive Sommer/Winterzeit)

  1. joergens.mi

    Hallo ich kann das hier nicht in der Arduino-Ide 1.8.5 nicht finden

    Die timelib Bibliothek von M. Margolis. Diese kann über die Arduino IDE installiert werden.

    Kannst du mit helfen

    Danke.

    Antworten
  2. Michel

    Hallo Stefan,
    hab die Lokalzeit erfolgreich auch in anderem Sketch eingebunden.
    Aber die Arduino-IDE (1.8.1) gibt jedesmal beim kompilieren folgenden Fehler aus:

    WARNUNG: Bibliothek Timezone-master behauptet auf [avr] Architektur(en) ausgeführt werden zu können und ist möglicherweise inkompatibel mit Ihrem derzeitigen Board, welches auf [esp8266] Architektur(en) ausgeführt wird.

    Ne Idee?
    Gruss Michel

    Antworten
    1. Klaus

      Hallo Michael
      Ich bin auch neu in der Arduino welt und noch neuer in der ESP8266..
      Ich geh mal davon aus du wie die Meisten Windos benutzt und die Bibiotheken in deinem Ordner findest
      C:\Users\DEINNAME\Documents\Arduino\libraries\Timezone-master
      im Ordner gibts wie in jeder lib die Datei mit dem Namen library.properties

      Diese Datei mit z.b Programmers Nodepad editieren und zwar den Eintrag
      architectures=avr ==> architectures=* ändern und abspeichern.
      Also nachgelesen hab ichs nicht aber es erscheint mir Logisch das die Arduino IDE ja igendwie mitgeteil bekommen muss mit welcher Architekturas die Lib funktioniert.

      Was ich noch hinzufügen möchte ich konnte sowohl Time-master als auch TImezone-master aus Git als zib in der IDE Installieren ich benuz die 1.8.5 Gruß Klaus

      Antworten
  3. Jens

    Die timelib Bibliothek von M. Margolis. Diese kann über die Arduino IDE installiert werden.

    Auf Arduino 1.8.5 kann es nicht aus dem Menu installiert werden, gibt es eine andere Quelle?

    Antworten
  4. DDTech

    Hallo Stefan,
    ich habe ein Projekt mit einem esp8266, in dem ich ebenfalls unter anderem Temperatur und Luftfeuchtigkeit erhebe und mit Google Charts visualisiere. Ich verwende einen HTU21 und sende die Daten direkt zu einem anderen Server, wenn die Verbindung aufgebaut werden kann. Andernfalls halte die Messergebnisse temporär im SPIFFS, bis der Upload wieder möglich ist. Darum synchronisiere ich ebenfalls mit einem NTP-Server. Ich verwende auch die TIME-Library und bin auch auf die TimeZone-Bibliothek von J. Christensen gestoßen, habe mich dann aber entschieden in UTC zu bleiben. Wenn die Visualisierung nur über Browser erfolgt ist die Bibliothek gar nicht notwendig und eine besondere Aufbearbeitung der Daten nicht erforderlich.
    Als Zeitstempel verwende ich die Sekunden seit 1.1.1970 00:00:00, also UNIX epoch. Jeder konstante Versatz funktioniert natürlich ebenso. Für heute Nachmittag 22.07.2018 15:00 Uhr lokal (13:00 UTC) also 1530226440.
    Mit diesem Zeitstempel kann man in JavaScript direkt arbeiten, wenn man Millisekunden daraus macht.
    var dX = new Date( 1530226440 * 1000 );
    Und da der Browser weiß, wo er ist und ohnehin die gesamte Zeitzonenlogik implementiert hat, gibt
    dX.toLocalTimeString() (und nicht nur diese) stets die korrekte lokale Zeit zurück.
    Google Charts mit diesen Zeitstempeln gefüttert, gibt ebenfalls lokale Zeiten aus.
    Man kann daher Code und Platz auf dem esp sparen ohne Informationsgehalt zu verlieren.

    Gruß

    Frank

    Antworten
    1. ST Beitragsautor

      Hallo Frank,

      das ist ein interessanter Ansatz. Danke dafür. Wenn man etwas zeitbasiert steuern will, muss man zwar weiterhin auf dem ESP wandeln, aber für andere Fälle ist das eine gute Alternative.

      Gruss Stefan

      Antworten
  5. DDTech

    Hallo Stefan,
    ich habe ein Projekt für die Steuerung einer Tiefbrunnenpumpe mit einem esp8266, in dem ich ebenfalls unter anderem Temperatur und Luftfeuchtigkeit erhebe und mit Google Charts visualisiere. Ich verwende einen HTU21 und sende die Daten direkt zu einem anderen Server, wenn die Verbindung aufgebaut werden kann. Andernfalls halte die Messergebnisse temporär im SPIFFS, bis der Upload wieder möglich ist. Darum synchronisiere ich ebenfalls mit einem NTP-Server. Ich verwende auch die TIME-Library und bin ebenfalls auf die TimeZone-Bibliothek von J. Christensen gestoßen, habe mich dann aber entschieden in UTC zu bleiben. Wenn die Visualisierung nur über Browser erfolgt ist die Bibliothek gar nicht notwendig und eine besondere Aufbearbeitung der Daten nicht erforderlich.
    Als Zeitstempel verwende ich die Sekunden seit 1.1.1970 00:00:00, also UNIX epoch. Jeder konstante Versatz funktioniert natürlich ebenso. Für heute Nachmittag 22.07.2018 15:00 Uhr lokal (13:00 UTC) also 1530226440.
    Mit diesem Zeitstempel kann man in JavaScript direkt arbeiten, wenn man Millisekunden daraus macht.
    var dX = new Date( 1530226440 * 1000 );
    Und da der Browser weiß, wo er ist und ohnehin die gesamte Zeitzonenlogik implementiert hat, gibt
    dX.toLocalTimeString() (und nicht nur diese) stets die korrekte lokale Zeit zurück.
    Google Charts mit diesen Zeitstempeln gefüttert, gibt ebenfalls lokale Zeiten aus.
    Man kann also Code und Platz auf dem esp sparen ohne Informationsgehalt einzubüßen.

    Gruß

    Frank

    Antworten
  6. DDTech

    Sorry, jetzt habe ich doppelt gepostet, hatte es gestern zwei Mal probiert und es blieb bei sieben Kommentaren. Eben noch einmal probiert und plötzlich erscheint Beiträge von gestern und heute.
    Möglicherweise, weil ich den Cookie-Banner nicht gleich beantwortet hatte. Den einen kannst Du natürlich löschen.

    Ich steuere eine Tiefbrunnenpumpe und dabei vor allem die Laufzeit. Da ist der Wechsel von Sommer- zu Winterzeit theoretisch eher hinterlich. „Theoretisch“, weil sie vermutlich ohnehin nicht zur Umstellzeit läuft. Auch, wenn ich eine Schaltuhrfunktion hinzu nehme, bereitet mir die UTC keine Probleme. Es gibt auf der Browserseite auch die ..ToUtc() Varianten.
    Sommer- und Winterzeit bringen eigentlich nur Probleme, weil sie die Kontinuität unterbrechen. Wir sind die lokale Zeit gewohnt, daher tun wir uns etwas schwer mit der UTC, im Grunde genommen ist es damit einfacher.
    Ich lade die Seiten allerdings auch vom SPIFFS. D.h., alles, was ich ins JS packen kann entlastet meinen ESP. Wenn die Seiten im ESP hardcodiert sind, verschiebt man das Problem nur innerhalb des Speichers und ist mit der direkten Verarbeitung vielleicht besser dran.

    Gruß

    Frank

    Antworten
  7. Ju Pirker

    Servus Stefan,
    ich möchte dein: ESP_NTP_LocalTime_Demo
    auf einem esp 32 verwenden. Leider gelingt mir das nicht.
    Kannst du mir bitte helfen.
    LG JU

    Antworten
  8. Alex

    Hallo Stefan,

    ich habe eine Frage zu den ESP.
    Mit Hilfe deiner Beispiele konnte ich schon einiges umsetzen,
    allerdings fehlt mir ein gutes Beispiel, wie ich aus einem Textfeld den Wert auslesen kann.
    Sprich vom WebServer Eine Zahl eingeben (z.B. 0-50) und per Button an den Esp senden.
    Hast du schonmal sowas gemacht und kannst helfen?

    Mit freundlichen Grüßen

    Alex

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert