angelehnt an die Sensor-"Grafiken" von weiter oben habe ich mich mal damit beschäftigt, dazu passende "Mini-Diagramme" zu gestalten.
Das ganze sieht dann in etwa so aus: Angezeigt wird der Temperaturverlauf der letzten 24h sowie der minimale und der maximale Wert in dieser Zeitspanne. Man benötigt keine Zusatzprogramme (wie in anderen Beiträgen), um die Grafik aufzubereiten, sondern es wird alles kurz und knapp in einem PHP-Script erledigt.
Vorraussetzung dafür ist in erster Linie eine Textdatei, in der nach Temperatureinlauf eines Sensors die Messwerte abgespeichert werden.
Format der Datei:
Code: Alles auswählen
13.10.2008 01:47:37 7.0
13.10.2008 01:50:09 6.9
...
Man kann diese Log-Datei mit dem Befehl SCHREIBEDATEI erzeugen, oder man nimmt einfach meine modifizierte FTD2XX.dll, welche die Dateien gleich im richtigen Format erzeugt - vorausgesetzt man hat das Logging aktiviert...
Folgende weitere Schritte sind notwendig:
1. Ein Anzeige-Objekt anlegen, z.B. "DiagrammKS300",
Typ: EAGeraet
Makroinhalt ("Ausführen bei Eingabe" gesetzt):
Code: Alles auswählen
<?
$LogName = "KS300T_1";
include("Z:\\fs20\\php\\MiniDiagramm.php");
?>
** Anzeige:=Scriptoutput
DiagrammKS300 umschalten
2. Im Objekt des Temperatursensors (hier "KS300Temp" wird im Makro folgender Befehl integriert:
("Ausführung bei Empfang" ist gesetzt)
Code: Alles auswählen
Makro ausführen DiagrammKS300
Inhalt:
Code: Alles auswählen
<?
//###################################################################
// Hier müssen die Pfade/Namen zu den Dateien angepasst werden:
//###################################################################
//include("bmp.php");
//$filebmp = "z:\\fs20\\temp\\Diagramm".$LogName.".bmp";
$filelog = "z:\\fs20\\log\\".$LogName.".log";
$filejpg = "z:\\fs20\\temp\\Diagramm".$LogName.".jpg";
$DatenAelterAlsSovielSekunden_Loeschen = 24*3600*7;
//###################################################################
//###################################################################
// Schriftart, Grössen, ... festlegen:
//###################################################################
$SizeX = 150;
$SizeY = 46;
$Font = "arial.ttf";
$FontSize = 7;
//###################################################################
//###################################################################
// Diagrammeinstellungen (Zeitspanne, Wertebereich, Gitterlinien...):
//###################################################################
$Zeitspanne = 24*3600; //x-Achse - Angabe erfolgt in Sekunden
$Wertebereich = 20.0; //y-Achse - gleiche Einheit wie Messwerte
$YBasis = 0.0; //Anfänglicher Schnittpunkt mit x-Achse
$GitterAnzeigen = 1; //1=ja; 0=nein
$GmtZeitverschiebung = 1; //Angabe in Stunden ohne Sommerzeit!
//###################################################################
$im = imagecreatetruecolor ($SizeX, $SizeY);
$gray = ImageColorAllocate ($im, 214, 211, 206);
$darkgray = ImageColorAllocate ($im, 160, 160, 160);
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);
$lightyellow = ImageColorAllocate ($im, 255, 255, 206);
$yellow = ImageColorAllocate ($im, 255, 255, 0);
$lightred = ImageColorAllocate ($im, 255, 192, 192);
$red = ImageColorAllocate ($im, 255, 0, 0);
$green = ImageColorAllocate ($im, 0, 128, 0);
$blue = ImageColorAllocate ($im, 0, 0, 255);
//###################################################################
// Farben festlegen:
//###################################################################
$hintergrund = $lightyellow;
$vordergrund = $blue;
//###################################################################
//VORBEREITEN...
ImageTTFText ($im, 18, 0, 0, 0, $black, "wingding.ttf", "");
imagefill($im, 0, 0, $hintergrund);
$X_Dim = $SizeX - 2*4;
$Y_Dim = $SizeY -2*4;
$jetzt = mktime();
$LetzteVolleStunde = $jetzt - $jetzt % 3600;
$GmtZeitverschiebung += date("I"); //Sommerzeit-Verschiebung dazuaddieren
$fileHandle = fopen($filelog, "r");
$Messwerte = explode("\x0d\x0a", fread($fileHandle, filesize ($filelog)));
fclose($fileHandle);
//Alte Daten löschen
if ($DatenAelterAlsSovielSekunden_Loeschen)
{
do
{
$Messwert = explode("\t", $Messwerte[0]);
$Messwert[0] = str_replace (".", " ", $Messwert[0]);
$Messwert[0] = str_replace (":", " ", $Messwert[0]);
$d = explode(" ", $Messwert[0]);
$z = mktime($d[3], $d[4], $d[5], $d[1], $d[0], $d[2]);
if ($z < $jetzt - $DatenAelterAlsSovielSekunden_Loeschen)
{
array_shift($Messwerte);
}
}
while ($z < $jetzt - $DatenAelterAlsSovielSekunden_Loeschen);
$fileHandle = fopen($filelog, "w");
$writeback = fwrite($fileHandle, implode("\x0d\x0a", $Messwerte));
fclose($fileHandle);
}
//Extremwerte bestimmen
for ($i=sizeof($Messwerte)-2, $z=$jetzt, $Min=999, $Max=-999; $i>=0 && $z>=$jetzt-$Zeitspanne; $i--)
{
$Messwert = explode("\t", $Messwerte[$i]);
$Messwert[0] = str_replace (".", " ", $Messwert[0]);
$Messwert[0] = str_replace (":", " ", $Messwert[0]);
$d = explode(" ", $Messwert[0]);
$z = mktime($d[3], $d[4], $d[5], $d[1], $d[0], $d[2]);
if ($Min > $Messwert[1])
{
$Min = $Messwert[1];
$ZeitMin = $z;
}
if ($Max < $Messwert[1])
{
$Max = $Messwert[1];
$ZeitMax = $z;
}
}
//Y-Skala bestimmen
do
{
$y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * ($Max-$YBasis)) - 3;
$Iteration = 0;
if ($y-$FontSize < 4)
{
$YBasis += 5.0;
$Iteration = 1;
}
}
while ($Iteration);
do
{
$y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * ($Min-$YBasis)) + $FontSize + 3;
$Iteration = 0;
if ($y > $Y_Dim+5)
{
$YBasis -= 5.0;
$Iteration = 1;
}
}
while ($Iteration);
do
{
$y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * ($Max-$YBasis));
$Iteration = 0;
if ($y < 4)
{
$YBasis += 5.0;
$Iteration = 1;
}
}
while ($Iteration);
// Gitterlinien vertikal
if ($GitterAnzeigen)
{
for ($i=0; $i<$Zeitspanne/3600; $i++)
{
$x = 4+$X_Dim + ($LetzteVolleStunde-3600*$i - $jetzt) / $Zeitspanne * $X_Dim;
if ((($LetzteVolleStunde-3600*($i-$GmtZeitverschiebung)) % (3600*24)) == 0)
$farbe = $black; //Tageswechsel schwarz
else
if ((($LetzteVolleStunde-3600*($i-$GmtZeitverschiebung)) % (3600*6)) == 0)
$farbe = $darkgray; //alle 6h dunkelgrau
else
$farbe = $gray;
imageline($im, $x, 4, $x, $SizeY-5, $farbe); //Stunden
}
}
// Gitterlinien horizontal
if ($GitterAnzeigen)
{
for ($i=0; $i<$Wertebereich; $i+=5)
{
$y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * $i);
if ($i+$YBasis == 0)
$farbe = $black; //Null-Linie schwarz
else
if (($i+$YBasis) % 10 == 0)
$farbe = $darkgray; //Zehner dunkelgrau
else
$farbe = $gray; //Fünfer
imageline($im, 4, $y , $SizeX-5, $y, $farbe); // aller 5 Ganzzahlen
}
}
//Messwerte einzeichnen
for ($i=sizeof($Messwerte)-2, $z=$jetzt; $i>=0 && $z>=$jetzt-$Zeitspanne; $i--)
{
$Messwert = explode("\t", $Messwerte[$i]);
$Messwert[0] = str_replace (".", " ", $Messwert[0]);
$Messwert[0] = str_replace (":", " ", $Messwert[0]);
$d = explode(" ", $Messwert[0]);
$z = mktime($d[3], $d[4], $d[5], $d[1], $d[0], $d[2]);
$x = 4+$X_Dim + ($z - $jetzt) / $Zeitspanne * $X_Dim;
$y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * ($Messwert[1]-$YBasis));
imagesetpixel ($im, $x, $y, $vordergrund);
}
//Extremwerte ausgeben
$tb = imagettfbbox($FontSize, 0, $Font, $Min);
$x = 4+$X_Dim + ($ZeitMin - $jetzt) / $Zeitspanne * $X_Dim;
$x = $x - $tb[2] / 2;
if ($x < 4) $x = 4;
if ($x+$tb[2] > $X_Dim+4) $x = $X_Dim-$tb[2]+3;
$y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * ($Min-$YBasis)) + $FontSize + 3;
if ($y > $Y_Dim+5) $y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * ($Min-$YBasis)) - 5;
ImageTTFText ($im, $FontSize, 0, $x, $y, $blue, $Font, $Min);
$tb = imagettfbbox($FontSize, 0, $Font, $Max);
$x = 4+$X_Dim + ($ZeitMax - $jetzt) / $Zeitspanne * $X_Dim;
$x = $x - $tb[2] / 2;
if ($x < 4) $x = 4;
if ($x+$tb[2] > $X_Dim+4) $x = $X_Dim-$tb[2]+3;
$y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * ($Max-$YBasis)) - 3;
if ($y-$FontSize < 4) $y = 3+$Y_Dim - ($Y_Dim / $Wertebereich * ($Max-$YBasis)) + $FontSize + 5;
ImageTTFText ($im, $FontSize, 0, $x, $y, $red, $Font, $Max);
//3-d Rahmen zeichnen
imagerectangle ($im, 0, 0, $SizeX-1, $SizeY-1, $darkgray);
imagerectangle ($im, 1, 1, $SizeX-2, $SizeY-2, $darkgray);
imagerectangle ($im, 3, 3, $SizeX-2, $SizeY-2, $darkgray);
imagerectangle ($im, 1, 1, $SizeX-4, $SizeY-4, $white);
imagerectangle ($im, 2, 2, $SizeX-1, $SizeY-1, $darkgray);
imagerectangle ($im, 0, 0, $SizeX-3, $SizeY-3, $white);
//Grafikdatei abspeichern
//Imagebmp ($im , $filebmp);
Imagejpeg ($im, $filejpg , 99);
ImageDestroy ($im);
?>
4. Anzeige-Objekt (hier "DiagrammKS300") in die Visualisierung bringen , Projekt starten
5. Anzeigeobjekt anklicken, dabei sollte das JPG dort entstehen, wie der Pfad unter Punkt 3 festgelegt wurde (vorher eventuell das Temp-Verzeichniss anlegen)
6. Dem Anzeigeobjekt für beide Zustände die unter Punkt 5 entstandene Grafik zuordnen.
-> FERTIG
##############################################################
Viel Spass damit
Thomas
PS:
- Voraussetzungen: PHP installiert, zusätzlich die php_gd2.dll vorhanden, php.ini angepasst (wie bereits von sanys beschrieben)
- weiterhin: Schriftarten vorhanden, hier kann man natürlich auch mit anderen Schriftarten spielen...
- Ich habe bewusst auf die Ausgabe als BMP (BMP.PHP) verzichtet, da diese enorm Performance frisst und bei diesen kleinen Bilderleins kaum Vorteile bringt...
Edit vom 20.10.: kleine Korrektur im PHP-Script bezüglich Zeitverschiebung zu GMT (Berücksichtigung der Zeitumstellung Sommer/Winter...)