Fronious PV Anlage auslesen zwei Wechselrichter

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
justusbernold
Beiträge: 23
Registriert: 27.08.2017, 19:38
Danksagung erhalten: 1 Mal

Fronious PV Anlage auslesen zwei Wechselrichter

Beitrag von justusbernold » 27.08.2017, 20:32

Nachdem mir der Start dank diesem Forum einigermassen gelungen ist (vielen Dank ldittmar für das Super-Script), möchte ich nun meine Lösung zum Auslesen einer Fronius PV Anlage mit 2 Wechselrichtern (Scope = System und nicht mehr Scope = Device) kurz dokumentieren und allen interessierten zur Verfügung (oder auch zur Kommentierung) zur Verfügung stellen.

Infrastruktur:
- Fronius Solaranlage mit zwei Wechselrichtern, erreichbar unter "fixer" IP Adresse (DHCP, jedoch im Router für Fronius reserviert, somit quasi fix)
- CCU2
- CUxD für das Logging der Daten

Idee:
- Abfragen und Loggen der Energieerzugungs- und Verbrauchsdaten
- Loggen auf der CCU2 (und nicht mittels weiteren Mitteln)

Schwierigkeiten:
- das von memberlist.php?mode=viewprofile&u=11649 lditmar erstellte script verwendete für mich verwirrende bezeichnungen der verschiedenen zweige am umrichter (Verbrauch, Erzeugung, Differenz)
- das Abfragen der Erzeugungsdaten beim Scope "System" liefert ein anderes Format als bei Scope "Device"

Energiefluss:
Energiefluss.png
Energiefluss.png (9.15 KiB) 1820 mal betrachtet
Nachstehende Lösung benötigt die durch den User zu erstellenden Systemvariabeln
PV_Erzeugung
PV_Verbrauch
PV_Netzbezug

Code: Alles auswählen

    !-----------------------------------------------------------------------------
    ! Hier alle was man verändern kann/muss
    ! Voraussetzung: CUxD und Fronius Wechselrichter
    !-----------------------------------------------------------------------------
    var froniusIP = "192.168.200.240"; !IP des Fronius Wechselrichters
    var deviceID = "1"; !Device ID (wird meistens stimmen, wenn nicht ausprobieren)
    var CUxD_Device = "CUxD.CUX2801001:1"; !CUxD Virtuelles Gerät
    string variable_verbrauch = "PV_Verbrauch"; !Name der Variabel für den Verbrauch im Haushalt
    string variable_erzeugung = "PV_Erzeugung"; !Name der Variabel für die Erzeugung mit der PV Anlage
    string variable_netzbezug = "PV_Netzbezug"; !Name der Variabel für den Bezug Energie vom Netz
    !-----------------------------------------------------------------------------
    ! Ab hier muss man nichts mehr beachten
    !-----------------------------------------------------------------------------
       
    string pos1;
    string pos2 = ",";
    string pos3 = ":";
    string teststring;
    real wertVerbrauch;
    real wertErzeugung = 0;
    real wertErzeugung1 = 0;
    real wertErzeugung2 = 0;
    real wertNetzbezug;
    integer wert_pos;
    var stdout;   
       
    string url = "http://" + froniusIP + "/solar_api/v1/";
    string verbrauchParam = "GetMeterRealtimeData.cgi?Scope=System";
    string erzeugungParam="GetInverterRealtimeData.cgi?Scope=System";
       
    !-----------------------------------------------------------------------------
    ! Aktueller Netzbezug in [W]
    !-----------------------------------------------------------------------------
       
    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();
    wertNetzbezug = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0);
    WriteLine("Netzbezug: " + wertNetzbezug);

    dom.GetObject(variable_netzbezug).Variable(wertNetzbezug.ToInteger());

    !-----------------------------------------------------------------------------
    ! Aktuell wird erzeugt in [W] (Natürlich nicht Nachts)
    !-----------------------------------------------------------------------------
       
    real zeit = (0.01 * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger();
    real tagesbeginn = (0.01 * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger();
    real tagesende = (0.01 * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger();
       
    if (zeit > tagesbeginn - 1 && zeit < tagesende + 1) {
       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 = "\"Unit\" : \"W\",";
       wert_pos = stdout.Find(pos1) +  pos1.Length();
       teststring = stdout.Substr(wert_pos,50);
       pos1 = "\"Values\" : {";
       wert_pos = teststring.Find(pos1) + pos1.Length();
       wertErzeugung1 = teststring.Substr(wert_pos,33).StrValueByIndex(pos2, 0).StrValueByIndex(pos3,1);
       wertErzeugung2 = teststring.Substr(wert_pos,33).StrValueByIndex(pos2, 1).StrValueByIndex(pos3,1);
       wertErzeugung = (wertErzeugung1.ToInteger() + wertErzeugung2.ToInteger());
       
       dom.GetObject(variable_erzeugung).Variable(wertErzeugung);
       !WriteLine(wertErzeugung1);
       !WriteLine(wertErzeugung2);
       WriteLine("Erzeugung" + wertErzeugung);

       !pos1 = "\"PAC\" : {";
       !wert_pos = stdout.Find(pos1) +  pos1.Length();
       !wertErzeugung = stdout.Substr(wert_pos,20).StrValueByIndex(pos2,0).StrValueByIndex(pos3,1);

       !dom.GetObject(variable_erzeugung).Variable(wertErzeugung.ToInteger());
    }

    !-----------------------------------------------------------------------------------------------
    ! Verbrauch in [W]
    !-----------------------------------------------------------------------------------------------
       
    wertVerbrauch = wertErzeugung.ToInteger() + wertNetzbezug.ToInteger();
    WriteLine("Verbrauch: " + wertVerbrauch);
    dom.GetObject(variable_verbrauch).Variable(wertVerbrauch.ToInteger());





!--------------------------------------------
!von Fronius zurückgelieferte Datenformate für Erzeugung bei 2 Invertern
!--------------------------------------------
!			"Unit" : "W",
!				"Values" : {
!					"1" : 1146,
!					"2" : 1079
!				}
! Vorgehen für Extraktion der Werte:
! - suchen nach "Unit" : "W"
! - nachfolgende Zeichenkette der Länge 50 rausholen
! - in dieser Zeichenkette suchen nach "Values" : {
! - nachfolgende Zeichenkette der Länge 33 rausholen
! - diese Zeichenkette als Liste mit Trennzeichen pos2 (Komma) aufteilen
! - diese zwei Listenelemente wiederum als Liste anschauen und aufteilen mit Trennzeichen pos3 (Doppelpunkt)
! - von dieser Aufteilung den jeweils zweiten Wert nehmen. (der erste entspricht der Device Nummer des Umrichters.


!WriteLine('Ende');
Dieser Code fragt den Fronius Wechselrichter alle 5 Minuten ab und schreibt die aktuellen Werte in die drei Variablen PV_Erzeugung, PV_Verbrauch und PV_Netzbezug.

Diese drei Variabeln werden auch alle 5 Minuten mittels Zeitsteuerung und nachfolgendem Script ins Log der CCU2 geschrieben.

Code: Alles auswählen

!-----Schreibe alle PV Werte ins CUxD Log-----------------------------------------------
!-----------------------------------------------------------------------------------------------

string name; ! Name der Variable
real x; ! Zählwert

name = "PV_Verbrauch";
x = dom.GetObject(name).Value();
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State(name#";"#x);

name = "PV_Erzeugung";
x = dom.GetObject(name).Value();
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State(name#";"#x);

name = "PV_Netzbezug";
x = dom.GetObject(name).Value();
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State(name#";"#x);

Ich weiss, das ist etwas Holzhammer-Methode - aber funktioniert und für mich als eher Hardware-orientierte Person auch in 2 Jahren noch einigermassen verständlich.

Der "Service-Befehl"
cat /tmp/logging.log

zeigt die im log geschriebenen Einträge:
2017-08-27T20:00:02 PV_Verbrauch 644.000000
2017-08-27T20:00:02 PV_Erzeugung 93.000000
2017-08-27T20:00:02 PV_Netzbezug 551.000000
Man sieht gut, dass bei einem Verbrauch von 644W und einer Erzeugung (um 2000h) von 93W mit Netzleistung im Umfang von 551W ergänzt werden muss.

Die Auswertung der Daten mache ich mit Highcharts.
Der nachfolgende Screenshot zeigt gut, wie der Verbrauchsverlauf (blau) ist. Solange keine Energie erzeugt wird, ist der Netzbezug (orange) gleich gross wie der Verbrauch. Ist die Erzeugung (violett) grösser als der Verbrauch, so ist der Netzbezug kleiner als 0, d.h. es wird ins Netz eingespeist.
Screenshot_20170827_210928.png

Gruss J.
--------------------------------------------
253 Kanäle in 83 Geräten und 33 CUxD-Kanäle in 3 CUxD-Geräten:
1x HM-LC-Sw4-DR, 8x HM-CC-RT-DN, 13x HM-Sec-SC-2, 2x HM-Sec-SD-2, 4x HM-LC-Sw2-FM, 5x HM-LC-Bl1-FM, 1x HM-Dis-EP-WM55, 21x HM-Sec-SCo, 1x HM-PB-6-WM55, 1x HmIP-SMI55, 1x HM-Sen-MDIR-WM55, 3x HM-ES-PMSw1-Pl-DN-R5, 1x HM-WDS30-T-O, 1x HM-Sen-LI-O, 1x HM-OU-CFM-TW, 2x CUX28, 1x HM-RC-8, 2x HM-Sec-SD-2-Team, 1x HmIP-RCV-50, 1x CUX91, 1x HM-LC-Sw1-FM, 2x HM-SCI-3-FM, 1x HM-LC-Sw4-DR-2, 1x HM-Sec-MDIR-2, 1x HM-SwI-3-FM, 1x HM-Sen-RD-O, 1x HM-WDS30-OT2-SM, 1x HM-OU-LED16, 1x HM-WDS10-TH-O, 1x VIR-HUE-GTW, 1x VIR-LG-DIM, 1x HM-PB-2-WM55-2, 1x HM-ES-TX-WM, 1x HM-Sen-Wa-Od
--------------------------------------------

olli79
Beiträge: 237
Registriert: 16.11.2013, 11:19
Hat sich bedankt: 13 Mal

Re: Fronious PV Anlage auslesen zwei Wechselrichter

Beitrag von olli79 » 29.10.2017, 22:05

Hallo,

ist es wichtig welche Art von CuxD Gerät ich anlege?
Statusanzeige 16 Kanal mit Exec und Taster?

Danke und Gruß
Olli
Auch nach X Jahren immer noch unwissend ;-)

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“