Current Cost Classic vs CC128
Back in November I bought (well, actually I signed up to a new deal with E.ON which included one) a Current Cost electricity monitor, and hooked it up to my server so I could gather the stats for Cacti. I do this by running a small perl script which looks as follows:
#!/usr/bin/perl # /usr/local/bin/cc-classic.pl use Device::SerialPort qw( :PARAM :STAT 0.07 ); $port = "/dev/currentcost"; $ob = Device::SerialPort->new($port) or die "Can not open port $port\n"; $ob->baudrate(9600); $ob->write_settings; $ob->close; open(SERIAL, "+>$port"); while ($line = <SERIAL>) { if ($line =~ m!<ch1><watts>0*(\d+)</watts></ch1>.*<tmpr>\s*(-*[\d.]+)</tmpr>!) { $watts = $1; $temperature = $2; print "watts:$watts temp:$temperature"; last; } } close(SERIAL); |
This would give me the two values I am interested in; watts and temperature (since it sits in the garage node 0 ;)) in Cacti’s format:
$ /usr/local/bin/cc-classic.pl watts:761 temp:11.3 |
But today, I received my new unit, a Current Cost CC128. It’s main benefit is that it supports individual appliance monitors, which makes the output even more useful. So, armed with a draft copy of the CC128 XML output document, I prepared my script to read as follows:
#!/usr/bin/perl # /usr/local/bin/cc-cc128.pl use Device::SerialPort qw( :PARAM :STAT 0.07 ); $port = "/dev/currentcost"; $ob = Device::SerialPort->new($port) or die "Can not open port $port\n"; $ob->baudrate(57600); $ob->write_settings; $ob->close; open(SERIAL, "+>$port"); while ($line = <SERIAL>) { if ($line =~ m!<tmpr>\s*(-*[\d.]+)</tmpr>.*<ch1><watts>0*(\d+)</watts></ch1>!) { $watts = $2; $temperature = $1; print "watts:$watts temp:$temperature"; last; } } close(SERIAL); |
And guess what… that works just fine ;)
For those who read diff:
$ diff /usr/local/bin/cc-classic.pl /usr/local/bin/cc-cc128.pl 2c2 < # /usr/local/bin/cc-classic.pl --- > # /usr/local/bin/cc-cc128.pl 10c10 < $ob->baudrate(9600); --- > $ob->baudrate(57600); 17c17 < if ($line =~ m!<ch1><watts>0*(\d+)</watts></ch1>.*<tmpr>\s*(-*[\d.]+)</tmpr>!) --- > if ($line =~ m!<tmpr>\s*(-*[\d.]+)</tmpr>.*<ch1><watts>0*(\d+)</watts></ch1>!) 19,20c19,20 < $watts = $1; < $temperature = $2; --- > $watts = $2; > $temperature = $1; |
Please note, the above only works with 1 sensor (the main transmitter), so it is likely to change in the future. For now it suits my need.
5 Comments
Other Links to this Post
-
John’s Blog » Blog Archive » Electricity Usage. — October 15, 2009 @ 21:13
-
SEPREE » Blog Archive » Monitoring and Graphing Electricity Usage — January 6, 2011 @ 11:11
RSS feed for comments on this post. TrackBack URI
By MarkP, May 28, 2009 @ 10:32
Thank you – was struggling with matching the expression for the XML from the CC128 in my script!
By JeremyG, December 11, 2009 @ 20:15
Have just ordered myself one of these and the cable.
Hope to log this to a cacti script also! Thanks for the info here and at overclockers.
One thing.. Have you compared the usage this gives and your actual meter? How accurate is it.
Thanks
By Steve G, April 1, 2011 @ 21:37
Hi There,
Any chance you could upload the cacti templates for the graphs?
Thanks Steve