openhab-scripting 4.28.1 → 4.28.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 824e2af85aba6737c05884f3f6ca06adc1873a388b8091062781b274290c6476
4
- data.tar.gz: 159ed6ce10d55640c37b61429a937f4dafaecf529479b3423552bff9d929d30d
3
+ metadata.gz: 7c9d9745b2590c4152baf18a82dbe0063ac4c73c94f6f452d9d848790d8eb06a
4
+ data.tar.gz: 276152f1a79cf44fb539f4bb0c73618263db8d4a944cf367fa0ef1db167d989a
5
5
  SHA512:
6
- metadata.gz: 3f6f18504814c73aad6e9c5d5a7548ae17165dff3d4f85a618103f79574389d201c82a528ec09b27b37e975b05b47bb0cd78e958ba0a4bb3b094314f842b9c0e
7
- data.tar.gz: d0baf3b51e76656b68e24faa3ceb8d0e76e6afea89b2ba6f81c152ce0f2ddb560fe1942af225f8f1b7ace9c5d3e9c1605c83a1654bddecdceb16f57d47c93b6e
6
+ metadata.gz: d66efa237735b6a754e97eb933a301cb5dd639fa7cc715fa7d36c3e6f7ed14c11a3da874ea707792cb0913bb9e57396b33532746b7a63b08acf50ff15d4fc9f0
7
+ data.tar.gz: b2fcbb63e5e9da86909dd7b7b2bcb054b29aea1b80ae59fb26555a7aa678a7f4ebe04ee36dda69413c7cc8fbe08c7beeeaa5ad333e09d4bac08bbe2b769e85e7
@@ -5,7 +5,6 @@ require 'openhab/core/services'
5
5
  require 'openhab/log/logger'
6
6
  require_relative 'rule_config'
7
7
  require_relative 'automation_rule'
8
- require_relative 'cron_trigger_rule'
9
8
  require_relative 'guard'
10
9
 
11
10
  module OpenHAB
@@ -70,44 +69,14 @@ module OpenHAB
70
69
  def process_rule_config(config)
71
70
  return unless create_rule?(config)
72
71
 
73
- cron_attach_triggers, other_triggers = partition_triggers(config)
74
- logger.trace("Cron triggers: #{cron_attach_triggers} - Other triggers: #{other_triggers}")
75
- config.triggers = other_triggers
76
-
77
72
  rule = AutomationRule.new(config: config)
78
73
  Rules.script_rules << rule
79
74
  add_rule(rule)
80
75
 
81
- process_cron_attach(cron_attach_triggers, config, rule)
82
-
83
76
  rule.execute(nil, { 'event' => Struct.new(:attachment).new(config.start_attachment) }) if config.on_start?
84
77
  rule
85
78
  end
86
79
 
87
- #
88
- # Add cron triggers with attachments to rules
89
- # @param [Array] cron_attach_triggers cron type triggers with attachments
90
- #
91
- def process_cron_attach(cron_attach_triggers, config, rule)
92
- cron_attach_triggers&.map { |trigger| CronTriggerRule.new(rule_config: config, rule: rule, trigger: trigger) }
93
- &.each { |trigger| add_rule(trigger) }
94
- end
95
-
96
- #
97
- # Partitions triggers in a config, removing cron triggers with a corresponding attachment
98
- # so they can be used with CronTriggerRules to support attachments
99
- # @return [Array] Two element array the first element is cron triggers with attachments,
100
- # second element is other triggers
101
- #
102
- def partition_triggers(config)
103
- config
104
- .triggers
105
- .partition do |trigger|
106
- trigger.typeUID == OpenHAB::DSL::Rules::Triggers::Trigger::CRON &&
107
- config.attachments.key?(trigger.id)
108
- end
109
- end
110
-
111
80
  #
112
81
  # Should a rule be created based on rule configuration
113
82
  #
@@ -164,7 +164,125 @@ module OpenHAB
164
164
  end
165
165
  expression_map
166
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
167
282
  end
168
283
  end
169
284
  end
170
285
  end
286
+
287
+ # Add the cron handler to OpenHAB
288
+ OpenHAB::DSL::Rules::Triggers::Cron.add_script_cron_handler
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'securerandom'
4
4
  require 'java'
5
+ require_relative 'cron'
5
6
 
6
7
  module OpenHAB
7
8
  module DSL
@@ -111,7 +112,7 @@ module OpenHAB
111
112
  TIME_OF_DAY = 'timer.TimeOfDayTrigger'
112
113
 
113
114
  # @return [String] A cron trigger
114
- CRON = 'timer.GenericCronTrigger'
115
+ CRON = OpenHAB::DSL::Rules::Triggers::Cron::CRON_TRIGGER_MODULE_ID
115
116
 
116
117
  #
117
118
  # Create a trigger
@@ -138,11 +138,9 @@ module OpenHAB
138
138
 
139
139
  # Called by OpenHAB to set the rule engine to invoke when triggered
140
140
  # Must match java method name style
141
- # rubocop:disable Naming/MethodName
142
- def setCallback(callback)
141
+ def setCallback(callback) # rubocop:disable Naming/MethodName
143
142
  @rule_engine_callback = callback
144
143
  end
145
- # rubocop:enable Naming/MethodName
146
144
 
147
145
  #
148
146
  # Dispose of handler which deactivates watcher
@@ -5,5 +5,5 @@
5
5
  #
6
6
  module OpenHAB
7
7
  # @return [String] Version of OpenHAB helper libraries
8
- VERSION = '4.28.1'
8
+ VERSION = '4.28.2'
9
9
  end
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.28.1
4
+ version: 4.28.2
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-15 00:00:00.000000000 Z
11
+ date: 2022-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,7 +97,6 @@ files:
97
97
  - lib/openhab/dsl/openhab.rb
98
98
  - lib/openhab/dsl/persistence.rb
99
99
  - lib/openhab/dsl/rules/automation_rule.rb
100
- - lib/openhab/dsl/rules/cron_trigger_rule.rb
101
100
  - lib/openhab/dsl/rules/guard.rb
102
101
  - lib/openhab/dsl/rules/item_event.rb
103
102
  - lib/openhab/dsl/rules/property.rb
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
- require 'openhab/log/logger'
5
-
6
- module OpenHAB
7
- module DSL
8
- #
9
- # Creates and manages OpenHAB Rules
10
- #
11
- module Rules
12
- #
13
- # Specialized rule for cron triggers with attachments because OpenHAB does not provide trigger UID for cron rules
14
- #
15
- class CronTriggerRule < Java::OrgOpenhabCoreAutomationModuleScriptRulesupportSharedSimple::SimpleRule
16
- include OpenHAB::Log
17
-
18
- def initialize(rule_config:, rule:, trigger:)
19
- super()
20
- set_name("#{rule_config.name}-cron-#{trigger.id}")
21
- set_triggers([trigger])
22
- @rule = rule
23
- @trigger = trigger
24
- logger.trace("Created Cron Trigger Rule for #{@trigger}")
25
- end
26
-
27
- #
28
- # Execute the rule
29
- #
30
- # @param [Map] mod map provided by OpenHAB rules engine
31
- # @param [Map] inputs map provided by OpenHAB rules engine containing event and other information
32
- #
33
- #
34
- def execute(mod = nil, _inputs = nil)
35
- logger.trace "Trigger #{@trigger} fired for base rule #{@rule.inspect}"
36
- inputs = { 'module' => @trigger.id }
37
- @rule.execute(mod, inputs)
38
- end
39
- end
40
- end
41
- end
42
- end