openhab-scripting 5.5.0 → 5.6.1

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab/core/actions/audio.rb +5 -2
  3. data/lib/openhab/core/configuration.rb +70 -0
  4. data/lib/openhab/core/emulate_hash.rb +241 -0
  5. data/lib/openhab/core/events/abstract_event.rb +11 -0
  6. data/lib/openhab/core/events/timer_event.rb +48 -0
  7. data/lib/openhab/core/items/group_function.rb +37 -0
  8. data/lib/openhab/core/items/group_item.rb +10 -4
  9. data/lib/openhab/core/items/item.rb +31 -0
  10. data/lib/openhab/core/items/metadata/hash.rb +9 -179
  11. data/lib/openhab/core/items/metadata/namespace_hash.rb +38 -141
  12. data/lib/openhab/core/items/semantics/semantic_tag.rb +5 -0
  13. data/lib/openhab/core/items/semantics/tag_class_methods.rb +9 -0
  14. data/lib/openhab/core/items/semantics.rb +7 -3
  15. data/lib/openhab/core/rules/rule.rb +17 -4
  16. data/lib/openhab/core/things/links/provider.rb +1 -1
  17. data/lib/openhab/core/things/proxy.rb +2 -1
  18. data/lib/openhab/core/things/thing.rb +23 -0
  19. data/lib/openhab/core/types/date_time_type.rb +2 -1
  20. data/lib/openhab/core/types/open_closed_type.rb +2 -1
  21. data/lib/openhab/core/types/string_type.rb +1 -1
  22. data/lib/openhab/core/types/up_down_type.rb +2 -1
  23. data/lib/openhab/core/value_cache.rb +6 -5
  24. data/lib/openhab/core_ext/java/duration.rb +2 -1
  25. data/lib/openhab/core_ext/java/local_time.rb +8 -6
  26. data/lib/openhab/core_ext/java/month_day.rb +2 -1
  27. data/lib/openhab/core_ext/java/period.rb +1 -1
  28. data/lib/openhab/core_ext/ruby/numeric.rb +1 -0
  29. data/lib/openhab/dsl/items/builder.rb +13 -6
  30. data/lib/openhab/dsl/rules/automation_rule.rb +29 -5
  31. data/lib/openhab/dsl/rules/builder.rb +47 -22
  32. data/lib/openhab/dsl/rules/rule_triggers.rb +1 -1
  33. data/lib/openhab/dsl/rules/triggers/conditions/generic.rb +1 -1
  34. data/lib/openhab/dsl/rules/triggers/cron/cron.rb +43 -16
  35. data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +101 -96
  36. data/lib/openhab/dsl/things/builder.rb +8 -6
  37. data/lib/openhab/dsl/thread_local.rb +1 -0
  38. data/lib/openhab/dsl/timer_manager.rb +4 -4
  39. data/lib/openhab/dsl/version.rb +1 -1
  40. data/lib/openhab/dsl.rb +23 -4
  41. data/lib/openhab/osgi.rb +1 -1
  42. data/lib/openhab/rspec/karaf.rb +7 -4
  43. data/lib/openhab/rspec/openhab/core/actions.rb +0 -3
  44. metadata +13 -23
@@ -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,10 +184,11 @@ 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
- configuration, thing_type,
190
+ configuration,
191
+ thing_type,
191
192
  self.class.config_description_registry
192
193
  )
193
194
  end
@@ -200,7 +201,8 @@ module OpenHAB
200
201
 
201
202
  if thing_type
202
203
  # can't use with_channels, or it will wipe out custom channels from above
203
- self.class.thing_factory_helper.create_channels(thing_type, uid,
204
+ self.class.thing_factory_helper.create_channels(thing_type,
205
+ uid,
204
206
  self.class.config_description_registry).each do |channel|
205
207
  builder.with_channel(channel)
206
208
  end
@@ -280,7 +282,7 @@ module OpenHAB
280
282
  org.openhab.core.thing.binding.builder.ChannelBuilder.create(uid)
281
283
  .with_kind(kind)
282
284
  .with_type(type)
283
- .with_configuration(org.openhab.core.config.core.Configuration.new(config))
285
+ .with_configuration(Core::Configuration.new(config))
284
286
  .build
285
287
  end
286
288
 
@@ -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.1"
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
 
data/lib/openhab/osgi.rb CHANGED
@@ -46,7 +46,7 @@ module OpenHAB
46
46
 
47
47
  bundle = org.osgi.framework.FrameworkUtil.get_bundle(interfaces.first.java_class)
48
48
  bundle.bundle_context.register_service(
49
- interfaces.map(&:java_class).map(&:name).to_java(java.lang.String),
49
+ interfaces.map { |i| i.java_class.name }.to_java(java.lang.String),
50
50
  instance,
51
51
  java.util.Hashtable.new(properties)
52
52
  )
@@ -154,7 +154,9 @@ module OpenHAB
154
154
  klass.field_accessor :classLoader, :activatorManager
155
155
  klass.field_writer :framework
156
156
  klass.field_reader :LOG
157
- org.apache.karaf.main.ConfigProperties.field_reader :props, :defaultBundleStartlevel, :karafEtc,
157
+ org.apache.karaf.main.ConfigProperties.field_reader :props,
158
+ :defaultBundleStartlevel,
159
+ :karafEtc,
158
160
  :defaultStartLevel
159
161
  klass.class_eval do
160
162
  def send_private(method_name, *args)
@@ -472,7 +474,8 @@ module OpenHAB
472
474
  thf = Mocks::ThingHandlerFactory.instance
473
475
  bundle = org.osgi.framework.FrameworkUtil.get_bundle(org.openhab.core.thing.Thing.java_class)
474
476
  Mocks::BundleResolver.instance.register_class(thf.class, bundle)
475
- bundle.bundle_context.register_service(org.openhab.core.thing.binding.ThingHandlerFactory.java_class, thf,
477
+ bundle.bundle_context.register_service(org.openhab.core.thing.binding.ThingHandlerFactory.java_class,
478
+ thf,
476
479
  nil)
477
480
  end
478
481
  end
@@ -574,7 +577,7 @@ module OpenHAB
574
577
  bundle.fragment?
575
578
  end
576
579
 
577
- def wait
580
+ def wait(timeout: 30)
578
581
  mutex = Mutex.new
579
582
  cond = ConditionVariable.new
580
583
  skip_wait = false
@@ -587,7 +590,7 @@ module OpenHAB
587
590
  end
588
591
  mutex.synchronize do
589
592
  yield continue
590
- cond.wait(mutex) unless skip_wait
593
+ cond.wait(mutex, timeout) unless skip_wait
591
594
  end
592
595
  end
593
596
 
@@ -3,7 +3,6 @@
3
3
  module OpenHAB
4
4
  module Core
5
5
  module Actions
6
- # rubocop:disable Lint/UnusedMethodArgument
7
6
  # redefine these to do nothing so that rules won't fail
8
7
 
9
8
  module_function
@@ -31,8 +30,6 @@ module OpenHAB
31
30
  end
32
31
  end
33
32
  end
34
-
35
- # rubocop:enable Lint/UnusedMethodArgument
36
33
  end
37
34
  end
38
35
  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.5.0
4
+ version: 5.6.1
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-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -214,14 +214,14 @@ dependencies:
214
214
  requirements:
215
215
  - - "~>"
216
216
  - !ruby/object:Gem::Version
217
- version: 1.13.9
217
+ version: '1.13'
218
218
  type: :development
219
219
  prerelease: false
220
220
  version_requirements: !ruby/object:Gem::Requirement
221
221
  requirements:
222
222
  - - "~>"
223
223
  - !ruby/object:Gem::Version
224
- version: 1.13.9
224
+ version: '1.13'
225
225
  - !ruby/object:Gem::Dependency
226
226
  name: persistent_httparty
227
227
  requirement: !ruby/object:Gem::Requirement
@@ -279,33 +279,19 @@ dependencies:
279
279
  - !ruby/object:Gem::Version
280
280
  version: '3.11'
281
281
  - !ruby/object:Gem::Dependency
282
- name: rubocop
282
+ name: rubocop-inst
283
283
  requirement: !ruby/object:Gem::Requirement
284
284
  requirements:
285
- - - "~>"
285
+ - - ">="
286
286
  - !ruby/object:Gem::Version
287
- version: '1.8'
287
+ version: '0'
288
288
  type: :development
289
289
  prerelease: false
290
290
  version_requirements: !ruby/object:Gem::Requirement
291
291
  requirements:
292
- - - "~>"
293
- - !ruby/object:Gem::Version
294
- version: '1.8'
295
- - !ruby/object:Gem::Dependency
296
- name: rubocop-performance
297
- requirement: !ruby/object:Gem::Requirement
298
- requirements:
299
- - - "~>"
300
- - !ruby/object:Gem::Version
301
- version: '1.11'
302
- type: :development
303
- prerelease: false
304
- version_requirements: !ruby/object:Gem::Requirement
305
- requirements:
306
- - - "~>"
292
+ - - ">="
307
293
  - !ruby/object:Gem::Version
308
- version: '1.11'
294
+ version: '0'
309
295
  - !ruby/object:Gem::Dependency
310
296
  name: rubocop-rake
311
297
  requirement: !ruby/object:Gem::Requirement
@@ -394,10 +380,12 @@ files:
394
380
  - lib/openhab/core/actions/ping.rb
395
381
  - lib/openhab/core/actions/transformation.rb
396
382
  - lib/openhab/core/actions/voice.rb
383
+ - lib/openhab/core/configuration.rb
397
384
  - lib/openhab/core/dependency_tracking.rb
398
385
  - lib/openhab/core/dto.rb
399
386
  - lib/openhab/core/dto/item_channel_link.rb
400
387
  - lib/openhab/core/dto/thing.rb
388
+ - lib/openhab/core/emulate_hash.rb
401
389
  - lib/openhab/core/entity_lookup.rb
402
390
  - lib/openhab/core/events.rb
403
391
  - lib/openhab/core/events/abstract_event.rb
@@ -409,6 +397,7 @@ files:
409
397
  - lib/openhab/core/events/item_state_event.rb
410
398
  - lib/openhab/core/events/item_state_updated_event.rb
411
399
  - lib/openhab/core/events/thing_status_info_event.rb
400
+ - lib/openhab/core/events/timer_event.rb
412
401
  - lib/openhab/core/items.rb
413
402
  - lib/openhab/core/items/accepted_data_types.rb
414
403
  - lib/openhab/core/items/color_item.rb
@@ -416,6 +405,7 @@ files:
416
405
  - lib/openhab/core/items/date_time_item.rb
417
406
  - lib/openhab/core/items/dimmer_item.rb
418
407
  - lib/openhab/core/items/generic_item.rb
408
+ - lib/openhab/core/items/group_function.rb
419
409
  - lib/openhab/core/items/group_item.rb
420
410
  - lib/openhab/core/items/image_item.rb
421
411
  - lib/openhab/core/items/item.rb