diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index d0dc654e7..950720528 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -17,25 +17,29 @@ my $cryptFunc = ($@)?0:1; # ========================import constants===================================== my $culHmModel =\%HMConfig::culHmModel; + my $culHmRegDefShLg =\%HMConfig::culHmRegDefShLg; my $culHmRegDefine =\%HMConfig::culHmRegDefine; my $culHmRegGeneral =\%HMConfig::culHmRegGeneral; my $culHmRegType =\%HMConfig::culHmRegType; my $culHmRegModel =\%HMConfig::culHmRegModel; my $culHmRegChan =\%HMConfig::culHmRegChan; + my $culHmGlobalGets =\%HMConfig::culHmGlobalGets; my $culHmVrtGets =\%HMConfig::culHmVrtGets; my $culHmSubTypeGets =\%HMConfig::culHmSubTypeGets; my $culHmModelGets =\%HMConfig::culHmModelGets; -my $culHmGlobalSetsDevice =\%HMConfig::culHmGlobalSetsDevice; + my $culHmSubTypeDevSets =\%HMConfig::culHmSubTypeDevSets; my $culHmGlobalSetsChn =\%HMConfig::culHmGlobalSetsChn; +my $culHmReglSets =\%HMConfig::culHmReglSets; my $culHmGlobalSets =\%HMConfig::culHmGlobalSets; my $culHmGlobalSetsVrtDev =\%HMConfig::culHmGlobalSetsVrtDev; my $culHmSubTypeSets =\%HMConfig::culHmSubTypeSets; my $culHmModelSets =\%HMConfig::culHmModelSets; my $culHmChanSets =\%HMConfig::culHmChanSets; my $culHmFunctSets =\%HMConfig::culHmFunctSets; + my $culHmBits =\%HMConfig::culHmBits; my $culHmCmdFlags =\@HMConfig::culHmCmdFlags; my $K_actDetID ="000000"; @@ -3844,9 +3848,16 @@ sub CUL_HM_Get($@) {#+++++++++++++++++ get command+++++++++++++++++++++++++++++ push @arr,"$_ $culHmSubTypeGets->{$st}{$_}" foreach (keys %{$culHmSubTypeGets->{$st}}); push @arr,"$_ $culHmModelGets->{$md}{$_}" foreach (keys %{$culHmModelGets->{$md}}); my @arr1; - if( !$roleV) {foreach(keys %{$culHmGlobalSets} ){push @arr1,"$_ ".$culHmGlobalSets->{$_} }}; + if ($hash->{helper}{regLst}){ + foreach my $rl(grep /./,split(",",$hash->{helper}{regLst})){ + next if (!defined $culHmReglSets->{$rl}); + foreach(keys %{$culHmReglSets->{$rl}} ){push @arr1,"$_:".$culHmReglSets->{$rl}{$_} }; + } + } + else{#ignore e.g. for virtuals + } + if( !$roleV &&($roleD || $roleC) ){foreach(keys %{$culHmGlobalSets} ){push @arr1,"$_:".$culHmGlobalSets->{$_} }}; if(($st eq "virtual"||!$st) && $roleD){foreach(keys %{$culHmGlobalSetsVrtDev} ){push @arr1,"$_ ".$culHmGlobalSetsVrtDev->{$_} }}; - if( !$roleV && $roleD){foreach(keys %{$culHmGlobalSetsDevice} ){push @arr1,"$_ ".$culHmGlobalSetsDevice->{$_} }}; if( !$roleV && $roleD){foreach(keys %{$culHmSubTypeDevSets->{$st}}){push @arr1,"$_ ".${$culHmSubTypeDevSets->{$st}}{$_}}}; if( !$roleV && $roleC){foreach(keys %{$culHmGlobalSetsChn} ){push @arr1,"$_ ".$culHmGlobalSetsChn->{$_} }}; if( $culHmSubTypeSets->{$st} && $roleC){foreach(keys %{$culHmSubTypeSets->{$st}} ){push @arr1,"$_ ".${$culHmSubTypeSets->{$st}}{$_} }}; @@ -3970,14 +3981,13 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ my $fkt = $hash->{helper}{fkt}?$hash->{helper}{fkt}:""; my $oCmd = $cmd;# we extend press to press/L/S if press is defined - if ( $cmd =~ m/^press/){ - $cmd = (InternalVal($name,"peerList",""))?"press":"?"; + if ( $cmd =~ m/^press/){# substitude pressL/S with press for cmd search + $cmd = (InternalVal($name,"peerList","")) ? "press" : "?"; } my $h = undef; $h = $culHmGlobalSets->{$cmd} if( !$roleV &&($roleD || $roleC)); $h = $culHmGlobalSetsVrtDev->{$cmd} if(!defined($h) &&( $roleV || !$st) && $roleD); - $h = $culHmGlobalSetsDevice->{$cmd} if(!defined($h) && !$roleV && $roleD); $h = $culHmSubTypeDevSets->{$st}{$cmd}if(!defined($h) && !$roleV && $roleD); $h = $culHmGlobalSetsChn->{$cmd} if(!defined($h) && !$roleV && $roleC); $h = $culHmSubTypeSets->{$st}{$cmd} if(!defined($h) && $culHmSubTypeSets->{$st} && $roleC); @@ -3986,6 +3996,14 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ $h = $culHmChanSets->{$md.$chn}{$cmd} if(!defined($h) && $culHmChanSets->{$md.$chn} && $roleC); $h = $culHmFunctSets->{$fkt}{$cmd} if(!defined($h) && $culHmFunctSets->{$fkt}); + if( !defined($h) && $hash->{helper}{regLst}){ + foreach my $rl(grep /./,split(",",$hash->{helper}{regLst})){ + next if (!defined $culHmReglSets->{$rl}); + $h = $culHmReglSets->{$rl}{$cmd}; + last if (defined($h)); + } + } + $cmd = $oCmd;# necessary for press/S/L - check better implementation my @h; @@ -3997,9 +4015,16 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ } elsif(!defined($h)) { ### unknown - return the commandlist my @arr1 = (); + if ($hash->{helper}{regLst}){ + foreach my $rl(grep /./,split(",",$hash->{helper}{regLst})){ + next if (!defined $culHmReglSets->{$rl}); + foreach(keys %{$culHmReglSets->{$rl}} ){push @arr1,"$_:".$culHmReglSets->{$rl}{$_} }; + } + } + else{#ignore e.g. for virtuals + } if( !$roleV &&($roleD || $roleC) ){foreach(keys %{$culHmGlobalSets} ){push @arr1,"$_:".$culHmGlobalSets->{$_} }}; if(( $roleV||!$st) && $roleD){foreach(keys %{$culHmGlobalSetsVrtDev} ){push @arr1,"$_:".$culHmGlobalSetsVrtDev->{$_} }}; - if( !$roleV && $roleD){foreach(keys %{$culHmGlobalSetsDevice} ){push @arr1,"$_:".$culHmGlobalSetsDevice->{$_} }}; if( !$roleV && $roleD){foreach(keys %{$culHmSubTypeDevSets->{$st}}){push @arr1,"$_:".${$culHmSubTypeDevSets->{$st}}{$_}}}; if( !$roleV && $roleC){foreach(keys %{$culHmGlobalSetsChn} ){push @arr1,"$_:".$culHmGlobalSetsChn->{$_} }}; if( $culHmSubTypeSets->{$st} && $roleC){foreach(keys %{$culHmSubTypeSets->{$st}} ){push @arr1,"$_:".${$culHmSubTypeSets->{$st}}{$_} }}; @@ -4054,13 +4079,16 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ else{ $usg =~ s/ templateDel//;#not an option } - if ( $usg =~ m/ press/){ + if ( $usg =~ m/ (press|event|trgPress|trgEvent)/){ my $peers = join",",grep/./,split",",InternalVal($name,"peerList",""); if ($peers){ $usg =~ s/ press/ press pressS:$peers pressL:$peers/g; + $usg =~ s/ (trgPress.:)-peer-/ $1/g; + $usg =~ s/ (trgPress.:)/ $1all,$peers/g; } else{#remove command - $usg =~ s/ press[SL]//g; + $usg =~ s/ (press|event)[SL]//g; + $usg =~ s/ trg(Press|Event)[SL]//g; } } return $usg; @@ -4167,7 +4195,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ my $state = "set_".join(" ", @a[1..(int(@a)-1)]); return "device on readonly. $cmd disabled" if($activeCmds{$cmd} && CUL_HM_getAttrInt($name,"readOnly") ); - + if ($cmd eq "raw") { ##################################################### return "Usage: set $a[0] $cmd data [data ...]" if(@a < 3); $state = ""; @@ -5628,6 +5656,87 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ } } + elsif($cmd =~ m/^(press|event)(S|L)/) { ###################################### + #press =>"-peer- [-repCount(long only)-] [-repDelay-] ..." + #event =>"-peer- -cond- [-repCount(long only)-] [-repDelay-] ..." + return "no peer defined" if (!defined $a[2]); + my ($trig,$type,$peer) = ($1,$2,$a[2]); + my ($cond,$repCnt,$repDly,$mode,$modeCode) = (0,0,0); + return "$peer not peered to $name" if (InternalVal($name,"peerList","") !~ m/$peer/); + if ($trig eq "event"){ + return "condition missing" if (!defined $a[3]); + ($cond,$repCnt,$repDly,$modeCode) = ($a[3],$a[4],$a[5],"41"); + return "condition $cond out of range. Chooose 0...255" if ($cond < 0 || $cond > 255); + $cond = sprintf("%02X",$cond); + } + else{ + ($repCnt,$repDly,$modeCode,$cond) = ($a[3],$a[4],"40",""); + } + + if ($type eq "L"){ + $mode = 64; + $repCnt = 1 if (!defined $repCnt ); + $repDly = 0.25 if (!defined $repDly ); + return "repeatCount $repCnt invalid. use value 1 - 255" if ($repCnt < 1 || $repCnt>255 ); + return "repDelay $repDly invalid. use value 0.25 - 1.00" if ($repDly < 0.25 || $repDly>1 ); + } + else{#short + ($repCnt,$repDly,$mode) = (0,0,0); + } + + $hash->{helper}{count} = (!$hash->{helper}{count} ? 1 + : $hash->{helper}{count}+1)%256; + if ($st eq 'virtual'){#serve all peers of virtual button + my @peerLchn = split(',',AttrVal($name,"peerIDs","")); + my @peerList = map{substr($_,0,6)} @peerLchn; + @peerList = grep !/000000/,grep !/^$/,CUL_HM_noDup(@peerList); + my $pc = sprintf("%02X%02X",hex($chn)+$mode,$hash->{helper}{count});# msg end + my $snd = 0; + foreach my $peer (sort @peerList){ + my ($pHash,$peerFlag,$rxt); + $pHash = CUL_HM_id2Hash($peer); + next if ( !$pHash + || !$pHash->{helper}{role} + || !$pHash->{helper}{role}{prs}); + $rxt = CUL_HM_getRxType($pHash); + $peerFlag = ($rxt & 0x02)?"B4":"A4";#burst + CUL_HM_PushCmdStack($pHash,"++${peerFlag}$modeCode$dst$peer$pc"); + $snd = 1; + foreach my $pCh(grep /$peer/,@peerLchn){ + my $n = CUL_HM_id2Name($pCh); + next if (!$n); + $n =~ s/_chn-\d\d$//; + delete $defs{$n}{helper}{dlvl};#stop desiredLevel supervision + CUL_HM_stateUpdatDly($n,10); + } + if ($rxt & 0x80){#burstConditional + CUL_HM_SndCmd($pHash, "++B112$id".substr($peer,0,6)); + } + else{ + CUL_HM_ProcessCmdStack($pHash); + } + } + if(!$snd){# send 2 broadcast if no relevant peers + CUL_HM_SndCmd($hash,"++8440${dst}000000$pc"); + } + } + else{#serve internal channels for actor + my ($pDev,$pCh) = unpack 'A6A2',CUL_HM_name2Id($peer,$devHash)."01"; + return "button cannot be identified" if (!$pCh); + delete $hash->{helper}{dlvl};#stop desiredLevel supervision + my $msg = sprintf("3E%s%s%s%s%02X%02X", + $id,$dst,$pDev,$modeCode + ,hex($pCh)+$mode + ,$hash->{helper}{count} + ,$cond); + for (my $cnt = 1;$cnt < $repCnt; $cnt++ ){ + CUL_HM_SndCmd($hash, "++80$msg"); # send direct Wont work for burst! + select(undef, undef, undef, $repDly); + } + CUL_HM_PushCmdStack($hash, "++${flag}$msg"); # send thru commandstack + CUL_HM_stateUpdatDly($name,10);#check status after 10 sec + } + } elsif($cmd =~ m/^press(.*)/) { ############################################## # [long|short] [] [] [] [] ... my ($repCnt,$repDly,$forceTiming,$mode) = (0,0,0,0); @@ -5723,6 +5832,29 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ CUL_HM_PushCmdStack($hash, "++${flag}$msg"); # send thru commandstack } } + elsif($cmd =~ m/^trg(Press|Event)(.)/) { #################################### + $state = ""; + my ($trig,$type) = ($1,$2); + my $peer = $a[2]; + return "$peer not defined" if(!defined$defs{$peer} && $peer ne "all" ); + my @peers; + if ($peer eq "all"){ + @peers = grep/./,split",",InternalVal($name,"peerList",""); + } + else{ + push @peers,$a[2]; + } + + if($trig eq "Event"){ + return "no condition level defined" if (!defined $a[3]); + return "condition $a[3] out of range. limit to 0..255" if ($a[3]<0 || $a[3]>255); + } + foreach my $peerSet(@peers){ + next if (!defined($peerSet) || !defined($defs{$peerSet}) ); + if($trig eq "Event"){CUL_HM_Set($defs{$peerSet},$peerSet,"event$type",$name,$a[3]);} + else {CUL_HM_Set($defs{$peerSet},$peerSet,"press$type",$name);} + } + } elsif($cmd eq "fwUpdate") { ################################################# if ($a[2] eq "onlyEnterBootLoader") { Log3 $name,2,"CUL_HM entering bootloader for $name"; @@ -8126,14 +8258,13 @@ sub CUL_HM_getChnList($){ # get reglist assotioted with a channel if ($hash->{helper}{role}{dev}){ $chRl = ",0"; - if ($hash->{helper}{role}{chn}){# device is added. if we ar channel add this as well. - $chnN = 1; - } + $chnN = ($hash->{helper}{role}{chn})? 1 # device is added. if we ar channel add this as well. + : "-"; } foreach my $mLst(@mLstA){ - my ($Lst,$cLst) = split(":",$mLst); - $cLst = $chnN if (!$cLst); - next if ($Lst eq "p");# no list, just peers + my ($Lst,$cLst) = split(":",$mLst.":-"); + $cLst = $chnN if ($cLst eq "-"); + next if ($Lst eq "p" || $cLst eq "-");# no list, just peers foreach my $aaa (grep /$chnN/,split('\.',$cLst)){ $Lst .= "p" if($Lst == 3 || $Lst == 4 || $aaa =~ m/p/); $Lst =~ s/ //g; @@ -9855,36 +9986,37 @@ sub CUL_HM_tempListTmpl(@) { ##################################################
    set <name> on-till 20:32:10
Currently a max of 24h is supported with endtime.
-
  • press <[short|long]> <[on|off|<peer>]> <btnNo>
    +
  • pressL <peer> [<repCount>] [<repDelay>]
    simulate a press of the local button or direct connected switch of the actor.
    - [short|long] select simulation of short or long press of the button. - Parameter is optional, short is default
    - [on|off|<peer>] is relevant for devices with direct buttons per channel (blind or dimmer). - Those are available for dimmer and blind-actor, usually not for switches
    <peer> allows to stimulate button-press of any peer of the actor. i.e. if the actor is peered to any remote, virtual or io (HMLAN/CUL) press can trigger the action defined.
    - [noBurst] relevant for virtual only
    - It will cause the command being added to the command queue of the peer. No burst is - issued subsequent thus the command is pending until the peer wakes up. It therefore - delays the button-press, but will cause less traffic and performance cost.
    - Example: + <repCount> number of automatic repetitions.
    + <repDelay> timer between automatic repetitions.
    + Example: - set actor press # trigger short of internal peer self assotiated to the channel
    - set actor press long # trigger long of internal peer self assotiated to the channel
    - set actor press on # trigger short of internal peer self related to 'on'
    - set actor press long off # trigger long of internal peer self related to 'of'
    - set actor press long FB_Btn01 # trigger long peer FB button 01
    - set actor press long FB_chn-8 # trigger long peer FB button 08
    - set actor press self01 # trigger short of internal peer 01
    - set actor press fhem02 # trigger short of FHEM channel 2
    + set actor pressL FB_Btn01 # trigger long peer FB button 01
    + set actor pressL FB_chn-8 # trigger long peer FB button 08
    + set actor pressL self01 # trigger short of internal peer 01
    + set actor pressL fhem02 # trigger short of FHEM channel 2
  • -
  • pressL <peer>
    - simulates a long press for a given peer. See press for details -
  • pressS <peer>
    - simulates a long press for a given peer. See press for details + simulates a short press similar to long press +
  • +
  • eventL <peer> <condition> [<repCount>] [<repDelay>]
    + simulate an event of an peer and stimulates the actor.
    + <peer> allows to stimulate button-press of any peer of the actor. + i.e. if the actor is peered to any remote, virtual or io (HMLAN/CUL) + press can trigger the action defined.
    + <codition> the level of the condition
    + Example: + + set actor eventL md 30 # trigger from motion detector with level 30
    +
    +
  • +
  • eventS <peer> <condition>
    + simulates a short event from a peer of the actor. Typically sensor do not send long events.
  • toggle - toggle the Actor. It will switch from any current level to off or from off to 100%
  • @@ -9936,6 +10068,20 @@ sub CUL_HM_tempListTmpl(@) { ################################################## device level with parameter 'protCmdPend'.
      +
    • trgEventS [all|<peer>] <condition>
      + Issue eventS on the peer entity. If all is selected each of the peers will be triggered. See also eventS
      + <condition>: is the condition being transmitted with the event. E.g. the brightness in case of a motion detector. +
    • +
    • trgEventL [all|<peer>] <condition>
      + Issue eventL on the peer entity. If all is selected each of the peers will be triggered. a normal device will not sent event long. See also eventL
      + <condition>: is the condition being transmitted with the event. E.g. the brightness in case of a motion detector. +
    • +
    • trgPressS [all|<peer>]
      + Issue pressS on the peer entity. If all is selected each of the peers will be triggered. See also pressS
      +
    • +
    • trgPressL [all|<peer>]
      + Issue pressL on the peer entity. If all is selected each of the peers will be triggered. See also pressL
      +
    • peerIODev [IO] <btn_no> [set|unset]
      The command is similar to peerChan. While peerChan @@ -9944,82 +10090,82 @@ sub CUL_HM_tempListTmpl(@) { ################################################## An IO device according to eQ3 supports up to 50 virtual buttons. Those will be peered/unpeerd to the actor. press can be used to stimulate the related actions as defined in the actor register. -
    • peerChan <btn_no> <actChan> [single|dual|reverse][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 - confused with pairing.
      - Pairing refers to assign a device to the central.
      - Peering refers to virtally connect two channels.
      - Peering allowes direkt interaction between sender and aktor without - the necessity of a CCU
      - Peering a sender-channel causes the sender to expect an ack from -each- - of its peers after sending a trigger. It will give positive feedback (e.g. LED green) - only if all peers acknowledged.
      - Peering an aktor-channel will setup a parameter set which defines the action to be - taken once a trigger from -this- peer arrived. In other words an aktor will
      - - process trigger from peers only
      - - define the action to be taken dedicated for each peer's trigger
      - An actor channel will setup a default action upon peering - which is actor dependant. - It may also depend whether one or 2 buttons are peered in one command. - A swich may setup oen button for 'on' and the other for 'off' if 2 button are - peered. If only one button is peered the funktion will likely be 'toggle'.
      - The funtion can be modified by programming the register (aktor dependant).
      - - Even though the command is executed on a remote or push-button it will - as well take effect on the actuator directly. Both sides' peering is - virtually independant and has different impact on sender and receiver - side.
      - - Peering of one actuator-channel to multiple sender-channel as - well as one sender-channel to multiple Actuator-channel is - possible.
      - - <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. - 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.
      - - 'reverse' identical to dual - but button order is reverse.
      - - 'single' uses only one button of the sender. It is useful for e.g. for - 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: -
        - set myRemote peerChan 2 mySwActChn single set #peer second button to an actuator channel
        - set myRmtBtn peerChan 0 mySwActChn single set #myRmtBtn is a button of the remote. '0' is not processed here
        - set myRemote peerChan 2 mySwActChn dual set #peer button 3 and 4
        - set myRemote peerChan 3 mySwActChn dual unset #remove peering for button 5 and 6
        - set myRemote peerChan 3 mySwActChn dual unset aktor #remove peering for button 5 and 6 in actor only
        - set myRemote peerChan 3 mySwActChn dual set remote #peer button 5 and 6 on remote only. Link settings il mySwActChn will be maintained
        -
      -
    • + +
    • peerChan <btn_no> <actChan> [single|dual|reverse][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 + confused with pairing.
      + Pairing refers to assign a device to the central.
      + Peering refers to virtally connect two channels.
      + Peering allowes direkt interaction between sender and aktor without + the necessity of a CCU
      + Peering a sender-channel causes the sender to expect an ack from -each- + of its peers after sending a trigger. It will give positive feedback (e.g. LED green) + only if all peers acknowledged.
      + Peering an aktor-channel will setup a parameter set which defines the action to be + taken once a trigger from -this- peer arrived. In other words an aktor will
      + - process trigger from peers only
      + - define the action to be taken dedicated for each peer's trigger
      + An actor channel will setup a default action upon peering - which is actor dependant. + It may also depend whether one or 2 buttons are peered in one command. + A swich may setup oen button for 'on' and the other for 'off' if 2 button are + peered. If only one button is peered the funktion will likely be 'toggle'.
      + The funtion can be modified by programming the register (aktor dependant).
      + + Even though the command is executed on a remote or push-button it will + as well take effect on the actuator directly. Both sides' peering is + virtually independant and has different impact on sender and receiver + side.
      + + Peering of one actuator-channel to multiple sender-channel as + well as one sender-channel to multiple Actuator-channel is + possible.
      + + <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. + 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.
      + + 'reverse' identical to dual - but button order is reverse.
      + + 'single' uses only one button of the sender. It is useful for e.g. for + 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: +
        + set myRemote peerChan 2 mySwActChn single set #peer second button to an actuator channel
        + set myRmtBtn peerChan 0 mySwActChn single set #myRmtBtn is a button of the remote. '0' is not processed here
        + set myRemote peerChan 2 mySwActChn dual set #peer button 3 and 4
        + set myRemote peerChan 3 mySwActChn dual unset #remove peering for button 5 and 6
        + set myRemote peerChan 3 mySwActChn dual unset aktor #remove peering for button 5 and 6 in actor only
        + set myRemote peerChan 3 mySwActChn dual set remote #peer button 5 and 6 on remote only. Link settings il mySwActChn will be maintained
        +
  • virtual
    @@ -11261,28 +11407,37 @@ sub CUL_HM_tempListTmpl(@) { ##################################################
      set <name> on-till 20:32:10
    Das momentane Maximum für eine Endzeit liegt bei 24 Stunden.
  • -
  • press <[short|long]><[on|off]>
    - press <[short|long]><[noBurst]> - simuliert den Druck auf einen lokalen Knopf oder direkt verbundenen Knopf des Aktors.
    - [short|long] wählt aus ob ein kurzer oder langer Tastendruck simuliert werden soll.
    - [on|off] ist relevant für Geräte mit direkter Bedienung pro Kanal. - Verfügbar für Dimmer und Rollo-Aktoren, normalerweise nicht für Schalter.
    - [noBurst] ist relevant für Peers die bedingte Bursts unterstützen. - Dies bewirkt das der Befehl der Warteliste des Peers zugefügt wird. Ein Burst wird anschließend - nicht ausgeführt da der Befehl wartet bis der Peer aufgewacht ist. Dies führt zu einer - Verzögerung des Tastendrucks, reduziert aber Übertragungs- und Performanceaufwand.
    -
  • -
  • toggle - toggled den Aktor. Schaltet vom aktuellen Level auf - 0% oder von 0% auf 100%
  • - -
  • pressL <peer>
    - Simuliert einen langen Tastendruck für einen angegebenen peer. Siehe press. +
  • pressL <peer> [<repCount>] [<repDelay>]
    + simuliert einen Tastendruck eines lokalen oder anderen peers.
    + <peer> peer auf den der Tastendruck bezogen wird.
    + <repCount> automatische Wiederholungen des long press.
    + <repDelay> timer zwischen den Wiederholungen.
    + Beispiel: + + set actor pressL FB_Btn01 # trigger long peer FB button 01
    + set actor pressL FB_chn-8 # trigger long peer FB button 08
    + set actor pressL self01 # trigger short des internen peers 01
    + set actor pressL fhem02 # trigger short des FHEM channel 2
    +
  • pressS <peer>
    - Simuliert einen kurzen Tastendruck für einen angegebenen peer. Siehe press. + simuliert einen kurzen Tastendruck entsprechend peerL
  • +
  • eventL <peer> <condition> [<repCount>] [<repDelay>]
    + simuliert einen Event mit zusätzlichem Wert.
    + <peer> peer auf den der Tastendruck bezogen wird.
    + <codition>wert des Events, 0..255
    + Beispiel: + + set actor eventL md 30 # trigger vom Bewegungsmelder mit Wert 30
    +
    +
  • +
  • eventS <peer> <condition>
    + simuliert einen kurzen Event eines Peers des actors. Typisch senden Sensoren nur short Events. +

  • +
  • dimmer, blindActuator
    Dimmer können virtuelle Kanäle unterstützen. Diese werden automatisch angelegt falls vorhanden. @@ -11328,6 +11483,20 @@ sub CUL_HM_tempListTmpl(@) { ################################################## den Benutzer ist dazu nötig. Ob Befehle auf Ausführung warten kann auf Geräteebene mit dem Parameter 'protCmdPend' abgefragt werden.
      +
    • trgEventS [all|<peer>] <condition>
      + Initiiert ein eventS fuer die peer entity. Wenn all ausgewählt ist wird das Kommando bei jedem der Peers ausgeführt. Siehe auch eventS
      + <condition>: Ist der Wert welcher mit dem Event versendet wird. Bei einem Bewegungsmelder ist das bspw. die Helligkeit. +
    • +
    • trgEventL [all|<peer>] <condition>
      + Initiiert ein eventL fuer die peer entity. Wenn all ausgewählt ist wird das Kommando bei jedem der Peers ausgeführt. Siehe auch eventL
      + <condition>: is the condition being transmitted with the event. E.g. the brightness in case of a motion detector. +
    • +
    • trgPressS [all|<peer>]
      + Initiiert ein pressS fuer die peer entity. Wenn all ausgewählt ist wird das Kommando bei jedem der Peers ausgeführt. Siehe auch pressS
      +
    • +
    • trgPressL [all|<peer>]
      + Initiiert ein pressL fuer die peer entity. Wenn all ausgewählt ist wird das Kommando bei jedem der Peers ausgeführt. Siehe auch pressL
      +
    • peerChan <btn_no> <actChan> [single|dual|reverse] [set|unset] [both|actor|remote]
      "peerChan" richtet eine Verbindung zwischen Sender-Kanal und