package main; use strict; use warnings; use POSIX; sub MyUtils_Initialize($$) { my ($hash) = @_; } ############################################################################### # # Moving average # # Aufruf: movingAverage(devicename,readingname,zeitspanne in s) # ############################################################################### sub movingAverage($$$){ my ($name,$reading,$avtime) = @_; my $hash = $defs{$name}; my @new = my ($val,$time) = ($hash->{READINGS}{$reading}{VAL},$hash->{READINGS}{$reading}{TIME}); my ($cyear, $cmonth, $cday, $chour, $cmin, $csec) = $time =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/; my $ctime = $csec+60*$cmin+3600*$chour; my $num; my $arr; #-- initialize if requested if( ($avtime eq "-1") ){ $hash->{READINGS}{$reading}{"history"}=undef; } #-- test for existence if( !$hash->{READINGS}{$reading}{"history"}){ #Log 1,"ARRAY CREATED"; push(@{$hash->{READINGS}{$reading}{"history"}},\@new); $num = 1; $arr=\@{$hash->{READINGS}{$reading}{"history"}}; } else { $num = int(@{$hash->{READINGS}{$reading}{"history"}}); $arr=\@{$hash->{READINGS}{$reading}{"history"}}; my $starttime = $arr->[0][1]; my ($syear, $smonth, $sday, $shour, $smin, $ssec) = $starttime =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/; my $stime = $ssec+60*$smin+3600*$shour; #-- correct for daybreak $stime-=86400 if( $stime > $ctime); if( ($num < 25)&&( ($ctime-$stime)<$avtime) ){ #Log 1,"ARRAY has $num elements, adding another one"; push(@{$hash->{READINGS}{$reading}{"history"}},\@new); }else{ shift(@{$hash->{READINGS}{$reading}{"history"}}); push(@{$hash->{READINGS}{$reading}{"history"}},\@new); } } #-- output and average my $average = 0; for(my $i=0;$i<$num;$i++){ $average+=$arr->[$i][0]; Log 4,"[$name moving average] Value = ".$arr->[$i][0]." Time = ".$arr->[$i][1]; } $average=sprintf( "%5.3f", $average/$num); #--average Log 4,"[$name moving average] calculated over $num values is $average"; return $average; } 1; # myDiff # berechnet die Differenz aus der ersten Zeile eines LogFiles und der letzten Zeile eines LogFiles über einen Zeitraum zwischen einem Zeitpunkt in der Vergangenheit und dem Zeitpunkt des Aufrufs sub myDiff($$$) { my ($offset,$logfile,$cspec) = @_; my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset); my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime; my $oll = $attr{global}{verbose}; $attr{global}{verbose} = 0; my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec")); $attr{global}{verbose} = $oll; my ($cnt, $first, $last, $diff) = (0)x4; foreach (@logdata){ my @line = split(" ", $_); if(defined $line[1] && "$line[1]" ne ""){ $cnt += 1; if ($cnt == 1) { $first = $line[1]; } $last = $line[1]; } } $diff = $last - $first; Log 4, ("myDiff: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, First: $first, Last: $last, Diff: $diff"); return $diff; }