Servus,
ich habe nun mal selbst etwas „gezaubert“ (dirty copy&paste)
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: