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: 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');
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);
Der "Service-Befehl"
cat /tmp/logging.log
zeigt die im log geschriebenen Einträge:
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.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
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.
Gruss J.