diff --git a/FHEM/10_CUL_HM.pm b/FHEM/10_CUL_HM.pm index 4bed9b0fc..cfd6d52cc 100755 --- a/FHEM/10_CUL_HM.pm +++ b/FHEM/10_CUL_HM.pm @@ -1,4 +1,5 @@ ############################################## +############################################## # CUL HomeMatic handler # $Id$ @@ -941,7 +942,7 @@ sub CUL_HM_Parse($$) {############################## my %colorTable=("00"=>"off","01"=>"red","02"=>"green","03"=>"orange"); my $actColor = $colorTable{$msgState}; $actColor = "unknown" if(!$actColor); - push @event, "color:$actColor"; #todo duplicate + push @event, "color:$actColor"; push @event, "state:$actColor"; } } @@ -1683,7 +1684,7 @@ sub CUL_HM_Get($@) { #+++++++++++++++++ set command+++++++++++++++++++++++++++++++++++++++++++++++++ sub CUL_HM_Set($@) { my ($hash, @a) = @_; - my ($ret, $tval, $rval); #added rval for ramptime by unimatrix + my $ret; return "no set value specified" if(@a < 2); my $name = $hash->{NAME}; @@ -1817,14 +1818,6 @@ sub CUL_HM_Set($@) { } $state = ""; } - elsif($cmd eq "getpair") { ################################################## - CUL_HM_PushCmdStack($hash,'++'.$flag.'01'.$id.$dst.'00040000000000'); - $state = ""; - } - elsif($cmd eq "getdevicepair") { ############################################ - CUL_HM_PushCmdStack($hash,'++'.$flag.'01'.$id.$dst.$chn.'03'); - $state = ""; - } elsif($cmd eq "getSerial") { ################################################ CUL_HM_PushCmdStack($hash,'++'.$flag.'01'.$id.$dst.'0009'); $state = ""; @@ -1849,16 +1842,16 @@ sub CUL_HM_Set($@) { return "unknown peer".$peer if (length($pID) != 8);# peer only to channel my $pCh1 = substr($pID,6,2); my $pCh2 = $pCh1; - if($culHmSubTypeSets{$st}{devicepair}|| - $culHmModelSets{$md}{devicepair}|| - $culHmChanSets{$mdCh}{devicepair}){ + if($culHmSubTypeSets{$st}{peerChan}|| + $culHmModelSets{$md}{peerChan}|| + $culHmChanSets{$mdCh}{peerChan}){ $pCh2 = "00"; # button behavior } CUL_HM_PushCmdStack($hash,'++'.$flag.'01'.$id.$dst.$chn.'01'. substr($pID,0,6).$pCh1.$pCh2); } } - elsif($cmd eq "regBulk"||$cmd eq "getRegRaw") { ######################### reg + elsif($cmd =~ m/^(regBulk|getRegRaw)$/) { ############################### reg my ($list,$addr,$data,$peerID); $state = ""; if ($cmd eq "regBulk"){ @@ -2019,7 +2012,7 @@ sub CUL_HM_Set($@) { CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'02'.$chn.'000000'); $hash = $chnHash; # report to channel if defined } - elsif($cmd eq "on-for-timer"||$cmd eq "on-till") { ########################## + elsif($cmd =~ m/^(on-for-timer|on-till)$/) { ################################ my (undef,undef,$duration,$edate) = @a; #date prepared extention to entdate if ($cmd eq "on-till"){ # to be extended to handle end date as well @@ -2031,7 +2024,7 @@ sub CUL_HM_Set($@) { $duration = $eSec - $ltSec; } return "please enter the duration in seconds" if (!defined ($duration)); - $tval = CUL_HM_encodeTime16($duration);# onTime 0.0..85825945.6, 0=forever + my $tval = CUL_HM_encodeTime16($duration);# onTime 0.0..85825945.6, 0=forever CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'02'.$chn.'C80000'.$tval); $hash = $chnHash; # report to channel if defined } @@ -2044,36 +2037,34 @@ sub CUL_HM_Set($@) { CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'800100FF'); # LEVEL_SET } elsif($cmd eq "unlock") { ################################################### - $tval = (@a > 2) ? int($a[2]) : 0; + my $tval = (@a > 2) ? int($a[2]) : 0; my $delay = ($tval > 0) ? CUL_HM_encodeTime8($tval) : "FF"; # RELOCK_DELAY (FF=never) CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'800101'.$delay);# LEVEL_SET } elsif($cmd eq "open") { ##################################################### - $tval = (@a > 2) ? int($a[2]) : 0; + my $tval = (@a > 2) ? int($a[2]) : 0; my $delay = ($tval > 0) ? CUL_HM_encodeTime8($tval) : "FF"; # RELOCK_DELAY (FF=never) CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'8001C8'.$delay);# OPEN - $state = ""; } elsif($cmd eq "inhibit") { ################################################## return "$a[2] is not on or off" if($a[2] !~ m/^(on|off)$/); my $val = ($a[2] eq "on") ? "01" : "00"; CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.$val.'01'); # SET_LOCK - $state = ""; } elsif($cmd =~ m/^(up|down|pct)$/) { ######################################### - my $lvl; - if ($cmd eq "pct"){ - $lvl = $a[1]; - } - else{#dim [|up|down] ... [ontime] [ramptime] + my ($lvl,$tval,$rval) = ($a[1],"",""); + if ($cmd ne "pct"){#dim [|up|down] ... [ontime] [ramptime] shift @a; # align array with 'pct' $lvl = (defined $a[1])?$a[1]:10; $lvl = -1*$lvl if ($cmd eq "down"); $lvl += CUL_HM_getChnLvl($name); } $lvl = ($lvl > 100)?100:(($lvl < 0)?0:$lvl); - $tval = $a[2]?CUL_HM_encodeTime16($a[2]):"FFFF";# onTime 0.0..6709248, 0=forever - $rval = CUL_HM_encodeTime16((@a > 3)?$a[3]:2.5); # rampTime 0.0..6709248, 0=immediate + if ($st eq "dimmer"){# at least blind cannot stand ramp time... + $tval = $a[2]?CUL_HM_encodeTime16($a[2]):"FFFF";# onTime 0.05..85825945.6, 0=forever + $rval = CUL_HM_encodeTime16((@a > 3)?$a[3]:2.5);# rampTime 0.0..85825945.6, 0=immediate + } + Log 1,"General test blind: $st time:$tval ramp:$rval"; CUL_HM_PushCmdStack($hash,sprintf("++%s11%s%s02%s%02X%s%s", $flag,$id,$dst,$chn,$lvl*2,$rval,$tval)); if (defined $hash->{READINGS}{"virtLevel"}{VAL}){ @@ -2192,7 +2183,7 @@ sub CUL_HM_Set($@) { CUL_HM_PushCmdStack($hash,sprintf("++%s11%s%s8012%s%04X%02X", $flag,$id,$dst,$text,$symbAdd,$beepBack)); } - elsif($cmd eq "alarm"||$cmd eq "service") { ################################# + elsif($cmd =~ m/^(alarm|service)$/) { ####################################### return "$a[2] must be below 255" if ($a[2] >255 ); $chn = 18 if ($chn eq "01"); my $subtype = ($cmd eq "alarm")?"81":"82"; @@ -2406,8 +2397,8 @@ sub CUL_HM_Set($@) { $pressCnt)); } } - elsif($cmd eq "devicepair") { ############################################### - #devicepair device ... [single|dual] [set|unset] [actor|remote|both] + elsif($cmd =~ m/^(devicepair|peerChan)$/) { ################################# + #peerChan device ... [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); @@ -2760,10 +2751,8 @@ sub CUL_HM_eventP($$) {#handle protocol events my $delMsgSum; $nAttr->{protCmdDel} = 0 if(!$nAttr->{protCmdDel}); $nAttr->{protCmdDel} += scalar @{$hash->{cmdStack}} if ($hash->{cmdStack}); - my $burstEvt = ($hash->{helper}{burstEvtCnt})? - $hash->{helper}{burstEvtCnt}:0; - $hash->{protState} = "CMDs_done". - (($burstEvt)?("_events:".$burstEvt):""); + $hash->{protState} = "CMDs_done".($hash->{helper}{burstEvtCnt}? + ("_events:".$hash->{helper}{burstEvtCnt}):""); } } sub CUL_HM_respPendRm($) {#del response related entries in messageing entity @@ -2795,9 +2784,8 @@ sub CUL_HM_respPendTout($) { if ((CUL_HM_getRxType($hash) & 0x03) == 0){#to slow for wakeup and config delete($hash->{cmdStack}); delete($hash->{protCmdPend}); - my $burstEvt = $hash->{helper}{burstEvtCnt}? - ("_events:".$hash->{helper}{burstEvtCnt}):""; - $hash->{protState} = "CMDs_done".$burstEvt; + $hash->{protState} = "CMDs_done".($hash->{helper}{burstEvtCnt}? + ("_events:".$hash->{helper}{burstEvtCnt}):""); } CUL_HM_respPendRm($hash); CUL_HM_ProcessCmdStack($hash); # continue processing commands @@ -2844,10 +2832,8 @@ sub CUL_HM_ProcessCmdStack($) { delete($hash->{cmdStack}); delete($hash->{protCmdPend}); #-- update info --- - my $burstEvt = ($hash->{helper}{burstEvtCnt})? - $hash->{helper}{burstEvtCnt}:0; - $hash->{protState} = "CMDs_done". - (($burstEvt)?("_events:".$burstEvt):""); + $hash->{protState} = "CMDs_done".($hash->{helper}{burstEvtCnt}? + ("_events:".$hash->{helper}{burstEvtCnt}):""); } } return $sent; @@ -2906,9 +2892,8 @@ sub CUL_HM_Resend($) {#resend a message if there is no answer delete($hash->{cmdStack}); delete($hash->{protCmdPend}); CUL_HM_respPendRm($hash); - my $burstEvt = $hash->{helper}{burstEvtCnt}? - ("_events:".$hash->{helper}{burstEvtCnt}):""; - $hash->{protState} = "CMDs_done".$burstEvt; + $hash->{protState} = "CMDs_done".($hash->{helper}{burstEvtCnt}? + ("_events:".$hash->{helper}{burstEvtCnt}):""); readingsSingleUpdate($hash,"state","MISSING ACK",1); } else { @@ -3888,17 +3873,6 @@ sub CUL_HM_putHash($) {# provide data for HMinfo configuration for additional peers.
The command is a shortcut for a selection of other commands. -
  • getdevicepair
    - will read the peers (see devicepair) that are assigned to a channel. - This command needs to be executed per channel. Information will be - stored in the field Peers of the channel (see devicepair for specials - about single-channel deivces).
    For sender the same procedure as - described in devicepair is necessary to get a reading. Also note that - a proper diaplay will only be possible if define per channel (button) - was done - see define.
  • -
  • getpair
    - read pair information of the device. See also pair
  • getRegRaw [List0|List1|List2|List3|List4|List5|List6] <peerChannel>
    @@ -3966,13 +3940,13 @@ sub CUL_HM_putHash($) {# provide data for HMinfo See also getPair and unpair.

  • Don't confuse pair (to a central) with peer (channel to channel) with - devicepair.
    + peerChan.
  • peerBulk
    peerBulk will add peer channels to the channel. All channels in the list will be added. This includes that the parameter and behavior defined for this 'link' will return to the defaults. peerBulk is only meant to add peers. More suffisticated funktionality as provided by - devicepair is not supported. peerBulk + peerChan is not supported. peerBulk will only add channels in 'single' button mode.
    Also note that peerBulk will not delete any existing peers, just add and re-add given peers.
    @@ -4017,7 +3991,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo <value> is the data in human readable manner that will be written to the register.
    <peerChannel> is required if this register is defined on a per - 'devicepair' base. It can be set to '0' other wise.See getRegRaw for full description
    Supported register for a device can be explored using
      set regSet ? 0 0
    @@ -4050,7 +4024,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
      define vRemote CUL_HM 100000 # the selected HMid must not be in use
      set vRemote virtual 20 # define 20 button remote controll
      - set vRemote_Btn4 devicepair 0 <actorchannel> # pairs Button 4 and 5 to the given channel
      + set vRemote_Btn4 peerChan 0 <actorchannel> # peers Button 4 and 5 to the given channel
      set vRemote_Btn4 press
      set vRemote_Btn5 press long
    @@ -4118,34 +4092,41 @@ sub CUL_HM_putHash($) {# provide data for HMinfo activate learn mode. Whether commands are pending is reported on device level with parameter 'protCmdPend'.
      -
    • devicepair <btn_no> <hmDevice> [single|dual] - [set|unset] [actor|remote]
      - - Devicepair will establish a connection between a sender-channel and - an actuator-channel called link in HM nomenclatur. Trigger from - sender-channel, e.g. button press, will be processed by the - actuator-channel without CCU interaction. Sender-channel waits for an - acknowledge of each actuator paired to it. Positive indication will be - given once all actuator responded.
      - - Sender must be set into learning mode after command execution. FHEM - postpones the commands until then.
      - - devicepair can be repeated for an existing devicepair. This will cause - parameter reset to HM defaults for this link.
      +
    • peerChan <btn_no> <hmDevice> [single|dual] + [set|unset] [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' pairing is + as well take effect on the actuator directly. Both sides' peering is virtually independant and has different impact on sender and receiver side.
      - Devicepairing of one actuator-channel to multiple sender-channel as + Peering of one actuator-channel to multiple sender-channel as well as one sender-channel to multiple Actuator-channel is possible.
      - <hmDevice> is the actuator-channel to be paired.
      + <hmDevice> is the actuator-channel to be peered.
      - <btn_no> is the sender-channel (button) to be paired. If + <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.
      @@ -4163,23 +4144,23 @@ 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' will setup pairing for the channels
      + 'set' will setup peering for the channels
      - 'unset' will remove the pairing 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 pairing on the 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.
      Example:
        - set myRemote devicepair 2 mySwActChn single set # pair second button to an actuator channel
        - set myRmtBtn devicepair 0 mySwActChn single set #myRmtBtn is a button of the remote. '0' is not processed here
        - set myRemote devicepair 2 mySwActChn dual set #pair button 3 and 4
        - set myRemote devicepair 3 mySwActChn dual unset #remove pairing for button 5 and 6
        - set myRemote devicepair 3 mySwActChn dual unset aktor #remove pairing for button 5 and 6 in actor only
        - set myRemote devicepair 3 mySwActChn dual set remote #pair button 5 and 6 on remote only. Link settings il mySwActChn will be maintained
        + 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
    • @@ -4188,7 +4169,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
    • virtual
        -
      • devicepair see remote
      • +
      • peerChan see remote
      • press [long|short] simulates a button press short (default) or long. Note that the current implementation will not specify the duration for long. Only one trigger @@ -4198,13 +4179,13 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
      • smokeDetector
        Note: All these commands work right now only if you have more then one - smoekDetector, and you paired them to form a group. For issuing the + smoekDetector, and you peered them to form a group. For issuing the commands you have to use the master of this group, and currently you have to guess which of the detectors is the master.
        smokeDetector can be setup to teams using - devicepair. You need to pair all - team-members to the master. Don't forget to also devicepair the master - itself to the team - i.e. pair it to itself! doing that you have full + peerChan. You need to peer all + team-members to the master. Don't forget to also peerChan the master + itself to the team - i.e. peer it to itself! doing that you have full controll over the team and don't need to guess.
        • test - execute a network test
        • @@ -4339,7 +4320,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo [sec]: Sets the delay in seconds after the lock automatically locked again.
          0 - 65535 seconds
        • inhibit [on|off]
          - Block / unblock all directly paired remotes and the hardware buttons of the + Block / unblock all directly peered remotes and the hardware buttons of the keyMatic. If inhibit set on, the door lock drive can be controlled only by FHEM.

          Examples: @@ -4416,7 +4397,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo entity.
          Target of the data is ONLY the HM-device information which is located IN the HM device. Explicitely this is the peer-list and the register. - With the register also the pairing is included.
          + With the register also the peering is included.
          The file is readable and editable by the user. Additionaly timestamps are stored to help user to validate.
          Restrictions:
          diff --git a/FHEM/HMConfig.pm b/FHEM/HMConfig.pm index b5299bec1..fe9c01b85 100644 --- a/FHEM/HMConfig.pm +++ b/FHEM/HMConfig.pm @@ -324,6 +324,11 @@ my %culHmRegDefine = ( batDefectLimit =>{a=> 19.0,s=>1.0,l=>0,min=>0.1,max=>2 ,c=>'factor' ,f=>100 ,u=>'Ohm' ,d=>1,t=>"batterie defect detection"}, transmDevTryMax =>{a=> 20.0,s=>1.0,l=>0,min=>1 ,max=>10 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"max message re-transmit"}, localResDis =>{a=> 24.0,s=>1.0,l=>0,min=>1 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"local reset disable" ,lit=>{off=>0,on=>1}}, +#un-identified List0 +# SEC-WM55 02:01 (AES on?) +# SEC-WDS 02:01 16:01(sabotage) ? +# SEC-SC 02:00 ? + #--- list 1, Channel level------------------ #blindActuator mainly driveDown =>{a=> 11.0,s=>2.0,l=>1,min=>0 ,max=>6000.0 ,c=>'factor' ,f=>10 ,u=>'s' ,d=>1,t=>"drive time up"}, @@ -410,6 +415,10 @@ my %culHmRegDefine = ( stormLowThresh =>{a=> 7 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"Storm lower threshold"}, # others localResetDis =>{a=> 7 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"LocalReset disable",lit=>{off=>0,on=>1}}, +#un-identified List1 +# SEC-WM55 8:01 (AES on?) +# SEC-WDS 34:0x64 ? +# SEC-SC 8:00 ? # logicCombination=>{a=> 89.0,s=>0.5,l=>1,min=>0 ,max=>16 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"". # "inactive=>unused\n". @@ -657,7 +666,6 @@ my %culHmGlobalSetsDevice = ( reset => "", pair => "", unpair => "", - getpair => "", getSerial => "", virtual =>"", ); @@ -666,7 +674,6 @@ my %culHmGlobalSets = ( regBulk => ": ...", peerBulk => "", statusRequest => "", - getdevicepair => "", getRegRaw =>"[List0|List1|List2|List3|List4|List5|List6] ... ", getConfig => "", regSet =>" ... ", @@ -687,17 +694,23 @@ my %culHmSubTypeSets = ( up => "[] [ontime] [ramptime]...", down => "[] [ontime] [ramptime]..." }, - remote =>{ devicepair => " device ... [single|dual] [set|unset] [actor|remote|both]",}, - pushButton =>{ devicepair => " device ... [single|dual] [set|unset] [actor|remote|both]",}, - threeStateSensor =>{ devicepair => " device ... single [set|unset] [actor|remote|both]",}, - motionDetector =>{ devicepair => " device ... single [set|unset] [actor|remote|both]",}, + remote =>{ devicepair => "... outdated, use peerChan", + peerChan => " device ... [single|dual] [set|unset] [actor|remote|both]",}, + pushButton =>{ devicepair => "... outdated, use peerChan", + peerChan => " device ... [single|dual] [set|unset] [actor|remote|both]",}, + threeStateSensor =>{ devicepair => "... outdated, use peerChan", + peerChan => " device ... single [set|unset] [actor|remote|both]",}, + motionDetector =>{ devicepair => "... outdated, use peerChan", + peerChan => " device ... single [set|unset] [actor|remote|both]",}, virtual =>{ raw => "data ...", - devicepair => " device ... [single|dual] [set|unset] [actor|remote|both]", + devicepair => "... outdated, use peerChan", + peerChan => " device ... [single|dual] [set|unset] [actor|remote|both]", press => "[long|short]...", valvePos => "position",#acting as TC virtual =>"",}, #redef necessary for virtual smokeDetector =>{ test => "", alarmOn=>"", alarmOff=>"", - devicepair => " device ... single [set|unset] actor",}, + devicepair => "... outdated, use peerChan", + peerChan => " device ... single [set|unset] actor",}, winMatic =>{ matic => "", keydef => " ", create => "" }, @@ -735,7 +748,8 @@ my %culHmModelSets = ( my %culHmChanSets = ( "HM-CC-TC00"=>{ - devicepair => " device ... [single|dual] [set|unset] [actor|remote|both]", + devicepair => "... outdated, use peerChan", + peerChan => " device ... 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]", @@ -753,7 +767,8 @@ my %culHmChanSets = ( controlMode => "[manual|auto|central|party]", decalcDay => "day", }, "HM-CC-TC02"=>{ - devicepair => " device ... [single|dual] [set|unset] [actor|remote|both]", + devicepair => "... outdated, use peerChan", + peerChan => " device ... 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]",