Daten auslesen mit Homematic?
Daten auslesen mit Homematic?
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?
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?
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);
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?
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.
Kann ich gerne erklären falls Bedarf besteht. Man weiß ja auch nicht wie lange die alte API bei OpenWB noch unterstützt wird.
-
- Beiträge: 3421
- Registriert: Sa Feb 20, 2021 9:55 am
- Has thanked: 4 times
- Been thanked: 59 times
Re: Daten auslesen mit Homematic?
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":""}]
openWB-series2, openWB-Buchse, E3/DC S10pro+19.5kWh, 30kWp Ost-Süd, Model 3 und Ion
Re: Daten auslesen mit Homematic?
Ich habe in der CCU zuerst zwei Variablen erstellt (WBLadestatus als Werteliste mit den möglichen Status und WBPlug als Bool).Gero hat geschrieben: ↑Di Mai 18, 2021 9:29 amDas 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.
In Node Red sieht es dann so aus: 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":""}]
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?
DrCain hat geschrieben: ↑Do Mai 20, 2021 8:46 amIch habe in der CCU zuerst zwei Variablen erstellt (WBLadestatus als Werteliste mit den möglichen Status und WBPlug als Bool).Gero hat geschrieben: ↑Di Mai 18, 2021 9:29 amDas 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.
In Node Red sieht es dann so aus: 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:Zweiter 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":""}]
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
-
- Beiträge: 3421
- Registriert: Sa Feb 20, 2021 9:55 am
- Has thanked: 4 times
- Been thanked: 59 times
Re: Daten auslesen mit Homematic?
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.
openWB-series2, openWB-Buchse, E3/DC S10pro+19.5kWh, 30kWp Ost-Süd, Model 3 und Ion
Re: Daten auslesen mit Homematic?
Hallo zusammen!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);
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!
-
- Beiträge: 3421
- Registriert: Sa Feb 20, 2021 9:55 am
- Has thanked: 4 times
- Been thanked: 59 times
Re: Daten auslesen mit Homematic?
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.
Ich hab‘ das so und kann da eben helfen was zusammenzuklicken. Musst mir nur sagen, welche Werte du in welche Systemvariablen reingeschrieben haben magst.
openWB-series2, openWB-Buchse, E3/DC S10pro+19.5kWh, 30kWp Ost-Süd, Model 3 und Ion