Forum: Mikrocontroller und Digitale Elektronik Esp8266: NTPClient gibt immer Unix Epoch zurück


von Lara G. (Gast)


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!

von Nachtschwärmer (Gast)


Lesenswert?

Hallo,

kannst du Code zeigen, der nicht funktioniert?

von Harry L. (mysth)


Lesenswert?

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

von Lara G. (Gast)


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

von Lara G. (Gast)


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
}

von Lara G. (Gast)


Lesenswert?

Bitte die Nebeneffekte in NTP_getDateTime() zu entschuldigen :).

Beitrag #7230673 wurde von einem Moderator gelöscht.
von Lara G. (Gast)


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.
von just the tip (Gast)


Lesenswert?

Vergiss die pseudo NTP Bibliotheken, NTP ist im SDK schon drin, mit TZ.
Irgendwo gibt's ein Beispiel.

von Lara G. (Gast)


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.

von Michael U. (amiga)


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

: Bearbeitet durch User
von Lara G. (Gast)


Lesenswert?

Großartig! Frage mich, wieso meine Suche mich immer wieder auf diese 
blöde Lib geführt hat, wenn das Gute so nah liegt.

Vielen Dank für den Hinweis!

von Guido L. (guidol1970)



Lesenswert?

Ich hatte auch mal- vor ueber einem Jahr - mit einem ESP8266
und einem fertigem LCD eine NTP-Clock gebaut:

https://lehwalder.wordpress.com/2021/06/02/solderless-esp8266-ntp-lcd-clock/

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.