#!/usr/bin/perl # # Parses rows from the tl-500 program read from STDIN. Collects temperature # values from all sensors, updating an rrdtool database with average temperatures # every [step] seconds. # # DS names are where # is the sensor ID number. # # Depends on RRDs.pm, Debian/Ubuntu package is "librrds-perl". # # Example usage: ./tl-500 | examples/tl-500-rrd.pl temperature.rrd 300 # # @version 0.1 # @author mxv@m68k.org # ## Calibration offset for sensors (sensor ID => temp offset). my %calibration = ( 8795 => -0.065, 11733 => 0.315 ); ## End of configuration section. use strict; use warnings; use RRDs; my ($file, $step) = @ARGV; my ($next, %data); die 'Usage: tl-500-rrd.pl [step]' unless $file; $step = 300 unless $step; $next = time() + $step; while() { my ($sensor, $temperature) = / (\d+) \d+ (.*) C/; next unless $sensor; $data{$sensor}{'sum'} += $temperature; $data{$sensor}{'counter'}++; my $now = time(); next if $now < $next; $next = $now + $step; my $template = ''; my $values = 'N'; foreach $sensor (keys %data) { my $average = $data{$sensor}{'sum'} / $data{$sensor}{'counter'}; my $offset = $calibration{$sensor}; $average += $offset if $offset; $template .= ':' if $template; $template .= 'sensor_' . $sensor; $values .= ':' . $average; } %data = (); RRDs::update $file, '--template', $template, $values; print STDERR 'RRDs::update failed: ' . RRDs::error . "\n" if RRDs::error; }