Zeitangabe funktioniert nicht wenn:

Hallo,
die Zeitangabe in meinem Programm funktioniert nicht (Uhrzeit: Thursday:02:00:05)
wenn ich die WLAN-Verbindung mit fester IP-Adresse verwende (WiFi.config(staticIP, gateway, subnet);).

[code]
// Test Zeitangabe und WiFi-config

#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>     // https://arduino-esp8266.readthedocs.io/en/latest/ota_updates/readme.html
#include <FS.h>
#include <TimeLib.h>
#include <ESP8266WiFi.h>

struct tm tm;

uint32_t aktuelleMillis;
const long INTERVALL = 1000; 
char befehl[13];  // buffer for incoming packets
const char* const PROGMEM ntpServer[] = {"fritz.box", "de.pool.ntp.org", "at.pool.ntp.org", "ch.pool.ntp.org", "ptbtime1.ptb.de", "europe.pool.ntp.org", "za.pool.ntp.org"};
const char* const PROGMEM monthNames[] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
const char* const PROGMEM monthShortNames[] = {"Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"};
//const char* const PROGMEM wochentag[] = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"}; 
const char* const PROGMEM weekDays[7]={"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
//Month names
String months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

const char* ssid = "ssid";             // << kann bis zu 32 Zeichen haben
const char* password = "password"; 

#define SSR_1 0  // IO0 ESP07
#define SSR_2 12 // IO12 ESP07

void SetupTime(void);
char* localTime(void);

#ifdef CONFIG
IPAddress staticIP(192, 168, 1, 22);      // statische IP des NodeMCU ESP8266
IPAddress gateway(192, 168, 1, 1);        // IP-Adresse des Router
IPAddress subnet(255, 255, 255, 0);       // Subnetzmaske des Netzwerkes
IPAddress dns(192, 168, 1, 1);            // DNS Server
#endif

void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println("");
  Serial.println("*******************************");
  Serial.println("Test Zeitangabe und WiFi-config");
  Serial.println("*******************************");
  pinMode(SSR_1, OUTPUT);
  digitalWrite(SSR_1,HIGH);
  pinMode(SSR_2, OUTPUT);
  digitalWrite(SSR_2,HIGH);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  #ifdef CONFIG
    WiFi.config(staticIP, gateway, subnet);
  #endif
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("\nVerbunden mit: " + WiFi.SSID());
  Serial.println("ESP07 IP: " + WiFi.localIP().toString());
  
  setupTime();
}
void loop() {
  static auto letzteMillis = 0;
  aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 1e3) {
    letzteMillis = aktuelleMillis;
    localTime();
  }
  
}

void setupTime() {                                     // CHANGE THE POOL WITH YOUR CITY. SEARCH AT https://www.ntppool.org/zone/@ --> global
  configTime(0, 0, ntpServer[6]);                      // deinen NTP Server einstellen (von 0 - 6 aus obiger Liste)
  //setenv("TZ", "CET-1CEST,M3.5.0/02,M10.5.0/03", 1);   // Zeitzone einstellen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  //setenv("TZ", "GMT-2BST",1);                          // Zeitzone South Africa, Nelspruit 
  //setenv("TZ", "SAST-2",1);
  setenv("TZ", "CAT-2",1);                              // Zeitzone Africa/Maputo 

  delay(250);
} 

char* localTime() {
  static char buf[19];                                  // je nach Format von "strftime" eventuell anpassen
  static time_t lastsek = 0;
  time_t now = time(&now);
  localtime_r(&now, &tm);
  if (tm.tm_sec != lastsek) {
    lastsek = tm.tm_sec;
    strftime (buf, sizeof(buf), "%A:%T", &tm);          // Anzeige: Wochentag:Uhrzeit
                                                        // http://www.cplusplus.com/reference/ctime/strftime/
                                                       // https://books.google.co.za/books?id=YR5CqZcFJU8C&pg=PA980&lpg=PA980&dq=strftime%2Buhrzeit%2Bwochentag&source=bl&ots=QJEkdbCjaM&sig=ACfU3U1E1nye3OAAMcBEOajn5-D4hfPIrA&hl=de&sa=X&ved=2ahUKEwjN1rTb3rrnAhU98uAKHTNLCCEQ6AEwCHoECAcQAQ#v=onepage&q=strftime%2Buhrzeit%2Bwochentag&f=false
    if (!(time(&now) % 43200)) {                       // zweimal am Tag die Zeit vom NTP Server holen o. jede Stunde "% 3600" aller zwei "% 7200"
      setupTime();
    }
  }
  Serial.print("Uhrzeit: "); Serial.println(buf);
  return buf;
}     

[/code]

MfG

Juergen B.

So richtig steig ich durch deinen Sketch nicht durch.

Mit localTime holst du dir die Zeit, einmal als char* und einmal als Rückgabe char aus dem "buf". Das ist etwas merkwürdig.

Du hast dir ver utlich die Beispiele von fips geholt, diese aber nicht konsequent umgesetzt.

a) bekommst du deine fixe IP bei der Ausgabe im setup zurückgeliefert oder doch eine über DNS?
was sagt serial?

b) wenn du eh alle 4 definierst, dann verwende alle 4!

//ESP argument order is: ip, gateway, subnet, dns1
//Arduino arg order is: ip, dns, gateway, subnet.

WiFi.config(staticIp, gateway, subnet, dns);

c) warum sind deine Sachen in precompiler #ifdef? - wo definierst du CONFIG? ... würde ich beide male weglassen

d) Ändere dein WIFI Passwort zu Hause - 2 Mio Arduino Nutzer kennen deins nun

Hallo,
vielen Dank für Eure schnelle Antworten.
Zu HotSystems:
Ja das Beispiel ist von fips.
Wenn ich ein Beispiel verwende und es anscheinend funktioniert forsche ich ersteimal nicht weiter.

Zu noiasca:
a) fixe IP OK
b) Wenn ich alle 4 (auch "dns") verwende funktioniert es mit der festen IP
c) #define CONFIG im gezeigten Beispiel vergessen (im Original OK)
Ich denke precompiler zu benutzen ist OK
d) das passiert wenn man zu früh sendet
Kann man dann von überall auf der Welt auf mein WLAN zugreifen ?
Werde ich natürlich ändern.

MfG

Juergen B.

PS: nicht zu früh gesendet

zumindest in deiner Ortschaft...

Sorry, ich hatte mich da verguckt. Bei mir wird es als String (auch Beispiel von fips) zurück geliefert. Das bei dir ist auch soweit Ok und nicht das Problem.

Juergen
*******
*******
South Africa

Falls du mal in der Nähe bist, freut sich der Jürgen bestimmt über einen Besuch zum Fachsimpeln.

#include <TimeLib.h>
Ersetzen durch
#include <time.h>

#define CONFIG
Fehlt im Code

WiFi.config(staticIP, gateway, subnet);
Ersetzt durch
WiFi.config(staticIP, gateway, subnet, dns);
bringt dann auch die richtige Uhrzeit.

Funktioniert zwar, aber die Reihenfolge für den Esp8266 ist .....

        //The argument order for ESP is not the same as for Arduino. However, there is compatibility code under the hood
        //to detect Arduino arg order, and handle it correctly. Be aware that the Arduino default value handling doesn't
        //work here (see Arduino docs for gway/subnet defaults). In other words: at least 3 args must always be given.
        bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);

Gruß Fips

ja, man darf niemanden trauen. Habs nur schnell gegoogelt statt in den source zu schauen und kam offenbar auf eine schei.. Quelle (und ja da gings sicher um den ESP).

Aufgefallen ist mir das schon früher dass es anders ist - und trotzdem der Arduino Style auch funktioniert.
Die haben tatsächlich im LwipIntf.cpp eine Umkehrlogik:
https://github.com/esp8266/Arduino/blob/master/cores/esp8266/LwipIntf.cpp#L27