Realisierung der Graphiken

Die Erfassung und Darstellung der Daten erfolgt in den folgenden sechs Schritten:

  1. Auslesen der Daten aus dem Datenerfassungsgerät.
  2. Überspielen der Daten auf den Webserver.
  3. Vorbereiten der Daten zur Weiterbearbeitung.
  4. Anwendung des Visualisierungstools RRDTOOL.
  5. Wichtig für alle, die unsere Graphiken in Ihre Webseiten einfügen wollen:

    Einfügen der Graphiken in die Webseiten.

  6. Erstellen der Bilder "on demand".
Schritt 1:
Das Datenerfassungsgerät (SIC 100) sendet alle zwei Sekunden einen Datensatz bestehend aus aktueller Temperatur, Modultemperatur sowie dem tagesaktuellen Stand der Energiesumme an die serielle Schnittstelle. Diese Daten werden von einem Programm erfasst und in eine besser lesbare Form umgewandelt:
SIC2FILE Ausgabedatei
Datum=18.01.99
Zeit=10:18:00
E=2
T1=4,7
T2=4,9
dT=-0,3
W1=0
W2=0
Schritt 2:
Das Ausleseprogramm startet alle drei Minuten einen FTP-Client, der die Daten per FTP auf unseren Webserver überspielt, da der Auswerterechner nicht von außen sichtbar ist.
Schritt 3:
Das Format des Datenfiles ist für eine Weiterbearbeitung durch das Visualisierungstool ungeeignet. Dieses verlangt einfache, reelle Zahlen als Eingabe. Deshalb wird das oben dargestelle File mit Hilfe jeweils eines Scripts pro Datenzeile bearbeitet. Beispielsweise für die Temperatur:
#!php.cgi -q
<?
/*
  Lese SIC.SIC ein, nehme die 5. Zeile ab Zeichen 3,
  ersetzte "," durch "." und gib es aus:
*/
$Filename="SIC.SIC";
$Feld=File($Filename);
$Ausgabe=ereg_replace(",",".",substr($Feld[4],3,10));
echo $Ausgabe;
>

Dieses Skript läuft unter dem Interpreter PHP ließe sich aber genauso in PERL, C, als Shellscript oder ähnlich realisieren. Wie dem Kommentar zu entnehmen ist, wird die 5. Zeile ab dem dritten Zeichen ausgegeben und dabei das "Komma" in einen "Punkt" umgewandelt. Als Ergebnis erhält man eine Realzahl, die die Temperatur darstellt.

Ein Programmaufruf liefert:

jesaja: # ./temp1
7.0

Schritt 4:
RRDTOOL Version 3 erwartet als Eingabe regelmäßige Daten, was hier per Cronaufruf realisiert wird. Alle fünf Minuten wird das Programm rrdtool aufgerufen und es werden Daten dem Datenfile zugefügt. Weitere Infos dazu findet man auf der Homepage von RRDTOOL.
Schritt 5:
Das Einfügen der Graphiken in den Webseiten geschieht durch einfaches Aufrufen als Graphik:
<IMG SRC="Graphik.phtml?dauer=86400&source=temp&h=58&w=160">
liefert:

Temperaturverlauf

Falls Sie in Ihre Seiten eine solche Graphik einfügen wollen, müssen Sie die URL natürlich vollständig angeben (Beispiele siehe unten). Graphik.phtml ist wiederum ein PHP-Script. Durch die dem Fragezeichen folgenden Angaben, kann die Darstellungsdauer (dauer), die Datenquelle (source) sowie die Höhe und Weite des Koordinatensystems der Graphik festgelegt werden.

Folgende Angaben sind möglich:

dauer ohne Angabe:10 Tage
Maximalwert:1 Jahr
Sonstiges:Angabe in Sekunden
source ohne Angabe:temp
tempTemperatur
deltatempTemperaturunterschied
energieErzeugte Energie
leistungAus energie berechnete Leistung
maxmintempMinimale/maximale Tagestemperaturen. Hier ist eine Angabe von dauer nicht möglich.
h (höhe) und w (weite) beziehen sich immer auf die Größe des Koordinatensystems, die jeweilige Graphik ist etwas größer. Ohne Angabe wird das Koordinatensystem 200 * 500 Pixel groß

Beispiele:

  • Temperaturverlauf und Temperaturunterschied der letzten Stunde:
    <IMG SRC="http://energie.biz-worms.de/solar/mrtg/...
      ...Graphik.phtml?dauer=3600&source=temp&h=58&w=140"> <IMG SRC="http://energie.biz-worms.de/solar/mrtg/...
      ...Graphik.phtml?dauer=3600&source=deltatemp&h=58&w=140">
    liefert:

    Temperaturverlauf Temperaturunterschied

    Beachten Sie bitte, dass die Höhe der Koordinatensysteme gleich ist.
  • Leistungsverlauf der vergangenen Woche (Eine Woche = 604800 Sekunden):
  • <IMG SRC="http://energie.biz-worms.de/solar/mrtg/...
      ...Graphik.phtml?dauer=604800&source=leistung&h=58&w=380">
    liefert:

    Leistungsverlauf

Zusätzlich gibt es noch die Möglichkeit nur die Außentemperatur darzustellen:

<IMG SRC="http://energie.biz-worms.de/solar/mrtg/...
  ...EinzelTemp.phtml?dauer=86400&h=58&w=220">
liefert:

Aussentemperaturverlauf

Schritt 6:
Die Graphiken liegen nicht vorgefertigt auf der Festplatte, sondern werden "on demand" jeweils neu erstellt. Das oben erwähnte PHP-Skript Graphik.phtml ist im folgenden dargestellt:
<?

      /* Automatische Erzeugung eines Bildes */
      
      /* Das spricht fuer sich: */
      Header("Content-Type: image/gif");
      /* Bild nicht cachebar um aktuell zu sein */
      Header("Expires:      Thu, 01 Dec 1994 16:00:00 GMT");

      $Tag = 24 * 60 *60 ;
      if ($dauer=="") {
         $dauer = 10 * $Tag;
      };      
      if ($h=="") {
         $h =200;
      };      
      if ($w=="") {
         $w =500;
      };      
      if ($source=="") {
        $source="temp";
      }
      if ($source=="temp") {
         PassThru("TempGraphik $dauer $h $w")
      }
      if ($source=="deltatemp") {
         PassThru("DeltatempGraphik $dauer $h $w")
      }
      if ($source=="energie") {
         PassThru("EnergieGraphik $dauer $h $w")
      }
      if ($source=="leistung") {
         PassThru("LeistungGraphik $dauer $h $w")
      }
      if ($source=="maxmintemp") {

          /* Automatisch dauer anpassen */
          /* Aktuelles Datum: */      
          $dauer = Date("U");  
          /* Beginn der Messung: 25.11.1998 */
          $start = MkTime(0,0,0,11,25,1998);
          $dauer = $dauer - $start;

          /* Maximal ein Jahr darstellen */
          $Jahr = 60 * 60 *24 *360;
          if ($dauer >= $Jahr) {
             $dauer = $Jahr;
          };
         PassThru("MaxMinTempGraphik $dauer $h $w")
      }

>
Zunächst wird ein Header (Content-Type: image/gif) der Ausgabedatei mitgegeben, damit der Browser die empfangenen Daten als Graphik erkennt und in die Webseite einbaut. Nun folgt ein Header, der dem Browser sagt, dass die Graphik bis zu einem bereits vergangenen Zeitpunkt (hier beispielsweise das Jahr 1994) gültig ist. Damit wird erreicht, dass beim Neuladen nicht eine evtl. bereits zwischengespeicherte Version verwendet wird. Als Verbesserung könnte man den "Expires-Header" so anpassen, dass ein Zwischenspeichern der Graphik für die Dauer bis zur nächsten Abfrage (z.B. 5 Minuten) möglich wäre. Damit könnte bei mehrfachen Zugriff Netzbandbreite gespart werden.

Der folgende Quelltext ist nach einer Einarbeitung in PHP selbsterklärend. Mit dem PassThru-Kommando werden nun externe Programme (z.B. TempGraphik) aufgerufen. In TempGraphik wird das eigentliche Tool zur Erstellung der Graphiken, rddtool aus dem RRDTOOL -Paket aufgerufen:

/usr/src/mrtg/bin/rrdtool graph /dev/stdout          \
       -v "Grad C" -t "Temperaturverlauf"       \
       -h $2 -w $3 \
       -r -s -$1 \
       DEF:cel0=solaranlage.rrd:0:AVERAGE  \
       LINE1:cel0#009900:"Aussentemperatur"  \
       DEF:cel1=solaranlage.rrd:1:AVERAGE  \
       LINE1:cel1#0000ff:"Modultemperatur"      \
       HRULE:0#00FFFF   \
       GPRINT:cel0:MIN:"AT Min\: %f C"\
       GPRINT:cel0:MAX:"Max\: %f C"\
       GPRINT:cel1:MIN:"MT Min\: %f C"\
       GPRINT:cel1:MAX:"   Max\: %f C"\
Die Parameter, welche hier etwas kryptisch erscheinen mögen, sind in der Dokumentation von RRDTOOL. genau erläutert.
Änderungen
Naturgemäß werden an diesem System gelegentlich Änderungen und Verbesserungen vorgenommen. Hier haben sie Zugriff auf die jeweils aktuellen Versionen:

© Markus Eiden

Datenerfassung
12.09.1999