Seite 1 von 2

Daten auslesen mit Homematic?

Verfasst: Sa Dez 05, 2020 4:57 pm
von wb-2020
Ich nutze Homematic als Haussteuerung und lese damit auch verschiedene andere vernetzte Geräte aus. Fachlich bin ich dabei allerdings Laie. Ich nutze immer Anleitungen von anderen, was auch ganz gut klappt.

Ich würde von der openWB bzw. vom EVU Kit gerne den Hausverbrauch und ggf. den Netzbezug, bzw. die Einspeisung auslesen. Hat das jemand schon gemacht und im besten Fall eine Mini-Anleitung dazu?

Re: Daten auslesen mit Homematic?

Verfasst: Mo Mai 17, 2021 4:45 pm
von AndreasT
Hallo,
ja, das geht per homematic Skript. Hier eine Kurzfassung:
CUxD sollte auf der Homematic installiert sein und dort das CUxD Gerät CUX2801001 eingerichtet sein (findet man im www).
Ein Programm anlegen welches über die Zeitsteuerung der homematic regelmäßig (ich lasse es alle 3 Minuten laufen) das nachfolgende Skrip ausführt.
Es gibt noch mehr Daten, die man auslesen kann - ich habe mich auf die mir wichtigen beschränkt.
Welche Daten von der openwb per HTTP Request zurückgegeben werden ist in diesem Forum unter "OpenWB API" zu finden.
Ich habe die Vorzeichen bei den Leistungswerten so eingerichtet, dass sämtliche Leistung, die dem "Haus" zufließen (sei es aus dem PV Generator, dem Hausanschluss oder aus dem Speicher) positiv zählen, alles was aus dem "Haus" abfließt (Hausverbrauch, Ladeleistung in den Speicher und in die Fahrzeuge, Abgabe Leistung über evu) negativ zählen

Viel Erfolg!

Skript:

! Daten von openwb holen - eigene openWB erforderlich

!zuerst folgende Systemvariablen anlegen
!Achtung: keine vergessen und exakte Schreibweise mit Copy & Paste

!OWB_Aktualisierung Zeichenkette Datum date
!OWB_PV_Leistung Zahl Watt pvw
!OWB_Hausanschluss Zahl Watt evuw
!OWB_Sp_Ladung Zahl % speichersoc
!OWB_Sp_Leistung Zahl Watt speicherleistung
!OWB_Lp1_Leistung Zahl Watt lllp1
!OWB_LP2_Leistung Zahl Watt lllp2
!OWB_Lp1_Lademenge Zahl Wh gelkwhlp1
!OWB_Lp2_Lademenge Zahl Wh gelkwhlp2



! openwb api: openwbIP = die IP Deiner openwb
var url ="http://openwbIP/openWB/web/api.php?get=all";

! Abfrage der openwb mit CUxD und Antwort in string schreiben

dom.GetObject("CUxD.CUX2801001:10.CMD_SETS").State("wget --no-check-certificate -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:10.CMD_QUERY_RET").State(1);
string openwb_xml = dom.GetObject("CUxD.CUX2801001:10.CMD_RETS").State();

! Schlüsselwoerter im String finden und Daten in Systemvariablen schreiben

string word = "date";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 19);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
dom.GetObject("OWB_Aktualisierung").State(daten);

string word = "pvw";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("OWB_PV_Leistung").State(zahl);

string word = "evuw";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("OWB_Hausanschluss").State(zahl);

string word = "speichersoc";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("OWB_Sp_Ladung").State(zahl);

! Umrechnung des Speichersoc (wird in % geleifert) in kWh (mein Speicher hat 23,4 kWh voll geladen)

real zahl = 0.234 * dom.GetObject("OWB_Sp_Ladung").Value();
dom.GetObject("OWB_Sp_Ladung_kWh").State(zahl);

string word = "speicherleistung";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("OWB_Sp_Leistung").State(zahl);

string word = "lllp1";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("OWB_Lp1_Leistung").State(zahl);

string word = "lllp2";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("OWB_Lp2_Leistung").State(zahl);

string word = "gelkwhlp1";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("OWB_Lp1_Lademenge").State(zahl);

string word = "gelkwhlp2";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("OWB_Lp2_Lademenge").State(zahl);

! Hausverbrauch berechnen (wird von openwb im String nicht mit geliefert)

real zahl = -1 * (dom.GetObject("OWB_PV_Leistung").Value()
+ dom.GetObject("OWB_Hausanschluss").Value()
+ dom.GetObject("OWB_Sp_Leistung").Value()
+ dom.GetObject("OWB_Lp1_Leistung").Value()
+ dom.GetObject("OWB_Lp2_Leistung").Value());
dom.GetObject("OWB_Hausverbrauch").State(zahl);

Re: Daten auslesen mit Homematic?

Verfasst: Mo Mai 17, 2021 7:47 pm
von DrCain
Ich lese fast alle Verbrauchsdaten schon direkt aus dem WR per Script in Homematic ein, aber ich habe mir mit dem RedMatic Addon für die CCU etwas gebastelt um den Status des Ladeports (eingesteckt oder nicht) und der Ladung (PV, Sofort, etc.) per MQTT in Homematic verfügbar und steuerbar zu machen.
Kann ich gerne erklären falls Bedarf besteht. Man weiß ja auch nicht wie lange die alte API bei OpenWB noch unterstützt wird.

Re: Daten auslesen mit Homematic?

Verfasst: Di Mai 18, 2021 9:29 am
von Gero
DrCain hat geschrieben: Mo Mai 17, 2021 7:47 pm ...RedMatic Addon für die CCU etwas gebastelt um den Status des Ladeports (eingesteckt oder nicht) und der Ladung (PV, Sofort, etc.) per MQTT in Homematic verfügbar und steuerbar zu machen.
Das würde mich auch interessieren, wie es in diese Richtung geht. Aktuell gebe ich von HM-Aktoren gemessene Leistungen an die openWB zum Loggen zurück. Das ist mit redmatic relativ simpel.

Hier mein Flow, der zwei Schaltaktoren ausliest. Der erste setzt noch zusätzlich den Standbyverbrauch des Geschirrspülers auf 0.

Code: Alles auswählen

[{"id":"79c2bf1e.6c49d8","type":"http in","z":"ddd08f77.aa95c8","name":"","url":"/geschirrspueler","method":"get","upload":false,"swaggerDoc":"","x":190,"y":140,"wires":[["4d1f20f4.10ee88"]]},{"id":"809ba1d4.882f38","type":"http response","z":"ddd08f77.aa95c8","name":"","statusCode":"","headers":{},"x":930,"y":180,"wires":[]},{"id":"4d1f20f4.10ee88","type":"ccu-get-value","z":"ddd08f77.aa95c8","name":"","ccuConfig":"38263145.35ea0e","iface":"BidCos-RF","channel":"OEQ1974198:2 Spülmaschine:2","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"POWER","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":420,"y":140,"wires":[["8ec04d1f.e376e8"]]},{"id":"f64980c4.d0001","type":"http in","z":"ddd08f77.aa95c8","name":"","url":"/espresso","method":"get","upload":false,"swaggerDoc":"","x":170,"y":300,"wires":[["9346b6ae.a3bf8"]]},{"id":"25e88f6b.888dd8","type":"http response","z":"ddd08f77.aa95c8","name":"","statusCode":"","headers":{},"x":710,"y":300,"wires":[]},{"id":"9346b6ae.a3bf8","type":"ccu-get-value","z":"ddd08f77.aa95c8","name":"","ccuConfig":"38263145.35ea0e","iface":"BidCos-RF","channel":"KEQ0966018:2 Schalti:2","sysvar":"Alarmmeldungen","sysvarProperty":"value","datapoint":"POWER","datapointProperty":"value","setProp":"payload","setPropType":"msg","x":420,"y":300,"wires":[["25e88f6b.888dd8"]]},{"id":"a6e352da.1c8d4","type":"http response","z":"ddd08f77.aa95c8","name":"","statusCode":"","headers":{},"x":750,"y":200,"wires":[]},{"id":"8ec04d1f.e376e8","type":"switch","z":"ddd08f77.aa95c8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"2","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":570,"y":140,"wires":[["4d0cea78.b87374"],["a6e352da.1c8d4"]]},{"id":"4d0cea78.b87374","type":"change","z":"ddd08f77.aa95c8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"0","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":120,"wires":[["809ba1d4.882f38"]]},{"id":"38263145.35ea0e","type":"ccu-connection","name":"localhost","host":"localhost","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":false,"cuxdEnabled":false,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"127.0.0.1","rpcServerHost":"127.0.0.1","rpcBinPort":"2047","rpcXmlPort":"2048","queueTimeout":"5000","queuePause":"250","contextStore":""}]

Re: Daten auslesen mit Homematic?

Verfasst: Do Mai 20, 2021 8:46 am
von DrCain
Gero hat geschrieben: Di Mai 18, 2021 9:29 am
DrCain hat geschrieben: Mo Mai 17, 2021 7:47 pm ...RedMatic Addon für die CCU etwas gebastelt um den Status des Ladeports (eingesteckt oder nicht) und der Ladung (PV, Sofort, etc.) per MQTT in Homematic verfügbar und steuerbar zu machen.
Das würde mich auch interessieren, wie es in diese Richtung geht. Aktuell gebe ich von HM-Aktoren gemessene Leistungen an die openWB zum Loggen zurück. Das ist mit redmatic relativ simpel.

Hier mein Flow, der zwei Schaltaktoren ausliest. Der erste setzt noch zusätzlich den Standbyverbrauch des Geschirrspülers auf 0.
Ich habe in der CCU zuerst zwei Variablen erstellt (WBLadestatus als Werteliste mit den möglichen Status und WBPlug als Bool).
In Node Red sieht es dann so aus:
node_red.jpg
Der erste Flow liest den Lademodus von der OpenWB aus und schreibt ihn in die Homematic Variable. Sollte letztere sich ändern schickt er den geänderten Modus wieder zurück in die OpenWB.
Der zweite Flow liest nur den "Angesteckt" Status der OpenWB aus und schreibt ihn in die Homematic Variable.
Damit habe ich mir dann ein Homematic Programm geschrieben, dass den Lademodus auf Stop setzt, sobald ich das Haus verlasse und ihn auf PV-Laden setzt sobald eingesteckt wird während ich daheim bin oder sobald ich heimkomme während das Auto angesteckt ist.

Die "MQTT in" Node holt sich den Status von der OpenWB und schreibt ihn in die Homematic Systemvariable.
Beim ersten String musste ich noch von Nummern (was die Homematic Variable liefert) zu String (was MQTT erwartet) übersetzen. Und beim zweiten von String nach Boolean.

Erster Flow:

Code: Alles auswählen

[{"id":"83a61214.b06dd","type":"mqtt in","z":"b47e4440.f97278","name":"ChargeMode","topic":"openWB/global/ChargeMode","qos":"2","datatype":"auto","broker":"c4cb83c8.1bd0c","x":130,"y":300,"wires":[["a7003d75.604c3"]]},{"id":"a7003d75.604c3","type":"ccu-sysvar","z":"b47e4440.f97278","name":"WBLadestatus","ccuConfig":"38263145.35ea0e","topic":"ReGaHSS/${Name}","change":true,"cache":true,"x":340,"y":300,"wires":[["550f5034.21bc"]]},{"id":"b0a75afa.3caf48","type":"mqtt out","z":"b47e4440.f97278","name":"ChargeMode","topic":"openWB/set/ChargeMode","qos":"1","retain":"true","broker":"c4cb83c8.1bd0c","x":710,"y":300,"wires":[]},{"id":"550f5034.21bc","type":"change","z":"b47e4440.f97278","name":"toString","rules":[{"t":"change","p":"payload","pt":"msg","from":"0","fromt":"num","to":"0","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"1","fromt":"num","to":"1","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"2","fromt":"num","to":"2","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"3","fromt":"num","to":"3","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"4","fromt":"num","to":"4","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":300,"wires":[["b0a75afa.3caf48"]]},{"id":"c4cb83c8.1bd0c","type":"mqtt-broker","name":"OpenWB","broker":"192.168.111.20","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"38263145.35ea0e","type":"ccu-connection","name":"localhost","host":"localhost","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":true,"cuxdEnabled":false,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"127.0.0.1","rpcServerHost":"127.0.0.1","rpcBinPort":"2047","rpcXmlPort":"2048","queueTimeout":"5000","queuePause":"250","contextStore":""}]
Zweiter Flow:

Code: Alles auswählen

[{"id":"bec93652.60eff8","type":"mqtt in","z":"b47e4440.f97278","name":"PlugStat","topic":"openWB/lp/1/boolPlugStat","qos":"2","datatype":"auto","broker":"c4cb83c8.1bd0c","x":180,"y":420,"wires":[["c14f2724.4b4148"]]},{"id":"11a59b94.2baf44","type":"ccu-sysvar","z":"b47e4440.f97278","name":"WBPlug","ccuConfig":"38263145.35ea0e","topic":"ReGaHSS/${Name}","change":false,"cache":true,"x":520,"y":420,"wires":[[]]},{"id":"c14f2724.4b4148","type":"change","z":"b47e4440.f97278","name":"to Boolean","rules":[{"t":"change","p":"payload","pt":"msg","from":"1","fromt":"str","to":"true","tot":"bool"},{"t":"change","p":"payload","pt":"msg","from":"0","fromt":"str","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":420,"wires":[["11a59b94.2baf44"]]},{"id":"c4cb83c8.1bd0c","type":"mqtt-broker","name":"OpenWB","broker":"192.168.111.20","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"38263145.35ea0e","type":"ccu-connection","name":"localhost","host":"localhost","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":true,"cuxdEnabled":false,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"127.0.0.1","rpcServerHost":"127.0.0.1","rpcBinPort":"2047","rpcXmlPort":"2048","queueTimeout":"5000","queuePause":"250","contextStore":""}]

Re: Daten auslesen mit Homematic?

Verfasst: Sa Nov 11, 2023 5:50 pm
von Dirkschr
DrCain hat geschrieben: Do Mai 20, 2021 8:46 am
Gero hat geschrieben: Di Mai 18, 2021 9:29 am
DrCain hat geschrieben: Mo Mai 17, 2021 7:47 pm ...RedMatic Addon für die CCU etwas gebastelt um den Status des Ladeports (eingesteckt oder nicht) und der Ladung (PV, Sofort, etc.) per MQTT in Homematic verfügbar und steuerbar zu machen.
Das würde mich auch interessieren, wie es in diese Richtung geht. Aktuell gebe ich von HM-Aktoren gemessene Leistungen an die openWB zum Loggen zurück. Das ist mit redmatic relativ simpel.

Hier mein Flow, der zwei Schaltaktoren ausliest. Der erste setzt noch zusätzlich den Standbyverbrauch des Geschirrspülers auf 0.
Ich habe in der CCU zuerst zwei Variablen erstellt (WBLadestatus als Werteliste mit den möglichen Status und WBPlug als Bool).
In Node Red sieht es dann so aus:
node_red.jpg
Der erste Flow liest den Lademodus von der OpenWB aus und schreibt ihn in die Homematic Variable. Sollte letztere sich ändern schickt er den geänderten Modus wieder zurück in die OpenWB.
Der zweite Flow liest nur den "Angesteckt" Status der OpenWB aus und schreibt ihn in die Homematic Variable.
Damit habe ich mir dann ein Homematic Programm geschrieben, dass den Lademodus auf Stop setzt, sobald ich das Haus verlasse und ihn auf PV-Laden setzt sobald eingesteckt wird während ich daheim bin oder sobald ich heimkomme während das Auto angesteckt ist.

Die "MQTT in" Node holt sich den Status von der OpenWB und schreibt ihn in die Homematic Systemvariable.
Beim ersten String musste ich noch von Nummern (was die Homematic Variable liefert) zu String (was MQTT erwartet) übersetzen. Und beim zweiten von String nach Boolean.

Erster Flow:

Code: Alles auswählen

[{"id":"83a61214.b06dd","type":"mqtt in","z":"b47e4440.f97278","name":"ChargeMode","topic":"openWB/global/ChargeMode","qos":"2","datatype":"auto","broker":"c4cb83c8.1bd0c","x":130,"y":300,"wires":[["a7003d75.604c3"]]},{"id":"a7003d75.604c3","type":"ccu-sysvar","z":"b47e4440.f97278","name":"WBLadestatus","ccuConfig":"38263145.35ea0e","topic":"ReGaHSS/${Name}","change":true,"cache":true,"x":340,"y":300,"wires":[["550f5034.21bc"]]},{"id":"b0a75afa.3caf48","type":"mqtt out","z":"b47e4440.f97278","name":"ChargeMode","topic":"openWB/set/ChargeMode","qos":"1","retain":"true","broker":"c4cb83c8.1bd0c","x":710,"y":300,"wires":[]},{"id":"550f5034.21bc","type":"change","z":"b47e4440.f97278","name":"toString","rules":[{"t":"change","p":"payload","pt":"msg","from":"0","fromt":"num","to":"0","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"1","fromt":"num","to":"1","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"2","fromt":"num","to":"2","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"3","fromt":"num","to":"3","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"4","fromt":"num","to":"4","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":300,"wires":[["b0a75afa.3caf48"]]},{"id":"c4cb83c8.1bd0c","type":"mqtt-broker","name":"OpenWB","broker":"192.168.111.20","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"38263145.35ea0e","type":"ccu-connection","name":"localhost","host":"localhost","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":true,"cuxdEnabled":false,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"127.0.0.1","rpcServerHost":"127.0.0.1","rpcBinPort":"2047","rpcXmlPort":"2048","queueTimeout":"5000","queuePause":"250","contextStore":""}]
Zweiter Flow:

Code: Alles auswählen

[{"id":"bec93652.60eff8","type":"mqtt in","z":"b47e4440.f97278","name":"PlugStat","topic":"openWB/lp/1/boolPlugStat","qos":"2","datatype":"auto","broker":"c4cb83c8.1bd0c","x":180,"y":420,"wires":[["c14f2724.4b4148"]]},{"id":"11a59b94.2baf44","type":"ccu-sysvar","z":"b47e4440.f97278","name":"WBPlug","ccuConfig":"38263145.35ea0e","topic":"ReGaHSS/${Name}","change":false,"cache":true,"x":520,"y":420,"wires":[[]]},{"id":"c14f2724.4b4148","type":"change","z":"b47e4440.f97278","name":"to Boolean","rules":[{"t":"change","p":"payload","pt":"msg","from":"1","fromt":"str","to":"true","tot":"bool"},{"t":"change","p":"payload","pt":"msg","from":"0","fromt":"str","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":420,"wires":[["11a59b94.2baf44"]]},{"id":"c4cb83c8.1bd0c","type":"mqtt-broker","name":"OpenWB","broker":"192.168.111.20","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"38263145.35ea0e","type":"ccu-connection","name":"localhost","host":"localhost","regaEnabled":true,"bcrfEnabled":true,"iprfEnabled":true,"virtEnabled":true,"bcwiEnabled":true,"cuxdEnabled":false,"regaPoll":true,"regaInterval":"30","rpcPingTimeout":"60","rpcInitAddress":"127.0.0.1","rpcServerHost":"127.0.0.1","rpcBinPort":"2047","rpcXmlPort":"2048","queueTimeout":"5000","queuePause":"250","contextStore":""}]

Hallo DrCain, ich habe eine Frage, oder besser benötige einmal Deine Hilfe.

Ich versuche das gerade so hin zu bekommen, wie Du es dargestellt hast.
Das läuft auch schon so in etwa.
Allerdings weiß ich nicht, wie ich an die Werte für die Variable (WBLadestatus als Werteliste mit den möglichen Status) herankommen soll.

Kannst Du ggf. Deine Werteliste einmal zeigen...?
Das ist jetzt noch das einzige das mir fehlt, dann kann ich damit meinen Ohmpilot ansteuern, oder besser gezielt ausschalten...

Ich hoffe Du kannst mir helfen.

Dirk

Re: Daten auslesen mit Homematic?

Verfasst: Mo Nov 13, 2023 8:17 am
von Gero
Dirkschr hat geschrieben: Sa Nov 11, 2023 5:50 pm Allerdings weiß ich nicht, wie ich an die Werte für die Variable (WBLadestatus als Werteliste mit den möglichen Status) herankommen soll.
Du kannst bei der Definition der Systemvariablen eine Werteliste hinterlegen. Die wird gemeint sein. Die möglichen Werte sind die, die Du per MQTT auch aus dem Chargemode der openWB auslesen kannst.

Re: Daten auslesen mit Homematic?

Verfasst: Mo Feb 26, 2024 10:15 am
von ToFu
AndreasT hat geschrieben: Mo Mai 17, 2021 4:45 pm Hallo,
ja, das geht per homematic Skript. Hier eine Kurzfassung:
CUxD sollte auf der Homematic installiert sein und dort das CUxD Gerät CUX2801001 eingerichtet sein (findet man im www).
Ein Programm anlegen welches über die Zeitsteuerung der homematic regelmäßig (ich lasse es alle 3 Minuten laufen) das nachfolgende Skrip ausführt.
Es gibt noch mehr Daten, die man auslesen kann - ich habe mich auf die mir wichtigen beschränkt.
Welche Daten von der openwb per HTTP Request zurückgegeben werden ist in diesem Forum unter "OpenWB API" zu finden.
Ich habe die Vorzeichen bei den Leistungswerten so eingerichtet, dass sämtliche Leistung, die dem "Haus" zufließen (sei es aus dem PV Generator, dem Hausanschluss oder aus dem Speicher) positiv zählen, alles was aus dem "Haus" abfließt (Hausverbrauch, Ladeleistung in den Speicher und in die Fahrzeuge, Abgabe Leistung über evu) negativ zählen

Viel Erfolg!

Skript:

! Daten von openwb holen - eigene openWB erforderlich

!zuerst folgende Systemvariablen anlegen
!Achtung: keine vergessen und exakte Schreibweise mit Copy & Paste

!OWB_Aktualisierung Zeichenkette Datum date
!OWB_PV_Leistung Zahl Watt pvw
!OWB_Hausanschluss Zahl Watt evuw
!OWB_Sp_Ladung Zahl % speichersoc
!OWB_Sp_Leistung Zahl Watt speicherleistung
!OWB_Lp1_Leistung Zahl Watt lllp1
!OWB_LP2_Leistung Zahl Watt lllp2
!OWB_Lp1_Lademenge Zahl Wh gelkwhlp1
!OWB_Lp2_Lademenge Zahl Wh gelkwhlp2



! openwb api: openwbIP = die IP Deiner openwb
var url ="http://openwbIP/openWB/web/api.php?get=all";

! Abfrage der openwb mit CUxD und Antwort in string schreiben

dom.GetObject("CUxD.CUX2801001:10.CMD_SETS").State("wget --no-check-certificate -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:10.CMD_QUERY_RET").State(1);
string openwb_xml = dom.GetObject("CUxD.CUX2801001:10.CMD_RETS").State();

! Schlüsselwoerter im String finden und Daten in Systemvariablen schreiben

string word = "date";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 19);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
dom.GetObject("OWB_Aktualisierung").State(daten);

string word = "pvw";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("OWB_PV_Leistung").State(zahl);

string word = "evuw";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("OWB_Hausanschluss").State(zahl);

string word = "speichersoc";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("OWB_Sp_Ladung").State(zahl);

! Umrechnung des Speichersoc (wird in % geleifert) in kWh (mein Speicher hat 23,4 kWh voll geladen)

real zahl = 0.234 * dom.GetObject("OWB_Sp_Ladung").Value();
dom.GetObject("OWB_Sp_Ladung_kWh").State(zahl);

string word = "speicherleistung";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("OWB_Sp_Leistung").State(zahl);

string word = "lllp1";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("OWB_Lp1_Leistung").State(zahl);

string word = "lllp2";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = -1.0 * daten.ToFloat();
dom.GetObject("OWB_Lp2_Leistung").State(zahl);

string word = "gelkwhlp1";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("OWB_Lp1_Lademenge").State(zahl);

string word = "gelkwhlp2";
integer word_laenge = word.Length();
integer word_position = openwb_xml.Find(word);
string daten = openwb_xml.Substr((word_position + word_laenge +3), 10);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));
real zahl = daten.ToFloat();
dom.GetObject("OWB_Lp2_Lademenge").State(zahl);

! Hausverbrauch berechnen (wird von openwb im String nicht mit geliefert)

real zahl = -1 * (dom.GetObject("OWB_PV_Leistung").Value()
+ dom.GetObject("OWB_Hausanschluss").Value()
+ dom.GetObject("OWB_Sp_Leistung").Value()
+ dom.GetObject("OWB_Lp1_Leistung").Value()
+ dom.GetObject("OWB_Lp2_Leistung").Value());
dom.GetObject("OWB_Hausverbrauch").State(zahl);
Hallo zusammen!
Ich hatte bislang die Abfrage der Daten aus der OpenWB wie hier beschrieben ohne Probleme am laufen. Seit dem ich aber Das Update der OpenWB auf die Software 2 gemacht habe funktioniert diese leider nicht mehr. Bislang konnte ich aber auch nichts finden, ob da etwas angepasst werden muss, oder dieser Weg nicht mehr funktioniert.
Kann mir da jemand helfen?
Vielen Dank im Voraus!

Re: Daten auslesen mit Homematic?

Verfasst: Mo Feb 26, 2024 10:21 am
von LutzB
Das müsste komplett anders aufgezogen werden. Die verwendete API gibt es in 2.x nicht mehr.

Re: Daten auslesen mit Homematic?

Verfasst: Mo Feb 26, 2024 5:16 pm
von Gero
Am einfachsten ist es mit der Zusatzsoftware Redmatic. Das ist ein nodeRED angepasst auf die homematic-CCU3. Die Anpassung beinhaltet einfaches lesen und schreiben von Systemvariablen und auch Schalten von Aktoren ist einfach möglich.

Ich hab‘ das so und kann da eben helfen was zusammenzuklicken. Musst mir nur sagen, welche Werte du in welche Systemvariablen reingeschrieben haben magst.