openhab-scripting 5.9.0 → 5.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f531c0d4e77bbee531e574b759f56e458d4eacde89520b8cf9f810dd46e61d9
4
- data.tar.gz: 7724b5709c56fb80f095c14930fd3077a2019111731865f1956f4b080a8039ab
3
+ metadata.gz: acf8ae7ed285c32bb11070e6ae64c54b9687dae7883c272be4a9ad30f399ed8c
4
+ data.tar.gz: 8820ac3849f07734843d2863ff483fbde70bfe56c41981f2d48ec2e8c7bd73a8
5
5
  SHA512:
6
- metadata.gz: 11237012154342229a7b1a4b24a2e5e8f81833d758e81614b067c4a1187a598e5fbc45cfd300312ef0f039130a039e6df7c75f59e08e458d0bdf7761e2a85f8d
7
- data.tar.gz: 3bd394f5d950d2ab5a0016a4219d7d1ac0cb9f4fbdca541d4f41c9e59406c01a1d0df242334cc95a4cf1668f546e1f0fc7aa03cd835f71384e4a3de4cace8304
6
+ metadata.gz: ab2e153c20c4d81b4b4b5b7d3025d1f49812099ea1040eba85b03f6fc8ce4217d84a3204e1c0917ed53c8386220b25da7d1da4bc367b51459ef74d67a52d7d44
7
+ data.tar.gz: 0bdc096799e02f344f7d24c218af6ed045840c9a87ab890e81a339896801c53c6e18a6dabafd060e2c18023b69da8fdb4df9d3d58fcab3917baba6274fe992eb
@@ -10,6 +10,9 @@ module OpenHAB
10
10
  # @return [Object]
11
11
  attr_accessor :attachment
12
12
 
13
+ # @return [Hash]
14
+ attr_accessor :inputs
15
+
13
16
  # @return [String]
14
17
  alias_method :inspect, :to_s
15
18
 
@@ -16,6 +16,25 @@ module OpenHAB
16
16
  def item
17
17
  EntityLookup.lookup_item(item_name)
18
18
  end
19
+
20
+ #
21
+ # @!attribute [r] group
22
+ #
23
+ # Returns the group item whose member had triggered this event.
24
+ #
25
+ # This is the equivalent of openHAB's `triggeringGroup`, and it is only available
26
+ # on a member-of-group trigger.
27
+ #
28
+ # @return [Item,nil] The group item whose member had triggered this event.
29
+ # `nil` when the event wasn't triggered by a member-of-group trigger.
30
+ #
31
+ # @since openHAB 4.0 for file-based rules
32
+ # @since openHAB 4.1 for UI rules
33
+ #
34
+ def group
35
+ triggering_group = inputs&.[]("triggeringGroup") || $ctx&.[]("triggeringGroup")
36
+ Items::Proxy.new(triggering_group) if triggering_group
37
+ end
19
38
  end
20
39
  end
21
40
  end
@@ -251,6 +251,7 @@ module OpenHAB
251
251
  !(self.tags.to_a & tags).empty?
252
252
  end
253
253
 
254
+ # @!attribute thing [r]
254
255
  # Return the item's thing if this item is linked with a thing. If an item is linked to more than one thing,
255
256
  # this method only returns the first thing.
256
257
  #
@@ -260,6 +261,7 @@ module OpenHAB
260
261
  end
261
262
  alias_method :linked_thing, :thing
262
263
 
264
+ # @!attribute things [r]
263
265
  # Returns all of the item's linked things.
264
266
  #
265
267
  # @return [Array<Thing>] An array of things or an empty array
@@ -268,11 +270,80 @@ module OpenHAB
268
270
  end
269
271
  alias_method :all_linked_things, :things
270
272
 
273
+ #
274
+ # @!attribute links [r]
271
275
  # Returns all of the item's links (channels and link configurations).
272
276
  #
273
- # @return [Array<ItemChannelLink>] An array of ItemChannelLink or an empty array
277
+ # @return [ItemChannelLinks] An array of ItemChannelLink or an empty array
278
+ #
279
+ # @example Get the configuration of the first link
280
+ # LivingRoom_Light_Power.links.first.configuration
281
+ #
282
+ # @example Remove all managed links
283
+ # LivingRoom_Light_Power.links.clear
284
+ #
285
+ # @see link
286
+ # @see unlink
287
+ #
274
288
  def links
275
- Things::Links::Provider.registry.get_links(name)
289
+ ItemChannelLinks.new(self, Things::Links::Provider.registry.get_links(name))
290
+ end
291
+
292
+ #
293
+ # Links the item to a channel.
294
+ #
295
+ # @param [String, Things::Channel, Things::ChannelUID] channel The channel to link to.
296
+ # @param [Hash] config The configuration for the link.
297
+ #
298
+ # @return [Things::ItemChannelLink] The created link.
299
+ #
300
+ # @example Link an item to a channel
301
+ # LivingRoom_Light_Power.link("mqtt:topic:livingroom-light:power")
302
+ #
303
+ # @example Link to a Thing's channel
304
+ # LivingRoom_Light_Power.link(things["mqtt:topic:livingroom-light"].channels["power"])
305
+ #
306
+ # @example Specify a link configuration
307
+ # High_Temperature_Alert.link(
308
+ # "mqtt:topic:outdoor-thermometer:temperature",
309
+ # profile: "system:hysteresis",
310
+ # lower: "29 °C",
311
+ # upper: "30 °C")
312
+ #
313
+ # @see links
314
+ # @see unlink
315
+ #
316
+ def link(channel, config = {})
317
+ Core::Things::Links::Provider.create_link(self, channel, config).tap do |new_link|
318
+ provider = Core::Things::Links::Provider.current
319
+ if !(current_link = provider.get(new_link.uid))
320
+ provider.add(new_link)
321
+ elsif current_link.configuration != config
322
+ provider.update(new_link)
323
+ end
324
+ end
325
+ end
326
+
327
+ #
328
+ # Removes a link to a channel from managed link providers.
329
+ #
330
+ # @param [String, Things::Channel, Things::ChannelUID] channel The channel to remove the link to.
331
+ #
332
+ # @return [Things::ItemChannelLink, nil] The removed link, if found.
333
+ # @raise [FrozenError] if the link is not managed by a managed link provider.
334
+ #
335
+ # @see link
336
+ # @see links
337
+ #
338
+ def unlink(channel)
339
+ link_to_delete = Things::Links::Provider.create_link(self, channel, {})
340
+ provider = Things::Links::Provider.registry.provider_for(link_to_delete.uid)
341
+ unless provider.is_a?(ManagedProvider)
342
+ raise FrozenError,
343
+ "Cannot remove the link #{link_to_delete.uid} from non-managed provider #{provider.inspect}"
344
+ end
345
+
346
+ provider.remove(link_to_delete.uid)
276
347
  end
277
348
 
278
349
  # @return [String]
@@ -286,7 +357,8 @@ module OpenHAB
286
357
  "#{s}>"
287
358
  end
288
359
 
289
- # @return [org.openhab.core.common.registry.Provider, nil]
360
+ # @!attribute provider [r]
361
+ # @return [org.openhab.core.common.registry.Provider, nil] Returns the provider for this item.
290
362
  def provider
291
363
  Provider.registry.provider_for(self)
292
364
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "delegate"
4
+
5
+ module OpenHAB
6
+ module Core
7
+ module Items
8
+ #
9
+ # A wrapper for {Item#links} delegated to Set<{org.openhab.core.thing.link.ItemChannelLink}>.
10
+ #
11
+ # Adds methods for clearing item's links to channels.
12
+ #
13
+ class ItemChannelLinks < SimpleDelegator
14
+ #
15
+ # @param [Item] item The item that the links belong to
16
+ # @param [Set<ItemChannelLink>] links The set of links to delegate to
17
+ #
18
+ # @!visibility private
19
+ def initialize(item, links)
20
+ super(links)
21
+ @item = item
22
+ end
23
+
24
+ #
25
+ # Removes all links to channels from managed link providers.
26
+ # @return [self]
27
+ #
28
+ def clear
29
+ Things::Links::Provider.registry.all.each do |link|
30
+ next unless link.item_name == @item.name
31
+
32
+ provider = Things::Links::Provider.registry.provider_for(link.uid)
33
+ if provider.is_a?(ManagedProvider)
34
+ provider.remove(link.uid)
35
+ else
36
+ logger.warn("Cannot remove the link #{link.uid} from non-managed provider #{provider.inspect}")
37
+ end
38
+ end
39
+ self
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -311,6 +311,11 @@ module OpenHAB
311
311
  synonyms = Array.wrap(synonyms).map { |s| s.to_s.strip }
312
312
 
313
313
  tags.map do |name, parent|
314
+ if (existing_tag = lookup(name))
315
+ logger.warn("Tag already exists: #{existing_tag.inspect}")
316
+ next
317
+ end
318
+
314
319
  unless parent.is_a?(SemanticTag)
315
320
  parent_tag = lookup(parent)
316
321
  raise ArgumentError, "Unknown parent: #{parent}" unless parent_tag
@@ -318,8 +323,6 @@ module OpenHAB
318
323
  parent = parent_tag
319
324
  end
320
325
 
321
- next if lookup(name)
322
-
323
326
  new_tag = org.openhab.core.semantics.SemanticTagImpl.new("#{parent.uid}_#{name}",
324
327
  label,
325
328
  description,
@@ -42,8 +42,7 @@ module OpenHAB
42
42
  # @return [Array<Item>] An array of things or an empty array
43
43
  #
44
44
  def items
45
- registry = OSGi.service("org.openhab.core.thing.link.ItemChannelLinkRegistry")
46
- registry.get_linked_items(self).map { |i| Items::Proxy.new(i) }
45
+ Links::Provider.registry.get_linked_items(self).map { |i| Items::Proxy.new(i) }
47
46
  end
48
47
  end
49
48
  end
@@ -26,6 +26,12 @@ module OpenHAB
26
26
  DSL.items[item_name]
27
27
  end
28
28
 
29
+ # @!attribute [r] channel
30
+ # @return [Channel]
31
+ def channel
32
+ DSL.things[linked_uid.thing_uid].channels[linked_uid.id]
33
+ end
34
+
29
35
  alias_method :channel_uid, :linked_uid
30
36
  end
31
37
  end
@@ -8,44 +8,37 @@ module OpenHAB
8
8
  # and channels.
9
9
  #
10
10
  module ProfileCallback
11
- class << self
12
- #
13
- # Wraps the parent class's method to format non-Types.
14
- #
15
- # @!macro def_state_parsing_method
16
- # @!method $1($2)
17
- # @return [void]
18
- # @!visibility private
19
- def def_state_parsing_method(method, param_name)
20
- class_eval <<~RUBY, __FILE__, __LINE__ + 1
21
- def #{method}(type) # def handle_command(type)
22
- type = link.item.format_#{(param_name == :state) ? :update : param_name}(type) # type = link.item.format_command(type)
23
- super(type) # super(type)
24
- end # end
25
- RUBY
26
- end
27
- end
28
-
29
11
  #
30
12
  # Forward the given command to the respective thing handler.
31
13
  #
32
14
  # @param [Command] command
33
15
  #
34
- def_state_parsing_method(:handle_command, :command)
16
+ def handle_command(command)
17
+ @dummy_channel_item ||= DSL::Items::ItemBuilder.item_factory.create_item(link.channel.accepted_item_type,
18
+ "")
19
+ command = @dummy_channel_item.format_command(command)
20
+ super(command)
21
+ end
35
22
 
36
23
  #
37
24
  # Send a command to the framework.
38
25
  #
39
26
  # @param [Command] command
40
27
  #
41
- def_state_parsing_method(:send_command, :command)
28
+ def send_command(command)
29
+ command = link.item.format_command(command)
30
+ super(command)
31
+ end
42
32
 
43
33
  #
44
34
  # Send a state update to the framework.
45
35
  #
46
36
  # @param [State] state
47
37
  #
48
- def_state_parsing_method(:send_update, :state)
38
+ def send_update(state)
39
+ state = link.item.format_update(state)
40
+ super(state)
41
+ end
49
42
  end
50
43
  end
51
44
  end
@@ -156,7 +156,6 @@ module OpenHAB
156
156
  item.update(builder.state) unless builder.state.nil?
157
157
 
158
158
  # make sure to add the item to the registry before linking it
159
- provider = Core::Things::Links::Provider.current
160
159
  channel_uids = builder.channels.to_set do |(channel, config)|
161
160
  # fill in partial channel names from group's thing id
162
161
  if !channel.include?(":") &&
@@ -165,17 +164,11 @@ module OpenHAB
165
164
  channel = "#{thing}:#{channel}"
166
165
  end
167
166
 
168
- new_link = Core::Things::Links::Provider.create_link(item, channel, config)
169
- if !(current_link = provider.get(new_link.uid))
170
- provider.add(new_link)
171
- elsif current_link.configuration != config
172
- provider.update(new_link)
173
- end
174
-
175
- new_link.linked_uid
167
+ item.link(channel, config).linked_uid
176
168
  end
177
169
 
178
170
  # remove links not in the new item
171
+ provider = Core::Things::Links::Provider.current
179
172
  provider.all.each do |link|
180
173
  provider.remove(link.uid) if link.item_name == item.name && !channel_uids.include?(link.linked_uid)
181
174
  end
@@ -149,6 +149,8 @@ module OpenHAB
149
149
  end
150
150
 
151
151
  event.attachment = attachment
152
+ # events that are not from AbstractEvent do not have inputs
153
+ event.inputs = inputs if event.respond_to?(:inputs=)
152
154
  return event
153
155
  end
154
156
 
@@ -4,6 +4,6 @@ module OpenHAB
4
4
  module DSL
5
5
  # Version of openHAB helper libraries
6
6
  # @return [String]
7
- VERSION = "5.9.0"
7
+ VERSION = "5.10.0"
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openhab-scripting
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.9.0
4
+ version: 5.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian O'Connell
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-10-09 00:00:00.000000000 Z
13
+ date: 2023-10-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -409,6 +409,7 @@ files:
409
409
  - lib/openhab/core/items/group_item.rb
410
410
  - lib/openhab/core/items/image_item.rb
411
411
  - lib/openhab/core/items/item.rb
412
+ - lib/openhab/core/items/item_channel_links.rb
412
413
  - lib/openhab/core/items/location_item.rb
413
414
  - lib/openhab/core/items/metadata.rb
414
415
  - lib/openhab/core/items/metadata/hash.rb