openhab-jrubyscripting 5.0.0.rc11 → 5.0.0.rc.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/openhab/core/actions/exec.rb +41 -41
- data/lib/openhab/core/actions/transformation.rb +3 -3
- data/lib/openhab/core/actions.rb +1 -1
- data/lib/openhab/core/events/item_command_event.rb +31 -31
- data/lib/openhab/core/events/item_state_changed_event.rb +41 -18
- data/lib/openhab/core/events/item_state_event.rb +46 -18
- data/lib/openhab/core/items/date_time_item.rb +3 -2
- data/lib/openhab/core/items/generic_item.rb +119 -1
- data/lib/openhab/core/items/item.rb +63 -9
- data/lib/openhab/core/items/metadata/hash.rb +1 -1
- data/lib/openhab/core/items/metadata/namespace_hash.rb +10 -2
- data/lib/openhab/core/items/metadata/provider.rb +2 -2
- data/lib/openhab/core/items/persistence.rb +48 -4
- data/lib/openhab/core/items/provider.rb +4 -0
- data/lib/openhab/core/items/registry.rb +10 -1
- data/lib/openhab/core/items/semantics/enumerable.rb +29 -6
- data/lib/openhab/core/items/state_storage.rb +2 -2
- data/lib/openhab/core/items.rb +6 -13
- data/lib/openhab/core/provider.rb +2 -2
- data/lib/openhab/core/proxy.rb +5 -0
- data/lib/openhab/core/registry.rb +12 -2
- data/lib/openhab/core/rules/provider.rb +0 -15
- data/lib/openhab/core/rules.rb +1 -1
- data/lib/openhab/core/script_handling.rb +8 -8
- data/lib/openhab/core/things/links/provider.rb +38 -0
- data/lib/openhab/core/things/provider.rb +4 -0
- data/lib/openhab/core/things/registry.rb +4 -0
- data/lib/openhab/core/timer.rb +3 -19
- data/lib/openhab/core/types/date_time_type.rb +1 -1
- data/lib/openhab/core/types/decimal_type.rb +4 -9
- data/lib/openhab/core/types/hsb_type.rb +2 -2
- data/lib/openhab/core/types/quantity_type.rb +4 -9
- data/lib/openhab/core/types/string_type.rb +1 -1
- data/lib/openhab/core/types/type.rb +8 -28
- data/lib/openhab/core/types.rb +16 -3
- data/lib/openhab/core.rb +3 -3
- data/lib/openhab/core_ext/java/duration.rb +2 -0
- data/lib/openhab/core_ext/java/local_date.rb +15 -7
- data/lib/openhab/core_ext/java/local_time.rb +13 -3
- data/lib/openhab/core_ext/java/month.rb +1 -1
- data/lib/openhab/core_ext/java/month_day.rb +13 -3
- data/lib/openhab/core_ext/java/period.rb +1 -1
- data/lib/openhab/core_ext/java/temporal_amount.rb +1 -1
- data/lib/openhab/core_ext/java/time.rb +5 -1
- data/lib/openhab/core_ext/java/zoned_date_time.rb +15 -2
- data/lib/openhab/core_ext/ruby/date.rb +2 -2
- data/lib/openhab/core_ext/ruby/{class.rb → module.rb} +3 -3
- data/lib/openhab/core_ext/ruby/numeric.rb +6 -1
- data/lib/openhab/dsl/items/builder.rb +25 -12
- data/lib/openhab/dsl/items/ensure.rb +8 -6
- data/lib/openhab/dsl/rules/automation_rule.rb +2 -23
- data/lib/openhab/dsl/rules/builder.rb +47 -2
- data/lib/openhab/dsl/rules/terse.rb +15 -13
- data/lib/openhab/dsl/timer_manager.rb +1 -1
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +38 -11
- data/lib/openhab/osgi.rb +1 -3
- data/lib/openhab/rspec/helpers.rb +3 -5
- data/lib/openhab/rspec/hooks.rb +1 -0
- data/lib/openhab/rspec/mocks/timer.rb +33 -0
- data/lib/openhab/rspec.rb +9 -0
- metadata +23 -9
@@ -24,10 +24,6 @@ module OpenHAB
|
|
24
24
|
# The item's name.
|
25
25
|
# @return [String]
|
26
26
|
|
27
|
-
# @!attribute [r] label
|
28
|
-
# The item's descriptive label.
|
29
|
-
# @return [String, nil]
|
30
|
-
|
31
27
|
# @!attribute [r] accepted_command_types
|
32
28
|
# @return [Array<Class>] An array of {Command}s that can be sent as commands to this item
|
33
29
|
|
@@ -35,7 +31,7 @@ module OpenHAB
|
|
35
31
|
# @return [Array<Class>] An array of {State}s that can be sent as commands to this item
|
36
32
|
|
37
33
|
#
|
38
|
-
# The item's {#label} if one is defined, otherwise
|
34
|
+
# The item's {GenericItem#label label} if one is defined, otherwise its {#name}.
|
39
35
|
#
|
40
36
|
# @return [String]
|
41
37
|
#
|
@@ -46,14 +42,51 @@ module OpenHAB
|
|
46
42
|
#
|
47
43
|
# @!attribute [r] groups
|
48
44
|
#
|
49
|
-
#
|
45
|
+
# Returns all groups that this item is part of
|
50
46
|
#
|
51
|
-
# @return [Array<
|
47
|
+
# @return [Array<GroupItem>] All groups that this item is part of
|
52
48
|
#
|
53
49
|
def groups
|
54
50
|
group_names.map { |name| EntityLookup.lookup_item(name) }.compact
|
55
51
|
end
|
56
52
|
|
53
|
+
#
|
54
|
+
# Checks if this item is a member of at least one of the given groups.
|
55
|
+
#
|
56
|
+
# @param groups [String, GroupItem] the group to check membership in
|
57
|
+
# @return [true, false]
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# event.item.member_of?(gFullOn)
|
61
|
+
#
|
62
|
+
def member_of?(*groups)
|
63
|
+
groups = groups.map! do |group|
|
64
|
+
group.is_a?(GroupItem) ? group.name : group
|
65
|
+
end
|
66
|
+
!(group_names & groups).empty?
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# @!attribute [r] all_groups
|
71
|
+
#
|
72
|
+
# Returns all groups that this item is a part of, as well as those groups' groups, recursively
|
73
|
+
#
|
74
|
+
# @return [Array<GroupItem>]
|
75
|
+
#
|
76
|
+
def all_groups
|
77
|
+
result = []
|
78
|
+
new_groups = Set.new(groups)
|
79
|
+
|
80
|
+
until new_groups.empty?
|
81
|
+
result.concat(new_groups.to_a)
|
82
|
+
new_groups.replace(new_groups.flat_map(&:groups))
|
83
|
+
# remove any groups we already have in the result to avoid loops
|
84
|
+
new_groups.subtract(result)
|
85
|
+
end
|
86
|
+
|
87
|
+
result
|
88
|
+
end
|
89
|
+
|
57
90
|
# rubocop:disable Layout/LineLength
|
58
91
|
|
59
92
|
# @!attribute [r] metadata
|
@@ -81,7 +114,7 @@ module OpenHAB
|
|
81
114
|
# @example Access namespace1's configuration
|
82
115
|
# Item1.metadata["namespace1"]["config1"]
|
83
116
|
#
|
84
|
-
# @example Safely search for the specified value - no errors are raised, only nil returned if a key in the chain doesn
|
117
|
+
# @example Safely search for the specified value - no errors are raised, only nil returned if a key in the chain doesn't exist
|
85
118
|
# Item1.metadata.dig("namespace1", "config1") # => "foo"
|
86
119
|
# Item1.metadata.dig("namespace2", "config1") # => nil
|
87
120
|
#
|
@@ -176,6 +209,22 @@ module OpenHAB
|
|
176
209
|
end
|
177
210
|
# rubocop:enable Layout/LineLength
|
178
211
|
|
212
|
+
#
|
213
|
+
# Checks if this item has at least one of the given tags.
|
214
|
+
#
|
215
|
+
# @param tags [String, Module] the tag(s) to check
|
216
|
+
# @return [true, false]
|
217
|
+
#
|
218
|
+
# @example
|
219
|
+
# event.item.tagged?("Setpoint")
|
220
|
+
#
|
221
|
+
def tagged?(*tags)
|
222
|
+
tags = tags.map! do |tag|
|
223
|
+
tag.is_a?(Module) ? tag.simple_name : tag
|
224
|
+
end
|
225
|
+
!(self.tags.to_a & tags).empty?
|
226
|
+
end
|
227
|
+
|
179
228
|
# Return the item's thing if this item is linked with a thing. If an item is linked to more than one thing,
|
180
229
|
# this method only returns the first thing.
|
181
230
|
#
|
@@ -189,7 +238,7 @@ module OpenHAB
|
|
189
238
|
#
|
190
239
|
# @return [Array<Thing>] An array of things or an empty array
|
191
240
|
def things
|
192
|
-
registry =
|
241
|
+
registry = Things::Links::Provider.registry
|
193
242
|
channels = registry.get_bound_channels(name).to_a
|
194
243
|
channels.map(&:thing_uid).uniq.map { |tuid| EntityLookup.lookup_thing(tuid) }.compact
|
195
244
|
end
|
@@ -206,6 +255,11 @@ module OpenHAB
|
|
206
255
|
"#{s}>"
|
207
256
|
end
|
208
257
|
|
258
|
+
# @return [org.openhab.core.common.registry.Provider]
|
259
|
+
def provider
|
260
|
+
Provider.registry.provider_for(self)
|
261
|
+
end
|
262
|
+
|
209
263
|
private
|
210
264
|
|
211
265
|
# Allows sub-classes to append additional details to the type in an inspect string
|
@@ -384,7 +384,7 @@ module OpenHAB
|
|
384
384
|
alias_method :to_s, :inspect
|
385
385
|
|
386
386
|
#
|
387
|
-
# @raise [
|
387
|
+
# @raise [FrozenError] if the provider is not a
|
388
388
|
# {org.openhab.core.common.registry.ManagedProvider ManagedProvider} that can be updated.
|
389
389
|
# @return [org.openhab.core.common.registry.ManagedProvider]
|
390
390
|
#
|
@@ -218,8 +218,12 @@ module OpenHAB
|
|
218
218
|
return @hash.each_key(&block) unless attached?
|
219
219
|
return to_enum(:each_key) unless block
|
220
220
|
|
221
|
-
Provider.registry.
|
222
|
-
|
221
|
+
if Provider.registry.respond_to?(:get_all_namespaces)
|
222
|
+
keys.each(&block)
|
223
|
+
else
|
224
|
+
Provider.registry.all.each do |meta|
|
225
|
+
yield meta.uid.namespace if meta.uid.item_name == @item_name
|
226
|
+
end
|
223
227
|
end
|
224
228
|
self
|
225
229
|
end
|
@@ -313,6 +317,10 @@ module OpenHAB
|
|
313
317
|
|
314
318
|
# @!visibility private
|
315
319
|
def keys
|
320
|
+
if Provider.registry.respond_to?(:get_all_namespaces)
|
321
|
+
return Provider.registry.get_all_namespaces(@item_name).to_a
|
322
|
+
end
|
323
|
+
|
316
324
|
each_key.to_a
|
317
325
|
end
|
318
326
|
|
@@ -32,8 +32,8 @@ module OpenHAB
|
|
32
32
|
# @return [void]
|
33
33
|
#
|
34
34
|
def remove_item_metadata(item_name)
|
35
|
-
@elements.delete_if do |
|
36
|
-
next unless
|
35
|
+
@elements.delete_if do |_k, v|
|
36
|
+
next unless v.uid.item_name == item_name
|
37
37
|
|
38
38
|
notify_listeners_about_removed_element(v)
|
39
39
|
true
|
@@ -77,7 +77,6 @@ module OpenHAB
|
|
77
77
|
%i[changed_since?
|
78
78
|
count_since
|
79
79
|
count_state_changes_since
|
80
|
-
evolution_rate
|
81
80
|
historic_state
|
82
81
|
maximum_since
|
83
82
|
minimum_since
|
@@ -183,11 +182,22 @@ module OpenHAB
|
|
183
182
|
# @return [true,false] True if the item's state changed between `start` and `finish`, False otherwise.
|
184
183
|
|
185
184
|
# @!method evolution_rate(timestamp, service = nil)
|
186
|
-
# Returns the evolution rate of the item's state
|
187
|
-
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
188
|
-
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
185
|
+
# Returns the evolution rate of the item's state
|
189
186
|
# @return [DecimalType, QuantityType, nil] The evolution rate since `timestamp`,
|
190
187
|
# or nil if no previous state could be found.
|
188
|
+
# @overload evolution_rate(timestamp, service = nil)
|
189
|
+
# Returns the evolution rate of the item's state since the given time
|
190
|
+
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
191
|
+
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
192
|
+
# @return [DecimalType, QuantityType, nil] The evolution rate since `timestamp`,
|
193
|
+
# or nil if no previous state could be found.
|
194
|
+
# @overload evolution_rate(start, finish, service = nil)
|
195
|
+
# Returns the evolution rate of the item's state between two points in time
|
196
|
+
# @param [#to_zoned_date_time] start The point in time from which to search
|
197
|
+
# @param [#to_zoned_date_time] finish The point in time to which to search
|
198
|
+
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
199
|
+
# @return [DecimalType, QuantityType, nil] The evolution rate between `start` and `finish`,
|
200
|
+
# or nil if no previous state could be found.
|
191
201
|
|
192
202
|
# @!method historic_state(timestamp, service = nil)
|
193
203
|
# Returns the the item's state at the given time
|
@@ -317,6 +327,40 @@ module OpenHAB
|
|
317
327
|
end
|
318
328
|
end
|
319
329
|
|
330
|
+
# evolution_rate's "between" method is overloaded with the same name
|
331
|
+
method = :evolution_rate
|
332
|
+
define_method(method) do |start, finish_or_service = nil, service = nil|
|
333
|
+
if service.nil?
|
334
|
+
if finish_or_service.respond_to?(:to_zoned_date_time)
|
335
|
+
service = persistence_service
|
336
|
+
finish = finish_or_service
|
337
|
+
else
|
338
|
+
service = finish_or_service || persistence_service
|
339
|
+
finish = nil
|
340
|
+
end
|
341
|
+
else
|
342
|
+
finish = finish_or_service
|
343
|
+
end
|
344
|
+
|
345
|
+
result = if finish
|
346
|
+
Actions::PersistenceExtensions.public_send(
|
347
|
+
method,
|
348
|
+
self,
|
349
|
+
start.to_zoned_date_time,
|
350
|
+
finish.to_zoned_date_time,
|
351
|
+
service&.to_s
|
352
|
+
)
|
353
|
+
else
|
354
|
+
Actions::PersistenceExtensions.public_send(
|
355
|
+
method,
|
356
|
+
self,
|
357
|
+
start.to_zoned_date_time,
|
358
|
+
service&.to_s
|
359
|
+
)
|
360
|
+
end
|
361
|
+
wrap_result(result, method)
|
362
|
+
end
|
363
|
+
|
320
364
|
alias_method :state_changes_since, :count_state_changes_since
|
321
365
|
alias_method :state_changes_between, :count_state_changes_between
|
322
366
|
|
@@ -59,16 +59,25 @@ module OpenHAB
|
|
59
59
|
#
|
60
60
|
# The item must be a managed item (typically created by Ruby or in the UI).
|
61
61
|
#
|
62
|
+
# Any associated metadata or channel links are also removed.
|
63
|
+
#
|
62
64
|
# @param [String, Item] item_name
|
63
65
|
# @param recursive [true, false] Remove the item's members if it's a group
|
64
66
|
# @return [Item, nil] The removed item, if found.
|
65
67
|
def remove(item_name, recursive: false)
|
66
68
|
item_name = item_name.name if item_name.is_a?(Item)
|
67
69
|
provider = Provider.registry.provider_for(item_name)
|
68
|
-
unless provider.is_a?(
|
70
|
+
unless provider.is_a?(ManagedProvider)
|
69
71
|
raise "Cannot remove item #{item_name} from non-managed provider #{provider.inspect}"
|
70
72
|
end
|
71
73
|
|
74
|
+
Metadata::Provider.registry.providers.grep(ManagedProvider).each do |managed_provider|
|
75
|
+
managed_provider.remove_item_metadata(item_name)
|
76
|
+
end
|
77
|
+
|
78
|
+
Things::Links::Provider.registry.providers.grep(ManagedProvider).each do |managed_provider|
|
79
|
+
managed_provider.remove_links_for_item(item_name)
|
80
|
+
end
|
72
81
|
provider.remove(item_name, recursive)
|
73
82
|
end
|
74
83
|
end
|
@@ -40,33 +40,56 @@ module Enumerable
|
|
40
40
|
#
|
41
41
|
|
42
42
|
# Returns a new array of items that have at least one of the given tags
|
43
|
+
#
|
44
|
+
# @param tags [String, Module]
|
43
45
|
# @return [Array<Item>]
|
44
46
|
def tagged(*tags)
|
45
|
-
|
47
|
+
select { |i| i.tagged?(*tags) }
|
46
48
|
end
|
47
49
|
|
48
50
|
# Returns a new array of items that do not have any of the given tags
|
51
|
+
# @param tags [String, Module]
|
49
52
|
# @return [Array<Item>]
|
50
53
|
def not_tagged(*tags)
|
51
|
-
|
54
|
+
reject { |i| i.tagged?(*tags) }
|
52
55
|
end
|
53
56
|
|
54
57
|
# Returns a new array of items that are a member of at least one of the given groups
|
58
|
+
# @param groups [String, GroupItem]
|
55
59
|
# @return [Array<Item>]
|
56
60
|
def member_of(*groups)
|
57
|
-
|
61
|
+
select { |i| i.member_of?(*groups) }
|
58
62
|
end
|
59
63
|
|
60
64
|
# Returns a new array of items that are not a member of any of the given groups
|
65
|
+
# @param groups [String, GroupItem]
|
61
66
|
# @return [Array<Item>]
|
62
67
|
def not_member_of(*groups)
|
63
|
-
|
68
|
+
reject { |i| i.member_of?(*groups) }
|
64
69
|
end
|
65
70
|
|
66
|
-
# Returns the group members
|
71
|
+
# Returns the group members of all group elements
|
67
72
|
# @return [Array<Item>]
|
68
73
|
def members
|
69
|
-
grep(OpenHAB::Core::Items::GroupItem).flat_map(&:members)
|
74
|
+
grep(OpenHAB::Core::Items::GroupItem).flat_map(&:members).uniq
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns all non-group members of all group elements, recursively
|
78
|
+
# @return [Array<Item>]
|
79
|
+
def all_members
|
80
|
+
grep(OpenHAB::Core::Items::GroupItem).flat_map(&:all_members).uniq
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns the groups of all elements
|
84
|
+
# @return [Array<GroupItem>]
|
85
|
+
def groups
|
86
|
+
flat_map(&:groups).uniq
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns all groups all elements are a part of, recursively
|
90
|
+
# @return [Array<GroupItem>]
|
91
|
+
def all_groups
|
92
|
+
flat_map(&:all_groups).uniq
|
70
93
|
end
|
71
94
|
|
72
95
|
# @!group Items State and Command Methods
|
@@ -12,13 +12,13 @@ module OpenHAB
|
|
12
12
|
#
|
13
13
|
# Create a StateStorage object that stores the states of the given items
|
14
14
|
#
|
15
|
-
# @param [
|
15
|
+
# @param [Item] items A list of items
|
16
16
|
#
|
17
17
|
# @return [StateStorage] A state storage object
|
18
18
|
#
|
19
19
|
# @!visibility private
|
20
20
|
def self.from_items(*items)
|
21
|
-
StateStorage.new($events.store_states(*items).to_h)
|
21
|
+
StateStorage.new($events.store_states(*items.map(&:to_java)).to_h)
|
22
22
|
end
|
23
23
|
|
24
24
|
#
|
data/lib/openhab/core/items.rb
CHANGED
@@ -46,9 +46,9 @@ module OpenHAB
|
|
46
46
|
|
47
47
|
logger.trace("Defining #{klass}##{state_predicate} for #{state}")
|
48
48
|
klass.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
49
|
-
def #{state_predicate}
|
50
|
-
raw_state
|
51
|
-
end
|
49
|
+
def #{state_predicate} # def on?
|
50
|
+
raw_state.as(#{state.class.java_class.simple_name}).equal?(#{state}) # raw_state.as(OnOffType) == ON
|
51
|
+
end # end
|
52
52
|
RUBY
|
53
53
|
end
|
54
54
|
end
|
@@ -74,18 +74,11 @@ module OpenHAB
|
|
74
74
|
end # end
|
75
75
|
RUBY
|
76
76
|
|
77
|
-
# Override the inherited methods from Enumerable and send it to the base_item
|
78
|
-
GroupItem.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
79
|
-
def #{command} # def on
|
80
|
-
method_missing(:#{command}) # method_missing(:on)
|
81
|
-
end # end
|
82
|
-
RUBY
|
83
|
-
|
84
77
|
logger.trace("Defining ItemCommandEvent##{command}? for #{value}")
|
85
78
|
Events::ItemCommandEvent.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
86
|
-
def #{command}?
|
87
|
-
command
|
88
|
-
end
|
79
|
+
def #{command}? # def refresh?
|
80
|
+
command.as(#{value.class.java_class.simple_name}).equal?(#{value}) # command.as(RefreshType).equal?(REFRESH)
|
81
|
+
end # end
|
89
82
|
RUBY
|
90
83
|
end
|
91
84
|
end
|
@@ -219,11 +219,11 @@ module OpenHAB
|
|
219
219
|
|
220
220
|
private
|
221
221
|
|
222
|
-
def initialize(
|
222
|
+
def initialize(unload_priority: nil)
|
223
223
|
super()
|
224
224
|
@elements = java.util.concurrent.ConcurrentHashMap.new
|
225
225
|
self.class.registry.add_provider(self)
|
226
|
-
ScriptHandling.script_unloaded(
|
226
|
+
ScriptHandling.script_unloaded(priority: unload_priority) { unregister }
|
227
227
|
end
|
228
228
|
end
|
229
229
|
end
|
data/lib/openhab/core/proxy.rb
CHANGED
@@ -120,6 +120,11 @@ module OpenHAB
|
|
120
120
|
# define a sub-class of EventSubscriber as a child class of the including class
|
121
121
|
klass.const_set(:EventSubscriber, Class.new(EventSubscriber))
|
122
122
|
end
|
123
|
+
|
124
|
+
# @!visibility private
|
125
|
+
def to_java
|
126
|
+
__getobj__
|
127
|
+
end
|
123
128
|
end
|
124
129
|
end
|
125
130
|
end
|
@@ -4,7 +4,7 @@ module OpenHAB
|
|
4
4
|
module Core
|
5
5
|
Registry = org.openhab.core.common.registry.AbstractRegistry
|
6
6
|
|
7
|
-
Registry.field_reader :elementToProvider, :elementReadLock, :identifierToElement
|
7
|
+
Registry.field_reader :elementToProvider, :elementReadLock, :identifierToElement, :providerToElements
|
8
8
|
|
9
9
|
# @abstract
|
10
10
|
#
|
@@ -19,12 +19,22 @@ module OpenHAB
|
|
19
19
|
#
|
20
20
|
def provider_for(key)
|
21
21
|
elementReadLock.lock
|
22
|
-
|
22
|
+
if key.is_a?(org.openhab.core.common.registry.Identifiable)
|
23
|
+
element = key
|
24
|
+
else
|
25
|
+
return nil unless (element = identifierToElement[key])
|
26
|
+
end
|
23
27
|
|
24
28
|
elementToProvider[element]
|
25
29
|
ensure
|
26
30
|
elementReadLock.unlock
|
27
31
|
end
|
32
|
+
|
33
|
+
# @!attribute [r] providers
|
34
|
+
# @return [Enumerable<org.openhab.core.common.registry.Provider>]
|
35
|
+
def providers
|
36
|
+
providerToElements.keys
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
30
40
|
end
|
@@ -19,21 +19,6 @@ module OpenHAB
|
|
19
19
|
$rules
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
23
|
-
def initialize
|
24
|
-
super(script_unloaded_before: lambda do |callbacks|
|
25
|
-
callbacks.index do |cb|
|
26
|
-
case cb.binding.receiver
|
27
|
-
when Items::Provider,
|
28
|
-
Things::Provider,
|
29
|
-
DSL::TimerManager
|
30
|
-
true
|
31
|
-
else
|
32
|
-
false
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end)
|
36
|
-
end
|
37
22
|
end
|
38
23
|
end
|
39
24
|
end
|
data/lib/openhab/core/rules.rb
CHANGED
@@ -32,8 +32,6 @@ module OpenHAB
|
|
32
32
|
ScriptHandlingCallbacks.script_loaded_hooks << block
|
33
33
|
end
|
34
34
|
|
35
|
-
#
|
36
|
-
# @!method script_unloaded(&block)
|
37
35
|
#
|
38
36
|
# Add a block of code to be executed when the script is unloaded.
|
39
37
|
#
|
@@ -42,6 +40,10 @@ module OpenHAB
|
|
42
40
|
# Multiple hooks can be added by calling {#script_unloaded} multiple times.
|
43
41
|
# They can be used to perform final cleanup.
|
44
42
|
#
|
43
|
+
# @param [Integer, nil] priority The order at which the the given hook will be executed.
|
44
|
+
# The higher the number, the lower the priority. Higher priority hooks will be executed
|
45
|
+
# first, before the lower priority hooks. When nil, the default priority of zero will
|
46
|
+
# be used.
|
45
47
|
# @return [void]
|
46
48
|
#
|
47
49
|
# @example
|
@@ -49,10 +51,8 @@ module OpenHAB
|
|
49
51
|
# logger.info 'Hi, this script has been unloaded'
|
50
52
|
# end
|
51
53
|
#
|
52
|
-
def script_unloaded(
|
53
|
-
|
54
|
-
index = before.call(ScriptHandlingCallbacks.script_unloaded_hooks) if before
|
55
|
-
ScriptHandlingCallbacks.script_unloaded_hooks.insert(index || -1, block)
|
54
|
+
def script_unloaded(priority: nil, &block)
|
55
|
+
ScriptHandlingCallbacks.script_unloaded_hooks[priority || 0] << block
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -82,7 +82,7 @@ module OpenHAB
|
|
82
82
|
#
|
83
83
|
# @!visibility private
|
84
84
|
def script_unloaded_hooks
|
85
|
-
@script_unloaded_hooks ||= []
|
85
|
+
@script_unloaded_hooks ||= Hash.new { |hash, key| hash[key] = [] }
|
86
86
|
end
|
87
87
|
end
|
88
88
|
self.script_loaded = false
|
@@ -92,7 +92,7 @@ module OpenHAB
|
|
92
92
|
#
|
93
93
|
def scriptUnloaded # rubocop:disable Naming/MethodName method name dictated by openHAB
|
94
94
|
logger.trace("Script unloaded")
|
95
|
-
ScriptHandlingCallbacks.script_unloaded_hooks.each do |hook|
|
95
|
+
ScriptHandlingCallbacks.script_unloaded_hooks.sort_by(&:first).flat_map(&:last).each do |hook|
|
96
96
|
hook.call
|
97
97
|
rescue => e
|
98
98
|
logger.error("Failed to call script_unloaded hook #{hook}: #{e}")
|
@@ -33,6 +33,44 @@ module OpenHAB
|
|
33
33
|
current.add(link)
|
34
34
|
end
|
35
35
|
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Removes all links to a given item.
|
39
|
+
#
|
40
|
+
# @param [String] item_name
|
41
|
+
# @return [Integer] how many links were removed
|
42
|
+
#
|
43
|
+
def remove_links_for_item(item_name)
|
44
|
+
count = 0
|
45
|
+
@elements.delete_if do |_k, v|
|
46
|
+
next unless v.item_name == item_name
|
47
|
+
|
48
|
+
count += 1
|
49
|
+
notify_listeners_about_removed_element(v)
|
50
|
+
true
|
51
|
+
end
|
52
|
+
count
|
53
|
+
end
|
54
|
+
alias_method :removeLinksForItem, :remove_links_for_item
|
55
|
+
|
56
|
+
#
|
57
|
+
# Removes all links to a given thing.
|
58
|
+
#
|
59
|
+
# @param [ThingUID] thing_uid
|
60
|
+
# @return [Integer] how many links were removed
|
61
|
+
#
|
62
|
+
def remove_links_for_thing(thing_uid)
|
63
|
+
count = 0
|
64
|
+
@elements.delete_if do |_k, v|
|
65
|
+
next unless v.linked_uid.thing_uid == thing_uid
|
66
|
+
|
67
|
+
count += 1
|
68
|
+
notify_listeners_about_removed_element(v)
|
69
|
+
true
|
70
|
+
end
|
71
|
+
count
|
72
|
+
end
|
73
|
+
alias_method :removeLinksForThing, :remove_links_for_thing
|
36
74
|
end
|
37
75
|
end
|
38
76
|
end
|
@@ -61,6 +61,10 @@ module OpenHAB
|
|
61
61
|
raise "Cannot remove thing #{thing_uid} from non-managed provider #{provider.inspect}"
|
62
62
|
end
|
63
63
|
|
64
|
+
Links::Provider.registry.providers.grep(ManagedProvider).each do |managed_provider|
|
65
|
+
managed_provider.remove_links_for_thing(thing_uid)
|
66
|
+
end
|
67
|
+
|
64
68
|
provider.remove(thing_uid)
|
65
69
|
end
|
66
70
|
end
|
data/lib/openhab/core/timer.rb
CHANGED
@@ -28,7 +28,7 @@ module OpenHAB
|
|
28
28
|
# @return [true,false]
|
29
29
|
|
30
30
|
def_delegator :@timer, :has_terminated, :terminated?
|
31
|
-
def_delegators :@timer, :active?, :cancelled?, :running
|
31
|
+
def_delegators :@timer, :active?, :cancelled?, :running?, :execution_time
|
32
32
|
|
33
33
|
# @return [Object, nil]
|
34
34
|
attr_accessor :id
|
@@ -49,19 +49,7 @@ module OpenHAB
|
|
49
49
|
@id = id
|
50
50
|
@thread_locals = thread_locals
|
51
51
|
@block = block
|
52
|
-
@timer =
|
53
|
-
ScriptExecution.create_timer(1.minute.from_now) { execute }
|
54
|
-
else # DEPRECATED: openHAB 3.4.0
|
55
|
-
org.openhab.core.model.script.actions.ScriptExecution.create_timer(
|
56
|
-
# create it far enough in the future so it won't execute until we finish setting it up
|
57
|
-
1.minute.from_now,
|
58
|
-
# when running in rspec, it may have troubles finding this class
|
59
|
-
# for auto-conversion of block to interface, so use .impl
|
60
|
-
org.eclipse.xtext.xbase.lib.Procedures::Procedure0.impl { execute }
|
61
|
-
)
|
62
|
-
end
|
63
|
-
# DEPRECATED: openHAB 3.4.0.M6
|
64
|
-
@timer.class.field_reader :future unless @timer.respond_to?(:future)
|
52
|
+
@timer = ScriptExecution.create_timer(1.minute.from_now) { execute }
|
65
53
|
reschedule(@time)
|
66
54
|
end
|
67
55
|
|
@@ -79,11 +67,7 @@ module OpenHAB
|
|
79
67
|
alias_method :to_s, :inspect
|
80
68
|
|
81
69
|
# @!attribute [r] execution_time
|
82
|
-
#
|
83
|
-
def execution_time
|
84
|
-
# DEPRECATED: openHAB 3.4.0.M6 (just remove the entire method)
|
85
|
-
@timer.future.scheduled_time
|
86
|
-
end
|
70
|
+
# @return [ZonedDateTime, nil] the scheduled execution time, or `nil` if the timer was cancelled
|
87
71
|
|
88
72
|
#
|
89
73
|
# Reschedule timer
|
@@ -46,7 +46,7 @@ module OpenHAB
|
|
46
46
|
rescue java.lang.StringIndexOutOfBoundsException, java.lang.IllegalArgumentException => e
|
47
47
|
# Try Ruby's Time.parse if DateTimeType parser fails
|
48
48
|
begin
|
49
|
-
::Time.parse(time_string).to_zoned_date_time
|
49
|
+
DateTimeType.new(::Time.parse(time_string).to_zoned_date_time)
|
50
50
|
rescue ArgumentError
|
51
51
|
raise ArgumentError, e.message
|
52
52
|
end
|