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

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…