Die SMA Hotline hat sich bei mir gemeldet und mir mitgeteilt, dass die andauernde Neuanmeldung am Portal wohl deren Anmeldeserver etwas in die Knie bringt.
Daher habe ich das Script angepasst.
Es erfolgt nun eine Anmeldung und die Daten werden in der laufenden Session alle 15 Sekunden abgerufen. Nach 117 Abfragen (29 Minuten) wird die Session geschlossen.
Das Event, welches das neue Script aufruft, muss somit nun von alle 15 Sekunden auf alle 30 Minuten geändert werden.
Da ist die Pfade bei den Cookies rausgenommen habe, sollte das Script auf PI und Windows laufen.
Gruß,
Torsten
<?
/* -----------------------------------------------------------------------------
Dieses Script liest die übertragenen Daten des Sunny-Home-Manager an das
SunnyPortal aus.
Wird nach der Anmeldung am SunnyPortal folgende URL aufgerufen
http://www.sunnyportal.com/homemanager kommen die Werten als JSON Array wie
folgt zurück
(
[Timestamp] => /Date(1418892056131)/
[PV] => 32
[FeedIn] => 0
[GridConsumption] => 1089
[DirectConsumption] =>
[SelfConsumption] => 32
[SelfSupply] => 32
[TotalConsumption] => 1121
[DirectConsumptionQuote] =>
[SelfConsumptionQuote] => 100
[AutarkyQuote] => 3
[BatteryIn] =>
[BatteryOut] =>
[BatteryChargeStatus] =>
[OperationHealth] =>
[BatteryStateOfHealth] =>
[InfoMessages] => Array
(
)
[WarningMessages] => Array
(
)
[ErrorMessages] => Array
(
)
[Info] => Array
(
)
)
Installationsanleitung:
Es muss eine Kategorie "SMA" angelegt werden, unter der das Script einkopiert wird.
In dieser Kategorie legt das Script alle notwendigen Varibalen an.
----------------------------------------------------------------------------- */
// Hier die LogIn Daten für das SunnyPortal eintragen:
$login_email = 'ich@tld.de';
$login_pass = 'MeinPasswort';
// Hier muss die ID der neu angelegten Kategorie eingetragen werden und als ID der Parent der neu angelegten Kategorie. Bei mir liegen alle Scripte in der Kategorie 'Scripte'
$ParentID = IPS_GetCategoryIDByName ("SMA", 23244 /*[Scripte]*/);
// *****************************************************************************
// Ab hier braucht nichts mehr verändert werden
// *****************************************************************************
// Erster Aufruf und Anmeldung am SunnyPortal
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.sunnyportal.com/Templates/Start.aspx');
# ctl00$ContentPlaceHolder1$Logincontrol1$txtUserName << Feldbezeichnung für Benutzername
# ctl00$ContentPlaceHolder1$Logincontrol1$txtPassword << Feldbezeichnung für Passwort
# ctl00$ContentPlaceHolder1$Logincontrol1$LoginBtn << Feldbezeichnung für LogIn Button
curl_setopt($ch, CURLOPT_POSTFIELDS,'ctl00$ContentPlaceHolder1$Logincontrol1$txtUserName='.urlencode($login_email).'&ctl00$ContentPlaceHolder1$Logincontrol1$txtPassword='.urlencode($login_pass).'&__EVENTTARGET=ctl00$ContentPlaceHolder1$Logincontrol1$LoginBtn');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_sma.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_sma.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
curl_setopt($ch, CURLOPT_REFERER, "https://www.sunnyportal.com");
$result = curl_exec($ch);
for ($i=1; $i <= 117; $i++){ // Werte 30 Minuten lang holen
// Zweiter Aufruf unter Verwendung des erzeugten Cookies um die Daten abzurufen
curl_setopt($ch, CURLOPT_URL,"http://www.sunnyportal.com/homemanager");
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_sma.txt');
curl_setopt($ch, CURLOPT_POST, 0);
$result = curl_exec($ch);
$result = json_decode($result,true);
foreach ($result as $key => $value) {
$vid = @IPS_GetVariableIDByName($key,$ParentID);
if ($vid === false) { // überprüfe ob Variable existiert - falls nicht, werden diese neu angelegt
$vid = IPS_CreateVariable(2);
if (strpos($key,'Message') !== false or strpos($key,'Info') !== false or $key == "Timestamp"){ // setzte Variabletyp auf String, für Text-Meldungen
$vid = IPS_CreateVariable(3);
}
IPS_SetParent($vid, $ParentID);
IPS_SetName($vid, $key);
}
if ($key == "Timestamp") {
$value1 = (substr($value,6,10));
$value = date("d.m.Y \- H:i:s \U\h\r",$value1);
}
if (is_array($value)){ // Warnung, Info und Error sind String Arrays
setValue($vid,""); // Variable löschen, da ein leeres Array übermittelt wird, wenn keine Nachricht vorliegt
foreach ($value as $message) {
SetValue($vid,$message); // Schreibe Nachricht in die Variable
}
} else { // restliche Daten werden hier in die entsprechenden Varibalen geschrieben
if ($value == "") { // bei NULL wird der Wert mit 0 überschrieben
$value=0;
}
SetValue ($vid,$value); // Schreibe Wert in die Variable
}
}
sleep (15); // 15 Sekunden warten bevor die nächsten Daten geholt werden
};
curl_close($ch);
?>