Class: OpenHAB::Core::Things::Channel
- Inherits:
-
Object
- Object
- OpenHAB::Core::Things::Channel
- Defined in:
- lib/openhab/core/things/channel.rb
Overview
Instance Attribute Summary collapse
- #channel_type ⇒ ChannelType readonly
- #channel_type_uid ⇒ ChannelTypeUID readonly
-
#item ⇒ Items::Item?
readonly
Return the item this channel is linked to.
-
#item_name ⇒ String?
readonly
Return the name of the item this channel is linked to.
-
#item_names ⇒ Array<String>
readonly
Return the names of all of the items this channel is linked to.
-
#items ⇒ Array<Items::Item>
readonly
Return all of the items this channel is linked to.
-
#links ⇒ Items::ItemChannelLinks
readonly
Returns all of the channel's links (items and link configurations).
-
#thing ⇒ Thing?
readonly
Return the thing this channel is associated with.
- #uid ⇒ ChannelUID readonly
Instance Method Summary collapse
- #inspect ⇒ String
- #link(item = nil, config = nil) ⇒ ItemChannelLink?
- #to_s ⇒ String
-
#unlink(item) ⇒ Things::ItemChannelLink?
Removes a link to an item from managed link providers.
Instance Attribute Details
#channel_type ⇒ ChannelType (readonly)
51 52 53 |
# File 'lib/openhab/core/things/channel.rb', line 51 def channel_type ChannelType.registry.get_channel_type(channel_type_uid) end |
#channel_type_uid ⇒ ChannelTypeUID (readonly)
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/openhab/core/things/channel.rb', line 29 class Channel extend Forwardable delegate %i[item items thing] => :uid # @return [String] def inspect r = "#<OpenHAB::Core::Things::Channel #{uid}" r += " #{label.inspect}" if label r += " description=#{description.inspect}" if description r += " kind=#{kind.inspect}" r += " channel_type_uid=#{channel_type_uid.inspect}" if channel_type_uid r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty? r += " properties=#{properties.to_h}" unless properties.empty? r += " default_tags=#{default_tags.to_a}" unless default_tags.empty? r += " auto_update_policy=#{auto_update_policy}" if auto_update_policy r += " accepted_item_type=#{accepted_item_type}" if accepted_item_type "#{r}>" end # @!attribute [r] channel_type # @return [ChannelType] def channel_type ChannelType.registry.get_channel_type(channel_type_uid) end # @return [String] def to_s uid.to_s end # @!attribute item_name [r] # Return the name of the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [String, nil] def item_name item_names.first end # @!attribute item_names [r] # Return the names of all of the items this channel is linked to. # # @return [Array<String>] def item_names Things::Links::Provider.registry.get_linked_item_names(uid) end # @!attribute item [r] # Return the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [Items::Item, nil] def item items.first end # @!attribute items [r] # Return all of the items this channel is linked to. # # @return [Array<Items::Item>] def items Things::Links::Provider.registry.get_linked_items(uid).map { |item| Items::Proxy.new(item) } end # # @!attribute links [r] # Returns all of the channel's links (items and link configurations). # # @return [Items::ItemChannelLinks] An array of ItemChannelLink or an empty array # # @example Get the configuration of the first link # things["mqtt:topic:livingroom-light"].channel["power"].links.first.configuration # # @example Remove all managed links # things["mqtt:topic:livingroom-light"].channel["power"].links.clear # # @see link # @see unlink # def links Items::ItemChannelLinks.new(uid, Things::Links::Provider.registry.get_links(uid)) end # # @return [ItemChannelLink, nil] # # @overload link # Returns the channel's link. If an channel is linked to more than one item, # this method only returns the first link. # # @return [Things::ItemChannelLink, nil] # # @overload link(item, config = {}) # # Links the channel to an item. # # @param [String, Items::Item] item The item to link to. # @param [Hash] config The configuration for the link. # # @return [Things::ItemChannelLink] The created link. # # @example Link a channel to an item # things["mqtt:topic:livingroom-light"].channels["power"].link(LivingRoom_Light_Power) # # @example Specify a link configuration # things["mqtt:topic:outdoor-thermometer"].channels["temperature"].link( # High_Temperature_Alert, # profile: "system:hysteresis", # lower: "29 °C", # upper: "30 °C") # # @see links # @see unlink # def link(item = nil, config = nil) return Things::Links::Provider.registry.get_links(uid).first if item.nil? && config.nil? config ||= {} Core::Things::Links::Provider.create_link(item, self, config).tap do |new_link| provider = Core::Things::Links::Provider.current if !(current_link = provider.get(new_link.uid)) provider.add(new_link) elsif current_link.configuration != config provider.update(new_link) end end end # # Removes a link to an item from managed link providers. # # @param [String, Items::Item] item The item to remove the link to. # # @return [Things::ItemChannelLink, nil] The removed link, if found. # @raise [FrozenError] if the link is not managed by a managed link provider. # # @see link # @see links # def unlink(item) link_to_delete = Things::Links::Provider.create_link(item, self, {}) provider = Things::Links::Provider.registry.provider_for(link_to_delete.uid) unless provider.is_a?(ManagedProvider) raise FrozenError, "Cannot remove the link #{link_to_delete.uid} from non-managed provider #{provider.inspect}" end provider.remove(link_to_delete.uid) end # @deprecated OH3.4 this whole section is not needed in OH4+. Also see Thing#config_eql? if Core.version < Core::V4_0 # @!visibility private module ChannelComparable # @!visibility private # This is only needed in OH3 because it is implemented in OH4 core def ==(other) return true if equal?(other) return false unless other.is_a?(Channel) %i[class uid label description kind channel_type_uid configuration properties default_tags auto_update_policy accepted_item_type].all? do |attr| send(attr) == other.send(attr) end end end org.openhab.core.thing.binding.builder.ChannelBuilder.const_get(:ChannelImpl).prepend(ChannelComparable) end end |
#item ⇒ Items::Item? (readonly)
Return the item this channel is linked to. If a channel is linked to more than one item, this method only returns the first item.
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/openhab/core/things/channel.rb', line 29 class Channel extend Forwardable delegate %i[item items thing] => :uid # @return [String] def inspect r = "#<OpenHAB::Core::Things::Channel #{uid}" r += " #{label.inspect}" if label r += " description=#{description.inspect}" if description r += " kind=#{kind.inspect}" r += " channel_type_uid=#{channel_type_uid.inspect}" if channel_type_uid r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty? r += " properties=#{properties.to_h}" unless properties.empty? r += " default_tags=#{default_tags.to_a}" unless default_tags.empty? r += " auto_update_policy=#{auto_update_policy}" if auto_update_policy r += " accepted_item_type=#{accepted_item_type}" if accepted_item_type "#{r}>" end # @!attribute [r] channel_type # @return [ChannelType] def channel_type ChannelType.registry.get_channel_type(channel_type_uid) end # @return [String] def to_s uid.to_s end # @!attribute item_name [r] # Return the name of the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [String, nil] def item_name item_names.first end # @!attribute item_names [r] # Return the names of all of the items this channel is linked to. # # @return [Array<String>] def item_names Things::Links::Provider.registry.get_linked_item_names(uid) end # @!attribute item [r] # Return the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [Items::Item, nil] def item items.first end # @!attribute items [r] # Return all of the items this channel is linked to. # # @return [Array<Items::Item>] def items Things::Links::Provider.registry.get_linked_items(uid).map { |item| Items::Proxy.new(item) } end # # @!attribute links [r] # Returns all of the channel's links (items and link configurations). # # @return [Items::ItemChannelLinks] An array of ItemChannelLink or an empty array # # @example Get the configuration of the first link # things["mqtt:topic:livingroom-light"].channel["power"].links.first.configuration # # @example Remove all managed links # things["mqtt:topic:livingroom-light"].channel["power"].links.clear # # @see link # @see unlink # def links Items::ItemChannelLinks.new(uid, Things::Links::Provider.registry.get_links(uid)) end # # @return [ItemChannelLink, nil] # # @overload link # Returns the channel's link. If an channel is linked to more than one item, # this method only returns the first link. # # @return [Things::ItemChannelLink, nil] # # @overload link(item, config = {}) # # Links the channel to an item. # # @param [String, Items::Item] item The item to link to. # @param [Hash] config The configuration for the link. # # @return [Things::ItemChannelLink] The created link. # # @example Link a channel to an item # things["mqtt:topic:livingroom-light"].channels["power"].link(LivingRoom_Light_Power) # # @example Specify a link configuration # things["mqtt:topic:outdoor-thermometer"].channels["temperature"].link( # High_Temperature_Alert, # profile: "system:hysteresis", # lower: "29 °C", # upper: "30 °C") # # @see links # @see unlink # def link(item = nil, config = nil) return Things::Links::Provider.registry.get_links(uid).first if item.nil? && config.nil? config ||= {} Core::Things::Links::Provider.create_link(item, self, config).tap do |new_link| provider = Core::Things::Links::Provider.current if !(current_link = provider.get(new_link.uid)) provider.add(new_link) elsif current_link.configuration != config provider.update(new_link) end end end # # Removes a link to an item from managed link providers. # # @param [String, Items::Item] item The item to remove the link to. # # @return [Things::ItemChannelLink, nil] The removed link, if found. # @raise [FrozenError] if the link is not managed by a managed link provider. # # @see link # @see links # def unlink(item) link_to_delete = Things::Links::Provider.create_link(item, self, {}) provider = Things::Links::Provider.registry.provider_for(link_to_delete.uid) unless provider.is_a?(ManagedProvider) raise FrozenError, "Cannot remove the link #{link_to_delete.uid} from non-managed provider #{provider.inspect}" end provider.remove(link_to_delete.uid) end # @deprecated OH3.4 this whole section is not needed in OH4+. Also see Thing#config_eql? if Core.version < Core::V4_0 # @!visibility private module ChannelComparable # @!visibility private # This is only needed in OH3 because it is implemented in OH4 core def ==(other) return true if equal?(other) return false unless other.is_a?(Channel) %i[class uid label description kind channel_type_uid configuration properties default_tags auto_update_policy accepted_item_type].all? do |attr| send(attr) == other.send(attr) end end end org.openhab.core.thing.binding.builder.ChannelBuilder.const_get(:ChannelImpl).prepend(ChannelComparable) end end |
#item_name ⇒ String? (readonly)
Return the name of the item this channel is linked to. If a channel is linked to more than one item, this method only returns the first item.
65 66 67 |
# File 'lib/openhab/core/things/channel.rb', line 65 def item_name item_names.first end |
#item_names ⇒ Array<String> (readonly)
Return the names of all of the items this channel is linked to.
73 74 75 |
# File 'lib/openhab/core/things/channel.rb', line 73 def item_names Things::Links::Provider.registry.get_linked_item_names(uid) end |
#items ⇒ Array<Items::Item> (readonly)
Return all of the items this channel is linked to.
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/openhab/core/things/channel.rb', line 29 class Channel extend Forwardable delegate %i[item items thing] => :uid # @return [String] def inspect r = "#<OpenHAB::Core::Things::Channel #{uid}" r += " #{label.inspect}" if label r += " description=#{description.inspect}" if description r += " kind=#{kind.inspect}" r += " channel_type_uid=#{channel_type_uid.inspect}" if channel_type_uid r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty? r += " properties=#{properties.to_h}" unless properties.empty? r += " default_tags=#{default_tags.to_a}" unless default_tags.empty? r += " auto_update_policy=#{auto_update_policy}" if auto_update_policy r += " accepted_item_type=#{accepted_item_type}" if accepted_item_type "#{r}>" end # @!attribute [r] channel_type # @return [ChannelType] def channel_type ChannelType.registry.get_channel_type(channel_type_uid) end # @return [String] def to_s uid.to_s end # @!attribute item_name [r] # Return the name of the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [String, nil] def item_name item_names.first end # @!attribute item_names [r] # Return the names of all of the items this channel is linked to. # # @return [Array<String>] def item_names Things::Links::Provider.registry.get_linked_item_names(uid) end # @!attribute item [r] # Return the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [Items::Item, nil] def item items.first end # @!attribute items [r] # Return all of the items this channel is linked to. # # @return [Array<Items::Item>] def items Things::Links::Provider.registry.get_linked_items(uid).map { |item| Items::Proxy.new(item) } end # # @!attribute links [r] # Returns all of the channel's links (items and link configurations). # # @return [Items::ItemChannelLinks] An array of ItemChannelLink or an empty array # # @example Get the configuration of the first link # things["mqtt:topic:livingroom-light"].channel["power"].links.first.configuration # # @example Remove all managed links # things["mqtt:topic:livingroom-light"].channel["power"].links.clear # # @see link # @see unlink # def links Items::ItemChannelLinks.new(uid, Things::Links::Provider.registry.get_links(uid)) end # # @return [ItemChannelLink, nil] # # @overload link # Returns the channel's link. If an channel is linked to more than one item, # this method only returns the first link. # # @return [Things::ItemChannelLink, nil] # # @overload link(item, config = {}) # # Links the channel to an item. # # @param [String, Items::Item] item The item to link to. # @param [Hash] config The configuration for the link. # # @return [Things::ItemChannelLink] The created link. # # @example Link a channel to an item # things["mqtt:topic:livingroom-light"].channels["power"].link(LivingRoom_Light_Power) # # @example Specify a link configuration # things["mqtt:topic:outdoor-thermometer"].channels["temperature"].link( # High_Temperature_Alert, # profile: "system:hysteresis", # lower: "29 °C", # upper: "30 °C") # # @see links # @see unlink # def link(item = nil, config = nil) return Things::Links::Provider.registry.get_links(uid).first if item.nil? && config.nil? config ||= {} Core::Things::Links::Provider.create_link(item, self, config).tap do |new_link| provider = Core::Things::Links::Provider.current if !(current_link = provider.get(new_link.uid)) provider.add(new_link) elsif current_link.configuration != config provider.update(new_link) end end end # # Removes a link to an item from managed link providers. # # @param [String, Items::Item] item The item to remove the link to. # # @return [Things::ItemChannelLink, nil] The removed link, if found. # @raise [FrozenError] if the link is not managed by a managed link provider. # # @see link # @see links # def unlink(item) link_to_delete = Things::Links::Provider.create_link(item, self, {}) provider = Things::Links::Provider.registry.provider_for(link_to_delete.uid) unless provider.is_a?(ManagedProvider) raise FrozenError, "Cannot remove the link #{link_to_delete.uid} from non-managed provider #{provider.inspect}" end provider.remove(link_to_delete.uid) end # @deprecated OH3.4 this whole section is not needed in OH4+. Also see Thing#config_eql? if Core.version < Core::V4_0 # @!visibility private module ChannelComparable # @!visibility private # This is only needed in OH3 because it is implemented in OH4 core def ==(other) return true if equal?(other) return false unless other.is_a?(Channel) %i[class uid label description kind channel_type_uid configuration properties default_tags auto_update_policy accepted_item_type].all? do |attr| send(attr) == other.send(attr) end end end org.openhab.core.thing.binding.builder.ChannelBuilder.const_get(:ChannelImpl).prepend(ChannelComparable) end end |
#links ⇒ Items::ItemChannelLinks (readonly)
Returns all of the channel's links (items and link configurations).
109 110 111 |
# File 'lib/openhab/core/things/channel.rb', line 109 def links Items::ItemChannelLinks.new(uid, Things::Links::Provider.registry.get_links(uid)) end |
#thing ⇒ Thing? (readonly)
Return the thing this channel is associated with.
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/openhab/core/things/channel.rb', line 29 class Channel extend Forwardable delegate %i[item items thing] => :uid # @return [String] def inspect r = "#<OpenHAB::Core::Things::Channel #{uid}" r += " #{label.inspect}" if label r += " description=#{description.inspect}" if description r += " kind=#{kind.inspect}" r += " channel_type_uid=#{channel_type_uid.inspect}" if channel_type_uid r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty? r += " properties=#{properties.to_h}" unless properties.empty? r += " default_tags=#{default_tags.to_a}" unless default_tags.empty? r += " auto_update_policy=#{auto_update_policy}" if auto_update_policy r += " accepted_item_type=#{accepted_item_type}" if accepted_item_type "#{r}>" end # @!attribute [r] channel_type # @return [ChannelType] def channel_type ChannelType.registry.get_channel_type(channel_type_uid) end # @return [String] def to_s uid.to_s end # @!attribute item_name [r] # Return the name of the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [String, nil] def item_name item_names.first end # @!attribute item_names [r] # Return the names of all of the items this channel is linked to. # # @return [Array<String>] def item_names Things::Links::Provider.registry.get_linked_item_names(uid) end # @!attribute item [r] # Return the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [Items::Item, nil] def item items.first end # @!attribute items [r] # Return all of the items this channel is linked to. # # @return [Array<Items::Item>] def items Things::Links::Provider.registry.get_linked_items(uid).map { |item| Items::Proxy.new(item) } end # # @!attribute links [r] # Returns all of the channel's links (items and link configurations). # # @return [Items::ItemChannelLinks] An array of ItemChannelLink or an empty array # # @example Get the configuration of the first link # things["mqtt:topic:livingroom-light"].channel["power"].links.first.configuration # # @example Remove all managed links # things["mqtt:topic:livingroom-light"].channel["power"].links.clear # # @see link # @see unlink # def links Items::ItemChannelLinks.new(uid, Things::Links::Provider.registry.get_links(uid)) end # # @return [ItemChannelLink, nil] # # @overload link # Returns the channel's link. If an channel is linked to more than one item, # this method only returns the first link. # # @return [Things::ItemChannelLink, nil] # # @overload link(item, config = {}) # # Links the channel to an item. # # @param [String, Items::Item] item The item to link to. # @param [Hash] config The configuration for the link. # # @return [Things::ItemChannelLink] The created link. # # @example Link a channel to an item # things["mqtt:topic:livingroom-light"].channels["power"].link(LivingRoom_Light_Power) # # @example Specify a link configuration # things["mqtt:topic:outdoor-thermometer"].channels["temperature"].link( # High_Temperature_Alert, # profile: "system:hysteresis", # lower: "29 °C", # upper: "30 °C") # # @see links # @see unlink # def link(item = nil, config = nil) return Things::Links::Provider.registry.get_links(uid).first if item.nil? && config.nil? config ||= {} Core::Things::Links::Provider.create_link(item, self, config).tap do |new_link| provider = Core::Things::Links::Provider.current if !(current_link = provider.get(new_link.uid)) provider.add(new_link) elsif current_link.configuration != config provider.update(new_link) end end end # # Removes a link to an item from managed link providers. # # @param [String, Items::Item] item The item to remove the link to. # # @return [Things::ItemChannelLink, nil] The removed link, if found. # @raise [FrozenError] if the link is not managed by a managed link provider. # # @see link # @see links # def unlink(item) link_to_delete = Things::Links::Provider.create_link(item, self, {}) provider = Things::Links::Provider.registry.provider_for(link_to_delete.uid) unless provider.is_a?(ManagedProvider) raise FrozenError, "Cannot remove the link #{link_to_delete.uid} from non-managed provider #{provider.inspect}" end provider.remove(link_to_delete.uid) end # @deprecated OH3.4 this whole section is not needed in OH4+. Also see Thing#config_eql? if Core.version < Core::V4_0 # @!visibility private module ChannelComparable # @!visibility private # This is only needed in OH3 because it is implemented in OH4 core def ==(other) return true if equal?(other) return false unless other.is_a?(Channel) %i[class uid label description kind channel_type_uid configuration properties default_tags auto_update_policy accepted_item_type].all? do |attr| send(attr) == other.send(attr) end end end org.openhab.core.thing.binding.builder.ChannelBuilder.const_get(:ChannelImpl).prepend(ChannelComparable) end end |
#uid ⇒ ChannelUID (readonly)
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/openhab/core/things/channel.rb', line 29 class Channel extend Forwardable delegate %i[item items thing] => :uid # @return [String] def inspect r = "#<OpenHAB::Core::Things::Channel #{uid}" r += " #{label.inspect}" if label r += " description=#{description.inspect}" if description r += " kind=#{kind.inspect}" r += " channel_type_uid=#{channel_type_uid.inspect}" if channel_type_uid r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty? r += " properties=#{properties.to_h}" unless properties.empty? r += " default_tags=#{default_tags.to_a}" unless default_tags.empty? r += " auto_update_policy=#{auto_update_policy}" if auto_update_policy r += " accepted_item_type=#{accepted_item_type}" if accepted_item_type "#{r}>" end # @!attribute [r] channel_type # @return [ChannelType] def channel_type ChannelType.registry.get_channel_type(channel_type_uid) end # @return [String] def to_s uid.to_s end # @!attribute item_name [r] # Return the name of the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [String, nil] def item_name item_names.first end # @!attribute item_names [r] # Return the names of all of the items this channel is linked to. # # @return [Array<String>] def item_names Things::Links::Provider.registry.get_linked_item_names(uid) end # @!attribute item [r] # Return the item this channel is linked to. If a channel is linked to more than one item, # this method only returns the first item. # # @return [Items::Item, nil] def item items.first end # @!attribute items [r] # Return all of the items this channel is linked to. # # @return [Array<Items::Item>] def items Things::Links::Provider.registry.get_linked_items(uid).map { |item| Items::Proxy.new(item) } end # # @!attribute links [r] # Returns all of the channel's links (items and link configurations). # # @return [Items::ItemChannelLinks] An array of ItemChannelLink or an empty array # # @example Get the configuration of the first link # things["mqtt:topic:livingroom-light"].channel["power"].links.first.configuration # # @example Remove all managed links # things["mqtt:topic:livingroom-light"].channel["power"].links.clear # # @see link # @see unlink # def links Items::ItemChannelLinks.new(uid, Things::Links::Provider.registry.get_links(uid)) end # # @return [ItemChannelLink, nil] # # @overload link # Returns the channel's link. If an channel is linked to more than one item, # this method only returns the first link. # # @return [Things::ItemChannelLink, nil] # # @overload link(item, config = {}) # # Links the channel to an item. # # @param [String, Items::Item] item The item to link to. # @param [Hash] config The configuration for the link. # # @return [Things::ItemChannelLink] The created link. # # @example Link a channel to an item # things["mqtt:topic:livingroom-light"].channels["power"].link(LivingRoom_Light_Power) # # @example Specify a link configuration # things["mqtt:topic:outdoor-thermometer"].channels["temperature"].link( # High_Temperature_Alert, # profile: "system:hysteresis", # lower: "29 °C", # upper: "30 °C") # # @see links # @see unlink # def link(item = nil, config = nil) return Things::Links::Provider.registry.get_links(uid).first if item.nil? && config.nil? config ||= {} Core::Things::Links::Provider.create_link(item, self, config).tap do |new_link| provider = Core::Things::Links::Provider.current if !(current_link = provider.get(new_link.uid)) provider.add(new_link) elsif current_link.configuration != config provider.update(new_link) end end end # # Removes a link to an item from managed link providers. # # @param [String, Items::Item] item The item to remove the link to. # # @return [Things::ItemChannelLink, nil] The removed link, if found. # @raise [FrozenError] if the link is not managed by a managed link provider. # # @see link # @see links # def unlink(item) link_to_delete = Things::Links::Provider.create_link(item, self, {}) provider = Things::Links::Provider.registry.provider_for(link_to_delete.uid) unless provider.is_a?(ManagedProvider) raise FrozenError, "Cannot remove the link #{link_to_delete.uid} from non-managed provider #{provider.inspect}" end provider.remove(link_to_delete.uid) end # @deprecated OH3.4 this whole section is not needed in OH4+. Also see Thing#config_eql? if Core.version < Core::V4_0 # @!visibility private module ChannelComparable # @!visibility private # This is only needed in OH3 because it is implemented in OH4 core def ==(other) return true if equal?(other) return false unless other.is_a?(Channel) %i[class uid label description kind channel_type_uid configuration properties default_tags auto_update_policy accepted_item_type].all? do |attr| send(attr) == other.send(attr) end end end org.openhab.core.thing.binding.builder.ChannelBuilder.const_get(:ChannelImpl).prepend(ChannelComparable) end end |
Instance Method Details
#inspect ⇒ String
35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/openhab/core/things/channel.rb', line 35 def inspect r = "#<OpenHAB::Core::Things::Channel #{uid}" r += " #{label.inspect}" if label r += " description=#{description.inspect}" if description r += " kind=#{kind.inspect}" r += " channel_type_uid=#{channel_type_uid.inspect}" if channel_type_uid r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty? r += " properties=#{properties.to_h}" unless properties.empty? r += " default_tags=#{default_tags.to_a}" unless default_tags.empty? r += " auto_update_policy=#{auto_update_policy}" if auto_update_policy r += " accepted_item_type=#{accepted_item_type}" if accepted_item_type "#{r}>" end |
#link ⇒ Things::ItemChannelLink? #link(item, config = {}) ⇒ Things::ItemChannelLink
144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/openhab/core/things/channel.rb', line 144 def link(item = nil, config = nil) return Things::Links::Provider.registry.get_links(uid).first if item.nil? && config.nil? config ||= {} Core::Things::Links::Provider.create_link(item, self, config).tap do |new_link| provider = Core::Things::Links::Provider.current if !(current_link = provider.get(new_link.uid)) provider.add(new_link) elsif current_link.configuration != config provider.update(new_link) end end end |
#to_s ⇒ String
56 57 58 |
# File 'lib/openhab/core/things/channel.rb', line 56 def to_s uid.to_s end |
#unlink(item) ⇒ Things::ItemChannelLink?
Removes a link to an item from managed link providers.
169 170 171 172 173 174 175 176 177 178 |
# File 'lib/openhab/core/things/channel.rb', line 169 def unlink(item) link_to_delete = Things::Links::Provider.create_link(item, self, {}) provider = Things::Links::Provider.registry.provider_for(link_to_delete.uid) unless provider.is_a?(ManagedProvider) raise FrozenError, "Cannot remove the link #{link_to_delete.uid} from non-managed provider #{provider.inspect}" end provider.remove(link_to_delete.uid) end |