Esp8266: NTPClient gibt immer Unix Epoch zurück

Gast #7230645
Lesenswert?

Hallo,

ich benutzte die NTPClient library von Fabrice Weinberg wie in den 
Beispielen beschrieben. Es gibt keine Fehlermeldungen aber die 
Funktionen geben mir immer den 01.01.1970 / 00:00 Uhr (Unix epoch) 
zurück plus/minus den Timezone Offset, den ich einstelle. Ich vermute 
mal, dass das der default ist, wenn er nix vom Zeitserver kriegt?

Ich habe es mit verschiedenen pool-URLs versucht, wobei das standard 
"pool.ntp.org" ja funktionieren sollte, auch direkt mit aufgelöster 
IP-Adresse, immer das selbe Ergebnis. Dabei zählen die Sekunden durchaus 
hoch, wobei ich aber annehme, dass das innerhalb der Lib lokal passiert.

Ich habe mal mit der pinger library getestet, dass ausgehender Verkehr 
übers Gateway und DNS-Lookup grundsätzlich funktionieren.

Kennt wer dieses Verhalten oder hat vielleicht noch Hinweise, wo ich 
schauen könnte? Besten Dank!
Gast #7230661
Lesenswert?

Harry L. schrieb:
> Lara G. schrieb:
>> Kennt wer dieses Verhalten oder hat vielleicht noch Hinweise
>
> Dein NTP-Client hat ganz offensichtlich keine Verbindung zum NTP-Server.
>
> Überprüfen:
> * default-Route (normalerweise die IP deines Routers)
> * DNS-Server

Hab ich, scheint kein Problem zu sein, hab sogar mal einen anderen DNS 
Server am Router eingestellt.

Und gerade eben hab ich mal den Code aus Post #4 ausprobiert und der 
funktioniert einwandfrei, auch mit dem Pool den ich benutze: 
https://forum.arduino.cc/t/esp32-cannot-connect-to-ntp-server-with-fixed-ip/591181/4
Gast #7230667
Lesenswert?

Nachtschwärmer schrieb:
> Hallo,
>
> kannst du Code zeigen, der nicht funktioniert?
1
#include <NTPClient.h>
2
#include <WiFiUdp.h>
3

4
WiFiUDP ntpUDP;
5
NTPClient timeClient(ntpUDP, "pool.ntp.org");
6

7

8
String weekDays[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
9

10
String months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
11

12
void NTP_setup()
13
{
14
    timeClient.begin();
15
    timeClient.setTimeOffset(3600);
16
}
17

18
String NTP_getDateTime()
19
{
20
    timeClient.update();
21

22
    time_t epochTime = timeClient.getEpochTime();
23
    Serial.print("Epoch Time: ");
24
    Serial.println(epochTime);
25

26
    String formattedTime = timeClient.getFormattedTime();
27
    Serial.print("Formatted Time: ");
28
    Serial.println(formattedTime);
29

30
    int currentHour = timeClient.getHours();
31
    Serial.print("Hour: ");
32
    Serial.println(currentHour);
33

34
    int currentMinute = timeClient.getMinutes();
35
    Serial.print("Minutes: ");
36
    Serial.println(currentMinute);
37

38
    int currentSecond = timeClient.getSeconds();
39
    Serial.print("Seconds: ");
40
    Serial.println(currentSecond);
41

42
    String weekDay = weekDays[timeClient.getDay()];
43
    Serial.print("Week Day: ");
44
    Serial.println(weekDay);
45

46
    struct tm *ptm = gmtime((time_t *)&epochTime);
47

48
    int monthDay = ptm->tm_mday;
49
    Serial.print("Month day: ");
50
    Serial.println(monthDay);
51

52
    int currentMonth = ptm->tm_mon + 1;
53
    Serial.print("Month: ");
54
    Serial.println(currentMonth);
55

56
    String currentMonthName = months[currentMonth - 1];
57
    Serial.print("Month name: ");
58
    Serial.println(currentMonthName);
59

60
    int currentYear = ptm->tm_year + 1900;
61
    Serial.print("Year: ");
62
    Serial.println(currentYear);
63

64
    String currentDate = String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay);
65
    Serial.print("Current date: ");
66
    Serial.println(currentDate);
67

68
    Serial.println("");
69

70
    return timeClient.getFormattedTime();
71
}
Beitrag #7230673 wurde von einem Moderator gelöscht.
Gast #7230708
Lesenswert?

Zenci schrieb im Beitrag #7230673:

> Mach das:
>
1
> String NTP_getDateTime()
2
> {
3
>     timeClient.update();
4
>
> NICHT.
>
> Sonst synct der jedesmal. NOGO! mach das so:
>
1
> String NTP_getDateTime()
2
> {
3
>   String formattedTime = timeClient.getFormattedTime();
4
>

Es funktioniert! Vielen Dank!

Bin mir allerdings nicht sicher, dass ich meinen Fehler richtig 
verstanden habe. Also timeClient.update() wandert in die NTP_setup 
Funktion. NTP_setup wird zum Anwendungsstart aufgerufen, NTP_getDateTime 
wird aus einem callback handler eines Webservers heraus aufgerufen. 
Liegt da der wesentliche Unterschied?
Beitrag #7230711 wurde von einem Moderator gelöscht.
Gast #7230955
Lesenswert?

just the tip schrieb:
> Vergiss die pseudo NTP Bibliotheken, NTP ist im SDK schon drin, mit TZ.
> Irgendwo gibt's ein Beispiel.

Wo hast du das gesehen? Schön wäre es, wenn ich gleich vernünftige 
Zeitzonenunterstützung bekäme. Ohne Zugriff auf eine aktuell gehaltene 
tz DB stell ich mir das schwierig/wackelig vor.
#7230969
Lesenswert?

Hallo,

die Posix-Timelib ist schon sehr lange im SDK.
1
#include <time.h> 
2
...
3
#define MY_NTP_SERVER "at.pool.ntp.org"           
4
#define MY_TZ "CET-1CEST,M3.5.0/02,M10.5.0/03"   
5

6
setup()
7
{
8
  configTime(MY_TZ, MY_NTP_SERVER);...
9
}


Habe gerade zufällig noch eine recht gute Zusammenfassung gefunden:
https://werner.rothschopf.net/201802_arduino_esp8266_ntp.htm

Gruß aus Berlin
Michael

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren