2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 09:16:53 +00:00

98_Arducounter.pm: new version to better support monitoring of analog levels for reflective light barrier

git-svn-id: https://svn.fhem.de/fhem/trunk@19977 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
StefanStrobel 2019-08-10 12:51:26 +00:00
parent adee750682
commit afad22090a

View File

@ -81,10 +81,14 @@
# 2019-02-24 added documentation and better return value when get history has no data, option to pass a pinName to get history
# query new running config after configuring device
# 2019-06-17 fix log messages and expose logRetries attribute
# 2019-07-20 add clearLevels, parese more verbose level output at 25v
# 2019-08-10 fix parsing of levels at devVerbose >= 25
#
#
# ideas / todo:
#
# - max time for interpolation as attribute
# - detect level threasholds automatically for analog input, track drift
#
# - convert module to package
#
@ -104,7 +108,7 @@ use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
my $ArduCounter_Version = '6.15 - 17.6.2019';
my $ArduCounter_Version = '6.17 - 10.8.2019';
my %ArduCounter_sets = (
@ -114,6 +118,7 @@ my %ArduCounter_sets = (
"reset" => "",
"flash" => "",
"saveConfig" => "",
"clearLevels" => "",
"reconnect" => ""
);
@ -1001,6 +1006,10 @@ sub ArduCounter_Set($@)
ArduCounter_Open($hash);
return;
} elsif ($attr eq "clearLevels") {
delete $hash->{analogLevels};
return;
} elsif ($attr eq "flash") {
return ArduCounter_Flash($hash, @a);
}
@ -1050,6 +1059,14 @@ sub ArduCounter_Get($@)
return "Unknown argument $attr, choose one of " . join(" ", @cList);
}
if ($attr eq "levels") {
my $msg = "";
foreach my $level (sort {$a <=> $b} keys %{$hash->{analogLevels}}) {
$msg .= "$level: $hash->{analogLevels}{$level}\n";
}
return "observed levels from analog input:\n$msg\n";
}
if(!$hash->{FD}) {
Log3 $name, 4, "$name: Get called but device is disconnected";
return ("Get called but device is disconnected", undef);
@ -1089,13 +1106,6 @@ sub ArduCounter_Get($@)
$ret;
}
return ($ret ? $ret : "no history data so far");
} elsif ($attr eq "levels") {
my $msg = "";
foreach my $level (sort {$a <=> $b} keys %{$hash->{analogLevels}}) {
$msg .= "$level: $hash->{analogLevels}{$level}\n";
}
return "observed levels from analog input:\n$msg\n";
}
return undef;
@ -1600,7 +1610,13 @@ sub ArduCounter_Parse($)
$retStr .= ($retStr ? "\n" : "") . $line;
Log3 $name, 4, "$name: device: $1";
} elsif ($line =~ /^L([\d]+)/) { # analog level difference reported
} elsif ($line =~ /^L *([\d]+) ?, ?([\d]+) ?, ?-> *([\d]+)/) { # analog level difference reported with details
if ($hash->{analogLevels}{$3}) {
$hash->{analogLevels}{$3}++;
} else {
$hash->{analogLevels}{$3} = 1;
}
} elsif ($line =~ /^L *([\d]+)/) { # analog level difference reported
if ($hash->{analogLevels}{$1}) {
$hash->{analogLevels}{$1}++;
} else {