openhab-scripting 5.6.0 → 5.7.0
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/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) &&
|