- 
            
               
              
                - 
                  Given Clean OpenHAB with latest Ruby Libraries
- 
                  And items:| type | name | label | state | 
|---|
 | Dimmer | DimmerTest | Test Dimmer | 45 |  | Switch | SwitchTest | Test Switch | OFF |  | Switch | SwitchTwo | Test Switch Two | OFF |  
 
 
 
- 
            
               Can access items as an enumerable/array
              
                - 
                  Given code in a rules filelogger.info("Item Count: #{items.count}")
logger.info("Items: #{items.sort_by(&:label).map(&:label).join(', ')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Item Count: 3' within 5 seconds
- 
                  And It should log 'Items: Test Dimmer, Test Switch' within 5 seconds
 
 
- 
            
               Fetch Item by name
              
                - 
                  Given code in a rules filelogger.info("Dimmer Name: #{items['DimmerTest'].name}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Dimmer Name: DimmerTest' within 5 seconds
 
 
- 
            
               Dynamically adjust dimmer when corresponding switch is turned on
              
                - 
                  Given a deployed rule:rule 'Increase Related Dimmer Brightness when Switch is turned on' do
  changed SwitchTest, to: ON
  triggered { |item| items[item.name.gsub('Switch','Dimmer')].brighten(10) }
end
 
- 
                  When item "SwitchTest" state is changed to "ON"
- 
                  Then "DimmerTest" should be in state "55" within 5 seconds
 
 
- 
            
               Send command to an item
              
                - 
                  Given a deployed rule:rule 'Increase Related Dimmer Brightness when Switch is turned on' do
  changed SwitchTest, to: ON
  run { SwitchTwo << ON }
end
 
- 
                  When item "SwitchTest" state is changed to "ON"
- 
                  Then "SwitchTwo" should be in state "ON" within 5 seconds
 
 
- 
            
               id returns label if set or name if not
              
                - 
                  Given items:| type | name | label | 
|---|
 | Dimmer | DimmerOne | Test Dimmer |  | Dimmer | DimmerTwo |  |  
 
- 
                  Given code in a rules filelogger.info "Dimmer One: #{DimmerOne.id}"
logger.info "Dimmer Two: #{DimmerTwo.id}"
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Dimmer One: Test Dimmer' within 5 seconds
- 
                  And It should log 'Dimmer Two: DimmerTwo' within 5 seconds
 
 
- 
            
               undef? returns true if item is in state UNDEF
              
                - 
                  Given code in a rules fileSwitchTest.setState(UNDEF)
logger.info("SwitchTest is UNDEF") if SwitchTest.undef?
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'SwitchTest is UNDEF' within 5 seconds
 
 
- 
            
               null? returns true if item is in state NULL
              
                - 
                  Given code in a rules fileSwitchTest.setState(NULL)
logger.info("SwitchTest is NULL") if SwitchTest.null?
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'SwitchTest is NULL' within 5 seconds
 
 
- 
            
               state? returns true if item is not in state NULL or UNDEF
              
                - 
                  Given code in a rules fileSwitchTest.setState(NULL)
DimmerTest.setState(UNDEF)
[SwitchTest, DimmerTest, SwitchTwo].each do |item|
  logger.info("#{item.name} has a state") if item.state?
  logger.info("#{item.name} does not have a state") unless item.state?
end
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'SwitchTwo has a state' within 5 seconds
- 
                  And It should log 'SwitchTest does not have a state' within 5 seconds
- 
                  And It should log 'DimmerTest does not have a state' within 5 seconds
 
 
- 
            
               state returns nil if item is in state NULL or UNDEF
              
                - 
                  Given code in a rules fileSwitchTest.setState(NULL)
DimmerTest.setState(UNDEF)
[SwitchTest, DimmerTest, SwitchTwo].each do |item|
  logger.info("#{item.name} has a state") unless item.state.nil?
  logger.info("#{item.name} does not have a state") if item.state.nil?
end
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'SwitchTwo has a state' within 5 seconds
- 
                  And It should log 'SwitchTest does not have a state' within 5 seconds
- 
                  And It should log 'DimmerTest does not have a state' within 5 seconds
 
 
- 
            
               Item returns string representation of state value for to_s
              
                - 
                  Given items:| type | name | state | 
|---|
 | <type> | Test | <state> |  
 
- 
                  Given code in a rules filelogger.info("Item: #{Test}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'Item: <state>' within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | type | state |  
                        | String | "Hello, World" |  |  
                        | Switch | ON |  |  
                        | Dimmer | 50 |  |  
                        | Contact | OPEN |  |  
                        | Number | 90.6 |  |  
                        | Number | NULL |  |  
                        | Number | UNDEF |  |  
 
 
 
 
- 
            
               Items in array work with array methods
              
                - 
                  Given items:| type | name | state | 
|---|
 | Number | Livingroom_Temp | 70 |  | Number | Bedroom_Temp | 50 |  
 
- 
                  And code in a rules filenumber_items = [Livingroom_Temp, Bedroom_Temp]
logger.info("Max is #{number_items.max}")
logger.info("Min is #{number_items.min}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "Max is 70" within 5 seconds
- 
                  And It should log "Min is 50" within 5 seconds
 
 
- 
            
               Send update to an item
              
                - 
                  Given a deployed rule:rule 'Item Updated' do
  updated SwitchTest, to: OFF
  run { logger.info("SwitchTest Received Update") }
end
 
- 
                  And code in a rules file
- 
                  When I deploy the rules file
- 
                  Then It should log "SwitchTest Received Update" within 5 seconds
 
 
- 
            
               Check for item existence
              
                - 
                  Given code in a rules filelogger.info("DimmerTest include? #{items.include? 'DimmerTest'}")
logger.info("SimmerTest include? #{items.include? 'SimmerTest'}")
logger.info("SimmerTest item nil? #{items['SimmerTest'].nil?}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log 'DimmerTest include? true' within 5 seconds
- 
                  And It should log 'SimmerTest include? false' within 5 seconds
- 
                  And It should log 'SimmerTest item nil? true' within 5 seconds
 
 
- 
            
               Verify class of item
              
                - 
                  Given items:| type | name | state | 
|---|
 | Number | Number1 | 1 |  
 
- 
                  And code in a rules filelogger.info("Number1 class is a NumberItem? #{Number1.class == OpenHAB::DSL::Items::NumberItem}")
logger.info("items['Number1'] class is a NumberItem? #{items['Number1'].class == OpenHAB::DSL::Items::NumberItem}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "Number1 class is a NumberItem? true" within 5 seconds
- 
                  And It should log "items['Number1'] class is a NumberItem? true" within 5 seconds
 
 
- 
            
               Verify items can access groups
              
                - 
                  Given groups:| name | 
|---|
 | Numbers |  | EvenNumbers |  | PrimeNumbers |  
 
- 
                  Given items:| type | name | groups | 
|---|
 | Number | Number3 | Numbers, PrimeNumbers |  
 
- 
                  And code in a rules filelogger.info("Number3 is in groups #{Number3.groups.map(&:name).join(', ')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "Number3 is in groups Numbers, PrimeNumbers" within 5 seconds
 
 
- 
            
               Dangling group references are ignored
              
                - 
                  Given groups:
- 
                  Given items:| type | name | groups | 
|---|
 | Number | Number3 | Numbers, PrimeNumbers |  
 
- 
                  And code in a rules filelogger.info("Number3 is in groups #{Number3.groups.map(&:name).join(', ')}$")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "Number3 is in groups Numbers$" within 5 seconds
 
 
- 
            
               Items can be used as hash keys
              
                - 
                  
                  Given items:
- 
                  And code in a rules fileITEMS_HASH = { <name> => "I'm <name>" }
logger.info("#{ITEMS_HASH[<name>]}")
logger.info("<name>.hash == <name>.hash: #{<name>.hash == <name>.hash}")
logger.info("<name>.eql?(<name>): #{<name>.eql?(<name>)}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "I'm <name>" within 5 seconds
- 
                  And It should log "<name>.hash == <name>.hash: true" within 5 seconds
- 
                  And It should log "<name>.eql?(<name>): true" within 5 seconds
 
 
              
                Examples: 
                  
                    
                      
                        | type | name |  
                        | Number | Number1 |  |  
                        | String | String1 |  |  
                        | Player | Player1 |  |  
 
 
 
 
- 
            
               Item returns nil for an unlinked item
              
                - 
                  Given items:
- 
                  And code in a rules filelogger.info("No thing: #{Number1.thing.nil?}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "No thing: true" within 5 seconds
 
 
- 
            
               Item returns its linked thing
              
                - 
                  Given feature 'openhab-binding-astro' installed
- 
                  And items:
- 
                  And things:| id | thing_uid | label | config | status | 
|---|
 | home | astro:sun | Astro Sun Data | {"geolocation":"0,0"} | enable |  
 
- 
                  And linked:| item | channel | 
|---|
 | PhaseName | astro:sun:home:phase#name |  
 
- 
                  And code in a rules filelogger.info("Thing: #{PhaseName.thing.uid}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "Thing: astro:sun:home" within 5 seconds
 
 
- 
            
               Item returns all its linked things
              
                - 
                  Given feature 'openhab-binding-astro' installed
- 
                  And items:| type | name | 
|---|
 | String | TooManyThings |  
 
- 
                  And things:| id | thing_uid | label | config | status | 
|---|
 | home | astro:sun | Astro Sun Data | {"geolocation":"0,0"} | enable |  | home | astro:moon | Astro Moon Data | {"geolocation":"0,0"} | enable |  
 
- 
                  And linked:| item | channel | 
|---|
 | TooManyThings | astro:sun:home:phase#name |  | TooManyThings | astro:moon:home:phase#name |  
 
- 
                  And code in a rules filelogger.info("Thing: #{TooManyThings.things.map(&:uid).map(&:to_s).sort.join(',')}")
 
- 
                  When I deploy the rules file
- 
                  Then It should log "Thing: astro:moon:home,astro:sun:home" within 5 seconds
 
 
- 
            
               Referenced items always access latest item instance
              
                - 
                  Given items:| type | name | label | 
|---|
 | String | FooString | foo |  | Switch | MySwitch | switch |  
 
- 
                  And a rule:h = { foo: FooString }
rule 'check reference' do
  on_start
  changed MySwitch
  run { logger.info("Label: #{h[:foo].label}") }
end
 
- 
                  When I deploy the rule
- 
                  Then It should log "Label: foo" within 5 seconds
- 
                  But If items:| type | name | label | 
|---|
 | String | FooString | bar |  
 
- 
                  And item 'MySwitch' state is changed to 'ON'
- 
                  Then It should log "Label: bar" within 5 seconds
 
 
- 
            
               Item objects can be compared in a case statement
              
                - 
                  Given a rule:logger.info case SwitchTwo.item
            when DimmerTest then 'Matched DimmerTest'
            when SwitchTest then 'Matched SwitchTest'
            when SwitchTwo then 'Matched SwitchTwo'
            end
 
- 
                  When item 'DimmerTest' state is changed to '0'
- 
                  And I deploy the rule
- 
                  Then It should log "Matched SwitchTwo" within 5 seconds
 
 
- 
            
               Items matches array#include?
              
                - 
                  Given a rule:logger.info("SwitchTwo in array? #{[DimmerTest, SwitchTwo].include?(SwitchTwo.item)}")
logger.info("DimmerTest in array? #{[SwitchTwo, SwitchTest].include?(DimmerTest.item)}")
logger.info("SwitchTest in array? #{[DimmerTest, SwitchTwo].include?(SwitchTest.item)}")
 
- 
                  When item 'DimmerTest' state is changed to '0'
- 
                  And I deploy the rule
- 
                  Then It should log "SwitchTwo in array? true" within 5 seconds
- 
                  And It should log "DimmerTest in array? false" within 5 seconds
- 
                  And It should log "SwitchTest in array? false" within 5 seconds
 
 
- 
            
               Items matches hash#key?
              
                - 
                  Given a rule:logger.info("SwitchTwo in hash? #{{DimmerTest => true, SwitchTwo => true}.key?(SwitchTwo)}")
logger.info("SwitchTwo.item in hash? #{{DimmerTest => true, SwitchTwo => true}.key?(SwitchTwo.item)}")
logger.info("DimmerTest in hash? #{{SwitchTwo => true, SwitchTest => true}.key?(DimmerTest)}")
logger.info("SwitchTest in hash? #{{DimmerTest => true, SwitchTwo => true}.key?(SwitchTest)}")
 
- 
                  When item 'DimmerTest' state is changed to '0'
- 
                  And I deploy the rule
- 
                  Then It should log "SwitchTwo in hash? true" within 5 seconds
- 
                  And It should log "SwitchTwo.item in hash? true" within 5 seconds
- 
                  And It should log "DimmerTest in hash? false" within 5 seconds
- 
                  And It should log "SwitchTest in hash? false" within 5 seconds
 
 
- 
            
               Items matches hash#value?
              
                - 
                  Given a rule:logger.info("SwitchTwo in value? #{{a: DimmerTest, b: SwitchTwo}.value?(SwitchTwo.item)}")
logger.info("DimmerTest in value? #{{a: SwitchTwo, b: SwitchTest}.value?(DimmerTest.item)}")
logger.info("SwitchTest in value? #{{a: DimmerTest, b: SwitchTwo}.value?(SwitchTest.item)}")
 
- 
                  When item 'DimmerTest' state is changed to '0'
- 
                  And I deploy the rule
- 
                  Then It should log "SwitchTwo in value? true" within 5 seconds
- 
                  And It should log "DimmerTest in value? false" within 5 seconds
- 
                  And It should log "SwitchTest in value? false" within 5 seconds
 
 
- 
            
               Direct comparison of Items
              
                - 
                  Given items:| type | name | state | 
|---|
 | String | NonNullStringItem1 | hi |  | String | NullStringItem1 | NULL |  
 
- 
                  And a rule:logger.info("<left> == <right>: #{<left> == <right>}")
 
- 
                  When I deploy the rule
- 
                  Then It should log "<left> == <right>: <result>" within 5 seconds
 
 
              
                Examples: State comparisons
                  
                    
                      
                        | left | right | result |  
                        | SwitchTwo | SwitchTest | true |  |  
 
 
 
                Examples: Different item objects comparisons
                  
                    
                      
                        | left | right | result |  
                        | SwitchTwo.item | SwitchTest.item | false |  |  
                        | SwitchTwo.item | SwitchTest | false |  |  
                        | NonNullStringItem1 | NullStringItem1.item | false |  |  
 
 
 
                Examples: Same item object comparisons
                  
                    
                      
                        | left | right | result |  
                        | SwitchTwo.item | items['SwitchTwo'].item | true |  |  
                        | SwitchTwo | items['SwitchTwo'].item | true |  |  
                        | SwitchTwo.item | items['SwitchTwo'] | true |  |  
 
 
 
 
- 
            
               GroupItem grep can use Item.item
              
                - 
                  Given group "Switches"
- 
                  And items:| type | name | group | state | 
|---|
 | Switch | Switch1 | Switches | OFF |  | Switch | Switch2 | Switches | OFF |  
 
- 
                  And a rule:logger.info "grep result1: #{Switches.grep(Switch1.item).first.name}"
logger.info "grep result2: #{Switches.grep(Switch2.item).first.name}"
logger.info "grep result3: #{Switches.grep(Switch1).first.name}"
logger.info "grep result4: #{Switches.grep(Switch2).first.name}"
 
- 
                  When I deploy the rule
- 
                  Then It should log "grep result1: Switch1" within 5 seconds
- 
                  And It should log "grep result2: Switch2" within 5 seconds
- 
                  And It should log "grep result3: Switch1" within 5 seconds
- 
                  And It should log "grep result4: Switch2" within 5 seconds