diff --git a/fhem/FHEM/10_KNX.pm b/fhem/FHEM/10_KNX.pm index 3f1e0f5ee..b4456150e 100644 --- a/fhem/FHEM/10_KNX.pm +++ b/fhem/FHEM/10_KNX.pm @@ -23,6 +23,8 @@ # ABU 20180605 Added example for autogenerated devices # ABU 20180605 Added workaround for STATE # ABU 20180606 Fixed dpt18, fixed offset-addition in decode (was "-" instead of "+"), fixed issue with slider +# ABU 20180607 seperated limit and scale from encode/decode in order to avoid warnings and clean up +# ABU 20180613 fixed scaling algo package main; @@ -940,10 +942,8 @@ KNX_Set($@) { my $transval = KNX_checkAndClean($hash, $value, $targetGadName); #if cast not successful - if (!defined($transval)) - { - return "invalid value: $value" if (!defined($transval)); - } + return "invalid value: $value" if (!defined($transval)); + # # #/process set command @@ -1485,9 +1485,9 @@ KNX_limit ($$$$) { my $factor = $dpttypes{$model}{FACTOR}; my $offset = $dpttypes{$model}{OFFSET}; #get limits - my $min = $dpttypes{"$model"}{MIN}; - my $max = $dpttypes{"$model"}{MAX}; - + my $min = $dpttypes{$model}{MIN}; + my $max = $dpttypes{$model}{MAX}; + #only execute, if nummeric value if (looks_like_number ($value)) { @@ -1496,28 +1496,31 @@ KNX_limit ($$$$) { { if ($direction =~ m/^encode/i) { - $retVal = $value / $factor if (defined ($factor)); - $retVal = $value - $offset if (defined ($offset)); + #correct value + $retVal /= $factor if (defined ($factor)); + $retVal -= $offset if (defined ($offset)); } elsif ($direction =~ m/^decode/i) { #correct value - $retVal = $value + $offset if (defined ($offset)); - $retVal = $value * $factor if (defined ($factor)); + $retVal += $offset if (defined ($offset)); + $retVal *= $factor if (defined ($factor)); } - Log3 ($name, 5, "limit: FACTOR: $min" ) if (defined ($factor)); - Log3 ($name, 5, "limit: OFFSET: $min" ) if (defined ($offset)); - Log3 ($name, 5, "limit: scaled... Output: $retVal, Input: $value") if ($retVal != $value); + Log3 ($name, 5, "limit: FACTOR: $factor" ) if (defined ($factor)); + Log3 ($name, 5, "limit: OFFSET: $offset" ) if (defined ($offset)); + Log3 ($name, 5, "limit: scaled... Output: $retVal, Input: $value, Model: $model") if ($retVal != $value); } + #backup for later check + my $checkVal = $retVal; #limitValue - $retVal = $min if (defined ($min) and ($value < $min)); - $retVal = $max if (defined ($max) and ($value > $max)); + $retVal = $min if (defined ($min) and ($retVal < $min)); + $retVal = $max if (defined ($max) and ($retVal > $max)); Log3 ($name, 5, "limit: MIN: $min" ) if (defined ($min)); - Log3 ($name, 5, "limit: MAX: $min" ) if (defined ($max)); - Log3 ($name, 5, "limit: casted... Output: $retVal, Input: $value" ) if ($retVal != $value); + Log3 ($name, 5, "limit: MAX: $max" ) if (defined ($max)); + Log3 ($name, 5, "limit: casted... Output: $retVal, Input: $value, Model: $model" ) if ($checkVal != $value); } else {