Der Strommix an einem Ort schwankt je nach Uhrzeit und Wetter. Nur an wenigen Orten in Deutschland gibt es Zeiten, bei denen der Strom zu 100% aus Wasser, Wind und/oder Sonne stammt. Der Grünstrom Index (GSI) gibt für jede Stunde einen Wert aus, der den möglichen Anteil aus erneuerbaren Quellen beziffert.
Zur Berechnung des GSI werden die Erzeugungsanlagen im Umkreis einer Postleitzahl angeschaut, die Netztopologie sowie das Wetter. Parallel wird der Verbrauch der privaten Haushalte hochrechnet. Um es nicht noch komplizierter zu machen, gibt es gerne weitere Informationen in meinem Blog - oder auf Anfrage.
GSI für IPS
Beim ersten Ausführen des Scriptes wird eine Reihe von Variablen gesetzt. Zunächst muss der Wert der Variable Postleitzahl angepasst werden.
Nach dem zweiten Ausführen werden die variablen „1in24“,„2in24“… gesetzt. Diese können zum Schalten von Geräten verwendet werden und besagen wie viel Stunden Strom ein Gerät innerhalb von 24 Stunden bekommen soll. Ein Gerät, welches auf die Variable „6in24“ hört wird somit für durchschnittlich 6 Stunden je Tag Storm haben…
Zwei Bitten
[ol]
[li]Die API nicht häufiger als einmal je Stunde aufrufen
[/li][li]Gebt mir bitte Feedback über euren Einsatzzweck und besonders, ob die Nin24 Variablen nützlich sind, oder andere Lösungen besser
[/li][li]
[/li][/ol]
<?
/**
* Grünstromindex (GSI) für IP-Symcon
*
* Mit Hilfe dieses Scriptes kann der Grünstromindex (GSI) zur Steuerung von Geräten verwendet werden.
* Der GSI hat einen hohen Wert, wenn der Anteil von Strom aus Wind, Wasser und Sonne besonders hoch an einem Ort ist.
* Bei einem Wert von 100 bedeutet dies, dass der gesamte Bedarf im Stromnetz durch diese Erzeuger kommen
*
* Beim ersten Ausführen wird geschaut, ob bereits die notwendigen Variablen vorhanden sind und ein Update Event angelegt.
* Danach wird der GSI stündlich aktualisiert und die Variablen entsprechend gesetzt.
*
* Die Variablen lauten "1in24", "2in24" und geben an, dass die N Stunden mit dem höchsten EE-Stromanteil gerade sind.
*
* Verwendung:
* - Ein Gerät, das 1 Stunde pro Tag Strom benötigt, wird entsprechend dem Wert in "1in24" geschaltet
* - Ein Gerät, das 6 Stunden pro Tag Strom benötigt, wird entsprechend dem Wert in "6in24" geschaltet.
*
*
* Weitere Informationen zum GSI:
* http://mix.stromhaltig.de/gsi/
* Mail: me(at)thorsten-zoerner.com
*/
function install($IPS_SELF) {
$hash_id=IPS_CreateVariable(3);
IPS_SetName($hash_id,"Postleitzahl");
IPS_SetParent($hash_id,$IPS_SELF);
IPS_SetVariableCustomProfile ( $hash_id, "~TextBox" );
IPS_SetVariableCustomAction ( $hash_id, $IPS_SELF );
SetValue($hash_id,"69115");
$hash_id=IPS_CreateVariable(3);
IPS_SetName($hash_id,"GSI_WERTE");
IPS_SetParent($hash_id,$IPS_SELF);
IPS_SetVariableCustomProfile ( $hash_id, "~TextBox" );
IPS_SetVariableCustomAction ( $hash_id, $IPS_SELF );
SetValue($hash_id,"{}");
for($i=1;$i<25;$i++) {
$hash_id=IPS_CreateVariable(0);
IPS_SetName($hash_id,$i."in24");
IPS_SetParent($hash_id,$IPS_SELF);
IPS_SetVariableCustomAction ( $hash_id, $IPS_SELF );
}
$hash_id=IPS_CreateVariable(1);
IPS_SetName($hash_id,"GSI AKTUELL");
IPS_SetParent($hash_id,$IPS_SELF);
IPS_SetVariableCustomAction ( $hash_id, $IPS_SELF );
$eid = IPS_CreateEvent(1);
IPS_SetName($eid,"Aktualisierung GSI");
IPS_SetParent($eid,$IPS_SELF);
IPS_SetEventCyclic($eid, 0, 0, 0, 2, 2 ,60); //Alle 15 Minuten
IPS_SetEventActive ($eid, true);
}
/**
* Aktualisiert den GSI Wert und speichert das Ergebnis JSON Encoded in eine Variable
*/
function updateGSI($IPS_SELF) {
$plz=GetValue(IPS_GetObjectIDByName ("Postleitzahl" , $IPS_SELF ));
$gsi_content = Sys_GetURLContent("http://mix.stromhaltig.de/gsi/json/idx/".$plz.".json");
SetValue(IPS_GetObjectIDByName ("GSI_WERTE" , $IPS_SELF ),$gsi_content);
updateSwitches($IPS_SELF,$gsi_content);
}
/**
* Aktualisiert die Schaltempfehlungen
*/
function updateSwitches($IPS_SELF,$gsi_content) {
$gsi=json_decode($gsi_content);
SetValue(IPS_GetObjectIDByName ("GSI AKTUELL" , $IPS_SELF ),$gsi[0]->eevalue);
for($i=0;$i<24;$i++) {
$gsi_max=0;
$j_sel=-1;
for($j=0;$j<24;$j++) {
if($gsi[$j]->eevalue>$gsi_max) { $gsi_max=$gsi[$j]->eevalue; $j_sel=$j; }
}
if($j_sel>-1) {
if($j_sel==0) {
SetValue(IPS_GetObjectIDByName (($i+1)."in24" , $IPS_SELF ),true);
} else {
SetValue(IPS_GetObjectIDByName (($i+1)."in24" , $IPS_SELF ),false);
$gsi[$j_sel]->eevalue=-1;
}
}
}
}
if(!IPS_HasChildren($IPS_SELF)) {
install($IPS_SELF);
} else {
updateGSI($IPS_SELF);
}
?>