openhab-scripting 5.16.0 → 5.18.0

Sign up to get free protection for your applications and to get access to all the features.
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