- 
            
               
              
                - 
                  Given Clean OpenHAB with latest Ruby Libraries
 
 
- 
            
               Items have implicit timers when accepting commands
              
                - 
                  Given items:| type | name | label | state | 
|---|
 | Number | Alarm_Mode | Alarm Mode | 0 |  
 
- 
                  And code in a rules fileAlarm_Mode.command(70, for: 5.seconds)
 
- 
                  When I deploy the rule
- 
                  Then "Alarm_Mode" should be in state "70" within 3 seconds
- 
                  And If I wait 3 seconds
- 
                  Then "Alarm_Mode" should be in state "0" within 3 seconds
 
 
- 
            
               Items can set expire state
              
                - 
                  Given items:| type | name | label | state | 
|---|
 | Number | Alarm_Mode | Alarm Mode | 0 |  
 
- 
                  And code in a rules fileAlarm_Mode.command(70, for: 5.seconds, on_expire: 9)
 
- 
                  When I deploy the rule
- 
                  Then "Alarm_Mode" should be in state "70" within 3 seconds
- 
                  And If I wait 3 seconds
- 
                  Then "Alarm_Mode" should be in state "9" within 3 seconds
 
 
- 
            
               Implicit item timers are reentrant
              
                - 
                  Given items:| type | name | state | 
|---|
 | String | Alarm_Mode | foo |  | Switch | Switch1 | OFF |  
 
- 
                  And code in a rules filerule 'Reentrant implicit timer' do
 changed Switch1, to: ON
 run { Alarm_Mode.command('bar', for: 5.seconds) }
 on_start
end
 
- 
                  When I deploy the rule
- 
                  Then "Alarm_Mode" should be in state "bar" within 3 seconds
- 
                  But If I send command "ON" to item "Switch1"
- 
                  And "Alarm_Mode" should stay in state "bar" for 4 seconds
- 
                  But If I wait 3 seconds
- 
                  Then "Alarm_Mode" should be in state "foo" within 5 seconds
 
 
- 
            
               ON/OFF default expire to their inverse
              
                - 
                  Given items:| type | name | state | 
|---|
 | Switch | Switch1 | <initial_state> |  
 
- 
                  And code in a rules fileSwitch1.command(<timed_set>, for: 5.seconds)
 
- 
                  When I deploy the rule
- 
                  Then "Switch1" should be in state "<timed_set>" within 3 seconds
- 
                  But If I wait 7 seconds
- 
                  Then "Switch1" should be in state "<final_state>" within 3 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | initial_state | timed_set | final_state |  
                        | ON | ON | OFF |  |  
                        | OFF | OFF | ON |  |  
                        | OFF | ON | OFF |  |  
                        | ON | OFF | ON |  |  
 
 
 
 
- 
            
               Dynamically defined commands (on,off,etc) have implicit timers
              
                - 
                  Given items:| type | name | state | 
|---|
 | <type> | Item1 | <initial_state> |  
 
- 
                  And code in a rules fileItem1.<command> for: 5.seconds
 
- 
                  When I deploy the rule
- 
                  Then "Item1" should be in state "<timed_state>" within 3 seconds
- 
                  But If I wait 5 seconds
- 
                  Then "Item1" should be in state "<initial_state>" within 3 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | type | initial_state | command | timed_state |  
                        | Switch | OFF | on | ON |  |  
                        | Switch | ON | off | OFF |  |  
                        | Player | PLAY | pause | PAUSE |  |  
 
 
 
 
- 
            
               Implicit command timers can accept expire blocks
              
                - 
                  Given items:| type | name | state | 
|---|
 | Switch | Switch1 | OFF |  
 
- 
                  And code in a rules fileSwitch1.command(ON, for: 5.seconds) do |timed_command|
  logger.info("Expired: #{timed_command.expired?}") 
end
 
- 
                  When I deploy the rule
- 
                  Then It should not log 'Expired' within 3 seconds
- 
                  But If I wait 2 seconds
- 
                  Then It should log 'Expired: true' within 3 seconds
 
 
- 
            
               Implicit timers are canceled when item state changes before timer expires
              
                - 
                  Given items:| type | name | state | 
|---|
 | Switch | Switch1 | OFF |  
 
- 
                  And code in a rules fileSwitch1.on for: 5.seconds, on_expire: ON
 
- 
                  When I deploy the rule
- 
                  Then "Switch1" should be in state "ON" within 3 seconds
- 
                  But If I send command "OFF" to item "Switch1"
- 
                  Then "Switch1" should stay in state "OFF" for 8 seconds
 
 
- 
            
               Supplied blocks are called when timers are cancelled
              
                - 
                  Given items:| type | name | state | 
|---|
 | Switch | Switch1 | OFF |  
 
- 
                  And code in a rules fileSwitch1.on for: 5.seconds do |event|
  logger.info("Timed Command Canceled: #{event.canceled?}")
end
 
- 
                  When I deploy the rule
- 
                  Then If I wait 2 seconds
- 
                  And If I send command "OFF" to item "Switch1"
- 
                  Then It should log 'Timed Command Canceled: true' within 3 seconds
 
 
- 
            
               Implicit timers work with ensure
              
                - 
                  Given items:| type | name | state | 
|---|
 | Switch | Switch1 | <initial_state> |  
 
- 
                  And code in a rules fileSwitch1.ensure.on for: 5.seconds
 
- 
                  When I deploy the rule
- 
                  Then "Switch1" should be in state "ON" within 3 seconds
- 
                  But If I wait 5 seconds
- 
                  Then "Switch1" should be in state "OFF" within 5 seconds
 
 
- 
            
               Implicit timers can have duration updated
              
                - 
                  Given items:| type | name | state | 
|---|
 | Switch | Switch1 | OFF |  
 
- 
                  And code in a rules fileSwitch1.ensure.on for: 3.seconds
Switch1.ensure.on for: 10.seconds
 
- 
                  When I deploy the rule
- 
                  Then "Switch1" should be in state "ON" within 3 seconds
- 
                  And "Switch1" should stay in state "ON" for 6 seconds
- 
                  Then "Switch1" should be in state "OFF" within 6 seconds