Implemented some basic calculations of watt-hours.
authorLadislav Laska <laska@kam.mff.cuni.cz>
Wed, 21 Aug 2013 21:56:54 +0000 (23:56 +0200)
committerLadislav Laska <laska@kam.mff.cuni.cz>
Wed, 21 Aug 2013 21:58:30 +0000 (23:58 +0200)
These should be rewritten, since are probably highly inaccurate. Better
way to do it would be to work on bigger intervals of nonchanging voltage
and current.

accutool

index 88fded7e521e5431b16ce355fc08db9d0be597a1..f0d48add03f7a49016bb0d939b855b75af4e1712 100755 (executable)
--- a/accutool
+++ b/accutool
@@ -4,11 +4,14 @@ use Accucell;
 use common::sense;
 use Data::Dumper;
 use Getopt::Long qw(:config bundling no_ignore_case no_auto_abbrev);
+use Text::CSV::Slurp;
+use List::Util qw(reduce sum);
+
 
 my $opt_source = "/dev/ttyUSB0";
 my $opt_baud = 9600;
 my $opt_log = "accucell.log";
-my $opt_output = "accucell.plot";
+my $opt_output = "-";
 my $opt_gnuplot = "VT,AT";
 my $opt_help = 0;
 
@@ -34,9 +37,9 @@ END
        exit 1;
 }
 
-
 # The gnuplot stuff can be: VT, AT, or both
 
+my $raw_data = "";
 
 if (-c $opt_source) {
        # The input file is character device, open serial port and start reading
@@ -61,6 +64,7 @@ if (-c $opt_source) {
                $line =~ s/,$/\n/g;
                print FH $line;
                print "> ".$line;
+               $raw_data .= "$line";
                flush FH;
                last if ($msg->{"active"} == 0);
                $msg = $acu->read_message();
@@ -70,8 +74,31 @@ if (-c $opt_source) {
 
        close FH;
 } elsif (-f $opt_source) {
-
+       local $/= undef;
+       open( FH, "<$opt_source");
+       $raw_data = <FH>;
+       close FH;
 } else {
        print "Invalid input file.\n";
 }
 
+if ($raw_data ne "") {
+       my $data = Text::CSV::Slurp->load( string => $raw_data );
+       my $last = 0;
+       my $wh = 0;
+       for my $item (sort { $a->{time} > $b->{time} } @$data) {
+               # Compute Watt-Hours for example
+               my $units = $item->{time} - $last;
+               my $incr = $item->{voltage} * $item->{current} * $units;
+               $wh += $incr;
+               $last = $item->{time};
+       }
+       $wh /= 60*60.0;
+       print $wh." Wh\n";
+
+       # Compute average current & voltage
+       print sum(map { $_->{current} } @$data)/@$data." A\n";
+       print sum(map { $_->{voltage} } @$data)/@$data." V\n";
+} else {
+       print "No data to process.";
+}