Schaake.nu

CurrentCost

Gepost in /Hardware op 08 Juli 2012
Deze blog is geschreven door Christiaan Schaake

CurrentCost op Linux

Currencost sensable met klem

Eén van de eerste stappen om het elektriciteit verbruik terug te brengen is weten wat het verbruik op dit moment is. In mijn zoektocht naar een real-time elektriciteit meter waarvan ik de gegevens kan opslaan in een database, liep ik tegen CurrentCost aan. Dit is een apparaat met stroom klemmen die via USB kan worden uitgelezen. Middels een script upload ik de meetwaarden direct naar een MySQL database. De widget 'Server Power' op de frontpagina leest als een kleine demonstratie de database uit.

Currencost EnviR

Currentcost wordt in Nederland geleverd door de website www.energeniaal.nl. Zelf heb ik een EnviR met 2 extra stroomklemmen. De 3 klemmen gebruik ik niet voor 3 fasen, maar ik gebruik 3 fasen om 3 aparte groepen te meten. In de meterkast staat de zender met de 3 fase klemmen. Bij de server staat het EnviR display welke via USB is aangesloten op de server.

De waarde op het display klopt niet meer omdat er 3 klemmen zijn aangesloten. Het display denkt dat het een 3-fase aansluiting betreft. Echter de USB poort geeft wel netjes alle 3 de apart waarden door.

Perl script

Voor het uitlezen van het CurrentCost device maak ik gebruik van een Perl script welke de USB poort continue uitleest en de waarde wegschrijft naar een MySQL database.

#!/usr/bin/perl -w

# Reads data from a Current Cost device via serial port.
use strict;
use DBI;
use Device::SerialPort qw( :PARAM :STAT 0.07 );

my $PORT = "/dev/ttyUSB1";

my $ob = Device::SerialPort->new($PORT);
$ob->baudrate(57600);
$ob->write_settings;

open(SERIAL, "+>$PORT");
while (my $line = <SERIAL>) {
if ($line =~ m!<tmpr>([\d.]+)</tmpr>.*<ch1><watts>0*(\d+)</watts>
</ch1><ch2><watts>0*(\d+)</watts></ch2><ch3><watts>
0*(\d+)</watts></ch3>!
) {
my $watt1 = $2;
my $watt2 = $3;
my $watt3 = $4;
my $temp = $1;

#Uncomment this line for fault finding only.
#print "Power consumption ", $watt1 ,"w, ", $watt2 ,"w, ",
$watt3 ,"w, Temperature ", $temp ,"c\n";
#print $line , "\n";


#Write to database
my $dbh = DBI->connect("DBI:mysql:currentcost:dbhost:3306","user","password");
die "connect failed: " . DBI->errstr() unless $dbh;

my $sth = $dbh->prepare("insert into power (time, temp, phase1, phase2, phase3)
values (NOW(),$temp,$watt1,$watt2,$watt3)
")
or die "prepare failed: " . $dbh->errstr();

$sth->execute() or die "execute failed: " . $sth->errstr();
$sth->finish();

$dbh->disconnect();
}
}


De variabele $PORT verwijst naar de poort waaraan de EnviR is aangesloten. In mijn geval USB1. Om te achterhalen welke USB poort gebruikt wordt kun je zoeken in dmesg naar waar de 'pl2303 converter' is aangesloten. Dit is de EnviR. De EnviR geeft in XML formaat de data door. In mijn geval sla ik alle 3 de fasen op in de database. Voor het huidige tijdstip van de meting wordt in het script de huidige tijd van de server gebruikt. Voor debugging kunnen de 2 print regels worden geactiveerd. Het script print dan de gelezen waarden naar het scherm.

Op mijn server wordt dit script gestart in het start script /etc/rc.local. Ik gebruik nohup om in het geval van een tijdelijke onbeschikbaarheid van de server het script opnieuw te laten starten.

/usr/bin/nohup /usr/bin/perl /usr/scripts/currentcost.perl & >
/var/log/currentcost.log

Wat ik heb gemerkt is dat het script soms binnen dezelfde seconde 2 maal een meetwaarde binnen krijgt. Het script faalt dan door de primary key, maar de nuhup zorgt ervoor dat het script weer start.

Betrouwbaarheid

De EnviR geeft ca. elke 6 seconden een meetwaarde door. Wanneer de 3 klemmen over dezelfde fase worden gezet is er soms een kleine afwijking van 1 á 2 Watt te zien. Ik weet ook niet in hoeverre de meting rekening houdt met zogenaamde blindstroom. Maar voor een vergelijk van het elektriciteit gebruik over een langere periode om het effect van de bezuining te zien, is de meting voldoende betrouwbaar.

Een ander probleem is dat ca. 2 - 3% van de metingen gedurende een dag niet doorkomen. Hierbij dient rekening gehouden te worden bij het uitlezen van de de waarden uit de database. De oorzaak van deze missende gegevens heb ik niet kunnen vinden. Mogelijk is de USB poort bezet of kan de EnviR de waarde niet uitlezen van unit in de meterkast.

Deze blog is getagd als HomeAutomation Perl Programmeren

Google
facebook