Background
On my electricity meter I have a flashing LED. 1000 flashes is 1 watthour.
As a monitor geek I want to know my powerconsumption and find a 1-wire kit containing a counter and a sensor that could detect the flashing from the electricity meter.
I wrote a script that collect the data in an RRD database and graph it.
Graph
The script
#!/usr/bin/perl
# By Peter Andersson peter@it-slav.net
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
use RRDs;
use OW;
# define location of rrdtool databases
my $rrd = '/root/owfs/script/rrd_db';
# define location of images
my $img = '/home/peter/public_html/1-wire/energy';
# process data for each interface (add/delete as required)
&ProcessSensor(0, "Anderssons power consumption", "mother.mynet" , "3001" , "1D.A4F10C000000");
sub ProcessSensor
{
# process sensor
# inputs: $_[0]: sensor number (ie, 0/1/2/etc)
# $_[1]: sensor description
print "number:$_[0] desc:$_[1], server:$_[2] port:$_[3], id: $_[4]\n";
my $owserver = "$_[2]:$_[3]";
unless(OW::init($owserver)) {
$status = $ERRORS{CRIT};
$message = "OWServer not running at $owserver\n";
exit $status;
}
# get temperature from sensor
my $handle = OW::get("$_[4]/counters.A");
# print "handle=$handle\n";
$handle =~ s/^\s*(.*?)\s*$/$1/;
## Check if input is an integer or decimal
unless (($handle =~ /^-?(?:\d+(?:\.\d*)?|\.\d+)$/) || ($handle =~ /^[+-]?\d+$/))
{
print "Not an integer or a decimal\n";
return($ERRORS{CRITICAL});
}
$count=$handle;
# remove eol chars
chomp($count);
print "sensor $_[0]: $count \n";
# if rrdtool database doesn't exist, create it
if (! -e "$rrd/energy$_[0].rrd")
{
print "creating rrd database for energy sensor $_[0]...\n";
RRDs::create "$rrd/energy$_[0].rrd",
"-s 60",
"DS:energy:COUNTER:1200:0:U",
"RRA:AVERAGE:0.5:1:43200",
"RRA:AVERAGE:0.5:30:175200";
}
if ($ERROR = RRDs::error) { print "$0: failed to create $_[0] database file: $ERROR\n"; }
# check for error code from count sensor
#if (int $count eq 85)
#{
# print "failed to read value from sensor $_[0]\n";
#}
#else
#{
# insert values into rrd
RRDs::update "$rrd/energy$_[0].rrd",
"-t", "energy",
"N:$count";
if ($ERROR = RRDs::error) { print "$0: failed to insert $_[0] data into rrd: $ERROR\n"; }
#}
# create graphs for current sensor
&CreateGraph($_[0], "day", $_[1], 3600, hourly);
&CreateGraph($_[0], "week", $_[1], 3600*24, daily);
&CreateGraph($_[0], "month", $_[1], 3600*24*7, weekly);
&CreateGraph($_[0], "year", $_[1], 3600*24*7*30, monthly);
&CreateGraph($_[0], "decade", $_[1], 3600*24*7*365, yearly);
}
sub CreateGraph
{
# creates graph
# inputs: $_[0]: sensor number (ie, 0/1/2/etc)
# $_[1]: interval (ie, day, week, month, year)
# $_[2]: sensor description
# $_[3]: Moving avarage timeperiod
# $_[4]: Moving avarage timeperiod unit
print "Create graph $_[0], interval: $_[1], Moving avarage timeperiod: $_[3]s and moving avarage unit: $_[4]\n";
RRDs::graph "$img/energy$_[0]-$_[1].png",
"-s -1$_[1]",
"-t $_[2]-$_[1]",
"-h", "400", "-w", "1000",
"-a", "PNG",
"-v Watt",
"--slope-mode",
"-W", "WWW.It-Slave.Net - An It-Slave In The Digital Saltmine",
"-l", "0",
"DEF:energy=$rrd/energy$_[0].rrd:energy:AVERAGE:start=end-$_[3]s-1$_[1]",
"CDEF:W=energy,3600,*",
"CDEF:mean=W,$_[3],TREND",
"AREA:mean#FF000044",
"LINE1:mean#A00000:Moving average $_[4]:",
"AREA:W#AAAAee99",
"LINE1:W#AAAAEEFF:Power consumption\\n",
"CDEF:energyK=energy,1000,/",
"VDEF:value_sum=energyK,TOTAL",
"GPRINT:value_sum:Total consumption last $_[1]\\:%0.2lfkWh\\n",
"GPRINT:W:MIN:Instantaneous consumption\\: Min\\:%0.2lf%sW",
"GPRINT:W:AVERAGE:Average\\:%0.2lf%sW",
"GPRINT:W:MAX:Max\\:%0.2lf%sW",
"GPRINT:W:LAST:Now\\:%0.2lf%sW\\n";
# "COMMENT:\n WWW.It-Slav.Net - An It-Slave In The Digital Saltmine";
if ($ERROR = RRDs::error) { print "$0: unable to generate sensor $_[0] $_[1] graph: $ERROR\n"; }
}
Links
- m.nu sells 1-wire things and other good stuff
- owfs-free implementation to use 1-wire devices
- Other articles about 1-wire at It-Slave blog
- My graphs
3 Responses to “Graphing powerconsumption using 1-wire”
Leave a Reply
You must be logged in to post a comment.





February 12th, 2012 at 11:20 pm
82 kWh per day – are you running a data center?
February 13th, 2012 at 8:46 am
Yes, a small one at home.
October 4th, 2012 at 8:31 am
hello ,
i would like to monitor gas usage. 1 click is 0,1 m3. I dont know where in script must i change that it will count right ?
Thank you for the answer.