Daten von Fronius-Wechselrichter an CCU mit CCU-Skript



Diese Seite wurde vor mehr als 2 Jahren erstellt und vor über einem Monat zuletzt bearbeitet. Eventuell ist längst ihr Mindesthaltbarkeitsdatum überschritten!

HomeMatic-Skript zum Auslesen der Kenndaten eines Fronius Photovoltaik-Wechselrichters

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:

Systemvariablen

Auf der CCU folgende Systemvariablen anlegen:

Dazu einen CUxD-Gerät, Typ "Exec", siehe hier.

Skript

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.

Logik der Berechnung

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

Status-Codes des Wechselrichters

Hier zu sehen, auf der Seite des Skripts.


19 andere Seiten unter 'Technik & Elektronik'

Permalink CC BY-NC 4.0 DEED 9588 24.10.2018 06.07.2021