Im gleichen Script user_device.php (das beim Posting angehängt ist) übertrage ich auch die Daten von der Solaranzeige zu meiner Hausautomation.
Ich schalte die Geräte nicht direkt in der Solaranzeige, sondern in der Hausautomation, weil dort die verschiedenen Nutzungsszenarien (anwesend/abwesend etc.) bekannt sind. Die Geräte schalte ich von dort anhand dieser Daten:
Netz_Leistung_W
Leistung in Watt, die momentan vom öffentlichen Netz bezogen wird (positive Werte) oder PV-Überschuss, der momentan ins öffentliche Netz eingespeist wird (negative Werte)
AC_Leistung
Leistung in Watt, die mein Einspeise-Wechselrichter im Mittel der letzten 7 Minuten produziert hat.
Drossel
Leistungslimitierungsfaktor in Prozent, der momentan beim Wechselrichter eingestellt ist.
SOC
State of Charge, Ladezustand der Batterie meiner PV-Inselanlage in Prozent
Der Server der Hausautomation (bei mir eine HomeMatic CCU) ist bei mir aus Sicherheitsgründen nicht direkt von der Solaranzeige erreichbar und liegt hinter einer Firewall, die ich SCS genannt habe. Ich rufe von der Solaranzeige ein PHP-Script send_solar-data.php auf, das am SCS läuft und die Daten seinerseits an die Hausautomation weitersendet. Dieses PHP-Script ist im Abschnitt 5 der Datei user_device.php dokumentiert.
In Abschnitt 1.5 der Datei user_device.php werden Parameter für Abschnitt 5 initialisiert. Damit können auch andere Server-Namen, andere API oder andere Namen für http-GET Parameter verwendet werden.
Code: Alles auswählen
$SCS_URL = <SCS-Url>; // URL HTTP Get-Interface zur Übertragung von Daten an Haus-Automation
$SCS_shell_cmd = "curl --cacert /var/www/html/SCS_CA-rootCA.pem '".$SCS_URL."/send_solar_data.php?"; // Aufruf HTTP-GET Interface
SCS_shell_cmd beschreibt das Kommando mit dem das Interface aufgerufen wird.
Danach werden die Namen der http GET Parameter des Interface zur Hausautomation angegeben, die zur Übertragung der Werte verwendet werden:
Code: Alles auswählen
$SCS_Netz_Leistung_W ="Netz_Leistung_W"; // mittleren Netzbezugs
$SCS_AC_Leistung = "AC_Leistung"; // mittleren PV Leistung
$SCS_SOC = "PV_Batterie_SOC"; // aktuellen Ladezustands
$SCS_Drossel = "PV_Drossel"; // Wechselrichter-Drosselung
$SCS_URL = "https://office11.my-router.de:9081/unsecured"; // URL HTTP Get-Interface zur Übertragung von Daten an Haus-Automation
$SCS_shell_cmd = "curl --cacert /var/www/html/SCS_CA-rootCA.pem '".$SCS_URL."/send_solar_data.php?"; // Aufruf HTTP-GET Interface
Eine weitere Besonderheit meiner Implementierung ist, dass der SCS nur HTTPS Verbindungen zulässt und ein selbst signiertes Zertifikat verwendet. Damit das mit CURL funktioniert, muss mit dem Parameter –cacert die eigene Zertifizierungs“behörde“ (SCS_CA) bekannt gegeben werden, indem ein eigenes Zertifikat (SCS_CA-rootCA.pem) übergeben wird.
Das Kommando könnte etwa so aussehen:
Code: Alles auswählen
curl --cacert /var/www/html/SCS_CA-rootCA.pem '.../send_solar_data.php?Netz_Leistung_W=109&AC_Leistung=150&PV_Drossel=100&PV_Batterie_SOC=87'
Dann wird das Kommando mit exec ausgeführt.
Das vom Kommando aufgerufene Script send_solar_data.php verwendet das HomeMatic Script API um Systemvariablen in der CCU zu setzen. Wenn man eine andere Hausautomation betreibt, müsste man send_solar_data.php also ändern. Für HomeMatic sehen die ersten Zeilen des Scripts so aus:
Code: Alles auswählen
$ccu='192.168.175.1';
$Netz_Leistung_W = round(0 + $_GET["Netz_Leistung_W"]);
$string = file_get_contents('http://'.$ccu.'/rega.exe?state=dom.GetObject(%27Netz_Leistung_W%27).State('.$Netz_Leistung_W.')');
$xml = simplexml_load_string($string);
if ($xml->state == 0) {
// OK, Systemvariable Netz_Leistung_W wurde gesetzt.
…
'http://<IP-Adresse-der CCU>/rega.exe?state=dom.GetObject(%27Netz_Leistung_W%27).State(109)'
In der HomeMatic CCU sieht das dann so aus:
Ein Zentralen-Programm in der CCU sorgt dann dafür, dass eine Schaltsteckdose „PV_Ueberschuss“ eingeschaltet wird, wenn PV-Überschuss vorhanden ist:
Hinweis, bevor ein Einschaltbefehl an die Schaltsteckdose geschickt wird, sollte wie im obigen Beispiel geprüft werden, ob sie nicht ohnehin eingeschaltet ist, um Funk-Traffic zu minimieren.
Ein zweites Programm schaltet die Steckdose wieder aus.