#!/usr/local/bin/perl use strict; use warnings; use DateTime::Format::Strptime; use DateTime::Format::Duration; my $strp = DateTime::Format::Strptime->new( # Sat Jul 18 10:45:00 2020 pattern => '%a %b %d %H:%M:%S %Y', on_error => 'croak' ); my $oldtime = undef; my $now = 0; my $energy = 0; my $oldcurrentsign = -1; # assume start with discharge my $changetime = 0; while (<>) { s/\r//; chomp; # ignore lines not starting with a timestamp next unless /^[A-Z][a-z][a-z] [A-Z][a-z][a-z] [0-9 ][0-9]/; #Sat Jul 18 05:48:50 2020 U1 = 12.56 V I = -2.000 A m/(.*)U1 = *([0-9.]+) V.*I = *([-0-9.]+) A/; my $dt = $strp->parse_datetime($1); my $volt = $2; my $current = $3; if (! defined($oldtime)) { # first record $oldtime = $dt; next; } my $delta = $dt->subtract_datetime_absolute($oldtime); $oldtime = $dt; my $d = DateTime::Format::Duration->new(); my $ddd = $d->format_duration(duration => $delta, pattern => '%s') / 60.0; $now += $ddd; #print $now, " ", $volt, " ", $current, "\n"; $energy += $current * $ddd; my $currentsign; if ($current == 0.0) { $currentsign = 0; } else { $currentsign = $current / abs($current); } if ($currentsign != $oldcurrentsign) { # switch between charge and discharge print STDERR "Change charge/discharge, time ", $now - $changetime, ", energy ", $energy / 60.0, "\n"; $changetime = $now; $energy = 0; } $oldcurrentsign = $currentsign; } print STDERR "Final: time ", $now - $changetime, ", energy ", $energy / 60.0, "\n";