Hallo,
ein Thema, das bestimmt schon viele vor mir gelöst haben, ich bin aber unfähig die Lösung durch googeln zu finden:
Ich habe einen Multiplus II GX, MQTT ist aktiviert.
Ich habe iobroker mit dem MQTT-Client eingerichtet, habe per MQTT-Explorer ein keepalive gesendet und sehe nun die Datenpunkte im iobroker.
Allerdings reißt der Datenstrom zum iobroker ständig ab. Erst ein erneutes Schicken von keepalive durch den MQTT-Explorer startet die Übertragung wieder, die aber nach kurzer Zeit erneut zusammenbricht.
Ich bin absoluter MQTT-Neuling. Was muss ich tun, damit der Multiplus GX die Daten immer weiter an iobroker sendet und das senden nicht einstellt?
Mein System sendet den keepalive alle 45 Sekunden. Ich kann die Quelle der Information nicht mehr nennen, aber das war damals bei der Einrichtung der Wert, der für mich gut funktioniert hat.
Ich habe Symcon am Laufen. Aber die nötige Zeitspanne wird ja vom GX vorgegeben und muss nur vom empfangenden System bedient werden.
Vielleicht noch ein Unterschied: Ich habe das VenusOS auf einem Raspberry Pi laufen, kein GX. Sollte aber auch keinen Unterschied machen, denke ich.
So, mit viel gegoogle und ChatGPT habe ich jetzt was, was zu funktionieren scheint.
In IOBroker habe ich folgende beiden Adapter installiert:
MQTT-Client
JavaScript
MQTT hatte ich schon vorher prinzipiell am Laufen, indem ich mit dem MQTT-Explorer (das ist ne Windows Anwendung) ein keepalive gesendet habe.
Nach Installation des JavaScript-Adapters taucht in der linken Leiste ein zusätzliches Menü auf: Scripte
Dort habe ich auf das Plus-Zeichen geklickt, eine neues JavaScript erstellt und folgenden Code eingefügt:
function sendKeepalive() {
log(`Sende Keepalive`);
setState(`mqtt-client.0.R.c0619ab4539d.keepalive`, "");
}
// Zyklisches Intervall von 45s starten
setInterval(sendKeepalive, 45000);
Das “c0619ab4539d” muss man durch die Zeichenfolge des eigenen GX-Devices ersetzen, die man im z.B. MQTT-Explorer sehen kann.
Die Zeile mit dem “log” kann man auskommentieren, wenn man mag. Die macht halt bei jedem Senden des keepalives einen Log-Eintrag.
Script starten, 45 Sekunden warten und es funktioniert.
Was ich noch nicht getestet habe: Startet das Script automatisch nach einem Reboot des IOBroker-Systems?
Skripte, die aktiv waren, werden bei einem Neustart wieder gestartet.
Damit du nach dem Starten des Skriptes keine 45 Sekunden warten musst, füge am Anfang einfach
sendKeepalive()
ein. Dadurch wird die function beim Start ausgeführt und der Keepalive wird sofort gesendet.
Edit:
Eine Änderung würde ich noch Vorschlagen:
setState('mqtt-client.0.R.c0619ab4539d.keepalive', "");
function sendKeepalive() {
//log(`Sende Keepalive`);
setState('mqtt-client.0.R.c0619ab4539d.keepalive', '{ "keepalive-options" : ["suppress-republish"] }');
}
// Zyklisches Intervall von 45s starten
setInterval(sendKeepalive, 45000);
Durch senden einer leeren Nachricht wird ein senden aller Daten veranlasst. Mit dem Senden der Option “suppress-republish” wird dies unterbunden und es werden weiterhin nur Daten gesendet, die sich geändert haben.
Mehr dazu hier: https://github.com/victronenergy/dbus-flashmq
vielen Dank für den Tipp, habe ich gleich eingebaut, sieht jetzt in Summe so aus:
function sendKeepalive() {
log(`Sende Keepalive`);
setState(`mqtt-client.0.R.c0619ab4539d.keepalive`, '{ "keepalive-options" : ["suppress-republish"] }');
}
// Einmal ein republish keepalive beim Script-Start
setState(`mqtt-client.0.R.c0619ab4539d.keepalive`,"")
// Zyklisches Intervall von 45s starten
setInterval(sendKeepalive, 45000);
heute Morgen lief das alte Script nicht mehr, dass ich am Donnerstag gestartet hatte. Aus den Logs kann ich aber nicht nachvollziehen, ob ich mich das verklickt habe, oder ob das aus anderen Gründen gestoppt wurde. Im Log steht nur: