############################################# package main; use strict; use warnings; 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($) { my ($hash) = @_; $hash->{GetFn} = "FRM_AD_Get"; $hash->{DefFn} = "FRM_Client_Define"; $hash->{InitFn} = "FRM_AD_Init"; $hash->{UndefFn} = "FRM_AD_Undef"; $hash->{AttrList} = "IODev upper-threshold lower-threshold loglevel:0,1,2,3,4,5,6 $main::readingFnAttributes"; } sub FRM_AD_Init($$) { my ($hash,$args) = @_; my $ret = FRM_Init_Pin_Client($hash,$args,PIN_ANALOG); return $ret if (defined $ret); my $firmata = $hash->{IODev}->{FirmataDevice}; my $name = $hash->{NAME}; $firmata->observe_analog($hash->{PIN},\&FRM_AD_observer,$hash); $main::defs{$name}{resolution}=$firmata->{metadata}{analog_resolutions}{$hash->{PIN}} if (defined $firmata->{metadata}{analog_resolutions}); if (! (defined AttrVal($name,"stateFormat",undef))) { $main::attr{$name}{"stateFormat"} = "reading"; } if (! (defined AttrVal($name,"event-min-interval",undef))) { $main::attr{$name}{"event-min-interval"} = 5; } main::readingsSingleUpdate($hash,"state","Initialized",1); return undef; } sub FRM_AD_observer { my ($pin,$old,$new,$hash) = @_; main::Log(6,"onAnalogMessage for pin ".$pin.", old: ".(defined $old ? $old : "--").", new: ".(defined $new ? $new : "--")); 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::readingsEndUpdate($hash,1); } sub FRM_AD_Get($) { my ($hash,@a) = @_; my $name = shift @a; my $cmd = shift @a; my $ret; ARGUMENT_HANDLER: { $cmd eq "reading" and do { eval { return FRM_Client_FirmataDevice($hash)->analog_read($hash->{PIN}); }; return $@; }; ( $cmd eq "alarm-upper-threshold" or $cmd eq "alarm-lower-threshold" or $cmd eq "state" ) and do { return main::ReadingsVal($name,"count",$gets{$cmd}); }; } return undef; } sub FRM_AD_Undef($$) { my ($hash, $name) = @_; } 1; =pod =begin html
define <name> FRM_AD <pin>