Um den Temperaturverlauf vom Tag in einem kleinen 48*48 „Trend-Icon“ (siehe Bild)
im Designer (Dashboard) darzustellen, verwende ich folgendes Skript:
$breite = 48; // Pixel
$hoehe = 48; // Pixel
$y_min = 15; // z.B. 15 Grad
$y_max = 25; // z.B. 25 Grad
$y_hline = 60; // Horizontale Linie z.B 20 Grad
$gr_hi = 45; // an diesem Wert wird in ROT gezeichnet
$gr_lo = 18; // unter diesem Wert wird in BLAu gezeichnet
// sonst wird in GRÜN gezeichnet
$temp = GetValue(53567 /*[OG\Flur\Kamin\Temperature]*/); // aktuelle Temperatur
//echo "Temp: $temp
";
// #### Temperaturen in Array speichern ####
$string_array = GetValue(30577 /*[OG\Flur\Kamin\Trend]*/); // ARRAY
$temp_count = $breite ; //Anzahl zu speichernder Temps
//Array auf vorhandensein prüfen / initialisieren
if ($string_array == "")
{
$temp_array = array_fill(0, $temp_count, $temp); // Wenn nicht vorhanden mit 0 Initialisieren
echo "INI
";
}else{
$temp_array = wddx_deserialize($string_array); // Array aus String gewinnen
}
array_unshift($temp_array, $temp); // Vorn neuen Wert anfügen
if (count($temp_array) > $temp_count) // Wenn länger als soll
unset($temp_array[$temp_count]); // Letzen Wert entfernen
//print_r($temp_array); //nur debug-Ausgabe
$im=imagecreate($breite,$hoehe);
$white=imagecolorallocate($im,255,255,255);
imagecolortransparent($im,$white); // Making Image Transparent
$lightblue=imagecolorallocate($im,20,93,233);
$black=imagecolorallocate($im,0,0,0);
$white=imagecolorallocate($im,255,255,255);
$blue=imagecolorallocate($im,128,55,225);
$grau_gruen=imagecolorallocate($im,0,128,128);
$yellow=imagecolorallocate($im,255,255,0);
$rgb_red=imagecolorallocate($im,255,0,0);
$rgb_gruen=imagecolorallocate($im,0,255,0);
$rgb_blau=imagecolorallocate($im,0,0,255);
$zbv_color=imagecolorallocate($im,128,192,128);
for($x=0; $x< $breite; $x = $x + 1) { // 0 bis 47
$y = (($temp_array[$breite-1-$x])* $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
if (($temp_array[$breite-1-$x]) > $gr_hi){
$y0 = ($gr_lo * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
imageline ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y0), $rgb_blau );
$y1 = ($gr_hi * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
imageline ($im, $x, $hoehe-1-$y0, $x, ($hoehe -1 - $y1), $rgb_gruen );
imageline ($im, $x, $hoehe-1-$y1, $x, ($hoehe -1 - $y), $rgb_red );
}
if ((($temp_array[$breite-1-$x]) <= $gr_hi) and (($temp_array[$breite-1-$x]) >= $gr_lo)) {
$y0 = ($gr_lo * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
imageline ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y0), $rgb_blau );
imageline ($im, $x, $hoehe-1-$y0, $x, ($hoehe -1 - $y), $rgb_gruen );
}
if (($temp_array[$breite-1-$x]) < $gr_lo){
imageline ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y), $rgb_blau );
}
}
// Mittelwert
$mw = array_sum($temp_array) / count($temp_array);
//echo "Mittelwert: $mw
";
$y = ($mw * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
imageline ($im, 0,($hoehe -1 - $y), $breite, ($hoehe -1 - $y), $grau_gruen);
$y = ($y_hline * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
imageline ($im, 0,($hoehe -1 - $y), $breite, ($hoehe -1 - $y), $yellow);
ImageString ($im, 2, 8, 36, number_format($temp, 1, ".", "." ) . "°C", $zbv_color);
imagepng($im, IPS_GetKernelDir()."media\ rend_temp_bad.png");
SetValue(30577 /*[OG\Flur\Kamin\Trend]*/, wddx_serialize_value($temp_array) );
Es muss lediglich die Datenquelle: $temp = GetValue(… angepasst werden sowie
eine Variable vom Typ „String“ angelegt werden ($string_array = GetValue(…) - in ihr werden dann die 48 Werte gespeichert (FIFO / Ringspeicher).
Und zuletzt der Name des Icon: imagepng($im, IPS_GetKernelDir().„media\ rend_temp_bad.png“);
IP-Symcon erkennt automatisch diese neue Datei uns stellt diese dem „Media-Pool“ zur Verfügung.
Getriggert wird das Skript alle 30 Minuten > macht also 48 Werte pro Tag - so groß wie das Icon.
Farben und Grenzen für die Werte nach eigenem Geschmack / Gegebenheiten …
Das Ganze soll nicht RRD-Tool o.ä. ersetzen - lediglich eine Ergänzung / Anregung für eigene Skripte.
MST
Achtung: extension = „php_gd2.dll“ in der PHP.ini nicht vergessen!
Siehe auch: