diff --git a/fhem/FHEM/10_FRM.pm b/fhem/FHEM/10_FRM.pm index 549f1272c..12b0120cb 100755 --- a/fhem/FHEM/10_FRM.pm +++ b/fhem/FHEM/10_FRM.pm @@ -399,6 +399,14 @@ FRM_Client_Unassign($) $dev->{STATE}="defined"; } +sub FRM_Client_FirmataDevice($) { + my $hash = shift; + my $iodev = $hash->{IODev}; + die $hash->{NAME}." no IODev assigned" unless defined $iodev; + die $hash->{NAME}.", ".$iodev->{NAME}." is not connected" unless (defined $iodev->{FirmataDevice} and (defined $iodev->{FD} or ($^O=~/Win/ and defined $iodev->{USBDev}))); + return $iodev->{FirmataDevice}; +} + package Firmata_IO; sub new { diff --git a/fhem/FHEM/20_FRM_AD.pm b/fhem/FHEM/20_FRM_AD.pm index fe858418c..037bfa681 100755 --- a/fhem/FHEM/20_FRM_AD.pm +++ b/fhem/FHEM/20_FRM_AD.pm @@ -88,10 +88,10 @@ FRM_AD_Get($) my $ret; ARGUMENT_HANDLER: { $cmd eq "reading" and do { - 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}); + 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}); diff --git a/fhem/FHEM/20_FRM_I2C.pm b/fhem/FHEM/20_FRM_I2C.pm index 52854bca1..8cde8da75 100755 --- a/fhem/FHEM/20_FRM_I2C.pm +++ b/fhem/FHEM/20_FRM_I2C.pm @@ -32,12 +32,9 @@ FRM_I2C_Init($) $hash->{"i2c-register"} = @$args[1]; $hash->{"i2c-bytestoread"} = @$args[2]; - return "no IODev set" unless defined $hash->{IODev}; - return "no FirmataDevice assigned to ".$hash->{IODev}->{NAME} unless defined $hash->{IODev}->{FirmataDevice}; - - eval { - $hash->{IODev}->{FirmataDevice}->i2c_read(@$args[0],@$args[1],@$args[2]); - }; + eval { + FRM_Client_FirmataDevice($hash)->i2c_read(@$args[0],@$args[1],@$args[2]); + }; return "error calling i2c_read: ".$@ if ($@); if (! (defined AttrVal($hash->{NAME},"event-min-interval",undef))) { $main::attr{$hash->{NAME}}{"event-min-interval"} = 5; diff --git a/fhem/FHEM/20_FRM_IN.pm b/fhem/FHEM/20_FRM_IN.pm index 65ac0c5ff..2b9c829b2 100755 --- a/fhem/FHEM/20_FRM_IN.pm +++ b/fhem/FHEM/20_FRM_IN.pm @@ -102,10 +102,10 @@ FRM_IN_Get($) my $cmd = shift @a; ARGUMENT_HANDLER: { $cmd eq "reading" and do { - 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}->digital_read($hash->{PIN}) == PIN_HIGH ? "on" : "off"; + eval { + return FRM_Client_FirmataDevice($hash)->digital_read($hash->{PIN}) == PIN_HIGH ? "on" : "off"; + }; + return $@; }; ( $cmd eq "count" or $cmd eq "alarm" or $cmd eq "state" ) and do { return main::ReadingsVal($name,"count",$gets{$cmd}); diff --git a/fhem/FHEM/20_FRM_OUT.pm b/fhem/FHEM/20_FRM_OUT.pm index a90768779..164f6c09a 100755 --- a/fhem/FHEM/20_FRM_OUT.pm +++ b/fhem/FHEM/20_FRM_OUT.pm @@ -53,15 +53,11 @@ FRM_OUT_Set($$$) my $list = "on off"; return SetExtensions($hash, $list, $name, $cmd, @a); } - my $iodev = $hash->{IODev}; - main::readingsSingleUpdate($hash,"value",$cmd, 1); - if (defined $iodev and defined $iodev->{FirmataDevice} and defined $iodev->{FD}) { - $iodev->{FirmataDevice}->digital_write($hash->{PIN},$value); - } else { - return $name." no IODev assigned" if (!defined $iodev); - return $name.", ".$iodev->{NAME}." is not connected"; - } - return undef; + eval { + FRM_Client_FirmataDevice($hash)->digital_write($hash->{PIN},$value); + main::readingsSingleUpdate($hash,"value",$cmd, 1); + }; + return $@; } sub FRM_OUT_State($$$$) diff --git a/fhem/FHEM/20_FRM_PWM.pm b/fhem/FHEM/20_FRM_PWM.pm index 16406eec0..218d4a0ca 100755 --- a/fhem/FHEM/20_FRM_PWM.pm +++ b/fhem/FHEM/20_FRM_PWM.pm @@ -56,14 +56,11 @@ FRM_PWM_Set($@) my $command = $a[1]; my $value = $a[2]; my $iodev = $hash->{IODev}; - main::readingsSingleUpdate($hash,"value",$value, 1); - if (defined $iodev and defined $iodev->{FirmataDevice} and defined $iodev->{FD}) { - $iodev->{FirmataDevice}->analog_write($hash->{PIN},$value); - } else { - return $hash->{NAME}." no IODev assigned" if (!defined $iodev); - return $hash->{NAME}.", ".$iodev->{NAME}." is not connected"; - } - return undef; + eval { + FRM_Client_FirmataDevice($hash)->analog_write($hash->{PIN},$value); + main::readingsSingleUpdate($hash,"value",$value, 1); + }; + return $@; } sub FRM_PWM_State($$$$) diff --git a/fhem/FHEM/20_FRM_SERVO.pm b/fhem/FHEM/20_FRM_SERVO.pm index 309ad8f55..9ed1e576b 100755 --- a/fhem/FHEM/20_FRM_SERVO.pm +++ b/fhem/FHEM/20_FRM_SERVO.pm @@ -69,15 +69,11 @@ FRM_SERVO_Set($@) if(!defined($sets{$a[1]})); my $command = $a[1]; my $value = $a[2]; - my $iodev = $hash->{IODev}; - if (defined $iodev and defined $iodev->{FirmataDevice} and defined $iodev->{FD}) { - $iodev->{FirmataDevice}->servo_write($hash->{PIN},$value); - main::readingsSingleUpdate($hash,"state",$value, 1); - } else { - return $hash->{NAME}." no IODev assigned" if (!defined $iodev); - return $hash->{NAME}.", ".$iodev->{NAME}." is not connected"; - } - return undef; + eval { + FRM_Client_FirmataDevice($hash)->servo_write($hash->{PIN},$value); + main::readingsSingleUpdate($hash,"state",$value, 1); + }; + return $@; } sub