Kod: Markera allt
#!/usr/bin/perl
#
# copyright Martin Pot 2006
# http://martybugs.net/electronics/tempsensor/
#
# thanks to Petr for suggestions relating to better handling of failed data reads
#
# rrd_tempsensor.pl
use lib qw(/usr/local/rrdtool-1.2.12/lib/perl);
use RRDs;
# define location of rrdtool databases
my $rrd = '/var/lib/rrd';
# define location of images
my $img = '/var/www/localhost/htdocs/rrd/';
# process data for each interface (add/delete as required)
&ProcessSensor(9, "kWh EL Luftvärmepump ");
sub ProcessSensor
{
# process sensor
# inputs: $_[0]: sensor number (ie, 0/1/2/etc)
# $_[1]: sensor description
# get temperature from sensor
my $temp = `cat /DIGITEMP/elmatare.txt`;
# remove eol chars
chomp($temp);
print "sensor $_[0]: $temp Luftvärmepump kWh\n";
# if rrdtool database doesn't exist, create it
if (! -e "$rrd/temp$_[0].rrd")
{
print "creating rrd database for temp sensor $_[0]...\n";
RRDs::create "$rrd/temp$_[0].rrd",
"-s 300",
"DS:temp:COUNTER:600:0:U",
"RRA:AVERAGE:0.5:1:2016",
"RRA:MIN:0.5:1:2016",
"RRA:MAX:0.5:1:2016",
"RRA:AVERAGE:0.5:6:1344",
"RRA:MIN:0.5:6:1344",
"RRA:MAX:0.5:6:1344",
"RRA:AVERAGE:0.5:24:2190",
"RRA:MIN:0.5:24:2190",
"RRA:MAX:0.5:24:2190",
"RRA:AVERAGE:0.5:144:3650",
"RRA:MIN:0.5:144:3650",
"RRA:MAX:0.5:144:3650";
}
if ($ERROR = RRDs::error) { print "$0: failed to create $_[0] database file: $ERROR\n"; }
# check for error code from temp sensor
if (int $temp eq 85)
{
print "failed to read value from sensor $_[0]\n";
$temp = "U";
}
# insert values into rrd
RRDs::update "$rrd/temp$_[0].rrd",
"-t", "temp",
"N:$temp";
if ($ERROR = RRDs::error) { print "$0: failed to insert $_[0] data into rrd: $ERROR\n"; }
# create graphs for current sensor
&CreateGraph($_[0], "hour", $_[1]);
&CreateGraph($_[0], "-3h", $_[1]);
&CreateGraph($_[0], "-6h", $_[1]);
&CreateGraph($_[0], "-12h", $_[1]);
&CreateGraph($_[0], "day", $_[1]);
&CreateGraph($_[0], "week", $_[1]);
&CreateGraph($_[0], "month", $_[1]);
&CreateGraph($_[0], "year", $_[1]);
}
sub CreateGraph
{
# creates graph
# inputs: $_[0]: sensor number (ie, 0/1/2/etc)
# $_[1]: interval (ie, day, week, month, year)
# $_[2]: sensor description
RRDs::graph "$img/temp$_[0]-$_[1].png",
"-s -1$_[1]",
"-t $_[2] (Sensor $_[0]) :: Senaste $_[1]",
"--lazy",
"-h", "160", "-w", "600",
"-a", "PNG",
"-v Watt",
# "--watermark=Sjövägen 10 - HAGFORS",
# "--zoom=1.5",
"--color=BACK#000000",
"--color=SHADEA#000000",
"--color=SHADEB#000000",
"--color=FONT#DDDDDD",
"--color=CANVAS#202020",
"--color=GRID#000000",
"--color=MGRID#AAAAAA",
"--color=FRAME#202020",
"--color=ARROW#FFFFFF",
"--units-exponent=0",
"DEF:temp=$rrd/temp$_[0].rrd:temp:AVERAGE",
"DEF:min=$rrd/temp$_[0].rrd:temp:MIN",
"DEF:max=$rrd/temp$_[0].rrd:temp:MAX",
#"CDEF:temp2=temp,0.510204082,*",
"CDEF:temp2=temp,2,*",
"CDEF:W=temp2,3600,*",
"CDEF:Wtotal=temp2,1000,/",
"VDEF:valuesum=Wtotal,TOTAL",
"CDEF:Wtotal2=Wtotal,1.22,*",
"VDEF:valuesum2=Wtotal2,TOTAL",
"LINE1:min#FF3333",
"LINE1:max#FF3333",
"CDEF:X01=W,1.00,*", "AREA:X01#FF0000",
"CDEF:X10=W,0.90,*", "AREA:X10#E10000",
"CDEF:X15=W,0.85,*", "AREA:X15#D20000",
"CDEF:X20=W,0.80,*", "AREA:X20#C30000",
"CDEF:X25=W,0.75,*", "AREA:X25#B40000",
"CDEF:X30=W,0.70,*", "AREA:X30#A50000",
"CDEF:X35=W,0.65,*", "AREA:X35#960000",
"CDEF:X40=W,0.60,*", "AREA:X40#870000",
"CDEF:X45=W,0.55,*", "AREA:X45#780000",
"CDEF:X50=W,0.50,*", "AREA:X50#690000",
"CDEF:X55=W,0.45,*", "AREA:X55#5A0000",
"CDEF:X60=W,0.40,*", "AREA:X60#4B0000",
"CDEF:X65=W,0.35,*", "AREA:X65#3C0000",
"CDEF:X70=W,0.30,*", "AREA:X70#2D0000",
"CDEF:X75=W,0.25,*", "AREA:X75#180000",
"CDEF:X80=W,0.20,*", "AREA:X80#0F0000",
"CDEF:X85=W,0.15,*", "AREA:X85#000000",
"GPRINT:valuesum: Momentan Förbrukning\\: %6.3lf kWh",
"GPRINT:valuesum2: Momentan Kostnad\\: %6.2lf kr\\n",
"GPRINT:W:MIN:Min\\: %6.1lf Watt",
"GPRINT:W:MAX: Max\\: %6.1lf Watt",
"GPRINT:W:AVERAGE: Medel\\: %6.3lf Watt",
"GPRINT:W:LAST: Just Nu\\: %6.3lf Watt\\n",
"COMMENT:(c) Jörgen Jönsson, Sjövägen 10, Hagfors";
if ($ERROR = RRDs::error) { print "$0: unable to generate sensor $_[0] $_[1] graph: $ERROR\n"; }
}