diff --git a/fhem/CHANGED b/fhem/CHANGED index 9a3c762b6..8279cc553 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. + - bugfix: 88_HMCCU: Fixed delayed init and readingname bugs - feature: 93_DbRep: new attr numDecimalPlaces, Forum:#/topic,53584.msg1178063.html#msg1178063 - change: 98_WeekdayTimer: CONDITION now is checked at each switching time diff --git a/fhem/FHEM/88_HMCCU.pm b/fhem/FHEM/88_HMCCU.pm index eeaa9c0b5..aa1b1f40d 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 213201747'; +my $HMCCU_VERSION = '5.0 213281908'; # Timeout for CCU requests (seconds) my $HMCCU_TIMEOUT_REQUEST = 4; @@ -389,7 +389,7 @@ sub HMCCU_Initialize ($) ' ccudef-stripnumber ccudef-attributes ccuReadingPrefix'. ' ccuflags:multiple-strict,procrpc,dptnocheck,logCommand,noagg,nohmstate,updGroupMembers,'. 'logEvents,noEvents,noInitialUpdate,noReadings,nonBlocking,reconnect,logPong,trace,logEnhanced'. - ' ccuReqTimeout ccuGetVars rpcPingCCU'. + ' ccuReqTimeout ccuGetVars rpcPingCCU rpcinterfaces'. ' rpcserver:on,off rpcserveraddr rpcserverport rpctimeout rpcevtimeout substitute'. ' ccuget:Value,State '. $readingFnAttributes; @@ -479,7 +479,7 @@ sub HMCCU_Define ($$$) $hash->{config} = $HMCCU_CONFIG_VERSION; $hash->{ccutype} = 'CCU2/3'; $hash->{RPCState} = 'inactive'; - $hash->{NOTIFYDEV} = 'global,TYPE=HMCCU'; + $hash->{NOTIFYDEV} = 'global'; $hash->{hmccu}{rpcports} = undef; HMCCU_Log ($hash, 1, "Initialized version $HMCCU_VERSION"); @@ -494,8 +494,8 @@ sub HMCCU_Define ($$$) if (($hash->{ccustate} ne 'active' || $rc > 0) && !$init_done) { # Schedule later update of CCU assets if CCU is not active during FHEM startup $hash->{hmccu}{ccu}{delayed} = 1; - HMCCU_Log ($hash, 1, 'Scheduling delayed initialization in '.$hash->{hmccu}{ccu}{delay}.' seconds'); - InternalTimer (gettimeofday()+$hash->{hmccu}{ccu}{delay}, "HMCCU_InitDevice", $hash); +# HMCCU_Log ($hash, 1, 'Scheduling delayed initialization in '.$hash->{hmccu}{ccu}{delay}.' seconds'); +# InternalTimer (gettimeofday()+$hash->{hmccu}{ccu}{delay}, "HMCCU_InitDevice", $hash); } $hash->{hmccu}{$_} = 0 for ('evtime', 'evtimeout', 'updatetime', 'rpccount', 'defaults'); @@ -525,17 +525,23 @@ sub HMCCU_InitDevice ($) my $name = $hash->{NAME}; my $host = $hash->{host}; - if ($hash->{hmccu}{ccu}{delayed} == 1) { - HMCCU_Log ($hash, 1, 'Initializing devices'); + if (HMCCU_IsDelayedInit ($hash)) { + HMCCU_Log ($hash, 1, 'Delayed I/O device initialization'); if (!HMCCU_TCPPing ($host, $HMCCU_REGA_PORT{$hash->{prot}}, $hash->{hmccu}{ccu}{timeout})) { $hash->{ccustate} = 'unreachable'; return HMCCU_Log ($hash, 1, "CCU port ".$HMCCU_REGA_PORT{$hash->{prot}}." is not reachable", 1); } + else { + $hash->{ccustate} = 'active'; + } } my ($devcnt, $chncnt, $ifcount, $prgcount, $gcount) = HMCCU_GetDeviceList ($hash); if ($ifcount > 0) { - setDevAttrList ($name, $modules{HMCCU}{AttrList}.' rpcinterfaces:multiple-strict,'.$hash->{ccuinterfaces}); + my $rpcinterfaces = 'rpcinterfaces:multiple-strict,'.$hash->{ccuinterfaces}; + my $attributes = $modules{HMCCU}{AttrList}; + $attributes =~ s/rpcinterfaces/$rpcinterfaces/; + setDevAttrList ($name, $attributes); HMCCU_Log ($hash, 1, [ "Read $devcnt devices with $chncnt channels from CCU $host", @@ -543,8 +549,8 @@ sub HMCCU_InitDevice ($) "Read $gcount virtual groups from CCU $host" ]); - # Interactive device definition - if ($init_done && $hash->{hmccu}{ccu}{delayed} == 0) { + # Interactive device definition or delayed initialization + if ($init_done && !HMCCU_IsDelayedInit ($hash)) { # Force sync with CCU during interactive device definition if ($hash->{hmccu}{ccu}{sync} == 1) { HMCCU_LogDisplay ($hash, 1, 'Reading device config from CCU. This may take a couple of seconds ...'); @@ -552,6 +558,8 @@ sub HMCCU_InitDevice ($) HMCCU_Log ($hash, 2, "Read RPC device configuration: devices/channels=$cDev parametersets=$cPar links=$cLnk"); } } + + return 0; } else { return HMCCU_Log ($hash, 1, "No RPC interfaces found on CCU $host", 2); @@ -572,13 +580,15 @@ sub HMCCU_PostInit ($) my $host = $hash->{host}; + if (HMCCU_IsDelayedInit ($hash)) { + return if (HMCCU_InitDevice ($hash) > 0); + } + if ($hash->{ccustate} eq 'active') { my $rpcServer = AttrVal ($hash->{NAME}, 'rpcserver', 'off'); HMCCU_Log ($hash, 1, 'Reading device config from CCU. This may take a couple of seconds ...'); - $hash->{postInit} = 1; my ($cDev, $cPar, $cLnk) = HMCCU_GetDeviceConfig ($hash); - $hash->{postInit} = 0; HMCCU_Log ($hash, 2, "Read device configuration: devices/channels=$cDev parametersets=$cPar links=$cLnk"); HMCCU_StartExtRPCServer ($hash) if ($rpcServer eq 'on'); @@ -588,6 +598,18 @@ sub HMCCU_PostInit ($) } } +###################################################################### +# Check for delayed initialization +###################################################################### + +sub HMCCU_IsDelayedInit ($) +{ + my ($ioHash) = @_; + + return exists($ioHash->{hmccu}{ccu}{delayed}) && exists($ioHash->{hmccu}{ccu}{delay}) && + $ioHash->{hmccu}{ccu}{delayed} == 1 && $ioHash->{hmccu}{ccu}{delay} > 0 ? 1 : 0; +} + ###################################################################### # Set or delete attribute ###################################################################### @@ -1036,7 +1058,7 @@ sub HMCCU_Notify ($$) my $devname = $devhash->{NAME}; my $devtype = $devhash->{TYPE}; - return if (!HMCCU_IsDeviceActive ($hash)); +# return if (!HMCCU_IsDeviceActive ($hash)); my $events = deviceEvents ($devhash, 1); return if (!$events); @@ -1047,7 +1069,7 @@ sub HMCCU_Notify ($$) # Global event if ($event eq 'INITIALIZED') { # FHEM initialized. Schedule post initialization tasks - my $delay = $hash->{ccustate} eq 'active' && $hash->{hmccu}{ccu}{delayed} == 0 ? + my $delay = $hash->{ccustate} eq 'active' && !HMCCU_IsDelayedInit ($hash) ? $HMCCU_INIT_INTERVAL0 : $hash->{hmccu}{ccu}{delay}+$HMCCU_CCU_RPC_OFFSET; HMCCU_Log ($hash, 0, "Scheduling post FHEM initialization tasks in $delay seconds"); InternalTimer (gettimeofday()+$delay, "HMCCU_PostInit", $hash, 0); @@ -1370,8 +1392,7 @@ sub HMCCU_Set ($@) } my $host = $hash->{host}; - $options = 'initialize:noArg' if (exists($hash->{hmccu}{ccu}{delayed}) && - $hash->{hmccu}{ccu}{delayed} == 1 && $hash->{ccustate} eq 'unreachable'); + $options = 'initialize:noArg' if (HMCCU_IsDelayedInit ($hash) && $hash->{ccustate} eq 'unreachable'); return 'HMCCU: CCU busy, choose one of rpcserver:off' if ($opt ne 'rpcserver' && HMCCU_IsRPCStateBlocking ($hash)); @@ -1722,7 +1743,7 @@ sub HMCCU_Get ($@) } my $usage = "HMCCU: Unknown argument $opt, choose one of $options"; - return undef if ($hash->{hmccu}{ccu}{delayed} || $hash->{ccustate} ne 'active'); + return undef if (HMCCU_IsDelayedInit ($hash) || $hash->{ccustate} ne 'active'); return 'HMCCU: CCU busy, choose one of rpcstate:noArg' if ($opt ne 'rpcstate' && HMCCU_IsRPCStateBlocking ($hash)); @@ -2347,11 +2368,16 @@ sub HMCCU_GetReadingName ($$$$$$$;$) if ((exists($hash->{hmccu}{control}{chn}) && "$c" eq $hash->{hmccu}{control}{chn}) || (exists($hash->{hmccu}{state}{chn}) && "$c" eq $hash->{hmccu}{state}{chn})) { my $role = HMCCU_GetChannelRole ($hash, $c); + HMCCU_Trace ($hash, 2, "role=$role"); if ($role ne '' && exists($HMCCU_READINGS->{$role})) { $crn = $HMCCU_READINGS->{$role}; - $crn =~ s/C#\./$c\./g; + $crn =~ s/C#\\/$c\\/g; + HMCCU_Trace ($hash, 2, "crn=$crn"); push @srl, $crn; } + else { + HMCCU_Trace ($hash, 2, "No rule for role $role"); + } } my $sr = join (';', @srl); @@ -2417,6 +2443,7 @@ sub HMCCU_GetReadingName ($$$$$$$;$) my @rnewList = split (',', $rnew); next if (scalar (@rnewList) < 1); if ($rnlist[0] =~ /$rold/) { + HMCCU_Trace ($hash, 2, "Match $rnlist[0] : $rold"); foreach my $rnew (@rnewList) { if ($rnew =~ /^\+(.+)$/) { my $radd = $1; @@ -2429,6 +2456,9 @@ sub HMCCU_GetReadingName ($$$$$$$;$) } } } + else { + HMCCU_Trace ($hash, 2, "No match $rnlist[0] : $rold"); + } } # Convert to lower or upper case @@ -3140,7 +3170,7 @@ sub HMCCU_UpdateDeviceTable ($$) } # Delayed initialization if CCU was not ready during FHEM start - if ($hash->{hmccu}{ccu}{delayed} == 1) { + if (HMCCU_IsDelayedInit ($hash)) { # Initialize pending client devices my @cdev = HMCCU_FindClientDevices ($hash, '(HMCCUDEV|HMCCUCHN|HMCCURPCPROC)', undef, 'ccudevstate=pending'); if (scalar(@cdev) > 0) { @@ -3395,6 +3425,7 @@ sub HMCCU_CreateDevice ($@) $defOpts //= ''; my $cmd = "$devName $defMod $defAdd"; $cmd .= " $defOpts" if ($defOpts ne ''); + $cmd .= " iodev=$hash->{NAME}" if ($defAdd =~ /^INT[0-9]+$/); my $ret = CommandDefine (undef, $cmd); if ($ret) { HMCCU_Log ($hash, 2, "Define command failed $cmd. $ret"); @@ -4368,6 +4399,8 @@ sub HMCCU_IsValidParameter ($$$$;$) $oper //= 7; my $ioHash = HMCCU_GetHash ($clHash) // return 0; + + return 0 if (!defined($parameter) || $parameter eq ''); my $devDesc = ref($object) eq 'HASH' ? $object : HMCCU_GetDeviceDesc ($ioHash, $object); @@ -4676,7 +4709,7 @@ sub HMCCU_UpdateParamsetReadings ($$$;$) my @rnList = HMCCU_GetReadingName ($clHash, $clInt, $a, $c, $p, '', $clRF, $ps); my $hide = HMCCU_FilterReading ($clHash, $chnAddr, $p, $ps) ? 0 : 1; foreach my $rn (@rnList) { - HMCCU_Trace ($clHash, 2, "rn=$rn, hide=$hide, fv=$fv, cv=$cv"); + HMCCU_Trace ($clHash, 2, "p=$p rn=$rn, hide=$hide, fv=$fv, cv=$cv"); HMCCU_BulkUpdate ($clHash, $rn, $fv, $cv, $hide); } } @@ -5524,7 +5557,7 @@ sub HMCCU_GetDeviceList ($) $hash->{ccustate} = 'active'; # Delete old entries - HMCCU_Log ($hash, 2, "Deleting old groups"); + HMCCU_Log ($hash, 2, "Deleting old CCU configuration data"); %{$hash->{hmccu}{dev}} = (); %{$hash->{hmccu}{adr}} = (); %{$hash->{hmccu}{interfaces}} = (); @@ -8480,7 +8513,7 @@ sub HMCCU_DetectDevice ($$$) # state/control channel is the first channel with a state/control datapoint my $i = 0; foreach my $pr (@patternRoles) { - if ($HMCCU_STATECONTROL->{$pr}{S} ne '') { + if (HMCCU_IsValidParameter ($ioHash, $devDesc, 'VALUES', $HMCCU_STATECONTROL->{$pr}{S}, 5)) { $di{rolePattern}{$firstChannel}{stateRole} = $pr; $di{rolePattern}{$firstChannel}{stateChannel} = $firstChannel+$i; $di{rolePattern}{$firstChannel}{stateDatapoint} = $HMCCU_STATECONTROL->{$pr}{S}; @@ -8491,7 +8524,7 @@ sub HMCCU_DetectDevice ($$$) } $i = 0; foreach my $pr (@patternRoles) { - if ($HMCCU_STATECONTROL->{$pr}{C} ne '') { + if (HMCCU_IsValidParameter ($ioHash, $devDesc, 'VALUES', $HMCCU_STATECONTROL->{$pr}{C}, 2)) { $di{rolePattern}{$firstChannel}{controlRole} = $pr; $di{rolePattern}{$firstChannel}{controlChannel} = $firstChannel+$i; $di{rolePattern}{$firstChannel}{controlDatapoint} = $HMCCU_STATECONTROL->{$pr}{C}; @@ -8508,25 +8541,15 @@ sub HMCCU_DetectDevice ($$$) } } - if ($di{defSCh} != -1) { + if ($di{defSCh} != -1 && exists($di{stateRole}{$di{defSCh}})) { my $dpn = $di{stateRole}{$di{defSCh}}{datapoint} // ''; my $dpr = $di{stateRole}{$di{defSCh}}{role} // ''; - if ($dpn eq '') { - HMCCU_Log ($ioHash, 5, "State datapoint not defined for channel $di{defSCh}, role $dpr"); - } - else { - $di{defSDP} = $di{defSCh}.'.'.$dpn; - } + $di{defSDP} = $di{defSCh}.'.'.$dpn if ($dpn ne ''); } - if ($di{defCCh} != -1) { + if ($di{defCCh} != -1 && exists($di{controlRole}{$di{defCCh}})) { my $dpn = $di{controlRole}{$di{defCCh}}{datapoint} // ''; my $dpr = $di{controlRole}{$di{defCCh}}{role} // ''; - if ($dpn eq '') { - HMCCU_Log ($ioHash, 2, "Control datapoint not defined for channel $di{defCCh}, role $dpr"); - } - else { - $di{defCDP} = $di{defCCh}.'.'.$dpn; - } + $di{defCDP} = $di{defCCh}.'.'.$dpn if ($dpn ne ''); } return \%di; @@ -8546,15 +8569,15 @@ sub HMCCU_IdentifyRole ($$$$$) my ($a, $c) = HMCCU_SplitChnAddr ($devDesc->{ADDRESS}); my $p = $HMCCU_STATECONTROL->{$t}{P}; - # State datapoint must be readable and/or event + # State datapoint must be of type readable and/or event my $sDP = HMCCU_DetectSCDatapoint ($HMCCU_STATECONTROL->{$t}{S}, $iface); push @$stateRoles, { 'channel' => $c, 'role' => $t, 'datapoint' => $sDP, 'priority' => $p } - if ($sDP ne '' && HMCCU_IsValidParameter ($ioHash, $devDesc, 'VALUES', $sDP, 5)); + if (HMCCU_IsValidParameter ($ioHash, $devDesc, 'VALUES', $sDP, 5)); # Control datapoint must be writeable my $cDP = HMCCU_DetectSCDatapoint ($HMCCU_STATECONTROL->{$t}{C}, $iface); push @$controlRoles, { 'channel' => $c, 'role' => $t, 'datapoint' => $cDP, 'priority' => $p } - if ($cDP ne ''&& HMCCU_IsValidParameter ($ioHash, $devDesc, 'VALUES', $cDP, 2)); + if (HMCCU_IsValidParameter ($ioHash, $devDesc, 'VALUES', $cDP, 2)); } } @@ -10487,7 +10510,7 @@ sub HMCCU_MaxHashEntries ($$)

HMCCU


- Then start with the definition of client devices using modules HMCCUDEV (CCU devices) - and HMCCUCHN (CCU channels) or with command 'get create'.
+ When RPC servers are started for the first time, HMCCU will create a HMCCURPCPROC device for + each interface defined in attribut 'rpcinterfaces'.
+ After I/O device has been defined, start with the definition of client devices using modules HMCCUDEV (CCU devices) + and HMCCUCHN (CCU channels) or with commands 'get createDev' or 'get create'.

diff --git a/fhem/FHEM/88_HMCCUCHN.pm b/fhem/FHEM/88_HMCCUCHN.pm index d276f2741..8ced15091 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 213261849'; +my $HMCCUCHN_VERSION = '5.0 213281908'; ###################################################################### # Initialize module diff --git a/fhem/FHEM/88_HMCCUDEV.pm b/fhem/FHEM/88_HMCCUDEV.pm index b12e40b7d..3bfef2756 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 213201747'; +my $HMCCUDEV_VERSION = '5.0 213281908'; ###################################################################### # Initialize module @@ -208,7 +208,7 @@ sub HMCCUDEV_InitDevice ($$) my $rc = 0; - if ($init_done) { + if ($init_done && !HMCCU_IsDelayedInit ($ioHash)) { my $detect = HMCCU_DetectDevice ($ioHash, $da, $di); return "Specify option 'forceDev' for HMCCUDEV or use HMCCUCHN instead (recommended). Command: define $name HMCCUCHN $detect->{defAdd}" if (defined($detect) && $detect->{defMod} eq 'HMCCUCHN' && $devHash->{hmccu}{forcedev} == 0); diff --git a/fhem/FHEM/88_HMCCURPCPROC.pm b/fhem/FHEM/88_HMCCURPCPROC.pm index 9e86c31d4..247a2cb42 100755 --- a/fhem/FHEM/88_HMCCURPCPROC.pm +++ b/fhem/FHEM/88_HMCCURPCPROC.pm @@ -39,7 +39,7 @@ require "$attr{global}{modpath}/FHEM/88_HMCCU.pm"; ###################################################################### # HMCCURPC version -my $HMCCURPCPROC_VERSION = '5.0 213201747'; +my $HMCCURPCPROC_VERSION = '5.0 213281908'; # 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 0a3c65111..e277d29c1 100644 --- a/fhem/FHEM/HMCCUConf.pm +++ b/fhem/FHEM/HMCCUConf.pm @@ -76,6 +76,9 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'CLIMATE_TRANSCEIVER' => { F => 3, S => 'ACTUAL_TEMPERATURE', C => '', V => '', P => 1 }, + 'CLIMATECONTROL_FLOOR_TRANSCEIVER' => { + F => 3, S => 'LEVEL', C => '', V => '', P => 1 + }, 'CLIMATECONTROL_REGULATOR' => { F => 3, S => 'LEVEL', C => 'SETPOINT', V => 'on:30.5,off:4.5', P => 2 }, @@ -106,12 +109,18 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'HEATING_CLIMATECONTROL_TRANSCEIVER' => { F => 3, S => 'ACTUAL_TEMPERATURE', C => 'SET_POINT_TEMPERATURE', V => 'on:30.5,off:4.5', P => 2 }, + 'JALOUSIE' => { + F => 3, S => 'LEVEL', C => 'LEVEL', V => 'open:100,close:0', P => 2 + }, 'KEY' => { F => 3, S => 'PRESS_SHORT', C => 'PRESS_SHORT', V => 'pressed:true', P => 1 }, 'KEY_TRANSCEIVER' => { F => 3, S => 'PRESS_SHORT', C => '', V => '', P => 1 }, + 'KEYMATIC' => { + F => 3, S => 'STATE', C => 'STATE', V => 'locked:false,unlocked:true', P => 2 + }, 'LUXMETER' => { F => 3, S => 'LUX', C => '', V => '', P => 2 }, @@ -130,6 +139,12 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'POWERMETER' => { F => 3, S => 'CURRENT', C => '', V => '', P => 1 }, + 'POWERMETER_IEC1' => { + F => 3, S => 'ENERGY_COUNTER', C => '', V => '', P => 1 + }, + 'POWERMETER_IEC2' => { + F => 3, S => 'IEC_ENERGY_COUNTER', C => '', V => '', P => 1 + }, 'PRESENCEDETECTOR_TRANSCEIVER' => { F => 3, S => 'PRESENCE_DETECTION_STATE', C => 'PRESENCE_DETECTION_ACTIVE', V => 'active:1,inactive:0', P => 2 }, @@ -148,9 +163,6 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'SMOKE_DETECTOR' => { F => 3, S => 'BidCos-RF:STATE,SMOKE_DETECTOR_ALARM_STATUS', C => 'HmIP-RF:SMOKE_DETECTOR_COMMAND', V => '', P => 2 }, - 'VIRTUAL_KEY' => { - F => 3, S => 'PRESS_SHORT', C => 'PRESS_SHORT', V => 'pressed:true', P => 1 - }, 'SHUTTER_TRANSMITTER' => { F => 3, S => 'LEVEL', C => '', V => '', P => 1 }, @@ -169,6 +181,9 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'THERMALCONTROL_TRANSMIT' => { F => 3, S => 'ACTUAL_TEMPERATURE', C => 'SET_TEMPERATURE', V => 'on:30.5,off:4.5', P => 2 }, + 'VIRTUAL_KEY' => { + F => 3, S => 'PRESS_SHORT', C => 'PRESS_SHORT', V => 'pressed:true', P => 1 + }, 'WATER_DETECTION_TRANSMITTER' => { F => 3, S => 'ALARMSTATE', C => '', V => '', P => 1 }, @@ -189,31 +204,33 @@ $HMCCU_CONFIG_VERSION = '5.0'; %HMCCU_READINGS = ( 'BLIND' => - '(C#\.)?LEVEL$:+pct', + '^(C#\.)?LEVEL$:+pct', 'BLIND_TRANSMITTER' => - '(C#\.)?LEVEL$:+pct', + '^(C#\.)?LEVEL$:+pct', 'BLIND_VIRTUAL_RECEIVER' => - '(C#\.)?LEVEL$:+pct', + '^(C#\.)?LEVEL$:+pct', 'SHUTTER_TRANSMITTER' => - '(C#\.)?LEVEL$:+pct', + '^(C#\.)?LEVEL$:+pct', 'SHUTTER_VIRTUAL_RECEIVER' => - '(C#\.)?LEVEL$:+pct', + '^(C#\.)?LEVEL$:+pct', 'DIMMER' => - '(C#\.)?LEVEL$:+pct', + '^(C#\.)?LEVEL$:+pct', 'DIMMER_TRANSMITTER' => - '(C#\.)?LEVEL$:+pct;(C#\.)?COLOR$:+color', + '^(C#\.)?LEVEL$:+pct;(C#\.)?COLOR$:+color', 'DIMMER_VIRTUAL_RECEIVER' => - '(C#\.)?LEVEL$:+pct;(C#\.)?COLOR$:+color', + '^(C#\.)?LEVEL$:+pct;(C#\.)?COLOR$:+color', 'DIMMER_WEEK_PROFILE' => - '(C#\.)?WEEK_PROGRAM_CHANNEL_LOCKS$:+progMode', + '^(C#\.)?WEEK_PROGRAM_CHANNEL_LOCKS$:+progMode', + 'JALOUSIE' => + '^(C#\.)?LEVEL$:+pct;(C#\.)?LEVEL_SLATS$:+pctSlats', 'KEY' => - '(C#\.)?PRESS_(SHORT|LONG)$:+pressed', + '^(C#\.)?PRESS_(SHORT|LONG)$:+pressed', 'KEY_TRANSCEIVER' => - '(C#\.)?PRESS_(SHORT|LONG)$:+pressed', + '^(C#\.)?PRESS_(SHORT|LONG)$:+pressed', 'VIRTUAL_KEY' => - '(C#\.)?PRESS_(SHORT|LONG)$:+pressed', + '^(C#\.)?PRESS_(SHORT|LONG)$:+pressed', 'ACCELERATION_TRANSCEIVER' => - '(C#\.)?MOTION:motion', + '^(C#\.)?MOTION:motion', 'MOTION_DETECTOR' => '^(C#\.)?BRIGHTNESS$:brightness;(C#\.)?MOTION:motion', 'MOTIONDETECTOR_TRANSCEIVER' => @@ -221,35 +238,35 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'PRESENCEDETECTOR_TRANSCEIVER' => '^(C#\.)?ILLUMINATION$:brightness;(C#\.)?PRESENCE_DETECTION_STATE:presence;(C#\.)?PRESENCE_DETECTION_ACTIVE:detection', 'WEATHER' => - '(C#\.)?TEMPERATURE$:+measured-temp;'. - '(C#\.)?HUMIDITY$:+humidity', + '^(C#\.)?TEMPERATURE$:+measured-temp;'. + '^(C#\.)?HUMIDITY$:+humidity', 'WEATHER_TRANSMIT' => - '(C#\.)?TEMPERATURE$:+measured-temp;'. - '(C#\.)?HUMIDITY$:+humidity', + '^(C#\.)?TEMPERATURE$:+measured-temp;'. + '^(C#\.)?HUMIDITY$:+humidity', 'CLIMATE_TRANSCEIVER' => - '(C#\.)?ACTUAL_TEMPERATURE$:+measured-temp;'. - '(C#\.)?ACTUAL_HUMIDITY$:+humidity', + '^(C#\.)?ACTUAL_TEMPERATURE$:+measured-temp;'. + '^(C#\.)?ACTUAL_HUMIDITY$:+humidity', 'THERMALCONTROL_TRANSMIT' => - '(C#\.)?ACTUAL_TEMPERATURE$:+measured-temp;'. - '(C#\.)?ACTUAL_HUMIDITY$:+humidity;'. - '(C#\.)?SET_TEMPERATURE$:+desired-temp', + '^(C#\.)?ACTUAL_TEMPERATURE$:+measured-temp;'. + '^(C#\.)?ACTUAL_HUMIDITY$:+humidity;'. + '^(C#\.)?SET_TEMPERATURE$:+desired-temp', 'CLIMATECONTROL_RT_TRANSCEIVER' => - '(C#\.)?ACTUAL_TEMPERATURE$:+measured-temp;'. - '(C#\.)?ACTUAL_HUMIDITY$:+humidity;'. - '(C#\.)?SET_TEMPERATURE$:+desired-temp', + '^(C#\.)?ACTUAL_TEMPERATURE$:+measured-temp;'. + '^(C#\.)?ACTUAL_HUMIDITY$:+humidity;'. + '^(C#\.)?SET_TEMPERATURE$:+desired-temp', 'HEATING_CLIMATECONTROL_TRANSCEIVER' => - '(C#\.)?ACTUAL_TEMPERATURE$:+measured-temp;'. - '(C#\.)?HUMIDITY$:+humidity;'. - '(C#\.)?ACTUAL_HUMIDITY$:+humidity;'. - '(C#\.)?SET_POINT_TEMPERATURE$:+desired-temp', + '^(C#\.)?ACTUAL_TEMPERATURE$:+measured-temp;'. + '^(C#\.)?HUMIDITY$:+humidity;'. + '^(C#\.)?ACTUAL_HUMIDITY$:+humidity;'. + '^(C#\.)?SET_POINT_TEMPERATURE$:+desired-temp', 'CLIMATECONTROL_REGULATOR' => - '(C#\.)?SETPOINT$:+desired-temp', + '^(C#\.)?SETPOINT$:+desired-temp', 'DEFAULT' => - '([0-9]{1,2}\.)?LEVEL$:+pct;'. - '([0-9]{1,2}\.)?SET_TEMPERATURE$:+desired-temp;'. + '^([0-9]{1,2}\.)?LEVEL$:+pct;'. + '^([0-9]{1,2}\.)?SET_TEMPERATURE$:+desired-temp;'. '^([0-9]{1,2}\.)?(ACTUAL_TEMPERATURE|TEMPERATURE)$:+measured-temp;'. - '([0-9]{1,2}\.)?SET_POINT_TEMPERATURE$:+desired-temp;'. - '([0-9]{1,2}\.)?ACTUAL_HUMIDITY$:+humidity' + '^([0-9]{1,2}\.)?SET_POINT_TEMPERATURE$:+desired-temp;'. + '^([0-9]{1,2}\.)?ACTUAL_HUMIDITY$:+humidity' ); ###################################################################### @@ -316,11 +333,27 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'unlock' => 'V:LOCK_TARGET_LEVEL:1', 'lock' => 'V:LOCK_TARGET_LEVEL:0' }, + 'JALOUSIE' => { + 'pct' => 'V:LEVEL:?level', + 'open' => 'V:LEVEL:100', + 'close' => 'V:LEVEL:0', + 'up' => 'V:LEVEL:?delta=+20', + 'down' => 'V:LEVEL:?delta=-20', + 'stop' => 'V:STOP:1', + 'pctSlats' => 'V:LEVEL_SLATS:?level', + 'openSlats' => 'V:LEVEL_SLATS:100', + 'closeSlats' => 'V:LEVEL_SLATS:0', + }, 'KEY' => { 'on' => 'V:PRESS_SHORT:1', 'off' => 'V:PRESS_SHORT:1', 'press' => 'V:PRESS_SHORT:1' }, + 'KEYMATIC' => { + 'open' => 'V:OPEN:true', + 'lock' => 'V:STATE:false', + 'unklock' => 'V:STATE:true' + }, 'VIRTUAL_KEY' => { 'on' => 'V:PRESS_SHORT:1', 'off' => 'V:PRESS_SHORT:1', @@ -464,6 +497,12 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'cmdIcon' => 'open:fts_door_open unlock:secur_open lock:secur_lock', 'webCmd' => 'lock:unlock:open' }, + 'JALOUSIE' => { + 'substexcl' => 'pct', + 'cmdIcon' => 'open:fts_shutter_up stop:fts_shutter_manual close:fts_shutter_down', + 'webCmd' => 'pct:open:close:stop', + 'widgetOverride' => 'pct:slider,0,10,100' + }, 'KEY' => { 'event-on-update-reading' => 'PRESS.*', 'cmdIcon' => 'press:taster', @@ -472,6 +511,10 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'KEY_TRANSCEIVER' => { 'event-on-update-reading' => 'PRESS.*' }, + 'KEYMATIC' => { + 'cmdIcon' => 'open:fts_door_right_open lock:secure_locked unlock:secur_open', + 'webCmd' => 'open:lock:unlock' + }, 'MOTION_DETECTOR' => { '_none_' => '' }, @@ -537,6 +580,9 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'CLIMATECONTROL_VENT_DRIVE' => { '_none_' => '' }, + 'CLIMATECONTROL_FLOOR_TRANSCEIVER' => { + '_none_' => '' + }, 'WATER_DETECTION_TRANSMITTER' => { '_none_' => '' } @@ -577,6 +623,9 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'PRESS_SHORT' => { '1' => 'pressed', 'true' => 'pressed' }, 'PRESS_LONG' => { '1' => 'pressed', 'true' => 'pressed' } }, + 'KEYMATIC' => { + 'STATE' => { '0' => 'locked', 'false' => 'locked', '1' => 'unlocked', 'true' => 'unlocked' } + }, 'VIRTUAL_KEY' => { 'PRESS_SHORT' => { '1' => 'pressed', 'true' => 'pressed' }, 'PRESS_LONG' => { '1' => 'pressed', 'true' => 'pressed' } @@ -618,6 +667,12 @@ $HMCCU_CONFIG_VERSION = '5.0'; 'DIRECTION' => { '0' => 'none', '1' => 'up', '2' => 'down' }, 'WORKING' => { '0' => 'no', 'false' => 'no', '1' => 'yes', 'true' => 'yes' } }, + 'JALOUSIE' => { + 'LEVEL' => { '0' => 'closed', '100' => 'open', 'close' => '0', 'open' => '100' }, + 'LEVEL_SLATS' => { '0' => 'closed', '100' => 'open', 'close' => '0', 'open' => '100' }, + 'DIRECTION' => { '0' => 'none', '1' => 'up', '2' => 'down' }, + 'WORKING' => { '0' => 'no', 'false' => 'no', '1' => 'yes', 'true' => 'yes' } + }, 'SHUTTER_TRANSMITTER' => { 'LEVEL' => { '0' => 'closed', '100' => 'open', 'close' => '0', 'open' => '100' } },