Achi
21. Dezember 2015 um 16:36
1
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?
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
Bayaro
21. Dezember 2015 um 19:17
2
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
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
Achi
21. Dezember 2015 um 20:26
3
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.
Bayaro
21. Dezember 2015 um 20:34
4
Poste doch mal dein Skript, mit dem du in IPS versucht die API auszulesen, vlt haste nur einen einfachen Fehler eingebaut
-Chris-
Achi
21. Dezember 2015 um 20:49
5
$content = Sys_GetURLContent(„https://monitoringapi.solaredge.com/site/XXXX/overview?api_key=XXXX “);
//print $content;
$json=json_decode($content);
print $json;
Bayaro
21. Dezember 2015 um 21:08
6
print klappt nicht…hättest nur ein „print_r“ mach müssen und schon hättest du die Ergebnisse gesehen
<?
$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
Grüße,
Chris
Bayaro
21. Dezember 2015 um 21:21
8
Kein Thema! Damit > Willkommen im IPS-Forum!
…und jetzt fleißig ein paar PHP-Grundlagen lernen
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
Bayaro
31. Oktober 2017 um 00:31
10
Hi Michael!
Erstmal >> Herzlich Willkommen im IPS-Forum
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
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
?>
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?
Bayaro
31. Dezember 2017 um 00:32
13
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] =>
)
)
)
Bayaro
1. Januar 2018 um 12:53
15
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.
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);
?>