NTP Zeit von Fritzbox mit ESP32

Hallo, ich will mir die NTP Zeit mit einem ESP32 von meiner Fritzbox holen. Wenn ich das Demoprogramm von der IDE genau so lasse funktioniert das auch aber sobald ich die Zeile:
WiFi.config(local_IP, gateway, subnet,primaryDNS,secondaryDNS);
aktiviere funktioniert es nicht mehr.
Wenn ich die Zeit von einem fremden Server hole dann funktioniert es.
Ich kann auch mit den selben Daten auf den Hello Server zugreifen.
Woran kann das liegen?

#include <WiFi.h>
#include "time.h"
#include "sntp.h"

//const char* ssid       = "YOUR_SSID";
//const char* password   = "YOUR_PASS";




IPAddress local_IP(192, 168, 0, 156);
IPAddress gateway(192, 168, 0, 100);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);
IPAddress secondaryDNS(8, 8, 4, 4);


//const char* ntpServer1 = "pool.ntp.org";
//const char* ntpServer2 = "time.nist.gov";

const char* ntpServer1 = "fritz.box";
const char* ntpServer2 = "fritz.box";


const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
const char* time_zone = "CET-1CEST,M3.5.0,M10.5.0/3";  // TimeZone rule for Europe/Rome including daylight adjustment rules (optional)

void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("No time available (yet)");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

// Callback function (get's called when time adjusts via NTP)
void timeavailable(struct timeval* t) {
  Serial.println("Got time adjustment from NTP!");
  printLocalTime();
}

void setup() {


  //Wenn diese Zeile deaktiviert ist funktioniert es, ansonsten nur über die externe Adresse
  WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS);



  Serial.begin(115200);
  // set notification call-back function
  sntp_set_time_sync_notification_cb(timeavailable);

  /**
   * NTP server address could be aquired via DHCP,
   *
   * NOTE: This call should be made BEFORE esp32 aquires IP address via DHCP,
   * otherwise SNTP option 42 would be rejected by default.
   * NOTE: configTime() function call if made AFTER DHCP-client run
   * will OVERRIDE aquired NTP server address
   */
  sntp_servermode_dhcp(1);  // (optional)

  /**
   * This will set configured ntp servers and constant TimeZone/daylightOffset
   * should be OK if your time zone does not need to adjust daylightOffset twice a year,
   * in such a case time adjustment won't be handled automagicaly.
   */
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);

  /**
   * A more convenient approach to handle TimeZones with daylightOffset 
   * would be to specify a environmnet variable with TimeZone definition including daylight adjustmnet rules.
   * A list of rules for your zone could be obtained from https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
   */
  //configTzTime(time_zone, ntpServer1, ntpServer2);

  //connect to WiFi


  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");
}

void loop() {
  delay(5000);
  printLocalTime();  // it will take some time to sync time :)
}

Wenn Du Deine IP über DHCP bziehst, bekommst Du die Fritzbox als DNS und die kennt fritz.box. Deine eingetragenen DNS-Server kennen diesen lokalen Namen nicht.

Gruß Tommy

1 Like

Tommy Dankeschön,
jetzt habe ich statt

const char* ntpServer1 = "fritz.box";
direkt die IP der Fritbox angegeben
const char* ntpServer1 = "192.168.0.100";
und das funktioniert.

Viele Grüsse Sepp

Welchen höheren Sinn hat es für den ESP die Google-Nameserver zu nutzen?

Gruß Tommy

Keinen, ich hab das einfach ohne mir Gedanken zu machen aus irgendeinem Demoprogramm übernommen und ging ja auch bis ich die bestimmte feste IP wollte....

Du kannst der Fritzbox auch sagen, dass sie einer bestimmten MAC immer die gleiche IP zuordnen soll. Über DHCP funktioniert auch, dass die Fritzbox den Hostname des ESP in ihr lokales DNS aufnimmt, so dass Du ihn z.B. als http://wohnzimmer ansprechen kannst.

Gruß Tommy

Danke und das weis ich ja eigentlich, hab das nur nicht mit dem NTP Server in Verbindung gebracht....

Das heißt, Du brauchst die Vergabe der festen IP überhaupt nicht.

Gruß Tommy

Wenn du unbedingt eine feste IP haben willst mache folgendes.

Gehe in die Fritzbox.

Klicke auf HEIMNETZ - > Netzwerk

Suche dein Gerät.
Klicke auf den Bleistift bei den Gerät.
Aktiviere im folgenden Fenster den Haken bei " Diesem Netzwerkgerät immer die gleiche IPv4-Adresse zuweisen."

Speichere das ganze.

Das verhindert, dass das Gerät von der Fritzbox eine neue IP bekommt.

Dieses Vorgehen macht sogar hin + wieder Sinn. Ich empfehle dann aber ein "Netzwerkplan" zu machen, damit man nicht das Risiko eingeht, 2 Geräte dieselbe IP zuzuweisen.

Ach und stelle in der Fritzbox einen IP-Bereich ein, der NICHT von der Fritzbox automatisch zugewiesen wird.

Gruß

Pucki

Das wurde mir jetzt klar, nochmal Danke.
Viele Grüsse Sepp

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.