NEWS
[gelöst] MQTT Server Restart?
-
Hallo,
ich benutze den iobroker MQTT Adapter als Server, um damit Nachrichten von mehreren Webseiten (die mit Javascript Paho-MQTT Clients verbunden sind) und einigen ESP12 8266 Mikrocontrollern zu senden und empfangen.
Das klappt so weit ganz gut.
Mein Problem ist nur, dass alle paar Stunden/Tage der MQTT-Adapter plötlzich rot ist und das komplette System nicht mehr funktioniert.
Im Log steht dann nichts weiter als "MQTT Error".
Mehr nicht.
Ein simpler Neustart des Adapters behebt das Problem und alle Webseiten und Mikrocontroller melden sich innerhalb von Sekunden brav wieder an und sprechen miteinander.
Bis zum nächsten roten Punkt.
Hat jemand eine Ahnung, was da vor sich geht?
Und vor allem: Gibt es eine Möglichkeit, den Adapter automatisch neu starten zu lassen?
–-------- Infos:
-
Bei den MQTT-Einstellungen habe ich alle Häkchen deaktiviert, außer "Sende auch Zustände (ack=true):".
-
Abonniert ist mqtt.0.lab.*
-
Außerdem habe ich bei Verbindung "Benutze auch Websockets" aktiviert.
Weiß nicht, was sonst noch relevant sein könnte.
Im Log habe ich wie gesagt nichts gefunden.
-
-
Für ein bisschen mehr Info:
Das hier hab ich heute morgen im Log gefunden. So sieht das immer aus:
- mqtt.0 2017-12-03 09:42:59.999 info Client [labspinnen8266] subscribes on "mqtt.0.lab.labspinnen8266"
mqtt.0 2017-12-03 09:42:59.979 info Client [labspinnen8266] connected mqtt.0 2017-12-03 09:42:55.014 info Client [labrobot8266] subscribes on "mqtt.0.lab.labrobot8266" mqtt.0 2017-12-03 09:42:54.999 info Client [labrobot8266] connected mqtt.0 2017-12-03 09:32:20.851 info Client [labspinnen8266] closed mqtt.0 2017-12-03 09:32:20.851 error Closed because of error mqtt.0 2017-12-03 09:32:20.850 warn Client error [labspinnen8266]: Error: read ECONNRESET mqtt.0 2017-12-03 09:32:20.849 info Client [labrobot8266] closed mqtt.0 2017-12-03 09:32:20.849 error Closed because of error mqtt.0 2017-12-03 09:32:20.847 warn Client error [labrobot8266]: Error: read ECONNRESET mqtt.0 2017-12-03 09:32:01.012 info Client [Countdown_Lab] subscribes on "mqtt.0.lab.*" with regex /^mqtt\.0\.lab\..*/ mqtt.0 2017-12-03 09:32:01.012 info Client [Countdown_Lab] subscribes on "mqtt.0.lab.*" with regex /^lab\..*/ mqtt.0 2017-12-03 09:32:00.960 info Client [Countdown_Lab] connected
Nach 10 Minuten scheint sich MQTT selbst zu starten (oder einer meiner Mitarbeiter hat das getan, bin nicht sicher)
Vielleicht hilft es ja?
-
Habe grad das hier gefunden:
http://forum.iobroker.net/viewtopic.php?t=2747
Chunking Option aktivieren.
Hatte ich vorher nicht gesehen.
Ich werde es ausprobieren und berichten.
-
Hm, gar nicht gut. Mit Chunking Patch aktiviert wird alles rot und nix geht mehr:
- host.TARDIS 2017-12-03 10:31:27.674 info Restart adapter system.adapter.mqtt.0 because enabled
host.TARDIS 2017-12-03 10:31:27.674 error instance system.adapter.mqtt.0 terminated with code 0 (OK) Caught 2017-12-03 10:31:27.673 error by controller[2]: at Connection.Writable.write (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:322:11) Caught 2017-12-03 10:31:27.673 error by controller[2]: at writeOrBuffer (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:395:5) Caught 2017-12-03 10:31:27.673 error by controller[2]: at doWrite (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:406:64) Caught 2017-12-03 10:31:27.673 error by controller[2]: at Connection.Duplexify._write (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\duplexify\index.js:201:22) Caught 2017-12-03 10:31:27.673 error by controller[2]: at Writable.write (_stream_writable.js:243:11) Caught 2017-12-03 10:31:27.673 error by controller[2]: at writeOrBuffer (_stream_writable.js:317:5) Caught 2017-12-03 10:31:27.673 error by controller[2]: at doWrite (_stream_writable.js:331:12) Caught 2017-12-03 10:31:27.673 error by controller[2]: at Writable.write [as _write] (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\mqtt-connection\lib\writeToStream.js:10:9) Caught 2017-12-03 10:31:27.673 error by controller[2]: at publish (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\mqtt-packet\writeToStream.js:248:23) Caught 2017-12-03 10:31:27.673 error by controller[2]: at Function.Buffer.concat (buffer.js:304:24) Caught 2017-12-03 10:31:27.672 error by controller[2]: 2017-12-03 10:31:27.154 - mqtt.0 TypeError: Cannot read property 'length' of undefined Caught 2017-12-03 10:31:27.672 error by controller[1]: 2017-12-03 10:31:27.154 - mqtt.0 uncaught exception: Cannot read property 'length' of undefined Caught 2017-12-03 10:31:27.672 error by controller[0]: at Connection.Writable.write (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:322:11) Caught 2017-12-03 10:31:27.672 error by controller[0]: at writeOrBuffer (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:395:5) Caught 2017-12-03 10:31:27.672 error by controller[0]: at doWrite (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:406:64) Caught 2017-12-03 10:31:27.672 error by controller[0]: at Connection.Duplexify._write (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\duplexify\index.js:201:22) Caught 2017-12-03 10:31:27.672 error by controller[0]: at Writable.write (_stream_writable.js:243:11) Caught 2017-12-03 10:31:27.672 error by controller[0]: at writeOrBuffer (_stream_writable.js:317:5) Caught 2017-12-03 10:31:27.671 error by controller[0]: at doWrite (_stream_writable.js:331:12) Caught 2017-12-03 10:31:27.671 error by controller[0]: at Writable.write [as _write] (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\mqtt-connection\lib\writeToStream.js:10:9) Caught 2017-12-03 10:31:27.671 error by controller[0]: at publish (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\mqtt-packet\writeToStream.js:248:23) Caught 2017-12-03 10:31:27.671 error by controller[0]: at Function.Buffer.concat (buffer.js:304:24) Caught 2017-12-03 10:31:27.671 error by controller[0]: TypeError: Cannot read property 'length' of undefined mqtt.0 2017-12-03 10:31:27.658 info terminating mqtt.0 2017-12-03 10:31:27.169 info Client [Countdown_Lab] closed mqtt.0 2017-12-03 10:31:27.167 warn Client error [Countdown_Lab]: Error: not opened mqtt.0 2017-12-03 10:31:27.163 info Client [Countdown_Lab] connected mqtt.0 2017-12-03 10:31:27.158 info Client [labspinnen8266] closed mqtt.0 2017-12-03 10:31:27.154 error at Connection.Writable.write (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:322:11) mqtt.0 2017-12-03 10:31:27.154 error at writeOrBuffer (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:395:5) mqtt.0 2017-12-03 10:31:27.154 error at doWrite (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib\_stream_writable.js:406:64) mqtt.0 2017-12-03 10:31:27.154 error at Connection.Duplexify._write (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\duplexify\index.js:201:22) mqtt.0 2017-12-03 10:31:27.154 error at Writable.write (_stream_writable.js:243:11) mqtt.0 2017-12-03 10:31:27.154 error at writeOrBuffer (_stream_writable.js:317:5) mqtt.0 2017-12-03 10:31:27.154 error at doWrite (_stream_writable.js:331:12) mqtt.0 2017-12-03 10:31:27.154 error at Writable.write [as _write] (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\mqtt-connection\lib\writeToStream.js:10:9) mqtt.0 2017-12-03 10:31:27.154 error at publish (C:\ioBroker\node_modules\iobroker.mqtt\node_modules\mqtt-packet\writeToStream.js:248:23) mqtt.0 2017-12-03 10:31:27.154 error at Function.Buffer.concat (buffer.js:304:24) mqtt.0 2017-12-03 10:31:27.154 error TypeError: Cannot read property 'length' of undefined mqtt.0 2017-12-03 10:31:27.154 error uncaught exception: Cannot read property 'length' of undefined mqtt.0 2017-12-03 10:31:27.116 info Client [labspinnen8266] connected mqtt.0 2017-12-03 10:31:26.979 info Starting MQTT-WebSocket server on port 1884 mqtt.0 2017-12-03 10:31:26.978 info Starting MQTT server on port 1883 mqtt.0 2017-12-03 10:31:26.756 info Patch applied mqtt.0 2017-12-03 10:31:26.742 info starting. Version 1.3.2 in C:/ioBroker/node_modules/iobroker.mqtt, node: v6.10.3 host.TARDIS 2017-12-03 10:31:26.085 info instance system.adapter.mqtt.0 started with pid 13632
-
@meome:C:\ioBroker\node_modules\iobroker.mqtt\node_modules\readable-stream\lib_stream_writable.js:322:11 `
Also windoof??Da bin ich leider raus
Aber hast du mal an den automatischen restart gefacht?
http://www.iobroker.net/docu/?page_id=5 … #6_restart
Gruß Rainer
-
Ja, ein automatischer Restart würde das Problem auf jeden Fall lösen machen, denke ich.
Es startet aber nicht automatisch neu. Zumindest nicht sofort.
Dein Link hat mir da grad leider nicht weiter geholfen.
Da steht nur, das ich resarten kann? Das tue ich ja auch schon. Das funktioniert.
Aber wie geht das automatisch?
-
Und ja, alles Windows 10, in der Tat.
Ich überlege grad Umzug auf RasPi, aber mit Linux kenne ich mich noch so gut wie gar nicht aus.
-
@meome:Aber wie geht das automatisch? `
Indem du dort im Admin unter Instanzen einen cron eingibst (Expertenmodus vorher aktivieren!).Den stellst du entsprechend deiner wünsche nach dem restartintervall ein.
Gruß
Rainer
-
Hm. Danke für die Anregung.
Unter Windows 10 gibts wohl nur die Taskplanung. Habe auch das Programm Z-Cron gefunden, das anscheinend gut ist.
Ist es denn echt ok, wenn ich den MQTT-Adapter jede Minute neu starte?
Besser wäre ja eigentlich, wenn ich jede Minute ein Programm ausführen lassen würde, das prüft, ob MQTT läuft.
Wenn ja: Alle sgut und nix tun.
Wenn nein: Neustart MQTT-Adapter per Kommandozeilenbefehl.
Gibt es eine Möglichkeit, mit einem Kommandozeilen-Befehl zu prüfen, ob MQTT läuft?
Ich glaube, ich mus smir auch noch mal das mit dem Chunking Patch durchlesen, das hat im anderen Thread ja funktioniert.
Eine dritte alternative wäre natürlich noch auf Mosquitto umzusteigen und zu hoffen, das es da besser läuft.
Würde aber am liebsten alles im iobroker-Universum lassen.
-
Oh nein, war mal wieder zu schnell.
Habe die Cron-Experten-Einstellungen gefunden.
Frage bleibt: Ist das ok, jede Minute neu zu starten? Verliere ich dann evtl. Daten?
-
@meome:Frage bleibt: Ist das ok, jede Minute neu zu starten? Verliere ich dann evtl. Daten? `
Ich wuerde ihn auf keinen falll jede minute neu starten
Pruefe doch mal bitten ob der status alive auf false schlaegt wen der adapter abschmiert
(vorher bei den objecten experten modus einschalten sonst siehst du diese variable nicht)
system.adapter.mqtt.0.alive
wen ja kan man mit javascript dafuer sorgen "wenn alive = false dann adapter neustart"
-
Das wäre eine gute Lösung.
So weit ich weiß, ist es false (die oberen 2 von 3 Punkten sind rot), aber ich werd das morgen prüfen und berichten.
Wie ich die Systemnachricht system.adapter.mqtt.0.alive per Websockets in meine Webseite kriege, weiß ich (glaube ich).
Aber wie kann ich mit Javascript aus einer Webseite heraus den Adapter neu starten?
-
@meome:Aber wie kann ich mit Javascript aus einer Webseite heraus den Adapter neu starten? `
Schau mal hier für ein Script Beispiel.
Die Frage ist ob du es von der Webseite aus machen möchtest, Dan musst du da einen Button mit Trigger erstellen, oder einfach nen Adapter reboot machst wen de Werte alive = false wird:
http://forum.iobroker.net/viewtopic.php?t=9190
–-----------------------
Send from mobile device
-
Hatte endlich Zeit:
Per iobroker Javascript-Adapter ein Blocky-Script erstellt
(ich wollte es eigentlich per DOS-Batch-Befehl machen a la "iobroker restart mqtt.0" , Blocky ist glaub ich viel besser Da hatte ich kompliziert gedacht und wusste nichts vom Javascript-Adapter. iobroker ist immer wieder eindrucksvoll ).
Das Skript läuft und sieht folgendermaßen aus:
on({id: "system.adapter.mqtt.0.alive"/*mqtt.0.alive*/, val: false}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; console.log('MQTT RESTART'); setState("system.adapter.mqtt.0.alive"/*mqtt.0.alive*/, true); setState("system.adapter.mqtt.0.connected"/*mqtt.0.connected*/, true); });
Die Frage ist jetzt: Ist das richtig so?
Ich setze ja nur die Werte alive und connected auf true.
Einen wirklichen Adapter-Restart mache ich damit nicht?
Oder doch?
Wenn nicht, was wäre denn der Befehl dafür? Finde in Blocky nichts.
Leider kann ich es nicht testen, da der mqtt-Ausfall nur äußerst sporadisch auftritt und ich immer noch keinen Anhaltspunkt habe, warum es passiert.
Ich habe das gleiche Problem letztens sogar bei socket.io gehabt. War einfach rot und wurde durch manuellen Neustart sofort wieder funktional.
Dafür würde ich dann gleich ein zweites Skript anlegen.
Müsste nur wissen, ob das so wirklich funkional ist oder ob ich einen anderes Kommando für Adapter-Restart brauche.
Habe in der Suche nichts gefunden.
-
Das geht viel einfacher (per cron):
http://www.iobroker.net/docu/?page_id=5 … #6_restart
bitte vorher Expertenmodus aktivieren.
Gruß
Rainer
-
Warum setzt Nu Werte alive und connected das ist der Status!
Du musst den Adapter enabled Werte auf FALSE und dann zB 30sec später auf true setzen.
Der alive/connected gibt für den Status ob er abgeschmiert ist
Die Frage war nicht cyclisch zu rebooten was mit cron geht sondern nur wenn er abgeschmiert ist
–-----------------------
Send from mobile device
-
Ich glaub, ich habs!
Hab das Script von Blocky in Javascript kopiert und dann folgendermaßen abgeändert:
on({id: "system.adapter.mqtt.0.alive"/*mqtt.0.alive*/, val: false}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; console.log('MQTT RESTART'); var obj2 = getObject("system.adapter.mqtt.0"); obj2.common.enabled = true; // Adapter einschalten setObject("system.adapter.mqtt.0", obj2); });
Jetzt startet der MQTT-Adapter jedes mal neu, wenn ich ihn zum Beispiel manuell deaktiviere!
Denke, wenn irgendwas anderes ihn aus der Fassung bringt, passiert das auch.
Jetzt bastel ich das gleich noch für Socket.io.
Damit kann man den Adapter zwar nicht mehr deaktivieren, solange das Skript läuft, aber das ist bei MQTT und Socket.io ja herzlich egal.
Damit sollten meine Panikattacken endlich vorüber sein
Hoffentlich ist das jetzt richtig so.
-
Man könnte das noch verfeinern durch nur auf alive zu überprüfen und eine Aktion aus zu lösen wen der Adapter enabled ist. Dann könntest du ihn auch manuell wieder ausschalten
–-----------------------
Send from mobile device
-
@Dutchman: Das wäre cool. Ja.
Ich fände es auch toll, wenn es da sowas wie eine Sicherheitssperre von 10-15 Sekunden gäbe, damit bei einem richtig fiesen Absturz nicht 1000 Neustartanforderungen pro Sekunde gesendet werden und evtl. das gesamte System blockieren.
Ich weiß nicht, ob das so passieren kann. Aber damit würde ich mich sicherer fühlen.
Leider übersteigt das aber meine Fähigkeiten.
Vielleicht spiele ich mal in Blocky rum, um zu sehen, wie so eine Zeitsteuerung funktioniert.
Ich bin leider totaler Noob.
Ich brauche immer vorgegebene Codeschnipsel, die ich dann per try&error zusammensetze.
Freu mich schon, wenn jetzt keiner mehr sagt: Das geht so nicht, das darfst du nicht tun, weil gefährlich und alles kann abschmieren oder so
-
Ich verstehe deine Sicherheitsperre logic nicht was meinst du damit
–-----------------------
Send from mobile device