Update: 2020-07-16

Download Sketch

NTP_Dual.ino

// ****************************************************************
// Sketch Esp8266 WiFi NTP Lokalzeit und UTC
// created: Jens Fleischer, 2019-05-05
// last mod: Jens Fleischer, 2020-07-16
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266
// Software: Esp8266 Arduino Core 2.6.3 - 2.7.2
// Getestet auf: Nodemcu, Wemos D1 Mini Pro, Sonoff Switch, Sonoff Dual
/******************************************************************
  Copyright (c) 2019 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Automatische Umstellung zwischen Sommer- und Normalzeit
/**************************************************************************************/

#include <ESP8266WiFi.h>
#include <time.h>

struct tm lt;         // http://www.cplusplus.com/reference/ctime/tm/
struct tm utc;

const char* const PROGMEM NTP_SERVER[] = {"fritz.box", "de.pool.ntp.org", "at.pool.ntp.org", "ch.pool.ntp.org", "ptbtime1.ptb.de", "europe.pool.ntp.org"};
const char* const PROGMEM DAY_NAMES[] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
const char* const PROGMEM DAY_SHORT[] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
const char* const PROGMEM MONTH_NAMES[] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
const char* const PROGMEM MONTH_SHORT[] = {"Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"};

const char* ssid = "Netzwerkname";             // << kann bis zu 32 Zeichen haben
const char* password = "PasswortvomNetzwerk";  // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

void setupTime() {                              // deinen NTP Server einstellen (von 0 - 5 aus obiger Liste) alternativ lassen sich durch Komma getrennt bis zu 3 Server angeben
  configTime("CET-1CEST,M3.5.0,M10.5.0/3", NTP_SERVER[1]);  // Zeitzone einstellen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  // für Core Versionen vor 2.6.3. folgende Konfiguration verwenden.
  //configTime(0, 0, NTP_SERVER[1]);
  //setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 1);
}

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.printf("\n\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n%s\n\n",
                (__FILE__), (__TIMESTAMP__), ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10, ESP.getFullVersion().c_str());

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nVerbunden mit: " + WiFi.SSID());
  setupTime();
  delay(250);
}

void loop() {
  static char buf[30];                                    // je nach Format von "strftime" eventuell anpassen
  static time_t lastsec {0};
  time_t now = time(&now);
  localtime_r(&now, &lt);
  gmtime_r(&now, &utc);
  if (lt.tm_sec != lastsec) {
    lastsec = lt.tm_sec;
    if (!(time(&now) % 86400)) {                          // einmal am Tag die Zeit vom NTP Server holen o. jede Stunde "% 3600" aller zwei "% 7200"
      setupTime();
    }
    strftime (buf, sizeof(buf), "%d.%m.%Y %T %A", &utc);  // http://www.cplusplus.com/reference/ctime/strftime/
    Serial.printf("Koordinierte  Weltzeit %s\n", buf);
    strftime (buf, sizeof(buf), "%d.%m.%Y %T", &lt);      // http://www.cplusplus.com/reference/ctime/strftime/
    Serial.printf("Mitteleuropäische Zeit %s %s\n", buf, DAY_NAMES[utc.tm_wday]);
    Serial.printf("UTC: %.2d:%.2d:%.2d\n", utc.tm_hour, utc.tm_min, utc.tm_sec);
    Serial.printf("%s: %.2d:%.2d:%.2d %s\n\n", *tzname, lt.tm_hour, lt.tm_min, lt.tm_sec, lt.tm_isdst ? "Sommerzeit" : "Normalzeit");
  }
}
4 Kommentare - Kommentar eintragen
Holger ❘ 31.07.2020
Ich bekomme in platformio folgenden fehler:

Der Bezeichner ""tzname"" ist nicht definiert.

Laut Platformio habe ich Arduino Core 2.7.2

Was könnte das sein? Oder bin ich vielleicht doch nicht auf der Version, 2.7.2?

Gruß, Holger

Antwort:
Entweder du nutzt für den Sketch die Arduino IDE oder kommentierst diese Zeile in Code aus.

Gruß Fips
Bernd ❘ 18.07.2020
Hallo Fips,
vielen Dank, jetzt funktionierts. Nachdem ich auf die EspCoreVersion 2.6.3 geändert habe, hat es funktioniert. Mit der Änderung der configtime Zeile funktioniert es nun auch mit der EspCoreVersion 2.7.2.
Noch mals vielen Dank und ein schönes Wochenende
Bernd

Antwort:
Die Unterschiede in den EspCoreVersionen werden oft unterschätzt.
Jede neue Version sorgt für Überraschungen.

Gruß Fips
Bernd ❘ 16.07.2020
Hallo,
Vielen Dank für die schnelle Antwort. Ich habe Core 2.7.2 und trotzdem ist das Verhalten so wie schon beschrieben.
Danke
Bernd

Antwort:
Bei mir funktioniert es mit der heute Mittag eingepflegten Änderung nun auch mit 2.7.1. und 2.7.2.
"configTime("CET-1CEST,M3.5.0,M10.5.0/3", NTP_SERVER[1]);"

Gruß Fips

Bernd ✪ ✪ ✪ 16.07.2020
Hallo,
zuerst möchte ich mich für das wirklich sehr gute Beispiel bedanken. Ich habe aber festgestellt, dass nach Ablauf der eingestellten Zeit zur Synchronisation mit dem NTP Server die GMT Zeit und die Widergabe der Sommer zeit nicht mehr stimmt. Genau nach dem Zeitpunkt der Synchronisation haben UTC und GMT die gleiche Zeitanzeige und die an Stelle von Sommerzeit wird Normalzeit angezeigt. Das ist unabhängig vom verwendeten NTP-Server.
Ich habe den Original-Sketch nur mit meinen Router-Zugangsdaten ersetzt und die Häufigkeit der Synchronisation auf 3600 gesetzt. Der Sketch läuft auf einem WeMos D1 mini.
Woran kann das liegen und was muss ich ändern, damit das Problem beseitigt wird?
Danke und viel Grüße
Bernd

Antwort:
Tatsache, ab CoreVersion 2.7.1 muss es etwas geändert werden.
Sollte nun mit der aktuellen EspCoreVersion 2.7.2 funktionieren.

Gruß Fips
Kommentar eintragen

*