Module: Enumerable

Included in:
OpenHAB::Core::EmulateHash, OpenHAB::Core::LazyArray, OpenHAB::Core::Provider
Defined in:
lib/openhab/core/items/semantics/enumerable.rb,
lib/openhab/core/items/semantics.rb

Overview

Additions to Enumerable to allow easily filtering groups of items based on the semantic model

Filtering Methods Methods to help filter the members of the Enumerable collapse

Items State and Command Methods collapse

Filtering Methods collapse

Instance Method Details

#all_groupsArray<GroupItem>

Returns all groups all elements are a part of, recursively

Returns:



91
92
93
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 91

def all_groups
  flat_map(&:all_groups).uniq
end

#all_membersArray<Item>

Returns all non-group members of all group elements, recursively

Returns:



79
80
81
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 79

def all_members
  grep(OpenHAB::Core::Items::GroupItem).flat_map(&:all_members).uniq
end

#command(command, **kwargs) ⇒ self?

Send a command to every item in the collection

Returns:

  • (self, nil)

    nil when ‘ensure` is in effect and all the items were already in the same state, otherwise self



100
101
102
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 100

def command(command, **kwargs)
  self if count { |i| i.command(command, **kwargs) }.positive?
end

#command!(command) ⇒ self

Send a command to every item in the collection, even when ensure_states! is in effect.

Returns:

  • (self)


106
107
108
109
110
111
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 106

def command!(command)
  # We cannot alias this to #command above, otherwise it will call
  # DSL::Items::Ensure::Item#command which checks for ensure_states
  each { |i| i.command!(command) }
  self
end

#decreaseself

Send the DECREASE command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 162

#downself

Send the DOWN command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 146

#equipments(*types) ⇒ Array<Item>

Note:

As equipments are usually GroupItems, this method therefore returns an array of GroupItems. In order to get the points that belong to the equipments, use #members before calling #points. See the example with #points.

Returns a new array of items that are a semantics equipment (optionally of one of the given types)

Examples:

Get all TVs in a room

lGreatRoom.equipments(Semantics::Television)

Get all TVs and Speakers in a room

lGreatRoom.equipments(Semantics::Television, Semantics::Speaker)

Returns:



647
648
649
650
651
652
653
654
655
656
657
658
# File 'lib/openhab/core/items/semantics.rb', line 647

def equipments(*types)
  begin
    raise ArgumentError unless types.all? { |type| type < Semantics::Equipment }
  rescue ArgumentError, TypeError
    raise ArgumentError, "type must be a subclass of Equipment"
  end

  result = select(&:equipment?)
  result.select! { |i| types.any? { |type| i.equipment_type <= type } } unless types.empty?

  result
end

#fast_forwardself

Send the FASTFORWARD command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 178

#groupsArray<GroupItem>

Returns the groups of all elements

Returns:



85
86
87
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 85

def groups
  flat_map(&:groups).uniq
end

#increaseself

Send the INCREASE command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 158

#locations(*types) ⇒ Array<Item>

Returns a new array of items that are a semantics Location (optionally of one of the given types)

Examples:

Get all rooms

items.locations(Semantics::Room)

Get all bedrooms and bathrooms

items.locations(Semantics::Bedroom, Semantics::Bathroom)

Returns:



617
618
619
620
621
622
623
624
625
626
627
628
# File 'lib/openhab/core/items/semantics.rb', line 617

def locations(*types)
  begin
    raise ArgumentError unless types.all? { |type| type < Semantics::Location }
  rescue ArgumentError, TypeError
    raise ArgumentError, "type must be a subclass of Location"
  end

  result = select(&:location?)
  result.select! { |i| types.any? { |type| i.location_type <= type } } unless types.empty?

  result
end

#member_of(*groups) ⇒ Array<Item>

Returns a new array of items that are a member of at least one of the given groups

Parameters:

Returns:



60
61
62
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 60

def member_of(*groups)
  select { |i| i.member_of?(*groups) }
end

#membersArray<Item>

Returns the group members of all group elements

Returns:



73
74
75
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 73

def members
  grep(OpenHAB::Core::Items::GroupItem).flat_map(&:members).uniq
end

#moveself

Send the MOVE command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 154

#nextself

Send the NEXT command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 182

#not_member_of(*groups) ⇒ Array<Item>

Returns a new array of items that are not a member of any of the given groups

Parameters:

Returns:



67
68
69
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 67

def not_member_of(*groups)
  reject { |i| i.member_of?(*groups) }
end

#not_tagged(*tags) ⇒ Array<Item>

Returns a new array of items that do not have any of the given tags

Parameters:

Returns:



53
54
55
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 53

def not_tagged(*tags)
  reject { |i| i.tagged?(*tags) }
end

#offself

Send the OFF command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 138

#onself

Send the ON command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 134

#pauseself

Send the PAUSE command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 170

#playself

Send the PLAY command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 166

#points(*point_or_property_types) ⇒ Array<Item>

Returns a new array of items that are semantics points (optionally of a given type)

Examples:

Get all the power switch items for every equipment in a room

lGreatRoom.equipments.members.points(Semantics::Switch)

Returns:

See Also:



669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
# File 'lib/openhab/core/items/semantics.rb', line 669

def points(*point_or_property_types)
  unless (0..2).cover?(point_or_property_types.length)
    raise ArgumentError, "wrong number of arguments (given #{point_or_property_types.length}, expected 0..2)"
  end

  begin
    raise ArgumentError unless point_or_property_types.all? do |tag|
                                 tag < Semantics::Point ||
                                 tag < Semantics::Property
                               end
  rescue ArgumentError, TypeError
    raise ArgumentError, "point_or_property_types must all be a subclass of Point or Property"
  end
  if point_or_property_types.count { |tag| tag < Semantics::Point } > 1 ||
     point_or_property_types.count { |tag| tag < Semantics::Property } > 1
    raise ArgumentError, "point_or_property_types cannot both be a subclass of Point or Property"
  end

  select do |point|
    point.point? && point_or_property_types.all? do |tag|
      (tag < Semantics::Point && point.point_type&.<=(tag)) ||
        (tag < Semantics::Property && point.property_type&.<=(tag))
    end
  end
end

#previousself

Send the PREVIOUS command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 186

#refreshself

Send the REFRESH command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 130

#rewindself

Send the REWIND command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 174

#stopself

Send the STOP command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 150

#tagged(*tags) ⇒ Array<Item>

Returns a new array of items that have at least one of the given tags

Parameters:

Returns:



46
47
48
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 46

def tagged(*tags)
  select { |i| i.tagged?(*tags) }
end

#toggleself

Send a toggle command to every item in the collection

Returns:

  • (self)


201
202
203
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 201

def toggle
  each(&:toggle)
end

#upself

Send the UP command to every item in the collection

Returns:

  • (self)


# File 'lib/openhab/core/items/semantics/enumerable.rb', line 142

#update(state) ⇒ self?

Update the state of every item in the collection

Returns:

  • (self, nil)

    nil when ‘ensure` is in effect and all the items were already in the same state, otherwise self



116
117
118
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 116

def update(state)
  self if count { |i| i.update(state) }.positive?
end

#update!(state) ⇒ self

Update the state of every item in the collection, even when

{OpenHAB::DSL.ensure_states! ensure_states!} is in effect.

Returns:

  • (self)


123
124
125
126
127
128
# File 'lib/openhab/core/items/semantics/enumerable.rb', line 123

def update!(state)
  # We cannot alias this to #update above, otherwise it will call
  # DSL::Items::Ensure::Item#update which checks for ensure_states
  each { |i| i.update!(state) }
  self
end