Trend-Icon [Designer]

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:

trend_temp.png

INI

Fatal error: Call to undefined function imagecreate() in [Kategorienspeicher\Skripte\Trendicon Keller] on line 27

Ist eine weitere DLL irgendwo einzubinden um Images erstellen zu können ?

Gruss
B71

Hast Du die php_gd2.dll im IPS-Verzeichnis und auch in die PHP.ini eingebunden ?

Ja. Und IPS Service gestoppt und wieder gestartet…
Sowohl Datei, als auch Eintrag in php.ini sind an Ihrem Platz.
Muss der Server komplett durchgebootet werden ?
Doch wohl eher nicht, oder ?

Ehrlich gesagt, keine Ahnung. Ich hätte IPS runtergefahren und den Computer mal neu gestartet.
Anderer Gedanke PHP-Version ? (obwohl ich das nicht vermute)

Aber die passende DLL ?

Schau dir diesen Beitrag an: http://www.ipsymcon.de/forum/f18/php_gd2-dll-nutzen-5426/

Ich schaue heute abend mal.
Mag´sein, dass die DLL falsch ist, da ich mir die einfach im Netz gejagt hatte.

@ Herr Steiner
Könnten Sie Ihre DLL mal posten. Wäre das eventuell möglich ?
Denn diese scheint ja offensichtlich zu funktionieren und man könnte die Fehlerquelle ausschliessen.

Gruss
B71

Hallo B71,

nur als Hinweis:
[i]wir sind hier im Forum immer in der DU Form unterwegs.

[/i]

OK. Imagecreate läuft.
Es war die DLL Datei.
Ich hänge Sie mal der Vollständikeit halber hier an.

Gruss
B71

php_gd2.zip (397 KB)

… und hier ein „doppeltes Icon“ - weil zwei Array:

Unten: in Blau / Grün die Temperaturkurve und
Oben: in „pastell_gelb_orange“ die EIN / AUS Schalt-Zustände einer 2-Punkt-Regelung (läuft sehrt gut!)

Verbesserungsvorschläge sind gern willkommen …

MST

$breite = 48;     	// Pixel-Breite des Icon
$hoehe = 48;      	// Pixel- Höhe des Icon
$y_min = 15;      	// minimaler Wert z.B. 15 Grad
$y_max = 25;      	// maximaler Wert z.B. 25 Grad
$y_hline = 22;    	// Horizontale Linie zeichnen z.B.  20 Grad
$gr_hi = 24;         // ab diesem Wert wird in ROT gezeichnet
$gr_lo = 18;  			// unter diesem Wert wird in BLAu gezeichnet > // sonst wird in GRÜN gezeichnet

// hier die Daten-Quelle angeben
$wert = GetValue(11142 /*[OG\Büro\HM Raumtermostat (Temp/Feuchte)\TEMPERATURE]*/);    // z.B. aktuelle Temperatur
//$wert = 25;
$status = GetValue(29141 /*[OG\Büro\E-Heizng\StatusVariable]*/);
//$status = False;
//$status = True;
//echo $status;
// ab hier nichts ändern !!!
$w_str_array = GetValue(59587 /*[OG\Büro\Trend\Temp Trend]*/); // ARRAY
$s_str_array = GetValue(44067 /*[OG\Büro\Trend\Status Trend]*/); // ARRAY

$count = $breite; //Anzahl zu speichernder Temps
if ($w_str_array == "")
{
   $wert_array = array_fill(0, $count, $wert);  // Wenn nicht vorhanden mit 0 Initialisieren
   echo "INI
";
}else{
   $wert_array = wddx_deserialize($w_str_array );  // Array aus String gewinnen
}

array_unshift($wert_array, $wert);
if (count($wert_array) > $count)
   unset($wert_array[$count]);

if ($s_str_array == "")
{
   $status_array = array_fill(0, $count, $status);  // Wenn nicht vorhanden mit 0 Initialisieren
   echo "INI
";
}else{
   $status_array = wddx_deserialize($s_str_array);  // Array aus String gewinnen
}

array_unshift($status_array, $status);
if (count($status_array) > $count)
   unset($status_array[$count]);

$im=imagecreate($breite,$hoehe);
$white=imagecolorallocate($im,255,255,255);
$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);
$pastell_gelb_orange=imagecolorallocate($im,208,227,0);
imagecolortransparent($im,$white);

$y0 = ($gr_lo * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
$y1 = ($gr_hi  * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
for($x=0; $x< $breite; $x = $x + 1) {   // 0 bis 47
	//echo $wert_array[$breite-1-$x]."
";
	$y = (($wert_array[$breite-1-$x])* $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
	if (($wert_array[$breite-1-$x]) > $gr_hi){
		imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y0), $rgb_blau);
		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 ((($wert_array[$breite-1-$x]) <= $gr_hi) and (($wert_array[$breite-1-$x]) >= $gr_lo)) {
		imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y0), $rgb_blau);
		imageline  ($im, $x, $hoehe-1-$y0, $x, ($hoehe -1 - $y), $rgb_gruen);
   }
   if (($wert_array[$breite-1-$x]) < $gr_lo){
      imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y), $rgb_blau);
   }
	$s_array = $status_array[$breite-1-$x];
	if($s_array == 1){
	   imageline  ($im, $x, 0, $x, ($hoehe -1 - $y), $pastell_gelb_orange);
	 }
}
$mw = array_sum($wert_array) / count($wert_array);
$y = ($mw * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
// Mittel-Wert-Linie - ggf. entfernen
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($wert, 1, ".", "." ) . "°C", $zbv_color);
imagepng($im, IPS_GetKernelDir()."media\	rend_temp_buero.png");
SetValue(59587 /*[OG\Büro\Trend\Temp Trend]*/, wddx_serialize_value($wert_array) );
SetValue(44067 /*[OG\Büro\Trend\Status Trend]*/, wddx_serialize_value($status_array) );

trend_temp_buero.png

Hallo,

liege ich richtig, dass vorgenanntes Script nur mit V2 funktioniert. Begründet ist dies meiner Einschätzung nach mit folgender Code Zeile:
$string_array = GetValue(30577 /[OG\Flur\Kamin\Trend]/); // ARRAY

Arrays als quasi Member-Variablen gibt es in V1 nicht, oder liege ich falsch ???

Einzige Möglichkeit wäre mit einem String zu arbeiten und dann explode bzw. implode zu nutzen richtig ???

… es sollte auch mit „GetValueString“ usw. in V1 laufen …

… und hier ein 40*48 Icon zur 24-Stunden-FHT-Visualisierung:

  1. zwei Variable vom Typ „String“ angelegen
    (eine für Temperatur - hier: $w_str_array und eine für die Position - hier $s_str_array)
  2. beide ID zweimal entsprechend ändern - bei GetValue (Skript-Anfang)- SetValue (Skript-Ende, beide letzten Zeilen)
  3. $wert =, $status = und $t_soll = > ID dreimal entsprechend ändern (FHT80b Instanz) $t_soll > muss ggf. angelegt werden
  4. Trigger: alle 30 Minuten (bei 48 Pixel > 24 Sunden Kurvenverlauf)
  5. Name des Icon (dritt letzzte Zeile *.png entsprechend ändern
    (IP-Symcon erkennt automatisch diese neue Datei und stellt diese dem „Media-Pool“ zur Verfügung)

Farben und Grenzen für die Werte nach eigenem Geschmack / Gegebenheiten (für „Experten“)
Das Ganze soll nicht RRD-Tool o.ä. ersetzen - lediglich eine Ergänzung / Anregung für eigene Skripte.

MST

Bild:
horizontale Line: Soll-Wert hier 19 Grad
schwarze Linie: Ventil-Position
blau/grün: Ist-Temperatur (hier bis 17 Grad blau)

$breite = 48;         // Pixel-Breite des Icon
$hoehe = 48;          // Pixel- Höhe des Icon
$y_min = 12;          // minimaler Wert z.B. 15 Grad
$y_max = 25;          // maximaler Wert z.B. 25 Grad
$gr_hi = 23;         // ab diesem Wert wird in ROT gezeichnet
$gr_lo = 17;              // unter diesem Wert wird in BLAu gezeichnet > // sonst wird in GRÜN gezeichnet

$wert = GetValue(39566 /*[OG\Silvia_Ankleide\FHT80b\Temperature]*/);    // z.B. aktuelle Temperatur
$status = GetValue(42131 /*[OG\Silvia_Ankleide\FHT80b\Position]*/);
$t_soll = GetValue(12711 /*[OG\Silvia_Ankleide\Temp Soll]*/);

$w_str_array = GetValue(22859 /*[OG\Silvia_Ankleide\Trend Temp]*/); // ARRAY
$s_str_array = GetValue(22948 /*[OG\Silvia_Ankleide\Tremt Status]*/); // ARRAY

$count = $breite; //Anzahl zu speichernder Temps
if ($w_str_array == "")
{
   $wert_array = array_fill(0, $count, $wert);  // Wenn nicht vorhanden mit 0 Initialisieren
   echo "INI
";
}else{
   $wert_array = wddx_deserialize($w_str_array );  // Array aus String gewinnen
}

array_unshift($wert_array, $wert);
if (count($wert_array) > $count)
   unset($wert_array[$count]);

if ($s_str_array == "")
{
   $status_array = array_fill(0, $count, $status);  // Wenn nicht vorhanden mit 0 Initialisieren
   echo "INI
";
}else{
   $status_array = wddx_deserialize($s_str_array);  // Array aus String gewinnen
}

array_unshift($status_array, $status);
if (count($status_array) > $count)
   unset($status_array[$count]);

$im=imagecreate($breite,$hoehe);
$white=imagecolorallocate($im,255,255,255);
$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);
$pastell_gelb_orange=imagecolorallocate($im,208,227,0);
imagecolortransparent($im,$white);

$y0 = ($gr_lo * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
$y1 = ($gr_hi  * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
for($x=0; $x< $breite; $x = $x + 1) {   // 0 bis 47
    //echo $wert_array[$breite-1-$x]."
";
    $y = (($wert_array[$breite-1-$x])* $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
    if (($wert_array[$breite-1-$x]) > $gr_hi){
        imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y0), $rgb_blau);
        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 ((($wert_array[$breite-1-$x]) <= $gr_hi) and (($wert_array[$breite-1-$x]) >= $gr_lo)) {
        imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y0), $rgb_blau);
        imageline  ($im, $x, $hoehe-1-$y0, $x, ($hoehe -1 - $y), $rgb_gruen);
   }
   if (($wert_array[$breite-1-$x]) < $gr_lo){
      imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y), $rgb_blau);
   }
// Status / Position %
    $y_faktor = 15;   // Kurve kleiner machen
    $hilf = $status_array[$breite-1-$x] / $y_faktor;
    $hilf_alt = $status_array[$breite -$x] / $y_faktor;
    $y_verschieben = 3; // Kurve nach oben verschieben
    $y = (($hilf+ $y_min + $y_verschieben)* $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
    $yalt = (($hilf_alt + $y_min + $y_verschieben)* $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
    imageline  ($im, $x, ($hoehe - $y), $x, ($hoehe - $yalt), $black);
}

//Soll-Wert
$y = ($t_soll * $breite/($y_max - $y_min) -($breite/($y_max - $y_min)*$y_min));
imageline  ($im, 0,($hoehe -1 - $y), $breite, ($hoehe -1 - $y), $grau_gruen);
ImageString ($im, 2, 8, 36, number_format($wert, 1, ".", "." ) . "°C", $zbv_color);
imagepng($im, IPS_GetKernelDir()."media\	rend_fht_ankleide.png");
SetValue(22859 /*[OG\Silvia_Ankleide\Trend Temp]*/, wddx_serialize_value($wert_array) );
SetValue(22948 /*[OG\Silvia_Ankleide\Tremt Status]*/, wddx_serialize_value($status_array) );

trend_fht_bsp.png

Hallo Steiner,

ich finde die Icons gut. Leider bekomme ich bei der letzten Version in folgender Zeile einen Fehler:

    $hilf_alt = $status_array[$breite - $x] / $y_faktor;
<b>Notice</b>:  Undefined offset:  48 in <b>C:\Programme\IP-SYMCON\scripts\Icon_FHT_erstellen.ips.php</b> on line <b>89</b><br />

Das Array geht von 0 - 47 , doch beim ersten Durchlauf der Schleife wird Position 48 abgefragt.

Vielleicht hast du eine Lösung.

Gruß

… versuche für einen Durchlauf:

$hilf_alt = $hilft;

in etwa so:

 if ($x==0) $hilf_alt = $hilf ;
 else $hilf_alt = $status_array[$breite - $x] / $y_faktor;

Gruß

… auf vielfachen Wunsch habe ich das Skript aus dem Archiv gekramt:

<?
$breite = 96;     	// Pixel-Breite des Icon  / alle 15 Minuten > 24 * 60 / 15
$hoehe = 48;      	// Pixel- Höhe des Icon
$y_min = 12;      	// minimaler Wert z.B. 15 Grad
$y_max = 25;      	// maximaler Wert z.B. 25 Grad
$gr_hi = 22;         // ab diesem Wert wird in ROT gezeichnet
$gr_lo = 17;  			// unter diesem Wert wird in BLAu gezeichnet > // sonst wird in GRÜN gezeichnet

$wert = GetValue(47403 /*[EG\Kleine Klasse\Wandthermostat Ist\TEMPERATURE]*/);    // z.B. aktuelle Temperatur
$status = GetValue(32543 /*[EG\Kleine Klasse\Stellventil Fenster\VALVE_STATE]*/);
$t_soll = GetValue(11016 /*[EG\Kleine Klasse\Raumthermostat Soll\SETPOINT]*/);

$w_str_array = GetValue(14611 /*[EG\Kleine Klasse\Stellventil Fenster\Trend Pos Stellventil\Trend Temp FHT]*/); // ARRAY
$s_str_array = GetValue(58273 /*[EG\Kleine Klasse\Stellventil Fenster\Trend Pos Stellventil\Trend Pos FHT]*/); // ARRAY
$count = $breite; //Anzahl zu speichernder Temps

// 1. ARRAY
if ($w_str_array == ""){
   $wert_array = array_fill(0, $count, $wert);  // Wenn nicht vorhanden mit 0 Initialisieren
   echo "INI
";
}else{
   $wert_array = wddx_deserialize($w_str_array );  // Array aus String gewinnen
}
array_unshift($wert_array, $wert);
if (count($wert_array) > $count)
   unset($wert_array[$count]);

// 2. ARRAY
if ($s_str_array == ""){
   $status_array = array_fill(0, $count, $status);  // Wenn nicht vorhanden mit 0 Initialisieren
   echo "INI
";
}else{
   $status_array = wddx_deserialize($s_str_array);  // Array aus String gewinnen
}
array_unshift($status_array, $status);
if (count($status_array) > $count)
   unset($status_array[$count]);

// Farben
$im=imagecreate($breite,$hoehe);
$white=imagecolorallocate($im,255,255,255);
$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);
$pastell_gelb_orange=imagecolorallocate($im,208,227,0);
imagecolortransparent($im,$white);

// Grafik
$y0 = ($gr_lo * $hoehe/($y_max - $y_min) -($hoehe/($y_max - $y_min)*$y_min));
$y1 = ($gr_hi  * $hoehe/($y_max - $y_min) -($hoehe/($y_max - $y_min)*$y_min));
for($x=0; $x< $breite; $x = $x + 1) {   // 0 bis Breite
	$y = (($wert_array[$breite-1-$x])* $hoehe/($y_max - $y_min) -($hoehe/($y_max - $y_min)*$y_min));
	if (($wert_array[$breite-1-$x]) > $gr_hi){
		imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y0), $rgb_blau);
		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 ((($wert_array[$breite-1-$x]) <= $gr_hi) and (($wert_array[$breite-1-$x]) >= $gr_lo)) {
		imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y0), $rgb_blau);
		imageline  ($im, $x, $hoehe-1-$y0, $x, ($hoehe -1 - $y), $rgb_gruen);
   }
   if (($wert_array[$breite-1-$x]) < $gr_lo){
      imageline  ($im, $x, $hoehe-1, $x, ($hoehe -1 - $y), $rgb_blau);
   }
// Status / Position % (Sonderfall - 2. Skalierung 0 bis 100%)
	$y_faktor = 8;   // Kurve kleiner machen
	$hilf = $status_array[$breite-1-$x] / $y_faktor;
	$hilf_alt = $status_array[$breite -0 -$x] / $y_faktor;
	if ($x==0) $hilf_alt = $hilf ;
	else $hilf_alt = $status_array[$breite - $x] / $y_faktor;
	$y_verschieben = 0; // Kurve N-Pixel nach oben verschieben
	$y = (($hilf+ $y_min)* $hoehe/($y_max - $y_min) -($hoehe/($y_max - $y_min)*$y_min));
	$yalt = (($hilf_alt + $y_min)* $hoehe/($y_max - $y_min) -($hoehe/($y_max - $y_min)*$y_min));
	imageline  ($im, $x, ($hoehe - $y)-	$y_verschieben, $x, ($hoehe - $yalt)-	$y_verschieben, $black);
}

//Soll-Wert
$y = ($t_soll * $hoehe/($y_max - $y_min) -($hoehe/($y_max - $y_min)*$y_min));
imageline  ($im, 0,($hoehe -1 - $y), $breite, ($hoehe -1 - $y), $grau_gruen);
ImageString ($im, 2, $breite/2-10, $hoehe -12, number_format($wert, 1, ".", "." ) . "°C", $zbv_color);
imagepng($im, IPS_GetKernelDir()."media\	rend_fht_kk.png");
SetValue(14611 /*[EG\Kleine Klasse\Stellventil Fenster\Trend Pos Stellventil\Trend Temp FHT]*/, wddx_serialize_value($wert_array) );
SetValue(58273 /*[EG\Kleine Klasse\Stellventil Fenster\Trend Pos Stellventil\Trend Pos FHT]*/, wddx_serialize_value($status_array) );
?>

MST

trend_fht_kk.png