diff --git a/fhem/FHEM/20_FRM_AD.pm b/fhem/FHEM/20_FRM_AD.pm index 9ea9be56a..4bdc51f6a 100755 --- a/fhem/FHEM/20_FRM_AD.pm +++ b/fhem/FHEM/20_FRM_AD.pm @@ -7,6 +7,14 @@ use Device::Firmata; use Device::Firmata::Constants qw/ :all /; ##################################### + +my %gets = ( + "reading" => "", + "state" => "", + "alarm-upper-threshold" => "off", + "alarm-lower-threshold" => "off", +); + sub FRM_AD_Initialize($) { @@ -17,7 +25,7 @@ FRM_AD_Initialize($) $hash->{InitFn} = "FRM_AD_Init"; $hash->{UndefFn} = "FRM_AD_Undef"; - $hash->{AttrList} = "IODev loglevel:0,1,2,3,4,5 $main::readingFnAttributes"; + $hash->{AttrList} = "IODev upper-threshold lower-threshold loglevel:0,1,2,3,4,5 $main::readingFnAttributes"; } sub @@ -28,6 +36,9 @@ FRM_AD_Init($$) my $firmata = $hash->{IODev}->{FirmataDevice}; $firmata->observe_analog($hash->{PIN},\&FRM_AD_observer,$hash); $main::defs{$hash->{NAME}}{resolution}=$firmata->{metadata}{analog_resolutions}{$hash->{PIN}} if (defined $firmata->{metadata}{analog_resolutions}); + if (! (defined AttrVal($hash->{NAME},"stateFormat",undef))) { + $main::attr{$hash->{NAME}}{"stateFormat"} = "reading"; + } main::readingsSingleUpdate($hash,"state","Initialized",1); return undef; } @@ -39,27 +50,52 @@ FRM_AD_observer { my ($pin,$old,$new,$hash) = @_; main::Log(6,"onAnalogMessage for pin ".$pin.", old: ".(defined $old ? $old : "--").", new: ".(defined $new ? $new : "--")); - main::readingsSingleUpdate($hash,"state",$new, 1); + main::readingsBeginUpdate($hash); + main::readingsBulkUpdate($hash,"reading",$new,1); + my $name = $hash->{NAME}; + my $upperthresholdalarm = ReadingsVal($name,"alarm-upper-threshold","off"); + if ( $new < AttrVal($name,"upper-threshold",1024) ) { + if ( $upperthresholdalarm eq "on" ) { + main::readingsBulkUpdate($hash,"alarm-upper-threshold","off",1); + } + my $lowerthresholdalarm = ReadingsVal($name,"alarm-lower-threshold","off"); + if ( $new > AttrVal($name,"lower-threshold",-1) ) { + if ( $lowerthresholdalarm eq "on" ) { + main::readingsBulkUpdate($hash,"alarm-lower-threshold","off",1); + } + } else { + if ( $lowerthresholdalarm eq "off" ) { + main::readingsBulkUpdate($hash,"alarm-lower-threshold","on",1); + } + } + } else { + if ( $upperthresholdalarm eq "off" ) { + main::readingsBulkUpdate($hash,"alarm-upper-threshold","on",1); + } + }; + main::readingsBulkUpdate($hash,"reading",$new, 1); + main::readingsEndUpdate($hash,0); } sub FRM_AD_Get($) { my ($hash,@a) = @_; - my $iodev = $hash->{IODev}; my $name = shift @a; - return $name." no IODev assigned" if (!defined $iodev); - return $name.", ".$iodev->{NAME}." is not connected" if (!(defined $iodev->{FirmataDevice} and defined $iodev->{FD})); my $cmd = shift @a; my $ret; ARGUMENT_HANDLER: { $cmd eq "reading" and do { - $ret = $iodev->{FirmataDevice}->analog_read($hash->{PIN}); - last; + my $iodev = $hash->{IODev}; + return $name." no IODev assigned" if (!defined $iodev); + return $name.", ".$iodev->{NAME}." is not connected" if (!(defined $iodev->{FirmataDevice} and defined $iodev->{FD})); + return $iodev->{FirmataDevice}->analog_read($hash->{PIN}); + }; + ( $cmd eq "alarm-upper-threshold" or $cmd eq "alarm-lower-threshold" or $cmd eq "state" ) and do { + return main::ReadingsVal($name,"count",$gets{$cmd}); }; - $ret = "unknown command ".$cmd; } - return $ret; + return undef; } sub @@ -92,17 +128,35 @@ FRM_AD_Undef($$) Set

Get

Attributes