From a40cd900e6b942c22d19f09a900dc239208e6dff Mon Sep 17 00:00:00 2001 From: zap <> Date: Sun, 2 Oct 2022 13:58:29 +0000 Subject: [PATCH] HMCCU: Fixed set pct/level bug git-svn-id: https://svn.fhem.de/fhem/trunk@26469 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/88_HMCCU.pm | 36 ++++++++++++++++++++++++------------ fhem/FHEM/88_HMCCUCHN.pm | 5 +++-- fhem/FHEM/88_HMCCUDEV.pm | 4 ++-- fhem/FHEM/88_HMCCURPCPROC.pm | 2 +- fhem/FHEM/HMCCUConf.pm | 6 +++--- 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 93b768aae..03789a995 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - change: 88_HMCCU: Fixed set pct/level bug - change: 37_SHC: Support current smarthomatic version. Basestation uses 115200 Baud by default and CRC. EnvSensor supports particulate matter sensor. diff --git a/fhem/FHEM/88_HMCCU.pm b/fhem/FHEM/88_HMCCU.pm index d1cc71173..7fa2b9344 100755 --- a/fhem/FHEM/88_HMCCU.pm +++ b/fhem/FHEM/88_HMCCU.pm @@ -57,7 +57,7 @@ my %HMCCU_CUST_CHN_DEFAULTS; my %HMCCU_CUST_DEV_DEFAULTS; # HMCCU version -my $HMCCU_VERSION = '5.0 222632130'; +my $HMCCU_VERSION = '5.0 222751518'; # Timeout for CCU requests (seconds) my $HMCCU_TIMEOUT_REQUEST = 4; @@ -7426,7 +7426,7 @@ sub HMCCU_ExecuteRoleCommand ($@) # Align new value with min/max boundaries if (exists($cmd->{min}) && exists($cmd->{max}) && HMCCU_IsFltNum($cmd->{min}) && HMCCU_IsFltNum($cmd->{max})) { - # Use mode = 0 in HMCCU_ScaleValue to get the min and max value allowed + # Use mode = 2 in HMCCU_ScaleValue to get the min and max value allowed HMCCU_Trace ($clHash, 2, "MinMax: value=$value, min=$cmd->{min}, max=$cmd->{max}"); my $scMin = HMCCU_ScaleValue ($clHash, $channel, $cmd->{dpt}, $cmd->{min}, 2); my $scMax = HMCCU_ScaleValue ($clHash, $channel, $cmd->{dpt}, $cmd->{max}, 2); @@ -9171,12 +9171,12 @@ sub HMCCU_SetMultipleParameters ($$$;$) my ($clHash, $address, $params, $paramSet) = @_; $paramSet //= 'VALUES'; $address =~ s/:d$//; + my $clName = $clHash->{NAME}; my ($add, $chn) = HMCCU_SplitChnAddr ($address, 'd'); return (-1, undef) if ($paramSet eq 'VALUES' && $chn eq 'd'); foreach my $p (sort keys %$params) { - HMCCU_Trace ($clHash, 2, "Parameter=$address.$paramSet.$p chn=$chn Value=$params->{$p}"); return (-8, undef) if ( ($paramSet eq 'VALUES' && !HMCCU_IsValidParameter ($clHash, $address, 'VALUES', $p, 2)) || ($paramSet eq 'MASTER' && !HMCCU_IsValidParameter ($clHash, $address, 'MASTER', $p)) @@ -9184,8 +9184,11 @@ sub HMCCU_SetMultipleParameters ($$$;$) if ($params->{$p} !~ /:(STRING|BOOL|INTEGER|FLOAT|DOUBLE)$/) { $params->{$p} = HMCCU_ScaleValue ($clHash, $chn, $p, $params->{$p}, 1, $paramSet); } + HMCCU_Trace ($clHash, 2, "set parameter=$address.$paramSet.$p chn=$chn value=$params->{$p}"); } + return 0 if (HMCCU_IsFlag ($clName, 'simulate')); + return HMCCU_RPCParamsetRequest ($clHash, 'putParamset', $address, $paramSet, $params); } @@ -9237,8 +9240,6 @@ sub HMCCU_SetMultipleDatapoints ($$) return -4 if (exists($clHash->{ccudevstate}) && $clHash->{ccudevstate} eq 'deleted'); return -21 if (IsDisabled ($clHash->{NAME})); - HMCCU_Trace ($clHash, 2, "dpt=$p, value=$v"); - # Check client device type and datapoint my $clType = $clHash->{TYPE}; my $ccuType = $clHash->{ccutype}; @@ -9272,6 +9273,9 @@ sub HMCCU_SetMultipleDatapoints ($$) $v = HMCCU_GetEnumValues ($ioHash, $paramDef, $dpt, $v); } } + + HMCCU_Trace ($clHash, 2, "set dpt=$p, value=$v"); + # my $dptType = HMCCU_GetDatapointAttr ($ioHash, $ccuType, $chn, $dpt, 'type'); # $v = "'".$v."'" if (defined($dptType) && $dptType == $HMCCU_TYPE_STRING); my $c = '(datapoints.Get("'.$int.'.'.$add.':'.$chn.'.'.$dpt.'")).State('.$v.");\n"; @@ -9284,6 +9288,9 @@ sub HMCCU_SetMultipleDatapoints ($$) } } + HMCCU_Trace ($clHash, 2, "cmd=$cmd"); + return 0 if (HMCCU_IsFlag ($clName, 'simulate')); + if ($ccuFlags =~ /nonBlocking/) { # Execute command (non blocking) HMCCU_HMCommandNB ($clHash, $cmd, undef); @@ -9298,7 +9305,10 @@ sub HMCCU_SetMultipleDatapoints ($$) ###################################################################### # Scale, spread and/or shift datapoint value. -# Mode: 0 = Get/Multiply, 1 = Set/Divide, 2 = Scale min/max value +# Mode: +# 0 = Get/Multiply/Scale up +# 1 = Set/Divide/Scale down +# 2 = Scale min/max value # Supports reversing of value if value range is specified. Syntax for # Rule is: # [ChannelNo.]Datapoint:Factor @@ -9315,8 +9325,11 @@ sub HMCCU_ScaleValue ($$$$$;$) my $name = $hash->{NAME}; my $ioHash = HMCCU_GetHash ($hash); -# my $boundsChecking = HMCCU_IsFlag ($name, 'noBoundsChecking') ? 0 : 1; - my $boundsChecking = $dpt =~ /^LEVEL/ && ($value == -0.005 || $value == 1.005 || $value == 1.01) ? 0 : 1; + my $boundsChecking = ( + $mode == 2 || + ($mode == 0 && $dpt =~ /^LEVEL/ && ($value == -0.005 || $value == 1.005 || $value == 1.01)) || + ($mode == 1 && $dpt =~ /^LEVEL/ && ($value == -0.5 || $value == 100.5 || $value == 101)) + ) ? 0 : 1; # Get parameter definition and min/max values my $min; @@ -9416,16 +9429,15 @@ sub HMCCU_ScaleValue ($$$$$;$) elsif (defined($unit) && ($unit eq 'minutes' || $unit eq 's')) { $value = HMCCU_ConvertTime ($value, $unit, $mode); } - elsif (defined($unit) && $unit =~ /^([0-9]+)%$/ && $boundsChecking) { - # percentage values. Values < 0 won't be scaled + elsif (defined($unit) && $unit =~ /^([0-9]+)%$/) { my $f = $1; $min //= 0; $max //= 1.0; if ($mode == 0 || $mode == 2) { - $value = HMCCU_MinMax ($value, $min, $max)*$f; + $value = $boundsChecking ? HMCCU_MinMax ($value, $min, $max)*$f : $value*$f; } else { - $value = HMCCU_MinMax($value, $min*$f, $max*$f)/$f; + $value = $boundsChecking ? HMCCU_MinMax($value, $min*$f, $max*$f)/$f : $value/$f; } } diff --git a/fhem/FHEM/88_HMCCUCHN.pm b/fhem/FHEM/88_HMCCUCHN.pm index 8071fe35b..b7f771936 100644 --- a/fhem/FHEM/88_HMCCUCHN.pm +++ b/fhem/FHEM/88_HMCCUCHN.pm @@ -30,7 +30,7 @@ sub HMCCUCHN_Set ($@); sub HMCCUCHN_Get ($@); sub HMCCUCHN_Attr ($@); -my $HMCCUCHN_VERSION = '5.0 222632130'; +my $HMCCUCHN_VERSION = '5.0 222751518'; ###################################################################### # Initialize module @@ -51,7 +51,7 @@ sub HMCCUCHN_Initialize ($) $hash->{parseParams} = 1; $hash->{AttrList} = 'IODev ccucalculate '. - 'ccuflags:multiple-strict,hideStdReadings,replaceStdReadings,noBoundsChecking,ackState,logCommand,noReadings,trace,showMasterReadings,showLinkReadings,showDeviceReadings,showServiceReadings '. + 'ccuflags:multiple-strict,hideStdReadings,replaceStdReadings,noBoundsChecking,ackState,logCommand,noReadings,trace,simulate,showMasterReadings,showLinkReadings,showDeviceReadings,showServiceReadings '. 'ccureadingfilter:textField-long statedatapoint controldatapoint '. 'ccureadingformat:name,namelc,address,addresslc,datapoint,datapointlc '. 'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix '. @@ -766,6 +766,7 @@ sub HMCCUCHN_Get ($@) logCommand: Write get and set commands to FHEM log with verbose level 3.
noBoundsChecking: Datapoint values are not checked for min/max boundaries
noReadings: Do not update readings
+ simulate: Do not execute set datapoint commands. Use this flag together with 'trace'
showDeviceReadings: Show readings of device and channel 0.
showLinkReadings: Show link readings.
showMasterReadings: Show configuration readings.
diff --git a/fhem/FHEM/88_HMCCUDEV.pm b/fhem/FHEM/88_HMCCUDEV.pm index c1ed5d124..44eb5388f 100644 --- a/fhem/FHEM/88_HMCCUDEV.pm +++ b/fhem/FHEM/88_HMCCUDEV.pm @@ -31,7 +31,7 @@ sub HMCCUDEV_Set ($@); sub HMCCUDEV_Get ($@); sub HMCCUDEV_Attr ($@); -my $HMCCUDEV_VERSION = '5.0 222632130'; +my $HMCCUDEV_VERSION = '5.0 222751518'; ###################################################################### # Initialize module @@ -52,7 +52,7 @@ sub HMCCUDEV_Initialize ($) $hash->{parseParams} = 1; $hash->{AttrList} = 'IODev ccuaggregate:textField-long ccucalculate:textField-long '. - 'ccuflags:multiple-strict,ackState,hideStdReadings,replaceStdReadings,noBoundsChecking,logCommand,noReadings,trace,showMasterReadings,showLinkReadings,showDeviceReadings,showServiceReadings '. + 'ccuflags:multiple-strict,ackState,hideStdReadings,replaceStdReadings,noBoundsChecking,logCommand,noReadings,trace,simulate,showMasterReadings,showLinkReadings,showDeviceReadings,showServiceReadings '. 'ccureadingfilter:textField-long '. 'ccureadingformat:name,namelc,address,addresslc,datapoint,datapointlc '. 'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix devStateFlags '. diff --git a/fhem/FHEM/88_HMCCURPCPROC.pm b/fhem/FHEM/88_HMCCURPCPROC.pm index f890e9d60..5c2d4f9ba 100755 --- a/fhem/FHEM/88_HMCCURPCPROC.pm +++ b/fhem/FHEM/88_HMCCURPCPROC.pm @@ -39,7 +39,7 @@ use SetExtensions; ###################################################################### # HMCCURPC version -my $HMCCURPCPROC_VERSION = '5.0 222632130'; +my $HMCCURPCPROC_VERSION = '5.0 222751518'; # Maximum number of events processed per call of Read() my $HMCCURPCPROC_MAX_EVENTS = 100; diff --git a/fhem/FHEM/HMCCUConf.pm b/fhem/FHEM/HMCCUConf.pm index 25717f5d6..5d3baed58 100644 --- a/fhem/FHEM/HMCCUConf.pm +++ b/fhem/FHEM/HMCCUConf.pm @@ -368,7 +368,7 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'close' => 'V:LEVEL:0', 'up' => 'V:LEVEL:?delta=+20', 'down' => 'V:LEVEL:?delta=-20', - 'oldPos' => 'V:LEVEL:1.005', + 'oldPos' => 'V:LEVEL:100.5', 'stop' => 'V:STOP:1' }, 'BLIND_VIRTUAL_RECEIVER' => { @@ -535,7 +535,7 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'WINMATIC' => { 'open' => 'V:LEVEL:100', 'close' => 'V:LEVEL:0', - 'lock' => 'V:LEVEL:-0.005', + 'lock' => 'V:LEVEL:-0.5', 'pct' => 'V:LEVEL:?level', 'stop' => 'V:STOP:1' } @@ -805,7 +805,7 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'ALARMSTATE' => { '0' => 'noAlarm', '1' => 'alarm', 'false' => 'noAlarm', 'true' => 'alarm' } }, 'WINMATIC' => { - 'LEVEL' => { '0' => 'closed', '100' => 'open', '-0.005' => 'locked' } + 'LEVEL' => { '0' => 'closed', '100' => 'open', '-0.5' => 'locked' } }, 'DEFAULT' => { 'AES_KEY' => { '0' => 'off', 'false' => 'off', '1' => 'on', 'true' => 'on' },