From 507137015f7f698b0a2fe2739aa720a7f8f1d301 Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Mon, 8 Oct 2018 07:38:31 +0000 Subject: [PATCH] 10_MQTT_DEVICE.pm: add $EVENT to the non-perl variant of set and get (Forum #91394) git-svn-id: https://svn.fhem.de/fhem/trunk@17487 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_MQTT2_DEVICE.pm | 72 +++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/fhem/FHEM/10_MQTT2_DEVICE.pm b/fhem/FHEM/10_MQTT2_DEVICE.pm index 269195876..23ad1b5e9 100644 --- a/fhem/FHEM/10_MQTT2_DEVICE.pm +++ b/fhem/FHEM/10_MQTT2_DEVICE.pm @@ -176,6 +176,36 @@ MQTT2_getCmdHash($) return (\%h, join(" ",@cmd)); } +############################# +# replace {} and $EVENT. Used both in set and get +sub +MQTT2_buildCmd($$$) +{ + my ($hash, $a, $cmd) = @_; + + shift @{$a}; + if($cmd =~ m/^{.*}$/) { + $cmd = EvalSpecials($cmd, ("%EVENT"=>join(" ",@{$a}), "%NAME"=>$hash->{NAME})); + $cmd = AnalyzeCommandChain($hash->{CL}, $cmd); + return if(!$cmd); + + } else { + if($cmd =~ m/\$EV/) { # replace EVENT & $EVTPART + my $event = join(" ",@{$a}); + $cmd =~ s/\$EVENT/$event/g; + for(my $i=0; $i<@{$a}; $i++) { + my $n = "\\\$EVTPART$i"; + $cmd =~ s/$n/$a->[$i]/ge; + } + } else { + shift @{$a}; + $cmd .= " ".join(" ",@{$a}) if(@{$a}); + } + } + + $cmd =~ s/\$DEVICETOPIC/$hash->{DEVICETOPIC}/g; + return $cmd; +} ############################# sub @@ -198,18 +228,10 @@ MQTT2_DEVICE_Get($@) }, $tHash, 0); } - shift @a; - if($cmd =~ m/^{.*}$/) { - $cmd = EvalSpecials($cmd, ("%EVENT"=>join(" ",@a), "%NAME"=>$hash->{NAME})); - $cmd = AnalyzeCommandChain($hash->{CL}, $cmd); - return if(!$cmd); - } else { - shift @a; - $cmd .= " ".join(" ",@a) if(@a); - } - - $cmd =~ s/\$DEVICETOPIC/$hash->{DEVICETOPIC}/g; + $cmd = MQTT2_buildCmd($hash, \@a, $cmd); + return if(!$cmd); IOWrite($hash, split(" ",$cmd,2)); + return undef; } @@ -226,18 +248,8 @@ MQTT2_DEVICE_Set($@) return SetExtensions($hash, $cmdList, @a) if(!$cmd); return undef if(IsDisabled($hash->{NAME})); - shift @a; - if($cmd =~ m/^{.*}$/) { - my $NAME = $hash->{NAME}; - $cmd = EvalSpecials($cmd, ("%EVENT"=>join(" ",@a), "%NAME"=>$hash->{NAME})); - $cmd = AnalyzeCommandChain($hash->{CL}, $cmd); - return if(!$cmd); - } else { - shift @a; - $cmd .= " ".join(" ",@a) if(@a); - } - - $cmd =~ s/\$DEVICETOPIC/$hash->{DEVICETOPIC}/g; + $cmd = MQTT2_buildCmd($hash, \@a, $cmd); + return if(!$cmd); IOWrite($hash, split(" ",$cmd,2)); readingsSingleUpdate($hash, "state", $cmdName, 1); return undef; @@ -440,9 +452,10 @@ MQTT2_DEVICE_Undef($$) @@ -470,9 +483,10 @@ MQTT2_DEVICE_Undef($$) Use a set and a notify/DOIF/etc definition for such a purpose
  • arguments to the get command will be appended to the message published (not for the perl expression)
  • -
  • if using a perl expressions, the command arguments are available as - $EVENT, $EVTPART0, etc. The perl expression must return a string - containing the topic and the message separated by a space.
  • +
  • the command arguments are available as $EVENT, $EVTPART0, etc. +
  • +
  • the perl expression must return a string containing the topic and + the message separated by a space.