SMA Webbox

Ich habe in der Zwischenzeit mit der SMA Hotline gesprochen.

Der Home Manager kann zwar ModBus, aber nur um die Netzeinspeiseparameter zu überschreiben. Die ganzen anderen Adresse, welche die WebBox kann, können nicht abgefragt werden.

Also muss ich mir hier wohl einen anderen Weg suchen.

Bin gerade dabei eine PV Anlage anzuschaffen.
Auch mit dem Home Manager.

Soll ich lieber ein anderes Produkt wählen welches mit IPS kommuniziert?

Sebastian

Ich frage die WebBox mit IPS ab. Das Skript stammt auch hier aus dem Forum.

Sent from my iPhone using Tapatalk

Das „Problem“ ist, dass der Home Manager im Gegensatz zur WebBox kein ModBus spricht - bzw er nur ein sehr eingeschränktes ModBus spricht, nämlich nur die Adressen welche zur Netzsystemdienstleistungseinstellung notwendig sind.

Ich habe einen anderen Weg gefunden und hole mir die Daten alle 15sec einfach vom SunnyPortal ab :slight_smile:

Das läuft noch nicht 100%ig rund, da InfoMessages, WarningMessages, ErrorMessages und Info wieder ein Array im JSON Array sind. Das muss ich noch einbauen, dass dort dann diese korrekt behandelt werden. Im Moment läuft das das Fehler auf. Habe das Script aber auch gerade erst soweit zusammen - hänge es aber dennoch mal an.
Sobald ich das mit dem Meldungen korrigiert habe, lade ich das angepasste Script hoch.

Gruß,
Torsten

Script entfernt, neues Script im späteren Post

Hallo,
leider erhalte ich bei deinem Script eine Fehlermeldung schon am Anfang

Warning: Objekt Solar wurde nicht gefunden in C:\IP-Symcon\scripts\29559.ips.php on line 49

Warning: Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\29559.ips.php on line 82

Zeile 49 sieht so aus:
$ParentID = IPS_GetCategoryIDByName („Solar“,46491/[Solar]/);
Michael:eek:
.

Hi Michael,

versuchs mal mit der übergeordneten ID
ich hab den Ordner scripte angelegt und darunter SMA dann klappts…
also $ParentID = IPS_GetCategoryIDByName („SMA“,32225 /[scripte\SMA]/);

aber danach komme ich nicht wirklich weiter… Fehler in der Foreach

Grüße
Stefan

Hi,

wie schaut denn die Ausgabe aus, wenn ihr in Zeile 73 folgendes eintragt:


....
$result=json_decode($result,true);
print_r($result);
foreach ($result as $key => $value) {
...

also ein print_r zwischen dem JSON decode und dem foreach?

Gruß,
Torsten

Hi Torsten ,

also bei mir kommt kein Ergebnis, was mich ein wenig wundert…

ich habe so das Gefühl das hier was nicht so ganz passt bei mir…
curl_setopt($ch, CURLOPT_COOKIEJAR, „/var/my_cookies_sma.txt“);
curl_setopt($ch, CURLOPT_COOKIEFILE, „/var/my_cookies_sma.txt“);

hast du eine Idee??

Grüße
Stefan

geht leider auch nicht nun bin ich soweit wie du:cool:

das kann natürlich an dem Verzeichnis für die Cookies liegen.

Bei mir läuft IP-Symcon auf dem Pi - ist passe das gerade für die Windows Version an und hänge das dann gleich hier an :slight_smile:

Here it goes (Version für IPS auf Windows):


Script entfernt, überarbeitetes Script weiter hinten im Thread :)

Der Pfad für die Cookies wurde geändert und dann haben ich hier auch die SSL Verifizierung ausgeschaltet.

Gruß,
Torsten


EDIT:
Falls jemand das TimeStamp Format kennt, wäre es klasse mir dieses zu verraten. Ich komme nicht dahinter - das normale UNIX-Timestamp ist es jedenfalls nicht :confused:

Hi Torsten,

prima jetzt läuft’s, php ist bei mir wohl schon lange her, :confused:
aber langsam sollte ich mal wieder reinkommen.
Vielen Dank für das Script, die wichtigsten Daten bekomme ich jetzt auf jeden fall…

Viele Grüße
Stefan

Hi Torsten

es ist doch ein Unix Format, zumindest passt die Umrechnung
schneide mal die letzten 3 Ziffern ab, scheinen die Millisekunden zu sein, dann passt es…
1418997687…396 = Fri, 19 Dec 2014 14:01:27 GMT

Viele Grüße
Stefan

Hi Stefan,

Du hast recht - auf die Idee bin ich nicht gekommen, war wohl zu easy :wink:

Hier dann nochmals beide Scripte - einmal für Windows und einmal für Pi

IPS-Windows:


Script überarbeitet, neues Script im Beitrag #76


Und hier die Version für IPS auf dem Pi:


Script überarbeitet, neues Script im Beitrag #76


Gruß,
Torsten

Hallo,
erhalte bei dem script eine Fehlermeldung:
Warning: Invalid argument supplied for foreach() in [Solar\SMA] on line 82

kann vllt. jemand helfen?
Michael :loveips:

hi Michael,

hast du das richtige script. Torsten hatte eins für Windows und eins für den PI gepostet…
auf meinem Windows System läuft das Windows auf jedenfall einwandfrei

viele Grüße
Stefan

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

?>

Hallo Torsten,

danke für die Info und das script, habe es gerade bei mir auch geändert…

Viele Grüße
Stefan

Kurze Frage: muss dafür nicht die Skriptlaufzeit erhöht werden? Denn normalerweise wird ein Skript ja nach 30s beendet, oder?

Hi

ja darüber bin ich auch gestolpert
habe in der ersten Zeile des scripts
set_time_limit(1800); eingesetzt damit funktioniert es

Danke für den Hinweis.
Bei mir läuft das Script ohne die zusätzliche Zeile ohne Probleme die 29Minuten durch.
Weiß aber nicht, ob es hier einen Unterschied zwischen der PI und Windows Version gibt.

Gruß,
Torsten