MQTT und ESP32 instabil bei Wlan-Netzunregelmäßigkeiten

  • Hallo zusammen,

    steuere meine Rolläden über MQTT zwischen Broker auf Raspi und ESP32 als Schalt-Clients.


    Diese Clients bleiben alle paar Tage in der else-schleife der Funktion mqttConnect hängen wenn die Wlan-Verbindung für kurze Zeit instabil ist oder der 2,4Hz-Kanal sich ändert ("Fehler bei mqtt connect Rc = -2)


    Habe die unmöglichsten Sachen bereits raus gefunden. Wenn der ESP beim Router eingeloggt war, findet er nach der "WLAN-Pause" wieder aus der Schleife raus, wenn er aber im Repeater eingeloggt war, dann bleibt er in der Schleife und ich kann nur noch den ESP stromlos machen um ihn wieder ins Spiel zu bekommen.

    Wenn an der Fritzbox die WLAN-Kanal-Automatik eingeschaltet ist, dann ist nach einem Kanalwechsel bei dem ein oder anderen ESP auch Schluss und er kommt aus dem Fehler rc=-2 nicht mehr raus.

    Den Kanal kann ich natürlich fest einstellen, jedoch kurze WLAN-Unterbrechungen können immer mal sein. Soll ich nun in der Schleife ein ESP.reset programmieren, z.b. nach 5 Versuchen, oder gibt es noch andere Möglichkeiten des Abfangens?

    Was ich mich frage: Liegt die Schwäche beim MQTT-Broker oder bei der WLAN-Verbindung? Die festgefahrenen ESP's lassen sich dann nicht mehr anpingen aber im Monitor sehe ich noch immer wiederkehrend die Fehlermeldungen "Fehler bei mqtt connect = -2".


    Code
    void setup_wifi() {
      delay(1500);
      WiFi.begin(SSID, PSK);
      while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(2000);
      }
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
     }

    Eine Fehlermeldung aus der WLAN-Aufbau-Funktion sehe ich im Monitor der Arduino-IDE nicht. Was ist jetzt tot? Die MQTT-Verbindung (last will Meldung kommt) oder / und die WLAN-Verbindung?


    Ich hoffe ihr kommt mit meinem wilden Geschribsel zurecht. Gerne beantworte ich noch Nachfragen.


    Danke!!!!!!

  • Moin bug-reporter,


    irgendwie macht es keinen Sinn 5 Sekunden zu warten, um dann zu prüfen ob die Verbindung wieder da ist. Es wird aber nichts getan um das zu ändern. Hier würde ich ansetzen.

    Ich kenne mich mit ESP32 nicht wirklich aus, aber ich gebe mal einen Lösungsansatz mit einem ESP8266.


    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Vielleicht trifft man sich in der RPi-Plauderecke.

  • Der Ardunino MQTT Client ist schon sensibel. Gestern um 19:00 Uhr schickte mein ESPNow Gateway (ESP32) nach Monaten erfolgreichem Betrieb nur noch truncated Payload meiner Sensoren an den Broker :wallbash: . Eben habe ich die Ursache endlich lokalisiiert und gefixed ... scheint ein Library Problem zu sein. Muss ich noch genauer untersuchen bevor ich einen Issue aufmache.


    Sieh Dir mal den folgende Beispielcode an: Der macht es etwas anders als Du mit dem Wifi Aufbau und den MQTT Retries ;)

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

    Edited 2 times, last by framp: Typo ().

  • Freue mich über einen erfahrenen "MQTT-Mitstreiter". Danke für den Link den ich jetzt erst gelesen habe.

    In der Zwischenzeit hatte ich folgende Lösung "ertestet" die scheinbar funktioniert :

    Wenn WLAN wieder da ist läuft die Sache weiter. Nichtsdestotrotz bin ich gespannt über den Link.

    Ich glaube bei MQTT gibt es nicht so viel Mitstreiter, oder?

    Hat die ESP-IDF bessere MQTT-Bibliotheken? Die Arduino - Libs sollen ja mit Mesh Probleme haben. Habe jetzt den 2,4Ghz Kanal fest eingestellt was die Sache schon etwas störfreier gemacht hat, meine ich!

  • Freue mich über einen erfahrenen "MQTT-Mitstreiter".

    Erfahren wuerde ich mich nicht nennen, aber ich nutze MQTT mit meinen ESPs und habe entsprechenden Code geschrieben.

    In der Zwischenzeit hatte ich folgende Lösung "ertestet" die scheinbar funktioniert :

    Sowas ist muehsam :-/ . Deshalb halte ich mich gerne an Beispiele der jeweiligen Libraries. Wie sieht denn Der Code dazu in der loop() aus?



    Jedenfalls frage ich mich warum Du erst testest ob mqtt funktioniert und dann ob wiwfi da ist. Da MQTT auf Wifi basiert sollte die Reihenfolge umgekehrt sein. Der Code funktioniert aber da der erste Test ob MQTT funktioniert failed und dann Wifi aufgebaut wird. Ich wuerde es einfach umstellen da sich der Code dann einfachter und schluessiger liest ;)

    Ich glaube bei MQTT gibt es nicht so viel Mitstreiter, oder?

    Wenn Du hier im Forum nach MQTT suchst findest Du diverse Threads dazu :shy:

    Hat die ESP-IDF bessere MQTT-Bibliotheken? Die Arduino - Libs sollen ja mit Mesh Probleme haben.

    Die ESP-IDF Libs habe ich mir nicht angesehen und kann dazu nichts sagen. Wo hast Du gelesen dass die Arduino Libs mit Mesh Probleme haben sollen? Was ich selbst beim Codieren erfahren habe ist dass bei AVM & Mesh das Anmeldeverfahren beim Router und Repeater verschieden lang dauert. Liegt wohl daran dass erst einmal der naechstgelegene AP gesucht wird und das etwas und Zeit Traffic zwischen AP und Router braucht.


    Habe jetzt den 2,4Ghz Kanal fest eingestellt was die Sache schon etwas störfreier gemacht hat, meine ich!

    Bei mir im Haus werden die Kanaele 1,6 und 9 von Repeatern genutzt und die ESP32 und ESP8266 Sensoren, die sowieso nur 2.4GHz koennen, haben keine Probleme zu connecten. Kann sein dass die o.g. Suchzeit nach einem AP kuerzer wird wenn nur ein Kanal benutzt wird.

    Dieser delay(10) und der Kommentar dazu aus dem Beispiel ist allerdings schon nicht unbedingt ein Qualitaetszeichen :shy:

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

    Edited once, last by framp: Typos ().

  • scheint ein Library Problem zu sein. Muss ich noch genauer untersuchen bevor ich einen Issue aufmache.

    Ist es nicht. Ist ein ein Coding Fehler zusammen mit einem C++ Design Problem :wallbash:


    C++
    bool publish(const char topic[], const char payload[], bool retained, int qos) {
        return this->publish(topic, (char *)payload, (int)strlen(payload), retained, qos);
      }
      bool publish(const char topic[], const char payload[], int length) {
        return this->publish(topic, payload, length, false, 0);
      }

    Ich habe publish(topic, payload, true) bzw publish(topic, payload, false) benutzt weil ich retained setzen wollte. Dabei greift aber leider die zweite Methode und setzt die Laenge der Payload auf 1 (true) bzw 0 (false) und nicht wie beabsichtigt die erste Methode. Das war auch genau mein Ergebnis was ich sah: Der Payload war entweder 1 Zeichen lang oder keines. Ich haette noch ein qos im Interface mitgeben muessen und die richtige Methode waere gewaehlt worden :@ Das ist so eines der vielen kleinen unangenehmen Dinge bei C++ die in anderen Sprachen besser geloest sind und der Compiler den Programmierfehler sofort entdeckt haette:(

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

  • Quote

    Ich habe publish(topic, payload, true) bzw publish(topic, payload, false) benutzt weil ich retained setzen wollte. Dabei greift aber leider die zweite Methode und setzt die Laenge der Payload auf 1 (true) bzw 0 (false) und nicht wie beabsichtigt die erste Methode. Das war auch genau mein Ergebnis was ich sah: Der Payload war entwe...

    Hat das was mit Funktionen überladen zu tun, nicht wahr?


    Quote


    Wo hast Du gelesen dass die Arduino Libs mit Mesh Probleme haben sollen

    Habe ich falsch verstanden. Da ging es um ESP32-Mesh was auf Arduino noch nicht geht aber auf ESP-IDF.


    Quote


    Bei mir im Haus werden die Kanaele 1,6 und 9 von Repeatern genutzt und die ESP32 und ESP8266 Sensoren, die sowieso nur 2.4GHz koennen, haben keine Probleme zu connecten.

    Ich kann mit meiner 7530-Fritz!Box nicht steuern welches Gerät welchen Kanal nutzt sondern nur fürs 2,4GHz Band welchen Kanal, kann das sein?


    Quote


    Jedenfalls frage ich mich warum Du erst testest ob mqtt funktioniert und dann ob wiwfi da ist

    ja danke, Deine Anmerkung macht Sinn

  • Hat das was mit Funktionen überladen zu tun, nicht wahr?

    Ja und der Tatsache dass in C++ ein bool auch als int vom Compiler erkannt wird. Moderne Programmiersprachen erlauben das nicht und verhindern somit solche bloeden Fehler.

    Ich kann mit meiner 7530-Fritz!Box nicht steuern welches Gerät welchen Kanal nutzt sondern nur fürs 2,4GHz Band welchen Kanal, kann das sein?

    Ich habe eine 7590. Aber so ganz verstehe ich Deinen Kommentar nicht. Was willst Du steuern? Ein ESP will zu einer SSID connecten und tut das unabhaengig von dem Kanal der von dem AP benutzt wird. Da kann man nichts steuern.


    Ich nutze ESPNow und da muss ich sicherstellen dass genau ein Kanal von den Sensoren wie auch dem Gateway genutzt wird. Das mache ich ueber einen dedizierten IOT-AP der immer einen festen Kanal nutzt. Das ist aber ein Spezialfall.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

  • Quote

    Ich habe eine 7590. Aber so ganz verstehe ich Deinen Kommentar nicht. Was willst Du steuern? Ein ESP will zu einer SSID connecten und tut das unabhaengig von dem Kanal der von dem AP benutzt wird. Da kann man nichts steuern.


    Wenn mein Router die Kanäle je nach Auslastung wechselt, dann haben sich in letzter Zeit dann gleich ESP's aufgehängt in dem sie aus mqttConnect() nicht mehr heraus gefunden haben. Da ich jetzt mein Programm geändert habe, könnte dieser Fehler aber evtl. behoben sein. Das muss ich noch testen indem ich die Kanalauswahl wieder auf Automatik stelle.

  • Da ich jetzt mein Programm geändert habe, könnte dieser Fehler aber evtl. behoben sein.

    Ja, das wäre das Beste, denn auf das WLAN der FritzBox kann man sich nicht verlassen und schon gar nicht, wenn 2.4GHz und 5.0GHz gleichzeitig benutzt werden. Auch bei fest/manuell eingestelltem 2.4GHz-Kanal kann es passieren, dass die FritzBox mal den 2.4GHz-Kanal wechselt. Wenn möglich, dann das 5.0GHz-WLAN deaktivieren.

    Siehe z. B.: https://avm.de/service/fritzbo…l-festgelegten-Funkkanal/

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

  • Interessant dass die FB u.U. auch den Kanal wechselt wenn man einen festen Kanal eingestellt hat. D.h. bei ESPNow wo der Kanal definitiv stabil sein muss ist mein Ansatz einen dedizierten AP dazu zu nutzen unbewusst richtig gewesen :)

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

  • Hallo,

    also mein Programm läuft jetzt störungsfrei. Anhand der last will Meldungen sehe ich staundend, daß pro Tag mindestens 20 WLAN disconnect statt finden, bei 5 ESP-Clients.


    Bin jetzt happy und will jetzt die Clients noch in sleep-Modus betreiben, weil so oft schaltet ja man keine Rolläden. Hoffe das geht dann mit MQTT aber da muss ich mich noch informieren und einen Testaufbau machen.

  • also mein Programm läuft jetzt störungsfrei

    Perfekt :thumbup: Willst Du die Logik nicht codemaessig als Sample bereitstellen? ich kann es auch in mein git Repo fuer Dich stellen wenn Du willst (Und natuerlich Dich als Autor nennen ;) )

    nhand der last will Meldungen sehe ich staundend, daß pro Tag mindestens 20 WLAN disconnect statt finden, bei 5 ESP-Clients.

    Das sind 4 pro Tag pro Client. Ich werde bei meinen Clients mal die Reconnects nach einenm Start zaehlen und per MQTT publishen. Mal sehen was ich da fuer Zahlen rausbekomme.


    Wie machst Du das per LW?

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy:

  • Quote

    Wie machst Du das per LW?

    Ja, genau.


    Quote


    Perfekt :thumbup: Willst Du die Logik nicht codemaessig als Sample bereitstellen? ich kann es auch in mein git Repo fuer Dich stellen wenn Du willst (Und natuerlich Dich als Autor nennen ;) )

    Oh gute Idee, habe github user, wäre dann das erste mal das ich was rein stelle. Gute Anfängerübung :)

  • Oh gute Idee, habe github user, wäre dann das erste mal das ich was rein stelle. Gute Anfängerübung :)

    Perfekt. Dann erstelle bitte entweder ein eigenes Repo und commite den Code darein oder erstelle ein PR zu meinem Repo und ich merge den PR bei mir hinein. Up to you :)

    Ja, genau.

    :shy: Meine Frage wie Du das genau machst (Logic) :)

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert :fies: Bei mir tut das raspiBackup automatisch :shy: