openhab-scripting 5.6.0 → 5.7.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 +4 -4
- data/lib/openhab/core/actions/audio.rb +5 -2
- data/lib/openhab/core/items/registry.rb +1 -1
- data/lib/openhab/core/items/semantics.rb +12 -19
- data/lib/openhab/core/provider.rb +1 -1
- data/lib/openhab/core/sitemaps/provider.rb +132 -0
- data/lib/openhab/core/things/proxy.rb +2 -1
- data/lib/openhab/core/types/date_time_type.rb +2 -1
- data/lib/openhab/core/types/open_closed_type.rb +2 -1
- data/lib/openhab/core/types/quantity_type.rb +45 -35
- data/lib/openhab/core/types/string_type.rb +1 -1
- data/lib/openhab/core/types/up_down_type.rb +2 -1
- data/lib/openhab/core/value_cache.rb +5 -4
- data/lib/openhab/core_ext/java/duration.rb +2 -1
- data/lib/openhab/core_ext/java/local_time.rb +8 -6
- data/lib/openhab/core_ext/java/month_day.rb +2 -1
- data/lib/openhab/core_ext/java/period.rb +1 -1
- data/lib/openhab/core_ext/ruby/numeric.rb +1 -0
- data/lib/openhab/dsl/items/builder.rb +3 -1
- data/lib/openhab/dsl/rules/builder.rb +54 -23
- data/lib/openhab/dsl/rules/triggers/conditions/generic.rb +1 -1
- data/lib/openhab/dsl/rules/triggers/cron/cron.rb +33 -14
- data/lib/openhab/dsl/sitemaps/builder.rb +942 -0
- data/lib/openhab/dsl/things/builder.rb +4 -2
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +5 -0
- data/lib/openhab/osgi.rb +1 -1
- data/lib/openhab/rspec/karaf.rb +5 -2
- data/lib/openhab/rspec/openhab/core/actions.rb +0 -3
- metadata +11 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86b3b636fb3b4c119d2ed6a5d6b81bedd731456c750d28f4e16f602d75778e7c
|
4
|
+
data.tar.gz: 673ed9dc1dfba2e38e1a57b01468c3a6d74a3a3fd0141c5bd9f51bc25d84e634
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5974cf573c9fe03b1cd8df81cd312a6be70e3175c1a157d19db5dee17db2ecf8afae6619b5a3f81f91a2fce1834c7c24f7fbc7a6bf3166e60106050892d4f9ca
|
7
|
+
data.tar.gz: 9cced687ace50ae3bcab50ee9ad421e9bd34cabf5338b7d927c4415f540148bf2f8033f8e72b43814a0b8a94ad399b3119a3b3ea953a1215fbc8be3e915a77f5
|
@@ -23,8 +23,11 @@ module OpenHAB
|
|
23
23
|
#
|
24
24
|
def play_sound(filename, sink: nil, volume: nil)
|
25
25
|
volume = PercentType.new(volume) unless volume.is_a?(PercentType) || volume.nil?
|
26
|
-
java_send :playSound,
|
27
|
-
|
26
|
+
java_send :playSound,
|
27
|
+
[java.lang.String, java.lang.String, PercentType.java_class],
|
28
|
+
sink,
|
29
|
+
filename.to_s,
|
30
|
+
volume
|
28
31
|
end
|
29
32
|
|
30
33
|
#
|
@@ -48,7 +48,7 @@ module OpenHAB
|
|
48
48
|
# @yield Block executed in the context of a {DSL::Items::Builder}
|
49
49
|
# @return [Object] The return value of the block.
|
50
50
|
#
|
51
|
-
#
|
51
|
+
# @see DSL::Items::Builder
|
52
52
|
#
|
53
53
|
def build(preferred_provider = nil, &block)
|
54
54
|
DSL::Items::BaseBuilderDSL.new(preferred_provider).instance_eval_with_dummy_items(&block)
|
@@ -262,7 +262,7 @@ module OpenHAB
|
|
262
262
|
# @deprecated OH3.4 cannot add a tag
|
263
263
|
# this not in the class << self block above because YARD doesn't figure out
|
264
264
|
# it's a class method with the conditional
|
265
|
-
if Provider.registry
|
265
|
+
if Provider.registry
|
266
266
|
class << self
|
267
267
|
#
|
268
268
|
# Adds custom semantic tags.
|
@@ -308,26 +308,19 @@ module OpenHAB
|
|
308
308
|
raise ArgumentError, "Additional options can only be specified when creating one tag"
|
309
309
|
end
|
310
310
|
|
311
|
-
synonyms = Array.wrap(synonyms).map
|
311
|
+
synonyms = Array.wrap(synonyms).map { |s| s.to_s.strip }
|
312
312
|
|
313
313
|
tags.map do |name, parent|
|
314
|
-
|
315
|
-
if
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
else
|
325
|
-
parent_is_tag = parent.respond_to?(:java_class) && parent.java_class < Tag.java_class
|
326
|
-
parent = parent_is_tag ? parent.java_class : parent.to_s
|
327
|
-
org.openhab.core.semantics.SemanticTags
|
328
|
-
.add(name.to_s, parent, label, synonyms.join(","), description)
|
329
|
-
&.then { lookup(name) }
|
330
|
-
end
|
314
|
+
parent = lookup(parent) unless parent.is_a?(SemanticTag)
|
315
|
+
next if lookup(name)
|
316
|
+
next unless parent
|
317
|
+
|
318
|
+
new_tag = org.openhab.core.semantics.SemanticTagImpl.new("#{parent.uid}_#{name}",
|
319
|
+
label,
|
320
|
+
description,
|
321
|
+
synonyms)
|
322
|
+
Provider.instance.add(new_tag)
|
323
|
+
lookup(name)
|
331
324
|
end.compact
|
332
325
|
end
|
333
326
|
end
|
@@ -44,6 +44,7 @@ module OpenHAB
|
|
44
44
|
|
45
45
|
# Known supported provider types
|
46
46
|
# @return [Array<Symbol>]
|
47
|
+
# @!visibility private
|
47
48
|
KNOWN_TYPES = %i[items metadata things links].freeze
|
48
49
|
|
49
50
|
class << self
|
@@ -223,7 +224,6 @@ module OpenHAB
|
|
223
224
|
def initialize(unload_priority: nil)
|
224
225
|
super()
|
225
226
|
@elements = java.util.concurrent.ConcurrentHashMap.new
|
226
|
-
# @deprecated OH3.4 safe navigation only required for missing Semantics registry
|
227
227
|
self.class.registry&.add_provider(self)
|
228
228
|
ScriptHandling.script_unloaded(priority: unload_priority) { unregister }
|
229
229
|
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "singleton"
|
4
|
+
|
5
|
+
module OpenHAB
|
6
|
+
module Core
|
7
|
+
#
|
8
|
+
# Contains sitemap related classes.
|
9
|
+
#
|
10
|
+
module Sitemaps
|
11
|
+
#
|
12
|
+
# Provides sitemaps created in Ruby to openHAB
|
13
|
+
#
|
14
|
+
class Provider < Core::Provider
|
15
|
+
PREFIX = "jruby_"
|
16
|
+
SUFFIX = ".sitemap"
|
17
|
+
private_constant :PREFIX, :SUFFIX
|
18
|
+
|
19
|
+
class << self
|
20
|
+
# @!visibility private
|
21
|
+
def registry
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
include org.openhab.core.model.sitemap.SitemapProvider
|
27
|
+
|
28
|
+
# @!visibility private
|
29
|
+
alias_method :getSitemap, :get
|
30
|
+
|
31
|
+
# rubocop:disable Naming/MethodName
|
32
|
+
|
33
|
+
# @!visibility private
|
34
|
+
def getSitemapNames
|
35
|
+
@elements.key_set
|
36
|
+
end
|
37
|
+
|
38
|
+
# @!visibility private
|
39
|
+
def addModelChangeListener(listener)
|
40
|
+
@listeners.add(listener)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @!visibility private
|
44
|
+
def removeModelChangeListener(listener)
|
45
|
+
@listeners.remove(listener)
|
46
|
+
end
|
47
|
+
|
48
|
+
# rubocop:enable Naming/MethodName
|
49
|
+
|
50
|
+
# @!visibility private
|
51
|
+
def unregister
|
52
|
+
@registration.unregister
|
53
|
+
end
|
54
|
+
|
55
|
+
# rubocop:disable Layout/LineLength
|
56
|
+
|
57
|
+
#
|
58
|
+
# Enter the Sitemap Builder DSL.
|
59
|
+
#
|
60
|
+
# @yield Block executed in the context of a {DSL::Sitemaps::Builder}
|
61
|
+
# @return [void]
|
62
|
+
#
|
63
|
+
# @see DSL::Sitemaps::Builder
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
# sitemaps.build do
|
67
|
+
# sitemap "default", "My Residence" do
|
68
|
+
# frame label: "Control" do
|
69
|
+
# text label: "Climate", icon: "if:mdi:home-thermometer-outline" do
|
70
|
+
# frame label: "Main Floor" do
|
71
|
+
# text item: MainFloor_AmbTemp
|
72
|
+
# switch item: MainFloorThermostat_TargetMode, label: "Mode", mappings: %w[off auto cool heat]
|
73
|
+
# setpoint item: MainFloorThermostate_SetPoint, label: "Set Point", visibility: "MainFloorThermostat_TargetMode!=off"
|
74
|
+
# end
|
75
|
+
# frame label: "Basement" do
|
76
|
+
# text item: Basement_AmbTemp
|
77
|
+
# switch item: BasementThermostat_TargetMode, label: "Mode", mappings: { OFF: "off", COOL: "cool", HEAT: "heat" }
|
78
|
+
# setpoint item: BasementThermostate_SetPoint, label: "Set Point", visibility: "BasementThermostat_TargetMode!=off"
|
79
|
+
# end
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
# end
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
def build(&block)
|
86
|
+
DSL::Sitemaps::Builder.new(self).instance_eval(&block)
|
87
|
+
end
|
88
|
+
# rubocop:enable Layout/LineLength
|
89
|
+
|
90
|
+
# For use in specs
|
91
|
+
# @!visibility private
|
92
|
+
def clear
|
93
|
+
elements = @elements
|
94
|
+
@elements = java.util.concurrent.ConcurrentHashMap.new
|
95
|
+
elements.each_value do |v|
|
96
|
+
notify_listeners_about_removed_element(v)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# Remove a sitemap.
|
102
|
+
#
|
103
|
+
# @param [String] sitemap_name
|
104
|
+
# @return [Boolean] If a sitemap was removed
|
105
|
+
def remove(sitemap_name)
|
106
|
+
super("#{PREFIX}#{sitemap_name}#{SUFFIX}")
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def initialize
|
112
|
+
super
|
113
|
+
@listeners = java.util.concurrent.CopyOnWriteArraySet.new
|
114
|
+
|
115
|
+
@registration = OSGi.register_service(self, org.openhab.core.model.sitemap.SitemapProvider)
|
116
|
+
end
|
117
|
+
|
118
|
+
def notify_listeners_about_added_element(element)
|
119
|
+
@listeners.each { |l| l.model_changed(element.name, org.openhab.core.model.core.EventType::ADDED) }
|
120
|
+
end
|
121
|
+
|
122
|
+
def notify_listeners_about_removed_element(element)
|
123
|
+
@listeners.each { |l| l.model_changed(element.name, org.openhab.core.model.core.EventType::REMOVED) }
|
124
|
+
end
|
125
|
+
|
126
|
+
def notify_listeners_about_updated_element(element)
|
127
|
+
@listeners.each { |l| l.model_changed(element.name, org.openhab.core.model.core.EventType::MODIFIED) }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -13,7 +13,8 @@ module OpenHAB
|
|
13
13
|
def_delegators :__getobj__, :class, :is_a?, :kind_of?
|
14
14
|
|
15
15
|
# @!visibility private
|
16
|
-
EVENTS = [Events::ThingAddedEvent::TYPE,
|
16
|
+
EVENTS = [Events::ThingAddedEvent::TYPE,
|
17
|
+
Events::ThingUpdatedEvent::TYPE,
|
17
18
|
Events::ThingRemovedEvent::TYPE].freeze
|
18
19
|
# @!visibility private
|
19
20
|
UID_METHOD = :uid
|
@@ -144,7 +144,8 @@ module OpenHAB
|
|
144
144
|
def coerce(other)
|
145
145
|
logger.trace("Coercing #{self} as a request from #{other.class}")
|
146
146
|
return [other, zoned_date_time] if other.respond_to?(:to_zoned_date_time)
|
147
|
-
|
147
|
+
|
148
|
+
[DateTimeType.new(other), self] if other.respond_to?(:to_time)
|
148
149
|
end
|
149
150
|
|
150
151
|
#
|
@@ -174,25 +174,30 @@ module OpenHAB
|
|
174
174
|
add: :+,
|
175
175
|
subtract: :-
|
176
176
|
}.each do |java_op, ruby_op|
|
177
|
-
convert = "self.class.new(other,
|
177
|
+
convert = "self.class.new(other, thread_unit)"
|
178
178
|
|
179
179
|
class_eval( # rubocop:disable Style/DocumentDynamicEvalDefinition https://github.com/rubocop/rubocop/issues/10179
|
180
180
|
# def +(other)
|
181
181
|
# logger.trace("#{self} + #{other} (#{other.class})")
|
182
182
|
# if other.is_a?(QuantityType)
|
183
183
|
# add_quantity(other)
|
184
|
-
# elsif
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
190
|
-
#
|
191
|
-
#
|
192
|
-
#
|
193
|
-
# lhs
|
184
|
+
# elsif (thread_unit = DSL.unit(dimension))
|
185
|
+
# if other.is_a?(DecimalType)
|
186
|
+
# other = other.to_big_decimal
|
187
|
+
# add_quantity(self.class.new(other, thread_unit))
|
188
|
+
# elsif other.is_a?(java.math.BigDecimal)
|
189
|
+
# add_quantity(self.class.new(other, thread_unit))
|
190
|
+
# elsif other.respond_to?(:to_d)
|
191
|
+
# other = other.to_d.to_java
|
192
|
+
# add_quantity(self.class.new(other, thread_unit))
|
193
|
+
# elsif other.respond_to?(:coerce) && (lhs, rhs = other.coerce(to_d))
|
194
|
+
# lhs + rhs
|
195
|
+
# else
|
196
|
+
# raise TypeError, "#{other.class} can't be coerced into #{self.class}"
|
197
|
+
# end
|
194
198
|
# else
|
195
|
-
# raise TypeError,
|
199
|
+
# raise TypeError,
|
200
|
+
# "#{self.class} can only be added with another #{self.class} outside a unit block"
|
196
201
|
# end
|
197
202
|
# end
|
198
203
|
<<~RUBY, __FILE__, __LINE__ + 1
|
@@ -200,18 +205,23 @@ module OpenHAB
|
|
200
205
|
logger.trace("\#{self} #{ruby_op} \#{other} (\#{other.class})")
|
201
206
|
if other.is_a?(QuantityType)
|
202
207
|
#{java_op}_quantity(other)
|
203
|
-
elsif
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
lhs
|
208
|
+
elsif (thread_unit = DSL.unit(dimension))
|
209
|
+
if other.is_a?(DecimalType)
|
210
|
+
other = other.to_big_decimal
|
211
|
+
#{java_op}_quantity(#{convert})
|
212
|
+
elsif other.is_a?(java.math.BigDecimal)
|
213
|
+
#{java_op}_quantity(#{convert})
|
214
|
+
elsif other.respond_to?(:to_d)
|
215
|
+
other = other.to_d.to_java
|
216
|
+
#{java_op}_quantity(#{convert})
|
217
|
+
elsif other.respond_to?(:coerce) && (lhs, rhs = other.coerce(to_d))
|
218
|
+
lhs #{ruby_op} rhs
|
219
|
+
else
|
220
|
+
raise TypeError, "\#{other.class} can't be coerced into \#{self.class}"
|
221
|
+
end
|
213
222
|
else
|
214
|
-
raise TypeError,
|
223
|
+
raise TypeError,
|
224
|
+
"\#{self.class} can only be #{java_op}ed with another \#{self.class} outside a unit block"
|
215
225
|
end
|
216
226
|
end
|
217
227
|
RUBY
|
@@ -243,13 +253,13 @@ module OpenHAB
|
|
243
253
|
def #{ruby_op}(other)
|
244
254
|
logger.trace("\#{self} #{ruby_op} \#{other} (\#{other.class})")
|
245
255
|
if other.is_a?(QuantityType)
|
246
|
-
#{java_op}_quantity(other)
|
256
|
+
#{java_op}_quantity(other).unitize
|
247
257
|
elsif other.is_a?(DecimalType)
|
248
|
-
#{java_op}(other.to_big_decimal)
|
258
|
+
#{java_op}(other.to_big_decimal).unitize
|
249
259
|
elsif other.is_a?(java.math.BigDecimal)
|
250
|
-
#{java_op}(other)
|
260
|
+
#{java_op}(other).unitize
|
251
261
|
elsif other.respond_to?(:to_d)
|
252
|
-
#{java_op}(other.to_d.to_java)
|
262
|
+
#{java_op}(other.to_d.to_java).unitize
|
253
263
|
elsif other.respond_to?(:coerce) && (lhs, rhs = other.coerce(to_d))
|
254
264
|
lhs #{ruby_op} rhs
|
255
265
|
else
|
@@ -262,7 +272,7 @@ module OpenHAB
|
|
262
272
|
|
263
273
|
# if it's a dimensionless quantity, change the unit to match other_unit
|
264
274
|
# @!visibility private
|
265
|
-
def unitize(other_unit = unit)
|
275
|
+
def unitize(other_unit = unit, relative: false)
|
266
276
|
# prefer converting to the thread-specified unit if there is one
|
267
277
|
other_unit = DSL.unit(dimension) || other_unit
|
268
278
|
logger.trace("Converting #{self} to #{other_unit}")
|
@@ -273,7 +283,7 @@ module OpenHAB
|
|
273
283
|
when other_unit
|
274
284
|
self
|
275
285
|
else
|
276
|
-
to_unit(other_unit)
|
286
|
+
relative ? to_unit_relative(other_unit) : to_unit(other_unit)
|
277
287
|
end
|
278
288
|
end
|
279
289
|
|
@@ -288,16 +298,16 @@ module OpenHAB
|
|
288
298
|
|
289
299
|
private
|
290
300
|
|
291
|
-
# do addition directly against a QuantityType while ensuring we unitize
|
292
|
-
# both sides
|
301
|
+
# do addition directly against a QuantityType while ensuring we unitize both sides
|
293
302
|
def add_quantity(other)
|
294
|
-
|
303
|
+
self_unit = (unit == Units::ONE && DSL.unit(other.dimension)) || unit
|
304
|
+
unitize(self_unit).add(other.unitize(relative: true))
|
295
305
|
end
|
296
306
|
|
297
|
-
# do subtraction directly against a QuantityType while ensuring we
|
298
|
-
# unitize both sides
|
307
|
+
# do subtraction directly against a QuantityType while ensuring we unitize both sides
|
299
308
|
def subtract_quantity(other)
|
300
|
-
|
309
|
+
self_unit = (unit == Units::ONE && DSL.unit(other.dimension)) || unit
|
310
|
+
unitize(self_unit).subtract(other.unitize(relative: true))
|
301
311
|
end
|
302
312
|
|
303
313
|
# do multiplication directly against a QuantityType while ensuring
|
@@ -63,7 +63,7 @@ module OpenHAB
|
|
63
63
|
#
|
64
64
|
def coerce(other)
|
65
65
|
logger.trace("Coercing #{self} as a request from #{other.class}")
|
66
|
-
|
66
|
+
[other.to_str, self] if other.respond_to?(:to_str)
|
67
67
|
end
|
68
68
|
|
69
69
|
# any method that exists on String gets forwarded to to_s
|
@@ -107,10 +107,11 @@ module OpenHAB
|
|
107
107
|
|
108
108
|
# @see https://docs.ruby-lang.org/en/master/Hash.html#method-i-assoc Hash#assoc
|
109
109
|
def assoc(key)
|
110
|
-
[key,
|
111
|
-
|
112
|
-
|
113
|
-
|
110
|
+
[key,
|
111
|
+
fetch(key) do
|
112
|
+
# return nil directly, without storing a value to the cache
|
113
|
+
return nil
|
114
|
+
end]
|
114
115
|
end
|
115
116
|
|
116
117
|
# @see https://docs.ruby-lang.org/en/master/Hash.html#method-i-dig Hash#dig
|
@@ -56,12 +56,14 @@ module OpenHAB
|
|
56
56
|
return raw_parse(string, formatter) if formatter
|
57
57
|
|
58
58
|
format = /(am|pm)$/i.match?(string) ? "h[:mm[:ss][.S]][ ]a" : "H[:mm[:ss][.S]]"
|
59
|
-
java_send(:parse,
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
59
|
+
java_send(:parse,
|
60
|
+
[java.lang.CharSequence, java.time.format.DateTimeFormatter],
|
61
|
+
string,
|
62
|
+
java.time.format.DateTimeFormatterBuilder.new
|
63
|
+
.parse_case_insensitive
|
64
|
+
.parse_lenient
|
65
|
+
.append_pattern(format)
|
66
|
+
.to_formatter(java.util.Locale::ENGLISH))
|
65
67
|
end
|
66
68
|
end
|
67
69
|
|
@@ -21,7 +21,8 @@ module OpenHAB
|
|
21
21
|
#
|
22
22
|
def parse(string)
|
23
23
|
logger.trace("#{self.class}.parse #{string} (#{string.class})")
|
24
|
-
java_send(:parse,
|
24
|
+
java_send(:parse,
|
25
|
+
[java.lang.CharSequence, java.time.format.DateTimeFormatter],
|
25
26
|
string.to_s,
|
26
27
|
java.time.format.DateTimeFormatter.ofPattern("[--]M-d"))
|
27
28
|
end
|
@@ -270,7 +270,9 @@ module OpenHAB
|
|
270
270
|
# Homekit metadata (see {ItemBuilder#homekit})
|
271
271
|
# @param metadata [Hash<String, Hash>] Generic metadata (see {ItemBuilder#metadata})
|
272
272
|
# @param state [State] Initial state
|
273
|
-
def initialize(type,
|
273
|
+
def initialize(type,
|
274
|
+
name = nil,
|
275
|
+
label = nil,
|
274
276
|
provider:,
|
275
277
|
dimension: nil,
|
276
278
|
unit: nil,
|
@@ -70,7 +70,8 @@ module OpenHAB
|
|
70
70
|
builder = BuilderDSL.new(binding || block.binding)
|
71
71
|
builder.uid(id)
|
72
72
|
builder.instance_exec(builder, &block)
|
73
|
-
builder.guard = Guard.new(run_context: builder.caller,
|
73
|
+
builder.guard = Guard.new(run_context: builder.caller,
|
74
|
+
only_if: builder.only_if,
|
74
75
|
not_if: builder.not_if)
|
75
76
|
|
76
77
|
name ||= NameInference.infer_rule_name(builder)
|
@@ -1075,28 +1076,50 @@ module OpenHAB
|
|
1075
1076
|
#
|
1076
1077
|
# @overload cron(second: nil, minute: nil, hour: nil, dom: nil, month: nil, dow: nil, year: nil, attach: nil)
|
1077
1078
|
# The trigger can be created by specifying each field as keyword arguments.
|
1078
|
-
#
|
1079
|
+
#
|
1080
|
+
# When certain fields were omitted:
|
1081
|
+
# - The more specific fields will default to `0` for `hour`, `minute`, and `second`,
|
1082
|
+
# to `MON` for `dow`, and to `1` for `dom` and `month`.
|
1083
|
+
# - The less specific fields will default to `*` or `?` as appropriate.
|
1079
1084
|
#
|
1080
1085
|
# Each field is optional, but at least one must be specified.
|
1081
1086
|
#
|
1082
1087
|
# The same rules for the standard
|
1083
1088
|
# [cron expression](https://www.quartz-scheduler.org/documentation/quartz-2.2.2/tutorials/tutorial-lesson-06.html)
|
1084
1089
|
# apply for each field. For example, multiple values can be separated
|
1085
|
-
# with a comma within a string
|
1086
|
-
#
|
1087
|
-
#
|
1088
|
-
# @param [Integer, String, nil]
|
1089
|
-
# @param [Integer, String, nil]
|
1090
|
-
# @param [Integer, String, nil]
|
1091
|
-
# @param [Integer, String, nil]
|
1092
|
-
# @param [Integer, String, nil]
|
1093
|
-
# @param [Integer, String, nil]
|
1090
|
+
# with a comma within a string, and ranges can be specified with a dash or with
|
1091
|
+
# a Ruby Range.
|
1092
|
+
#
|
1093
|
+
# @param [Integer, String, Range, nil] second
|
1094
|
+
# @param [Integer, String, Range, nil] minute
|
1095
|
+
# @param [Integer, String, Range, nil] hour
|
1096
|
+
# @param [Integer, String, Symbol, Range, nil] dom
|
1097
|
+
# @param [Integer, String, Symbol, Range, nil] month
|
1098
|
+
# @param [Integer, String, Symbol, Range, nil] dow
|
1099
|
+
# @param [Integer, String, Range, nil] year
|
1094
1100
|
# @param [Object] attach object to be attached to the trigger
|
1095
|
-
#
|
1101
|
+
#
|
1102
|
+
# @example Using String values
|
1096
1103
|
# # Run every 3 minutes on Monday to Friday
|
1097
1104
|
# # equivalent to the cron expression "0 */3 * ? * MON-FRI *"
|
1098
1105
|
# rule "Using cron fields" do
|
1099
|
-
# cron
|
1106
|
+
# cron minute: "*/3", dow: "MON-FRI"
|
1107
|
+
# run { logger.info "Cron rule executed" }
|
1108
|
+
# end
|
1109
|
+
#
|
1110
|
+
# @example Defaults for unspecified fields
|
1111
|
+
# # Run at midnight on the first day of January, February, and March
|
1112
|
+
# # equivalent to the cron expression "0 0 0 1 JAN-MAR ? *"
|
1113
|
+
# rule "Using cron fields" do
|
1114
|
+
# cron month: "JAN-MAR"
|
1115
|
+
# run { logger.info "Cron rule executed" }
|
1116
|
+
# end
|
1117
|
+
#
|
1118
|
+
# @example Using Ruby Range values
|
1119
|
+
# # Run on the hour, every hour between 1pm and 5pm
|
1120
|
+
# # equivalent to the cron expression "0 0 13-17 ? * ? *"
|
1121
|
+
# rule "Using cron fields" do
|
1122
|
+
# cron hour: 13..17
|
1100
1123
|
# run { logger.info "Cron rule executed" }
|
1101
1124
|
# end
|
1102
1125
|
#
|
@@ -1559,18 +1582,25 @@ module OpenHAB
|
|
1559
1582
|
# @deprecated OH3.4 - OH3 config uses eventXXX vs OH4 uses `topic`, `source`, and `types`
|
1560
1583
|
# See https://github.com/openhab/openhab-core/pull/3299
|
1561
1584
|
trigger("core.GenericEventTrigger",
|
1562
|
-
eventTopic: topic,
|
1563
|
-
|
1585
|
+
eventTopic: topic,
|
1586
|
+
eventSource: source,
|
1587
|
+
eventTypes: types, # @deprecated OH3.4
|
1588
|
+
topic: topic,
|
1589
|
+
source: source,
|
1590
|
+
types: types,
|
1564
1591
|
attach: attach)
|
1565
1592
|
end
|
1566
1593
|
|
1567
1594
|
#
|
1568
|
-
# Creates a trigger based on the time stored in a {DateTimeItem}
|
1595
|
+
# Creates a trigger based on the date and time stored in a {DateTimeItem}
|
1596
|
+
#
|
1597
|
+
# The trigger will dynamically update whenever the state of the item changes.
|
1598
|
+
# If the item is {NULL} or {UNDEF}, the trigger will not run.
|
1569
1599
|
#
|
1570
|
-
#
|
1571
|
-
#
|
1600
|
+
# To trigger just on the time portion of the item, use {every} instead, e.g.
|
1601
|
+
# `every :day, at: MyDateTimeItem`.
|
1572
1602
|
#
|
1573
|
-
# @param [Item, String, Symbol] item The item (or
|
1603
|
+
# @param [Item, String, Symbol] item The item (or its name)
|
1574
1604
|
# @return [void]
|
1575
1605
|
#
|
1576
1606
|
# @example
|
@@ -1831,10 +1861,11 @@ module OpenHAB
|
|
1831
1861
|
types = [binding.local_variable_get(:for)].flatten
|
1832
1862
|
|
1833
1863
|
WatchHandler::WatchTriggerHandlerFactory.instance # ensure it's registered
|
1834
|
-
trigger(WatchHandler::WATCH_TRIGGER_MODULE_ID,
|
1835
|
-
|
1836
|
-
|
1837
|
-
|
1864
|
+
trigger(WatchHandler::WATCH_TRIGGER_MODULE_ID,
|
1865
|
+
path: path.to_s,
|
1866
|
+
types: types.map(&:to_s),
|
1867
|
+
glob: glob.to_s,
|
1868
|
+
attach: attach)
|
1838
1869
|
end
|
1839
1870
|
|
1840
1871
|
# @!endgroup
|
@@ -29,7 +29,7 @@ module OpenHAB
|
|
29
29
|
# @param [Hash] inputs inputs from trigger
|
30
30
|
# @return [true, false] if the conditions passed (and therefore the block was run)
|
31
31
|
#
|
32
|
-
def process(mod:, inputs:)
|
32
|
+
def process(mod:, inputs:)
|
33
33
|
logger.trace("Checking #{inputs} against condition trigger #{self}")
|
34
34
|
unless check_value(Conditions.old_state_from(inputs), @from) &&
|
35
35
|
check_value(Conditions.new_state_from(inputs), @to) &&
|