Victron CerboGX per MQTT auslesen

Hallo zusammen,

ich habe mir im VanPi/Node-RED einen Flow gebaut, der per MQTT einige Daten vom Victron Cerbo GX übernimmt und in VanPi-Variablen schreibt.

Grundsätzlich funktioniert die Verbindung:

  • Cerbo GX läuft ja als MQTT-Broker

  • VanPi/Node-RED verbindet sich per MQTT

  • Werte wie SoC, Spannung, Strom und Leistung kommen an und können per global.set(...) in VanPi-Variablen geschrieben werden. Bsp:

    let soc = Number(msg.payload);
    
    if (isNaN(soc)) {
        return null;
        }
        
    soc = Math.round(soc);
        
    global.set("MainBattSoc", soc);
        
    msg.payload = soc;
    return msg;
    

Trotzdem bin ich mit dem Ergebnis noch nicht glücklich. Die Werte werden im VanPi bzw. in der App/Anzeige nicht so regelmäßig aktualisiert, wie ich es erwarten würde. Dadurch entstehen teilweise größere Unterschiede zwischen Victron/Cerbo und den im VanPi angezeigten Werten.

Meine Fragen an euch:

  • Habe ich beim Ansatz grundsätzlich etwas falsch gemacht?

  • Wie würdet ihr die Cerbo-Daten sauber in den VanPi übernehmen?

  • Muss man nach dem Setzen der globalen Variablen noch bestehende VanPi-Flows/Widgets antriggern?

  • Gibt es vielleicht schon einen funktionierenden Flow von jemandem, den ich als Vorlage nutzen könnte?

Netzwerktopologie:

  • Cerbo GX mit fester IP

  • VanPi

  • beide per Ethernet an einem Switch

  • Switch hängt am UniFi Travel Router

Vielen Dank schon mal für eure Hilfe.

Viele Grüße
Jan

Grundsätzlich ist das so wie du das gemacht hast richtig, so oft wie der Cebro die MQTT Daten schreibt, so oft werden die Daten nach global geschrieben. Die App holt sich die Daten beim öffnen und dann alle 10 Sekunden. Die Anzeige holt sich die Daten beim öffnen, und danach erst wieder bei Seiten wechsel. Eigentlich sind die Anzeigen nur eine Moment Aufnahme, aber so gravierend bzw. schnell sind die Änderungen ja auch nicht.
Und wenn ich was beobachten will, dann lege ich mir einen Trend an.

1 Like

ich verwende das genau so wie du und habe keine Probleme

ich verwende nur nicht die app sonder nur die webobwerfläche vom core (node-red dashboard)

1 Like

Danke für eure Rückmeldungen.

Ich glaube inzwischen, dass mein Problem eher auf der MQTT-Kommunikation zwischen Cerbo und VanPi liegt. Nach einiger Zeit kamen bei mir keine neuen MQTT-Daten mehr an, obwohl die Verbindung zunächst funktioniert hat.

Aktuell teste ich deshalb einen kleinen Keepalive-Flow in Node-RED, da es zeitweise so aussah, als würde der Cerbo irgendwann keine neuen Daten mehr senden. Ob das tatsächlich die Ursache war, beobachte ich aktuell noch.

Der Flow sieht aktuell so aus:

Inject (alle 30 Sekunden) → Function → MQTT Out

Function:

msg.topic = "R/xxxxxxxx/keepalive";
msg.payload = { value: 1 };
return msg;

Seitdem läuft die Datenübertragung bisher stabiler. Mich würde interessieren, ob jemand diesen Keepalive ebenfalls verwendet oder ob bei euch die MQTT-Daten auch ohne zusätzlichen Keepalive dauerhaft aktualisiert werden?

Hilfreich war auf jeden Fall der Hinweis, dass die MQTT-Daten direkt in die Globalen Variablen geschrieben werden können und andere Nutzer das genauso einsetzen. Das bestätigt mir, dass mein grundsätzlicher Ansatz richtig ist.

VG
Jan

Das mit dem keepalive wurde hier bereits vor einiger Zeit mal gepostet:

1 Like

du brauchst diesen keepalive heartbeat sonst kommen keine Daten solang niemand am GX zugreift

ich hab den aber direct am GX im node-red hinterlegt somit sendet er immer Daten egal ob wer verbunden ist

Ich hatte mir mit nodered einen Spiegel gebaut, der alles was im VenusOS (Cerbo über RPi3) ins mqtt geschrieben wird 1:1 auch im Vanpi ankommt… leider hatte ich dann peeformance probleme und der Load ging extrem hoch, weil es tausende von Nachrichten waren.

Danach hab ich das wieder deaktiviert und dann einen Python Skript erstellt, das läuft nun deutlich besser da er nun einen weiteren Kern benutzt vom Pi4..

Das keepalive muss man unbedingt senden, ich mach es glaub all 20-30 Sekunden.

Gruß

Roland