diff --git a/fhem/FHEM/10_KNX.pm b/fhem/FHEM/10_KNX.pm index 89bebedf5..b2bac0765 100644 --- a/fhem/FHEM/10_KNX.pm +++ b/fhem/FHEM/10_KNX.pm @@ -28,6 +28,7 @@ # ABU 20180613 fixed scaling algo part 2 # ABU 20180624 no set-option for listenoly- or get-devices, warning for illegal EVAL # ABU 20180626 fixed last changes +# ABU 20180706 changed eval, removed stateCopy package main; @@ -235,10 +236,9 @@ KNX_Initialize($) { "do_not_notify:1,0 " . #supress any notification (including log) "showtime:1,0 " . #shows time instead of received value in state "answerReading:1,0 " . #allows FHEM to answer a read telegram - "stateRegex " . #modifies state value - "stateCmd " . #modify state value - "putCmd " . #called when the KNX bus asks for a -put reading - "stateCopy " . #backup content of state in this reading (only for received telegrams) + "stateRegex:textField-long " .#modifies state value + "stateCmd:textField-long " . #modify state value + "putCmd:textField-long " . #called when the KNX bus asks for a -put reading "format " . #supplies post-string "listenonly:1,0 " . #DEPRECATED "readonly:1,0 " . #DEPRECATED @@ -989,8 +989,7 @@ KNX_Set($@) { my $cmdAttr = AttrVal($name, "stateCmd", undef); if (defined ($cmdAttr) and !($cmdAttr eq "")) { - $state = eval $cmdAttr; - Log3 ($name, 2, "set name: Eval error - $@") if $@; + $state = KNX_eval ($hash, $targetGadName, $state, $cmdAttr); Log3 ($name, 5, "set name: $name - state replaced via command, result: state:$state"); } @@ -1233,8 +1232,8 @@ KNX_Parse($$) { my $cmdAttr = AttrVal($deviceName, "stateCmd", undef); if (defined ($cmdAttr) and !($cmdAttr eq "")) { - $state = eval $cmdAttr; - Log3 ($deviceName, 2, "parse device hash (wpi): Eval error - $@") if $@; + + $state = KNX_eval ($deviceHash, $gadName, $state, $cmdAttr); Log3 ($deviceName, 5, "parse device hash (wpi): $deviceHash name: $deviceName - state replaced via command $cmdAttr - state: $state"); } #reassign original name... @@ -1280,23 +1279,14 @@ KNX_Parse($$) { if (defined ($cmdAttr) and !($cmdAttr eq "")) { my $orgValue = $value; - my $gad = $gadName; - - #backup kontext - my $orgHash = $hash; - $hash = $deviceHash; - - eval $cmdAttr; - Log3 ($deviceName, 2, "parse device hash (r): Eval error - $@") if $@; + + $value = KNX_eval ($hash, $gadName, $value, $cmdAttr); if ($orgValue ne $value) { Log3 ($deviceName, 5, "parse device hash (r): $deviceHash name: $deviceName - put replaced via command $cmdAttr - value: $value"); readingsSingleUpdate($deviceHash, $putString, $value,1); } - - #restore kontext - $hash = $orgHash; } ###/ @@ -1549,6 +1539,26 @@ KNX_limit ($$$$) { return $retVal; } +#Private function to encode KNX-Message according DPT +############################# +sub +KNX_eval ($$$$) { + my ($hash, $gadName, $state, $evalString) = @_; + my $name = $hash->{NAME}; + my $retVal = undef; + + Log3 ($name, 5, "Enter eval...name: $name, gadName: $gadName, evalString: \n$evalString\n"); + + $retVal = eval $evalString; + + Log3 ($name, 2, "set name: Eval error - $@") if $@; + Log3 ($name, 5, "Exit eval...result: $retVal"); + + $retVal = "ERROR" if (not defined ($retVal)); + + return $retVal; +} + #Private function to encode KNX-Message according DPT ############################# sub @@ -2137,7 +2147,6 @@ The answer from the bus-device is not shown in the toolbox, but is treated like room
showtime
sortby
-stateCopy
stateFormat
supressReading
timestamp-on-change-reading
@@ -2156,12 +2165,12 @@ The answer from the bus-device is not shown in the toolbox, but is treated like

stateCmd

- - + +

putCmd

- +

format