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

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

Servus,
ich habe nun mal selbst etwas „gezaubert“ (dirty copy&paste):smiley:
Nicht „schön“, der Zweck heiligt die Mittel!

Es gibt nun bei mir zwei Skripte.
Das erste Skript holt die XML-Struktur mit den Daten aus dem Web ab.
Das zweite Skript macht aus den Daten ein Bild (Danke an TomW) und Schaltvorschläge (Danke an zoerner)

Achtung, das Ganze ist „Low-Level“, die automatische Anlage der Variablen aus den ersten Skripten (Tom und zoerner) habe ich weg gelassen!!

Mir war wichtig, dass es stabil läuft und Schaltvorschläge gibt:)

GSI-Abrufen:


<? 
// hier die Postleitzahl Deines Wohnorts eintragen
$plz=10115;
//Speicherort der XML
$GSI_WERTE = 51024 /*[Virtuell\GSI_zoe\GSI-abrufen\GSI_WERTE]*/;
setvalue($GSI_WERTE, Sys_GetURLContentEx("http://mix.stromhaltig.de/gsi/json/idx/$plz.json",Array("Timeout"=> 30000)));
?>

Schaltwerte und Grafik aktualisieren:


<?
//Speicherort der XML
$GSI_WERTE = getvalue(51024 /*[Virtuell\GSI_zoe\GSI-abrufen\GSI_WERTE]*/);

$GSI_arr=json_decode($GSI_WERTE,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=800;$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);

    $gsi=json_decode($GSI_WERTE); 
    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; 
                } 
            } 
    }
?>

Und so sieht die ganze Struktur aus:

Servus ‚zoernert‘,
leider klappt das nicht so wie ich mir es vorstelle :frowning:

Zum schalten von Verbrauchern sind, nach Zeiten gestaffelte Variablen" nicht von vorteil.

Um individuell und zielgerichtet agieren zu können, muss man neben dem Zeitraum (wie lange) auch den Endzeitpunkt (wann fertig) berücksichtigen (der Startzeitpunkt ist oftmals nicht so wichtig).

Ich komme daher auf das Angebot „was will die IP-Symcon Gemeinde“ zurück :slight_smile: (ich bin aber nicht „die Gemeinde“ :D)

  1. Skript zur Speicherung der XML (des GSI) um jederzeit (mehrmals die Stunde) darauf zugreifen zu können -> läuft schon.
  2. Funktion welche mit dem Parameter (duration, endtime) aufgerufen wird.
    Die Rückgabe ist eine Startzeit und der während der Dauer gültige mittlere GSI.

Mit diesen Werten kann man Timer setzten (Startzeit/Endzeit) und Prioritäten fest legen (höchste GSI-Wert hat Vorrang)

Mit dieser Funktion könnte ich (und andere GSI-Befürworter) die Lasten zielgerichtet anstarten.

Danke

Hallo Gemeinde,
nur als Info: ich habe die Skripte wieder deaktiviert, da die IPS-Performance darunter leidet und die Zuverlässigkeit sporadisch nicht gegeben war.

Trotzdem bin ich der Meinung, das wir in diese Richtung (Strom dann zu verbrauchen wenn genügend vorhanden ist) gehen müssen.

Vorsicht mit dem Ein- und Ausschalten bei Gefrierschränken. Die haben teilweise auch Lüfter und Heizungen verbaut.

Generell würde es da wahrscheinlich am ersten Sinn machen die Solltemperatur anhand des GSI zu ändern :slight_smile:

Für Speicher-Heizungen super :slightly_smiling_face:

Der GrünstromIndex (GSI) wurde mittlerweile in etlichen anderen Werkzeugen verbaut und hat eine neue Heimat bekommen. Anlässlich dessen gibt es auch eine neue Version des Scriptes mit etwas anderen Funktionen. Die Performance Probleme sollten gelöst sein.

Bei Fragen bitte PM an mich.

Das Script liegt nun auf GitHub:
GitHub - zoernert/ips_corrently: Adapter Script für die Verwendung von IP-Symcon mit dem Corrently System

Viel Spaß bei der Nutzung :slight_smile:

Servus @zoernert ,
ich habe das Modul „Stromkonto“ installiert, grundsätzlich klappt der Abruf der Daten.

Allerdings erhalte ich eine Meldung:
Notice: Undefined property: stdClass::$variation in C:\ProgramData\Symcon\modules.store\stromkonto\STROMKONTO\module.php on line 39

Was genau muss ich noch tun, damit das module.php fehlerfrei abläuft?

Danke
J. Berneder

Hallo Herr @zoernert,
leider läuft das Modul „Stromkonto“ noch immer nicht „rund“.
Die Fehlermeldung, mit der darauf folgenden Aktion ein „unnamed object“ zu erzeugen, erfordert eine wöchentliche Löschaktion…das ist nicht schön.

Ich hatte auch schon die Variante mit dem MQTT-Client getestet (GSI4MQTT), die Daten kommen korrekt, die Funktion für den aktuellen „GSI“ kommt richtigerweise zum Stundenwechsel.
Die Schaltvorgaben funktionieren aber nicht und der Service läuft instabil.

Das Skript „Tarifinfo“ liefert abweichende Werte (bezogen auf die Webseite gruenstromindex.de mit meiner PLZ)

Was kann ich tun, damit ich zumindest den aktuellen GSI-Index zeitrichtig (zum Stundenwechsel) und als korrekten Wert abrufen kann, ohne dass ich wöchentlich Objekte löschen muss?

Danke

…die Problemanalyse läuft nun per PM…