2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-28 05:01:57 +00:00

HMCCU: Features and bugfixes

git-svn-id: https://svn.fhem.de/fhem/trunk@28381 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
zap 2024-01-14 16:23:51 +00:00
parent b6bb3bac7d
commit 6544b8c51f
5 changed files with 503 additions and 890 deletions

File diff suppressed because it is too large Load Diff

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 232691829'; my $HMCCUCHN_VERSION = '5.0 240121821';
###################################################################### ######################################################################
# Initialize module # Initialize module
@ -57,7 +57,7 @@ sub HMCCUCHN_Initialize ($)
'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix '. 'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix '.
'ccuscaleval ccuverify:0,1,2 ccuget:State,Value devStateFlags '. 'ccuscaleval ccuverify:0,1,2 ccuget:State,Value devStateFlags '.
'disable:0,1 hmstatevals:textField-long statevals substitute:textField-long '. 'disable:0,1 hmstatevals:textField-long statevals substitute:textField-long '.
'substexcl stripnumber peer:textField-long traceFilter '. $readingFnAttributes; 'substexcl stripnumber traceFilter '. $readingFnAttributes;
} }
###################################################################### ######################################################################
@ -279,6 +279,9 @@ sub HMCCUCHN_Attr ($@)
my @t = split(':', $attrval); my @t = split(':', $attrval);
return "$clType [$name] Missing flag and or value expression in attribute $attrname" if (scalar(@t) != 3); return "$clType [$name] Missing flag and or value expression in attribute $attrname" if (scalar(@t) != 3);
} }
elsif ($attrname eq 'peer') {
return "$clType [$name] Attribute 'peer' is no longer supported. Please use DOIF or NOTIFY";
}
} }
elsif ($cmd eq 'del') { elsif ($cmd eq 'del') {
if ($attrname =~ /^(state|control)datapoint$/) { if ($attrname =~ /^(state|control)datapoint$/) {
@ -327,13 +330,13 @@ sub HMCCUCHN_Set ($@)
# Command readingFilter depends on readable datapoints # Command readingFilter depends on readable datapoints
my ($add, $chn) = split(":", $hash->{ccuaddr}); my ($add, $chn) = split(":", $hash->{ccuaddr});
my @dpRList = (); my @dpRList = ();
my $dpRCount = HMCCU_GetValidDatapoints ($hash, $hash->{ccutype}, $chn, 5, \@dpRList); my $dpRCount = HMCCU_GetValidParameters ($hash, $chn, 'VALUES', 5, \@dpRList);
$syntax .= ' readingFilter:multiple-strict,'.join(',', @dpRList) if ($dpRCount > 0); $syntax .= ' readingFilter:multiple-strict,'.join(',', @dpRList) if ($dpRCount > 0);
# Commands only available in read/write mode # Commands only available in read/write mode
if ($hash->{readonly} ne 'yes') { if ($hash->{readonly} ne 'yes') {
$syntax .= ' config'; $syntax .= ' config';
my $dpWCount = HMCCU_GetValidDatapoints ($hash, $hash->{ccutype}, $chn, 2); my $dpWCount = HMCCU_GetValidParameters ($hash, $chn, 'VALUES', 2);
$syntax .= ' datapoint' if ($dpWCount > 0); $syntax .= ' datapoint' if ($dpWCount > 0);
my $addCmds = $hash->{hmccu}{cmdlist}{set} // ''; my $addCmds = $hash->{hmccu}{cmdlist}{set} // '';
$syntax .= " $addCmds" if ($addCmds ne ''); $syntax .= " $addCmds" if ($addCmds ne '');
@ -349,9 +352,9 @@ sub HMCCUCHN_Set ($@)
elsif ($lcopt eq 'datapoint') { elsif ($lcopt eq 'datapoint') {
return HMCCU_ExecuteSetDatapointCommand ($hash, $a, $h); return HMCCU_ExecuteSetDatapointCommand ($hash, $a, $h);
} }
elsif ($lcopt eq 'toggle') { # elsif ($lcopt eq 'toggle') {
return HMCCU_ExecuteToggleCommand ($hash); # return HMCCU_ExecuteToggleCommand ($hash);
} # }
elsif (exists($hash->{hmccu}{roleCmds}{set}{$opt})) { elsif (exists($hash->{hmccu}{roleCmds}{set}{$opt})) {
return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'set', $opt, $a, $h); return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'set', $opt, $a, $h);
} }
@ -384,6 +387,9 @@ sub HMCCUCHN_Set ($@)
HMCCU_RefreshReadings ($hash) if ($rc); HMCCU_RefreshReadings ($hash) if ($rc);
return HMCCU_SetError ($hash, $retMsg); return HMCCU_SetError ($hash, $retMsg);
} }
elsif ($lcopt eq 'echo') {
return HMCCU_RefToString ($h);
}
else { else {
return "Unknown argument $opt choose one of $syntax"; return "Unknown argument $opt choose one of $syntax";
} }
@ -420,7 +426,7 @@ sub HMCCUCHN_Get ($@)
# Command datapoint depends on readable datapoints # Command datapoint depends on readable datapoints
my ($add, $chn) = split(":", $hash->{ccuaddr}); my ($add, $chn) = split(":", $hash->{ccuaddr});
my @dpRList; my @dpRList;
my $dpRCount = HMCCU_GetValidDatapoints ($hash, $ccutype, $chn, 1, \@dpRList); my $dpRCount = HMCCU_GetValidParameters ($hash, $chn, 'VALUES', 1, \@dpRList);
$syntax .= ' datapoint:'.join(",", @dpRList) if ($dpRCount > 0); $syntax .= ' datapoint:'.join(",", @dpRList) if ($dpRCount > 0);
# Additional device specific commands # Additional device specific commands
@ -432,13 +438,7 @@ sub HMCCUCHN_Get ($@)
if ($opt ne '?' && $ccuflags =~ /logCommand/ || HMCCU_IsFlag ($ioName, 'logCommand')); if ($opt ne '?' && $ccuflags =~ /logCommand/ || HMCCU_IsFlag ($ioName, 'logCommand'));
if ($lcopt eq 'datapoint') { if ($lcopt eq 'datapoint') {
my $objname = shift @$a // return HMCCU_SetError ($hash, "Usage: get $name datapoint {datapoint}"); return HMCCU_ExecuteGetDatapointCommand ($hash, $a);
return HMCCU_SetError ($hash, -8, $objname)
if (!HMCCU_IsValidParameter ($hash, $ccuaddr, 'VALUES', $objname, 1));
$objname = "$ccuif.$ccuaddr.$objname";
my ($rc, $result) = HMCCU_GetDatapoint ($hash, $objname, 0);
return $rc < 0 ? HMCCU_SetError ($hash, $rc, $result) : $result;
} }
elsif ($lcopt eq 'deviceinfo') { elsif ($lcopt eq 'deviceinfo') {
my $extended = shift @$a; my $extended = shift @$a;
@ -563,12 +563,19 @@ sub HMCCUCHN_Get ($@)
Set value of control datapoint. This command is available only on command line Set value of control datapoint. This command is available only on command line
for compatibility reasons. It should not be used any more. for compatibility reasons. It should not be used any more.
</li><br/> </li><br/>
<li><b>set &lt;name&gt; datapoint &lt;datapoint&gt; &lt;value&gt; | &lt;datapoint&gt=&lt;value&gt; [...]</b><br/> <li><b>set &lt;name&gt; datapoint [&lt;no&gt;:][&lt;channel&gt;.]&lt;datapoint&gt; &lt;{value|'oldval'}&gt; | [&lt;no&gt;:][&lt;channel&gt;.]&lt;datapoint&gt=&lt;value&gt; [...]</b><br/>
Set datapoint values of a CCU channel. If value contains blank characters it must be Set datapoint values of a CCU channel. If value contains blank characters it must be
enclosed in double quotes. This command is only available, if channel contains a writeable datapoint.<br/><br/> enclosed in double quotes. This command is only available, if channel contains a writeable datapoint.<br/>
By using parameter <i>no</i> one can specify the order in which datapoints are set (see 3rd example below).<br/>
When using syntax <i>datapoint</i>=<i>value</i> with multiple datapoints always specify a <i>no</i> to ensure
that datapoints are set in the desired order.<br/>
The special <i>value</i> 'oldval' will set the datapoint to its previous value. This can be used to realize a toggle function
for each datapoint. Note: the previous value of a datapoint is not available at the first 'set datapoint' command after
FHEM start.<br/><br/>
Examples:<br/> Examples:<br/>
<code>set temp_control datapoint SET_TEMPERATURE 21</code><br/> <code>set temp_control datapoint SET_TEMPERATURE 21</code><br/>
<code>set temp_control datapoint AUTO_MODE 1 SET_TEMPERATURE=21</code> <code>set temp_control datapoint AUTO_MODE 1 SET_TEMPERATURE=21</code><br/>
<code>set temp_control datapoint 2:AUTO_MODE=0 1:SET_TEMPERATURE=21</code>
</li><br/> </li><br/>
<li><b>set &lt;name&gt; defaults ['reset'|'forceReset'|'old'|'<u>update</u>']</b><br/> <li><b>set &lt;name&gt; defaults ['reset'|'forceReset'|'old'|'<u>update</u>']</b><br/>
Set default attributes for CCU device type. Default attributes are only available for Set default attributes for CCU device type. Default attributes are only available for
@ -742,9 +749,7 @@ sub HMCCUCHN_Get ($@)
<a name="calculate"></a> <a name="calculate"></a>
<li><b>ccucalculate &lt;value-type&gt;:&lt;reading&gt;[:&lt;dp-list&gt;[;...]</b><br/> <li><b>ccucalculate &lt;value-type&gt;:&lt;reading&gt;[:&lt;dp-list&gt;[;...]</b><br/>
Calculate special values like dewpoint based on datapoints specified in Calculate special values like dewpoint based on datapoints specified in
<i>dp-list</i>. The result is stored in <i>reading</i>. For datapoints in <i>dp-list</i> <i>dp-list</i>. The result is stored in <i>reading</i>.<br/>
also variable notation is supported (for more information on variables see documentation of
attribute 'peer').<br/>
The following <i>value-types</i> are supported:<br/> The following <i>value-types</i> are supported:<br/>
dewpoint = calculate dewpoint, <i>dp-list</i> = &lt;temperature&gt;,&lt;humidity&gt;<br/> dewpoint = calculate dewpoint, <i>dp-list</i> = &lt;temperature&gt;,&lt;humidity&gt;<br/>
abshumidity = calculate absolute humidity, <i>dp-list</i> = &lt;temperature&gt;,&lt;humidity&gt;<br/> abshumidity = calculate absolute humidity, <i>dp-list</i> = &lt;temperature&gt;,&lt;humidity&gt;<br/>
@ -928,39 +933,6 @@ sub HMCCUCHN_Get ($@)
Optionally the name of the HomeMatic state reading can be specified at the beginning of Optionally the name of the HomeMatic state reading can be specified at the beginning of
the attribute in format =&lt;reading&gt;;. The default reading name is 'hmstate'. the attribute in format =&lt;reading&gt;;. The default reading name is 'hmstate'.
</li><br/> </li><br/>
<a name="peer"></a>
<li><b>peer &lt;datapoints&gt;:&lt;condition&gt;:
{ccu:&lt;object&gt;=&lt;value&gt;|hmccu:&lt;object&gt;=&lt;value&gt;|
fhem:&lt;command&gt;}</b><br/>
Logically peer datapoints of a HMCCUCHN or HMCCUDEV device with another device or any
FHEM command.<br/>
Parameter <i>datapoints</i> is a comma separated list of datapoints in format
<i>channelno.datapoint</i> which can trigger the action.<br/>
Parameter <i>condition</i> is a valid Perl expression which can contain
<i>channelno.datapoint</i> names as variables. Variables must start with a '$' or a '%'.
If a variable is preceded by a '$' the variable is substituted by the converted datapoint
value (i.e. "on" instead of "true"). If variable is preceded by a '%' the raw value
(i.e. "true") is used. If '$' or '%' is doubled the previous values will be used.<br/>
If the result of this operation is true, the action specified after the second colon
is executed. Three types of actions are supported:<br/>
<b>hmccu</b>: Parameter <i>object</i> refers to a FHEM device/datapoint in format
&lt;device&gt;:&lt;channelno&gt;.&lt;datapoint&gt;<br/>
<b>ccu</b>: Parameter <i>object</i> refers to a CCU channel/datapoint in format
&lt;channel&gt;.&lt;datapoint&gt;. <i>channel</i> can be a channel name or address.<br/>
<b>fhem</b>: The specified <i>command</i> will be executed<br/>
If action contains the string $value it is substituted by the current value of the
datapoint which triggered the action. The attribute supports multiple peering rules
separated by semicolons and optionally by newline characters.<br/><br/>
Examples:<br/>
# Set FHEM device mydummy to value if formatted value of 1.STATE is 'on'<br/>
<code>attr mydev peer 1.STATE:'$1.STATE' eq 'on':fhem:set mydummy $value</code><br/>
# Set 2.LEVEL of device myBlind to 100 if raw value of 1.STATE is 1<br/>
<code>attr mydev peer 1.STATE:'%1.STATE' eq '1':hmccu:myBlind:2.LEVEL=100</code><br/>
# Set 1.STATE of device LEQ1234567 to true if 1.LEVEL < 100<br/>
<code>attr mydev peer 1.LEVEL:$1.LEVEL < 100:ccu:LEQ1234567:1.STATE=true</code><br/>
# Set 1.STATE of device LEQ1234567 to true if current level is different from old level<br/>
<code>attr mydev peer 1.LEVEL:$1.LEVEL != $$1.LEVEL:ccu:LEQ1234567:1.STATE=true</code><br/>
</li><br/>
<a name="statedatapoint"></a> <a name="statedatapoint"></a>
<li><b>statedatapoint &lt;datapoint&gt;</b><br/> <li><b>statedatapoint &lt;datapoint&gt;</b><br/>
Set datapoint used for displaying device state. This attribute must be set, if Set datapoint used for displaying device state. This attribute must be set, if

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 232691829'; my $HMCCUDEV_VERSION = '5.0 240121821';
###################################################################### ######################################################################
# Initialize module # Initialize module
@ -58,7 +58,7 @@ sub HMCCUDEV_Initialize ($)
'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix devStateFlags '. 'ccureadingname:textField-long ccuSetOnChange ccuReadingPrefix devStateFlags '.
'ccuget:State,Value ccuscaleval ccuverify:0,1,2 disable:0,1 '. 'ccuget:State,Value ccuscaleval ccuverify:0,1,2 disable:0,1 '.
'hmstatevals:textField-long statevals substexcl substitute:textField-long statechannel statedatapoint '. 'hmstatevals:textField-long statevals substexcl substitute:textField-long statechannel statedatapoint '.
'controlchannel controldatapoint stripnumber peer:textField-long traceFilter '. 'controlchannel controldatapoint stripnumber traceFilter '.
$readingFnAttributes; $readingFnAttributes;
} }
@ -415,13 +415,13 @@ sub HMCCUDEV_Set ($@)
# Command readingFilter depends on readable datapoints # Command readingFilter depends on readable datapoints
my @dpRList = (); my @dpRList = ();
my $dpRCount = HMCCU_GetValidDatapoints ($hash, $hash->{ccutype}, -1, 5, \@dpRList); my $dpRCount = HMCCU_GetValidParameters ($hash, undef, 'VALUES', 5, \@dpRList);
$syntax .= ' readingFilter:multiple-strict,'.join(',', @dpRList) if ($dpRCount > 0); $syntax .= ' readingFilter:multiple-strict,'.join(',', @dpRList) if ($dpRCount > 0);
# Commands only available in read/write mode # Commands only available in read/write mode
if ($hash->{readonly} ne 'yes') { if ($hash->{readonly} ne 'yes') {
$syntax .= ' config'; $syntax .= ' config';
my $dpWCount = HMCCU_GetValidDatapoints ($hash, $hash->{ccutype}, -1, 2); my $dpWCount = HMCCU_GetValidParameters ($hash, undef, 'VALUES', 2);
$syntax .= ' datapoint' if ($dpWCount > 0); $syntax .= ' datapoint' if ($dpWCount > 0);
my $addCmds = $hash->{hmccu}{cmdlist}{set} // ''; my $addCmds = $hash->{hmccu}{cmdlist}{set} // '';
$syntax .= " $addCmds" if ($addCmds ne ''); $syntax .= " $addCmds" if ($addCmds ne '');
@ -437,9 +437,9 @@ sub HMCCUDEV_Set ($@)
elsif ($lcopt eq 'datapoint') { elsif ($lcopt eq 'datapoint') {
return HMCCU_ExecuteSetDatapointCommand ($hash, $a, $h); return HMCCU_ExecuteSetDatapointCommand ($hash, $a, $h);
} }
elsif ($lcopt eq 'toggle') { # elsif ($lcopt eq 'toggle') {
return HMCCU_ExecuteToggleCommand ($hash); # return HMCCU_ExecuteToggleCommand ($hash);
} # }
elsif (exists($hash->{hmccu}{roleCmds}{set}{$opt})) { elsif (exists($hash->{hmccu}{roleCmds}{set}{$opt})) {
return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'set', $opt, $a, $h); return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'set', $opt, $a, $h);
} }
@ -509,7 +509,7 @@ sub HMCCUDEV_Get ($@)
# Command datapoint depends on readable datapoints # Command datapoint depends on readable datapoints
my @dpRList; my @dpRList;
my $dpRCount = HMCCU_GetValidDatapoints ($hash, $ccutype, -1, 1, \@dpRList); my $dpRCount = HMCCU_GetValidParameters ($hash, undef, 'VALUES', 1, \@dpRList);
$syntax .= ' datapoint:'.join(",", @dpRList) if ($dpRCount > 0); $syntax .= ' datapoint:'.join(",", @dpRList) if ($dpRCount > 0);
# Additional device specific commands # Additional device specific commands
@ -521,27 +521,7 @@ sub HMCCUDEV_Get ($@)
if ($opt ne '?' && $ccuflags =~ /logCommand/ || HMCCU_IsFlag ($ioName, 'logCommand')); if ($opt ne '?' && $ccuflags =~ /logCommand/ || HMCCU_IsFlag ($ioName, 'logCommand'));
if ($lcopt eq 'datapoint') { if ($lcopt eq 'datapoint') {
my $objname = shift @$a // return HMCCU_SetError ($hash, "Usage: get $name datapoint [{channel-number}.]{datapoint}"); return HMCCU_ExecuteGetDatapointCommand ($hash, $a);
my $chn;
my $dpt;
if ($objname =~ /^([0-9]+)\.(.+)$/) {
($chn, $dpt) = ($1, $2);
return HMCCU_SetError ($hash, -7) if ($chn >= $hash->{hmccu}{channels});
}
else {
my ($sc, $sd, $cc, $cd) = HMCCU_GetSCDatapoints ($hash);
return HMCCU_SetError ($hash, -11) if ($sc eq '');
($chn, $dpt) = ($sc, $objname);
}
return HMCCU_SetError ($hash, -8, $objname)
if (!HMCCU_IsValidParameter ($hash, HMCCU_GetChannelAddr ($hash, $chn), 'VALUES', $dpt, 1));
$objname = "$ccuif.$ccuaddr:$chn.$dpt";
my ($rc, $result) = HMCCU_GetDatapoint ($hash, $objname, 0);
return HMCCU_SetError ($hash, $rc, $result) if ($rc < 0);
return $result;
} }
elsif ($lcopt eq 'deviceinfo') { elsif ($lcopt eq 'deviceinfo') {
my $extended = shift @$a; my $extended = shift @$a;
@ -823,10 +803,6 @@ sub HMCCUDEV_Get ($@)
<a href="#HMCCUCHNattr">see HMCCUCHN</a> <a href="#HMCCUCHNattr">see HMCCUCHN</a>
</li><br/> </li><br/>
<li><b>hmstatevals &lt;subst-rule&gt;[;...]</b><br/> <li><b>hmstatevals &lt;subst-rule&gt;[;...]</b><br/>
<a href="#HMCCUCHNattr">see HMCCUCHN</a>
</li><br/>
<li><b>peer [&lt;datapoints&gt;:&lt;condition&gt;:
{ccu:&lt;object&gt;=&lt;value&gt;|hmccu:&lt;object&gt;=&lt;value&gt;}</b><br/>
<a href="#HMCCUCHNattr">see HMCCUCHN</a> <a href="#HMCCUCHNattr">see HMCCUCHN</a>
</li><br/> </li><br/>
<li><b>statechannel &lt;channel-number&gt;</b><br/> <li><b>statechannel &lt;channel-number&gt;</b><br/>

View File

@ -39,7 +39,7 @@ use SetExtensions;
###################################################################### ######################################################################
# HMCCURPC version # HMCCURPC version
my $HMCCURPCPROC_VERSION = '5.0 232691829'; my $HMCCURPCPROC_VERSION = '5.0 240121821';
# 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;
@ -114,6 +114,7 @@ my $BINRPC_ERROR = 0x42696EFF;
my %BINRPC_TYPE_MAPPING = ( my %BINRPC_TYPE_MAPPING = (
'BOOL' => $BINRPC_BOOL, 'BOOL' => $BINRPC_BOOL,
'INTEGER' => $BINRPC_INTEGER, 'INTEGER' => $BINRPC_INTEGER,
'ENUM' => $BINRPC_INTEGER,
'STRING' => $BINRPC_STRING, 'STRING' => $BINRPC_STRING,
'FLOAT' => $BINRPC_DOUBLE, 'FLOAT' => $BINRPC_DOUBLE,
'DOUBLE' => $BINRPC_DOUBLE, 'DOUBLE' => $BINRPC_DOUBLE,

View File

@ -8,7 +8,7 @@
# #
# Configuration parameters for HomeMatic devices. # Configuration parameters for HomeMatic devices.
# #
# (c) 2022 by zap (zap01 <at> t-online <dot> de) # (c) 2024 by zap (zap01 <at> t-online <dot> de)
# #
######################################################################### #########################################################################
@ -58,6 +58,9 @@ $HMCCU_CONFIG_VERSION = '5.0';
'ACCESSPOINT_GENERIC_RECEIVER' => { 'ACCESSPOINT_GENERIC_RECEIVER' => {
F => 3, S => 'VOLTAGE', C => '', V => '', P => 1 F => 3, S => 'VOLTAGE', C => '', V => '', P => 1
}, },
'ACOUSTIC_SIGNAL_TRANSMITTER' => {
F => 3, S => 'LEVEL', C => 'LEVEL', V => 'on:100,off:0', P => 2
},
'ALARM_SWITCH_VIRTUAL_RECEIVER' => { 'ALARM_SWITCH_VIRTUAL_RECEIVER' => {
F => 3, S => 'ACOUSTIC_ALARM_ACTIVE', C => 'ACOUSTIC_ALARM_SELECTION', V => '', P => 2 F => 3, S => 'ACOUSTIC_ALARM_ACTIVE', C => 'ACOUSTIC_ALARM_SELECTION', V => '', P => 2
}, },
@ -169,6 +172,9 @@ $HMCCU_CONFIG_VERSION = '5.0';
'RAINDETECTOR_HEAT' => { 'RAINDETECTOR_HEAT' => {
F => 3, S => 'STATE', C => 'STATE', V => 'on:true,off:false', P => 2 F => 3, S => 'STATE', C => 'STATE', V => 'on:true,off:false', P => 2
}, },
'RGBW_COLOR' => {
F => 3, S => 'COLOR', C => 'COLOR', V => '', P => 2
},
'ROTARY_HANDLE_SENSOR' => { 'ROTARY_HANDLE_SENSOR' => {
F => 3, S => 'STATE', C => '', V => '', P => 2 F => 3, S => 'STATE', C => '', V => '', P => 2
}, },
@ -211,6 +217,9 @@ $HMCCU_CONFIG_VERSION = '5.0';
'TILT_SENSOR' => { 'TILT_SENSOR' => {
F => 3, S => 'STATE', C => '', V => '', P => 1 F => 3, S => 'STATE', C => '', V => '', P => 1
}, },
'UNIVERSAL_LIGHT_RECEIVER' => {
F => 3, S => 'LEVEL', C => 'LEVEL', V => 'on:100,off:0', P => 1
},
'VIRTUAL_KEY' => { 'VIRTUAL_KEY' => {
F => 3, S => 'PRESS_SHORT', C => 'PRESS_SHORT', V => 'pressed:true', P => 1 F => 3, S => 'PRESS_SHORT', C => 'PRESS_SHORT', V => 'pressed:true', P => 1
}, },
@ -315,33 +324,41 @@ $HMCCU_CONFIG_VERSION = '5.0';
); );
####################################################################################### #######################################################################################
# Set commands related to channel role # Set/Get commands related to channel role
# Role => { Command-Definition, ... } # Role => { Command-Definition, ... }
# Command-Defintion: # Command-Defintion:
# Command[:InterfaceExpr] => [No:]Datapoint-Def[:Function] [...]' # [Mode ]Command[:InterfaceExpr] => [No:]Datapoint-Def[:Function] [...]'
# Mode:
# Either 'set' or 'get'. Default is 'set'.
# Command:
# The command name.
# InterfaceExpr:
# Command is only available, if interface of device is matching the regular
# expression.
# No: # No:
# Execution order of subcommands. By default subcommands are # Execution order of subcommands. By default subcommands are executed from left to
# executed from left to right. # right.
# Function: # Function:
# A Perl function name # A Perl function name
# Datapoint-Def: # Datapoint-Def:
# No parameters: Paramset:Datapoints:[Parameter=]FixedValue[,...] # Command with no parameters: Paramset:Datapoints:[Parameter=]Value
# One parameter: Paramset:Datapoints:?Parameter # Toggle command: Paramset:Datapoints:[Parameter=]Value1,Value2[,...]
# Command with one parameter: Paramset:Datapoints:?Parameter
# Optional parameter with default: Paramset:Datapoints:?Parameter=Default-Value # Optional parameter with default: Paramset:Datapoints:?Parameter=Default-Value
# List of values (also toggle): Paramset:Datapoints:#Parameter[=FixedValue[,...]] # List of values: Paramset:Datapoints:#Parameter[=Value[,...]]
# Internal value (paramset "I"): Paramset:Datapoints:*Parameter=Default-Value # Internal value (paramset "I"): Paramset:Datapoints:*Parameter=Default-Value
# Paramset: # Paramset:
# V=VALUES, M=MASTER (channel), D=MASTER (device), I=INTERNAL # V=VALUES, M=MASTER (channel), D=MASTER (device), I=INTERNAL, S=VALUE_STRING
# Datapoints: # Datapoints:
# List of parameter names separated by ',' # List of datapoint or config parameter names separated by ','. Multiple names can
# be specified to support multiple firmware revesions with different names.
# Parameter characters: # Parameter characters:
# ? = any value is accepted # ? = any value is accepted
# # = If datapoint is of type ENUM, values are taken from # # = If datapoint is of type ENUM, values are taken from parameter set description.
# parameter set description. Otherwise a list of values must # Otherwise a list of values must be specified after '='.
# be specified after '='. # * = internal value $hash->{hmccu}{values}{parameterName}. See also paramset "I"
# * = internal value $hash->{hmccu}{values}{parameterName} # FixedValue:
# See also paramset "I" # Parameter values are detected in the following order:
# FixedValue: Parameter values are detected in the following order:
# 1. If command parameter name is identical with controldatapoint, # 1. If command parameter name is identical with controldatapoint,
# option values are taken from controldatapoint definition {V}. The # option values are taken from controldatapoint definition {V}. The
# FixedValues are used as lookup key into HMCCU_STATECCONTROL. # FixedValues are used as lookup key into HMCCU_STATECCONTROL.
@ -350,11 +367,17 @@ $HMCCU_CONFIG_VERSION = '5.0';
# names are taken from HMCCU_CONVERSIONS by using FixedValues as # names are taken from HMCCU_CONVERSIONS by using FixedValues as
# lookup key. # lookup key.
# 3. As a fallback command options and option values are identical. # 3. As a fallback command options and option values are identical.
# Default-Value:
# If Default-Value is preceeded by + or -, value is added to or # If Default-Value is preceeded by + or -, value is added to or
# subtracted from current datapoint value # subtracted from current datapoint value
####################################################################################### #######################################################################################
%HMCCU_ROLECMDS = ( %HMCCU_ROLECMDS = (
'ACOUSTIC_SIGNAL_TRANSMITTER' => {
'level' => 'V:LEVEL:?level',
'on' => 'V:LEVEL:1',
'off' => 'V:LEVEL:0'
},
'ALARM_SWITCH_VIRTUAL_RECEIVER' => { 'ALARM_SWITCH_VIRTUAL_RECEIVER' => {
'opticalAlarm' => 'V:OPTICAL_ALARM_SELECTION:#alarmMode V:ACOUSTIC_ALARM_SELECTION:0 V:DURATION_UNIT:*unit=0 V:DURATION_VALUE:*duration=10', 'opticalAlarm' => 'V:OPTICAL_ALARM_SELECTION:#alarmMode V:ACOUSTIC_ALARM_SELECTION:0 V:DURATION_UNIT:*unit=0 V:DURATION_VALUE:*duration=10',
'acousticAlarm' => 'V:ACOUSTIC_ALARM_SELECTION:#alarmMode V:OPTICAL_ALARM_SELECTION:0 V:DURATION_UNIT:0 V:DURATION_VALUE:10', 'acousticAlarm' => 'V:ACOUSTIC_ALARM_SELECTION:#alarmMode V:OPTICAL_ALARM_SELECTION:0 V:DURATION_UNIT:0 V:DURATION_VALUE:10',
@ -365,24 +388,24 @@ $HMCCU_CONFIG_VERSION = '5.0';
}, },
'BLIND' => { 'BLIND' => {
'pct' => 'V:LEVEL:?level', 'pct' => 'V:LEVEL:?level',
'open' => 'V:LEVEL:100', 'open' => 'V:LEVEL:1',
'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:100.5', 'oldPos' => 'V:LEVEL:1.005',
'stop' => 'V:STOP:1' 'stop' => 'V:STOP:1'
}, },
'BLIND_VIRTUAL_RECEIVER' => { 'BLIND_VIRTUAL_RECEIVER' => {
'pct' => 'V:LEVEL:?level', 'pct' => 'V:LEVEL:?level',
'open' => 'V:LEVEL:100', 'open' => 'V:LEVEL:1',
'close' => 'V:LEVEL:0', 'close' => 'V:LEVEL:0',
'oldLevel' => 'V:LEVEL:100.5', 'oldLevel' => 'V:LEVEL:1.005',
'up' => 'V:LEVEL:?delta=+20', 'up' => 'V:LEVEL:?delta=+20',
'down' => 'V:LEVEL:?delta=-20', 'down' => 'V:LEVEL:?delta=-20',
'stop' => 'V:STOP:1', 'stop' => 'V:STOP:1',
'pctSlats' => 'V:LEVEL_2:?level V:LEVEL:100.5', 'pctSlats' => 'V:LEVEL_2:?level V:LEVEL:1.005',
'openSlats' => 'V:LEVEL_2:100 V:LEVEL:100.5', 'openSlats' => 'V:LEVEL_2:100 V:LEVEL:1.005',
'closeSlats' => 'V:LEVEL_2:0 V:LEVEL:100.5', 'closeSlats' => 'V:LEVEL_2:0 V:LEVEL:1.005',
}, },
'CLIMATECONTROL_REGULATOR' => { 'CLIMATECONTROL_REGULATOR' => {
'desired-temp' => 'V:SETPOINT:?temperature', 'desired-temp' => 'V:SETPOINT:?temperature',
@ -402,25 +425,27 @@ $HMCCU_CONFIG_VERSION = '5.0';
'DIMMER' => { 'DIMMER' => {
'pct' => '3:V:LEVEL:?level 1:V:ON_TIME:?time=0.0 2:V:RAMP_TIME:?ramp=0.5', 'pct' => '3:V:LEVEL:?level 1:V:ON_TIME:?time=0.0 2:V:RAMP_TIME:?ramp=0.5',
'level' => 'V:LEVEL:?level', 'level' => 'V:LEVEL:?level',
'on' => 'V:LEVEL:100', 'on' => 'V:LEVEL:1',
'off' => 'V:LEVEL:0', 'off' => 'V:LEVEL:0',
'on-for-timer' => 'V:ON_TIME:?duration V:LEVEL:100', 'on-for-timer' => 'V:ON_TIME:?duration V:LEVEL:1',
'on-till' => 'V:ON_TIME:?time V:LEVEL:100', 'on-till' => 'V:ON_TIME:?time V:LEVEL:1',
'up' => 'V:LEVEL:?delta=+10', 'up' => 'V:LEVEL:?delta=+10',
'down' => 'V:LEVEL:?delta=-10', 'down' => 'V:LEVEL:?delta=-10',
'stop' => 'V:RAMP_STOP:1' 'stop' => 'V:RAMP_STOP:1',
'toggle' => 'V:LEVEL:0,1'
}, },
'DIMMER_VIRTUAL_RECEIVER' => { 'DIMMER_VIRTUAL_RECEIVER' => {
'pct' => '5:V:LEVEL:?level 1:V:DURATION_UNIT:0 2:V:ON_TIME,DURATION_VALUE:?time=0.0 3:V:RAMP_TIME_UNIT:0 4:V:RAMP_TIME,RAMP_TIME_VALUE:?ramp=0.5', 'pct' => '5:V:LEVEL:?level 1:V:DURATION_UNIT:0 2:V:ON_TIME,DURATION_VALUE:?time=0.0 3:V:RAMP_TIME_UNIT:0 4:V:RAMP_TIME,RAMP_TIME_VALUE:?ramp=0.5',
'level' => 'V:LEVEL:?level', 'level' => 'V:LEVEL:?level',
'on' => 'V:LEVEL:100', 'on' => 'V:LEVEL:1',
'off' => 'V:LEVEL:0', 'off' => 'V:LEVEL:0',
'oldLevel' => 'V:LEVEL:100.5', 'oldLevel' => 'V:LEVEL:1.005',
'on-for-timer' => '1:V:DURATION_UNIT:0 2:V:ON_TIME,DURATION_VALUE:?duration 3:V:LEVEL:100', 'on-for-timer' => '1:V:DURATION_UNIT:0 2:V:ON_TIME,DURATION_VALUE:?duration 3:V:LEVEL:1',
'on-till' => '1:V:DURATION_UNIT:0 2:V:ON_TIME,DURATION_VALUE:?time 3:V:LEVEL:100', 'on-till' => '1:V:DURATION_UNIT:0 2:V:ON_TIME,DURATION_VALUE:?time 3:V:LEVEL:1',
'up' => 'V:LEVEL:?delta=+10', 'up' => 'V:LEVEL:?delta=+10',
'down' => 'V:LEVEL:?delta=-10', 'down' => 'V:LEVEL:?delta=-10',
'color' => 'V:COLOR:#color' 'color' => 'V:COLOR:#color',
'toggle' => 'V:LEVEL:0,1'
}, },
'DIMMER_WEEK_PROFILE' => { 'DIMMER_WEEK_PROFILE' => {
'progMode' => 'V:WEEK_PROGRAM_TARGET_CHANNEL_LOCK:#progMode' 'progMode' => 'V:WEEK_PROGRAM_TARGET_CHANNEL_LOCK:#progMode'
@ -447,13 +472,13 @@ $HMCCU_CONFIG_VERSION = '5.0';
}, },
'JALOUSIE' => { 'JALOUSIE' => {
'pct' => 'V:LEVEL:?level', 'pct' => 'V:LEVEL:?level',
'open' => 'V:LEVEL:100', 'open' => 'V:LEVEL:1',
'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',
'stop' => 'V:STOP:1', 'stop' => 'V:STOP:1',
'pctSlats' => 'V:LEVEL_SLATS:?level', 'pctSlats' => 'V:LEVEL_SLATS:?level',
'openSlats' => 'V:LEVEL_SLATS:100', 'openSlats' => 'V:LEVEL_SLATS:1',
'closeSlats' => 'V:LEVEL_SLATS:0', 'closeSlats' => 'V:LEVEL_SLATS:0',
}, },
'KEY' => { 'KEY' => {
@ -484,10 +509,14 @@ $HMCCU_CONFIG_VERSION = '5.0';
'on-for-timer' => 'V:ON_TIME:?duration V:STATE:1', 'on-for-timer' => 'V:ON_TIME:?duration V:STATE:1',
'on-till' => 'V:ON_TIME:?time V:STATE:1' 'on-till' => 'V:ON_TIME:?time V:STATE:1'
}, },
'RGBW_COLOR' => {
'color' => 'V:COLOR:?color V:ACT_HSV_COLOR_VALUE:?hsvColor',
'brightness' => 'V:ACT_BRIGHTNESS:?brightness'
},
'SHUTTER_VIRTUAL_RECEIVER' => { 'SHUTTER_VIRTUAL_RECEIVER' => {
'pct' => 'V:LEVEL:?level', 'pct' => 'V:LEVEL:?level',
'open' => 'V:LEVEL:100', 'open' => 'V:LEVEL:1',
'oldLevel' => 'V:LEVEL:100.5', 'oldLevel' => 'V:LEVEL:1.005',
'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',
@ -500,7 +529,8 @@ $HMCCU_CONFIG_VERSION = '5.0';
'on' => 'V:STATE:1', 'on' => 'V:STATE:1',
'off' => 'V:STATE:0', 'off' => 'V:STATE:0',
'on-for-timer' => 'V:ON_TIME:?duration V:STATE:1', 'on-for-timer' => 'V:ON_TIME:?duration V:STATE:1',
'on-till' => 'V:ON_TIME:?time V:STATE:1' 'on-till' => 'V:ON_TIME:?time V:STATE:1',
'toggle' => 'V:STATE:0,1'
}, },
'SWITCH_PANIC' => { 'SWITCH_PANIC' => {
'panic' => 'V:STATE:#panic=on,off', 'panic' => 'V:STATE:#panic=on,off',
@ -516,7 +546,8 @@ $HMCCU_CONFIG_VERSION = '5.0';
'on' => 'V:STATE:1', 'on' => 'V:STATE:1',
'off' => 'V:STATE:0', 'off' => 'V:STATE:0',
'on-for-timer' => 'V:ON_TIME:?duration V:STATE:1', 'on-for-timer' => 'V:ON_TIME:?duration V:STATE:1',
'on-till' => 'V:ON_TIME:?time V:STATE:1' 'on-till' => 'V:ON_TIME:?time V:STATE:1',
'toggle' => 'V:STATE:0,1'
}, },
'THERMALCONTROL_TRANSMIT' => { 'THERMALCONTROL_TRANSMIT' => {
'desired-temp' => 'V:SET_TEMPERATURE:?temperature', 'desired-temp' => 'V:SET_TEMPERATURE:?temperature',
@ -528,6 +559,17 @@ $HMCCU_CONFIG_VERSION = '5.0';
'week-program' => 'D:WEEK_PROGRAM_POINTER:#program', 'week-program' => 'D:WEEK_PROGRAM_POINTER:#program',
'get week-program' => 'D:WEEK_PROGRAM_POINTER:#program:HMCCU_DisplayWeekProgram' 'get week-program' => 'D:WEEK_PROGRAM_POINTER:#program:HMCCU_DisplayWeekProgram'
}, },
'UNIVERSAL_LIGHT_RECEIVER' => {
'pct' => '5:V:LEVEL:?level 1:V:DURATION_UNIT:0 2:V:DURATION_VALUE:?time=0.0 3:V:RAMP_TIME_UNIT:0 4:V:RAMP_TIME_VALUE:?ramp=0.5',
'level' => 'V:LEVEL:?level',
'on' => 'V:LEVEL:1',
'off' => 'V:LEVEL:0',
'on-for-timer' => '1:V:DURATION_UNIT:0 2:V:DURATION_VALUE:?duration 3:V:LEVEL:1',
'on-till' => '1:V:DURATION_UNIT:0 2:V:DURATION_VALUE:?time 3:V:LEVEL:1',
'up' => 'V:LEVEL:?delta=+10',
'down' => 'V:LEVEL:?delta=-10',
'toggle' => 'V:LEVEL:0,1'
},
'VIRTUAL_KEY' => { 'VIRTUAL_KEY' => {
'on' => 'V:PRESS_SHORT:1', 'on' => 'V:PRESS_SHORT:1',
'off' => 'V:PRESS_SHORT:1', 'off' => 'V:PRESS_SHORT:1',
@ -642,6 +684,12 @@ $HMCCU_CONFIG_VERSION = '5.0';
'webCmd' => 'desired-temp:auto:manu:boost:on:off', 'webCmd' => 'desired-temp:auto:manu:boost:on:off',
'widgetOverride' => 'desired-temp:slider,4.5,0.5,30.5,1' 'widgetOverride' => 'desired-temp:slider,4.5,0.5,30.5,1'
}, },
'UNIVERSAL_LIGHT_RECEIVER' => {
'cmdIcon' => 'on:general_an off:general_aus',
'substexcl' => 'pct|level',
'webCmd' => 'level:on:off',
'widgetOverride' => 'level:slider,0,10,100'
},
'CLIMATECONTROL_RT_TRANSCEIVER' => { 'CLIMATECONTROL_RT_TRANSCEIVER' => {
'substexcl' => 'desired-temp', 'substexcl' => 'desired-temp',
'cmdIcon' => 'auto:sani_heating_automatic manu:sani_heating_manual boost:sani_heating_boost on:general_an off:general_aus', 'cmdIcon' => 'auto:sani_heating_automatic manu:sani_heating_manual boost:sani_heating_boost on:general_an off:general_aus',
@ -802,6 +850,9 @@ $HMCCU_CONFIG_VERSION = '5.0';
'CLIMATECONTROL_REGULATOR' => { 'CLIMATECONTROL_REGULATOR' => {
'SETPOINT' => { '4.5' => 'off', '30.5' => 'on' } 'SETPOINT' => { '4.5' => 'off', '30.5' => 'on' }
}, },
'UNIVERSAL_LIGHT_RECEIVER' => {
'LEVEL' => { '0' => 'off', '100' => 'on', 'off' => '0', 'on' => '100' }
},
'WATER_DETECTION_TRANSMITTER' => { 'WATER_DETECTION_TRANSMITTER' => {
'ALARMSTATE' => { '0' => 'noAlarm', '1' => 'alarm', 'false' => 'noAlarm', 'true' => 'alarm' } 'ALARMSTATE' => { '0' => 'noAlarm', '1' => 'alarm', 'false' => 'noAlarm', 'true' => 'alarm' }
}, },
@ -2300,7 +2351,7 @@ if(oTmpArray) {
object odev = dom.GetObject((och.Device())); object odev = dom.GetObject((och.Device()));
var ival = trigDP.Value(); var ival = trigDP.Value();
time sftime = oTmp.AlOccurrenceTime(); ! erste Meldezeit time sftime = oTmp.AlOccurrenceTime(); ! erste Meldezeit
time sltime = oTmp.LastTriggerTime();!letze Meldezeit time sltime = oTmp.LastTriggerTime(); ! letzte Meldezeit
var sdesc = trigDP.HssType(); var sdesc = trigDP.HssType();
var sserial = odev.Address(); var sserial = odev.Address();
var sname = odev.Name(); var sname = odev.Name();