openhab-scripting 4.30.3 → 4.30.4

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.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openhab-scripting
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.30.3
4
+ version: 4.30.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian O'Connell
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-20 00:00:00.000000000 Z
11
+ date: 2022-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -102,17 +102,21 @@ files:
102
102
  - lib/openhab/dsl/rules/property.rb
103
103
  - lib/openhab/dsl/rules/rule.rb
104
104
  - lib/openhab/dsl/rules/rule_config.rb
105
+ - lib/openhab/dsl/rules/rule_triggers.rb
105
106
  - lib/openhab/dsl/rules/terse.rb
106
107
  - lib/openhab/dsl/rules/triggers/changed.rb
107
108
  - lib/openhab/dsl/rules/triggers/channel.rb
108
109
  - lib/openhab/dsl/rules/triggers/command.rb
109
110
  - lib/openhab/dsl/rules/triggers/conditions/duration.rb
110
111
  - lib/openhab/dsl/rules/triggers/conditions/proc.rb
111
- - lib/openhab/dsl/rules/triggers/cron.rb
112
+ - lib/openhab/dsl/rules/triggers/cron/cron.rb
113
+ - lib/openhab/dsl/rules/triggers/cron/cron_handler.rb
112
114
  - lib/openhab/dsl/rules/triggers/generic.rb
113
115
  - lib/openhab/dsl/rules/triggers/trigger.rb
116
+ - lib/openhab/dsl/rules/triggers/triggers.rb
114
117
  - lib/openhab/dsl/rules/triggers/updated.rb
115
- - lib/openhab/dsl/rules/triggers/watch.rb
118
+ - lib/openhab/dsl/rules/triggers/watch/watch.rb
119
+ - lib/openhab/dsl/rules/triggers/watch/watch_handler.rb
116
120
  - lib/openhab/dsl/states.rb
117
121
  - lib/openhab/dsl/things.rb
118
122
  - lib/openhab/dsl/time/month_day.rb
@@ -1,288 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
-
5
- module OpenHAB
6
- module DSL
7
- module Rules
8
- #
9
- # Cron type rules
10
- #
11
- module Triggers
12
- #
13
- # Returns a default map for cron expressions that fires every second
14
- # This map is usually updated via merge by other methods to refine cron type triggers.
15
- #
16
- # @return [Hash] Map with symbols for :seconds, :minute, :hour, :dom, :month, :dow
17
- # configured to fire every second
18
- #
19
- def cron_expression_map
20
- {
21
- second: '*',
22
- minute: '*',
23
- hour: '*',
24
- dom: '?',
25
- month: '*',
26
- dow: '?'
27
- }
28
- end
29
-
30
- module_function :cron_expression_map
31
-
32
- # @return [Hash] Map of days of the week from symbols to to OpenHAB cron strings
33
- DAY_OF_WEEK_MAP = {
34
- monday: 'MON',
35
- tuesday: 'TUE',
36
- wednesday: 'WED',
37
- thursday: 'THU',
38
- friday: 'FRI',
39
- saturday: 'SAT',
40
- sunday: 'SUN'
41
- }.freeze
42
-
43
- private_constant :DAY_OF_WEEK_MAP
44
-
45
- # @return [Hash] Converts the DAY_OF_WEEK_MAP to map used by Cron Expression
46
- DAY_OF_WEEK_EXPRESSION_MAP = DAY_OF_WEEK_MAP.transform_values { |v| cron_expression_map.merge(dow: v) }
47
-
48
- private_constant :DAY_OF_WEEK_EXPRESSION_MAP
49
-
50
- # @return [Hash] Create a set of cron expressions based on different time intervals
51
- EXPRESSION_MAP = {
52
- second: cron_expression_map,
53
- minute: cron_expression_map.merge(second: '0'),
54
- hour: cron_expression_map.merge(second: '0', minute: '0'),
55
- day: cron_expression_map.merge(second: '0', minute: '0', hour: '0'),
56
- week: cron_expression_map.merge(second: '0', minute: '0', hour: '0', dow: 'MON'),
57
- month: cron_expression_map.merge(second: '0', minute: '0', hour: '0', dom: '1'),
58
- year: cron_expression_map.merge(second: '0', minute: '0', hour: '0', dom: '1', month: '1')
59
- }.merge(DAY_OF_WEEK_EXPRESSION_MAP)
60
- .freeze
61
-
62
- private_constant :EXPRESSION_MAP
63
-
64
- #
65
- # Create a rule that executes at the specified interval
66
- #
67
- # @param [Object] value Symbol or Duration to execute this rule
68
- # @param [Object] at TimeOfDay or String representing TimeOfDay in which to execute rule
69
- #
70
- #
71
- def every(value, at: nil, attach: nil)
72
- cron_expression = case value
73
- when Symbol then cron_from_symbol(value, at)
74
- when Java::JavaTime::Duration then cron_from_duration(value, at)
75
- else raise ArgumentExpression, 'Unknown interval'
76
- end
77
- cron(cron_expression, attach: attach)
78
- end
79
-
80
- #
81
- # Create a OpenHAB Cron trigger
82
- #
83
- # @param [String] expression OpenHAB style cron expression
84
- #
85
- def cron(expression, attach: nil)
86
- append_trigger(Trigger::CRON, { 'cronExpression' => expression }, attach: attach)
87
- end
88
-
89
- private
90
-
91
- #
92
- # Create a cron map from a duration
93
- #
94
- # @param [java::time::Duration] duration
95
- # @param [Object] at TimeOfDay or String representing time of day
96
- #
97
- # @return [Hash] map describing cron expression
98
- #
99
- def cron_from_duration(duration, at)
100
- raise ArgumentError, '"at" cannot be used with duration' if at
101
-
102
- map_to_cron(duration_to_map(duration))
103
- end
104
-
105
- #
106
- # Create a cron map from a symbol
107
- #
108
- # @param [Symbol] symbol
109
- # @param [Object] at TimeOfDay or String representing time of day
110
- #
111
- # @return [Hash] map describing cron expression created from symbol
112
- #
113
- def cron_from_symbol(symbol, at)
114
- expression_map = EXPRESSION_MAP[symbol]
115
- expression_map = at_condition(expression_map, at) if at
116
- map_to_cron(expression_map)
117
- end
118
-
119
- #
120
- # Map cron expression to to cron string
121
- #
122
- # @param [Map] map of cron expression
123
- #
124
- # @return [String] OpenHAB cron string
125
- #
126
- def map_to_cron(map)
127
- %i[second minute hour dom month dow].map { |field| map.fetch(field) }.join(' ')
128
- end
129
-
130
- #
131
- # Convert a Java Duration to a map for the map_to_cron method
132
- #
133
- # @param duration [Java::JavaTime::Duration] The duration object
134
- #
135
- # @return [Hash] a map suitable for map_to_cron
136
- #
137
- def duration_to_map(duration)
138
- if duration.to_millis_part.zero? && duration.to_nanos_part.zero? && duration.to_days.zero?
139
- %i[second minute hour].each do |unit|
140
- to_unit_part = duration.public_send("to_#{unit}s_part")
141
- next unless to_unit_part.positive?
142
-
143
- to_unit = duration.public_send("to_#{unit}s")
144
- break unless to_unit_part == to_unit
145
-
146
- return EXPRESSION_MAP[unit].merge(unit => "*/#{to_unit}")
147
- end
148
- end
149
- raise ArgumentError, "Cron Expression not supported for duration: #{duration}"
150
- end
151
-
152
- #
153
- # If an at time is provided, parse that and merge the new fields into the expression.
154
- #
155
- # @param [<Type>] expression_map <description>
156
- # @param [<Type>] at_time <description>
157
- #
158
- # @return [<Type>] <description>
159
- #
160
- def at_condition(expression_map, at_time)
161
- if at_time
162
- tod = at_time.is_a?(TimeOfDay::TimeOfDay) ? at_time : TimeOfDay::TimeOfDay.parse(at_time)
163
- expression_map = expression_map.merge(hour: tod.hour, minute: tod.minute, second: tod.second)
164
- end
165
- expression_map
166
- end
167
-
168
- #
169
- # Cron trigger that provides trigger ID
170
- #
171
- module Cron
172
- include OpenHAB::Log
173
-
174
- #
175
- # Creates trigger types and trigger type factories for OpenHAB
176
- #
177
- def self.add_script_cron_handler
178
- java_import org.openhab.core.automation.type.TriggerType
179
- OpenHAB::Core.automation_manager.add_trigger_handler(
180
- OpenHAB::DSL::Rules::Triggers::Cron::CRON_TRIGGER_MODULE_ID,
181
- OpenHAB::DSL::Rules::Triggers::Cron::CronTriggerHandlerFactory.new
182
- )
183
-
184
- OpenHAB::Core.automation_manager.add_trigger_type(cron_trigger_type)
185
- OpenHAB::Log.logger(self).trace('Added script cron trigger handler')
186
- end
187
-
188
- #
189
- # Creates trigger types and trigger type factories for OpenHAB
190
- #
191
- private_class_method def self.cron_trigger_type
192
- TriggerType.new(
193
- OpenHAB::DSL::Rules::Triggers::Cron::CRON_TRIGGER_MODULE_ID,
194
- nil,
195
- 'A specific instant occurs',
196
- 'Triggers when the specified instant occurs',
197
- nil,
198
- org.openhab.core.automation.Visibility::VISIBLE,
199
- nil
200
- )
201
- end
202
-
203
- # Trigger ID for Watch Triggers
204
- CRON_TRIGGER_MODULE_ID = 'jsr223.jruby.CronTrigger'
205
-
206
- # Cron Trigger Handler that provides trigger IDs
207
- # Unfortunatly because the CronTriggerHandler in OpenHAB core is marked internal
208
- # the entire thing must be recreated here
209
- class CronTriggerHandler < org.openhab.core.automation.handler.BaseTriggerModuleHandler
210
- include OpenHAB::Log
211
- include org.openhab.core.scheduler.SchedulerRunnable
212
- include org.openhab.core.automation.handler.TimeBasedTriggerHandler
213
-
214
- # Provides access to protected fields
215
- field_accessor :callback
216
-
217
- # Creates a new CronTriggerHandler
218
- # @param [Trigger] OpenHAB trigger associated with handler
219
- #
220
- def initialize(trigger)
221
- @trigger = trigger
222
- @scheduler = OpenHAB::Core::OSGI.service('org.openhab.core.scheduler.CronScheduler')
223
- @expression = trigger.configuration.get('cronExpression')
224
- super(trigger)
225
- end
226
-
227
- #
228
- # Set the callback to execute when cron trigger fires
229
- # @param [Object] callback to run
230
- #
231
- def setCallback(callback) # rubocop:disable Naming/MethodName
232
- synchronized do
233
- super(callback)
234
- @scheduler.schedule(self, @expression)
235
- logger.trace("Scheduled cron job '#{@expression}' for trigger '#{@trigger.id}'.")
236
- end
237
- end
238
-
239
- #
240
- # Get the temporal adjuster
241
- # @return [CronAdjuster]
242
- #
243
- def getTemporalAdjuster # rubocop:disable Naming/MethodName
244
- org.openhab.core.scheduler.CronAdjuster.new(expression)
245
- end
246
-
247
- #
248
- # Execute the callback
249
- #
250
- def run
251
- callback&.triggered(@trigger, { 'module' => @trigger.id })
252
- end
253
-
254
- #
255
- # Displose of the handler
256
- # cancel the cron scheduled task
257
- #
258
- def dispose
259
- synchronized do
260
- super
261
- return unless @schedule
262
-
263
- @schedule&.cancel(true)
264
- end
265
- logger.trace("cancelled job for trigger '#{@trigger.id}'.")
266
- end
267
- end
268
-
269
- # Implements the ScriptedTriggerHandlerFactory interface to create a new Cron Trigger Handler
270
- class CronTriggerHandlerFactory
271
- include org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory
272
-
273
- # Invoked by the OpenHAB core to get a trigger handler for the supllied trigger
274
- # @param [Trigger] OpenHAB trigger
275
- #
276
- # @return [WatchTriggerHandler] trigger handler for supplied trigger
277
- def get(trigger)
278
- CronTriggerHandler.new(trigger)
279
- end
280
- end
281
- end
282
- end
283
- end
284
- end
285
- end
286
-
287
- # Add the cron handler to OpenHAB
288
- OpenHAB::DSL::Rules::Triggers::Cron.add_script_cron_handler