14. Januar 2024
So kannst die lokale API des APSystems EZ-1 auch mit PHP (und ohne Python) nutzen
Der EZ-1 von APSystems ist ein beliebter Wechselrichter für sogenannte „Balkonkraftwerke“. Seit kurzem verfügt der EZ-1 auch über eine lokale API, die Auskunft über den erzeugten Strom gibt.
Diese Daten möchte ich gerne aus dem lokalen Netzwerk auf einen Web-Server übertragen um sie dort zu loggen und zu visualisieren. Damit du auf die lokale API zugreifen kannst, musst du den Wechselrichter in der App zuerst auf den „lokalen Modus“ umstellen. Wie das genau funktioniert ist hier sehr gut beschrieben:
https://github.com/SonnenladenGmbH/APsystems-EZ1-API?tab=readme-ov-file#setup-your-inverter
Wenn du alle Schritte erledigt hast, kannst du den Wechselrichter über eine lokale IP-Adresse erreichen. Da ich außerhalb des Home-Netzwerks aber nicht auf die lokalen Daten zugreifen kann, benötige ich ein Gerät, das die Daten aus dem Home-Netzwerk ins Internet überträgt. Klassischerweise wird hierfür oft ein Raspberry Pi genutzt, im Prinzip kann aber jedes Gerät genutzt werden, auf dem PHP oder Python ausgeführt werden kann.
Für Python stehen auf dieser Seite schon einige fertige Scripts zur Verfügung: https://github.com/SonnenladenGmbH/APsystems-EZ1-API
Da ich von Python überhaupt keine Ahnung habe, habe ich mir das ganze mal angeschaut und überlegt, wie ich mein Vorhaben mit PHP umsetzen kann. Ein Blick in das API-Manual verrät die URL der API:
http://192.168.XXX.XXX:8050/getOutputData
Der Aufruf dieser URL gibt JSON-Daten aus, die in etwa so aussehen:
{
"data": {
"p1": 0,
"e1": 0,
"te1": 0,
"p2": 0,
"e2": 0,
"te2": 0,
},
"message": "SUCCESS",
"deviceId":"E07000000001"
}
Code-Sprache: JSON / JSON mit Kommentaren (json)
Das bedeuten die einzelnen Werte:
p1 & p2 = aktuell erzeugter Strom in Watt von Panel 1 & Panel 2
e1 & e2 = seit dem Start des Wechselrichters erzeugter Strom in kwh (wenn nicht gerade eine Sonnenfinsternis ist, kann man diesen Wert wohl als „erzeugter Strom heute“ betrachten)
te1 & te2 = Insgesamt erzeugter Strom seit der ersten Nutzung des Wechselrichters
Diese Daten lassen sich in PHP ganz einfach mit cURL abrufen und weiterverarbeiten.
$url = 'http://192.168.XXX.XXX:8050/getOutputData';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($curl);
if($response === false) {
$error = curl_error($curl);
} else {
$data = json_decode($response, true);
$p = $data['data']['p1'] + $data['data']['p2'];
$e = $data['data']['e1'] + $data['data']['e2'];
$te = $data['data']['te1'] + $data['data']['te2'];
}
curl_close($curl);
Code-Sprache: PHP (php)
Theoretisch könnte man die Daten jetzt auch auf dem lokalen PHP-Server in einer DB speichern. Ich möchte die Daten jedoch im Web verfügbar haben. Dazu schicke ich Sie per Post an ein PHP Script auf dem Webserver und rufe das Script alle 5 Minuten erneut auf.
<meta http-equiv="refresh" content="300">
...
<script type="text/javascript" src="assets/js/jquery.js"></script>
<script></script>
Code-Sprache: HTML, XML (xml)
Dort empfange ich die Daten und logge sie in einer Datenbank.
<?php
if ($_POST['secretkey'] != 'jfs839howigzdzrt3ihdfs'){
echo 'no key';
exit();
}
require_once "sleekdb/SleekDB.php";
$databaseDirectory = __DIR__ . "/db";
$timestamp = date("Y-m-d-H-i-s");
$date = date("Y-m-d");
$month = date("Y-m");
$time = date("H.i");
if ($_POST['p']){
$currentstore = new \SleekDB\Store("powerdata", $databaseDirectory);
$p = $_POST['p'];
$e = $_POST['e'];
$te = $_POST['te'];
$datetoday = date("Y-m-d");
$data = $currentstore->findBy(["date", "=", $datetoday ],["_id" => "desc"]);
$currentid = $data[0]["_id"];
$count = count($data);
$item = [
'date' => $date,
$timestamp => [
'month' => $month,
'date' => $date,
'timestamp' => $timestamp,
'time' => $time,
'p' => $p,
'e' => $e,
'te' => $te
],
];
if ($count > 0){
$currentstore->updateById($currentid, $item);
} else {
$results = $currentstore->insert($item);
}
}
?>
Code-Sprache: HTML, XML (xml)
Und diese Daten lassen sich dann z.B. als Diagramm auf einer Website ausgeben:
www.fbnfrtg.de/tools/solarpower/
Hier gibt´s den Code als Download:
Nächster Artikel
Moin Moin,
erstmal vielen Dank für diese super Erklärung wie man den Zugriff bekommt. Das hab ich nun erfolgreich lösen können. Allerdings scheitert es ein wenig an der optischen Umsetzung. Ich finde die Darstellung hier (https://www.fbnfrtg.de/tools/solarpower/) super. Gibt es da auch ne Anleitung für wie man es so umsetzen kann?
Gruß
Hallo Karsten,
ich kann den Code gerne zur Verfügung stellen. Werde in den nächsten Tagen mal ein zip zusammenstellen.
Das wäre richtig klasse. Vielen Dank
Hier kannst du den Code runterladen: https://www.fbnfrtg.de/download/solarpower.zip
Sehr gut, funktioniert problemlos. Vielen Dank nochmal und schöne Ostertage!
Moin,
auch von mir erstmal herzlichen Dank für den Code. Bei mir tritt allerdings das Problem aus, dass der Wechselrirchter manchmal die IP-Adresse wechselt und dann das Skript natürlich erstmal keinen Zugriff mehr hat. Ich wollte Euch fragen, ob Ihr bei Euch ähnliches feststellt, oder Euer Wechselrichter seine IP behält. Wenn ja, wie lange? Vielen Dank!
Gruß,
David.
Hi. Ist bei mir bislang nicht passiert. Vllt kannst du dem Wechselrichter ja eine feste IP zuweisen…