Über Web, Tech, Games, Art,
Code & Design

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"
}

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);

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>
var e = <?php echo $e; ?>;
if (e > 0){      
$.post( "https://www.fbnfrtg.de/tools/solarpower/newitem.php", { 
  secretkey: "jfs839howigzdzrt3ihdfs",
  p: "<?php echo $p; ?>", 
  e: "<?php echo $e; ?>", 
  te: "<?php echo $te; ?>"  
});
}
</script>

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);
}

}
?>

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:


5 Kommentare zu “So kannst die lokale API des APSystems EZ-1 auch mit PHP (und ohne Python) nutzen

  1. 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ß

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert