From 10f77e47ed8cb634125ab8fc4d2f78e64ea1ed5d Mon Sep 17 00:00:00 2001 From: neubert Date: Thu, 20 Aug 2009 09:05:34 +0000 Subject: [PATCH] 09_USF1000.pm: suppress inplausible readings from USF1000 git-svn-id: https://fhem.svn.sourceforge.net/svnroot/fhem/trunk/fhem@429 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- CHANGED | 1 + FHEM/09_USF1000.pm | 74 ++++++++++++++++++++++++---------------------- HISTORY | 3 ++ 3 files changed, 43 insertions(+), 35 deletions(-) diff --git a/CHANGED b/CHANGED index 57e2e0b63..a7507fc85 100644 --- a/CHANGED +++ b/CHANGED @@ -523,3 +523,4 @@ - bugfix: Fixes for Windows by Klaus - bugfix: Another "rereadcfg" bugfix - feature: Update to the current (1.27) CUL FHT interface + - feature: suppress inplausible readings from USF1000 diff --git a/FHEM/09_USF1000.pm b/FHEM/09_USF1000.pm index fdc22ff9b..d88feb982 100644 --- a/FHEM/09_USF1000.pm +++ b/FHEM/09_USF1000.pm @@ -101,6 +101,8 @@ USF1000_Parse($$) return "" if($def->{IODev} && $def->{IODev}{NAME} ne $hash->{NAME}); + my $t= TimeNow(); + # Msg format: # 01 23 45 67 8901 2345 6789 01 23 45 67 # 81 0c 04 .. 0101 a001 a5ce aa 00 cc xx @@ -112,45 +114,47 @@ USF1000_Parse($$) my $lowbattery= (hex($cc) & 0x40 ? 1 : 0); my $testmode= (hex($cc) & 0x80 ? 1 : 0); my $distance= hex($xx)/100.0; # in meters - - my $wlevel = $def->{HEIGHT}-($distance-$def->{OFFSET}); # water level - - my $geometry= $def->{GEOMETRY}; - my $capacity= $def->{CAPACITY}; # capacity of tank (for distance= offset) in liters - my $volume; # current volume in tank in liters - my $flevel; # fill level in percent + my $valid= (($distance>0.00) && ($distance<2.55)); - if($geometry eq "cub") { - # cuboid - $volume = $def->{LENGTH}*$def->{WIDTH}*$wlevel*1000.0; - } elsif($geometry eq "cylv") { - # vertical cylinder - $volume = $PI*$def->{DIAMETER}*$def->{DIAMETER}/4.0*$wlevel*1000.0; - } else { - return 0; + if($valid) { + my $wlevel = $def->{HEIGHT}-($distance-$def->{OFFSET}); # water level + + my $geometry= $def->{GEOMETRY}; + my $capacity= $def->{CAPACITY}; # capacity of tank (for distance= offset) in liters + my $volume; # current volume in tank in liters + my $flevel; # fill level in percent + + if($geometry eq "cub") { + # cuboid + $volume = $def->{LENGTH}*$def->{WIDTH}*$wlevel*1000.0; + } elsif($geometry eq "cylv") { + # vertical cylinder + $volume = $PI*$def->{DIAMETER}*$def->{DIAMETER}/4.0*$wlevel*1000.0; + } else { + return 0; + } + + $flevel = int($volume/$capacity*100.0+0.5); + $volume= int($volume/10.0+0.5)*10.0; + + + my $state= sprintf("v: %d V: %d", $flevel, $volume); + + $def->{CHANGED}[0] = $state; + $def->{STATE} = $state; + $def->{READINGS}{state}{TIME} = $t; + $def->{READINGS}{state}{VAL} = $state; + Log GetLogLevel($name, 4), "USF1000 $name: $state"; + + $def->{READINGS}{distance}{TIME} = $t; + $def->{READINGS}{distance}{VAL} = $distance; + $def->{READINGS}{level}{TIME} = $t; + $def->{READINGS}{level}{VAL} = $flevel; + $def->{READINGS}{volume}{TIME} = $t; + $def->{READINGS}{volume}{VAL} = $volume; } - $flevel = int($volume/$capacity*100.0+0.5); - $volume= int($volume/10.0+0.5)*10.0; - - my $t= TimeNow(); - - my $state= sprintf("v: %d V: %d", $flevel, $volume); - - $def->{CHANGED}[0] = $state; - $def->{STATE} = $state; - $def->{READINGS}{state}{TIME} = $t; - $def->{READINGS}{state}{VAL} = $state; - Log GetLogLevel($name, 4), "USF1000 $name: $state"; - - $def->{READINGS}{distance}{TIME} = $t; - $def->{READINGS}{distance}{VAL} = $distance; - $def->{READINGS}{level}{TIME} = $t; - $def->{READINGS}{level}{VAL} = $flevel; - $def->{READINGS}{volume}{TIME} = $t; - $def->{READINGS}{volume}{VAL} = $volume; - my $warnings= ($lowbattery ? "Battery low" : ""); if($testmode) { $warnings.= "; " if($warnings); diff --git a/HISTORY b/HISTORY index 092cc318a..7bbfc02f8 100644 --- a/HISTORY +++ b/HISTORY @@ -417,3 +417,6 @@ - Sat Jun 20 2009 (Boris) - 09_USF1000.pm: new module to support USF1000S devices. + +- Fri Aug 08 2009 (Boris) + - 09_USF1000.pm: suppress inplausible readings from USF1000 \ No newline at end of file