Diese Seite wurde vor mehr als 2 Jahren erstellt und vor über einem Monat zuletzt bearbeitet. Eventuell ist längst ihr Mindesthaltbarkeitsdatum überschritten!
Zur Steuerung verschiedener Abläufe muss die CCU die aktuellen Daten der PV-Anlage (Status, Produktion, Verbrauch und somit auch Einspeisung bzw. Bezug) kennen.
Dieses Skript kann zeitgesteuert auf der CCU ausgeführt werden. Es überträgt die Daten des Wechselrichters in Systemvariablen der HomeMatic-Zentrale, z.B. zeitgesteuert alle 5 Minuten:
Auf der CCU folgende Systemvariablen anlegen:
Haus_Verbrauch
, Typ: Integer, Einheit WattPVA_Produktion
, Typ: Integer, Einheit WattStrom_Einspeisung
, Typ: Integer, Einheit WattStrom_Bezug
, Typ: Integer, Einheit WattPVA_Status
, Typ: StringDazu einen CUxD-Gerät, Typ "Exec", siehe hier.
Hier das Skript, das die Aufgabe erledigt. Die Konfiguration in den markierten Zeilen muss angepasst werden, auch
die ID des CUxD-Geräts (hier CUxD.CUX2801001:4
). Die HM Sprach-Referenz für Skripte ist hier
zu finden.
Das Skript benötigt neben dem Wechselrichter auch einen S0-Zähler wie z.B. einen Fronius Smart Meter 63A-3,
verbaut bei mir nach dem Einspeisepunkt, in der Hauptleitung zum Haus, für die Messung des Verbrauchs mit
GetMeterRealtimeData
!
Der Ort (Übergabepunkt/Verbrauchspfad) des Zählers muss zum einen im im Wechselrichter korrekt gesetzt werden, damit dieser richtig verrechnet.
Zudem muss die Logik im Skript (Erzeugung PV - Verbrauch Haus = Einspeisung) angepasst werden, wenn der Zähler z.B. vor der PV-Einspeisung den Bezug/die Einspeisung zählt und der Haus-Verbrauch dann aus diesem Wert und der Produktion errechnet werden muss. (In Diesem Fall dann Einspeisung - Produktion = -Verbrauch Haus).
Also, nachdenken und Formeln wie benötigt anpassen/umstellen.
Dies ist ein Rohgerüst ohne Fehlerbehandlung. "Works for me", macht was draus.
! Daten von Fronius-Wechselrichter an CCU übertragen
! Stefan Onderka, www.onderka.com
! Benötigt CCU mit installiertem CUxD
!-----------------------------------------------------------------------------
! IP des Fronius Wechselrichters
var froniusIP = "192.168.129.7";
! Device ID Wechselrichter (meistens "1")
var deviceID = "1";
! CUxD-Gerät
var CUxD_Device = "CUxD.CUX2801001:4";
! Variable für Verbrauch
string variable_verbrauch = "Haus_Verbrauch";
! Variable für Produktion
string variable_erzeugung = "PVA_Produktion";
! Variable Strom Einspeisung
string variable_einspeisung = "Strom_Einspeisung";
! Variable Strom Bezug
string variable_bezug = "Strom_Bezug";
! Variable WR-Status
string variable_status = "PVA_Status";
!-----------------------------------------------------------------------------
string pos1;
string pos2 = ",";
string pos3 = ":";
real wertVerbrauchRoh;
real wertVerbrauch;
real wertErzeugung = 0;
real wertEinspeisung;
real wertBezug;
real wertStatus;
integer wert_pos;
var stdout;
string url = "http://" + froniusIP + "/solar_api/v1/";
string verbrauchParam = "GetMeterRealtimeData.cgi?Scope=System";
string erzeugungParam = "GetInverterRealtimeData.cgi?Scope=Device&DeviceId=" + deviceID + "&DataCollection=CommonInverterData";
! Status
!-----------------------------------------------------------------------------
! Test im Browser: Wert "SatusCode"
! http://<froniusIP>/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData
dom.GetObject(CUxD_Device + ".CMD_SETS").State("wget -q -O - '" + url + erzeugungParam + "'");
dom.GetObject(CUxD_Device + ".CMD_QUERY_RET").State(1);
stdout = dom.GetObject(CUxD_Device + ".CMD_RETS").State();
pos1 = "\"StatusCode\" : ";
wert_pos = stdout.Find(pos1) + pos1.Length();
wertStatus = stdout.Substr(wert_pos,2);
dom.GetObject(variable_status).State(wertStatus.ToInteger());
WriteLine("Status: "#wertStatus.ToInteger());
! Verbrauch
!-----------------------------------------------------------------------------
! Test im Browser: Wert "PowerReal_P_Sum"
! http://<froniusIP>/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System
dom.GetObject(CUxD_Device + ".CMD_SETS").State("wget -q -O - " + url + verbrauchParam);
dom.GetObject(CUxD_Device + ".CMD_QUERY_RET").State(1);
stdout = dom.GetObject(CUxD_Device + ".CMD_RETS").State();
pos1 = "\"PowerReal_P_Sum\" :";
wert_pos = stdout.Find(pos1) + pos1.Length();
wertVerbrauchRoh = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
wertVerbrauch = wertVerbrauchRoh.ToInteger().Abs();
dom.GetObject(variable_verbrauch).State(wertVerbrauch.ToInteger());
WriteLine("Verbrauch: "#wertVerbrauch.ToInteger()#" Watt");
! Produktion
!-----------------------------------------------------------------------------
! Test im Browser: Wert "PAC" (Power AC)
! http://<froniusIP>/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceId=1&DataCollection=CommonInverterData
dom.GetObject(CUxD_Device + ".CMD_SETS").State("wget -q -O - '" + url + erzeugungParam + "'");
dom.GetObject(CUxD_Device + ".CMD_QUERY_RET").State(1);
stdout = dom.GetObject(CUxD_Device + ".CMD_RETS").State();
pos1 = "\"PAC\" : {";
wert_pos = stdout.Find(pos1) + pos1.Length();
wertErzeugung = stdout.Substr(wert_pos,60).StrValueByIndex(pos2,1).StrValueByIndex(pos3,1);
dom.GetObject(variable_erzeugung).State(wertErzeugung.ToInteger());
WriteLine("Produktion: "#wertErzeugung.ToInteger()#" Watt");
! Einspeisung bzw. Bezug
!-----------------------------------------------------------------------------------------------
if ( wertErzeugung.ToInteger() > wertVerbrauch.ToInteger() ) {
! Mehr Erzeugung als Verbrauch: Einspeisung
WriteLine("Aktuell: Einspeisung");
wertEinspeisung = wertErzeugung.ToInteger() - wertVerbrauch.ToInteger();
wertEinspeisung = wertEinspeisung.Abs();
wertBezug = "0";
WriteLine("Einspeisung: "#wertEinspeisung.ToInteger()#" Watt");
! Einspeisung setzen
dom.GetObject(variable_einspeisung).State(wertEinspeisung.ToInteger());
! Bezug = 0
dom.GetObject(variable_bezug).State(wertBezug);
} else {
! Weniger Erzeugung als Verbrauch: Bezug
WriteLine("Aktuell: Bezug");
wertBezug = wertErzeugung.ToInteger() - wertVerbrauch.ToInteger();
wertBezug = wertBezug.Abs();
wertEinspeisung = "0";
WriteLine("Bezug: "#wertBezug.ToInteger()#" Watt");
! Bezug setzen
dom.GetObject(variable_bezug).State(wertBezug.ToInteger());
! Einspeisung = 0
dom.GetObject(variable_einspeisung).State(wertEinspeisung);
}
Hier zu sehen, auf der Seite des Skripts.