#!/usr/bin/perl -w use strict; use Device::SerialPort; use RRD::Simple (); my $rrdfile = "/var/www/strom/PDU05/PDU05.rrd"; my @daten = (); my @realpower =(); my @powerfactor =(); my @apparentpower =(); my $volts = 230; my $freq = 50; my $debug = 1; my $serial = Device::SerialPort->new( "/dev/ttyUSB0"); $serial->baudrate(9600); $serial->databits(8); $serial->purge_all(); $serial->rts_active(0); $serial->dtr_active(1); # Create an interface object my $rrd = RRD::Simple->new( file => $rrdfile ); $rrd->create( RealPower01 => "GAUGE", RealPower02 => "GAUGE", RealPower03 => "GAUGE", RealPower04 => "GAUGE", RealPower05 => "GAUGE", RealPower06 => "GAUGE", RealPower07 => "GAUGE", RealPower08 => "GAUGE", RealPower09 => "GAUGE", RealPower10 => "GAUGE", RealPower11 => "GAUGE", ApparentPower01 => "GAUGE", ApparentPower02 => "GAUGE", ApparentPower03 => "GAUGE", ApparentPower04 => "GAUGE", ApparentPower05 => "GAUGE", ApparentPower06 => "GAUGE", ApparentPower07 => "GAUGE", ApparentPower08 => "GAUGE", ApparentPower09 => "GAUGE", ApparentPower10 => "GAUGE", ApparentPower11 => "GAUGE", Voltage => "GAUGE", Freq => "GAUGE", faultsPerSec => "COUNTER" ) unless -f $rrdfile; #set minimum, maximum values for my $ds ($rrd->sources($rrdfile)) { RRDs::tune($rrdfile,'-i',"$ds:0"); RRDs::tune($rrdfile,'-a',"$ds:1000"); } # override RealPower01,ApparentPower01 (Total max 4kW) RRDs::tune($rrdfile,'-a',"RealPower01:4000"); RRDs::tune($rrdfile,'-a',"ApparentPower01:4000"); RRDs::tune($rrdfile,'-a',"Voltage:300"); RRDs::tune($rrdfile,'-a',"Frequ:70"); while (1) { $serial->write("1"); print "write\n"; # wait a second select(undef, undef, undef, 1); # Poll to see if any data is coming in my($count, $data) = $serial->read(255); if ($data) { print "received:\n Bytes: $count\n $data \n" if $debug; $data =~s/W// ; $data =~s/VA// ; $data =~s/Hz// ; $data =~s/V// ; # it seems that a newline per serial is a return + newline @daten = split(/\r\n+/,$data); if ($debug) { print "$daten[0] \n"; print "$daten[1] \n"; print "$daten[2] \n"; print "$daten[3] \n"; print "$daten[4] \n"; } @realpower = split(/\s+/,$daten[0]); @powerfactor = split(/\s+/,$daten[1]); @apparentpower = split(/\s+/,$daten[2]); $volts = $daten[3]; $freq = $daten[4]; if ($debug) { #print "$realpower[0] $realpower[10]\n"; } $rrd->update( RealPower01 => $realpower[0], RealPower02 => $realpower[1], RealPower03 => $realpower[2], RealPower04 => $realpower[3], RealPower05 => $realpower[4], RealPower06 => $realpower[5], RealPower07 => $realpower[6], RealPower08 => $realpower[7], RealPower09 => $realpower[8], RealPower10 => $realpower[9], RealPower11 => $realpower[10], ApparentPower01 => $apparentpower[0], ApparentPower02 => $apparentpower[1], ApparentPower03 => $apparentpower[2], ApparentPower04 => $apparentpower[3], ApparentPower05 => $apparentpower[4], ApparentPower06 => $apparentpower[5], ApparentPower07 => $apparentpower[6], ApparentPower08 => $apparentpower[7], ApparentPower09 => $apparentpower[8], ApparentPower10 => $apparentpower[9], ApparentPower11 => $apparentpower[10], Voltage => $volts, Freq => $freq, #faultsPerSec => 0.4 ); } # Uncomment the following lines, for slower reading, # but lower CPU usage, and to avoid # buffer overflow due to sleep function. $serial->lookclear; #20 sec entpr. ca 9000 Samples sleep (20); }