Hallo Alle Zusammen,
da ich selbst lange auf der Suche nach einer Lösung war und irgendwie so recht keine gefunden hatte möchte ich mit euch meine Erfahrungen teilen.
Ich hatte mich im Rahmen des DIY Projektes dafür eintschieden ersteinmal mit dem Cerbo GX zu starten (von einigen Tagen Monaten waren die PI´s ja auch nciht so gut zu bekommen ;)).
Da ich aber meine Home automatisierung inkl. Grafana etc. schon auf einem PI mit Iobroker laufen hatte wollte ich die Daten vom Cerbo GX an den Iobroker senden.
Folgendermaßen habe ich dies Umsetzt:
Da Bilder mehr als 100 Worte sagen habe ich 2 JPG beigefügt.
Wenn ihr weitere Gerätedaten auslesen wollt, dienicht auf der selben ID arbeiten z.B. bei mir der MultiPlus 2 -> neue Modbus instanze installieren -> die Geräte ID anpassen (die sieht man im Cerbo GX bei den Geräte Einstellung) -> bei Holding-register die ensprechenden Adressen / ID eingeben -> fertig.
Wenn alles richtig läuft ist der Adapter Grün und bei Objekten ist der Connection status true.
Ich hoffe ich konnte damit helfen.
MFG
Darul
ps. Ich hoffe der Bereicht passt
Warum nimmst du nicht einfach den MQTT Broker vom gx? Das ließ sich bei mir mit zwei Zeilen auslesen.
Da ich um ganz ehrlich zu sein dies nie richtig hinbekommen habe. Alle MQTT-Schnittstellen zu shelly, Tasmota etc. laufen ohne Probleme aber beim mir, aber
MQTT vom GX zum Iobroker:
- kleine Stabile Verbindung
- Warum 2 Schnittstellen TCP und MQTT in operation haben?
- kein iobroker javaskirpt hinbekommen das die Verbindung immer aktiv bleibt
Aber vielleicht kannst du ja da die Info´s liefern
Danke im Voraus.
Darul
ps. eventl. ist es von PI zu PI anders und einfacher als vom Cerbo GX zu PI
Mein Setup wird vermutlich ein wenig anders sein...
Ich nutze als broker für meinen IOT Krams mosquitto, der spiegelt zuerst alles was vom cerbo kommt, dazu folgendes in die mosquitto.conf einfügen:
connection cerbo_bridge
address cerbo.my.domain # oder ip
topic # both 0 venus-home/
Danach lassen sich sämtliche Daten z.B. mit der Python Library paho-mqtt auslesen.
Als Beispiel schaufel ich hier den SOC in eine influxDB um diesen in Grafana darzustellen:
#!/usr/bin/env python
import requests
import time
import paho.mqtt.client as mqtt
import os
import json
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
def battery_soc(client, userdata, msg):
global enabled
z = json.loads(msg.payload.decode())
battery_soc.battery_soc = z["value"]
os.system('curl --request POST "http://INFLUX_DOMAIN:8086/api/v2/write?org=WyNet&bucket=IOT&precision=ms"
--header "Authorization: Token MYTOKEN"
--header "Content-Type: text/plain; charset=utf-8"
--header "Accept: application/json"
client = mqtt.Client("CLIClient2")
client.battery_soc = battery_soc
client.on_connect = on_connect
client.message_callback_add("venus-home/N/48e7da895567/system/0/Dc/Battery/Soc", battery_soc)
client.connect("broker.DOMAIN")
client.loop_forever()
Das ist nur ein vereinfachter Auszug aus dem Script das ich tatsächlich nutze, könnte entspannter sein als mit Modbus.
(Und bevor jemand kommt, das es Blödsinn ist für den POST Request einen Systemaufruf zu nutzen... Ja, ist bekannt.)
Alternativ kann natürlich auch direkt der Broker des GX Device genutzt werden.
Ich möchte gleich die Anleitung ein wenig mit Bildern erweitern.
Das wichtigste ist die Excel Tabelle von Victron, der Rest ist dann Try and Error und Handarbeit.
Technical information - Victron Energy --> Modbus TCP List (link per mail beantragen, geht in 5sec und fertig)
im Venus OS
ModBus aktivieren.
Anzeigen lassen.
Beispiel bei mir.
IoBroker Modbus so viele Instanzen installieren wie man benötigt. Jedes Gerät benötigt eine eigene. Bsp: System 100, JKBMS 1, MPPT 224
Jede Instanz für sich bearbeiten. Bsp: 100 System (Cerbo)
Einträge nur im Holding Register durchführen. Und jedem Wert checken, ob er funktioniert, Wert für Wert. Bei nicht vorhandenem Wert im Venus OS, gibt es einen Fehler im Venus OS, und bei mir lief dann die Modbus Abfrage im iOBoker sehr sehr langsam weiter
Also hier prüfen ob er Werte bringt.
Beispiel für falsche Werte.
x
x
update
Hallo zusammen,
also ich bekomme es irgendwie nicht gebacken.
Bei mir sieht das auch ein wenig anders aus, denn ich sehe keine Geräte-IDs. Auch nach einen Scan nicht.
Ich kann hier manuell "Add" klicken und dann etwas hinzufügen. Aber was und macht das Sinn?
Was soll ich eintragen? Die IP des iobroker? habe ich auch schon versucht mit der Unit 100
Im iobroker habe ich auch schon einiges versucht, aber im Log kommt dann
"Poll error count: 1 code: {"errorCode":131,"exceptionCode":10,"message":"GATEWAY PATH UNAVAILABLE"
Alles gut, hab´s geschnallt. Geht jetzt.
Bekomme keine Verbindung mit Gerät oder Dienst. Verstehe ich nicht
Keine Ahnung von Absorbern und darf trotzdem alles 😀
Hallo zusammen,
ich habe mich auch ein bisschen abgemüht, eine Verbindung von ioBroker zum ESS (Venus OS / cerbo GX) zu bekommen - das funktioniert jetzt aber.
Dazu wird im MQTT Adapter eine Instanz mit den Einstellungen angelegt (IP und Port des Cerbos, auf dem Venus OS MQTT Klartext aktivieren, VRM cloud ID nachschauen und speichern):
Unter Einstellungen -> Dienste
Einstellungen -> VRM Online-Portal
Dann muss ein keepalive gepushed werden, damit das Venus OS die Daten über den Broker published. Dazu habe ich ein JavaScript geschrieben, das alle 55 Sekunden ausgeführt wird:
schedule("*/55 * * * * *", async function () { const mqtt = require('mqtt'); const client = mqtt.connect('mqtt://10.1.1.135'); // console.log('MQQT - Trying to establish connection ...'); client.on('connect', function () { client.subscribe('R/c0619abcdefg/keepalive', function (err) { if (!err) { client.publish('R/c0619abcdefg/keepalive', ''); console.log('MQQT - keepalive sent;'); } else { console.log('MQTT - connect error: ', err.toString); } }); }) });
Wichtig! Der String c0619abcdefg muss mit eurer VRM ID ersetzt werden!
Das einzige, was ich jetzt noch nicht hin bekommen habe, ist die direkte Wandlung der empfangenen Daten in nutzbare Werte, momentan werden diese als JSON Objekt übergeben. Kann mir damit eventuell jemand helfen? Beispiel, wie diese Daten aussehen:
// Beispielinhalt mqtt.0.N.c0619abcdefg.grid.30.AllowedRoles: {"value": ["grid", "pvinverter", "genset", "acload"]} // Beispielinhalt mqtt.0.N.c0619abcdefg.battery.277.Dc.0.Current: {"value": -0.615}
Wie kann ich es schaffen, dass ich den "value" Inhalt erhalte und nicht das Objekt?
Viele Grüße!
Dazu habe ich ein JavaScript geschrieben
und wie genau? Java ist nicht so meins... aber deine Lösung gefällt mir sehr gut (vor allem über Modbus bekomme ich keine Zellenspannungen (glaube ich))
Ist dein Script 1 x zum ausführen oder soll der wo im cron eingehängt werden?
Verbindung ist da aber ich sehe nur N/VRM-ID/system/0 .. und nicht mehr
EDIT:
du meintest JavaScript im ioBroker... dachte, dass sollte man auf cerbo asführen...
nach gewisser Zeit hab ich die Daten kurz bekommen... kurz haben sie sich aktualisiert (ohne script) und dann ging alles auf null.
Hab dann mit Script versucht mit: keepalive und system/0/Serial... hat sich nichts geändert. Instanz und venus durchgestartet -> nichts.
EDIT2:
Hab jetzt mit Raspberry versucht und es scheint zu funktionieren... die Werte kann ich in Grafana noch nicht anzeigen... aber nach dem suchst du ja auch.,..
Erstmal vielen Dank an alle. Ich steh jetzt bald an der gleichen Stelle und will den Cerbo auslesen. Das Einzige was ich aktuell beitragen kann ist, wie man aus dem JSON String einen Datenpunkt macht. Leider muss man das (glaube ich) noch für jeden Datenpunkt einzeln machen. Wenn es dort eine globale Lösung gibt wäre ich für einen Hinweis dankbar.
Ich zieh gerade ein iobroker raspi image und muss für eine Antwort auf das Internet verweisen:
https://forum.iobroker.net/topic/40742/mqtt-json-string-format?_=1612177210093
Das funktioniert zuverlässig und habe ich 1,5 Jahre schon benutzt.
Hallo zusammen,
ich hatte das Thema bisher nicht weiter verfolgt, da ich auf die "neue" Implementierung der MQTT Schnittstelle seitens Victron warten wollte (vgl. https://github.com/victronenergy/venus/issues/1098). Aber das zieht sich scheinbar noch etwas hin.
Eine Alternative zur Umwandlung der Werte habe ich gefunden, das geht per ALIAS manager. Hier ein paar Screenshots, die ich vor einiger Zeit dazu erstellt hatte. Schau mal, ob ihr damit auskommt, ich muss da noch einmal neu angreifen, kann euch leider keine näheren Details geben, da ich es nicht testen kann:
Viele Grüße,
Andreas
Hi,
also ich hab mir jetzt die Datenpunkte angelegt und Scripte pro Akku gebastelt.
Wie gesagt - von js hab ich nicht so viel Ahnung also falls jemand Fehler/Verbesserungsvorschläge findet...
schedule("*/55 * * * * *", async function () { const baseId = 'mqtt.2.N.XXXXX.battery.1.Voltages'; const numCells = 16; // Anzahl der Zellen let currentCell = 1; // Aktuelle Zelle console.log('Start: '); // Funktion zur Verarbeitung einer Zelle async function processCell(cellIndex) { const cellPath = `${baseId}.Cell${cellIndex}`; const ioBrokerState = `0_userdata.0.AKKU1.CELL${cellIndex}`; try { const dp = await getStateAsync(cellPath); if (!dp) { console.log(`Datenpunkt nicht gefunden: ${cellPath}`); return; } let obj; if (typeof dp.val === 'string') { obj = JSON.parse(dp.val); } else if (typeof dp.val === 'object') { obj = dp.val; } else { console.log('Ungültiges Datenformat: ' + typeof dp.val); return; } if (obj.hasOwnProperty('value')) { setStateAsync(ioBrokerState, { val: obj.value, ack: true }); } else { console.log(`Das JSON-Objekt für ${cellPath} enthält kein "value" Feld.`); } } catch (error) { console.log(`Fehler beim Verarbeiten des Objekts für ${cellPath}: ` + error); } } // Zellen nacheinander async function processNextCell() { if (currentCell <= numCells) { await processCell(currentCell); currentCell++; setTimeout(processNextCell, 1000); // warten 1 Sekunde } } processNextCell(); });