Daten per API/HTTPS abfragen Solaredge

Guten Tag zusammen,

wir, mein Kumpel und ich, versuchen Daten von einer API in ips zu laden (Solaregge). Der Api Zugriff funktioniert einwandfrei und wurde erfolgreich mit einem Chrome Plugin (Chromeapp Postman) getestet.

Jetzt bekommen wir das ganze leider nicht innerhalb von ips auf die Reihe.

Also, mal ganz blöd gefragt, wie gehtn das? :slight_smile:

Versucht haben wir das ganze per script, bekommen aber eine Fehlermeldung dass ein „https“ Wrapper nicht geladen oder gefunden werden kann. ips_GetUrlContent liefert leider nur einen Timestamp aber nicht die Daten.

Danke für alle Tips,

Sebastian

Abend Sebastian!

Sieht doch ganz simple aus hier in der Doku:

Ich persönliche würde JSON empfehlen. Beispiele sind in der Doku vorhanden und hier nochmal rein kopiert :smiley:

http://monitoringapi.solaredge.com/1/details.json?api_key=[your_api_key]

Wie man mit JSON in IPS umgeht, habe ich z.B. hier ein Beispiel (gibt aber noch eine Menge andere im Forum):
IP-Symcon - Wie kann ich… 2.0

Grüße,
Chris

Wenn ich das ganze mit dem Chrometool Postman mache bekomme Ich das folgende:
{
„overview“: {
„lastUpdateTime“: „2015-12-21 19:54:43“,
„lifeTimeData“: {
„energy“: 2748174
},
„lastYearData“: {
„energy“: 2748247
},
„lastMonthData“: {
„energy“: 124554.25
},
„lastDayData“: {
„energy“: 6379.3887
},
„currentPower“: {
„power“: 0
},
„measuredBy“: „INVERTER“
}
}
wenn Ich das wie du beschrieben hast in IPS mache kommt nichts.
Und wenn Ich das ganze ohne decode direkt Printe kommt die Zahlenreihe mit allen werten aber ohne trennreichen oder sonstiges. Sodass ich es nicht vernünftig auseinander nehmen kann.

Poste doch mal dein Skript, mit dem du in IPS versucht die API auszulesen, vlt haste nur einen einfachen Fehler eingebaut :slight_smile:

-Chris-

$content = Sys_GetURLContent(„https://monitoringapi.solaredge.com/site/XXXX/overview?api_key=XXXX“);
//print $content;
$json=json_decode($content);
print $json;

print klappt nicht…hättest nur ein „print_r“ mach müssen und schon hättest du die Ergebnisse gesehen :smiley: :wink:

<?
$APIkey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$ID = "xxxxx";
$content = Sys_GetURLContent("https://monitoringapi.solaredge.com/site/".$ID."/overview?api_key=".$APIkey );
$json=json_decode($content);
//print_r($json);

echo "Last Update Time: ".$json->overview->lastUpdateTime;
echo PHP_EOL;
echo "Last Year Data: ".$json->overview->lastYearData->energy;
echo PHP_EOL;
echo "Last Month Data: ".$json->overview->lastMonthData->energy;
echo PHP_EOL;
echo "Last Day Data: ".$json->overview->lastDayData->energy;
echo PHP_EOL;
echo "Current Power: ".$json->overview->currentPower->power;
?>

Rest > Siehe API Doku :slight_smile:

Grüße,
Chris

Super vielen Dank!!!

Kein Thema! Damit > Willkommen im IPS-Forum! :slight_smile:
…und jetzt fleißig ein paar PHP-Grundlagen lernen :wink:

Man braucht nicht wirklich viel PHP-Kenntnisse für IPS, aber auf Dauer kommt man um ein wenig PHP nicht drum herum… Sofern man IPS ernsthaft betreiben will…

Grüße,
Chris

Hallo Zusammen,

ich mache gerade meine ersten Schritte mit IP Symcon und versuche Daten über API aus meinen Solaredge Anlage auszulesen. Leider aktuell ohne Erfolg.

Könntet Ihr das ganze, lauffähige Skript noch einmal post? Ich bekomme es mit den Hinweisen nicht hin.

Danke, Michael

Hi Michael!

Erstmal >> Herzlich Willkommen im IPS-Forum :slight_smile:

Ein Script ist doch 3 Posts über deinem?! >> Daten per API/HTTPS abfragen Solaredge

Allgemein >> Wenn irgendwas bei dir nicht funktioniert, solltest du immer dein Script posten (auch wenn es nicht funktioniert oder nur ein Teil davon fertig ist) und dazu noch die Fehler die du bekommst oder wo es genau klemmt…
Denn so ins Blaue raten ist immer ungünstig und da kann dir keiner wirklich helfen :wink:

Viel Freude mit IPS und Grüße,
Chris

Jetzt habe ich es hinbekommen. Ich frage die aktuellen Werte alle 5min ab und lege diese auf einer Variablen ab. Hier das Skript.

PHP Code:


<? 
$APIkey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
$ID = "xxxxx"; 
$content = Sys_GetURLContent("https://monitoringapi.solaredge.com/site/".$ID."/currentPowerFlow?api_key=".$APIkey );
$json=json_decode($content); 
//print_r($json); 

SetValue(31205 /*[Haus-Details\Solaranlage\Grid Status]*/, $json->siteCurrentPowerFlow->GRID->status); // Grid - Status
SetValue(11495 /*[Haus-Details\Solaranlage\Grid Power]*/, $json->siteCurrentPowerFlow->GRID->currentPower); // Grid - Current Power

SetValue(40290 /*[Haus-Details\Solaranlage\Load Status]*/, $json->siteCurrentPowerFlow->LOAD->status); // Load - Status
SetValue(28391 /*[Haus-Details\Solaranlage\Load Current Power]*/, $json->siteCurrentPowerFlow->LOAD->currentPower); // Load - Current Power

SetValue(21980 /*[Haus-Details\Solaranlage\PV Status]*/, $json->siteCurrentPowerFlow->PV->status); // PV - Status
SetValue(45624 /*[Haus-Details\Solaranlage\PV Current Power]*/, $json->siteCurrentPowerFlow->PV->currentPower); // PV - Current Power

SetValue(35748 /*[Haus-Details\Solaranlage\Storage Status]*/, $json->siteCurrentPowerFlow->STORAGE->status); // Storage - Status
SetValue(50588 /*[Haus-Details\Solaranlage\Storage Current Power]*/, $json->siteCurrentPowerFlow->STORAGE->currentPower); // Storage - Current Power
SetValue(17520 /*[Haus-Details\Solaranlage\Starage Charge Level]*/, $json->siteCurrentPowerFlow->STORAGE->chargeLevel); // Storage - Charge Level
SetValue(29172 /*[Haus-Details\Solaranlage\Strage Critical]*/, $json->siteCurrentPowerFlow->STORAGE->critical); // Storage - Critical

?>

:slight_smile:

Ich möchte das oben gezeigte Skript erweitern und zusätzliche Informationen aus dem XML File auslesen.

Hier der XML-File:

<siteCurrentPowerFlow>
<updateRefreshRate>3</updateRefreshRate>
<unit>kW</unit>
<GRID>
<status>Active</status>
<currentPower>0.52</currentPower>
</GRID>
<LOAD>
<status>Active</status>
<currentPower>0.52</currentPower>
</LOAD>
<PV>
<status>Idle</status>
<currentPower>0.0</currentPower>
</PV>
<STORAGE>
<status>Idle</status>
<currentPower>0.0</currentPower>
<chargeLevel>10</chargeLevel>
<critical>false</critical>
</STORAGE>
[b][<connections>
<connection>
<from>GRID</from>
<to>Load</to>
</connection>
</connections>[/b]
</siteCurrentPowerFlow>

Leider klappt die Abfrage der nicht wie gedacht.

SetValue(29300 /*[Details\Solaranlage\Connection FROM]*/, $json->siteCurrentPowerFlow->connections->connection->from); // Connections - From
SetValue(38091 /*[Details\Solaranlage\Connection TO]*/, $json->siteCurrentPowerFlow->connections->connection->to); // Connections - To

Ich bekomme immer die Fehlermeldung:
Notice: Trying to get property of non-object in /mnt/data/symcon/scripts/46634.ips.php on line XX

Was mache ich falsch? Kann mir jemand helfen?

Hi!

Mangels Zugang meinerseits, müsstest du eine Ausgabe vom folgenden Script posten, dann kann man dir sicher weiterhelfen:

<?
$APIkey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
$ID = "xxxxx"; 
$content = Sys_GetURLContent("https://monitoringapi.solaredge.com/site/".$ID."/currentPowerFlow?api_key=".$APIkey );
$json=json_decode($content); 
print_r($json);
?>

Grüße,
Chris

Hier wie gewünscht das Ergebnis des Skriptes:

stdClass Object
(
    [siteCurrentPowerFlow] => stdClass Object
        (
            [updateRefreshRate] => 3
            [unit] => kW
            [connections] => Array
                (
                    [0] => stdClass Object
                        (
                            [from] => LOAD
                            [to] => Grid
                        )

                    [1] => stdClass Object
                        (
                            [from] => PV
                            [to] => Load
                        )

                    [2] => stdClass Object
                        (
                            [from] => PV
                            [to] => Storage
                        )

                )

            [GRID] => stdClass Object
                (
                    [status] => Active
                    [currentPower] => 3.34
                )

            [LOAD] => stdClass Object
                (
                    [status] => Active
                    [currentPower] => 0.33
                )

            [PV] => stdClass Object
                (
                    [status] => Active
                    [currentPower] => 8.67
                )

            [STORAGE] => stdClass Object
                (
                    [status] => Charging
                    [currentPower] => 5
                    [chargeLevel] => 40
                    [critical] => 
                )

        )

)

Dann müssen deine SetValue wie folgt aussehen:

SetValue(11111, $json->siteCurrentPowerFlow->connections[0]->from); // Connections - From LOAD
SetValue(22222, $json->siteCurrentPowerFlow->connections[0]->to); // Connections - To Grid

SetValue(33333, $json->siteCurrentPowerFlow->connections[1]->from); // Connections - From PV
SetValue(44444, $json->siteCurrentPowerFlow->connections[1]->to); // Connections - To Load

SetValue(55555, $json->siteCurrentPowerFlow->connections[2]->from); // Connections - From PV
SetValue(66666, $json->siteCurrentPowerFlow->connections[2]->to); // Connections - To Storage

Erklärung:
Bei „stdClass Object“ musst du mit „->“ auf ein Object zugreifen.
Bei „Array“ mit „

Alternativ kann man mit „$array=json_decode($content, true)“ das komplette JSON-Ding zu einem Array machen und dann immer mit $array[„siteCurrentPowerFlow“][„connections“][0][„from“] … auf die Daten zugreifen.

Grüße,
Chris

Hallo Chris,

danke für die schnelle Hilfe. Jetzt klappt es prima. :slight_smile:

Gruß, Michael

Hallo,

ich holl das Thema noch mal hoch.

Bis jetzt hatte ich die Monitorseite von Solaredge als externe Webseite in IPS eingefügt.
Leider hat Solaredge nun Iframe verboten. Somit geht das nicht mehr.

Die jenigen die das script benutzen, könnt ihr ein Bild hochladen wie es im WF ausschaut?

Auf der Seite von Solaredge hat mir dieses Bild wie der Strom gerade fliest sehr gut gefallen.
Wieviel KW wird prouziert, geht es alles in die Batterie oder ins Haus und wieviel wird verkauft.

Ist es möglich dieses Bild in IPS zubekommen?

Grüße

Danke

Hallo,

ich habe die Darstellung recht einfach gehalten.

Gruß, Michael

Hi,

danke

Kannst du mir daszu das Script posten?

ich vermute das sind alles String variablen. Die man da sieht

Danke

Hallo,

hier das Skript. Ich führe es alle 5 Minuten aus, da dies das max. ist was SolarEdge zulässt. Ich berechne zusätzlich noch die Zeit die ich Autark bin. Außerdem habe ich nach meinen Bedürfnissen ein Parameter „Versorgungsart“ berechnet (Zustand aus PV, Speicher Leistung, Speicher Ladung und Hausverbrauch). Diesen verwende ich dann für die Steuerung von Verbrauchern.

Ich habe dir noch Screenshots der Gesamten Energieübersicht beigefügt.


<? 

// ------
// ------
// ------ Werte für Zukauf oder Eigenproduktion - Zeit berechnen
// ------
// ------
$con1=getValue(29300);
$con2=getValue(21901);
$con3=getValue(52436);

if ($con1=="GRID->Load" or $con2=="GRID->Load" or $con3=="GRID->Load")
	{
	$zeit_grid=GetValue(15041);
	$zeit_grid=$zeit_grid+5;
	setvalue(15041,$zeit_grid);
	}
	else
	{
	$zeit_eigen=GetValue(59351);
	$zeit_eigen=$zeit_eigen+5;
	setvalue(59351,$zeit_eigen);
	}

// Prozent Wert für Eigenverbrauch berechnen
$zeit_grid=GetValue(15041);
$zeit_eigen=GetValue(59351);
$zeit_gesamt=$zeit_grid+$zeit_eigen;
$zeit_gesamt_prozent=$zeit_eigen/$zeit_gesamt;
setvalue(34949,$zeit_gesamt_prozent);	

// ------
// ------
// ------ SolarEdge API Abfrage
// ------
// ------

$APIkey = "XXXX"; 
$ID = "XXX";
$Speicherleistung=9300; //Wh
$content = Sys_GetURLContent("https://monitoringapi.solaredge.com/site/".$ID."/currentPowerFlow?api_key=".$APIkey );
$json=json_decode($content); 

// PV-Anlage abfragen
$PV_Status=$json->siteCurrentPowerFlow->PV->status; // PV - Status
$PV_Leistung=$json->siteCurrentPowerFlow->PV->currentPower*1000; // PV - Current Power

// Speicher abfragen
$Speicher_Status=$json->siteCurrentPowerFlow->STORAGE->status; // Storage - Status
$Speicher_Leistung=$json->siteCurrentPowerFlow->STORAGE->currentPower*1000; // Storage - Current Power
$Speicher_Ladung=$json->siteCurrentPowerFlow->STORAGE->chargeLevel; // Storage - Charge Level
$Speicher_Kritisch=$json->siteCurrentPowerFlow->STORAGE->critical; // Storage - Critical
$Speicher_Gespeicherte_Leistung=($Speicher_Ladung/100)*$Speicherleistung; // Storage - Current Power

// Vorzeichen korrigieren
if ($Speicher_Status=="Charging")
	{
	$Speicher_Leistung=$Speicher_Leistung*-1;
	}

$Renewables_Sum=$PV_Leistung+$Speicher_Leistung;


// Haus abfragen
$Haus_Status=$json->siteCurrentPowerFlow->LOAD->status; // Load - Status
$Haus_Leistung=$json->siteCurrentPowerFlow->LOAD->currentPower*-1000; // Load - Current Power

$Haus_Sum=$Renewables_Sum+$Haus_Leistung;

// Netz abfragen
$Netz_Status=$json->siteCurrentPowerFlow->GRID->status; // Grid - Status
$Netz_Leistung= $json->siteCurrentPowerFlow->GRID->currentPower*1000; // Grid - Current Power

$Netz_Leistung_berechnet=$Haus_Sum*-1;

// ------
// ------ Werte schreiben
SetValue(21980,$PV_Status); // PV - Status
SetValue(45624,$PV_Leistung); // PV - Current Power

SetValue(35748,$Speicher_Status); // Storage - Status
SetValue(50588,$Speicher_Leistung); // Storage - Current Power
SetValue(17520,$Speicher_Ladung); // Storage - Charge Level
SetValue(29172,$Speicher_Kritisch); // Storage - Critical
SetValue(38117,$Speicher_Gespeicherte_Leistung); // Storage - Current Power
SetValue(52367,$Renewables_Sum); // Haus - Summe aus PV & Speicher

SetValue(40290,$Haus_Status); // Load - Status
SetValue(28391,$Haus_Leistung); // Load - Current Power
SetValue(58537,$Haus_Sum); // Haus - Summe aus Haus & Renewables


SetValue(31205,$Netz_Status); // Grid - Status
SetValue(11495,$Netz_Leistung); // Grid - Current Power
SetValue(35901,$Netz_Leistung_berechnet); // Grid - Current Power


//if ($anz_connections>=1)
	//{
	$con1_von=$json->siteCurrentPowerFlow->connections[0]->from; // Connections - From LOAD
	$con1_nach=$json->siteCurrentPowerFlow->connections[0]->to; // Connections - From LOAD
	$con1=$con1_von;
	$con1 .="->";
	$con1 .=$con1_nach;
	SetValue(29300,$con1);
	//}

//if ($anz_connections>=2)
	//{
	$con2_von=$json->siteCurrentPowerFlow->connections[1]->from; // Connections - From LOAD
	$con2_nach=$json->siteCurrentPowerFlow->connections[1]->to; // Connections - From LOAD
	$con2=$con2_von;
	$con2 .="->";
	$con2 .=$con2_nach;
	SetValue(21901,$con2);
	//}
	//else/
	//{
	//SetValue(21901,"");
	//}

//if ($anz_connections==3)
	//{
	$con3_von=$json->siteCurrentPowerFlow->connections[2]->from; // Connections - From LOAD
	$con3_nach=$json->siteCurrentPowerFlow->connections[2]->to; // Connections - From LOAD
	$con3=$con3_von;
	$con3 .="->";
	$con3 .=$con3_nach;
	SetValue(52436,$con3);
	//}
	//else
	//{
	//SetValue(52436,"");
	//}
	

// ------
// ------
// ------ Werte für Zukauf oder Eigenproduktion - Variable Autark setzten
// ------
// ------
if ($con1=="GRID->Load" or $con2=="GRID->Load" or $con3=="GRID->Load")
	{
	setvalue(13194,false);
	}
	else
	{
	setvalue(13194,true);
	}
	



// ------
// ------
// ------ Versorgungsart errechenen
// ------
// ------

$Versorgungsart=10;

// Versorgungsart 1
if ($PV_Leistung<50 and $Speicher_Leistung==0 and $Speicher_Ladung<13 and $Netz_Leistung_berechnet>0)
	{
	$Versorgungsart=1;
	}

// Versorgungsart 2
if ($PV_Leistung<100 and $Speicher_Leistung>0 and $Speicher_Ladung<100 and $Netz_Leistung_berechnet>=0)
	{
	$Versorgungsart=2;
	}

// Versorgungsart 3
if ($PV_Leistung>0 and $Speicher_Leistung<=0 and $Speicher_Ladung<=30 and $Netz_Leistung_berechnet>=0)
	{
	$Versorgungsart=3;
	}

// Versorgungsart 4
if ($PV_Leistung>0 and $Speicher_Ladung<=30 and $Netz_Leistung_berechnet<=500)
	{
	$Versorgungsart=4;
	}

// Versorgungsart 5
if ($PV_Leistung>0 and $Speicher_Ladung>30 and $Netz_Leistung_berechnet<2000)
	{
	$Versorgungsart=5;
	}

// Versorgungsart 6
if ($PV_Leistung>2000 and $Speicher_Leistung<-1000 and $Speicher_Ladung<=30 and $Netz_Leistung_berechnet<=500)
	{
	$Versorgungsart=6;
	}

// Versorgungsart 7
if ($PV_Leistung>4000 and $Speicher_Leistung<-2000 and $Speicher_Ladung<=30 and $Netz_Leistung_berechnet<=500)
	{
	$Versorgungsart=7;
	}
	
// Versorgungsart 8
if ($PV_Leistung>2000 and $Speicher_Leistung>-5100 and $Speicher_Ladung>30 and $Netz_Leistung_berechnet<=100)
	{
	$Versorgungsart=8;
	}

// Versorgungsart 9
if ($PV_Leistung>3000 and $Speicher_Leistung>-5100 and $Speicher_Ladung>=90)
	{
	$Versorgungsart=9;
	}

print $PV_Leistung;
print "/";

setvalue(36820,$Versorgungsart);


?>