############################################# package main; use strict; use warnings; use Device::Firmata; use Device::Firmata::Constants qw/ :all /; ##################################### my %sets = ( "value" => "", ); sub FRM_PWM_Initialize($) { my ($hash) = @_; $hash->{SetFn} = "FRM_PWM_Set"; $hash->{DefFn} = "FRM_Client_Define"; $hash->{InitFn} = "FRM_PWM_Init"; $hash->{UndefFn} = "FRM_PWM_Undef"; $hash->{StateFn} = "FRM_PWM_State"; $hash->{AttrList} = "restoreOnReconnect:on,off restoreOnStartup:on,off IODev loglevel:0,1,2,3,4,5 $main::readingFnAttributes"; } sub FRM_PWM_Init($$) { my ($hash,$args) = @_; my $ret = FRM_Init_Pin_Client($hash,$args,PIN_PWM); return $ret if (defined $ret); my $firmata = $hash->{IODev}->{FirmataDevice}; my $name = $hash->{NAME}; $main::defs{$name}{resolution}=$firmata->{metadata}{pwm_resolutions}{$hash->{PIN}} if (defined $firmata->{metadata}{pwm_resolutions}); if (! (defined AttrVal($name,"stateFormat",undef))) { $main::attr{$name}{"stateFormat"} = "value"; } my $value = ReadingsVal($name,"value",undef); if (defined $value and AttrVal($hash->{NAME},"restoreOnReconnect","on") eq "on") { FRM_OUT_Set($hash,$value); } main::readingsSingleUpdate($hash,"state","Initialized",1); return undef; } sub FRM_PWM_Set($@) { my ($hash, @a) = @_; return "Need at least one parameters" if(@a < 2); return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets) if(!defined($sets{$a[1]})); my $command = $a[1]; my $value = $a[2]; my $iodev = $hash->{IODev}; eval { FRM_Client_FirmataDevice($hash)->analog_write($hash->{PIN},$value); main::readingsSingleUpdate($hash,"value",$value, 1); }; return $@; } sub FRM_PWM_State($$$$) { my ($hash, $tim, $sname, $sval) = @_; STATEHANDLER: { $sname eq "value" and do { if (AttrVal($hash->{NAME},"restoreOnStartup","on") eq "on") { FRM_PWM_Set($hash,$hash->{NAME},$sval); } last; } } } sub FRM_PWM_Undef($$) { my ($hash, $name) = @_; } 1; =pod =begin html
define <name> FRM_PWM <pin>
set <name> value <value>