Categories

A sample text widget

Etiam pulvinar consectetur dolor sed malesuada. Ut convallis euismod dolor nec pretium. Nunc ut tristique massa.

Nam sodales mi vitae dolor ullamcorper et vulputate enim accumsan. Morbi orci magna, tincidunt vitae molestie nec, molestie at mi. Nulla nulla lorem, suscipit in posuere in, interdum non magna.

CurrentCost CC128 working with RRD, Pachube and Twitter.

After finding the instructions at http://www.jibble.org/currentcost/ to create a basic perl script that read the Currentcost datastream, parsed the XML and updated a RRD file I was able to create some power usage graphs. Using the RRDTool CGI application on a local linux box with the apache webserver I’ve got graphs for the last 10 minutes, 60 minutes, 6 hours, 24 hours, 7 days, month and year. However as tis is not internet facing, using an updated perl script I can now update a pachube.com feed. The pachube updates are once per minute so as to not exceed the api posting limits.

With the CC128 there is a history output that is generated every 2 hours, this includes the total kWh used on a daily basis. With an addition to the perl script I can now get a daily usage value that is used to update my Home automation twitter feed.

The script used is as follows: (Please note, this has been updated on 3rd September 2009 to include a daily cost calculation and to fix an issue with the history information attempting to update the rrd file)

#!/usr/bin/perl -w
# Reads data from a CurrentCost CC128 device via serial port.
# Based on script at http://www.jibble.org/currentcost/
#
# Heavily updated to include pachube.com updates every minute
# and a daily tweet at twitter.com for previous days power usage
#
# Andrew Lindsay http://blog.thiseldo.co.uk
#

use strict;
use Device::SerialPort qw( :PARAM :STAT 0.07 );

# Alter these values to suit your configuration
# Serial port CC128 connected to
my $PORT = "/dev/ttyS0";

# Pachube.com values
my $pachubeApiKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
my $pachubeFeed = "NNNN";

# twitter.com values
my $twitterUser = "USERNAME";
my $twitterPass = "PaSsWoRd";
# Set your own values here
my $unitCharge = "0.115";       # 11.50p
my $standingCharge = "0.1441";  # 14.41p

# End of configuration

# Setup the serial port.
my $ob = Device::SerialPort->new($PORT);
$ob->baudrate(57600);
$ob->write_settings;

print "Reading currentcost datastream\n";

open(SERIAL, "+>$PORT");

# Keep track of how many sample and total for updating pachube once a minute
my $sampleCount = 0;
my $totalWatts = 0;

while (my $line = ) {
        # History received every 2 hours, look for last day, d001 and limit to whole house sensor for now.
        if ($line =~ m!.*0.*(\d+\.?\d*)1.*!) {
                # process history output
                print "$line\n";
                my $histSensor = "0";
                my $kwatts = $1;
                my $cost = sprintf("%.2f",$standingCharge + ($unitCharge * $kwatts) );
                # Tweet yesterdays usage, only need do this once per day if hour is 0
                my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
                print "Got a match for day 1, sensor $histSensor Watts $kwatts kWh Hour $hour\n";
                if( $histSensor == "0" && $hour < "2" ) {
                        print "Tweet\n";
                        print "Yesterdays usage was $kwatts kWh at an approximate cost of £$cost Hour: $hour\n";
                        system( "curl -s -u $twitterUser:$twitterPass -d 'status=$kwatts kWh used yesterday at an approximate cost of £$cost' http://twitter.
com/statuses/update.xml");
                }
        } elsif ($line =~ m!(\d+).*0*(\d+)!) {
                # Regular updates received from CC128 approx every 6s, total to create average over 1 minute
                my $sensor = $1;
                my $watts = $2;

                # Only deal with sensor 0 - Whole house sensor now
                if( $sensor == "0" ) {
                        $sampleCount++;
                        $totalWatts += $watts;
                        # Update RRD
                        system( "/usr/local/rrdtool/bin/rrdtool update currentcost.rrd N:$watts:0");
                        # Update pachube once a minute with a minute's worth of averaged data
                        if ( $sampleCount > 10 ) {
                                # Do a little formatting on the output
                                my $averageWatts = sprintf("%.2f",$totalWatts / $sampleCount);
                                #system("curl  --request PUT --header 'X-PachubeApiKey: $pachubeApiKey' -D tmp.txt --data $averageWatts 'http://www.pachube.c
om/api/$pachubeFeed.csv'");
                                system("curl -s --request PUT --header 'X-PachubeApiKey: $pachubeApiKey' --data $averageWatts 'http://www.pachube.com/api/$pa
chubeFeed.csv'");
                                # Reset the counts
                                $totalWatts = 0;
                                $sampleCount = 0;
                        }
                }
        }
}

The script currently runs from a shell and outputs to a log file:


# ./readCurrentCost.pl >currentcost.log 2>&1

This is not a permanent application yet, more a learning exercise to determine what information comes out of the CC128 device while I develop an Arduino based version. Another aspect is tha we ar also identifying how much power we use on a daily basis and when it peaks.

The pachube feed is here. The twitter feed is currently restricted to my main account.

Bookmark this post: bookmark bookmark bookmark bookmark bookmark bookmark bookmark bookmark bookmark bookmark

Comments are closed.