[rrd-users] combine MB/CPU and HDD temps in one rrd graph

Audio Phile da_audiophile at yahoo.com
Sun Jul 27 10:08:35 CEST 2008


Can someone with RRD experience help me combine my MB, CPU and HDD temp
into one graph?  I'm thinking that some how, they need to combined into a single file
rrd_combined.pl and have the graph output show all 3 on the same axis.  FYI, I'm running Knoppmyth R5.5 which comes with a number of these pre-configured.

rrd_MBtemp.pl
#!/usr/bin/perl 
# 
#  rrd_MBtemp.pl 
#	Motherboard Temperature data collection routine for KnoppMyth 
# 
######################################################################## 
# Configuration: 
my $dbf = 'MBtemp'; 
my $configfile = '/etc/rrd.config'; 
######################################################################## 
use RRDs; 

if (! -d "/myth") { $configfile = "./D_rrd.config"; }	# DEBUG 
do $configfile; 

sub create { 
    #	$_[0] = filename 
    if (! -e "$log/$_[0].rrd") { 
        print "Create db for $_[0] => $log/$_[0].rrd\n"; 
        RRDs::create( "$log/$_[0].rrd", "-s 300", 
            "DS:mbt1:GAUGE:600:0:U", 
            "DS:mbt2:GAUGE:600:0:U", 
            "DS:mbt3:GAUGE:600:0:U", 
            "RRA:AVERAGE:0.5:1:576", 
            "RRA:AVERAGE:0.5:6:672", 
            "RRA:AVERAGE:0.5:24:732", 
            "RRA:AVERAGE:0.5:144:1460"); 
        $ERROR = RRDs::error; 
        print "Error: RRDs::create failed for '$_[0]' : $ERROR\n" if $ERROR; 
    } 
} 

my ($mbt1, $mbt2); 

sub gather { 
    $mbt1 = `$MBT_prog | grep "M/B Temp" | cut -c 15-17`; 
    $mbt2 = `$MBT_prog | grep "CPU Temp" | cut -c 15-17`; 
    $mbt3 = `$MBT_prog|grep -i "aux temp" |cut -c 13-17`; 
    $mbt1 =~ s/[\n ]//g; 
    $mbt2 =~ s/[\n ]//g; 
    $mbt3 =~ s/[\n ]//g; 
    print "$dbf: motherboard $mbt1, CPU $mbt2, case $mbt3, °C\n"; 
    # The motherboard sensor occasionally returns nonsense values. 
    # This should keep the spurious peaks from roaching the graph... 
    if ($mbt1 > 100.0) { $mbt1 = $mbt2 } 
    print "$dbf: motherboard $mbt1, CPU $mbt2, case $mbt3, °C\n"; 
} 

sub update { 
    #	$_[0] = filename 
    RRDs::update( "$log/$_[0].rrd", "-t", 
        "mbt1:mbt2:mbt3", 
        "N:$mbt1:$mbt2:$mbt3"); 
    $ERROR = RRDs::error; 
    print "Error: RRDs::update for '$_[0]' : $ERROR\n" if $ERROR; 
} 

#° 
sub graph { 
    #	$_[0] = time interval (ie: day...) 
    #	$_[1] = filename suffix. 
    RRDs::graph( "$png/$dbf-$_[1].png", "-s -1$_[0]", "-aPNG", 
        "-w $Gwd", "-h $Ght", "-E", "-l 20", "-M", 
        "--color", "SHADEA$color", 
        "--color", "SHADEB$color", 
        "--color", "BACK$color", 
        "-t Motherboard & CPU temperature degrees C :: $_[0]", 
        "DEF:mbt1=$log/$dbf.rrd:mbt1:AVERAGE", 
        "DEF:mbt2=$log/$dbf.rrd:mbt2:AVERAGE", 
        "LINE1:mbt1$color_mbt1: MB temp\\:", 
        "GPRINT:mbt1:MIN:Minimum\\: % 5.1lf", 
        "GPRINT:mbt1:MAX:Maximum\\: % 5.1lf", 
        "GPRINT:mbt1:AVERAGE:Average\\: % 5.1lf", 
        "GPRINT:mbt1:LAST:Current\\: % 5.1lf °C\\j", 
        "LINE1:mbt2$color_mbt2:CPU temp\\:", 
        "GPRINT:mbt2:MIN:Minimum\\: % 5.1lf", 
        "GPRINT:mbt2:MAX:Maximum\\: % 5.1lf", 
        "GPRINT:mbt2:AVERAGE:Average\\: % 5.1lf", 
        "GPRINT:mbt2:LAST:Current\\: % 5.1lf °C\\j"); 
    $ERROR = RRDs::error; 
    print "Error: RRDs::graph failed for '$_[0]' : $ERROR\n" if $ERROR; 
} 
######################################################################## 
create "$dbf"; 
gather; 
update "$dbf"; 
graph 'day',   'Daily'; 
graph 'week',  'Weekly'; 
graph 'month', 'Monthly'; 
graph 'year',  'Yearly'; 
graph '2hour', '12hourly'; 
######################################################################## 
# vim: sw=4 ts=8 
# End 

rrd_HDtemp.pl
[code]#!/usr/bin/perl 
# 
#  rrd_HDtemp.pl 
#       Disk temperature data collection routine for KnoppMyth 
# 
######################################################################## 
# Configuration: 
my $dbf = "HDtemp"; 
my $configfile = '/etc/rrd.config'; 
my @temps; 
######################################################################## 
use RRDs; 

if (! -d "/myth") { $configfile = "./D_rrd.config"; }   # DEBUG 
do $configfile; 

sub create { 
    #   $_[0] = filename 
    if (! -e "$log/$_[0].rrd") { 
        print "Create db for $_[0] => $log/$_[0].rrd\n"; 
        push @args, "$log/$_[0].rrd"; 
        push @args, "-s 300"; 
        @devs = split /\s+/, $HDT_dev; 
        for($i = 0; $i < scalar(@devs); $i++) { 
          push @args, "DS:hdt" . ($i + 1) . ":GAUGE:600:0:U"; 
        } 
        push @args, "RRA:AVERAGE:0.5:1:576"; 
        push @args, "RRA:AVERAGE:0.5:6:672"; 
        push @args, "RRA:AVERAGE:0.5:24:732"; 
        push @args, "RRA:AVERAGE:0.5:144:1460"; 
        RRDs::create(@args); 
        $ERROR = RRDs::error; 
        print "Error: RRDs::create failed for '$_[0]' : $ERROR\n" if $ERROR; 
    } 
} 


sub gather { 
    my ($dev, $hdt1, $hdtT, $hdtD, $res); 
    # device names in $_[0] 
    $res = "$dbf:"; 
    undef @temps; 
    @devs = split /\s+/, $_[0]; 
    foreach $_ (@devs) { 
        $dev = "/dev/$_"; 
        my $line = `/usr/sbin/hddtemp -q $dev`; 
        chomp( $line ); 
        my ( $devN, $devD, $devT ) = split( /\:\s+/, $line ); 
        #print "HDtemp $_[0]: '$devN' '$devD' '$devT'\n"; 
        my ( $dev1, $dev2 ) = split( /\s+or\s+/, $devT ); 
        #print "HDtemp $_[0]: '$dev1' '$dev2'\n"; 
        ( $hdt1, $hdtT ) = split( /\s+/, $dev1 ); 
        #print "HDtemp $_[0]: '$hdt1' '$hdtT'\n"; 
        if ($devN ne $dev) { 
            $hdt1 = 0; $hdtT = '?'; $hdtD = ''; 
        } else { 
            $hdtD = $devD; 
        } 
        if ("$hdtT" eq "") {$hdt1 = "C"; } 
        $out .= "$_: $hdt1, "; 
        push @temps, $hdt1; 
    } 
    chop $out; # remove extra space 
    chop $out; # remove extra comma 
    print "$out\n"; 
} 

sub update { 
    #   $_[0] = filename 
    my($str1, $str2); 
    $str1 = ''; 
    $str2 = 'N:'; 
    for($i = 0; $i < scalar(@temps); $i++) { 
      $str1 .= ("hdt" . ($i + 1) . ":"); 
      $str2 .= ($temps[$i] . ":"); 
    } 
    chop $str1; # Get rid of last colon 
    chop $str2; # Get rid of last colon 
    RRDs::update("$log/$_[0].rrd", "-t", $str1, $str2); 
    print "$str1\n$str2\n"; 
    $ERROR = RRDs::error; 
    print "Error: RRDs::update for '$_[0]' : $ERROR\n" if $ERROR; 
} 

sub graph { 
    #   $_[0] = time interval (ie: day...) 
    #   $_[1] = filename suffix. 
    undef @args; 
    @devs = split /\s+/, $HDT_dev; 
    @args = ( "$png/$dbf-$_[1].png", "-s -1$_[0]", "-aPNG", 
        "-w $Gwd", "-h $Ght", "-E", "-l 20", "-M", 
        "--color", "SHADEA$color", 
        "--color", "SHADEB$color", 
        "--color", "BACK$color", 
        "-t Disk temperature :: $_[0]"); 
    for($i = 0; $i < scalar(@temps); $i++) { 
        push @args, "DEF:hdt" . ($i + 1) . "=$log/$dbf.rrd:hdt" . ($i + 1) . ":AVERAGE"; 
        push @args, "LINE1:hdt" . ($i+1) . "$HDT_colors[$i]: $devs[$i] degrees C\\:", 
        "GPRINT:hdt" . ($i + 1) . ":MIN:Minimum\\: %.0lf", 
        "GPRINT:hdt" . ($i + 1) . ":MAX:Maximum\\: %.0lf", 
        "GPRINT:hdt" . ($i + 1) . ":AVERAGE:Average\\: %.2lf", 
        "GPRINT:hdt" . ($i + 1) . ":LAST:Current\\: %.1lf\\j"; 
    } 
    RRDs::graph(@args); 
    $ERROR = RRDs::error; 
    print "Error: RRDs::graph failed for '$_[0]' : $ERROR\n" if $ERROR; 
} 
######################################################################## 
create "$dbf"; 
gather "$HDT_dev"; 
update "$dbf"; 
graph 'day',   'Daily'; 
graph 'week',  'Weekly'; 
graph 'month', 'Monthly'; 
graph 'year',  'Yearly'; 
graph '2hour', '12hourly'; 
######################################################################## 
# vim: sw=4 ts=8 
# End


      



More information about the rrd-users mailing list