Multiplus GX -> MQTT -> iobroker -> keepalive?

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?

Michael

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.

“Dein System”, ist das auch iobroker?

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.

Ich frage mich halt, wie ich iobroker dazu bringen kann, das keepalive zyklisch zu senden.

Iobroker kenne ich leider nur vom Namen her. Aber sicher gibts hier noch einige, die das nutzen und eine Idee haben.

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:

2024-12-05 22:43:17.411 - info: javascript.0 (17376) Stopping script script.js.VictronKeepalive

Funktioniert das Skript wieder so bei dir?
Bei mir bewirkt das nichts

Ich habe iobroker und MQTT inzwischen auf den Mond geschossen und machs manuell mit einem python-Script direkt auf dem GX.

D.h. dss keep alive machst du per python, oder komplett alles, dass du iobroker etc. in Gänze nicht mehr brauchst?

hallo,
von welchem system das keepalive kommt, spielt keine rolle. aber ohne werden nach einer eingestellten zeit (normalerweise wohl 60s) keine daten mehr gesendet.

du kannst auch node-red auf dem gx benutzen, um den keepalive zu senden.

ich benutze ein shell-script zum abrufen der daten und habe das dort so realisiert (mit dem mosquitto-client unter linux):
while true
do
if [ “$ST” -gt 0 ]
then
ST=“$(( $ST -1 ))”
sleep 1
mosquitto_pub $ID -t “R/$MQTT/keepalive” -h $IP -m “”
else
mosquitto_pub $ID -t “R/$MQTT/keepalive” -h $IP -m ‘{ “keepalive-options” : [“suppress-republish”] }’
fi
sleep 30
done &

dabei werden zuerst alle daten, nach dem start des programms, angefordert und dann nur noch die geaenderten gesendet. jedesmal alle daten zu verarbeiten hat das programm, das die daten verarbeiten muss, naemlich nicht geschafft und dafuer ueber 20s benoetigt und das 2 mal in der minute!

in node-red sieht das dann so aus:

hier sorgt der keepalive aber nur dafuer, dass ich bestimmte werte zyklisch gesendet bekomme, die sich normalerweise nur sehr selten aendern, die ich aber fuer die regelung dringend brauche, und auch direkt brauche, falls node-red einmal neu gestartet werden sollte!
ich habe hier auch je 2 verbindungen eingerichtet, falls eine mal ausfallen sollte. der keepalive geht allerdings nur auf die lan-verbindung. man koennte hier aber auch noch die wlan-verbindung mit einbinden.

tschuess

Ich hole mir mit Python die Messwerte aus dem DBus des GX und schiebe sie direkt auf die Influx-DB aufm NAS. MQTT brauche ich dazu nicht.

Ist auch nicht viel Code. Aber Programmieren sollte man da schon können, und final verstanden habe ich auch noch nicht, wie der DBus sich verhält, wenn einzelne Komponenten offline sind.