diff --git a/CHANGED b/CHANGED index c6f13d8f3..9d0555206 100644 --- a/CHANGED +++ b/CHANGED @@ -12,6 +12,7 @@ - feature: FritzBox 7270 ZIP file - buxgfix: prevent fhem from stalling if telnet times out in 66_ECMD.pm - feature: FHEMWEB longpoll mode, small fixes, tuned smallscreen mode + - feature: average module added - 2011-07-08 (5.1) - feature: smallscreen optimizations for iPhone diff --git a/FHEM/11_FHT.pm b/FHEM/11_FHT.pm index c17e8b330..9a2e846ae 100755 --- a/FHEM/11_FHT.pm +++ b/FHEM/11_FHT.pm @@ -159,7 +159,6 @@ FHT_Initialize($) # 810c0d20 0909a001 3232 7e006724 (NYI) $hash->{Match} = "^81..(04|09|0d)..(0909a001|83098301|c409c401).."; $hash->{SetFn} = "FHT_Set"; - $hash->{StateFn} = "FHT_SetState"; $hash->{DefFn} = "FHT_Define"; $hash->{UndefFn} = "FHT_Undef"; $hash->{ParseFn} = "FHT_Parse"; @@ -302,19 +301,6 @@ FHT_Set($@) } -##################################### -sub -FHT_SetState($$$$) -{ - my ($hash, $tim, $vt, $val) = @_; - - return "Ignoring FHZ state" if($vt =~ m/^FHZ:/); - $vt =~ s/^FHZ://; - return "Undefined type $vt" if(!defined($c2b{$vt}) && !defined($warnings{$vt})); - return undef; -} - - ##################################### sub FHT_Define($$) diff --git a/FHEM/98_average.pm b/FHEM/98_average.pm new file mode 100644 index 000000000..6aee23983 --- /dev/null +++ b/FHEM/98_average.pm @@ -0,0 +1,129 @@ +############################################## +# Avarage computing + +package main; +use strict; +use warnings; + +########################## +sub +average_Initialize($) +{ + my ($hash) = @_; + $hash->{DefFn} = "average_Define"; + $hash->{NotifyFn} = "average_Notify"; + $hash->{AttrList} = "disable:0,1"; +} + + +########################## +sub +average_Define($$$) +{ + my ($hash, $def) = @_; + my ($name, $type, $re, $rest) = split("[ \t]+", $def, 4); + + if(!$re || $rest) { + my $msg = "wrong syntax: define average device[:event]"; + return $msg; + } + + # Checking for misleading regexps + eval { "Hallo" =~ m/^$re$/ }; + return "Bad regexp: $@" if($@); + $hash->{REGEXP} = $re; + $hash->{STATE} = "active"; + return undef; +} + +########################## +sub +average_Notify($$) +{ + my ($avg, $dev) = @_; + my $avgName = $avg->{NAME}; + + return "" if(AttrVal($avgName, "disable", undef)); + + my $devName = $dev->{NAME}; + my $re = $avg->{REGEXP}; + my $max = int(@{$dev->{CHANGED}}); + my $tn; + + my $trigger = ""; + for (my $i = 0; $i < $max; $i++) { + my $s = $dev->{CHANGED}[$i]; + + ################ + # Filtering + next if(!defined($s)); + my ($evName, $val) = split(" ", $s, 2); # resets $1 + next if($devName !~ m/^$re$/ && "$devName:$s" !~ m/^$re$/ || $s =~ m/_avg_/); + $val = $1 if(defined($1)); + next if(!defined($val) || $val !~ m/^(\d+\.?\d*)/); + $val = $1; + + ################ + # Avg computing + $evName =~ s/[^A-Za-z_-].*//; + $tn = TimeNow() if(!$tn); + + my $r = $dev->{READINGS}; + my @dNow = split("[ :-]", $tn); + + for(my $idx = 0; $idx <= 1; $idx++) { + + my $secNow = 3600*$dNow[3] + 60*$dNow[4] + $dNow[5]; + $secNow += $dNow[2]*86400 if($idx); + + my $cumName = "${evName}_cum_" . ($idx ? "month" : "day"); + my $avgName = "${evName}_avg_" . ($idx ? "month" : "day"); + + if(!$r->{$cumName}) { + $r->{$cumName}{VAL} = $secNow*$val; + $r->{$avgName}{VAL} = $val; + $r->{$cumName}{TIME} = $r->{$avgName}{TIME} = $tn; + next; + } + + my @dLast = split("[ :-]", $r->{$cumName}{TIME}); + my $secLast = 3600*$dLast[3] + 60*$dLast[4] + $dLast[5]; + $secLast += $dLast[2]*86400 if($idx); + + if($idx == 0 && ($dLast[2] == $dNow[2]) || + $idx == 1 && ($dLast[1] == $dNow[1])) { + my $cum = $r->{$cumName}{VAL} + ($secNow-$secLast) * $val; + $r->{$cumName}{VAL} = $cum; + $r->{$avgName}{VAL} = sprintf("%0.1f", $cum/$secNow); + + } else { + $trigger .= " $avgName:".$r->{$avgName}{VAL}; + $r->{$cumName}{VAL} = $secNow*$val; + $r->{$avgName}{VAL} = $val; + + } + $r->{$cumName}{TIME} = $r->{$avgName}{TIME} = $tn; + } + } + + $addNotifyCB{"avg:$devName"} = "average_Callback $devName $trigger" + if($trigger); + + return undef; +} + +sub +average_Callback($) +{ + my ($arg) = @_; + my ($dev, @list) = split(" ", $arg); + + my $n = 0; + for(my $n = 0; $n < @list; $n++) { + my ($name, $value) = split(":", $list[$n]); + $defs{$dev}{CHANGED}[$n] = "$name: $value"; + } + DoTrigger($dev, undef); +} + +1; diff --git a/docs/commandref.html b/docs/commandref.html index 5d102c3bf..c8b20b2ae 100644 --- a/docs/commandref.html +++ b/docs/commandref.html @@ -149,6 +149,7 @@ SUNRISE_EL   at   autocreate   + average   dummy   dumpdef   holiday   @@ -6829,6 +6830,68 @@ href="http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=29870">U + +

average

+ + +

holiday