openhab-scripting 5.5.0 → 5.6.1

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