Im Mai 2022 wurde meine neue PV-Anlage installiert. Leider sind die Einspeisevergütungen äußerst niedrig, darum ist es sinnvoll, möglichst viel Solarstrom selbst zu nutzen. Es gibt kommerzielle Systeme, die die überschüssige Solarenergie zum Aufheizen des Brauchwassers nutzen, das geht aber baulich bei meiner (15 Jahre alten) Öl - Heizanlage leider nicht. Darum hatte ich die Idee, das Arbeitszimmer meiner Frau mit der Zentralheizung nur noch grundwarm zu beheizen und bei Solarstromüberschuss eine Infrarot-Heizung zuzuschalten.
Dazu müsste ich wissen, wieviel Solarleistungsüberschuss zur Verfügung steht. Das herauszubekommen gibt es grundsätzlich drei Wege:
1. Auslesen der Daten des Wechselrichters
2. Auslesen der Daten des Zweirichtungszählers des Netzbetreibers
3. Abrufen der Daten die der Wechselrichterhersteller von Wechselrichter holt
Abrufen der Daten, die der Wechselrichterhersteller erhebt
Ich habe die 3. Variante gewählt. Die App des Herstellers Solaedge ermittelt mindestens im einstelleigen Sekundentakt die aktuelle Leistung der Solarmodule, den Verbrauch des Hauses und die ins Netz eingespeiste Energie und vieles mehr. Auf diese Daten kann man bei Solaredge mittels API zugreifen.
Wie kommt man an die API?
Bei solaredge.com anmelden und dann auf das Admin-Zahnrad klicken. Dort auf "Anlagenzugriff" und "API-Zugriff" klicken. Schon erhält man die AP-ID und die Anlagen-ID:
Wie nutzt man die API?
Mittels API Key und der Standort-ID hat man Zugriff zur Datenbank des Wechselrichterherstellers bzw. zu den Daten seiner Anlage. Ich habe das mit einem PHP-Script pv.php unter Linux auf einem Raspberry-Pi gemacht. Das Script prüft alle 10 Minuten ob die Anlage Überschuss produziert und ob der Überschuss für die Heizung ausreicht. Wenn ausreichend Energie zur Verfügung steht wird das Bash-Scipt "heater-on.sh" aufgerufen, welches die MQTT-Message "an" an das Topic "haus/pvheater" schickt. Wenn nicht dann die Message "aus" an das Topic. Eine MQTT-Steckdose, die sich am MQTT-Broker für Nachrichten an das Topic "haus/pvheater" angemeldet (subscribed) hat wird daraufhin an oder abgeschaltet.
Hier das Script pv.php:
#!/usr/bin/php
<?php
// Variables to be set
$APIkey = "DER0API0KEY";
$ID = "08150815";
// Power of the heater
$heaterkw = 0.5;
//currentPowerFlow - Data
$content = file_get_contents("https://monitoringapi.solaredge.com/site/".$ID."/currentPowerFlow?api_key=".$APIkey );
$sejson=json_decode($content);
// getting data from jason-record and putting them in variables:
$bezug = $sejson->siteCurrentPowerFlow->GRID->currentPower;
$verbrauch = $sejson->siteCurrentPowerFlow->LOAD->currentPower;
$erzeugung = $sejson->siteCurrentPowerFlow->PV->currentPower;
// calculate if there is energy left
$ueberschuss = $erzeugung - $verbrauch;
$genugpv = $ueberschuss - $heaterkw;
/*
*
// other variables in json:
// energyoverview
$content = file_get_contents("https://monitoringapi.solaredge.com/site/".$ID."/overview?api_key=".$APIkey );
$sejson=json_decode($content);
$lastupdatetime = $sejson->overview->lastUpdateTime;
$lastyearenergy = $sejson->overview->lastYearData->energy;
$glastmonthenergy = $sejson->overview->lastMonthData->energy;
$lastdayenergy = $sejson->overview->lastDayData->energy;
$currentpower = $json->overview->currentPower->power;
//inventory
$content = file_get_contents("https://monitoringapi.solaredge.com/site/".$ID."/inventory?api_key=".$APIkey );
$sejson=json_decode($content);
// attention! Here it ist different - first read the inverter-array from json-file and then create variables from inverter-array!
$array=$json->Inventory->inverters;
$invname = $array[0]->name;
$invmanuf = $array[0]->manufacturer;
$invmodel = $array[0]->model;
$invsn = $array[0]->SN;
$dsp1 = $array[0]->dsp1Version;
$dsp2 = $array[0]->dsp2Version;
$cpu = $array[0]->cpuVersion;
$connectedoptimizers = $array[0]->connectedOptimizers;
*/
print("\npvbin.php 2022-08-05 by Migele\n");
print("Switch on heater when enough pv-energy is left\n");
print("PV-energy - heater = ".$genugpv." kW\n");
#...if there's enough PV-Power..
if($genugpv >= 0) {
print("Einspeisung: ".$ueberschuss." kW\n");
# mqtt-message via linux-script
exec("/home/pi/bin/heater-on.sh");
print("Heizung an!");
# .. if not.
} else {
$temp = $ueberschuss * -1;
print("Akt. Bezug: ".$temp." kW\n");
# mqtt-message via linux-script
exec("/home/pi/bin/heater-off.sh");
print("Heizung aus!\n");
}
print("\n");
?>
Warum nur alle 10 Minuten?
Zum Einen ist es nicht gut, eine Heizung alle paar Sekunden ein- und auszuschalten, zum Anderen ist die Anzahl der Kontaktaufnahme via API bei Solaredge auf 300 pro Tag limitiert. Mit 10 Minuten hat man dann noch Reserve, etwas rumzuprobieren.
Was macht pv.php?
Das Script pv.php ruft heater-on.sh oder heater-off.sh auf, je nachdem, ob genügend Leistung zur Verfügung steht:
Diese Scripts erzeugen eine MQTT-Nachricht, die an einen MQTT-Broker geschickt wird. Eine Schaltung wertet diese Messages aus und reagiert entsprechend.
Wie man einen MQTT-Broker installiert seht ihr hier: MQTT-Broker auf Raspberry Pi installieren Man kann aber auch einen Broker im Internet verwenden.
Die Schaltung dazu:
Das Layout:
und hier die Software für den ESP8266. Alle WiFi und MQTT-Daten werden im EEprom gespeichert. Dazu schaut euch bitte die Routine setupmenu() an. Sie speichert diese Infos im EEprom ab.:
To Do:
Wenn die überschüssige Leistung der PV-Anlage ausreichend groß ist, wird z.B. eine Heizung zugeschaltet. Dadurch sinkt logischerweise die ''freie" Leistung. Das hat zur Folge, dass wenn z.B. die Heizung 1 kW hat. Bei einem Überschuss von 1 kW eingeschaltet wird, sie anschließend wieder abgeschaltet wird, weil der Überschuss entsprechend sinkt. Das muss man abfangen.
Gerne Vorschläge über elektronik at jurameer.de, wie damit umgehen.