Gibt es einen Zusammenhang zwischen WLAN Connect und NTP localTime()? Das NTP ohne WLAN nicht geht ist mir schon klar.
Laut meinem Verständnis sollte beides unabhängig von einander laufen. Selbst wenn die WLAN Verbindung weg ist sollte localTime() normal weiterlaufen. Ich kann das stehen bleiben des localTime() (des Rückgabewertes) noch nicht genau reproduzieren.
Jetzt frage ich einmal anders herum.
Gibt es bekannte Gründe warum localTime() nach ESP Reset und erfolgreicher NTP Verbindung im setup() danach stehen bleibt? Also die lokale Uhrzeit zur Laufzeit nicht weiter aktualisiert wird? Vielleicht kann so dem sporadischen Problem auf die Spur kommen.
ja die nehme ich, als die die fips zur Verfügung stellt bzw. sowieso zur Verfügung stehen für den ESP. Auch habe ich einen längeren Timeout für den NTP Connect für setup() eingebaut.
Nach Controller Reset wird die NTP Zeit abholt. Wird korrekt aktuell angezeigt. Bei der nächsten Ausgabe ist sporadisch schon Schluss, wird nicht mehr aktualisiert. An der Stelle drehe ich mich im Moment im Kreis.
bool getTime() { // Zeitzone einstellen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
configTzTime("CET-1CEST,M3.5.0/02,M10.5.0/03", "de.pool.ntp.org");
if (!getLocalTime(&tm)) return false;
return true;
}
void setupTime() {
DEBUG_P("connect to NTP Server ");
while (!getTime()) {
DEBUG_F(".");
delay(500);
if (millis() > 30000) {
DEBUG_P("Zeit konnte nicht geholt werden\n");
//ESP.restart();
}
}
getLocalTime(&tm);
DEBUG_P(&tm, "Programmstart: %A, %B %d %Y %H:%M:%S");
server.on("/time", []() {
server.send(200, "application/json", "\"" + (String)localTime() + "\"");
});
}
char* localTime() {
static char buf[40]; // je nach Format von "strftime" eventuell die Größe anpassen
static time_t lastsec {0};
getLocalTime(&tm, 50);
if (tm.tm_sec != lastsec) {
lastsec = tm.tm_sec;
strftime (buf, sizeof(buf), "%d.%m.%Y %T ", &tm); // http://www.cplusplus.com/reference/ctime/strftime/
time_t now;
if (!(time(&now) % 7200)) getTime(); // einmal am Tag die Zeit vom NTP Server holen o. jede Stunde "% 3600" aller zwei "% 7200"
}
return buf;
}
Edit:
Moment läuft es seit 4h Fehlerfrei und ich weiß nicht warum.
Das sind die dümmsten Fehler die man suchen muss/kann.
Ich werde wohl warten müssen bis es nicht mehr läuft ...
Hallo
Wenn ich mich Recht erinnere gibt es für den Esp32 ein Beispiel für NTP Zeit bei dem nach Erhalt der Zeit das WLAN abgeschaltet wird und die Zeit auf dem Monitor läuft normal weiter.
Ich nutze einfach millis und aktualisiere die Systemzeit des ESP so
WLAN wird benötigt. Der Webserver muss erreichbar bleiben. millis() verwende ich im Sketch natürlich auch, mein Codeanteil ist alles ohne delay() programmiert. Das Datum und Uhrzeit wird zusammen mit einem Messwert in eine Datei gespeichert.
was ich übrigens nebenbei mitbekommen habe ist, dass WiFi Reconnect per default automatisch eingestellt ist. setAutoReconnect() ist default true mit Prüfzyklus 1min. Man muss also nichts extra programmieren wie man das so liest und was ggf. veraltet im Internet steht. Genaueres steht in der WiFiSTA.cpp C:\Users\xyz\AppData\Local\Arduino15\packages\arduino\hardware\esp32\2.0.13\libraries\WiFi\src
WLAN vom Router ausgeschalten, Verbindung war weg, WLAN eingeschalten, Verbindung kam wieder. Funktioniert.
genau. Ich vermute bei mir auch das der ESP selbst irgendein Problem hat was sporadisch zum Vorschein kommt.
Wie es der Zufall will. Genau den Fall habe ich jetzt wieder zufällig. Neu geflasht, IP wird erkannt und mir im Seriellen Monitor angezeigt. Kann sich aber keine NTP Zeit holen. Router sagt mir der ESP ist nicht vorhanden. WLAN abgeschalten, gewartet, eingeschalten. Kein automatischer Reconnect. Das was vorhin funktionierte funktioniert jetzt nicht mehr. Dann drücke ich den Resettaster vom ESP Board und alles funktioniert.
In so einen ähnlichen Zustand scheint er auch zu verfallen wenn die Zeit noch irgendwie geholt werden kann und dann doch stehen bleibt. Die loop arbeitet scheinbar normal weiter laut Monitor. Der ESP selbst friert scheinbar nicht ein. Das ist doch nicht normal.
Sind die ESP nun zuverlässig oder nicht? Oder doch nur Spielerei? Ich bin mir aktuell über nichts mehr im Klaren. Leider.
Meine rein persönliche Meinung: Die ESP32 sind instabiler, als die ESP8266.
Ich habe den Eindruck, dass sie das Problem der 2 Kerne unterschätzt haben und ihnen das auf den Bauch fällt.
Deshalb bin ich beim ESP8266 geblieben. Da habe ich mal einen Hänger in 5 Monaten, wenn überhaupt.
Ich habe 4 ESP8266 im Dauerbetrieb (ohne Funktion zum Wiederverbinden, nur der Standard), die alle 15 Minuten Daten an meinen Webserver beim Provider über HTTPS (was beim ESP8266 komfortabler geht, als beim ESP32) an ein PHP-Script senden, das diese dann in die Datenbank einträgt.
Von dort hole ich mir bei Bedarf über chart.js die Grafiken über Temperatur, Luftfeuchte, Taupunkt aus den 4 Räumen 0,25; 0,5; 1; 2;5;7;10,20,30 Tage.
Alles was älter ist als 40 Tage wird aus der Datenbank gelöscht.
time(&now); // read the current time
localtime_r(&now, &tm); // update the structure tm with the current time
hatte ich auch im Code von Doc_Arduino vermisst. Da Dein Code für beide ESP gültig ist, sollte er sie auch ergänzen. (Ich kann immer nur vom ESP8266 aus urteilen)
das beruht nahezu unverändert auf Lokalzeit.ino2
Also "verändert" an winzigen Stellen um dem Problem auf die Spur zu kommen.
Nachdem Reset per Taster vorhin läuft er aktuell ohne Problem.
Hat vielleicht der Software-Reset nach Flashen ein Problem?
Diese Frage kann ich Dir selbstverständlich nicht beantworten, da ich vor ein paar Jahren mal ESP32 Dev Boards gekauft habe, vor gut einem Jahr zwei ESP32 D1 Mini NodeMCU. Meine Erfahrungen beziehen sich genau auf diese kleine Untermenge der mittlerweile für mich unübersichtlichen ESP-Familie.
Außerdem entwickelt sich die Core-Erweiterung einschließlich der IDE immer weiter, weshalb alte Programme plötzlich nicht mehr vom Compiler akzeptiert werden.
Im Dauerbetrieb habe ich eine LED-Uhr mit ESP32 D1 Mini, die sich gelegentlich mit meiner Fritz!Box als NTP-Server verbindet. Das funktioniert seit einem Jahr ohne merkliche Probleme.
Ebenso wird mein Stromverbrauch von einem ESP32 Dev Board menütlich gemessen, in einer csv-Datei gespeichert und auf Anforderung grafisch dargestellt. Einmal die Woche wird die csv-Datei per FTP auf ein Laufwerk an der Fritz!Box gespeichert und die Datei in LittleFS gelöscht. Abgesehen von dusseliger Programmierung läuft auch das reibungslos.
Dennoch gibt es während der Tests von Programmen merkwürdige Situationen. Gestern beispielsweise hat sich ein ESP32 mit der Fritz!Box verbunden, mir die IP angezeigt und der Upload per OTA funktionierte. Der Browser konnte aber nicht auf die HTML-Seiten zugreifen. Auch zeigte die Fritz!Box die IP als ungenutzt an. Das kann eigentlich nicht sein, ist aber schon mal vorgekommen. Da ich das Programm sowieso auf Access Point umstellen wollte, habe ich gestern nicht weiter geforscht. Manchmal bekomme ich auch "panische" Resets am laufenden Band, die durch Aufspielen des Blinkprogramms mit anschließendem Aufspielen des ursprünglichen Programms verschwinden.
Mir macht es Freude, die Möglichkeiten eines ESP32 zu ergründen und damit kleine Projekte zu realisieren. Etwas sicherheitsrelevantes wie eine Fahrstuhlsteuerung wäre aber nicht darunter!
zwischen läuft eigentlich und panische Resets liegen aber auch Welten, oder?
Allerdings hatte ich das Problem mit dem nicht html Seitenaufruf auch schon erlebt, obwohl er theoretisch sauber gestartet ist. Auch das die Browserseite doch arg langsam reagierte auf den Wechsel zur fips admin Übersicht, so als Bsp..
Auf die grafische Darstellung der Daten im Browser komme ich später zurück, wenn das Hauptanliegen fertig ist.
eine kleine Zwischenfrage an die html Programmierer.
Wie bekomme ich an die grüne Position die aktuelle Anzeige Ein/Aus?
Das hat doch mit der Variablen "text" zu tun?
Ja, aber warum holst Du die 2 Mal? setze die Funktion in den head-Bereich und nutze sie für beide Fälle.
Wenn Du es hinter den : haben willst, muss es innerhalb des h3-Tags stehen, da h-Tags mit einem Zeilenvorschub enden. Ich würde nach dem : ein span-Tag einfügen:
<span id="status"></span>
Dann kannst Du den Text als innerHtml einfügen. Du wirst auch noch getElementById brauchen: