openhab-scripting 5.16.0 → 5.18.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab/core/entity_lookup.rb +5 -5
  3. data/lib/openhab/core/events/item_state_updated_event.rb +11 -11
  4. data/lib/openhab/core/events/item_time_series_updated_event.rb +23 -0
  5. data/lib/openhab/core/events/timer_event.rb +32 -32
  6. data/lib/openhab/core/items/generic_item.rb +12 -0
  7. data/lib/openhab/core/items/numeric_item.rb +1 -1
  8. data/lib/openhab/core/items/persistence.rb +2 -4
  9. data/lib/openhab/core/items/registry.rb +1 -3
  10. data/lib/openhab/core/items/semantics/enumerable.rb +2 -2
  11. data/lib/openhab/core/items/semantics.rb +1 -4
  12. data/lib/openhab/core/profile_factory.rb +16 -1
  13. data/lib/openhab/core/rules/registry.rb +2 -1
  14. data/lib/openhab/core/rules/rule.rb +1 -0
  15. data/lib/openhab/core/sitemaps/provider.rb +3 -1
  16. data/lib/openhab/core/things/channel.rb +1 -1
  17. data/lib/openhab/core/things/profile_callback.rb +5 -0
  18. data/lib/openhab/core/things/thing.rb +6 -0
  19. data/lib/openhab/core/types/string_type.rb +1 -1
  20. data/lib/openhab/core/types/time_series.rb +131 -0
  21. data/lib/openhab/core.rb +14 -1
  22. data/lib/openhab/core_ext/java/instant.rb +14 -0
  23. data/lib/openhab/dsl/items/builder.rb +0 -1
  24. data/lib/openhab/dsl/items/timed_command.rb +1 -0
  25. data/lib/openhab/dsl/rules/builder.rb +140 -39
  26. data/lib/openhab/dsl/rules/name_inference.rb +16 -8
  27. data/lib/openhab/dsl/rules/property.rb +4 -1
  28. data/lib/openhab/dsl/rules/rule_triggers.rb +5 -3
  29. data/lib/openhab/dsl/rules/terse.rb +32 -15
  30. data/lib/openhab/dsl/rules/triggers/changed.rb +15 -7
  31. data/lib/openhab/dsl/rules/triggers/cron/cron.rb +3 -2
  32. data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +98 -100
  33. data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +2 -2
  34. data/lib/openhab/dsl/sitemaps/builder.rb +1 -1
  35. data/lib/openhab/dsl/version.rb +1 -1
  36. data/lib/openhab/dsl.rb +30 -4
  37. data/lib/openhab/rspec/mocks/persistence_service.rb +10 -3
  38. data/lib/openhab/rspec/mocks/synchronous_executor.rb +2 -1
  39. data/lib/openhab/rspec/mocks/thing_handler.rb +4 -0
  40. metadata +6 -3
@@ -1,120 +1,118 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # @deprecated OH3.4 this module is not needed in OH4+
4
- if Gem::Version.new(OpenHAB::Core::VERSION) < Gem::Version.new("4.0.0")
5
-
6
- require "singleton"
7
-
8
- require_relative "cron"
9
-
10
- module OpenHAB
11
- module DSL
12
- module Rules
13
- module Triggers
14
- # @!visibility private
15
- #
16
- # Cron trigger handler that provides trigger ID
17
- #
18
- module CronHandler
19
- # Cron Trigger Handler that provides trigger IDs
20
- # Unfortunatly because the CronTriggerHandler in openHAB core is marked internal
21
- # the entire thing must be recreated here
22
- class CronTriggerHandler < org.openhab.core.automation.handler.BaseTriggerModuleHandler
23
- include org.openhab.core.scheduler.SchedulerRunnable
24
- include org.openhab.core.automation.handler.TimeBasedTriggerHandler
25
-
26
- # Provides access to protected fields
27
- field_accessor :callback
28
-
29
- # Creates a new CronTriggerHandler
30
- # @param [org.openhab.core.automation.Trigger] trigger openHAB trigger associated with handler
31
- #
32
- def initialize(trigger)
33
- @trigger = trigger
34
- @scheduler = OSGi.service("org.openhab.core.scheduler.CronScheduler")
35
- @schedule = nil
36
- @expression = trigger.configuration.get("cronExpression")
37
- super(trigger)
38
- end
4
+ return unless OpenHAB::Core.version < OpenHAB::Core::V4_0
5
+
6
+ require "singleton"
7
+
8
+ require_relative "cron"
9
+
10
+ module OpenHAB
11
+ module DSL
12
+ module Rules
13
+ module Triggers
14
+ # @!visibility private
15
+ #
16
+ # Cron trigger handler that provides trigger ID
17
+ #
18
+ module CronHandler
19
+ # Cron Trigger Handler that provides trigger IDs
20
+ # Unfortunatly because the CronTriggerHandler in openHAB core is marked internal
21
+ # the entire thing must be recreated here
22
+ class CronTriggerHandler < org.openhab.core.automation.handler.BaseTriggerModuleHandler
23
+ include org.openhab.core.scheduler.SchedulerRunnable
24
+ include org.openhab.core.automation.handler.TimeBasedTriggerHandler
25
+
26
+ # Provides access to protected fields
27
+ field_accessor :callback
28
+
29
+ # Creates a new CronTriggerHandler
30
+ # @param [org.openhab.core.automation.Trigger] trigger openHAB trigger associated with handler
31
+ #
32
+ def initialize(trigger)
33
+ @trigger = trigger
34
+ @scheduler = OSGi.service("org.openhab.core.scheduler.CronScheduler")
35
+ @schedule = nil
36
+ @expression = trigger.configuration.get("cronExpression")
37
+ super(trigger)
38
+ end
39
39
 
40
- #
41
- # Set the callback to execute when cron trigger fires
42
- # @param [Object] callback to run
43
- #
44
- def setCallback(callback) # rubocop:disable Naming/MethodName
45
- synchronized do
46
- super(callback)
47
- @schedule = @scheduler.schedule(self, @expression)
48
- logger.trace("Scheduled cron job '#{@expression}' for trigger '#{@trigger.id}'.")
49
- end
40
+ #
41
+ # Set the callback to execute when cron trigger fires
42
+ # @param [Object] callback to run
43
+ #
44
+ def setCallback(callback) # rubocop:disable Naming/MethodName
45
+ synchronized do
46
+ super(callback)
47
+ @schedule = @scheduler.schedule(self, @expression)
48
+ logger.trace("Scheduled cron job '#{@expression}' for trigger '#{@trigger.id}'.")
50
49
  end
50
+ end
51
51
 
52
- #
53
- # Get the temporal adjuster
54
- # @return [CronAdjuster]
55
- #
56
- def getTemporalAdjuster # rubocop:disable Naming/MethodName
57
- org.openhab.core.scheduler.CronAdjuster.new(@expression)
58
- end
52
+ #
53
+ # Get the temporal adjuster
54
+ # @return [CronAdjuster]
55
+ #
56
+ def getTemporalAdjuster # rubocop:disable Naming/MethodName
57
+ org.openhab.core.scheduler.CronAdjuster.new(@expression)
58
+ end
59
59
 
60
- #
61
- # Execute the callback
62
- #
63
- def run
64
- callback&.triggered(@trigger, { "module" => @trigger.id })
65
- end
60
+ #
61
+ # Execute the callback
62
+ #
63
+ def run
64
+ callback&.triggered(@trigger, { "module" => @trigger.id })
65
+ end
66
66
 
67
- #
68
- # Dispose of the handler
69
- # cancel the cron scheduled task
70
- #
71
- def dispose
72
- synchronized do
73
- super
74
- return unless @schedule
67
+ #
68
+ # Dispose of the handler
69
+ # cancel the cron scheduled task
70
+ #
71
+ def dispose
72
+ synchronized do
73
+ super
74
+ return unless @schedule
75
75
 
76
- @schedule.cancel(true)
77
- @schedule = nil
78
- end
79
- logger.trace("cancelled job for trigger '#{@trigger.id}'.")
76
+ @schedule.cancel(true)
77
+ @schedule = nil
80
78
  end
79
+ logger.trace("cancelled job for trigger '#{@trigger.id}'.")
81
80
  end
81
+ end
82
82
 
83
- # Implements the ScriptedTriggerHandlerFactory interface to create a new Cron Trigger Handler
84
- class CronTriggerHandlerFactory
85
- include Singleton
86
- include org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory # rubocop:disable Layout/LineLength
87
-
88
- def initialize
89
- Core.automation_manager.add_trigger_handler(
90
- Cron::CRON_TRIGGER_MODULE_ID,
91
- self
92
- )
93
-
94
- Core.automation_manager.add_trigger_type(org.openhab.core.automation.type.TriggerType.new(
95
- Cron::CRON_TRIGGER_MODULE_ID,
96
- nil,
97
- "A specific instant occurs",
98
- "Triggers when the specified instant occurs",
99
- nil,
100
- org.openhab.core.automation.Visibility::VISIBLE,
101
- nil
102
- ))
103
- logger.trace("Added script cron trigger handler")
104
- end
83
+ # Implements the ScriptedTriggerHandlerFactory interface to create a new Cron Trigger Handler
84
+ class CronTriggerHandlerFactory
85
+ include Singleton
86
+ include org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory
87
+
88
+ def initialize
89
+ Core.automation_manager.add_trigger_handler(
90
+ Cron::CRON_TRIGGER_MODULE_ID,
91
+ self
92
+ )
93
+
94
+ Core.automation_manager.add_trigger_type(org.openhab.core.automation.type.TriggerType.new(
95
+ Cron::CRON_TRIGGER_MODULE_ID,
96
+ nil,
97
+ "A specific instant occurs",
98
+ "Triggers when the specified instant occurs",
99
+ nil,
100
+ org.openhab.core.automation.Visibility::VISIBLE,
101
+ nil
102
+ ))
103
+ logger.trace("Added script cron trigger handler")
104
+ end
105
105
 
106
- # Invoked by openHAB core to get a trigger handler for the supplied trigger
107
- # @param [org.openhab.core.automation.Trigger] trigger
108
- #
109
- # @return [WatchTriggerHandler] trigger handler for supplied trigger
110
- def get(trigger)
111
- CronTriggerHandler.new(trigger)
112
- end
106
+ # Invoked by openHAB core to get a trigger handler for the supplied trigger
107
+ # @param [org.openhab.core.automation.Trigger] trigger
108
+ #
109
+ # @return [CronTriggerHandler] trigger handler for supplied trigger
110
+ def get(trigger)
111
+ CronTriggerHandler.new(trigger)
113
112
  end
114
113
  end
115
114
  end
116
115
  end
117
116
  end
118
117
  end
119
-
120
118
  end
@@ -301,7 +301,7 @@ module OpenHAB
301
301
  Core.automation_manager.add_trigger_type(org.openhab.core.automation.type.TriggerType.new(
302
302
  WATCH_TRIGGER_MODULE_ID,
303
303
  nil,
304
- "A path change event is detected",
304
+ "a path change event is detected",
305
305
  "Triggers when a path change event is detected",
306
306
  nil,
307
307
  org.openhab.core.automation.Visibility::VISIBLE,
@@ -310,7 +310,7 @@ module OpenHAB
310
310
  logger.trace("Added watch trigger handler")
311
311
  end
312
312
 
313
- # Invoked by openHAB core to get a trigger handler for the supllied trigger
313
+ # Invoked by openHAB core to get a trigger handler for the supplied trigger
314
314
  # @param [org.openhab.core.automation.Trigger] trigger
315
315
  #
316
316
  # @return [WatchTriggerHandler] trigger handler for supplied trigger
@@ -144,7 +144,7 @@ module OpenHAB
144
144
  if @builder_proxy
145
145
  old_obj = @builder_proxy.__getobj__
146
146
  @builder_proxy.__setobj__(self)
147
- begin
147
+ DSL::ThreadLocal.thread_local(openhab_create_dummy_items: true) do
148
148
  yield @builder_proxy
149
149
  ensure
150
150
  @builder_proxy.__setobj__(old_obj)
@@ -4,6 +4,6 @@ module OpenHAB
4
4
  module DSL
5
5
  # Version of openHAB helper libraries
6
6
  # @return [String]
7
- VERSION = "5.16.0"
7
+ VERSION = "5.18.0"
8
8
  end
9
9
  end
data/lib/openhab/dsl.rb CHANGED
@@ -56,8 +56,14 @@ module OpenHAB
56
56
  # @!group Rule Creation
57
57
 
58
58
  # (see Rules::Builder#rule)
59
- def rule(name = nil, **kwargs, &block)
60
- rules.build { rule(name, **kwargs, &block) }
59
+ def rule(name = nil, id: nil, **kwargs, &block)
60
+ rules.build { rule(name, id: id, **kwargs, &block) }
61
+ end
62
+
63
+ # Creates a rule that will remove existing rules with the same id, even when the id has been inferred.
64
+ # @see rule
65
+ def rule!(name = nil, id: nil, **kwargs, &block)
66
+ rules.build { rule(name, id: id, replace: true, **kwargs, &block) }
61
67
  end
62
68
 
63
69
  # (see Rules::Builder#scene)
@@ -65,11 +71,27 @@ module OpenHAB
65
71
  rules.build { scene(name, description: description, id: id, tag: tag, tags: tags, **kwargs, &block) }
66
72
  end
67
73
 
74
+ # Creates a scene that will remove existing rules/scenes with the same id, even when the id has been inferred.
75
+ # @see scene
76
+ def scene!(name = nil, description: nil, id: nil, tag: nil, tags: nil, **kwargs, &block)
77
+ rules.build do
78
+ scene(name, description: description, id: id, tag: tag, tags: tags, replace: true, **kwargs, &block)
79
+ end
80
+ end
81
+
68
82
  # (see Rules::Builder#script)
69
83
  def script(name = nil, description: nil, id: nil, tag: nil, tags: nil, **kwargs, &block)
70
84
  rules.build { script(name, description: description, id: id, tag: tag, tags: tags, **kwargs, &block) }
71
85
  end
72
86
 
87
+ # Creates a script that will remove existing rules/scripts with the same id, even when the id has been inferred.
88
+ # @see script
89
+ def script!(name = nil, description: nil, id: nil, tag: nil, tags: nil, **kwargs, &block)
90
+ rules.build do
91
+ script(name, description: description, id: id, tag: tag, tags: tags, replace: true, **kwargs, &block)
92
+ end
93
+ end
94
+
73
95
  # @!group Rule Support
74
96
 
75
97
  # rubocop:disable Layout/LineLength
@@ -84,14 +106,17 @@ module OpenHAB
84
106
  # @param [String, nil] label The label for the profile. When nil, the profile will not be visible in the UI.
85
107
  # @param [org.openhab.core.config.core.ConfigDescription, nil] config_description
86
108
  # The configuration description for the profile so that it can be configured in the UI.
87
- # @yield [event, command: nil, state: nil, callback:, link:, item:, channel_uid:, configuration:, context:]
109
+ # @yield [event, command: nil, state: nil, time_series: nil, callback:, link:, item:, channel_uid:, configuration:, context:]
88
110
  # All keyword params are optional. Any that aren't defined won't be passed.
89
- # @yieldparam [:command_from_item, :state_from_item, :command_from_handler, :state_from_handler] event
111
+ # @yieldparam [:command_from_item, :state_from_item, :command_from_handler, :state_from_handler, :time_series_from_handler] event
90
112
  # The event that needs to be processed.
91
113
  # @yieldparam [Command, nil] command
92
114
  # The command being sent for `:command_from_item` and `:command_from_handler` events.
93
115
  # @yieldparam [State, nil] state
94
116
  # The state being sent for `:state_from_item` and `:state_from_handler` events.
117
+ # @yieldparam [TimeSeries] time_series
118
+ # The time series for `:time_series_from_handler` events.
119
+ # Only available since openHAB 4.1.
95
120
  # @yieldparam [Core::Things::ProfileCallback] callback
96
121
  # The callback to be used to customize the action taken.
97
122
  # @yieldparam [Core::Things::ItemChannelLink] link
@@ -105,6 +130,7 @@ module OpenHAB
105
130
  #
106
131
  # @see org.openhab.core.thing.profiles.Profile
107
132
  # @see org.openhab.core.thing.profiles.StateProfile
133
+ # @see org.openhab.core.thing.profiles.TimeSeriesProfile
108
134
  #
109
135
  # @example Vetoing a command
110
136
  # profile(:veto_closing_shades) do |event, item:, command:|
@@ -7,6 +7,15 @@ module OpenHAB
7
7
  include org.openhab.core.persistence.ModifiablePersistenceService
8
8
  include Singleton
9
9
 
10
+ OPERATOR_TO_SYMBOL = {
11
+ EQ: :==,
12
+ NEQ: :!=,
13
+ GT: :>,
14
+ LT: :<,
15
+ GTE: :>=,
16
+ LTE: :<=
17
+ }.freeze
18
+
10
19
  class HistoricItem
11
20
  include org.openhab.core.persistence.HistoricItem
12
21
 
@@ -134,9 +143,7 @@ module OpenHAB
134
143
 
135
144
  range = first_index...last_index
136
145
 
137
- operator = filter.operator.symbol
138
- operator = "==" if operator == "="
139
-
146
+ operator = OPERATOR_TO_SYMBOL[filter.operator]
140
147
  block = lambda do |i|
141
148
  next if filter.state && !item_history[i].state.send(operator, filter.state)
142
149
 
@@ -21,7 +21,8 @@ module OpenHAB
21
21
  attr_accessor :main_thread
22
22
 
23
23
  def initialize
24
- super(1)
24
+ # Allocate a (hopefully) big enough pool size to accommodate scheduled tasks
25
+ super(10)
25
26
  end
26
27
 
27
28
  def submit(runnable)
@@ -37,6 +37,10 @@ module OpenHAB
37
37
  callback&.state_updated(channel_uid, command) if command.is_a?(Core::Types::State)
38
38
  end
39
39
 
40
+ def send_time_series(channel_uid, time_series)
41
+ @callback&.send_time_series(channel_uid, time_series)
42
+ end
43
+
40
44
  def set_callback(callback)
41
45
  @callback = callback
42
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openhab-scripting
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.16.0
4
+ version: 5.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian O'Connell
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-01-10 00:00:00.000000000 Z
13
+ date: 2024-03-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -258,6 +258,7 @@ files:
258
258
  - lib/openhab/core/events/item_state_changed_event.rb
259
259
  - lib/openhab/core/events/item_state_event.rb
260
260
  - lib/openhab/core/events/item_state_updated_event.rb
261
+ - lib/openhab/core/events/item_time_series_updated_event.rb
261
262
  - lib/openhab/core/events/thing_status_info_event.rb
262
263
  - lib/openhab/core/events/timer_event.rb
263
264
  - lib/openhab/core/items.rb
@@ -348,6 +349,7 @@ files:
348
349
  - lib/openhab/core/types/rewind_fastforward_type.rb
349
350
  - lib/openhab/core/types/stop_move_type.rb
350
351
  - lib/openhab/core/types/string_type.rb
352
+ - lib/openhab/core/types/time_series.rb
351
353
  - lib/openhab/core/types/type.rb
352
354
  - lib/openhab/core/types/un_def_type.rb
353
355
  - lib/openhab/core/types/up_down_type.rb
@@ -357,6 +359,7 @@ files:
357
359
  - lib/openhab/core_ext/ephemeris.rb
358
360
  - lib/openhab/core_ext/java/class.rb
359
361
  - lib/openhab/core_ext/java/duration.rb
362
+ - lib/openhab/core_ext/java/instant.rb
360
363
  - lib/openhab/core_ext/java/list.rb
361
364
  - lib/openhab/core_ext/java/local_date.rb
362
365
  - lib/openhab/core_ext/java/local_time.rb
@@ -482,7 +485,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
482
485
  - !ruby/object:Gem::Version
483
486
  version: '0'
484
487
  requirements: []
485
- rubygems_version: 3.5.4
488
+ rubygems_version: 3.5.6
486
489
  signing_key:
487
490
  specification_version: 4
488
491
  summary: JRuby Helper Libraries for openHAB Scripting