openhab-jrubyscripting 5.0.0.rc2 → 5.0.0.rc4
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 +4 -4
- data/lib/openhab/core/actions.rb +6 -2
- data/lib/openhab/core/items/generic_item.rb +13 -5
- data/lib/openhab/core/items/metadata/hash.rb +19 -35
- data/lib/openhab/core/items/persistence.rb +3 -1
- data/lib/openhab/core/items/semantics/enumerable.rb +6 -4
- data/lib/openhab/core/items/semantics.rb +18 -22
- data/lib/openhab/core/profile_factory.rb +15 -3
- data/lib/openhab/core/provider.rb +11 -4
- data/lib/openhab/core/rules/module.rb +26 -0
- data/lib/openhab/core/rules/provider.rb +40 -0
- data/lib/openhab/core/rules/registry.rb +76 -0
- data/lib/openhab/core/rules/rule.rb +150 -0
- data/lib/openhab/core/rules.rb +25 -0
- data/lib/openhab/core/script_handling.rb +32 -3
- data/lib/openhab/core/timer.rb +5 -7
- data/lib/openhab/core/types.rb +1 -1
- data/lib/openhab/core.rb +0 -16
- data/lib/openhab/core_ext/java/list.rb +436 -0
- data/lib/openhab/core_ext/java/map.rb +66 -0
- data/lib/openhab/core_ext/java/month.rb +1 -1
- data/lib/openhab/core_ext/java/zoned_date_time.rb +1 -2
- data/lib/openhab/core_ext/ruby/date.rb +3 -0
- data/lib/openhab/core_ext/ruby/date_time.rb +53 -0
- data/lib/openhab/core_ext/ruby/time.rb +88 -86
- data/lib/openhab/dsl/events/watch_event.rb +1 -1
- data/lib/openhab/dsl/items/builder.rb +8 -3
- data/lib/openhab/dsl/items/ensure.rb +6 -2
- data/lib/openhab/dsl/items/timed_command.rb +10 -11
- data/lib/openhab/dsl/rules/automation_rule.rb +36 -13
- data/lib/openhab/dsl/rules/builder.rb +100 -9
- data/lib/openhab/dsl/rules/name_inference.rb +0 -5
- data/lib/openhab/dsl/rules/rule_triggers.rb +1 -1
- data/lib/openhab/dsl/rules/terse.rb +1 -2
- data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +18 -54
- data/lib/openhab/dsl/rules/triggers/conditions/proc.rb +0 -3
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +1 -1
- data/lib/openhab/dsl/rules.rb +0 -21
- data/lib/openhab/dsl/thread_local.rb +2 -2
- data/lib/openhab/dsl/timer_manager.rb +3 -1
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +12 -105
- data/lib/openhab/log.rb +9 -2
- data/lib/openhab/rspec/example_group.rb +42 -0
- data/lib/openhab/rspec/helpers.rb +31 -8
- data/lib/openhab/rspec/hooks.rb +6 -10
- data/lib/openhab/rspec/karaf.rb +50 -27
- data/lib/openhab/rspec/mocks/synchronous_executor.rb +11 -4
- data/lib/openhab/rspec/mocks/timer.rb +2 -1
- data/lib/openhab/rspec/suspend_rules.rb +4 -2
- metadata +24 -3
- data/lib/openhab/dsl/script_handling.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e06b71ae524165363db99771e7ef601f542ed14c979572d152b079d70ad82a2
|
4
|
+
data.tar.gz: 0d6002391ed26a68bbb907d94787f510df30ef6ef9a3a7cd445ac9c47122851b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05a3016219eaf41fc4af71f1476029e2b8d0b320afc7bed99e9777b7726afc6897328d9aa92f643132e66d647aae8742eca36f26c703ab3763e1738c55d249e1
|
7
|
+
data.tar.gz: d5a7d65543b3628e5c3abfa61cb2aa6d6f10e2ab2bb3334d9f38e1ee8952da655da6360c156d926bd53b25c013c86c7672dc1b492c85aaa056e898579a7be7dd
|
data/lib/openhab/core/actions.rb
CHANGED
@@ -66,11 +66,15 @@ module OpenHAB
|
|
66
66
|
#
|
67
67
|
module Actions
|
68
68
|
OSGi.services("org.openhab.core.model.script.engine.action.ActionService")&.each do |service|
|
69
|
-
java_import service.action_class.ruby_class
|
69
|
+
klass = (java_import service.action_class.ruby_class).first
|
70
70
|
logger.trace("Loaded ACTION: #{service.action_class}")
|
71
|
+
Object.const_set(service.action_class.simple_name, klass)
|
71
72
|
end
|
72
73
|
# Import common actions
|
73
|
-
%w[Exec HTTP Ping].each
|
74
|
+
%w[Exec HTTP Ping].each do |action|
|
75
|
+
klass = (java_import "org.openhab.core.model.script.actions.#{action}").first
|
76
|
+
Object.const_set(action, klass)
|
77
|
+
end
|
74
78
|
|
75
79
|
module_function
|
76
80
|
|
@@ -65,16 +65,23 @@ module OpenHAB
|
|
65
65
|
#
|
66
66
|
# Send a command to this item
|
67
67
|
#
|
68
|
+
# When this method is chained after the {OpenHAB::DSL::Items::Ensure::Ensurable#ensure ensure}
|
69
|
+
# method, or issued inside an {OpenHAB::DSL.ensure_states ensure_states} block,
|
70
|
+
# the command will only be sent if the item is not already in the same state.
|
71
|
+
#
|
68
72
|
# @param [Command] command command to send to the item
|
69
|
-
# @return [self]
|
73
|
+
# @return [self, nil] nil when `ensure` is in effect and the item was already in the same state,
|
74
|
+
# otherwise the item.
|
70
75
|
#
|
71
|
-
# @see DSL::Items::TimedCommand#command
|
76
|
+
# @see DSL::Items::TimedCommand#command Timed Command
|
77
|
+
# @see OpenHAB::DSL.ensure_states ensure_states
|
78
|
+
# @see DSL::Items::Ensure::Ensurable#ensure ensure
|
72
79
|
#
|
73
80
|
def command(command)
|
74
81
|
command = format_command(command)
|
75
82
|
logger.trace "Sending Command #{command} to #{name}"
|
76
83
|
$events.send_command(self, command)
|
77
|
-
self
|
84
|
+
Proxy.new(self)
|
78
85
|
end
|
79
86
|
|
80
87
|
# not an alias to allow easier stubbing and overriding
|
@@ -88,13 +95,14 @@ module OpenHAB
|
|
88
95
|
# Send an update to this item
|
89
96
|
#
|
90
97
|
# @param [State] state
|
91
|
-
# @return [self]
|
98
|
+
# @return [self, nil] nil when `ensure` is in effect and the item was already in the same state,
|
99
|
+
# otherwise the item.
|
92
100
|
#
|
93
101
|
def update(state)
|
94
102
|
state = format_update(state)
|
95
103
|
logger.trace "Sending Update #{state} to #{name}"
|
96
104
|
$events.post_update(self, state)
|
97
|
-
self
|
105
|
+
Proxy.new(self)
|
98
106
|
end
|
99
107
|
|
100
108
|
#
|
@@ -26,7 +26,7 @@ module OpenHAB
|
|
26
26
|
|
27
27
|
extend Forwardable
|
28
28
|
def_delegators :@metadata, :configuration, :hash, :to_s, :uid, :value
|
29
|
-
|
29
|
+
private :configuration
|
30
30
|
|
31
31
|
# @!method to_hash
|
32
32
|
# Implicit conversion to {::Hash}.
|
@@ -37,6 +37,9 @@ module OpenHAB
|
|
37
37
|
# still others (mutators) must be manually implemented below.
|
38
38
|
def_delegators :configuration,
|
39
39
|
:any?,
|
40
|
+
:compact,
|
41
|
+
:compare_by_identity?,
|
42
|
+
:deconstruct_keys,
|
40
43
|
:default,
|
41
44
|
:default_proc,
|
42
45
|
:each,
|
@@ -47,6 +50,8 @@ module OpenHAB
|
|
47
50
|
:filter,
|
48
51
|
:flatten,
|
49
52
|
:has_value?,
|
53
|
+
:invert,
|
54
|
+
:key,
|
50
55
|
:keys,
|
51
56
|
:length,
|
52
57
|
:rassoc,
|
@@ -57,8 +62,10 @@ module OpenHAB
|
|
57
62
|
:to_a,
|
58
63
|
:to_h,
|
59
64
|
:to_hash,
|
65
|
+
:transform_keys,
|
66
|
+
:transform_values,
|
67
|
+
:values,
|
60
68
|
:value?
|
61
|
-
def_delegators :to_h, :invert, :merge, :transform_keys, :transform_values
|
62
69
|
|
63
70
|
def_delegator :uid, :namespace
|
64
71
|
|
@@ -88,7 +95,7 @@ module OpenHAB
|
|
88
95
|
end
|
89
96
|
|
90
97
|
# @!visibility private
|
91
|
-
def initialize(metadata)
|
98
|
+
def initialize(metadata = nil)
|
92
99
|
@metadata = metadata
|
93
100
|
end
|
94
101
|
|
@@ -156,7 +163,7 @@ module OpenHAB
|
|
156
163
|
return false unless value == other.value
|
157
164
|
end
|
158
165
|
|
159
|
-
|
166
|
+
configuration < other
|
160
167
|
end
|
161
168
|
|
162
169
|
# @!visibility private
|
@@ -166,7 +173,7 @@ module OpenHAB
|
|
166
173
|
return false unless value == other.value
|
167
174
|
end
|
168
175
|
|
169
|
-
|
176
|
+
configuration <= other
|
170
177
|
end
|
171
178
|
|
172
179
|
# @!visibility private
|
@@ -176,7 +183,7 @@ module OpenHAB
|
|
176
183
|
|
177
184
|
return configuration == other.configuration
|
178
185
|
elsif value.empty? && other.respond_to?(:to_hash)
|
179
|
-
return configuration
|
186
|
+
return configuration == other.to_hash
|
180
187
|
end
|
181
188
|
false
|
182
189
|
end
|
@@ -188,7 +195,7 @@ module OpenHAB
|
|
188
195
|
return false unless value == other.value
|
189
196
|
end
|
190
197
|
|
191
|
-
|
198
|
+
configuration > other
|
192
199
|
end
|
193
200
|
|
194
201
|
# @!visibility private
|
@@ -198,7 +205,7 @@ module OpenHAB
|
|
198
205
|
return false unless value == other.value
|
199
206
|
end
|
200
207
|
|
201
|
-
|
208
|
+
configuration >= other
|
202
209
|
end
|
203
210
|
|
204
211
|
# @!visibility private
|
@@ -226,13 +233,9 @@ module OpenHAB
|
|
226
233
|
replace({})
|
227
234
|
end
|
228
235
|
|
229
|
-
# @!visibility private
|
230
|
-
alias_method :compact, :to_h
|
231
|
-
|
232
236
|
# @!visibility private
|
233
237
|
def compact!
|
234
|
-
|
235
|
-
self
|
238
|
+
replace(compact)
|
236
239
|
end
|
237
240
|
|
238
241
|
# @!visibility private
|
@@ -240,16 +243,6 @@ module OpenHAB
|
|
240
243
|
raise NotImplementedError
|
241
244
|
end
|
242
245
|
|
243
|
-
# @!visibility private
|
244
|
-
def compare_by_identity?
|
245
|
-
false
|
246
|
-
end
|
247
|
-
|
248
|
-
# @!visibility private
|
249
|
-
def deconstruct_keys
|
250
|
-
self
|
251
|
-
end
|
252
|
-
|
253
246
|
# @!visibility private
|
254
247
|
def default=(*)
|
255
248
|
raise NotImplementedError
|
@@ -304,11 +297,6 @@ module OpenHAB
|
|
304
297
|
self
|
305
298
|
end
|
306
299
|
|
307
|
-
# @!visibility private
|
308
|
-
def key(value)
|
309
|
-
rassoc(value)&.first
|
310
|
-
end
|
311
|
-
|
312
300
|
# @!visibility private
|
313
301
|
def key?(key)
|
314
302
|
configuration.key?(key.to_s)
|
@@ -360,7 +348,7 @@ module OpenHAB
|
|
360
348
|
|
361
349
|
# @!visibility private
|
362
350
|
def slice(*keys)
|
363
|
-
|
351
|
+
configuration.slice(*keys.map(&:to_s))
|
364
352
|
end
|
365
353
|
|
366
354
|
# @!visibility private
|
@@ -380,11 +368,6 @@ module OpenHAB
|
|
380
368
|
replace(transform_values(&block))
|
381
369
|
end
|
382
370
|
|
383
|
-
# @!visibility private
|
384
|
-
def values
|
385
|
-
configuration.values.to_a
|
386
|
-
end
|
387
|
-
|
388
371
|
# @!visibility private
|
389
372
|
def values_at(*keys)
|
390
373
|
configuration.values_at(*keys.map(&:to_s))
|
@@ -397,6 +380,7 @@ module OpenHAB
|
|
397
380
|
|
398
381
|
[value, to_h].inspect
|
399
382
|
end
|
383
|
+
remove_method :to_s
|
400
384
|
alias_method :to_s, :inspect
|
401
385
|
|
402
386
|
#
|
@@ -416,7 +400,7 @@ module OpenHAB
|
|
416
400
|
return preferred_provider unless provider
|
417
401
|
|
418
402
|
unless provider.is_a?(org.openhab.core.common.registry.ManagedProvider)
|
419
|
-
raise FrozenError, "Cannot modify metadata from provider #{provider.inspect}"
|
403
|
+
raise FrozenError, "Cannot modify metadata from provider #{provider.inspect} for #{uid}."
|
420
404
|
end
|
421
405
|
|
422
406
|
if preferred_provider != provider
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "delegate"
|
4
|
+
|
3
5
|
require_relative "generic_item"
|
4
6
|
|
5
7
|
module OpenHAB
|
@@ -284,7 +286,7 @@ module OpenHAB
|
|
284
286
|
# @return [Object] QuantityType or the original value
|
285
287
|
#
|
286
288
|
def quantify(value)
|
287
|
-
if value.is_a?(DecimalType) && unit
|
289
|
+
if value.is_a?(DecimalType) && respond_to?(:unit) && unit
|
288
290
|
logger.trace("Unitizing #{value} with unit #{unit}")
|
289
291
|
QuantityType.new(value.to_big_decimal, unit)
|
290
292
|
else
|
@@ -72,15 +72,17 @@ module Enumerable
|
|
72
72
|
# @!group Items State and Command Methods
|
73
73
|
|
74
74
|
# Send a command to every item in the collection
|
75
|
-
# @return [self]
|
75
|
+
# @return [self, nil] nil when `ensure` is in effect and all the items were already in the same state,
|
76
|
+
# otherwise self
|
76
77
|
def command(command)
|
77
|
-
|
78
|
+
self if count { |i| i.command(command) }.positive?
|
78
79
|
end
|
79
80
|
|
80
81
|
# Update the state of every item in the collection
|
81
|
-
# @return [self]
|
82
|
+
# @return [self, nil] nil when `ensure` is in effect and all the items were already in the same state,
|
83
|
+
# otherwise self
|
82
84
|
def update(state)
|
83
|
-
|
85
|
+
self if count { |i| i.update(state) }.positive?
|
84
86
|
end
|
85
87
|
|
86
88
|
# @!method refresh
|
@@ -187,11 +187,6 @@ module OpenHAB
|
|
187
187
|
# end
|
188
188
|
#
|
189
189
|
|
190
|
-
# @!visibility private
|
191
|
-
# import the actual semantics action
|
192
|
-
SemanticsAction = org.openhab.core.model.script.actions.Semantics
|
193
|
-
private_constant :SemanticsAction
|
194
|
-
|
195
190
|
# import all the semantics constants
|
196
191
|
[org.openhab.core.semantics.model.point.Points,
|
197
192
|
org.openhab.core.semantics.model.property.Properties,
|
@@ -223,6 +218,7 @@ module OpenHAB
|
|
223
218
|
# Property = org.openhab.core.semantics.Property
|
224
219
|
|
225
220
|
# put ourself into the global namespace, replacing the action
|
221
|
+
Object.send(:remove_const, :Semantics)
|
226
222
|
::Semantics = self # rubocop:disable Naming/ConstantName
|
227
223
|
|
228
224
|
#
|
@@ -234,7 +230,7 @@ module OpenHAB
|
|
234
230
|
# @return [true, false]
|
235
231
|
#
|
236
232
|
def location?
|
237
|
-
|
233
|
+
Actions::Semantics.location?(self)
|
238
234
|
end
|
239
235
|
|
240
236
|
#
|
@@ -246,7 +242,7 @@ module OpenHAB
|
|
246
242
|
# @return [true, false]
|
247
243
|
#
|
248
244
|
def equipment?
|
249
|
-
|
245
|
+
Actions::Semantics.equipment?(self)
|
250
246
|
end
|
251
247
|
|
252
248
|
# Checks if this Item is a {Point}
|
@@ -257,7 +253,7 @@ module OpenHAB
|
|
257
253
|
# @return [true, false]
|
258
254
|
#
|
259
255
|
def point?
|
260
|
-
|
256
|
+
Actions::Semantics.point?(self)
|
261
257
|
end
|
262
258
|
|
263
259
|
#
|
@@ -280,7 +276,7 @@ module OpenHAB
|
|
280
276
|
# @return [GenericItem, nil]
|
281
277
|
#
|
282
278
|
def location
|
283
|
-
|
279
|
+
Actions::Semantics.get_location(self)&.then(&Proxy.method(:new))
|
284
280
|
end
|
285
281
|
|
286
282
|
#
|
@@ -293,7 +289,7 @@ module OpenHAB
|
|
293
289
|
# @return [Class, nil]
|
294
290
|
#
|
295
291
|
def location_type
|
296
|
-
|
292
|
+
Actions::Semantics.get_location_type(self)&.ruby_class
|
297
293
|
end
|
298
294
|
|
299
295
|
#
|
@@ -306,7 +302,7 @@ module OpenHAB
|
|
306
302
|
# @return [GenericItem, nil]
|
307
303
|
#
|
308
304
|
def equipment
|
309
|
-
|
305
|
+
Actions::Semantics.get_equipment(self)&.then(&Proxy.method(:new))
|
310
306
|
end
|
311
307
|
|
312
308
|
#
|
@@ -319,7 +315,7 @@ module OpenHAB
|
|
319
315
|
# @return [Class, nil]
|
320
316
|
#
|
321
317
|
def equipment_type
|
322
|
-
|
318
|
+
Actions::Semantics.get_equipment_type(self)&.ruby_class
|
323
319
|
end
|
324
320
|
|
325
321
|
#
|
@@ -330,7 +326,7 @@ module OpenHAB
|
|
330
326
|
# @return [Class, nil]
|
331
327
|
#
|
332
328
|
def point_type
|
333
|
-
|
329
|
+
Actions::Semantics.get_point_type(self)&.ruby_class
|
334
330
|
end
|
335
331
|
|
336
332
|
#
|
@@ -341,7 +337,7 @@ module OpenHAB
|
|
341
337
|
# @return [Class, nil]
|
342
338
|
#
|
343
339
|
def property_type
|
344
|
-
|
340
|
+
Actions::Semantics.get_property_type(self)&.ruby_class
|
345
341
|
end
|
346
342
|
|
347
343
|
# @!attribute [r] semantic_type
|
@@ -355,7 +351,7 @@ module OpenHAB
|
|
355
351
|
# @return [Class, nil]
|
356
352
|
#
|
357
353
|
def semantic_type
|
358
|
-
|
354
|
+
Actions::Semantics.get_semantic_type(self)&.ruby_class
|
359
355
|
end
|
360
356
|
|
361
357
|
#
|
@@ -409,7 +405,7 @@ module Enumerable
|
|
409
405
|
# Returns a new array of items that are a semantics Location (optionally of the given type)
|
410
406
|
# @return [Array<GenericItem>]
|
411
407
|
def locations(type = nil)
|
412
|
-
if type && (!type.is_a?(Module) || !(type <
|
408
|
+
if type && (!type.is_a?(Module) || !(type < Semantics::Location))
|
413
409
|
raise ArgumentError, "type must be a subclass of Location"
|
414
410
|
end
|
415
411
|
|
@@ -432,7 +428,7 @@ module Enumerable
|
|
432
428
|
# @example Get all TVs in a room
|
433
429
|
# lGreatRoom.equipments(Semantics::Screen)
|
434
430
|
def equipments(type = nil)
|
435
|
-
if type && (!type.is_a?(Module) || !(type <
|
431
|
+
if type && (!type.is_a?(Module) || !(type < Semantics::Equipment))
|
436
432
|
raise ArgumentError, "type must be a subclass of Equipment"
|
437
433
|
end
|
438
434
|
|
@@ -457,19 +453,19 @@ module Enumerable
|
|
457
453
|
end
|
458
454
|
unless point_or_property_types.all? do |tag|
|
459
455
|
tag.is_a?(Module) &&
|
460
|
-
(tag <
|
456
|
+
(tag < Semantics::Point || tag < Semantics::Property)
|
461
457
|
end
|
462
458
|
raise ArgumentError, "point_or_property_types must all be a subclass of Point or Property"
|
463
459
|
end
|
464
|
-
if point_or_property_types.count { |tag| tag <
|
465
|
-
point_or_property_types.count { |tag| tag <
|
460
|
+
if point_or_property_types.count { |tag| tag < Semantics::Point } > 1 ||
|
461
|
+
point_or_property_types.count { |tag| tag < Semantics::Property } > 1
|
466
462
|
raise ArgumentError, "point_or_property_types cannot both be a subclass of Point or Property"
|
467
463
|
end
|
468
464
|
|
469
465
|
select do |point|
|
470
466
|
point.point? && point_or_property_types.all? do |tag|
|
471
|
-
(tag <
|
472
|
-
(tag <
|
467
|
+
(tag < Semantics::Point && point.point_type <= tag) ||
|
468
|
+
(tag < Semantics::Property && point.property_type&.<=(tag))
|
473
469
|
end
|
474
470
|
end
|
475
471
|
end
|
@@ -87,6 +87,8 @@ module OpenHAB
|
|
87
87
|
DSL::ThreadLocal.thread_local(**@thread_locals) do
|
88
88
|
@block.call(event, **kwargs)
|
89
89
|
rescue Exception => e
|
90
|
+
raise if defined?(::RSpec)
|
91
|
+
|
90
92
|
@block.binding.eval("self").logger.log_exception(e)
|
91
93
|
end
|
92
94
|
end
|
@@ -96,6 +98,19 @@ module OpenHAB
|
|
96
98
|
|
97
99
|
def initialize
|
98
100
|
@profiles = {}
|
101
|
+
|
102
|
+
@registration = OSGi.register_service(self)
|
103
|
+
ScriptHandling.script_unloaded { unregister }
|
104
|
+
end
|
105
|
+
|
106
|
+
#
|
107
|
+
# Unregister the ProfileFactory OSGi service
|
108
|
+
#
|
109
|
+
# @!visibility private
|
110
|
+
# @return [void]
|
111
|
+
#
|
112
|
+
def unregister
|
113
|
+
@registration.unregister
|
99
114
|
end
|
100
115
|
|
101
116
|
# @!visibility private
|
@@ -111,8 +126,5 @@ module OpenHAB
|
|
111
126
|
@profiles.keys
|
112
127
|
end
|
113
128
|
end
|
114
|
-
|
115
|
-
registration = OSGi.register_service(ProfileFactory.instance)
|
116
|
-
ScriptHandling.script_unloaded { registration.unregister }
|
117
129
|
end
|
118
130
|
end
|
@@ -13,6 +13,7 @@ module OpenHAB
|
|
13
13
|
TYPE_TO_PROVIDER_TYPE = {
|
14
14
|
org.openhab.core.items.Item.java_class => :items,
|
15
15
|
org.openhab.core.items.Metadata.java_class => :metadata,
|
16
|
+
org.openhab.core.automation.Rule.java_class => :rules,
|
16
17
|
org.openhab.core.thing.Thing.java_class => :things,
|
17
18
|
org.openhab.core.thing.link.ItemChannelLink.java_class => :links
|
18
19
|
}.freeze
|
@@ -37,6 +38,7 @@ module OpenHAB
|
|
37
38
|
# @abstract
|
38
39
|
class Provider < org.openhab.core.common.registry.AbstractProvider
|
39
40
|
include org.openhab.core.common.registry.ManagedProvider
|
41
|
+
include Enumerable
|
40
42
|
include Singleton
|
41
43
|
public_class_method :new
|
42
44
|
|
@@ -140,6 +142,11 @@ module OpenHAB
|
|
140
142
|
end
|
141
143
|
end
|
142
144
|
|
145
|
+
# @!visibility private
|
146
|
+
def each(&block)
|
147
|
+
@elements.each_value(&block)
|
148
|
+
end
|
149
|
+
|
143
150
|
# @return [String]
|
144
151
|
def inspect
|
145
152
|
"#<#{self.class.name}:#{object_id}>"
|
@@ -192,7 +199,7 @@ module OpenHAB
|
|
192
199
|
def update(element)
|
193
200
|
old_element = @elements[element.uid]
|
194
201
|
if old_element
|
195
|
-
@elements[element.uid]
|
202
|
+
@elements[element.uid] = element
|
196
203
|
notify_listeners_about_updated_element(old_element, element)
|
197
204
|
end
|
198
205
|
old_element
|
@@ -205,11 +212,11 @@ module OpenHAB
|
|
205
212
|
|
206
213
|
private
|
207
214
|
|
208
|
-
def initialize
|
209
|
-
super
|
215
|
+
def initialize(script_unloaded_before: nil)
|
216
|
+
super()
|
210
217
|
@elements = {}
|
211
218
|
self.class.registry.add_provider(self)
|
212
|
-
ScriptHandling.script_unloaded { unregister }
|
219
|
+
ScriptHandling.script_unloaded(before: script_unloaded_before) { unregister }
|
213
220
|
end
|
214
221
|
end
|
215
222
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenHAB
|
4
|
+
module Core
|
5
|
+
module Rules
|
6
|
+
# @interface
|
7
|
+
java_import org.openhab.core.automation.Module
|
8
|
+
|
9
|
+
# @!visibility private
|
10
|
+
module Module
|
11
|
+
# @return [String]
|
12
|
+
def inspect
|
13
|
+
r = "#<OpenHAB::Core::Rules::#{self.class.simple_name} #{id} (#{type_uid})"
|
14
|
+
r += " #{label.inspect}" if label
|
15
|
+
r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty?
|
16
|
+
"#{r}>"
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [String]
|
20
|
+
def to_s
|
21
|
+
id
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenHAB
|
4
|
+
module Core
|
5
|
+
module Rules
|
6
|
+
#
|
7
|
+
# Provides rules created in Ruby to openHAB
|
8
|
+
#
|
9
|
+
class Provider < Core::Provider
|
10
|
+
include org.openhab.core.automation.RuleProvider
|
11
|
+
|
12
|
+
class << self
|
13
|
+
#
|
14
|
+
# The Rule registry
|
15
|
+
#
|
16
|
+
# @return [org.openhab.core.automation.RuleRegistry]
|
17
|
+
#
|
18
|
+
def registry
|
19
|
+
$rules
|
20
|
+
end
|
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
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "singleton"
|
4
|
+
|
5
|
+
module OpenHAB
|
6
|
+
module Core
|
7
|
+
module Rules
|
8
|
+
#
|
9
|
+
# Provides access to all OpenHAB {Rule rules}, and acts like an array.
|
10
|
+
#
|
11
|
+
class Registry
|
12
|
+
include LazyArray
|
13
|
+
include Singleton
|
14
|
+
|
15
|
+
#
|
16
|
+
# Gets a specific Rule
|
17
|
+
#
|
18
|
+
# @param [String] uid Rule UID
|
19
|
+
# @return [Rule, nil]
|
20
|
+
#
|
21
|
+
def [](uid)
|
22
|
+
$rules.get(uid)
|
23
|
+
end
|
24
|
+
alias_method :include?, :[]
|
25
|
+
alias_method :key?, :[]
|
26
|
+
# @deprecated
|
27
|
+
alias_method :has_key?, :[]
|
28
|
+
|
29
|
+
#
|
30
|
+
# Explicit conversion to array
|
31
|
+
#
|
32
|
+
# @return [Array<Rule>]
|
33
|
+
#
|
34
|
+
def to_a
|
35
|
+
$rules.all.to_a
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# Enter the Rule Builder DSL.
|
40
|
+
# @param (see Core::Provider.current)
|
41
|
+
# @yield Block executed in the context of a {DSL::Rules::Builder}.
|
42
|
+
# @return [Object] The result of the block.
|
43
|
+
#
|
44
|
+
def build(preferred_provider = nil, &block)
|
45
|
+
DSL::Rules::Builder.new(preferred_provider).instance_eval(&block)
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Remove a Rule.
|
50
|
+
#
|
51
|
+
# The rule must be a managed thing (typically created by Ruby or in the UI).
|
52
|
+
#
|
53
|
+
# @param [String, Rule] rule_uid
|
54
|
+
# @return [Rule, nil] The removed rule, if found.
|
55
|
+
#
|
56
|
+
# @example
|
57
|
+
# my_rule = rule do
|
58
|
+
# every :day
|
59
|
+
# run { nil }
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# rules.remove(my_rule)
|
63
|
+
#
|
64
|
+
def remove(rule_uid)
|
65
|
+
rule_uid = rule_uid.uid if rule_uid.is_a?(Rule)
|
66
|
+
provider = Provider.registry.provider_for(rule_uid)
|
67
|
+
unless provider.is_a?(org.openhab.core.common.registry.ManagedProvider)
|
68
|
+
raise "Cannot remove rule #{rule_uid} from non-managed provider #{provider.inspect}"
|
69
|
+
end
|
70
|
+
|
71
|
+
provider.remove(rule_uid)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|