SMA EV Charger API über CURL abfragen

Servus. Ich bin stolzer Besitzer einer PV-Anlage mit SMA Wechselrichter (Sunny Tripower 10.0) und jetzt auch einer SMA Wallbox EV Charger 22. Den Wechselrichter kann ich bequem über Modbus abfragen, bei der Wallbox ist leider Modbus nicht integriert. Ich habe mich mal ein wenig im Netz umgeschaut, hier gibt es Hinweise auf eine API, welche über CURL abgefragt werden kann und die entsprechenden Werte als JSON übermittelt werden.

Jetzt hab ich leider überhaupt keinen Plan von CURL, geschweige denn, das in PHP abzubilden. In PHP gibts ja zahlreiche Commands hinsichtlich CURL, aber ich bekomme es irgendwie nicht hin.

Das, was ich im Netz gefunden habe, ist das hier:

Mit etwas Recherche im Internet, habe ich nun eine Möglichkeit gefunden den SMA-EV-Charger direkt abzufragen.

Das Ganze geht mit Hilfe einer JSON-API-Schnittstelle der Wallbox.

Anbei findet ihr das Vorgehen (Linux-Commandline mit curl und jq)

1.) Login / Access-Token holen, bzw.:

curl http:///api/v1/token -d „grant_type=password&=USER&password=“ | jq

→ <ACCESS_TOKEN> in JSON-Format

2.) Mit Hilfe des Access-/Bearer-Tokens die akt. Measurement-Daten holen

curl http:///api/v1/measurements/live/ -d „[{"componentId":"IGULD:SELF"}]“ -H „Authorization: Bearer <ACCESS_TOKEN>“ | jq

→ Live-Daten im JSON-Format

Könnte mir das jemand als Beispiel in PHP „übersetzen“, so dass ich am Ende eine Variable mit dem JSON als String erhalte? Das wäre prima.

Hier noch der Link zur Quelle:

https://www.photovoltaikforum.com/thread/158333-sma-ev-charger-abfrage/

Und das hier hab ich noch im Homematic-Forum gefunden:

https://homematic-forum.de/forum/viewtopic.php?t=72536

Eventuell hat jemand von Euch auch so eine SMA-Wallbox und hat das schon mit Symcon realisiert. Wäre super und danke schon mal für Eure Unterstützung.

Versuchs mal damit :wink:
https://incarnate.github.io/curl-to-php/

Mensch, was es alles für Sachen gibt :grin: … und schon bekomme ich alle Daten per JSON. Ganz herzlichen Dank für den Tip.

Hi @squeeezer kannst du mir kurz einen Tipp geben via ich mit dem curl-to-php Tool die notwendigen Infos via IP-Symcon vom EV Charger abfragen kann und dann via JSON die Daten abrufen kann? Vielen Dank & Gruß, Jan

Hi Jan, Asche über mein Haupt, ich hab Deine Nachfrage irgendwie total überlesen :frowning:

Falls Du es nicht doch selbst mittlerweile hinbekommen hast, poste ich mal mein Script für die Abfrage. Melde Dich noch mal, wenn was unklar ist.

1 „Gefällt mir“

Die Werte in <> natürlich inklusive der <> durch Deine Daten ersetzen :slight_smile:

 <?
	//API CURL Token
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,"http://<IPAddressCharger>/api/v1/token");
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,"grant_type=password&username=<User>&password=<Password>");
    $headers = array();
    $headers[] = "Content-Type: application/x-www-form-urlencoded";
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
    $result = curl_exec($ch);
    if (curl_errno($ch)) print("CURL-Error:".curl_error($ch));
    curl_close($ch);

    //Access Token aus Ergebnis extrahieren
    $accessToken = json_decode($result,true)["access_token"];
    IPS_Sleep(1000);

    //API CURL Daten
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,"http://<IPAddressCharger>/api/v1/measurements/live/");
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,"[{\"componentId\":\"IGULD:SELF\"}]");
    $headers = array();
    $headers[] = "Authorization: Bearer ".$accessToken;
    $headers[] = "Content-Type: application/x-www-form-urlencoded";
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
    $result = curl_exec($ch);
    if (curl_errno($ch)) print("CURL-Error:".curl_error($ch));
    curl_close($ch);

    //Daten aus Ergebnis extrahieren
    $data = json_decode($result,true);

    //Werte durchlaufen
    foreach($data as $row)
    {
        //Parameter auslesen
        if($row["channelId"] == "Measurement.Operation.EVeh.ChaStt") $chargingState = $row["values"][0]["value"]; //Status Ladevorgang { 200111 = nicht verbunden, 200112 = schlafend, 200113 = lädt }
        if($row["channelId"] == "Measurement.Chrg.ModSw") $chargingMode = $row["values"][0]["value"]; //Status Drehschalter {4950 = Intelligente Ladung, 4718 = Schnellladen}
        if($row["channelId"] == "Measurement.Metering.GridMs.TotWIn.ChaSta") $powerLoading = $row["values"][0]["value"]; //Leistung Ladestation in W
        if($row["channelId"] == "Measurement.ChaSess.WhIn") $energyLoading = $row["values"][0]["value"]; //Aktueller Ladevorgang in Wh
        if($row["channelId"] == "Measurement.Metering.GridMs.TotWhIn.ChaSta") $counterLoading = $row["values"][0]["value"]; //Zählerstand Ladestation in Wh
        if($row["channelId"] == "Measurement.GridMs.A.phsA") $electricityP1 = $row["values"][0]["value"]; //Strom an P1 in A
        if($row["channelId"] == "Measurement.GridMs.A.phsB") $electricityP2 = $row["values"][0]["value"]; //Strom an P2 in A
        if($row["channelId"] == "Measurement.GridMs.A.phsC") $electricityP3 = $row["values"][0]["value"]; //Strom an P3 in A
        if($row["channelId"] == "Measurement.Operation.Health") $deviceState = $row["values"][0]["value"]; //Status Ladestation { 307 = OK, 455 = Warnung, 35 = Alarm, 303 = Aus }
        if($row["channelId"] == "Measurement.Operation.EVeh.Health") $vehicleState = $row["values"][0]["value"]; //Status Fahrzeug { 307 = OK, 455 = Warnung, 35 = Alarm, 303 = Aus }
    }

    //Prüfen, ob Ladestation OK ist
    if($deviceState == 307)
    {
        //Variablen schreiben
        SetValue(57346,$chargingState);
        SetValue(58954,$chargingMode);
        SetValue(44613,round($powerLoading / 10) * 10);
        SetValue(44172,round($energyLoading / 1000,3));
        SetValue(27947,round($counterLoading / 1000,3));
        SetValue(31310,abs(round($electricityP1,1)));
        SetValue(55048,abs(round($electricityP2,1)));
        SetValue(48330,abs(round($electricityP3,1)));
        SetValue(22187,$deviceState);
        SetValue(18339,$vehicleState);
    }
    
    //Ladestation ist nicht okay
    else
    {
        //Bei unbekanntem Zustand auf Reset festlegen
        if($deviceState != 455 and $deviceState != 35 and $deviceState != 303) $deviceState = 16777700;
        
        //Variablen schreiben
        SetValue(57346,0);
        SetValue(58954,0);
        SetValue(22187,$deviceState);
        SetValue(18339,0);
    }

    //Timer abhängig vom Ladestatus setzen
    if($chargingState == 200113) IPS_SetEventCyclic(18698,0,0,0,0,1,10); else IPS_SetEventCyclic(18698,0,0,0,0,1,30);
?>
1 „Gefällt mir“

Hey @squeeezer wunderbar, ich konnt mir die Zeit bis dahin mit der Einrichtung meiner Kaskadenschaltung im IPS und anderem KLeinkram verteiben :slight_smile:
Aber wunderbar wie nun am Sonntagmorgen auch dei Wallbox mit Live Daten statt dem monatlichen Upload einer CSV in den Energyfluss integriert werden kann.

Dankeeee =)