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.
    • Homoran
      Homoran Global Moderator Administrators last edited by

      Was hast du als mqtt-Broker laufen?

      Gruß

      Rainer

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

        Ahh sorry, den internen von iobroker:

        MQTT Adapter in der Version 1.3.2.

        Die Einstellungen sind im Anhang.
        4334_mqtt2.jpg
        4334_mqtt1.jpg

        1 Reply Last reply Reply Quote 0
        • ?
          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

                                783
                                Online

                                32.0k
                                Users

                                80.4k
                                Topics

                                1.3m
                                Posts

                                3
                                15
                                4317
                                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