Module: OpenHAB::Core::Items::Semantics
- Included in:
- GenericItem
- Defined in:
- lib/openhab/core/items/semantics.rb
Overview
Module for implementing semantics helper methods on Item in order to easily navigate the Semantic Model in your scripts. This can be extremely useful to find related items in rules that are executed for any member of a group.
Wraps org.openhab.core.model.script.actions.Semantics as well as adding a few additional convenience methods. Also includes classes for each semantic tag.
Be warned that the Semantic model is stricter than can actually be described by tags and groups on an Item. It makes assumptions that any given item only belongs to one semantic type (Location, Equipment, Point).
#Enumerable helper methods
Enumerable helper methods are also provided to complement the semantic model. These methods can be chained together to find specific item(s) based on custom tags or group memberships that are outside the semantic model.
The Enumerable helper methods apply to:
- GroupItem#members and GroupItem#all_members. This includes semantic #location and #equipment because they are also group items. An exception is for Equipments that are an item (not a group)
- Array of items, such as the return value of Enumerable#equipments, Enumerable#locations, Enumerable#points, Enumerable#tagged, Enumerable#not_tagged, Enumerable#member_of, Enumerable#not_member_of, Enumerable#members methods, etc.
- items[] hash which contains all items in the system.
#Semantic Classes
Each Semantic Tag has a corresponding class within the org.openhab.core.semantics class hierarchy. These "semantic classes" are available as constants in the Semantics module with the corresponding name. The following table illustrates the semantic constants:
Semantic Constant | openHAB's Semantic Class |
---|---|
Semantics::LivingRoom |
org.openhab.core.semantics.model.location.LivingRoom |
Semantics::Lightbulb |
org.openhab.core.semantics.model.equipment.Lightbulb |
Semantics::Control |
org.openhab.core.semantics.model.point.Control |
Semantics::Switch |
org.openhab.core.semantics.model.point.Switch |
Semantics::Power |
org.openhab.core.semantics.model.property.Power |
... | ... |
These constants can be used as arguments to the #points, Enumerable#locations and Enumerable#equipments methods to filter their results. They can also be compared against the return value of #semantic_type, #location_type, #equipment_type, #point_type, and #property_type. They can even be used with DSL::Items::ItemBuilder#tag.
The semantic constants in the Semantics
module are enhanced with TagClassMethods
to provide easy access to the tags' additional attributes: label,
synonyms, and description.
For example, to get the synonyms for Semantics::Lightbulb
in German:
Semantics::Lightbulb.synonyms(java.util.Locale::GERMAN)
#Adding Custom Semantic Tags
openHAB 4 supports adding custom semantic tags to augment the standard set of tags to better suit your particular requirements.
For more information, see Semantics.add
Defined Under Namespace
Modules: TagClassMethods
Constant Summary collapse
- Tag =
This is a marker interface for all semantic tag classes.
- org.openhab.core.semantics.Tag
- Location =
This is the super interface for all types that represent a Location.
- org.openhab.core.semantics.Location
- Equipment =
This is the super interface for all types that represent an Equipment.
- org.openhab.core.semantics.Equipment
- Point =
This is the super interface for all types that represent a Point.
- org.openhab.core.semantics.Point
- Property =
This is the super interface for all property tags.
- org.openhab.core.semantics.Property
Instance Attribute Summary collapse
-
#equipment ⇒ Item?
readonly
Gets the related Equipment Item of this Item.
-
#equipment_type ⇒ Class?
readonly
Returns the sub-class of Equipment related to this Item.
-
#location ⇒ Item?
readonly
Gets the related Location Item of this Item.
-
#location_type ⇒ Class?
readonly
Returns the sub-class of Location related to this Item.
-
#point_type ⇒ Class?
readonly
Returns the sub-class of Point this Item is tagged with.
-
#property_type ⇒ Class?
readonly
Returns the sub-class of Property this Item is tagged with.
-
#semantic_type ⇒ Class?
readonly
Returns the sub-class of Tag this Item is tagged with.
Class Method Summary collapse
-
.add(label: nil, synonyms: "", description: "", **tags) ⇒ Array<Tag>
Adds custom semantic tags.
-
.lookup(id, locale = nil) ⇒ Tag?
Finds the semantic tag using its name, label, or synonyms.
-
.tags ⇒ Array<Tag>
Returns all available Semantic tags.
Instance Method Summary collapse
-
#equipment? ⇒ true, false
Checks if this Item is an Equipment.
-
#location? ⇒ true, false
Checks if this Item is a Location.
-
#point? ⇒ true, false
Checks if this Item is a Point.
-
#points(*point_or_property_types) ⇒ Array<Item>
Return the related Point Items.
-
#semantic? ⇒ true, false
Checks if this Item has any semantic tags.
Instance Attribute Details
#equipment ⇒ Item? (readonly)
308 309 310 |
# File 'lib/openhab/core/items/semantics.rb', line 308 def equipment Actions::Semantics.get_equipment(self)&.then(&Proxy.method(:new)) end |
#equipment_type ⇒ Class? (readonly)
Returns the sub-class of Equipment related to this Item.
In other words, the #semantic_type of this Item's Equipment.
321 322 323 |
# File 'lib/openhab/core/items/semantics.rb', line 321 def equipment_type Actions::Semantics.get_equipment_type(self)&.ruby_class end |
#location ⇒ Item? (readonly)
282 283 284 |
# File 'lib/openhab/core/items/semantics.rb', line 282 def location Actions::Semantics.get_location(self)&.then(&Proxy.method(:new)) end |
#location_type ⇒ Class? (readonly)
Returns the sub-class of Location related to this Item.
In other words, the #semantic_type of this Item's Location.
295 296 297 |
# File 'lib/openhab/core/items/semantics.rb', line 295 def location_type Actions::Semantics.get_location_type(self)&.ruby_class end |
#point_type ⇒ Class? (readonly)
Returns the sub-class of Point this Item is tagged with.
332 333 334 |
# File 'lib/openhab/core/items/semantics.rb', line 332 def point_type Actions::Semantics.get_point_type(self)&.ruby_class end |
#property_type ⇒ Class? (readonly)
Returns the sub-class of Property this Item is tagged with.
343 344 345 |
# File 'lib/openhab/core/items/semantics.rb', line 343 def property_type Actions::Semantics.get_property_type(self)&.ruby_class end |
#semantic_type ⇒ Class? (readonly)
357 358 359 |
# File 'lib/openhab/core/items/semantics.rb', line 357 def semantic_type Actions::Semantics.get_semantic_type(self)&.ruby_class end |
Class Method Details
.self.add(**tags) ⇒ Array<Tag> .self.add(label: nil, synonyms: "", description: "", **tags) ⇒ Array<Tag>
Adds custom semantic tags.
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 |
# File 'lib/openhab/core/items/semantics.rb', line 436 def self.add(label: nil, synonyms: "", description: "", **tags) raise "Tags must be specified" if tags.empty? if (tags.length > 1) && !(label.nil? && synonyms.empty? && description.empty?) raise "Additional options can only be specified when creating one tag" end synonyms = synonyms.map(&:to_s).map(&:strip).join(",") if synonyms.is_a?(Array) tags.map do |name, parent| parent_is_tag = parent.respond_to?(:java_class) && parent.java_class < Tag.java_class parent = parent_is_tag ? parent.java_class : parent.to_s name = name.to_s org.openhab.core.semantics.SemanticTags.add(name, parent, label, synonyms, description) &.then { const_missing(name) } end.compact end |
.lookup(id, locale = nil) ⇒ Tag?
Finds the semantic tag using its name, label, or synonyms.
476 477 478 479 480 481 482 |
# File 'lib/openhab/core/items/semantics.rb', line 476 def self.lookup(id, locale = nil) id = id.to_sym return const_get(id) if constants.include?(id) || const_missing(id) locale = java.util.Locale.default if locale.nil? org.openhab.core.semantics.SemanticTags.get_by_label_or_synonym(id.to_s, locale).first&.ruby_class end |
.tags ⇒ Array<Tag>
Returns all available Semantic tags
459 460 461 462 463 464 465 466 |
# File 'lib/openhab/core/items/semantics.rb', line 459 def self.tags java.util.stream.Stream.of( org.openhab.core.semantics.model.point.Points.stream, org.openhab.core.semantics.model.property.Properties.stream, org.openhab.core.semantics.model.equipment.Equipments.stream, org.openhab.core.semantics.model.location.Locations.stream ).flat_map(&:itself).map(&:ruby_class).iterator.to_a end |
Instance Method Details
#equipment? ⇒ true, false
Checks if this Item is an Equipment
This is implemented as checking if the item's #semantic_type is an Equipment. I.e. an Item has a single #semantic_type.
248 249 250 |
# File 'lib/openhab/core/items/semantics.rb', line 248 def equipment? Actions::Semantics.equipment?(self) end |
#location? ⇒ true, false
Checks if this Item is a Location
This is implemented as checking if the item's #semantic_type is a Location. I.e. an Item has a single #semantic_type.
236 237 238 |
# File 'lib/openhab/core/items/semantics.rb', line 236 def location? Actions::Semantics.location?(self) end |
#point? ⇒ true, false
Checks if this Item is a Point
This is implemented as checking if the item's #semantic_type is a Point. I.e. an Item has a single #semantic_type.
259 260 261 |
# File 'lib/openhab/core/items/semantics.rb', line 259 def point? Actions::Semantics.point?(self) end |
#points(*point_or_property_types) ⇒ Array<Item>
Return the related Point Items.
Searches this Equipment Item for Points that are tagged appropriately.
If called on a Point Item, it will automatically search for sibling Points (and remove itself if found).
388 389 390 391 392 393 394 395 |
# File 'lib/openhab/core/items/semantics.rb', line 388 def points(*point_or_property_types) return members.points(*point_or_property_types) if equipment? || location? # automatically search the parent equipment (or location?!) for sibling points result = (equipment || location)&.points(*point_or_property_types) || [] result.delete(self) result end |
#semantic? ⇒ true, false
Checks if this Item has any semantic tags
268 269 270 |
# File 'lib/openhab/core/items/semantics.rb', line 268 def semantic? !!semantic_type end |