From 0939ac6c1d41da84bf1f0e491b8e863657207580 Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Fri, 19 Apr 2013 18:52:25 +0000 Subject: [PATCH] CFM repeat set, SD eliminat forward git-svn-id: https://svn.fhem.de/fhem/trunk@3087 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_CUL_HM.pm | 120 +++++++++++------------ fhem/FHEM/98_HMinfo.pm | 211 ++++++++++++++++++++--------------------- fhem/FHEM/HMConfig.pm | 16 ++-- 3 files changed, 171 insertions(+), 176 deletions(-) diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index 9e4217492..32d66151e 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -124,7 +124,7 @@ sub CUL_HM_autoReadConfig($){ while(@{$modules{CUL_HM}{helper}{updtCfgLst}}){ my $name = shift(@{$modules{CUL_HM}{helper}{updtCfgLst}}); my $hash = CUL_HM_name2Hash($name); - if (0 != substr(CUL_HM_Get($hash,$name,"param","autoReadReg"),0,1)){ + if (0 != CUL_HM_getARead($name)){ CUL_HM_Set($hash,$name,"getSerial"); CUL_HM_Set($hash,$name,"getConfig"); CUL_HM_Set($hash,$name,"statusRequest"); @@ -166,8 +166,8 @@ sub CUL_HM_updateConfig($){ #delete $attr{$name}{peerIDs}; # remove historical data } - my $st = CUL_HM_Get($hash,$name,"param","subType"); - my $md = CUL_HM_Get($hash,$name,"param","model"); + my $st = CUL_HM_Get($hash,$name,"param","subType"); + my $md = CUL_HM_Get($hash,$name,"param","model"); if ("HM-CC-TC" eq $md){ $hash->{helper}{role}{chn} = 1 if (length($id) == 6); #tc special } @@ -234,7 +234,7 @@ sub CUL_HM_updateConfig($){ } } $attr{$name}{webCmd} = $webCmd if ($webCmd); - push @getConfList,$name if (0 != substr(AttrVal($name,"autoReadReg","0"),0,1)); + push @getConfList,$name if (0 != CUL_HM_getARead($name)); } $modules{CUL_HM}{helper}{updtCfgLst} = \@getConfList; CUL_HM_autoReadConfig("updateConfig"); @@ -952,9 +952,8 @@ sub CUL_HM_Parse($$) {############################## my $bitLoc = ($msgChn-1)*2;#calculate bit location my $mask = 3<<$bitLoc; my $value = sprintf("%08X",(hex($devState) &~$mask)|($msgState<<$bitLoc)); - push @entities, - CUL_HM_UpdtReadBulk($shash,1,"color:".$value, - "state:".$value); + push @entities,CUL_HM_UpdtReadBulk($shash,1,"color:".$value, + "state:".$value); if ($chnHash){ $shash = $chnHash; my %colorTable=("00"=>"off","01"=>"red","02"=>"green","03"=>"orange"); @@ -1032,46 +1031,30 @@ sub CUL_HM_Parse($$) {############################## } elsif ($msgType eq "41"){ #Alarm detected my ($No,$state) = (substr($p,2,2),substr($p,4,2)); - if($dhash && $dname ne $name){ # update source(ID is reported in $dst...) - if (!$dhash->{helper}{alarmNo} || $dhash->{helper}{alarmNo} ne $No){ - $dhash->{helper}{alarmNo} = $No; - push @entities,CUL_HM_UpdtReadSingle($dhash,'state', - (($state eq "01")?"off": - (($state eq "C7")?"smoke-forward": - "smoke-alarm")),1); - } + if(($dhash && $dname ne $name) && # update source(ID is reported in $dst...) + (!$dhash->{helper}{alarmNo} || $dhash->{helper}{alarmNo} ne $No)){ + $dhash->{helper}{alarmNo} = $No; + push @entities, + CUL_HM_UpdtReadBulk($dhash,1, + 'state:'.(($state eq "01")?"off":"smoke-Alarm_".$No), + "eventNo:".$No + ); } # - - - - - - now handle the team - - - - - - $shash->{helper}{alarmList} = "" if (!$shash->{helper}{alarmList}); - $shash->{helper}{alarmFwd} = "" if (!$shash->{helper}{alarmFwd}); if ($state eq "01") { # clear Alarm for one sensor $shash->{helper}{alarmList} =~ s/",".$dst//; } - elsif($state eq "C7"){# add alarm forwarding - $shash->{helper}{alarmFwd} .= ",".$dst; - } else{ # add alarm for Sensor $shash->{helper}{alarmList} .= ",".$dst; } - my $alarmList; # make alarm ID list readable + my $alarmList; # make alarm ID list readable foreach(split(",",$shash->{helper}{alarmList})){ $alarmList .= CUL_HM_id2Name($_)."," if ($_); } - if (!$alarmList){# all alarms are gone - clear forwarding - foreach(split(",",$shash->{helper}{alarmFwd})){ - my $fHash = CUL_HM_id2Hash($1) if ($1); - push @entities,CUL_HM_UpdtReadSingle($fHash,'state',"off",1)if ($fHash); - } - $shash->{helper}{alarmList} = ""; - $shash->{helper}{alarmFwd} = ""; - } - my $alarmFwd; # make forward ID list readable - foreach(split(",",$shash->{helper}{alarmFwd})){ - $alarmFwd .= CUL_HM_id2Name($_)."," if ($_); - } + $shash->{helper}{alarmList} = "" if (!$alarmList); push @event,"state:" .($alarmList?"smoke-Alarm":"off" ); push @event,"smoke_detect:" .($alarmList?$alarmList :"none"); - push @event,"smoke_forward:".($alarmFwd ?$alarmFwd :"none"); } elsif ($msgType eq "01"){ #Configs my $sType = substr($p,0,2); @@ -1489,8 +1472,8 @@ sub CUL_HM_parseCommon(@){##################################################### elsif($subType eq "06"){ #reply to status request======================= my $rssi = substr($p,8,2);# --calculate RSSI CUL_HM_storeRssi(CUL_HM_hash2Name($shash), - ($dhash?CUL_HM_hash2Name($dhash):$shash->{IODev}{NAME}), - (-1)*(hex($rssi))) + ($dhash?CUL_HM_hash2Name($dhash):$shash->{IODev}{NAME}), + (-1)*(hex($rssi))) if ($rssi && $rssi ne '00' && $rssi ne'80'); @{$modules{CUL_HM}{helper}{reqStatus}} = grep { $_ != $shash->{NAME} } @{$modules{CUL_HM}{helper}{reqStatus}}; @@ -1504,8 +1487,8 @@ sub CUL_HM_parseCommon(@){##################################################### else{ my ($chn) = ($1) if($p =~ m/^..(..)/); if ($chn eq "00"){ - CUL_HM_queueAutoRead(CUL_HM_hash2Name($shash)) - if (1 < substr(AttrVal($shash->{NAME},"autoReadReg",0),0,1)); + CUL_HM_queueAutoRead(CUL_HM_hash2Name($shash)) + if (1 < CUL_HM_getARead($shash->{NAME})); return "powerOn" ;# check dst eq "000000" as well? } } @@ -2243,32 +2226,36 @@ sub CUL_HM_Set($@) { } } elsif($md eq "HM-OU-CFM-PL"){ - return "use channel 1 of the device for LED" if ($chn != 1); my %color = (redL =>18,greenL =>34,orangeL =>50, redS =>17,greenS =>33,orangeS =>49); my @ledList = split(',',$a[2]); - my $ledBytes; + my $repeat = (defined $a[3] && $a[3] =~ m/^(\d+)$/)?$a[3]:1; + return "repetition $repeat out of range [1..255]" + if($repeat < 1 || $repeat > 255); + + my $ledBytes = sprintf("%02X",$repeat); foreach my $led (@ledList){ if (!$color{$led} ){# wrong parameter return "'$led' unknown. use: ".join(" ",sort keys(%color)); } $ledBytes .= sprintf("%02X",$color{$led}); } - CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.'0101'.$ledBytes); + CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.'01'.$ledBytes); } else{ return "device for command cannot be identified"; } } elsif($cmd eq "playTone") { ################################################# - $chn = "02" if (length($hash->{DEF}) == 6);# be nice, select implicite - return "use channel 2 of the device to play MP3" if ($chn != 2); my @mp3List = split(',',$a[2]); - my $mp3Bytes; + my $repeat = (defined $a[3] && $a[3] =~ m/^(\d+)$/)?$a[3]:1; + return "repetition $repeat out of range [1..255]" + if($repeat < 1 || $repeat > 255); + my $mp3Bytes = sprintf("%02X",$repeat); foreach my $mp3 (@mp3List){ $mp3Bytes .= sprintf("%02X",$mp3); } - CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.'0202'.$mp3Bytes); + CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.'01'.$mp3Bytes); } elsif($cmd eq "ilum") { ################################################# reg return "$a[2] not specified. choose 0-15 for brightness" if ($a[2]>15); @@ -2431,7 +2418,7 @@ sub CUL_HM_Set($@) { } } elsif($cmd eq "peerChan") { ################################################# - #peerChan device ... [single|dual] [set|unset] [actor|remote|both] + #peerChan ... [single|dual] [set|unset] [actor|remote|both] my ($bNo,$peerN,$single,$set,$target) = ($a[2],$a[3],$a[4],$a[5],$a[6]); $state = ""; return "$bNo is not a button number" if(($bNo < 1) && !$chn); @@ -2926,8 +2913,8 @@ sub CUL_HM_pushConfig($$$$$$$$) {#generate messages to cnfig data to register substr($content,$l,$ml)); } CUL_HM_PushCmdStack($hash,"++A001".$src.$dst.$chn."06"); - my $rd = substr(CUL_HM_Get($hash,$hash->{NAME},"param","autoReadReg"),0,1); - CUL_HM_queueAutoRead(CUL_HM_hash2Name($hash)) if ($rd=~m/\d/ && 2 < $rd); + CUL_HM_queueAutoRead(CUL_HM_hash2Name($hash)) + if (2 < CUL_HM_getARead($hash->{NAME})); } sub CUL_HM_Resend($) {#resend a message if there is no answer my $hash = shift; @@ -3774,13 +3761,18 @@ sub CUL_HM_qStateUpdat($){#in:name or id, queue send stat-request after 12 sec $name = CUL_HM_id2Name($name) if ($name =~ m/^[A-F0-9]{6,8}$/i); $name =~ s /_chn:..$//; return if (!$defs{$name}); #device unknown, ignore - if (substr(AttrVal($name,"autoReadReg",0),0,1) > 3){ + if (CUL_HM_getARead($name) > 3){ @{$modules{CUL_HM}{helper}{reqStatus}}= CUL_HM_noDup(@{$modules{CUL_HM}{helper}{reqStatus}},$name); RemoveInternalTimer("CUL_HM_reqStatus"); InternalTimer(gettimeofday()+120,"CUL_HM_reqStatus","CUL_HM_reqStatus", 0); } } +sub CUL_HM_getARead($){#return valid autoRegRead as integer + my $name = shift; + my $aRd = CUL_HM_Get($defs{$name},$name,"param","autoReadReg"); + return ($aRd eq "undefined")?0:int($aRd); +} #+++++++++++++++++ external use +++++++++++++++++++++++++++++++++++++++++++++++ sub CUL_HM_putHash($) {# provide data for HMinfo @@ -4157,8 +4149,8 @@ sub CUL_HM_putHash($) {# provide data for HMinfo activate learn mode. Whether commands are pending is reported on device level with parameter 'protCmdPend'.
    -
  • peerChan <btn_no> <hmDevice> [single|dual] - [set|unset] [actor|remote]
    +
  • peerChan <btn_no> <actChan> [single|dual] + [set|unset] [both|actor|remote]
    peerChan will establish a connection between a sender-channel and an actuator-channel called link in HM nomenclatur. Peering must not be @@ -4189,18 +4181,20 @@ sub CUL_HM_putHash($) {# provide data for HMinfo well as one sender-channel to multiple Actuator-channel is possible.
    - <hmDevice> is the actuator-channel to be peered.
    + <actChan> is the actuator-channel to be peered.
    <btn_no> is the sender-channel (button) to be peered. If 'single' is choosen buttons are counted from 1. For 'dual' btn_no is the number of the Button-pair to be used. I.e. '3' in dual is the 3rd button pair correcponding to button 5 and 6 in single mode.
    - If the command is executed on a channel the btn_no is ignored.
    + If the command is executed on a channel the btn_no is ignored. + It needs to be set, should be 0
    [single|dual]: this mode impacts the default behavior of the Actuator upon using this button. E.g. a dimmer can be learned to a single button or to a button pair.
    + Defaults to dual.
    'dual' (default) Button pairs two buttons to one actuator. With a dimmer this means one button for dim-up and one for dim-down.
    @@ -4209,13 +4203,15 @@ sub CUL_HM_putHash($) {# provide data for HMinfo simple switch actuator to toggle on/off. Nevertheless also dimmer can be learned to only one button.
    + [set|unset]: selects either enter a peering or remove it.
    + Defaults to set.
    'set' will setup peering for the channels
    - 'unset' will remove the peering for the channels
    [actor|remote|both] limits the execution to only actor or only remote. This gives the user the option to redo the peering on the remote channel while the settings in the actor will not be removed.
    + Defaults to both.
    Example:
      @@ -4322,13 +4318,17 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
    • OutputUnit (HM-OU-CFM-PL)
      • led <color>[,<color>..]
        - Possible colors are [redL|greenL|yellowL|redS|greenS|yellowS]. A - sequence of colors can be given separating the color entries by ','. - White spaces must not be used in the list. 'S' indicates short and - 'L' long ilumination.
      • -
      • playTone <MP3No>[,<MP3No>..]
        - Play a series of tones. List is to be entered separated by ','. White - spaces must not be used in the list.
      • + Possible colors are [redL|greenL|yellowL|redS|greenS|yellowS]. A + sequence of colors can be given separating the color entries by ','. + White spaces must not be used in the list. 'S' indicates short and + 'L' long ilumination.
        + repeat defines how many times the sequence is executed. Defaults to 1
        + +
      • playTone <MP3No>[,<MP3No>..] [,<repeat>..]
        + Play a series of tones. List is to be entered separated by ','. White + spaces must not be used in the list.
        + repeat defines how many times the sequence is played. Defaults to 1
        +

    • HM-RC-19xxx diff --git a/fhem/FHEM/98_HMinfo.pm b/fhem/FHEM/98_HMinfo.pm index 731838abf..3e8526f49 100644 --- a/fhem/FHEM/98_HMinfo.pm +++ b/fhem/FHEM/98_HMinfo.pm @@ -9,7 +9,6 @@ sub CommandXmlList($$); sub XmlEscape($); use Blocking; - sub HMinfo_Initialize($$) {#################################################### my ($hash) = @_; @@ -20,7 +19,8 @@ sub HMinfo_Define($$){######################################################### my ($hash, $def) = @_; my @a = split("[ \t][ \t]*", $def); my $name = $hash->{NAME}; - $hash->{Version} = "Beta-04"; + $hash->{Version} = "01"; + $attr{$name}{webCmd} = "protoEvents:rssi:peerXref:configCheck:models"; return; } sub HMinfo_getParam(@) { ###################################################### @@ -55,12 +55,15 @@ sub HMinfo_regCheck(@) { ###################################################### push @peerIdInReg,CUL_HM_name2Id($peer); } #- - - - check whether peer is required - - - - - my $peerLinReg = (join ",",sort @peerIdInReg); - $peerLinReg .= "," if ($peerLinReg); - my $peerIDs = AttrVal($eName,"peerIDs",""); - $peerIDs =~ s/00000000,//; - push @peerRegsFail,$eName." - found:".$peerLinReg." expected:".$peerIDs - if ($peerLinReg ne $peerIDs); + my $st = CUL_HM_Get($defs{$eName},$eName,"param","subType"); + if ($st !~ m/(thermostat|smokeDetector)/){ + my $peerLinReg = (join ",",sort @peerIdInReg); + $peerLinReg .= "," if ($peerLinReg); + my $peerIDs = AttrVal($eName,"peerIDs",""); + $peerIDs =~ s/00000000,//; + push @peerRegsFail,$eName." - found:".$peerLinReg." expected:".$peerIDs + if ($peerLinReg ne $peerIDs); + } } return "\n incomplete register set\n " .(join "\n ",sort @regIncompl) ."\n missing Peer Registerset\n ".(join "\n ",sort @peerRegsFail) @@ -331,15 +334,6 @@ sub HMinfo_SetFn($$) {######################################################### elsif($cmd eq "models") {##print capability, models---------------------- my %th = CUL_HM_putHash("culHmModel"); my @model; - push @model,sprintf("%4s %-24s %-16s %-13s %-5s %-5s %s" - ," ID" - ,"name" - ,"subType" - ,"supportedMode" - ,"Info" - ,"List" - ,"channels" - ); foreach (keys %th){ my $mode = $th{$_}{rxt}; $mode =~ s/c/config/; @@ -355,17 +349,27 @@ sub HMinfo_SetFn($$) {######################################################### my ($n,$s,$e) = split(":",$_); $chan .= $s.(($s eq $e)?"":("-".$e))." ".$n.", "; } - push @model,sprintf("%4s %-24s %-16s %-13s %-5s %-5s %s" - ,$_ - ,$th{$_}{name} + push @model,sprintf("%-16s %-24s %4s %-13s %-5s %-5s %s" ,$th{$_}{st} + ,$th{$_}{name} + ,$_ ,$mode ,$th{$_}{cyc} ,$list ,$chan ); } - $ret = $cmd.($filter?" filtered":"").":$filter\n ".join"\n ",grep(/$filter/,sort @model); + $ret = $cmd.($filter?" filtered":"").":$filter\n " + .sprintf("%-16s %-24s %4s %-13s %-5s %-5s %s\n " + ,"subType" + ,"name" + ,"ID" + ,"supportedMode" + ,"Info" + ,"List" + ,"channels" + ) + .join"\n ",grep(/$filter/,sort @model); } elsif($cmd eq "help") { $ret = " Unknown argument $cmd, choose one of " @@ -476,114 +480,105 @@ sub HMinfo_post($) {###########################################################

      HMinfo

        - HMinfo is a module that shall support in getting an overview of HM - installation and settings. It also allows some HM wide commands such - as store all collected register settings. -
        + HMinfo is a module that shall support in getting an overview of + eQ-3 HomeMatic devices as defines in CUL_HM. + It also allows some HM wide commands such + as store all collected register settings.

        + Commands will be executed on all HM entities of the installation. If applicable and evident execution is restricted to related entities. - This means that rssi is only executed on devices, not in channels. - Channels never have rssi values.
        - Filter can be applied as following:
        - set <name> <cmd> <filter> [<param>]
        - whereby the filter is has the two segments
        - [-dcasev] [-f <filter>]
        - with filter for types
        -
      • - d - device :include devices
        - c - channels :include channels
        - v - virtual :supress fhem virtual
        - p - physical :supress physical
        - a - aktor :supress actor
        - s - sensor :supress sensor
        - e - empty :include results even if requested fields are empty
        -
      • - and/or a filter for names:
        -
      • - -f - filter :regexp to filter entity names
        -
      • - example:
        -
      • - set hm param -d -f dim state # display param 'state' for all devices whos name contains dim - set hm param -c -f ^dimUG$ peerList # display param 'peerList' for all channels whos name is dimUG - set hm param -dcv expert # get attribut expert for all channels,devices or virtuals -
      • + This means that rssi is executed only on devices, never channels since + they never have support rssi values.

        + Filter +
          can be applied as following:

          + set <name> <cmd> <filter> [<param>]
          + whereby filter has two segments, typefilter and name filter
          + [-dcasev] [-f <filter>]

          + filter for types
          +
            +
          • d - device :include devices
          • +
          • c - channels :include channels
          • +
          • v - virtual :supress fhem virtual
          • +
          • p - physical :supress physical
          • +
          • a - aktor :supress actor
          • +
          • s - sensor :supress sensor
          • +
          • e - empty :include results even if requested fields are empty
          • +
          + and/or a filter for names:
          +
            +
          • -f - filter :regexp to filter entity names
          • +
          + Example:
          +
            + set hm param -d -f dim state # display param 'state' for all devices whos name contains dim
            + set hm param -c -f ^dimUG$ peerList # display param 'peerList' for all channels whos name is dimUG
            + set hm param -dcv expert # get attribut expert for all channels,devices or virtuals
            +
          +

        Define
          - define <name> HMinfo
          + define <name> HMinfo
          + Just one entity needs to be defines, no parameter are necessary.

        Set - even though the commands are more a get funktion they are implemented - as set to allow simple web interface usage
          -
        • models
          -
        • list all HM models that are supported in FHEM -
        • - -
        • param <name> <name>...
          -
        • returns a table parameter values (attribute, readings,...) - for all entities as a table -
        • - -
        • regCheck
          -
        • performs a consistancy check on register readings for completeness -
        • - -
        • peerCheck
          -
        • performs a consistancy check on peers. If a peer is set in one channel - this funktion will search wether the peer also exist on the opposit side. -
        • - -
        • configCheck
          -
        • performs a consistancy check of HM settings. It includes regCheck and peerCheck -
        • - -
        • peerXref
          -
        • provides a cross-reference on peerings, a kind of who-with-who summary over HM -
        • - -
        • saveConfig
          -
        • performs a save for all HM register setting. -
        • - -
        • clearProtocol
          -
        • executes a set clear msgEvents on all HM devices -
        • - -
        • clearReadings
          -
        • executes a set clear readings on all HM devices -
        • - -
        • clearRssi
          -
        • executes a set clear rssi on all HM devices -
        • - -
        • autoReadReg
          -
        • stimulates a read of the configuration for the devices. -
        • - -
        • sys
          -
        • + even though the commands are more a get funktion they are implemented + as set to allow simple web interface usage
          +
            +
          • models
            + list all HM models that are supported in FHEM +
          • +
          • param <name> <name>...
            + returns a table parameter values (attribute, readings,...) + for all entities as a table +
          • +
          • regCheck
            + performs a consistancy check on register readings for completeness +
          • +
          • peerCheck
            + performs a consistancy check on peers. If a peer is set in one channel + this funktion will search wether the peer also exist on the opposit side. +
          • +
          • configCheck
            + performs a consistancy check of HM settings. It includes regCheck and peerCheck +
          • +
          • peerXref
            + provides a cross-reference on peerings, a kind of who-with-who summary over HM +
          • +
          • saveConfig
            + performs a save for all HM register setting. +
          • +
          • clearProtocol
            + executes a set clear msgEvents on all HM devices +
          • +
          • clearReadings
            + executes a set clear readings on all HM devices +
          • +
          • clearRssi
            + executes a set clear rssi on all HM devices +
          • +
          • autoReadReg
            + stimulates a read of the configuration for the devices. +
          • +
          • sys
            +
          • +

        Get -
          - N/A -
        +
          N/A


        Attributes -
          - N/A -
        +
          N/A
      =end html =cut diff --git a/fhem/FHEM/HMConfig.pm b/fhem/FHEM/HMConfig.pm index 22de360b1..3bc92ba7f 100644 --- a/fhem/FHEM/HMConfig.pm +++ b/fhem/FHEM/HMConfig.pm @@ -752,13 +752,13 @@ my %culHmSubTypeSets = (# channels of this subtype up => "[] [ontime] [ramptime]...", down => "[] [ontime] [ramptime]..." }, - remote =>{ peerChan => " device ... [single|dual] [set|unset] [actor|remote|both]",}, - threeStateSensor =>{ peerChan => " device ... single [set|unset] [actor|remote|both]",}, - virtual =>{ peerChan => " device ... [single|dual] [set|unset] [actor|remote|both]", + remote =>{ peerChan => " ... [single|dual] [set|unset] [actor|remote|both]",}, + threeStateSensor =>{ peerChan => " ... single [set|unset] [actor|remote|both]",}, + virtual =>{ peerChan => " ... [single|dual] [set|unset] [actor|remote|both]", press => "[long|short]...", valvePos => "position", },#acting as TC smokeDetector =>{ test => "", alarmOn=>"", alarmOff=>"", - peerChan => " device ... single [set|unset] actor",}, + peerChan => " ... single [set|unset] actor",}, winMatic =>{ matic => "", keydef => " ", create => "" }, @@ -779,9 +779,7 @@ my %culHmModelSets = (# channels of this subtype------------- "HM-PB-4DIS-WM"=>{text => " [on|off] "}, "HM-OU-LED16" =>{led =>"[off|red|green|orange]" , ilum =>"[0-15] [0-127]" }, - "HM-OU-CFM-PL" =>{led => "[,..]", - playTone => "[,..]", - press => "[long|short] [on|off] ..."}, + "HM-OU-CFM-PL" =>{press => "[long|short] [on|off] ..."}, "HM-Sys-sRP-Pl"=>{setRepeat => "[no1..36] [bdcast-yes|no]"}, ); # clones- - - - - - - - - - - - - - - - - @@ -791,7 +789,7 @@ $culHmModelSets{"HM-RC-19-SW"} = $culHmModelSets{"HM-RC-19"}; my %culHmChanSets = ( "HM-CC-TC02" =>{ - peerChan => " device ... single [set|unset] [actor|remote|both]", + peerChan => " ... single [set|unset] [actor|remote|both]", "day-temp" => "[on,off,6.0..30.0]", "night-temp" => "[on,off,6.0..30.0]", "party-temp" => "[on,off,6.0..30.0]", @@ -811,6 +809,8 @@ my %culHmChanSets = ( sysTime => "" }, "HM-SEC-WIN01"=>{ stop =>"", level =>" ..."}, + "HM-OU-CFM-PL01" =>{led => "[,...] []"}, + "HM-OU-CFM-PL02" =>{playTone => "[,...] []"}, ); # clones- - - - - - - - - - - - - - - - - $culHmChanSets{"HM-CC-TC00"} = $culHmChanSets{"HM-CC-TC02"};