Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. [gelöst, mit Umweg] MQTT Adapter - connect, disconnect, connect, dicsconnet

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst, mit Umweg] MQTT Adapter - connect, disconnect, connect, dicsconnet

    This topic has been deleted. Only users with topic management privileges can see it.
    • ?
      A Former User last edited by

      Ich schlage mich gerade mit sehr ähnlichen Problemen rum.

      Schau mal hier: http://forum.iobroker.net/viewtopic.php?f=20&t=9450

      Am Ende haben wir 2 Skripts für den iobroker Javascript-Adapter , die evtl. helfen könnten.

      Sie starten den Adapter einfach neu.

      Ich konnte mit dem Chunking Patch übrigens auch nicht arbeiten, da kamen bei mir auch Fehlermeldungen und MQTT lief gar nicht mehr.

      Arbeite ebenfalls mit ESP12 8266 und der pubsub-library.

      1 Reply Last reply Reply Quote 0
      • ?
        A Former User last edited by

        Ich habe mal deinen Arduino Code angeschaut.

        Du benutzt da leider eine andere Library.

        Wie gesagt nutze ich PubSubClient.h.

        Die erscheint mir wesentlich übersichtlicher im Code.

        Ob das wirklich besser ist und deinen Fehler behebt, weiß ich allerdings auch nicht.

        Es gibt in denen aber auch sowas wie einen automatischen Reconnect bei Verbindungsabbruch.

        Würde ich mir also mal anschauen.

        Hast du deine MQTT-Library für Arduino selbst geschrieben?

        1 Reply Last reply Reply Quote 0
        • M
          milo last edited by

          @meome:

          Ich schlage mich gerade mit sehr ähnlichen Problemen rum.

          Schau mal hier: http://forum.iobroker.net/viewtopic.php?f=20&t=9450

          Am Ende haben wir 2 Skripts für den iobroker Javascript-Adapter , die evtl. helfen könnten.

          Sie starten den Adapter einfach neu.

          Ich konnte mit dem Chunking Patch übrigens auch nicht arbeiten, da kamen bei mir auch Fehlermeldungen und MQTT lief gar nicht mehr.

          Arbeite ebenfalls mit ESP12 8266 und der pubsub-library. `

          Das reconnecten löst leider mein Problem nicht, weil ich noch nicht einmal verbinden kann. Bei mir läuft alles, bis man den Raspi neustartet. Dann geht gar nichts mehr..

          > Hast du deine MQTT-Library für Arduino selbst geschrieben?

          Ich habe mir zwar eine eigene Library geschrieben, damit ich bei den verschiedenste Chips die Verbindungskomponenten nur einmal ändern muss, nutze aber dahinter den PubSubClient. Hab meine Version mal angebunden. Finde da keine Funktion reconnect?

          Kannst du mir mal den Code von dir Posten?
          4334_pubsubclient.h
          4334_pubsubclient.cpp

          1 Reply Last reply Reply Quote 0
          • ?
            A Former User last edited by

            Hier ist der reconnect code im void loop():

              // ============== RE-CONNECT WIFI IF NOT CONNECTED (alle 10 Sekunden für NOT-Betrieb ohne WLAN)
              if (WiFi.status() != WL_CONNECTED) {  // Ob das funktioniert? Oder in Schleifen resultiert? Oder eingebaut in normales wificonnect?
                EVERY_N_MILLISECONDS(30000) {
                  Serial.println("NO WIFI. TRY RECONNECT EVERY 30 SECONDS");
                  setup_wifi();
            
                }
              }
              client.loop();    //??? Keine Ahnung
            
              // ============== MQTT Reconnect (alle 10 Sekunden versuchen, für reibungslosen Betrieb, nur wenn WLAN CONNECTED.)
              if ((!client.connected()) && (WiFi.status() == WL_CONNECTED)) { 
                EVERY_N_MILLISECONDS(30000) {
                  Serial.println("NO MQTT. TRY RECONNECT EVERY 30 SECONDS");
                  reconnect(); 
                }
              }
            
            
            void reconnect() {                             // ============= (RE)CONNECT TO MQTT
              // Loop until we're reconnected
              //while (!client.connected() && WiFi.status() == WL_CONNECTED) {   // Hier schauen ob WLAN connected UND MQTT weg
                Serial.print("Attempting MQTT connection...");
                // Attempt to connect
                if (client.connect("labspinnen8266")) {                         //NAME des Boards im MQTT-Frame
                  Serial.println("labspinnen8266 connected with MQTT");
                  // Once connected, publish an announcement...
                  client.publish("lab/labspinnen8266", "labspinnen8266 connected with MQTT");
                  // ... and resubscribe
                  client.subscribe("lab/labspinnen8266");
                } else {
                  Serial.print("failed, rc=");
                  Serial.print(client.state());
                  Serial.println(" try again in 5 seconds");
                  // Wait 5 seconds before retrying
                }
              //}
            }
            
            

            Prüft WLAN und MQTT. Und dann in Endlosschleife reconnect versuchen.

            Das klappt bei mir eigentlich sehr gut.

            Ach so: Dazu gehört noch #include <fastled.h>// LEDs and also to include command for every_n_milisecs

            So habe ich den Befehl EVERY_N_MILLISECOND() integriert.

            Warum das nicht zu Endlosschleifen führt, sobald der reconnect stattfindet, ist mir übrigens ein Rätsel, aber EVERY_N_MILLISECONDS scheint zu stoppen, sobald connect stattfindet.

            Sorry, ich hacke mich irgendwie so durch.</fastled.h>

            1 Reply Last reply Reply Quote 0
            • M
              milo last edited by

              Mhh, ist leider genau das was ich auch mache 😞

              Ich hab jetzt mal den MQTT Mosquitto Broker installiert, damit ich mal ein paar logs habe.

              Also der ESP verbindet sich ordnungsgemäß. Verliert dann aber die Verbindung und schmiert ab.

              Folgende Fehler Codes:

              Initiere MQDaten
              Init von: Relay1 erfolgt.
              Init von: Relay2 erfolgt.
              Init von: Relay3 erfolgt.
              Init von: Relay4 erfolgt.
              Init von: Relay5 erfolgt.
              Init von: Relay6 erfolgt.
              Init von: Relay7 erfolgt.
              Init von: Relay8 erfolgt.
              Initierung MQDaten abgeschlossen
              Empfangen: TestRelay/Relay1
               -> 1
              Schalte PortD0 auf: 0
              Empfangen: TestRelay/Relay2
               -> 0
              Schalte PortD1 auf: 1
              Empfangen: TestRelay/Relay3
               -> 0
              Schalte PortD2 auf: 1
              Empfangen: TestRelay/Relay4
               -> 0
              Schalte PortD3 auf: 1
              MQTT Fehlercode: -3
              WLAN Status: 3
              MQTT Client verbunden: RC: 0
              MQTT Fehlercode: -4
              WLAN Status: 3
              MQTT Client verbunden: RC: 0
              MQTT Fehlercode: -4
              WLAN Status: 3
              MQTT Client verbunden: RC: 0
              MQTT Fehlercode: -4
              WLAN Status: 3
              MQTT Client verbunden: RC: 0
              MQTT Fehlercode: -4
              WLAN Status: 3
              
              

              Mosquitto Logfile

              1513167749: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167750: Socket error on client TestRelay, disconnecting.
              1513167804: Saving in-memory database to /var/lib/mosquitto/mosquitto.db.
              1513167818: New connection from 192.168.22.170 on port 1900.
              1513167818: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167839: Client TestRelay has exceeded timeout, disconnecting.
              1513167839: Socket error on client TestRelay, disconnecting.
              1513167839: New connection from 192.168.22.170 on port 1900.
              1513167839: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167848: Socket error on client TestRelay, disconnecting.
              1513167848: New connection from 192.168.22.170 on port 1900.
              1513167848: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167848: Socket error on client TestRelay, disconnecting.
              1513167848: New connection from 192.168.22.170 on port 1900.
              1513167848: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167848: Socket error on client TestRelay, disconnecting.
              1513167848: New connection from 192.168.22.170 on port 1900.
              1513167848: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167848: Socket error on client TestRelay, disconnecting.
              1513167848: New connection from 192.168.22.170 on port 1900.
              1513167848: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167848: Socket error on client TestRelay, disconnecting.
              1513167848: New connection from 192.168.22.170 on port 1900.
              1513167848: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167848: Socket error on client TestRelay, disconnecting.
              1513167848: New connection from 192.168.22.170 on port 1900.
              1513167848: New client connected from 192.168.22.170 as TestRelay (c1, k15, u'esp').
              1513167848: Socket error on client TestRelay, disconnecting.
              

              Auffällig ist auch, dass der bis Relay4 funktioniert. Wenn ich das Init beobachte, dann scheint iwas zwischen Relay4 und 5 zu passieren. Weil hier braucht die Ausgabe deutlich länger….

              1 Reply Last reply Reply Quote 0
              • M
                milo last edited by

                Es ist tatsächlich so. Wenn ich bis Relay4 nur gehe, dann kommen keine Verbindungsabbrüche 😢 😢

                1 Reply Last reply Reply Quote 0
                • M
                  milo last edited by

                  Soooooooo,

                  > Es ist tatsächlich so. Wenn ich bis Relay4 nur gehe, dann kommen keine Verbindungsabbrüche :cry: :cry:
                  des Rätsels Lösung heißt:

                  _client.loop();
                  

                  Hinter den Aktionen (publish & subscribe) muss ein loop ausgeführt werden. Sonst scheint ein Puffer oder dergleichen voll zu laufen.


                  ` > ich habe einen Fehler bei meinen ESP8266 Controllern, den ich leider nicht gelöst bekomme.

                  Die Controller programmiert mittels Arduino IDE sollen mittels des MQTT Clients an den IOBroker angebunden werden.

                  Dies funktioniert soweit auch super. Einziges Problem ist, dass diese folgenden Fehler verursachen, sollte der MQTT Client mal z.B. durch neustart offline gehen: `

                  Das Rätsel mit Chunk Patch konnte ich zwar nicht lösen, aber wenn man den MQTT Adapter von IO Broker als Client laufen lässt und dazu den Mosquitto benutzt, so funktioniert alles. Auch nach einem Systemneustart, meldet sich mein ESP wieder an und es kommt nicht zu Verbindungsabbrüchen. Werde das mal ne Zeitlang testen und jetzt erstmal so in den Hauptbetrieb geben.

                  Vielen Dank an allen die geholfen haben!

                  1 Reply Last reply Reply Quote 0
                  • ?
                    A Former User last edited by

                    Leider sagen mir die Fehlercodes gar nichts.

                    Ist schon seltsam. Ich denke aber, du solltest dir den Arduino Code nochmal angucken.

                    MQTT ist es ja egal, wie viel gesendet wird? Oder vlt. wird zu schnell hintereinander gesendet und irgendein Puffer wird zu voll?

                    Mir ist noch aufgefallen, dass du ganz andere MQTT-Server Einstellungen hast als ich:

                    Ich habe im MQTT Adaper Einstellungen ALLES deaktiviert, außer: Sende auch Zustände (ack=true).

                    und ich verwende kein SSL-Passwort.

                    Vielleicht hat's auch was damit zu tun?

                    Ansonsten ist mir dein Arduino Code leider schon zu hoch :oops: Sorry. Ich steig da nicht ganz durch.

                    Ich habe einfach immer das genommen, was in den Beispielen vorgegeben wird, und dann nur ein bisschen abgeändert 🙂

                    1 Reply Last reply Reply Quote 0
                    • ?
                      A Former User last edited by

                      Ah ja, den client.loop() hatte ich ja auch in meinem Code drin.

                      Ich wusste/weiß nicht, was der macht.

                      Meinst du, ich muss ihn ein zweites Mal einbauen? An einer bestimmten Stelle?

                      Vielleicht würden dann ja auch meine Abbrüche endlich aufhören.

                      Wo genau hast du ihn hingesetzt?

                      1 Reply Last reply Reply Quote 0
                      • M
                        milo last edited by

                        @meome:

                        Ah ja, den client.loop() hatte ich ja auch in meinem Code drin.

                        Ich wusste/weiß nicht, was der macht.

                        Meinst du, ich muss ihn ein zweites Mal einbauen? An einer bestimmten Stelle?

                        Vielleicht würden dann ja auch meine Abbrüche endlich aufhören.

                        Wo genau hast du ihn hingesetzt? `

                        Ich habe den jetzt einfach mal großzügig hinter jede Publish und Subscribe Aktion gesetzt. Dadurch wird der ESP auf einmal mega schnell und sendet und empfängt ohne Probleme.

                        
                        void MiloEspApi::initMQData(String var, String preset) {
                        
                        	if (_client.connected() ) {	
                        
                        	_client.publish( String(_mq_name + "/" + var).c_str(), preset.c_str());
                        	_client.subscribe( String(_mq_name + "/" + var).c_str());
                        	_client.loop();
                        	log ("Init von: " + var + " erfolgt.");
                        
                        	}
                        
                        	}
                        }
                        
                        void MiloEspApi::sendeMQ(String var, String msg) {
                        
                        	if (_client.connected() ) {	
                        		_client.publish( String(_mq_name  + "/" + var).c_str(), msg.c_str());
                        		log("Gesendet: " + var + " --> " + msg);
                        		//delay(500);
                        		_client.loop();
                        
                        	}
                        }
                        
                        

                        Zur Erklärung: sendeMQ und initMQDaten sind einfache Funktionen. Du kannst das ganze MiloEspApi:: weglassen, wenn du alles in der Arduino IDE programmierst und dir da eigene Sendefunktionen bauen.

                        Hier nochmal Auszug aus der Api

                        ` > boolean loop ()

                        This should be called regularly to allow the client to process incoming messages and maintain its connection to the server.

                        Returns

                        false - the client is no longer connected

                        true - the client is still connected `

                        1 Reply Last reply Reply Quote 0
                        • ?
                          A Former User last edited by

                          Danke für's Feedback.

                          Hab mal in Api reingeschaut. Ich denke, den client.loop ein Mal mitten im loop void zu haben dürfte reichen.

                          Aber mehr schadet sicher auch nicht 🙂

                          Dann herzlichen Glückwunsch und noch viel Erfolg.

                          Und wenn dein iobroker-MQTT-Server-Adapter manchmal einfach so abstürzt (rot wird) und nicht zurück kommt - und du dafür den Grund rausfindest, dann melde dich gern nochmal 🙂

                          1 Reply Last reply Reply Quote 0
                          • M
                            milo last edited by

                            @meome:

                            Danke für's Feedback.

                            Hab mal in Api reingeschaut. Ich denke, den client.loop ein Mal mitten im loop void zu haben dürfte reichen.

                            Aber mehr schadet sicher auch nicht 🙂

                            Dann herzlichen Glückwunsch und noch viel Erfolg.

                            Und wenn dein iobroker-MQTT-Server-Adapter manchmal einfach so abstürzt (rot wird) und nicht zurück kommt - und du dafür den Grund rausfindest, dann melde dich gern nochmal 🙂 `

                            So werde ich mich melden 😉

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate
                            FAQ Cloud / IOT
                            HowTo: Node.js-Update
                            HowTo: Backup/Restore
                            Downloads
                            BLOG

                            887
                            Online

                            32.0k
                            Users

                            80.5k
                            Topics

                            1.3m
                            Posts

                            3
                            15
                            4318
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo