MQTT Daten für ioBroker aus VRM abgreifen

Hallo,

ich möchte die MQTT Daten aus der VRM für ioBroker abgreifen. Direkt geht leider nicht, da die Anlage 140km weit entfernt steht.

Ich habe nun Stundenrund Anleitungen gelesen und kann die Daten nun via MQTT-Explorer abrufen.
Die Daten werden auch regelmäßig erneuert, also genau wie ich es will.

Grundlage war: MQTT local & via MQTT broker - VictronEnergy

Nun dachte ich - einfach die Einstellungen in den ioBroker Client und ich hab alles wie ich will - Pustekuchen.
Die Verbindung mit dem Server steht, aber es werden keine Daten empfangen.

Weiss jemand Rat.

Gruss
Olli

1 Like

hallo,
es gibt durchaus moeglichkeiten, die daten von einem mqtt-server auf einen anderen zu uebertragen.

wenn es sich nicht um einen mqtt-server im internet handelt, wuerde ich ein vpn empfehlen. eine freigabe des mqtt-ports im internet wuerde ich nur dann nutzen, wenn der client eine feste ip hat und ich diese dann in der firewall freigeben und alle anderen sperren koennte.

wenn du keine andere moeglichkeit findest, kannst du auch node-red benutzen. damit kannst du dann auch gleich die daten konvertieren. ich habe das einmal gemacht, um die mqtt-daten vom cerbo auf einen anderen mqtt-server zu uebertragen und dabei gleichzeitig das object in einen einzelnen wert zu konvertieren, weil die datenbank, die vom 2. system benutzt wird, normalerweise nur delta-werte speichert und ein object hat ja kein numerisches delta. damit kannst auch problemlos die daten auf einen mqtt-server im internet uebertragen.

wenn du allerdings alle daten uebertragen willst, sollte node-red nicht auf dem gx-device laufen, da der rechenzeitbedarf dafuer sejr hoch ist und das gx-device ueberlasten wuerde. ich glaube, ich hatte es auf meinem server mit 16 cpu-kernen ausprobiert, der hat auf jeden fall genug power. aber es wurden nur 1 oder 2 kerne mit dieser aufgabe beschaeftigt.

falls du kein vpn aufbauen kannst, koenntes du auch noch ein portforwarding ueber ssh einrichten, vom gx zu einem anderen ssh-server kannst du das ganze auch noch mit schluesseln und/oder zertifikaten absichern. oder du kannst auf dem gx, am besten auf einer sd-karte, ein programm installieren, mit dem du einen tcp-ip-tunnel aufbauen kannst.

es gibt viele moeglichkeiten, man muss sich nur fuer eine entscheiden. am einfachsten waere natuerlich eine vpn-verbindung zwischen den beiden internetroutern oder ein zusaetzlicher vpn-router. das kostet allerdings etwas.

tschuess

Gerade habe ich versucht die Sache noch einmal nachzuvollziehen und lustigerweise muss ich jetzt im MQTT Explorer ein Keepalive senden, um die Daten zu bekommen.
Fragt sich nur wie das ganze im ioBroker Mqtt Client verarbeiten kann.

Inzwischen bekomme ich die Daten, aber das Problem liegt beim Keepalive - sende ich das Keepalive über den Mqtt-Explorer werden die Werte aktualisiert - auch im ioBroker, sende ich das Keepalive über ioBroker passiert nichts.

hallo,
also ich nutze entweder den mosquitto mqtt-client mit einem shell-script inclusive einem teil, der regelmaessig einen keep-alive sendet oder node-red und da hatte noch nie ein problem mit dem keep-alive.

generell muss immer ein keep-alive gesendet werden, sonst wird durch einen timeout die verbindung getrennt. die frage ist also nur, macht der client das automatisch oder nicht?

dabei wird beim keep-alive wohl nur die ip ausgewertet, er muss also nicht ueber die gleiche verbindung wie der datenabruf erfolgen.

tschuess

Ich habe nun Node Red genommen, um den Keepalive zu senden und jetzt kommen Werte, aber so wie ich das jetzt übersehen kann fehlen einige Werte.
Die Werte werden als “value”: -3.700000047683716, da muss ich das “value” noch weg bekommen.

hallo,
wenn du node-red benutzt, um die daten zu uebertragen, kannst du mit einem kleinen programm die daten aendern.
zwischen dem abrufenden und sendenden node reicht eventuell schon ein sehr kurzes script:
msg.payload=msg.payload.value

ich weiss jetzt leider nicht mehr, ob ich mein script noch habe und auf meinem server laeuft node-red jedenfalls nicht mehr, ich muesste es erst mal starten.

du kannst auch das topic anpassen und so die id des systems entfernen oder durch einen namen ersetzen.

das mit dem value ist auch der grund, warum man die daten nicht einfach von einem anderen system abrufen und weiterverarbeiten kann. wenn das zielsystem z.B. eine datenbank benutzt, um werte zu speichern, dann koennen keine werte, sondern nur text gespeichert werden und fast alle auswertungsprogramm scheitern dann daran, dass sie anstatt einen wert die zeichenfolge value: wert vorfinden.

aber wie gesagt, der datentransfer ueber node-red bedeutet eine hohe belastung des systems und ein cerbo-gx ist dafuer auf jeden fall zu schwach!

tschuess

Das Node Red ist das lokale von ioBroker, also keine Belastung und das stößt auch nur das Keepalive vom VRM an, damit die Daten weiter gesendet werden.

Deswegen kann ich da auch nichts wg. der Art des Sendens ändern.
Ich kann das aber im ioBroker machen.
Ich habe eine Lösung um einzelne Werte anzufassen, aber noch keine um alle Werte zu ändern, aber ich bleibe dran.

Hi,

wenn du bereits einen eigenen MQTT-Server verwendest (der vom cerbo aus erreichbar wäre), dann könntest du auch meinen “MQTT-Exporter” verwenden.

Das spart das unnötige “Keep-Alive” von tausenden Werten und schickt einfach die, die man will an den “eigenen” MQTT:

ist ein Service in meinem es-ESS, kannst aber alles andere natürlich deaktiviert lassen.

Wouw, genial was Du da programmiert hast

1 Like

hallo,
das ist der flow, den ich benutzt habe, um nur bestimmte werte zu uebertragen:
[
{
“id”: “5d1392c88d08c0dd”,
“type”: “mqtt in”,
“z”: “f47eab9119cf0ef8”,
“d”: true,
“name”: “”,
“topic”: “N/#”,
“qos”: “2”,
“datatype”: “auto-detect”,
“broker”: “488978ebf5ad2352”,
“nl”: false,
“rap”: true,
“rh”: 0,
“inputs”: 0,
“x”: 150,
“y”: 160,
“wires”: [
[
“e379a5150e1f6308”
]
]
},
{
“id”: “e379a5150e1f6308”,
“type”: “function”,
“z”: “f47eab9119cf0ef8”,
“name”: “mqtt filtern und aufbereiten master”,
“func”: “var SUCH = ["current","voltage","power","soc","S","V","I","P","Yield/System","Yield/User","AcPowerSetpoint","BatteryOperationalLimits"];\nglobal.set("SUCH",SUCH);\n//node.warn(msg.payload);\nvar ST=false;\nvar L = SUCH.length;\nvar N,T,S,A;\nT=msg.topic;\n//node.warn(T);\nfor (N=0;N<L && !ST;N++) {\n S=new RegExp("/"+SUCH[N]+"$","i");\n// S=/current/i;\n A=T.match(S);\n// node.warn(A+" "+S+" "+T);\n ST=A!=null && A.length>0;\n}\nmsg.payload=msg.payload.value;\nif (msg.payload==null || !ST) return;\nif (context.TOPIC == msg.topic && context.WERT == msg.payload) return;\ncontext.TOPIC=msg.topic;\ncontext.WERT=msg.payload;\nreturn msg;”,
“outputs”: 1,
“timeout”: 0,
“noerr”: 0,
“initialize”: “// Der Code hier wird ausgeführt,\n// wenn der Node gestartet wird\ncontext.TOPIC="";\ncontext.WERT="";”,
“finalize”: “”,
“libs”: ,
“x”: 420,
“y”: 200,
“wires”: [
[
“580ca1bac9bf3f2d”
]
]
},
{
“id”: “580ca1bac9bf3f2d”,
“type”: “mqtt out”,
“z”: “f47eab9119cf0ef8”,
“name”: “”,
“topic”: “”,
“qos”: “”,
“retain”: “”,
“respTopic”: “”,
“contentType”: “”,
“userProps”: “”,
“correl”: “”,
“expiry”: “”,
“broker”: “d74c8a65d39f9a38”,
“x”: 670,
“y”: 280,
“wires”:
},
{
“id”: “488978ebf5ad2352”,
“type”: “mqtt-broker”,
“name”: “cerbo-1”,
“broker”: “192.168.13.100”,
“port”: “1883”,
“clientid”: “”,
“autoConnect”: true,
“usetls”: false,
“protocolVersion”: “4”,
“keepalive”: “60”,
“cleansession”: true,
“autoUnsubscribe”: true,
“birthTopic”: “”,
“birthQos”: “0”,
“birthRetain”: “false”,
“birthPayload”: “”,
“birthMsg”: {},
“closeTopic”: “”,
“closeQos”: “0”,
“closeRetain”: “false”,
“closePayload”: “”,
“closeMsg”: {},
“willTopic”: “”,
“willQos”: “0”,
“willRetain”: “false”,
“willPayload”: “”,
“willMsg”: {},
“userProps”: “”,
“sessionExpiry”: “”
},
{
“id”: “d74c8a65d39f9a38”,
“type”: “mqtt-broker”,
“name”: “m1”,
“broker”: “127.0.0.1”,
“port”: “1883”,
“clientid”: “”,
“autoConnect”: true,
“usetls”: false,
“protocolVersion”: “4”,
“keepalive”: “60”,
“cleansession”: true,
“autoUnsubscribe”: true,
“birthTopic”: “”,
“birthQos”: “0”,
“birthRetain”: “false”,
“birthPayload”: “”,
“birthMsg”: {},
“closeTopic”: “”,
“closeQos”: “0”,
“closeRetain”: “false”,
“closePayload”: “”,
“closeMsg”: {},
“willTopic”: “”,
“willQos”: “0”,
“willRetain”: “false”,
“willPayload”: “”,
“willMsg”: {},
“userProps”: “”,
“sessionExpiry”: “”
}
]

Vielen Dank für die Hilfe, ich kann auf die Daten zugreifen und weiter verwenden.
Das es-ESS ist echt interessant, das werde ich mir auf jeden Fall nochmal genauer anschauen.

Gruss
Olli

1 Like