openhab-scripting 5.5.0 → 5.6.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.
@@ -230,9 +230,7 @@ module OpenHAB
230
230
  tags.compact.map do |tag|
231
231
  case tag
232
232
  when String then tag
233
- when Symbol then tag.to_s
234
- when old_semantics then tag.java_class.simple_name
235
- when semantics then tag.name
233
+ when Symbol, semantics, old_semantics then tag.to_s
236
234
  else raise ArgumentError, "`#{tag}` must be a subclass of Semantics::Tag, a `Symbol`, or a `String`."
237
235
  end
238
236
  end
@@ -260,6 +258,8 @@ module OpenHAB
260
258
  # @param tags [String, Symbol, Semantics::Tag, Array<String, Symbol, Semantics::Tag>, nil]
261
259
  # Fluent alias for `tag`.
262
260
  # @param autoupdate [true, false, nil] Autoupdate setting (see {ItemBuilder#autoupdate})
261
+ # @param thing [String, Core::Things::Thing, Core::Things::ThingUID, nil]
262
+ # A Thing to be used as the base for the channel
263
263
  # @param channel [String, Core::Things::ChannelUID, nil] Channel to link the item to
264
264
  # @param expire [String] An expiration specification.
265
265
  # @param alexa [String, Symbol, Array<(String, Hash<String, Object>)>, nil]
@@ -281,6 +281,7 @@ module OpenHAB
281
281
  tag: nil,
282
282
  tags: nil,
283
283
  autoupdate: nil,
284
+ thing: nil,
284
285
  channel: nil,
285
286
  expire: nil,
286
287
  alexa: nil,
@@ -310,6 +311,7 @@ module OpenHAB
310
311
  @metadata.merge!(metadata) if metadata
311
312
  @autoupdate = autoupdate
312
313
  @channels = []
314
+ @thing = thing
313
315
  @expire = nil
314
316
  if expire
315
317
  expire = Array(expire)
@@ -420,6 +422,7 @@ module OpenHAB
420
422
  # end
421
423
  #
422
424
  def channel(channel, config = {})
425
+ channel = "#{@thing}:#{channel}" if @thing && !channel.include?(":")
423
426
  @channels << [channel, config]
424
427
  end
425
428
 
@@ -569,7 +572,7 @@ module OpenHAB
569
572
  RUBY
570
573
  end
571
574
 
572
- FUNCTION_REGEX = /^([a-z]+)(?:\(([a-z]+)(?:,([a-z]+))*\))?/i.freeze
575
+ FUNCTION_REGEX = /^([a-z]+)(?:\((.*)\))?/i.freeze
573
576
  private_constant :FUNCTION_REGEX
574
577
 
575
578
  # The combiner function for this group
@@ -607,11 +610,13 @@ module OpenHAB
607
610
  def create_item
608
611
  base_item = super if type
609
612
  if function
613
+ require "csv"
614
+
610
615
  match = function.match(FUNCTION_REGEX)
611
616
 
612
617
  dto = org.openhab.core.items.dto.GroupFunctionDTO.new
613
618
  dto.name = match[1]
614
- dto.params = match[2..]
619
+ dto.params = CSV.parse_line(match[2]) if match[2]
615
620
  function = org.openhab.core.items.dto.ItemDTOMapper.map_function(base_item, dto)
616
621
  Core::Items::GroupItem.new(name, base_item, function)
617
622
  else
@@ -74,6 +74,10 @@ module OpenHAB
74
74
 
75
75
  # This method gets called in rspec's SuspendRules as well
76
76
  def execute!(mod, inputs)
77
+ # Store the context in a thread variable. It is accessed through DSL#method_missing
78
+ # which is triggered when the context variable is referenced inside the run block.
79
+ # It is added to @thread_locals so it is also available in #process_task below.
80
+ @thread_locals[:openhab_context] = extract_context(inputs)
77
81
  ThreadLocal.thread_local(**@thread_locals) do
78
82
  if logger.trace?
79
83
  logger.trace("Execute called with mod (#{mod&.to_string}) and inputs (#{inputs.inspect})")
@@ -84,10 +88,12 @@ module OpenHAB
84
88
  @debouncer.call { process_queue(create_queue(event), mod, event) }
85
89
  end
86
90
  rescue Exception => e
87
- raise if defined?(::RSpec) && ::RSpec.current_example.example_group.propagate_exceptions?
91
+ raise if defined?(::RSpec) && ::RSpec.current_example&.example_group&.propagate_exceptions?
88
92
 
89
93
  @run_context.send(:logger).log_exception(e)
90
94
  end
95
+ ensure
96
+ @thread_locals.delete(:openhab_context)
91
97
  end
92
98
 
93
99
  def cleanup
@@ -157,6 +163,24 @@ module OpenHAB
157
163
  struct_class.new(**inputs)
158
164
  end
159
165
 
166
+ #
167
+ # Converts inputs into context hash
168
+ # @return [Hash] Context hash.
169
+ #
170
+ def extract_context(inputs)
171
+ return unless inputs
172
+
173
+ inputs.reject { |key, _| key.include?(".") }
174
+ .to_h do |key, value|
175
+ [key.to_sym,
176
+ if value.is_a?(Item) && !value.is_a?(Core::Items::Proxy)
177
+ Core::Items::Proxy.new(value)
178
+ else
179
+ value
180
+ end]
181
+ end
182
+ end
183
+
160
184
  #
161
185
  # Get the trigger_id for the trigger that caused the rule creation
162
186
  #
@@ -230,7 +254,7 @@ module OpenHAB
230
254
  ThreadLocal.thread_local(**@thread_locals) do
231
255
  case task
232
256
  when BuilderDSL::Run then process_run_task(event, task)
233
- when BuilderDSL::Script then process_script_task(task)
257
+ when BuilderDSL::Script then process_script_task(event, task)
234
258
  when BuilderDSL::Trigger then process_trigger_task(event, task)
235
259
  when BuilderDSL::Otherwise then process_otherwise_task(event, task)
236
260
  end
@@ -294,9 +318,9 @@ module OpenHAB
294
318
  #
295
319
  # @param [Script] task to execute
296
320
  #
297
- def process_script_task(task)
298
- logger.trace { "Executing script '#{name}' run block" }
299
- @run_context.instance_exec(&task.block)
321
+ def process_script_task(event, task)
322
+ logger.trace { "Executing script '#{name}' run block with event(#{event})" }
323
+ @run_context.instance_exec(event, &task.block)
300
324
  end
301
325
 
302
326
  #
@@ -1112,7 +1112,6 @@ module OpenHAB
1112
1112
 
1113
1113
  raise ArgumentError, "Missing cron expression or elements" unless expression
1114
1114
 
1115
- add_tag("Schedule")
1116
1115
  cron = Cron.new(rule_triggers: @rule_triggers)
1117
1116
  cron.trigger(config: { "cronExpression" => expression }, attach: attach)
1118
1117
  end
@@ -1211,7 +1210,6 @@ module OpenHAB
1211
1210
  if value == :day && at.is_a?(Item)
1212
1211
  raise ArgumentError, "Attachments are not supported with dynamic datetime triggers" unless attach.nil?
1213
1212
 
1214
- add_tag("Schedule")
1215
1213
  return trigger("timer.DateTimeTrigger", itemName: at.name, timeOnly: true)
1216
1214
  end
1217
1215
 
@@ -1593,7 +1591,6 @@ module OpenHAB
1593
1591
  #
1594
1592
  def at(item)
1595
1593
  item = item.name if item.is_a?(Item)
1596
- add_tag("Schedule")
1597
1594
  trigger("timer.DateTimeTrigger", itemName: item.to_s)
1598
1595
  end
1599
1596
 
@@ -64,7 +64,7 @@ module OpenHAB
64
64
  org.openhab.core.automation.util.TriggerBuilder.create
65
65
  .with_id(uuid)
66
66
  .with_type_uid(type)
67
- .with_configuration(org.openhab.core.config.core.Configuration.new(config))
67
+ .with_configuration(Core::Configuration.new(config))
68
68
  .build
69
69
  end
70
70
 
@@ -12,7 +12,12 @@ module OpenHAB
12
12
  #
13
13
  class Cron < Trigger
14
14
  # Trigger ID for Cron Triggers
15
- CRON_TRIGGER_MODULE_ID = "jsr223.jruby.CronTrigger"
15
+ CRON_TRIGGER_MODULE_ID = if Gem::Version.new(OpenHAB::Core::VERSION) >= Gem::Version.new("4.0.0")
16
+ "timer.GenericCronTrigger"
17
+ else
18
+ # @deprecated OH3.4 We need to use a custom CronTrigger handler
19
+ "jsr223.jruby.CronTrigger"
20
+ end
16
21
 
17
22
  #
18
23
  # Returns a default map for cron expressions that fires every second
@@ -186,7 +191,10 @@ module OpenHAB
186
191
  #
187
192
  #
188
193
  def trigger(config:, attach:)
189
- CronHandler::CronTriggerHandlerFactory.instance # ensure it's registered
194
+ # @deprecated OH3.4 needs a custom CronTriggerHandlerFactory
195
+ if Gem::Version.new(OpenHAB::Core::VERSION) < Gem::Version.new("4.0.0")
196
+ CronHandler::CronTriggerHandlerFactory.instance # ensure it's registered
197
+ end
190
198
  append_trigger(type: CRON_TRIGGER_MODULE_ID, config: config, attach: attach)
191
199
  end
192
200
  end
@@ -1,115 +1,120 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "singleton"
4
-
5
- require_relative "cron"
6
-
7
- module OpenHAB
8
- module DSL
9
- module Rules
10
- module Triggers
11
- # @!visibility private
12
- #
13
- # Cron trigger handler that provides trigger ID
14
- #
15
- module CronHandler
16
- # Cron Trigger Handler that provides trigger IDs
17
- # Unfortunatly because the CronTriggerHandler in openHAB core is marked internal
18
- # the entire thing must be recreated here
19
- class CronTriggerHandler < org.openhab.core.automation.handler.BaseTriggerModuleHandler
20
- include org.openhab.core.scheduler.SchedulerRunnable
21
- include org.openhab.core.automation.handler.TimeBasedTriggerHandler
22
-
23
- # Provides access to protected fields
24
- field_accessor :callback
25
-
26
- # Creates a new CronTriggerHandler
27
- # @param [org.openhab.core.automation.Trigger] trigger openHAB trigger associated with handler
28
- #
29
- def initialize(trigger)
30
- @trigger = trigger
31
- @scheduler = OSGi.service("org.openhab.core.scheduler.CronScheduler")
32
- @schedule = nil
33
- @expression = trigger.configuration.get("cronExpression")
34
- super(trigger)
35
- end
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")
36
5
 
37
- #
38
- # Set the callback to execute when cron trigger fires
39
- # @param [Object] callback to run
40
- #
41
- def setCallback(callback) # rubocop:disable Naming/MethodName
42
- synchronized do
43
- super(callback)
44
- @schedule = @scheduler.schedule(self, @expression)
45
- logger.trace("Scheduled cron job '#{@expression}' for trigger '#{@trigger.id}'.")
46
- end
47
- end
6
+ require "singleton"
48
7
 
49
- #
50
- # Get the temporal adjuster
51
- # @return [CronAdjuster]
52
- #
53
- def getTemporalAdjuster # rubocop:disable Naming/MethodName
54
- org.openhab.core.scheduler.CronAdjuster.new(@expression)
55
- end
8
+ require_relative "cron"
56
9
 
57
- #
58
- # Execute the callback
59
- #
60
- def run
61
- callback&.triggered(@trigger, { "module" => @trigger.id })
62
- end
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
63
25
 
64
- #
65
- # Displose of the handler
66
- # cancel the cron scheduled task
67
- #
68
- def dispose
69
- synchronized do
70
- super
71
- return unless @schedule
26
+ # Provides access to protected fields
27
+ field_accessor :callback
72
28
 
73
- @schedule.cancel(true)
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")
74
35
  @schedule = nil
36
+ @expression = trigger.configuration.get("cronExpression")
37
+ super(trigger)
38
+ end
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
50
+ end
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)
75
58
  end
76
- logger.trace("cancelled job for trigger '#{@trigger.id}'.")
77
- end
78
- end
79
59
 
80
- # Implements the ScriptedTriggerHandlerFactory interface to create a new Cron Trigger Handler
81
- class CronTriggerHandlerFactory
82
- include Singleton
83
- include org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory
84
-
85
- def initialize
86
- Core.automation_manager.add_trigger_handler(
87
- Cron::CRON_TRIGGER_MODULE_ID,
88
- self
89
- )
90
-
91
- Core.automation_manager.add_trigger_type(org.openhab.core.automation.type.TriggerType.new(
92
- Cron::CRON_TRIGGER_MODULE_ID,
93
- nil,
94
- "A specific instant occurs",
95
- "Triggers when the specified instant occurs",
96
- nil,
97
- org.openhab.core.automation.Visibility::VISIBLE,
98
- nil
99
- ))
100
- logger.trace("Added script cron trigger handler")
60
+ #
61
+ # Execute the callback
62
+ #
63
+ def run
64
+ callback&.triggered(@trigger, { "module" => @trigger.id })
65
+ end
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
75
+
76
+ @schedule.cancel(true)
77
+ @schedule = nil
78
+ end
79
+ logger.trace("cancelled job for trigger '#{@trigger.id}'.")
80
+ end
101
81
  end
102
82
 
103
- # Invoked by openHAB core to get a trigger handler for the supplied trigger
104
- # @param [org.openhab.core.automation.Trigger] trigger
105
- #
106
- # @return [WatchTriggerHandler] trigger handler for supplied trigger
107
- def get(trigger)
108
- CronTriggerHandler.new(trigger)
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
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
109
113
  end
110
114
  end
111
115
  end
112
116
  end
113
117
  end
114
118
  end
119
+
115
120
  end
@@ -24,10 +24,10 @@ module OpenHAB
24
24
  # things.build do
25
25
  # thing("mqtt:topic:my-switch", "My Switch", bridge: "mqtt:bridge:mosquitto", config: thing_config) do
26
26
  # channel("switch1", "switch", config: {
27
- # stateTopic: "stat/my-switch/switch1/state", commandTopic="cmnd/my-switch/switch1/command"
27
+ # stateTopic: "stat/my-switch/switch1/state", commandTopic: "cmnd/my-switch/switch1/command"
28
28
  # })
29
29
  # channel("button1", "string", config: {
30
- # stateTopic: "stat/my-switch/button1/state", commandTopic="cmnd/my-switch/button1/command"
30
+ # stateTopic: "stat/my-switch/button1/state", commandTopic: "cmnd/my-switch/button1/command"
31
31
  # })
32
32
  # end
33
33
  # end
@@ -184,7 +184,7 @@ module OpenHAB
184
184
 
185
185
  # @!visibility private
186
186
  def build
187
- configuration = org.openhab.core.config.core.Configuration.new(config)
187
+ configuration = Core::Configuration.new(config)
188
188
  if thing_type
189
189
  self.class.thing_factory_helper.apply_default_configuration(
190
190
  configuration, thing_type,
@@ -280,7 +280,7 @@ module OpenHAB
280
280
  org.openhab.core.thing.binding.builder.ChannelBuilder.create(uid)
281
281
  .with_kind(kind)
282
282
  .with_type(type)
283
- .with_configuration(org.openhab.core.config.core.Configuration.new(config))
283
+ .with_configuration(Core::Configuration.new(config))
284
284
  .build
285
285
  end
286
286
 
@@ -11,6 +11,7 @@ module OpenHAB
11
11
 
12
12
  # Keys to persist
13
13
  KNOWN_KEYS = %i[
14
+ openhab_context
14
15
  openhab_ensure_states
15
16
  openhab_holiday_file
16
17
  openhab_persistence_service
@@ -89,7 +89,7 @@ module OpenHAB
89
89
  # @param [Object] id
90
90
  # @param [java.time.temporal.TemporalAmount, #to_zoned_date_time, Proc, nil] duration
91
91
  # When to reschedule the timer for. `nil` to retain its current interval.
92
- # @return [Timer, nil] the timer if it was rescheduled, otherwise `nil`
92
+ # @return [Core::Timer, nil] the timer if it was rescheduled, otherwise `nil`
93
93
  #
94
94
  def reschedule(id, duration = nil)
95
95
  @timers_by_id.compute_if_present(id) do |_key, timer|
@@ -105,10 +105,10 @@ module OpenHAB
105
105
  # state. The timer is created in a thread-safe manner.
106
106
  #
107
107
  # @param [Object] id
108
- # @yieldparam [Timer, nil] timer The existing timer with this id, if one exists.
109
- # @yieldreturn [Timer, nil] A new timer to associate with this id, the existing
108
+ # @yieldparam [Core::Timer, nil] timer The existing timer with this id, if one exists.
109
+ # @yieldreturn [Core::Timer, nil] A new timer to associate with this id, the existing
110
110
  # timer, or nil. If nil, any existing timer will be cancelled.
111
- # @return [Timer, nil]
111
+ # @return [Core::Timer, nil]
112
112
  #
113
113
  # @example Extend an existing timer, or schedule a new one
114
114
  # # This is technically the same functionality as just calling `after()` with an `id`,
@@ -4,6 +4,6 @@ module OpenHAB
4
4
  module DSL
5
5
  # Version of openHAB helper libraries
6
6
  # @return [String]
7
- VERSION = "5.5.0"
7
+ VERSION = "5.6.0"
8
8
  end
9
9
  end
data/lib/openhab/dsl.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "java"
4
4
  require "method_source"
5
+ require "ruby2_keywords"
5
6
 
6
7
  require "bundler/inline"
7
8
 
@@ -77,16 +78,16 @@ module OpenHAB
77
78
  # Defines a new profile that can be applied to item channel links.
78
79
  #
79
80
  # @param [String, Symbol] id The id for the profile.
80
- # @yield [event, command: nil, state: nil, link:, item:, channel_uid:, configuration:, context:]
81
+ # @yield [event, command: nil, state: nil, callback:, link:, item:, channel_uid:, configuration:, context:]
81
82
  # All keyword params are optional. Any that aren't defined won't be passed.
82
- # @yieldparam [Core::Things::ProfileCallback] callback
83
- # The callback to be used to customize the action taken.
84
83
  # @yieldparam [:command_from_item, :state_from_item, :command_from_handler, :state_from_handler] event
85
84
  # The event that needs to be processed.
86
85
  # @yieldparam [Command, nil] command
87
86
  # The command being sent for `:command_from_item` and `:command_from_handler` events.
88
87
  # @yieldparam [State, nil] state
89
88
  # The state being sent for `:state_from_item` and `:state_from_handler` events.
89
+ # @yieldparam [Core::Things::ProfileCallback] callback
90
+ # The callback to be used to customize the action taken.
90
91
  # @yieldparam [Core::Things::ItemChannelLink] link
91
92
  # The link between the item and the channel, including its configuration.
92
93
  # @yieldparam [Item] item The linked item.
@@ -115,7 +116,7 @@ module OpenHAB
115
116
  # # Rollershutter MyShade { channel="thing:rollershutter"[profile="ruby:veto_closing_shades"] }
116
117
  #
117
118
  # @example Overriding units from a binding
118
- # profile(:set_uom) do |event, configuration:, state:, command:|
119
+ # profile(:set_uom) do |event, callback:, configuration:, state:, command:|
119
120
  # unless configuration["unit"]
120
121
  # logger.warn("Unit configuration not provided for set_uom profile")
121
122
  # next true
@@ -970,6 +971,24 @@ module OpenHAB
970
971
 
971
972
  raise exception
972
973
  end
974
+
975
+ #
976
+ # Provide access to the script context / variables
977
+ # see OpenHAB::DSL::Rules::AutomationRule#execute!
978
+ #
979
+ # @!visibility private
980
+ ruby2_keywords def method_missing(method, *args)
981
+ return super unless args.empty? && !block_given?
982
+ return super unless (context = Thread.current[:openhab_context]) && context.key?(method)
983
+
984
+ logger.trace("DSL#method_missing found context variable: '#{method}'")
985
+ context[method]
986
+ end
987
+
988
+ # @!visibility private
989
+ def respond_to_missing?(method, include_private = false)
990
+ Thread.current[:openhab_context]&.key?(method) || super
991
+ end
973
992
  end
974
993
  end
975
994
 
@@ -574,7 +574,7 @@ module OpenHAB
574
574
  bundle.fragment?
575
575
  end
576
576
 
577
- def wait
577
+ def wait(timeout: 30)
578
578
  mutex = Mutex.new
579
579
  cond = ConditionVariable.new
580
580
  skip_wait = false
@@ -587,7 +587,7 @@ module OpenHAB
587
587
  end
588
588
  mutex.synchronize do
589
589
  yield continue
590
- cond.wait(mutex) unless skip_wait
590
+ cond.wait(mutex, timeout) unless skip_wait
591
591
  end
592
592
  end
593
593
 
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.5.0
4
+ version: 5.6.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: 2023-08-08 00:00:00.000000000 Z
13
+ date: 2023-09-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -394,10 +394,12 @@ files:
394
394
  - lib/openhab/core/actions/ping.rb
395
395
  - lib/openhab/core/actions/transformation.rb
396
396
  - lib/openhab/core/actions/voice.rb
397
+ - lib/openhab/core/configuration.rb
397
398
  - lib/openhab/core/dependency_tracking.rb
398
399
  - lib/openhab/core/dto.rb
399
400
  - lib/openhab/core/dto/item_channel_link.rb
400
401
  - lib/openhab/core/dto/thing.rb
402
+ - lib/openhab/core/emulate_hash.rb
401
403
  - lib/openhab/core/entity_lookup.rb
402
404
  - lib/openhab/core/events.rb
403
405
  - lib/openhab/core/events/abstract_event.rb
@@ -409,6 +411,7 @@ files:
409
411
  - lib/openhab/core/events/item_state_event.rb
410
412
  - lib/openhab/core/events/item_state_updated_event.rb
411
413
  - lib/openhab/core/events/thing_status_info_event.rb
414
+ - lib/openhab/core/events/timer_event.rb
412
415
  - lib/openhab/core/items.rb
413
416
  - lib/openhab/core/items/accepted_data_types.rb
414
417
  - lib/openhab/core/items/color_item.rb
@@ -416,6 +419,7 @@ files:
416
419
  - lib/openhab/core/items/date_time_item.rb
417
420
  - lib/openhab/core/items/dimmer_item.rb
418
421
  - lib/openhab/core/items/generic_item.rb
422
+ - lib/openhab/core/items/group_function.rb
419
423
  - lib/openhab/core/items/group_item.rb
420
424
  - lib/openhab/core/items/image_item.rb
421
425
  - lib/openhab/core/items/item.rb