Daten von Fronius-Wechselrichter an CCU mit CCU-Skript

In Hausautomation, Technik und Elektronik | Erstellt: 24.10.2018, 12:02 | Editiert: 29.10.2018, 10:28 (Weitere Status-Codes) | 54 mal angesehen | Seite drucken

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:

  • Name: Haus_Verbrauch, Typ: Integer, Einheit Watt
  • Name: PVA_Produktion, Typ: Integer, Einheit Watt
  • Name: Strom_Einspeisung, Typ: Integer, Einheit Watt
  • Name: Strom_Bezug, Typ: Integer, Einheit Watt
  • Name: PVA_Status, Typ: String

Skript

Hier das Skript, das die Aufgabe erledigt. Die Konfiguration in den markierten Zeilen muss angepasst werden. Die HM Sprach-Referenz für Skripte ist hier zu finden.

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
!-----------------------------------------------------------------------------
   
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
!-----------------------------------------------------------------------------
   
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
!-----------------------------------------------------------------------------
   
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.

Weitere Seiten in 'Hausautomation, Technik und Elektronik'

Schreibe einen Kommentar

Captcha * Time limit is exhausted. Please reload CAPTCHA.