GrünstromIndex - Geräte schalten nach aktuellem Strommix an einem Ort

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

?>

coole Sache…

Woher kommen denn eigentlich die Daten ??

Kannst du das 2in24 Pronzip noch ein wenig besser erläutern, bin mir noch unsicher welche Verbraucher ich damit steuern kann - will ja nicht abends vor einem abgetauten Tiefkühler stehen.

So ganz verstehe ich es auch nicht. Der GSI Index den das Skript auswirft ist wohl der wahrscheinliche Anteil des erneuerbaren Stroms vom Stromverbrauch in einer Region.

Ok - das Skript wirft bei mir, nach Änderung auf meine PLZ den Wert 54 aus, ich nehme mal an, dass sind 54%.
Wenn ich auf die Webseite gehe, wo die Daten herkommen (Da gibt es den gleichen Rechner als Webanwendung), dann machen alleine Kohle und Erdgas schon 69% aus, siehe Bild.

Wie passt das zusammen?

:confused:

Hiho,

sehr interessanter Ansatz :slight_smile: und auch sehr löblich hat auf jeden Fall Potential das in eine Hausautomatisierung bzw. Gebäudeautomatisierung zu integrieren.
Aber wie dapor schon gefragt hat … woher kommen die Daten ?

  • Werden die vom Energielieferanten geliefert ?
  • Hochrechnungen bzw Statistiken ?
  • Gibt es ein Portal wo man sich die Daten ansehen kann ?

Ich glaube jetzt nicht das die SCADA / Managementsoftware von den Standwerken Erding die momentan mein Energieversorger ist mir die aktuellen Daten liefert welcher Strom jetzt gerade oder in einer gewissen Zeitspanne geliefert wird.

ahh … ich sehe grade :slight_smile: http://mix.stromhaltig.de/gsi/
Okay … jetzt wäre es ja noch toll wenn die Stromerzeuger noch eine API zur Verfügung stellen um den „Grünstrom“ optimal ausnutzen zu können.

ich wollte wissen, wie sich ein 6in24 also 6Stunden laufzeit in 24h verhällt.

Wenn er die 6Std gleich zu beginn des Tages verbrät, dann läuft mein Tiefkühler dann 18Std überhaupt nicht…

Ergo ich wollte wissen, was man mit den Parametern schalten soll…es wird ja ein Gedanke dahinter stecken…

OK, verstanden, wobei die Thematik/Problematik gerade beim Tiefkühler (wahrscheinlich auch sonst :wink: ) und ähnlichem egal ist.

Was passiert eigentlich wenn viel „grüner“ Strom da ist und darauf hin alle ihre Geräte einschalten :rolleyes:

Dann springt das Gaskraftwerk ein - der GSI veringert sich und es werden wieder Geräte ausgeschaltet.

Eine gewisse Hysterese würde hier sicher gut tun…

Versuche die Fragen mal der Reihe nach zu beantworten… (hätte doch mehr Hintergründe liefern sollen…)

@dapor:
Woher kommen denn eigentlich die Daten?

Die Daten stammen von den Netzbetreibern selbst, der Bundesnetzagentur, der EEX und werden im Strommix Navigator bereits auf Jahreswerte zusammengefasst. Die Stündliche Betrachtung im GSI basiert auf Meldungen der Direktvermarkter (PV/Wind) sowie einer Hochrechnung auf Basis der Erzeugerstrukturen. Da die gesamte Berechnung hinter dem GSI nichts mit IP-Symcon zu tun hat, hier einige Links:
http://www.energie-experten.org/experte/meldung-anzeigen/news/kostenloser-oekostrom-fuer-waermepumpen-4259.html

http://blog.stromhaltig.de/2013/09/wann-ist-der-strom-am-gruensten-preview-webanwendung-fuer-mehr-nachhaltigkeit-aus-der-steckdose/

und zum Strommix-Navigator (Quelldaten):
http://blog.stromhaltig.de/2013/03/webanwendung-erlaubt-berechnung-des-strommixes-der-heimischen-steckdose/

Kannst du das 2in24 Prinzip noch ein wenig besser erläutern

Für Kühlschränke ist dies leider im Moment ungeeignet. Muss mir eine Methode überlegen, wie ich verhindere, dass der Strom für länger als n Stunden weg bleibt. Aktuell wird dieser Switch für die 2 Stunden auf „An“ sein, die den höchsten GSI-Wert haben

@wupi

…Wahrscheinliche Anteil des erneuerbaren Stroms vom Stromverbrauch in einer Region…

Ist nicht ganz richtig. Der Strommix-Navigator ( http://mix.stromhaltig.de/ ) gibt die prozentuale Verteilung über das Jahr aus. Der Wert im GSI entspricht (in der Näherung) wie viel von den vorhandenen Kapazitäten in der Region genutzt werden können. In Deinem Beispiel: ~16% EE-Anteil im Jahresschnitt. Vereinfacht gesagt liegt der tatsächliche Wert zu 50% der Zeit über und zu 50% unter diesem Wert. Der GSI Wert von 50 entspricht somit den 16%.

@flobo

jetzt wäre es ja noch toll wenn die Stromerzeuger noch eine API zur Verfügung stellen um den „Grünstrom“ optimal ausnutzen zu können.

Bei einigen gibt es tatsächlich eine Art API… und am großen Rest arbeite ich bereits… Anekdotensammlung dazu gibt es in meinem Blog…

Für Kühlschränke könnte eigentlich die gleiche Lösung wie bei Wärmepumpen angewendet werden. Muss mal sehen, wie ich diese im Script verarbeiten kann. http://mix.stromhaltig.de/gsi/lokal/markt/69256.html#wp

Meine Direkte Frage an das Euch: Wollt Ihr switches/boolean Werte wie ich es aktuell mache, Rohdaten, wie in der Variable gsi_werte oder irgend eine andere Form…? Was ist am einfachsten für eure Anwendungen?

Naja… nicht ganz… aber (leider) fast. Hierzu muss man noch das Thema Lastprofile und besonders Regelenergie etwas näher betrachten.

Aus den bisherigen Erfahrungen abgeleitet -> ALLE wir wollen IMMER ALLES haben :eek: :loveips: :smiley:

<?OT> Hallo hier is das IPS Forum :slight_smile: wir wollen alles wissen und auch alles haben ^^</?OT>

Zu der API der Energieversorger, da werde ich mal meinem Energieversorger aufn Keks gehen. Wenn die es noch nicht haben dann verkauf ich denen das :slight_smile:

… ne im Ernst … Respekt für so ein Projekt. Ich glaube da steckt viel Brainpower dahinter.

Anwendungen dafür fallen mir aber AdHoc auch nicht ein ausser bei einer Raumlufttechnik Anlage die ich betreue. Man könnte damit zb. Ventilatoren einschalten wenn der GSI passend ist.
Oder aber die Waschmaschine / Trockner ( entsprechende Geräte vorrausgesetzt ) blockieren wenn gerade der GSI weit unten ist.

… möglichkeiten gibts sicher viele. Die Frage ist was es für einen Nutzen Bringt, kann man das evtl. Assoziieren mit dem CO² Ausstoß etc Öko Bilanz oder aber wie von dir beschrieben Reduzierung von dem sog. „GrauStrom“ ? Kenn mich da in dem Thema nicht so gut aus … aber habs mal zum Anlass genommen mich da etwas reinzulesen.

Du würdest erstaunt sein, was die EVUs antworten… die meisten suchen, wenn sie ehrlich sind, eine Berechnung wie den GSI.

Bei der Lüftung, gibt es da auch maximale Abschaltzeiten?

Weiterer Blog Post zum GSI: http://blog.stromhaltig.de/2013/10/gruenstrom-index-per-api-fuer-energieanwendungen-beta/#sthash.BJ3zShlN.dpbs

Hallo ‚zoenert‘,
ich möchte netzdienlich mein Auto laden und finde das Skript (und die Funktion) gut.

Allerdings kommt diese Meldung:
GSI-skriptfehler.png

Ich habe im Ursprungsskript folgendes angepasst:
Zeile 63: http durch https ersetzt
Wenn ich „https://mix.stromhaltig.de/gsi/json/idx/83352.json“ im Browser eingebe, klappt die Abfrage.

Ab und an klappt es, das ist aber für den gewünschten Zweck nicht ausreichend :wink:
Hast du eine Idee was die Ursache der Fehlermeldungen ist?

Danke
Joe Berneder

Tolle Idee, mir persönlich reichte da aber die Visualisierung. Fürs Schalten fällt mir bei mir nix ein, zudem in meiner Region dank einiger Wärmekraftwerke der GSI auch eine stinklangweilige Dynamik hat: Von 2-5 toll, sonst eben nicht so toll. Das Schalten würde ich mit einer Zeitschaltuhr auch hinbekommen.

Andere Regionen sind da deutlich spannender.

Ich habe mir daher das Skript so gebastelt, dass es eine png Grafik erzeugt und unter dem Skript ein Medienobjekt zum EInbinden. Sieht dann so aus wie im Anhang.


<? 
$plz=28201;
$GSI_arr=json_decode(Sys_GetURLContentEx("http://mix.stromhaltig.de/gsi/json/idx/$plz.json",Array("Timeout"=> 60000)),true);

for ($i=0;$i<count($GSI_arr);$i++){
	if ($GSI_arr[$i]['epochtime']>=(time()-intval(date("i"))*60-intval(date("s")))){
		$GSI[$GSI_arr[$i]['epochtime']]=$GSI_arr[$i]['eevalue'];
	}
}

if ($gsiid=@IPS_GetObjectIDByName("GSI",IPS_GetParent($_IPS['SELF']))){
   setvalue($gsiid,$GSI[array_keys($GSI)[0]]);
}
else{
   $gsiid=IPS_CreateVariable(1);
   IPS_SetName($gsiid, "GSI");
   IPS_SetParent($gsiid, IPS_GetParent($_IPS['SELF']));
   IPS_SetVariableCustomProfile($gsiid, "~Intensity.100");
   setvalue($gsiid,$GSI[array_keys($GSI)[0]]);
}

$stepcol=array(
	1=>"FF0000",
	2=>"FF5500",
	3=>"FFAA00",
	4=>"FFFF00",
	5=>"BDEC00",
	6=>"7ADA00",
	7=>"38C700"
);
$i=0;$width=600;$height=30;
$ImageFile = IPS_GetKernelDir()."media/Gruenstromindex.png";
$MediaName="Grünstromindex";

$im = imagecreatetruecolor($width, $height);
imagefilledrectangle ($im, 0, 0, imagesx($im) ,imagesy($im),0);
$transparenz = ImageColorTransparent($im, imagecolorexact($im, 0, 0, 0));
ImageColorTransparent($im, $transparenz);


foreach ($GSI as $ts=>$wert){
	$step=round(floatval($wert)*count($stepcol)/100);
	imagefilledrectangle ($im, round($width/24*$i), -1, round($width/24*($i+1)) ,imagesy($im),hexdec($stepcol[$step]));
	imagerectangle		 ($im, round($width/24*$i), -1, round($width/24*($i+1)) ,imagesy($im),imagecolorexact($im, 0, 0, 0));
	imagestring($im, 1, round($width/24*($i+0.5))-(imagefontwidth(1) * strlen( date("G",$ts) ))/2,  20, date("G",$ts) ,hexdec("000000"));
	imagestring($im, 1, round($width/24*($i+0.5))-(imagefontwidth(1) * strlen( $wert."%" ))/2, 10, $wert."%" ,hexdec("000000"));
	if ($i++==23) break;
}
imagefilledrectangle ($im, round($width/24*(23-date("G",$ts)))-2, 0, round($width/24*(23-date("G",$ts)))+2 ,imagesy($im),hexdec("000000")); // Tagestrenner

imagepng($im,$ImageFile);
if (@!$MediaID=IPS_GetMediaIDByName($MediaName,IPS_GetParent($_IPS['SELF']))){
  $MediaID = IPS_CreateMedia(1);                  // Image im MedienPool anlegen
  IPS_SetMediaFile($MediaID, $ImageFile, true);   // Image im MedienPool mit Image-Datei verbinden
  IPS_SetName($MediaID, $MediaName); // Medienobjekt benennen
  IPS_SetParent($MediaID, IPS_GetParent($_IPS['SELF'])); // Medienobjekt einsortieren unter dem Objekt mit der ID "12345"
  }
IPS_SendMediaEvent($MediaID);
?>

Gruenstromindex.png

Servus Tom,
Ein tolles Skript, läuft stabil und schnell👍.

Was mir persönlich fehlt, ist der aktuelle GSI, um damit schaltvorgänge zu steuern.
Der nackte, aktuelle Wert (integer in einer Variable) wäre die Basis für die Ladefreigabe meines e-Golf.

Da ich programmiertechnisch bei „if-else“ aussteige und Array-Verarbeitung meinen Horizont übersteigt, wäre es absolut genial von Dir, wenn Du den aktuellen GSI ( also den Wert, der zum Zeitpunkt der Skript-Ausführung aktuell ist) extrahieren würdest.

Großen Applaus für Dich!!!

JoeB

Servus Joe,

danke fürs Klatschen. Hab das Script oben angepasst, es sollte beim Aufruf eine Var GSI als Integer anlegen, im Inhalt der aktuelle GSI.

Ich würde auch gerne was Schalten, aber mir fällt nichts sinnvolles ein. Gefriertruhe traue ich mir nicht, sonst ist da auch noch ein Grünwert drin …

Frohes Laden,
Tom

Servus Tom,
danke, das Skript läuft wie gewünscht…ganz großes Kino :D:D

JoeB

Servus Tom,
die Abfrage des GSI für meinen Wohnort läuft stabil :slight_smile:

Ich gebe mit dem Wert die Zusatz-Ladung unseres-Auto frei (= alles was die PV-Anlage nicht schafft)
Im Ladecockpit kann ich die Parameter einstellen / kontrollieren

Die Überlegungen gehen nun in die variable Verwendung des GSI … da muss ich aber noch etwas „sinnieren“, um hier eine klare Zielvorstellung zuhaben.

@Tom: darf ich mich bei Dir nochmal melden, wenn ich eine Variation des Skripts für sinnvoll halte?

praktisches Beispiel wäre: Das Auto benötigt noch 10kWh (bei 3,5kW Ladeleistung) Strom bis morgen 7:00Uhr, wann ist der beste Zeitpunkt das auto zu laden.

bis dahin viiiiiiielen Dank

Servus Tom,
nun sind meine Überlegungen soweit gediehen, dass ich zumeine Schaltanforderung eine klare Vorstellung habe.

Abhängig von Ladestand des e-golf beim „Anstöpslen“, errechne ich die notwendige Lademenge/Ladedauer.
Darauf basierend könnte ich den optimalen Einschaltzeitpunkt ermitteln, wenn ich wüsste, wann der GSI seinen Max-Wert hat.

Daher meine Bitte an Dich:
Kannst Du mir den Maxwert der nächten 24h ermitteln und den Zeitpunkt (epochtime; gerne auch als UNIX-timestamp) ab dem der Wert gültig ist, als Variable raus schreiben?
Ich würde dann, ausgehend vom Zeitpunkt, mit Vor-/ Nachlauf meine Ladezeit festlegen.

Vorausblickend für spätere Verbrauchssperren ist das Gleiche für den Min-Wert sinnvoll.

Ich hoffe, dass diese Wünsche für Dich eine Fingerübung sind, für mich ist es definitiv ein unüberwindbare Hürde.

Vielen Danke und Grüße aus dem verschneiten Süden.
Joe