2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-26 10:34:52 +00:00

HMCCU: Fixed set pct/level bug

git-svn-id: https://svn.fhem.de/fhem/trunk@26469 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
zap 2022-10-02 13:58:29 +00:00
parent e3e87c0406
commit a40cd900e6
6 changed files with 34 additions and 20 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # 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. # 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. - change: 37_SHC: Support current smarthomatic version.
Basestation uses 115200 Baud by default and CRC. Basestation uses 115200 Baud by default and CRC.
EnvSensor supports particulate matter sensor. EnvSensor supports particulate matter sensor.

View File

@ -57,7 +57,7 @@ my %HMCCU_CUST_CHN_DEFAULTS;
my %HMCCU_CUST_DEV_DEFAULTS; my %HMCCU_CUST_DEV_DEFAULTS;
# HMCCU version # HMCCU version
my $HMCCU_VERSION = '5.0 222632130'; my $HMCCU_VERSION = '5.0 222751518';
# Timeout for CCU requests (seconds) # Timeout for CCU requests (seconds)
my $HMCCU_TIMEOUT_REQUEST = 4; my $HMCCU_TIMEOUT_REQUEST = 4;
@ -7426,7 +7426,7 @@ sub HMCCU_ExecuteRoleCommand ($@)
# Align new value with min/max boundaries # Align new value with min/max boundaries
if (exists($cmd->{min}) && exists($cmd->{max}) && HMCCU_IsFltNum($cmd->{min}) && HMCCU_IsFltNum($cmd->{max})) { 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}"); 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 $scMin = HMCCU_ScaleValue ($clHash, $channel, $cmd->{dpt}, $cmd->{min}, 2);
my $scMax = HMCCU_ScaleValue ($clHash, $channel, $cmd->{dpt}, $cmd->{max}, 2); my $scMax = HMCCU_ScaleValue ($clHash, $channel, $cmd->{dpt}, $cmd->{max}, 2);
@ -9171,12 +9171,12 @@ sub HMCCU_SetMultipleParameters ($$$;$)
my ($clHash, $address, $params, $paramSet) = @_; my ($clHash, $address, $params, $paramSet) = @_;
$paramSet //= 'VALUES'; $paramSet //= 'VALUES';
$address =~ s/:d$//; $address =~ s/:d$//;
my $clName = $clHash->{NAME};
my ($add, $chn) = HMCCU_SplitChnAddr ($address, 'd'); my ($add, $chn) = HMCCU_SplitChnAddr ($address, 'd');
return (-1, undef) if ($paramSet eq 'VALUES' && $chn eq 'd'); return (-1, undef) if ($paramSet eq 'VALUES' && $chn eq 'd');
foreach my $p (sort keys %$params) { foreach my $p (sort keys %$params) {
HMCCU_Trace ($clHash, 2, "Parameter=$address.$paramSet.$p chn=$chn Value=$params->{$p}");
return (-8, undef) if ( return (-8, undef) if (
($paramSet eq 'VALUES' && !HMCCU_IsValidParameter ($clHash, $address, 'VALUES', $p, 2)) || ($paramSet eq 'VALUES' && !HMCCU_IsValidParameter ($clHash, $address, 'VALUES', $p, 2)) ||
($paramSet eq 'MASTER' && !HMCCU_IsValidParameter ($clHash, $address, 'MASTER', $p)) ($paramSet eq 'MASTER' && !HMCCU_IsValidParameter ($clHash, $address, 'MASTER', $p))
@ -9184,8 +9184,11 @@ sub HMCCU_SetMultipleParameters ($$$;$)
if ($params->{$p} !~ /:(STRING|BOOL|INTEGER|FLOAT|DOUBLE)$/) { if ($params->{$p} !~ /:(STRING|BOOL|INTEGER|FLOAT|DOUBLE)$/) {
$params->{$p} = HMCCU_ScaleValue ($clHash, $chn, $p, $params->{$p}, 1, $paramSet); $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); 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 -4 if (exists($clHash->{ccudevstate}) && $clHash->{ccudevstate} eq 'deleted');
return -21 if (IsDisabled ($clHash->{NAME})); return -21 if (IsDisabled ($clHash->{NAME}));
HMCCU_Trace ($clHash, 2, "dpt=$p, value=$v");
# Check client device type and datapoint # Check client device type and datapoint
my $clType = $clHash->{TYPE}; my $clType = $clHash->{TYPE};
my $ccuType = $clHash->{ccutype}; my $ccuType = $clHash->{ccutype};
@ -9272,6 +9273,9 @@ sub HMCCU_SetMultipleDatapoints ($$)
$v = HMCCU_GetEnumValues ($ioHash, $paramDef, $dpt, $v); $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'); # my $dptType = HMCCU_GetDatapointAttr ($ioHash, $ccuType, $chn, $dpt, 'type');
# $v = "'".$v."'" if (defined($dptType) && $dptType == $HMCCU_TYPE_STRING); # $v = "'".$v."'" if (defined($dptType) && $dptType == $HMCCU_TYPE_STRING);
my $c = '(datapoints.Get("'.$int.'.'.$add.':'.$chn.'.'.$dpt.'")).State('.$v.");\n"; 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/) { if ($ccuFlags =~ /nonBlocking/) {
# Execute command (non blocking) # Execute command (non blocking)
HMCCU_HMCommandNB ($clHash, $cmd, undef); HMCCU_HMCommandNB ($clHash, $cmd, undef);
@ -9298,7 +9305,10 @@ sub HMCCU_SetMultipleDatapoints ($$)
###################################################################### ######################################################################
# Scale, spread and/or shift datapoint value. # 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 # Supports reversing of value if value range is specified. Syntax for
# Rule is: # Rule is:
# [ChannelNo.]Datapoint:Factor # [ChannelNo.]Datapoint:Factor
@ -9315,8 +9325,11 @@ sub HMCCU_ScaleValue ($$$$$;$)
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $ioHash = HMCCU_GetHash ($hash); my $ioHash = HMCCU_GetHash ($hash);
# my $boundsChecking = HMCCU_IsFlag ($name, 'noBoundsChecking') ? 0 : 1; my $boundsChecking = (
my $boundsChecking = $dpt =~ /^LEVEL/ && ($value == -0.005 || $value == 1.005 || $value == 1.01) ? 0 : 1; $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 # Get parameter definition and min/max values
my $min; my $min;
@ -9416,16 +9429,15 @@ sub HMCCU_ScaleValue ($$$$$;$)
elsif (defined($unit) && ($unit eq 'minutes' || $unit eq 's')) { elsif (defined($unit) && ($unit eq 'minutes' || $unit eq 's')) {
$value = HMCCU_ConvertTime ($value, $unit, $mode); $value = HMCCU_ConvertTime ($value, $unit, $mode);
} }
elsif (defined($unit) && $unit =~ /^([0-9]+)%$/ && $boundsChecking) { elsif (defined($unit) && $unit =~ /^([0-9]+)%$/) {
# percentage values. Values < 0 won't be scaled
my $f = $1; my $f = $1;
$min //= 0; $min //= 0;
$max //= 1.0; $max //= 1.0;
if ($mode == 0 || $mode == 2) { if ($mode == 0 || $mode == 2) {
$value = HMCCU_MinMax ($value, $min, $max)*$f; $value = $boundsChecking ? HMCCU_MinMax ($value, $min, $max)*$f : $value*$f;
} }
else { else {
$value = HMCCU_MinMax($value, $min*$f, $max*$f)/$f; $value = $boundsChecking ? HMCCU_MinMax($value, $min*$f, $max*$f)/$f : $value/$f;
} }
} }

View File

@ -30,7 +30,7 @@ sub HMCCUCHN_Set ($@);
sub HMCCUCHN_Get ($@); sub HMCCUCHN_Get ($@);
sub HMCCUCHN_Attr ($@); sub HMCCUCHN_Attr ($@);
my $HMCCUCHN_VERSION = '5.0 222632130'; my $HMCCUCHN_VERSION = '5.0 222751518';
###################################################################### ######################################################################
# Initialize module # Initialize module
@ -51,7 +51,7 @@ sub HMCCUCHN_Initialize ($)
$hash->{parseParams} = 1; $hash->{parseParams} = 1;
$hash->{AttrList} = 'IODev ccucalculate '. $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 '. 'ccureadingfilter:textField-long statedatapoint controldatapoint '.
'ccureadingformat:name,namelc,address,addresslc,datapoint,datapointlc '. 'ccureadingformat:name,namelc,address,addresslc,datapoint,datapointlc '.
'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix '. '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.<br/> logCommand: Write get and set commands to FHEM log with verbose level 3.<br/>
noBoundsChecking: Datapoint values are not checked for min/max boundaries<br/> noBoundsChecking: Datapoint values are not checked for min/max boundaries<br/>
noReadings: Do not update readings<br/> noReadings: Do not update readings<br/>
simulate: Do not execute set datapoint commands. Use this flag together with 'trace'<br/>
showDeviceReadings: Show readings of device and channel 0.<br/> showDeviceReadings: Show readings of device and channel 0.<br/>
showLinkReadings: Show link readings.<br/> showLinkReadings: Show link readings.<br/>
showMasterReadings: Show configuration readings.<br/> showMasterReadings: Show configuration readings.<br/>

View File

@ -31,7 +31,7 @@ sub HMCCUDEV_Set ($@);
sub HMCCUDEV_Get ($@); sub HMCCUDEV_Get ($@);
sub HMCCUDEV_Attr ($@); sub HMCCUDEV_Attr ($@);
my $HMCCUDEV_VERSION = '5.0 222632130'; my $HMCCUDEV_VERSION = '5.0 222751518';
###################################################################### ######################################################################
# Initialize module # Initialize module
@ -52,7 +52,7 @@ sub HMCCUDEV_Initialize ($)
$hash->{parseParams} = 1; $hash->{parseParams} = 1;
$hash->{AttrList} = 'IODev ccuaggregate:textField-long ccucalculate:textField-long '. $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 '. 'ccureadingfilter:textField-long '.
'ccureadingformat:name,namelc,address,addresslc,datapoint,datapointlc '. 'ccureadingformat:name,namelc,address,addresslc,datapoint,datapointlc '.
'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix devStateFlags '. 'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix devStateFlags '.

View File

@ -39,7 +39,7 @@ use SetExtensions;
###################################################################### ######################################################################
# HMCCURPC version # HMCCURPC version
my $HMCCURPCPROC_VERSION = '5.0 222632130'; my $HMCCURPCPROC_VERSION = '5.0 222751518';
# Maximum number of events processed per call of Read() # Maximum number of events processed per call of Read()
my $HMCCURPCPROC_MAX_EVENTS = 100; my $HMCCURPCPROC_MAX_EVENTS = 100;

View File

@ -368,7 +368,7 @@ $HMCCU_CONFIG_VERSION = '5.0';
'close' => 'V:LEVEL:0', 'close' => 'V:LEVEL:0',
'up' => 'V:LEVEL:?delta=+20', 'up' => 'V:LEVEL:?delta=+20',
'down' => 'V:LEVEL:?delta=-20', 'down' => 'V:LEVEL:?delta=-20',
'oldPos' => 'V:LEVEL:1.005', 'oldPos' => 'V:LEVEL:100.5',
'stop' => 'V:STOP:1' 'stop' => 'V:STOP:1'
}, },
'BLIND_VIRTUAL_RECEIVER' => { 'BLIND_VIRTUAL_RECEIVER' => {
@ -535,7 +535,7 @@ $HMCCU_CONFIG_VERSION = '5.0';
'WINMATIC' => { 'WINMATIC' => {
'open' => 'V:LEVEL:100', 'open' => 'V:LEVEL:100',
'close' => 'V:LEVEL:0', 'close' => 'V:LEVEL:0',
'lock' => 'V:LEVEL:-0.005', 'lock' => 'V:LEVEL:-0.5',
'pct' => 'V:LEVEL:?level', 'pct' => 'V:LEVEL:?level',
'stop' => 'V:STOP:1' 'stop' => 'V:STOP:1'
} }
@ -805,7 +805,7 @@ $HMCCU_CONFIG_VERSION = '5.0';
'ALARMSTATE' => { '0' => 'noAlarm', '1' => 'alarm', 'false' => 'noAlarm', 'true' => 'alarm' } 'ALARMSTATE' => { '0' => 'noAlarm', '1' => 'alarm', 'false' => 'noAlarm', 'true' => 'alarm' }
}, },
'WINMATIC' => { 'WINMATIC' => {
'LEVEL' => { '0' => 'closed', '100' => 'open', '-0.005' => 'locked' } 'LEVEL' => { '0' => 'closed', '100' => 'open', '-0.5' => 'locked' }
}, },
'DEFAULT' => { 'DEFAULT' => {
'AES_KEY' => { '0' => 'off', 'false' => 'off', '1' => 'on', 'true' => 'on' }, 'AES_KEY' => { '0' => 'off', 'false' => 'off', '1' => 'on', 'true' => 'on' },