Benachrichtigungen
Alles löschen

Cerbo GX Modbus-Daten an IoBroker senden

16 Beiträge
10 Benutzer
4 Likes
4,214 Ansichten
(@darul)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 10
Themenstarter  

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


   
Zitat
 Niun
(@niun)
Batterielecker
Beigetreten: Vor 2 Jahren
Beiträge: 206
 

Warum nimmst du nicht einfach den MQTT Broker vom gx? Das ließ sich bei mir mit zwei Zeilen auslesen.


   
AntwortZitat
(@darul)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 10
Themenstarter  

@Niun

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


   
AntwortZitat
 Niun
(@niun)
Batterielecker
Beigetreten: Vor 2 Jahren
Beiträge: 206
 

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.


   
AntwortZitat
(@luigi)
Vorsichtiger Stromfühler
Beigetreten: Vor 4 Jahren
Beiträge: 83
 

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

 


   
Joh, solarfreund and jarek reacted
AntwortZitat
(@luigi)
Vorsichtiger Stromfühler
Beigetreten: Vor 4 Jahren
Beiträge: 83
 

update


   
AntwortZitat
(@awacs2000)
Newbie
Beigetreten: Vor 1 Jahr
Beiträge: 2
 

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"

 


   
AntwortZitat
(@awacs2000)
Newbie
Beigetreten: Vor 1 Jahr
Beiträge: 2
 

Alles gut, hab´s geschnallt. Geht jetzt.


   
AntwortZitat
(@realtnt)
Newbie
Beigetreten: Vor 1 Jahr
Beiträge: 1
 

Veröffentlicht von: @awacs2000

Alles gut, hab´s geschnallt. Geht jetzt.

Und was war die Lösung? Ich schnalls leider nichts... 

 


   
AntwortZitat
(@bkrysiak)
Batterielecker
Beigetreten: Vor 2 Jahren
Beiträge: 178
 

Bekomme keine Verbindung mit Gerät oder Dienst. Verstehe ich nicht

Keine Ahnung von Absorbern und darf trotzdem alles 😀


   
AntwortZitat
DaDeppa
(@dadeppa)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 115
 

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):

 

Spoiler
MQTT aktivieren

Unter Einstellungen -> Dienste

Spoiler
VRM ID nachschauen

Einstellungen -> VRM Online-Portal

Spoiler
Einstellungen ioBroker MQTT

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:

Spoiler
JavaScript Code
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:

Spoiler
Objektdaten der MQTT Instanz

// 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!


   
Nefetz reacted
AntwortZitat
(@jarek)
Batterielecker
Beigetreten: Vor 2 Jahren
Beiträge: 291
 

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.,..


   
AntwortZitat
(@herbert_123)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 27
 

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.

@dadeppa 

Ich zieh gerade ein iobroker raspi image und muss für eine Antwort auf das Internet verweisen:

https://forum.iobroker.net/topic/41289/gel%C3%B6st-json-tabelle-in-datenobjekte-aufl%C3%B6sen-javascript?_=1612181392207

https://forum.iobroker.net/topic/40742/mqtt-json-string-format?_=1612177210093

Das funktioniert zuverlässig und habe ich 1,5 Jahre schon benutzt.


   
AntwortZitat
DaDeppa
(@dadeppa)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 115
 

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


   
AntwortZitat
(@jarek)
Batterielecker
Beigetreten: Vor 2 Jahren
Beiträge: 291
 

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();
});

   
AntwortZitat
Seite 1 / 2
Teilen: