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.


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"