Multi-Charts mit PHP

Hallo,

da mir die Google-Charts nicht so richtig gefallen haben, da wurden die Graphen bei mir zu sehr geglättet und außerdem muss die NSA ja nicht wissen wie warm es bei mir im Bad ist:p, hab ich mich mal dran gemacht mir meine eigenen Charts zu programmieren. Vielleicht kann es ja noch jemand gebrauchen…:rolleyes:
Vermutlich werden die PHP-Profis bei dem Code die Kriese kriegen:eek:, aber so können die Charts ohne externe API’s oder zusätzliche Software direkt von IPS erzeugt werden.:loveips:
Achtung! Bei Variablen mit hoher Anzahl geloggter Werte kann die Erzeugung einer Jahresansicht recht lange dauern!

Mal zwei Beispiele:
EG_Bad.png Ölpreis.jpg

Hier das Script mit den Funktionen (einmal anlegen und die ID in den include-Befehl der Charts-Skripte einfügen)


<?
//Kompatibilitätsfunktion für AC-GetLogged_Values
    function AC_GetLoggedValuesCompatibility($instanceID, $variableID, $startTime, $endTime, $limit)
	 	{
        $values = AC_GetLoggedValues($instanceID, $variableID, $startTime, $endTime, $limit );
        if((sizeof($values) == 0) || (end($values)['TimeStamp'] > $startTime))
		  		{
            $previousRow = AC_GetLoggedValues($instanceID, $variableID, 0, $startTime - 1, 1 );
            $values = array_merge($values, $previousRow);
        		}
        return $values;
    	}

//********************************************************************************
//Funktion zum Linien im Chart zeichnen

function Linie($Variable,$ChartPNG,$ArchivHandler,$Breite,$Hoehe,$Breite_Chart,$Hoehe_Chart,$Rand_rechts,$Maxwert,$Minwert,$Farbe,$Art,$BoolFaktor,$Zeitbereich)
	{
	if($Zeitbereich==1){$Dauer=1;} //Stunde
	if($Zeitbereich==2){$Dauer=24;} //Tag
	if($Zeitbereich==3){$Dauer=7*24;} //Woche
	if($Zeitbereich==4){$Dauer=31*24;} //Monat
	if($Zeitbereich==5){$Dauer=365*24;} //Jahr
	$Linie=AC_GetLoggedValuesCompatibility($ArchivHandler,$Variable,(time()-$Dauer*60*60),time(),0);

	$Faktor_x=($Dauer*60*60/$Breite_Chart);
	$Faktor_y=($Maxwert-$Minwert)/$Hoehe_Chart;
	$Zeit=time();

	//Liniengraph
	if ($Art==1)
		{
		$Value=$Linie[0];
		$xalt=$Breite-$Rand_rechts;
		$yalt=$Hoehe-30-round(($Value['Value']-$Minwert)/$Faktor_y);
		foreach($Linie as $wert) {
			$x=$Breite-$Rand_rechts-round(($Zeit-$wert['TimeStamp'])/$Faktor_x);
			$y=$Hoehe-30-round(($wert['Value']-$Minwert)/$Faktor_y);
			if ($x < ($Breite-$Rand_rechts-$Breite_Chart)){$x=($Breite-$Rand_rechts-$Breite_Chart);}
			imageline ($ChartPNG , $xalt , $yalt , $x , $y , $Farbe );
			$xalt=$x; $yalt=$y;
			}
		}

	//Eckige Linie
	if ($Art==2)
		{
		$Value=$Linie[0];
		$xalt=$Breite-$Rand_rechts;
		$yalt=$Hoehe-30-round(($Value['Value']-$Minwert)/$Faktor_y);
		foreach($Linie as $wert) {
			$x=$Breite-$Rand_rechts-round(($Zeit-$wert['TimeStamp'])/$Faktor_x);
			$y=$Hoehe-30-round(($wert['Value']-$Minwert)/$Faktor_y);
			if ($x < ($Breite-$Rand_rechts-$Breite_Chart)){$x=($Breite-$Rand_rechts-$Breite_Chart);}
			imageline ($ChartPNG , $xalt , $yalt , $xalt , $y , $Farbe );
			imageline ($ChartPNG , $xalt , $y , $x , $y , $Farbe );
			$xalt=$x; $yalt=$y;
			}
		}

	//Boolsche Variable
	if ($Art==3)
		{
		$Value=$Linie[0];
		$xalt=$Breite-$Rand_rechts;
		if($Value['Value']==TRUE){$yalt=$Hoehe-30-round(1000/192.3);}
		if($Value['Value']==FALSE){$yalt=$Hoehe-30;}
		foreach($Linie as $wert) {
			$x=$Breite-$Rand_rechts-round(($Zeit-$wert['TimeStamp'])/$Faktor_x);
			$boolean=($wert['Value']);
			if($boolean==TRUE){$y=$Hoehe-30-($Hoehe_Chart/10)*$BoolFaktor;}
			if($boolean==FALSE){$y=$Hoehe-30;}
			if ($x < ($Breite-$Rand_rechts-$Breite_Chart)){$x=($Breite-$Rand_rechts-$Breite_Chart);}
			imageline ($ChartPNG , $xalt , $yalt , $xalt , $y , $Farbe );
			imageline ($ChartPNG , $xalt , $y , $x , $y , $Farbe );
			$xalt=$x; $yalt=$y;
			}
		}

	//Fenstergriffsensor
	if ($Art==4)
		{
		$Value=$Linie[0];
		$xalt=$Breite-$Rand_rechts;
		if($Value['Value']==2){$yalt=$Hoehe-30-($Hoehe_Chart/10)*$BoolFaktor;}
		if($Value['Value']==1){$yalt=$Hoehe-30-($Hoehe_Chart/10)/2*$BoolFaktor;}
		if($Value['Value']==0){$yalt=$Hoehe-30;}
		foreach($Linie as $wert) {
			$x=$Breite-$Rand_rechts-round(($Zeit-$wert['TimeStamp'])/$Faktor_x);
			$boolean=($wert['Value']);
			if($boolean==TRUE){$y=$Hoehe-30-($Hoehe_Chart/10)*$BoolFaktor;}
			if($boolean==FALSE){$y=$Hoehe-30;}
			if ($x < ($Breite-$Rand_rechts-$Breite_Chart)){$x=($Breite-$Rand_rechts-$Breite_Chart);}
			imageline ($ChartPNG , $xalt , $yalt , $xalt , $y , $Farbe );
			imageline ($ChartPNG , $xalt , $y , $x , $y , $Farbe );
			$xalt=$x; $yalt=$y;
			}
		}


}
//Ende Function Linie()

//Funktion XBeschriftung abhängig vom gewählten Zeitbereich
function XBeschriftung($Zeitbereich,$ChartPNG,$Rand_links,$Rand_rechts,$Hoehe,$Breite,$schwarz,$Breite_Chart)
	{
	$Zeit=time();
	if ($Zeitbereich == 1) //Stunde
		{
		$xText=date("H:i",$Zeit);
  		imagestring($ChartPNG, 2, $Rand_links-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("H:i",$Zeit-15*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4*3-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("H:i",$Zeit-30*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/2-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("H:i",$Zeit-45*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("H:i",$Zeit-60*60);
  		imagestring($ChartPNG, 2, $Breite-$Rand_rechts-15, ($Hoehe-20), $xText, $schwarz);
		}

	if ($Zeitbereich == 2) //Tag
		{
		$xText=date("H:i",$Zeit);
  		imagestring($ChartPNG, 2, $Rand_links-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("H:i",$Zeit-6*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4*3-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("H:i",$Zeit-12*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/2-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("H:i",$Zeit-18*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("H:i",$Zeit-24*60*60);
  		imagestring($ChartPNG, 2, $Breite-$Rand_rechts-15, ($Hoehe-20), $xText, $schwarz);
		}
	if ($Zeitbereich == 3) //Woche
		{
  		$xText=date("d.M",$Zeit-7*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-7/4*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4*3-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-7/4*2*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/2-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-7/4*3*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4-15, ($Hoehe-20), $xText, $schwarz);

		$xText=date("d.M",$Zeit);
  		imagestring($ChartPNG, 2, $Breite-$Rand_rechts-15, ($Hoehe-20), $xText, $schwarz);
		}
	if ($Zeitbereich == 4) //Monat
		{
		$xText=date("d.M",$Zeit);
  		imagestring($ChartPNG, 2, $Rand_links-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-31/4*2460*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4*3-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-31/2*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/2-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-31/4*3*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-31*24*60*60);
  		imagestring($ChartPNG, 2, $Breite-$Rand_rechts-15, ($Hoehe-20), $xText, $schwarz);
		}
	if ($Zeitbereich == 5) //Jahr
		{
		$xText=date("d.M",$Zeit);
  		imagestring($ChartPNG, 2, $Rand_links-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-92*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4*3-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-183*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/2-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-274*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-365*24*60*60);
  		imagestring($ChartPNG, 2, $Breite-$Rand_rechts-15, ($Hoehe-20), $xText, $schwarz);
		}

	}
//ENDE Function XBeschriftung


?>

Für jedes Chart muss dann noch ein Skript angelegt werden, welches die Charts auf ein beliebiges Hintergrundbild zeichnet und dann als *.PNG abspeichert.

Das Skript zum 1. Beispiel:


<?
//*******************************************************************************************************
// EG-Bad
//*******************************************************************************************************
include ("39582.ips.php");

$ArchivHandler=40475 /*[Archive Handler]*/;
$Hintergrund='C:\IP-Symcon\media\Graphen\Hintergrund_grau_weiss_rot_blau.png';
$Zeitbereich=2; //1=Stunde 2=Tag 3=Monat 4=Jahr

//Laden des .PNG Files zur Charterzeugung
$ChartPNG=imagecreatefrompng($Hintergrund);

//Festlegen des Dateinamens und der Variablen
$file='C:\ip-symcon\media\Graphen\EG_Bad.png';
$Variable1=19757 /*[Haus\Erdgeschoss\EG-Bad\Raumregler\EG-Bad-Istdaten\TEMPERATURE]*/;//ID der Variablen
$Variable2=31702 /*[Haus\Erdgeschoss\EG-Bad\Raumregler\EG-Bad-Istdaten\HUMIDITY]*/;//ID der Variablen
$Variable3=51534 /*[Haus\Erdgeschoss\EG-Bad\Raumregler\EG-Bad-Solldaten\SETPOINT]*/;//ID der Variablen
$Variable4=19572 /*[Haus\Erdgeschoss\EG-Bad\Raumregler\EG-Bad-Stellmotor\VALVE_STATE]*/;//ID der Variablen
$Variable5=16142 /*[Haus\Erdgeschoss\EG-Bad\Raumregler\EG-Bad-Fenster\STATE]*/;//ID der Variablen
$Variable6=50450 /*[Haus\Erdgeschoss\EG-Bad\EG-Bad-Heizstrahler\STATE]*/;//ID der Variablen

//Festlegen der Dimensionen des Charts
  $size = getimagesize($Hintergrund);
  $Breite=$size[0];//Gesamtbreite des .png Files
  $Hoehe=$size[1];//Gesamthöhe des .png Files

  $Rand_links=40;//linker Rand für Beschriftung
  $Rand_oben=40;//Rand oben für Überschrift+Legende
  $Rand_rechts=30;//Rand rechts für evtl. 2.Beschriftung
//Farbdefinitionen
  $schwarz=imagecolorallocate($ChartPNG,0,0,0);
  $grau=imagecolorallocate($ChartPNG,150,150,150);
  $weiss=imagecolorallocate($ChartPNG,255,255,255);
  $rot=imagecolorallocate($ChartPNG,255,0,0);
  $blau=imagecolorallocate($ChartPNG,0,0,255);
  $gruen=imagecolorallocate($ChartPNG,0,255,0);
  $gelb=imagecolorallocate($ChartPNG,255,255,0);
  $lila=imagecolorallocate($ChartPNG,150,0,150);
  $petrol=imagecolorallocate($ChartPNG,0,150,150);


//Überschrift
  $Ueberschrift = 'EG-Bad';
  $text_width = imagefontwidth(5);
  $textlaenge = strlen($Ueberschrift);
  $width = $textlaenge*$text_width;
  imagestring($ChartPNG, 5, ((600/2)-($width/2)), 2, $Ueberschrift, $schwarz);

//Y-Achsen
  $Maxwert_l=30;//Maximaler Wert Y-Achse links
  $Minwert_l=10;//Minimaler Wert Y-Achse links

  $Maxwert_r=100;//Maximaler Wert Y-Achse rechts
  $Minwert_r=0;//Minimaler Wert Y-Achse rechts

  //Beschriftung Y-Achse links
    imagestring($ChartPNG, 3, 5, 20, '°C', $schwarz);

  //Beschriftung Y-Achse rechts
    $Y_rechts='%';
    $text_width = imagefontwidth(3);
    $textlaenge = strlen($Y_rechts);
    imagestring($ChartPNG, 3, $Breite-$textlaenge*$text_width-5, 20, $Y_rechts, $schwarz);




//Legende
  //Reihe 1
  imagestring($ChartPNG, 2, $Rand_links, 3  , 'Ist-Temp', $blau); //Linie 1
  imagestring($ChartPNG, 2, $Rand_links, 15 , 'Luftfeuchte', $rot); //Linie 2
  imagestring($ChartPNG, 2, $Rand_links, 27 , 'Soll-Temp', $gruen); //Linie 3

  //Reihe 2
  imagestring($ChartPNG, 2, $Breite-$Breite/2+100 , 3, 'Ventil', $gelb); //Linie 1
  imagestring($ChartPNG, 2, $Breite-$Breite/2+100 , 15, 'Fenster', $lila); //Linie 2
  imagestring($ChartPNG, 2, $Breite-$Breite/2+100 , 27, 'Heizstrahler', $petrol); //Linie 3


//Maße berechnen
$Breite_Chart=$Breite-$Rand_links-$Rand_rechts;
$Hoehe_Chart=$Hoehe-$Rand_oben-30;
$Feld_b=$Breite_Chart/12;
$Feld_h=$Hoehe_Chart/10;

//Gitternetz
  //senkrecht
  for ($x=0; $x<=12; $x++)
    	{
		imageline ($ChartPNG , ($Breite_Chart+$Rand_links-($Feld_b*$x)) , ($Hoehe-30) , ($Breite_Chart+$Rand_links-($Feld_b*$x)) , $Rand_oben , $grau );
		}
  //waagerecht
  for ($x=0; $x<=10; $x++)
 		{
		imageline ($ChartPNG , $Rand_links , ($Rand_oben+$Feld_h*$x) , ($Breite-$Rand_rechts) , ($Rand_oben+$Feld_h*$x) , $grau );
		}


//Linien zeichnen
 Linie($Variable1,$ChartPNG,$ArchivHandler,$Breite,$Hoehe,$Breite_Chart,$Hoehe_Chart,$Rand_rechts,$Maxwert_l,$Minwert_l,$blau,1,0,$Zeitbereich);
 Linie($Variable2,$ChartPNG,$ArchivHandler,$Breite,$Hoehe,$Breite_Chart,$Hoehe_Chart,$Rand_rechts,$Maxwert_r,$Minwert_r,$rot,1,0,$Zeitbereich);
 Linie($Variable3,$ChartPNG,$ArchivHandler,$Breite,$Hoehe,$Breite_Chart,$Hoehe_Chart,$Rand_rechts,$Maxwert_l,$Minwert_l,$gruen,2,0,$Zeitbereich);
 Linie($Variable4,$ChartPNG,$ArchivHandler,$Breite,$Hoehe,$Breite_Chart,$Hoehe_Chart,$Rand_rechts,$Maxwert_r,$Minwert_r,$gelb,2,0,$Zeitbereich);
 Linie($Variable5,$ChartPNG,$ArchivHandler,$Breite,$Hoehe,$Breite_Chart,$Hoehe_Chart,$Rand_rechts,$Maxwert_r,$Minwert_r,$lila,4,3,$Zeitbereich);
 Linie($Variable6,$ChartPNG,$ArchivHandler,$Breite,$Hoehe,$Breite_Chart,$Hoehe_Chart,$Rand_rechts,$Maxwert_r,$Minwert_r,$petrol,3,4,$Zeitbereich);

//X-Beschriftung
XBeschriftung($Zeitbereich,$ChartPNG,$Rand_links,$Rand_rechts,$Hoehe,$Breite,$schwarz,$Breite_Chart);

//Y-Beschriftung links
for ($i=0; $i<=10; $i++)
	{
	$yText=$Minwert_l+$i*($Maxwert_l-$Minwert_l)/10;
	imagestring($ChartPNG, 2, 5, $Hoehe-30-($Hoehe_Chart/10)*$i, $yText, $schwarz);
	}

//Y-Beschriftung rechts
for ($i=0; $i<=10; $i++)
	{
	$yText=$Minwert_r+$i*($Maxwert_r-$Minwert_r)/10;
	imagestring($ChartPNG, 2, $Breite-$Rand_rechts+3, $Hoehe-30-($Hoehe_Chart/10)*$i, $yText, $schwarz);
	}
//Bild speichern
imagepng($ChartPNG, $file);

// Destroy image
imagedestroy($ChartPNG);

?>

Das Skript zum Ölpreis-Chart:


<?
//*******************************************************************************************************
// Ölpreis
//*******************************************************************************************************
include ("39582.ips.php");

$ArchivHandler=40475 /*[Archive Handler]*/;
//$Hintergrund='C:\IP-Symcon\media\Graphen\Hintergrund_grau_weiss_rot_blau.png';
$Hintergrund='C:\IP-Symcon\media\Graphen\Haus_Hintergrund.png';
$Zeitbereich=5; //1=Stunde 2=Tag 3=Wochw 4=Monat 5=Jahr

//Laden des .PNG Files zur Charterzeugung
$ChartPNG=imagecreatefrompng($Hintergrund);

//Festlegen des Dateinamens und der Variablen
$file='C:\ip-symcon\media\Graphen\Ölpreis.png';
$Variable1=41238 /*[Haus\Heizung\Öl-Preis\Öl-Preis]*/;//ID der Variablen

//Festlegen der Dimensionen des Charts
  $size = getimagesize($Hintergrund);
  $Breite=$size[0];//Gesamtbreite des .png Files
  $Hoehe=$size[1];//Gesamthöhe des .png Files

  $Rand_links=60;//linker Rand für Beschriftung
  $Rand_oben=40;//Rand oben für Überschrift+Legende
  $Rand_rechts=20;//Rand rechts für evtl. 2.Beschriftung
//Farbdefinitionen
  $schwarz=imagecolorallocate($ChartPNG,0,0,0);
  $grau=imagecolorallocate($ChartPNG,150,150,150);
  $weiss=imagecolorallocate($ChartPNG,255,255,255);
  $rot=imagecolorallocate($ChartPNG,255,0,0);
  $blau=imagecolorallocate($ChartPNG,0,0,255);
  $gruen=imagecolorallocate($ChartPNG,0,255,0);
  $gelb=imagecolorallocate($ChartPNG,255,255,0);
  $lila=imagecolorallocate($ChartPNG,150,0,150);
  $petrol=imagecolorallocate($ChartPNG,0,150,150);

//Überschrift
  $Ueberschrift = 'Ölpreis';
  $text_width = imagefontwidth(5);
  $textlaenge = strlen($Ueberschrift);
  $width = $textlaenge*$text_width;
  imagestring($ChartPNG, 5, ((600/2)-($width/2)), 2, $Ueberschrift, $schwarz);

//Y-Achsen
  $Maxwert_l=100;//Maximaler Wert Y-Achse links
  $Minwert_l=70;//Minimaler Wert Y-Achse links

  $Maxwert_r=100;//Maximaler Wert Y-Achse rechts
  $Minwert_r=70;//Minimaler Wert Y-Achse rechts

  //Beschriftung Y-Achse links
    imagestring($ChartPNG, 3, 5, 20, '€/100L', $schwarz);
  //Beschriftung Y-Achse rechts
    $Y_rechts='';
    $text_width = imagefontwidth(3);
    $textlaenge = strlen($Y_rechts);
    imagestring($ChartPNG, 3, $Breite-$textlaenge*$text_width-5, 20, $Y_rechts, $schwarz);

//Legende
  //Reihe 1
  imagestring($ChartPNG, 2, $Rand_links, 3  , 'Euro', $blau); //Linie 1
//  imagestring($ChartPNG, 2, $Rand_links, 15 , 'Linie 2', $rot); //Linie 2
//  imagestring($ChartPNG, 2, $Rand_links, 27 , 'Linie 3', $gruen); //Linie 3

  //Reihe 2
//  imagestring($ChartPNG, 2, $Breite-$Breite/2+100 , 3, 'Linie 4', $gelb); //Linie 1
//  imagestring($ChartPNG, 2, $Breite-$Breite/2+100 , 15, 'Linie 5', $lila); //Linie 2
//  imagestring($ChartPNG, 2, $Breite-$Breite/2+100 , 27, 'Linie 6', $petrol); //Linie 3


//Maße des eigendlichen Charts in Pixel berechnen
$Breite_Chart=$Breite-$Rand_links-$Rand_rechts;
$Hoehe_Chart=$Hoehe-$Rand_oben-30;
$Feld_b=$Breite_Chart/12;
$Feld_h=$Hoehe_Chart/10;

//Gitternetz zeichnen
  //senkrecht
  for ($x=0; $x<=12; $x++)
    	{
		imageline ($ChartPNG , ($Breite_Chart+$Rand_links-($Feld_b*$x)) , ($Hoehe-30) , ($Breite_Chart+$Rand_links-($Feld_b*$x)) , $Rand_oben , $grau );
		}
  //waagerecht
  for ($x=0; $x<=10; $x++)
 		{
		imageline ($ChartPNG , $Rand_links , ($Rand_oben+$Feld_h*$x) , ($Breite-$Rand_rechts) , ($Rand_oben+$Feld_h*$x) , $grau );
		}


//Linien bzw. Graphen zeichnen
 Linie($Variable1,$ChartPNG,$ArchivHandler,$Breite,$Hoehe,$Breite_Chart,$Hoehe_Chart,$Rand_rechts,$Maxwert_l,$Minwert_l,$blau,1,0,$Zeitbereich);

//X-Beschriftung 
XBeschriftung($Zeitbereich,$ChartPNG,$Rand_links,$Rand_rechts,$Hoehe,$Breite,$schwarz,$Breite_Chart);

//Werte der Variablen für Min/Max/Aktuell auslesen
$Zeit=time();
	if ($Zeitbereich == 1) //Stunde
		{
		$Preis=AC_GetLoggedValues($ArchivHandler,$Variable1,time()-60*60,time(),0);
		}

	if ($Zeitbereich == 2) //Tag
		{
		$Preis=AC_GetLoggedValues($ArchivHandler,$Variable1,time()-24*60*60,time(),0);
		}

	if ($Zeitbereich == 3) //Woche
		{
		$Preis=AC_GetLoggedValues($ArchivHandler,$Variable1,time()-7*24*60*60,time(),0);
		}

	if ($Zeitbereich == 4) //Monat
		{
		$Preis=AC_GetLoggedValues($ArchivHandler,$Variable1,time()-31*24*60*60,time(),0);
		}
	if ($Zeitbereich == 5) //Jahr
		{
		$Preis=AC_GetLoggedValues($ArchivHandler,$Variable1,time()-365*24*60*60,time(),0);
		}

//Y-Beschriftung links
for ($i=0; $i<=10; $i++)
	{
	$yText=$Minwert_l+$i*($Maxwert_l-$Minwert_l)/10;
	imagestring($ChartPNG, 2, 5, $Hoehe-30-($Hoehe_Chart/10)*$i, $yText, $schwarz);
	}

//Maxwert / Minwert / aktuell
$aktuell=$Preis[0]['Value'];
foreach ($Preis as $v)
{
    $value[] = $v['Value'];
//    rsort($value);
}

rsort($value);

$Max=$value[0];
$Anzahl=count($value);
$Min=$value[$Anzahl-1];
  imagestring($ChartPNG, 2, $Rand_links+5, ($Hoehe-$Hoehe_Chart), 'Maximal: '.number_format($Max,2).'EUR', $schwarz);
  imagestring($ChartPNG, 2, $Rand_links+5, ($Hoehe-$Hoehe_Chart-20), 'Minimal: '.number_format($Min,2).'EUR', $schwarz);
  imagestring($ChartPNG, 2, $Rand_links+5, ($Hoehe-$Hoehe_Chart-40), 'aktuell: '.number_format($aktuell,2).'EUR', $schwarz);


//Bild speichern
imagepng($ChartPNG, $file);

// Destroy image
imagedestroy($ChartPNG);

?>


Mit dem folgenden Skript kann ein Farbverlauf-Hintergrund erzeugt und gespeichert werden:


<?
//Script zum Erzeugen eines Hintergundes für die Charts mit Farbverlauf
//Die Funktionen "gradient" und "hex2rgb" sind von php.net aus einem Beispiel entnommen

//gradient
function gradient($w=100, $h=100, $c=array('#FFFFFF','#FF0000','#00FF00','#0000FF'), $hex=true) {

 /*
 Generates a gradient image

 Author: Christopher Kramer

 Parameters:
 w: width in px
 h: height in px
 c: color-array with 4 elements:
    $c[0]:   top left color
    $c[1]:   top right color
    $c[2]:   bottom left color
    $c[3]:   bottom right color

 if $hex is true (default), colors are hex-strings like '#FFFFFF' (NOT '#FFF')
 if $hex is false, a color is an array of 3 elements which are the rgb-values, e.g.:
 $c[0]=array(0,255,255);

 */

 $im=imagecreatetruecolor($w,$h);

 if($hex) {  // convert hex-values to rgb
  for($i=0;$i<=3;$i++) {
   $c[$i]=hex2rgb($c[$i]);
  }
 }

 $rgb=$c[0]; // start with top left color
 for($x=0;$x<=$w;$x++) { // loop columns
  for($y=0;$y<=$h;$y++) { // loop rows
   // set pixel color
   $col=imagecolorallocate($im,$rgb[0],$rgb[1],$rgb[2]);
   imagesetpixel($im,$x-1,$y-1,$col);
   // calculate new color
   for($i=0;$i<=2;$i++) {
    $rgb[$i]=
      $c[0][$i]*(($w-$x)*($h-$y)/($w*$h)) +
      $c[1][$i]*($x     *($h-$y)/($w*$h)) +
      $c[2][$i]*(($w-$x)*$y     /($w*$h)) +
      $c[3][$i]*($x     *$y     /($w*$h));
   }
  }
 }
 return $im;
}

// hex2rgb
function hex2rgb($hex)
 {
 $rgb[0]=hexdec(substr($hex,1,2));
 $rgb[1]=hexdec(substr($hex,3,2));
 $rgb[2]=hexdec(substr($hex,5,2));
 return($rgb);
 }



//**************************************************************************************
//**************************************************************************************
//Bild generieren
//**************************************************************************************
//**************************************************************************************
$Breite=600;
$Hoehe=330;
$ChartPNG=gradient($Breite, $Hoehe, array('#909090', '#FFFFFF', '#FF9090', '#9090FF'));
$file='C:\ip-symcon\media\Graphen\Hintergrund_grau_weiss_rot_blau.png';

//Bild speichern
imagepng($ChartPNG, $file);

// Destroy image
imagedestroy($ChartPNG);

?>

Gruß
Thorsten

Hallo
Ich habe versucht, den Code zu testen, wissen aber nicht, wie ich die Grafik vor.
Könnte mir helfen und mir sagen, dass ich zu tun habe?

Habe heute meine Charts von Google hierher migriert. Klappt gut, schnell, Code ist übersichtlich

Hallo Axel37,
freut mich dass Du die Scripte brauchen kannst.
Gruß Thorsten

Gesendet von meinem SM-G800F mit Tapatalk

jep, vielen Dank !

ich hab da allerdings ein kleines Problem: Die untere X-Achse wird bei Datums-Werten nicht richtig durchnummeriert
08.03.04.06.01.

pegel.png

woran könnte das liegen ?
vg axel

Hallo Axel,
ich muss da erst mal selber nochmal nachsehen. Vielleicht komm ich morgen Abend dazu. Tritt der Fehler nur in der Wochenansicht auf oder auch in anderen Zeitbereichen?
Gruß Thorsten

Gesendet von meinem SM-T815 mit Tapatalk

nur in der Wochenansicht, das ist aber nicht schlimm, hat Zeit
Viele Grüsse & schönes WE

Hallo Axel,
da hat sich in dem Funktionen-Script ein Fehler eingeschlichen.:banghead:
Hier der korrigierte Teil:


if ($Zeitbereich == 3) //Woche
		{
  		$xText=date("d.M",$Zeit-7*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-7/4*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4*3-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-7/4*2*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/2-15, ($Hoehe-20), $xText, $schwarz);

  		$xText=date("d.M",$Zeit-7/4*3*24*60*60);
  		imagestring($ChartPNG, 2, $Rand_links+$Breite_Chart/4-15, ($Hoehe-20), $xText, $schwarz);

		$xText=date("d.M",$Zeit);
  		imagestring($ChartPNG, 2, $Breite-$Rand_rechts-15, ($Hoehe-20), $xText, $schwarz);
		}

Ich werds gleich im ersten Beitrag noch abändern.
Gruß
Thorsten

Jaa ! super, jetzt wirds korrekt angezeigt. Vielen Dank

@todorb
Hallo Thorsten,
lange ist’s her aber Multichart läuft bei mir immer noch. allerdings kommt nun ein Fehler:

Warning: imagecreatefrompng(): gd-png: libpng warning: iCCP: known incorrect sRGB profile in C:\ProgramData\Symcon\scripts\46497.ips.php on line 10

vermutlich liegt es an dem aktuellen PHP update.
Warum nutze ich MC ? ich kann die erzeugten (png) Charts einfach per FTP uploaden
Gruß Axel

Hallo Axel,
da bin ich jetzt so spontan auch überfragt… bei mir läuft es bisher ohne Fehler.
Welche Symcon-Version hast Du installiert?
Was steht denn in dem Skript 46497.ips.php in Zeile 10?
:Edit:
Das scheint die Zeile zu sein, in der das Image aus einer Hintergrund-Bilddatei erstellt wird.
Ich hab gerade mal nach der Fehlermeldung gesucht und bin auf die Folgende Antwort aus einem Forum gestoßen:
„Libpng-1.6 is more stringent about checking ICC profiles than previous versions. You can ignore the warning. To get rid of it, remove the iCCP chunk from the PNG image.“
Es scheint also an der Bilddatei des Hintergrundbildes zu liegen.
Gruß Thorsten

Hallo Thorsten, danke fürs Antworten ! Version 6.2
Zeile 10 ist leer aber durch das Includen der Fkt. (include („multicharts.ips.php“); )
zeigt die Zeile wohl in die Funktionen.
ich hab den Hintergrund mit Photoshop mal neu erstellt, tatsächlich sind wohl bestimmte pngs nicht mehr mit dem neuen PHP kompatibel
jedenfalls läuft es wieder, Danke
Viele Grüße Axel