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
This commit is contained in:
1
CHANGED
1
CHANGED
@@ -523,3 +523,4 @@
|
|||||||
- bugfix: Fixes for Windows by Klaus
|
- bugfix: Fixes for Windows by Klaus
|
||||||
- bugfix: Another "rereadcfg" bugfix
|
- bugfix: Another "rereadcfg" bugfix
|
||||||
- feature: Update to the current (1.27) CUL FHT interface
|
- feature: Update to the current (1.27) CUL FHT interface
|
||||||
|
- feature: suppress inplausible readings from USF1000
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ USF1000_Parse($$)
|
|||||||
return "" if($def->{IODev} && $def->{IODev}{NAME} ne $hash->{NAME});
|
return "" if($def->{IODev} && $def->{IODev}{NAME} ne $hash->{NAME});
|
||||||
|
|
||||||
|
|
||||||
|
my $t= TimeNow();
|
||||||
|
|
||||||
# Msg format:
|
# Msg format:
|
||||||
# 01 23 45 67 8901 2345 6789 01 23 45 67
|
# 01 23 45 67 8901 2345 6789 01 23 45 67
|
||||||
# 81 0c 04 .. 0101 a001 a5ce aa 00 cc xx
|
# 81 0c 04 .. 0101 a001 a5ce aa 00 cc xx
|
||||||
@@ -112,45 +114,47 @@ USF1000_Parse($$)
|
|||||||
my $lowbattery= (hex($cc) & 0x40 ? 1 : 0);
|
my $lowbattery= (hex($cc) & 0x40 ? 1 : 0);
|
||||||
my $testmode= (hex($cc) & 0x80 ? 1 : 0);
|
my $testmode= (hex($cc) & 0x80 ? 1 : 0);
|
||||||
my $distance= hex($xx)/100.0; # in meters
|
my $distance= hex($xx)/100.0; # in meters
|
||||||
|
my $valid= (($distance>0.00) && ($distance<2.55));
|
||||||
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") {
|
if($valid) {
|
||||||
# cuboid
|
my $wlevel = $def->{HEIGHT}-($distance-$def->{OFFSET}); # water level
|
||||||
$volume = $def->{LENGTH}*$def->{WIDTH}*$wlevel*1000.0;
|
|
||||||
} elsif($geometry eq "cylv") {
|
my $geometry= $def->{GEOMETRY};
|
||||||
# vertical cylinder
|
my $capacity= $def->{CAPACITY}; # capacity of tank (for distance= offset) in liters
|
||||||
$volume = $PI*$def->{DIAMETER}*$def->{DIAMETER}/4.0*$wlevel*1000.0;
|
my $volume; # current volume in tank in liters
|
||||||
} else {
|
my $flevel; # fill level in percent
|
||||||
return 0;
|
|
||||||
|
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" : "");
|
my $warnings= ($lowbattery ? "Battery low" : "");
|
||||||
if($testmode) {
|
if($testmode) {
|
||||||
$warnings.= "; " if($warnings);
|
$warnings.= "; " if($warnings);
|
||||||
|
|||||||
Reference in New Issue
Block a user