Grafische Darstellung der Messwerte für Temperatur und Luftfeuchte mit RRDTool

Diese Grafiken werden live mit dem MessPC-System und dem RRDTool realisiert  Angezeigt wird die Innentemperatur (rot), Außentemperatur (blau) und Luftfeuchte (grün). Mit den RRDTools ist, im Unterschied zu MRTG,  auch die grafische Anzeige negativer Werte möglich. Die RRDTools sind frei für Unix und Windows verfügbar.

RRDTool Temperatur


RRDTool Luftfeuchtigkeit

Die RRDTool Database wurde mit folgendem Befehl angelegt:


./rrdtool create messpc.rrd DS:aussentemp:GAUGE:600:U:U DS:innentemp:GAUGE:600:U:U DS:feuchte:GAUGE:600:U:U RRA:AVERAGE:0.5:1:5040 RRA:AVERAGE:0.5:12:9600

Für das Auslesen der Daten und Update der Database wird folgender Perl-Script aufgerufen:


pcmeasure2rrd.pl

In diesem Script sind die IP-Adressen für die Abfrage und Ports der MessPC-Komponenten anzupassen.
#!/usr/bin/perl
#############################################################
#  pcmeasure2rrd.pl  Zugriff auf Daten der MessPC Software
#                     über das Netzwerk und Übergabe an RRDTool
#
#  Version 1.2 vom 11.3.2008
#
#  (C) Lutz Schulze 2003-2008 www.messpc.de
#
#  Aufruf: pcmeasure2rrd.pl 
#
#  Die Parameter '$port' in den einzelnen Aufrufen bestimmen die Interfaces
#  der MessPC Software oder Ethernetbox die ausgegeben werden sollen.
#############################################################
 
use IO::Socket;
use Text::ParseWords;
sub parse_csv {
    return quotewords(";",0, $_[0]);
}
 
$remote_host = "10.254.89.8"; # IP-address
$remote_port = 4000;     # TCP Port
$port = "display.1";
$socket = IO::Socket::INET->new(PeerAddr =>$remote_host,
                                PeerPort =>$remote_port,
                                Proto         =>"tcp",
                                Type         =>SOCK_STREAM)
or die "cannot connect to $remote_host:$remote_port: $@\n";
 
print $socket "pcmeasure.$port\n";
 
eval {
    local $SIG{ALRM} = sub { die "alarm\n"};
    alarm 5;
    $answer = <$socket>;
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n"; # handle unexpected errors
    #no answer, timeout
    print "timeout";
} else {
  @fields = parse_csv($answer);
  for ($i =0;$i < @fields;$i++) {
    $pos1 =index $fields[$i],'value';
    if ($pos1  != -1) {
        $pos2 =index $fields[$i],'=';
        $valuestring1 = substr($fields[$i],$pos2+1);
    }
  }
}
 
close($socket);
 
print "$valuestring1\n";
 
 
$remote_host = "10.254.89.8"; # IP-address
$remote_port = 4000;     # TCP Port
$port = "display.2";
$socket = IO::Socket::INET->new(PeerAddr =>$remote_host,
                                PeerPort =>$remote_port,
                                Proto         =>"tcp",
                                Type         =>SOCK_STREAM)
or die "cannot connect to $remote_host:$remote_port: $@\n";
 
print $socket "pcmeasure.$port\n";
 
eval {
    local $SIG{ALRM} = sub { die "alarm\n"};
    alarm 5;
    $answer = <$socket>;
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n"; # handle unexpected errors
    #no answer, timeout
    print "timeout";
} else {
  @fields = parse_csv($answer);
  for ($i =0;$i < @fields;$i++) {
    $pos1 =index $fields[$i],'value';
    if ($pos1  != -1) {
        $pos2 =index $fields[$i],'=';
        $valuestring2 = substr($fields[$i],$pos2+1);
    }
  }
}
 
close($socket);
 
print "$valuestring2\n";
 
 
 
$remote_host = "10.254.89.8"; # IP-address
$remote_port = 4000;     # TCP Port
$port = "display.5";
$socket = IO::Socket::INET->new(PeerAddr =>$remote_host,
                                PeerPort =>$remote_port,
                                Proto         =>"tcp",
                                Type         =>SOCK_STREAM)
or die "cannot connect to $remote_host:$remote_port: $@\n";
 
print $socket "pcmeasure.$port\n";
 
eval {
    local $SIG{ALRM} = sub { die "alarm\n"};
    alarm 5;
    $answer = <$socket>;
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n"; # handle unexpected errors
    #no answer, timeout
    print "timeout";
} else {
  @fields = parse_csv($answer);
  for ($i =0;$i < @fields;$i++) {
    $pos1 =index $fields[$i],'value';
    if ($pos1  != -1) {
        $pos2 =index $fields[$i],'=';
        $valuestring3 = substr($fields[$i],$pos2+1);
    }
  }
}
 
close($socket);
 
system("/usr/bin/rrdtool","update","/home/lutz/messpc.rrd","-t","aussentemp:innentemp:feuchte","N:$valuestring1:$valuestring2:$valuestring3");
print "$valuestring3\n";
 

Die beiden Grafiken werden mit folgenden Befehlen generiert:


/usr/local/rrdtool-1.0.40/bin/rrdtool graph /usr/local/httpd/htdocs/mrtg/rrdtempday.gif -v "Grad Celsius" DEF:aussentemp=/home/lutz/messpc.rrd:aussentemp:AVERAGE DEF:innentemp=/home/lutz/messpc.rrd:innentemp:AVERAGE LINE2:aussentemp#0000FF:"Aussentemperatur" LINE2:innentemp#FF0000:"Innentemperatur"

/usr/local/rrdtool-1.0.40/bin/rrdtool graph /usr/local/httpd/htdocs/mrtg/rrdfeuchteday.gif -v "% rel. Feuchte" DEF:feuchte=/home/lutz/messpc.rrd:feuchte:AVERAGE LINE2:feuchte#00FF00:"Luftfeuchte"


Kontakt: better networks  Lutz Schulze  Hauptstrasse 34
01909 Grossharthau-Bühlau - mehr Infos im Impressum
Tel. 035954 53396        Fax 035954 53397
support@messpc.de bestellung@messpc.de
Die Zeitschrift 'IT-Administrator' hat das MessPC System getestet und einen mehrseitigen Bericht veröffentlicht.