openhab-jrubyscripting 5.0.0.rc1 → 5.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab/core/entity_lookup.rb +1 -12
  3. data/lib/openhab/core/items/generic_item.rb +15 -7
  4. data/lib/openhab/core/items/metadata/hash.rb +81 -39
  5. data/lib/openhab/core/items/metadata/namespace_hash.rb +17 -19
  6. data/lib/openhab/core/items/metadata/provider.rb +48 -0
  7. data/lib/openhab/core/items/persistence.rb +2 -0
  8. data/lib/openhab/core/items/provider.rb +40 -0
  9. data/lib/openhab/core/items/proxy.rb +10 -0
  10. data/lib/openhab/core/items/registry.rb +16 -7
  11. data/lib/openhab/core/items/semantics/enumerable.rb +6 -4
  12. data/lib/openhab/core/items/state_storage.rb +3 -3
  13. data/lib/openhab/core/profile_factory.rb +3 -1
  14. data/lib/openhab/core/provider.rb +223 -0
  15. data/lib/openhab/core/registry.rb +30 -0
  16. data/lib/openhab/core/rules/provider.rb +25 -0
  17. data/lib/openhab/core/rules/registry.rb +76 -0
  18. data/lib/openhab/core/rules/rule.rb +150 -0
  19. data/lib/openhab/core/rules.rb +25 -0
  20. data/lib/openhab/core/script_handling.rb +50 -0
  21. data/lib/openhab/core/things/links/provider.rb +40 -0
  22. data/lib/openhab/core/things/provider.rb +25 -0
  23. data/lib/openhab/core/things/proxy.rb +10 -0
  24. data/lib/openhab/core/things/registry.rb +25 -2
  25. data/lib/openhab/core/timer.rb +17 -7
  26. data/lib/openhab/core/types/quantity_type.rb +5 -2
  27. data/lib/openhab/core/types.rb +1 -1
  28. data/lib/openhab/core.rb +3 -30
  29. data/lib/openhab/core_ext/java/class.rb +34 -0
  30. data/lib/openhab/core_ext/java/list.rb +436 -0
  31. data/lib/openhab/core_ext/java/local_time.rb +2 -1
  32. data/lib/openhab/core_ext/java/map.rb +66 -0
  33. data/lib/openhab/core_ext/java/month.rb +2 -1
  34. data/lib/openhab/core_ext/java/zoned_date_time.rb +1 -2
  35. data/lib/openhab/core_ext/ruby/date.rb +2 -0
  36. data/lib/openhab/core_ext/ruby/date_time.rb +53 -0
  37. data/lib/openhab/core_ext/ruby/time.rb +88 -86
  38. data/lib/openhab/dsl/events/watch_event.rb +1 -1
  39. data/lib/openhab/dsl/items/builder.rb +38 -100
  40. data/lib/openhab/dsl/items/ensure.rb +6 -2
  41. data/lib/openhab/dsl/items/timed_command.rb +10 -11
  42. data/lib/openhab/dsl/rules/automation_rule.rb +36 -13
  43. data/lib/openhab/dsl/rules/builder.rb +126 -8
  44. data/lib/openhab/dsl/rules/name_inference.rb +0 -5
  45. data/lib/openhab/dsl/rules/terse.rb +1 -2
  46. data/lib/openhab/dsl/rules/triggers/changed.rb +7 -4
  47. data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +17 -53
  48. data/lib/openhab/dsl/rules/triggers/conditions/proc.rb +0 -3
  49. data/lib/openhab/dsl/rules/triggers/cron/cron.rb +1 -1
  50. data/lib/openhab/dsl/rules/triggers/trigger.rb +1 -1
  51. data/lib/openhab/dsl/rules/triggers/updated.rb +7 -3
  52. data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +1 -1
  53. data/lib/openhab/dsl/rules.rb +0 -21
  54. data/lib/openhab/dsl/script_handling.rb +0 -49
  55. data/lib/openhab/dsl/things/builder.rb +8 -31
  56. data/lib/openhab/dsl/thread_local.rb +3 -2
  57. data/lib/openhab/dsl/timer_manager.rb +16 -8
  58. data/lib/openhab/dsl/version.rb +1 -1
  59. data/lib/openhab/dsl.rb +137 -120
  60. data/lib/openhab/log.rb +3 -3
  61. data/lib/openhab/rspec/example_group.rb +42 -0
  62. data/lib/openhab/rspec/helpers.rb +33 -27
  63. data/lib/openhab/rspec/hooks.rb +17 -23
  64. data/lib/openhab/rspec/karaf.rb +45 -27
  65. data/lib/openhab/rspec/mocks/synchronous_executor.rb +11 -4
  66. data/lib/openhab/rspec/mocks/timer.rb +7 -1
  67. data/lib/openhab/rspec/suspend_rules.rb +4 -2
  68. metadata +30 -3
  69. data/lib/openhab/rspec/mocks/metadata_provider.rb +0 -75
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+
5
+ module OpenHAB
6
+ module Core
7
+ # @interface
8
+ java_import org.openhab.core.common.registry.ManagedProvider
9
+
10
+ # @!visibility private
11
+ module ManagedProvider
12
+ # Maps actual element types to the symbol used in Thread.local[:openhab_providers]
13
+ TYPE_TO_PROVIDER_TYPE = {
14
+ org.openhab.core.items.Item.java_class => :items,
15
+ org.openhab.core.items.Metadata.java_class => :metadata,
16
+ org.openhab.core.automation.Rule.java_class => :rules,
17
+ org.openhab.core.thing.Thing.java_class => :things,
18
+ org.openhab.core.thing.link.ItemChannelLink.java_class => :links
19
+ }.freeze
20
+ private_constant :TYPE_TO_PROVIDER_TYPE
21
+
22
+ # @return [Symbol, nil]
23
+ def type
24
+ java_class.generic_ancestors.each do |klass|
25
+ next unless klass.respond_to?(:raw_type)
26
+ next unless klass.raw_type == org.openhab.core.common.registry.Provider.java_class
27
+
28
+ type_arg = klass.actual_type_arguments.first
29
+ next unless type_arg.is_a?(java.lang.Class)
30
+ next unless klass.actual_type_arguments.first.is_a?(java.lang.Class)
31
+
32
+ return TYPE_TO_PROVIDER_TYPE[type_arg]
33
+ end
34
+ nil
35
+ end
36
+ end
37
+
38
+ # @abstract
39
+ class Provider < org.openhab.core.common.registry.AbstractProvider
40
+ include org.openhab.core.common.registry.ManagedProvider
41
+ include Enumerable
42
+ include Singleton
43
+ public_class_method :new
44
+
45
+ # Known supported provider types
46
+ # @return [Array<Symbol>]
47
+ KNOWN_TYPES = %i[items metadata things links].freeze
48
+
49
+ class << self
50
+ #
51
+ # Determines the current provider that should be used to create elements belonging to this registry.
52
+ #
53
+ # @param [org.openhab.core.common.registry.Provider, Proc, :persistent, :transient, nil] preferred_provider
54
+ # An optional preferred provider to use. Can be one of several types:
55
+ # * An explicit instance of {org.openhab.core.common.registry.ManagedProvider ManagedProvider}
56
+ # * A Proc, which can calculate the preferred provider based on whatever conditions it wants,
57
+ # and then is further processed as this parameter.
58
+ # * `:persistent`, meaning the default {org.openhab.core.common.registry.ManagedProvider ManagedProvider}
59
+ # for this registry. Managed providers persist their objects to JSON, and will survive after the
60
+ # Ruby script is unloaded. This is where objects you configure with MainUI are stored. You should
61
+ # use this provider when you're creating something in response to a one-time event.
62
+ # * `:transient`, meaning a {org.openhab.core.common.registry.ManagedProvider ManagedProvider} that
63
+ # will remove all of its contents when the Ruby script is unloaded. You should use this if you're
64
+ # generating objects dynamically, either based on some sort of other configuration, or simply
65
+ # hard coded and you're using Ruby as a more expressive way to define things than a `.items` or
66
+ # `.things` file. If you _don't_ use this provider for something such as metadata, then you
67
+ # may have issues such as metadata still showing up even though you're no longer creating items
68
+ # with it anymore.
69
+ # * `nil`, meaning to fall back to the current thread setting. See {OpenHAB::DSL.provider}.
70
+ # If there is no thread setting (or the thread setting was Proc that returned `nil`),
71
+ # it defaults to `:transient`.
72
+ # @return [org.openhab.core.common.registry.Provider]
73
+ #
74
+ def current(preferred_provider = nil, element = nil)
75
+ preferred_provider ||= Thread.current[:openhab_providers]&.[](type)
76
+ if preferred_provider.is_a?(Proc)
77
+ preferred_provider = if preferred_provider.arity.zero? || element.nil?
78
+ preferred_provider.call
79
+ else
80
+ preferred_provider.call(element)
81
+ end
82
+ end
83
+
84
+ case preferred_provider
85
+ when nil, :transient
86
+ instance
87
+ when :persistent
88
+ registry.managed_provider.get
89
+ when org.openhab.core.common.registry.ManagedProvider
90
+ preferred_provider
91
+ else
92
+ raise ArgumentError, "#{preferred_provider.inspect} is not a ManagedProvider"
93
+ end
94
+ end
95
+
96
+ # @abstract
97
+ # @!attribute [r] registry
98
+ #
99
+ # The registry that this provider provides elements for.
100
+ #
101
+ # @return [org.openhab.core.common.registry.Registry]
102
+ #
103
+ def registry
104
+ raise NotImplementedError
105
+ end
106
+
107
+ #
108
+ # Creates a new instance of a provider, registers it, sets it as the
109
+ # default for the thread, calls the block, and then unregisters it.
110
+ #
111
+ # @param [true, false] thread_provider Set this new provider as the default for the thread
112
+ # @yieldparam [Provider] provider The provider
113
+ # @return [Object] The result of the block
114
+ #
115
+ # @!visibility private
116
+ def new(thread_provider: true)
117
+ unless @singleton__instance__.nil? || block_given?
118
+ raise NoMethodError,
119
+ "private method `new' called for #{self}:Class"
120
+ end
121
+
122
+ r = provider = super()
123
+ if block_given?
124
+ if thread_provider
125
+ DSL.provider(provider) do
126
+ r = yield provider
127
+ end
128
+ else
129
+ r = yield provider
130
+ end
131
+ provider.unregister
132
+ end
133
+ r
134
+ end
135
+
136
+ # @!attribute [r] type
137
+ # @!visibility private
138
+ # @return [Symbol]
139
+ #
140
+ def type
141
+ name.split("::")[-2].downcase.to_sym
142
+ end
143
+ end
144
+
145
+ # @!visibility private
146
+ def each(&block)
147
+ @elements.each_value(&block)
148
+ end
149
+
150
+ # @return [String]
151
+ def inspect
152
+ "#<#{self.class.name}:#{object_id}>"
153
+ end
154
+
155
+ # @!visibility private
156
+ def add(element)
157
+ @elements[element.uid] = element
158
+ notify_listeners_about_added_element(element)
159
+ element
160
+ end
161
+
162
+ #
163
+ # Get an element from this provider
164
+ #
165
+ # @param [Object] key The proper key type for the elements in this provider.
166
+ # @return [Object]
167
+ #
168
+ def [](key)
169
+ @elements[key]
170
+ end
171
+ alias_method :get, :[]
172
+
173
+ #
174
+ # Get all elements in this provider
175
+ #
176
+ # @return [Array<Object>]
177
+ #
178
+ def all
179
+ @elements.values
180
+ end
181
+ alias_method :getAll, :all
182
+
183
+ #
184
+ # Remove an element from this provider
185
+ #
186
+ # @return [Object, nil] the removed element
187
+ #
188
+ # @!visibility private
189
+ #
190
+ def remove(key)
191
+ @elements.delete(key)&.tap do |element|
192
+ notify_listeners_about_removed_element(element)
193
+ end
194
+ end
195
+
196
+ # @return [Object, nil] the previous version of the element
197
+ # @!visibility private
198
+ #
199
+ def update(element)
200
+ old_element = @elements[element.uid]
201
+ if old_element
202
+ @elements[element.uid] = element
203
+ notify_listeners_about_updated_element(old_element, element)
204
+ end
205
+ old_element
206
+ end
207
+
208
+ # @!visibility private
209
+ def unregister
210
+ self.class.registry.remove_provider(self)
211
+ end
212
+
213
+ private
214
+
215
+ def initialize
216
+ super
217
+ @elements = {}
218
+ self.class.registry.add_provider(self)
219
+ ScriptHandling.script_unloaded { unregister }
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ Registry = org.openhab.core.common.registry.AbstractRegistry
6
+
7
+ Registry.field_reader :elementToProvider, :elementReadLock, :identifierToElement
8
+
9
+ # @abstract
10
+ #
11
+ # The base class for all registries in openHAB.
12
+ #
13
+ class Registry
14
+ #
15
+ # Determines which provider an element is associated with.
16
+ #
17
+ # @param [Object] key
18
+ # @return [org.openhab.core.common.registry.Provider]
19
+ #
20
+ def provider_for(key)
21
+ elementReadLock.lock
22
+ return nil unless (element = identifierToElement[key])
23
+
24
+ elementToProvider[element]
25
+ ensure
26
+ elementReadLock.unlock
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ module Rules
6
+ #
7
+ # Provides rules created in Ruby to openHAB
8
+ #
9
+ class Provider < Core::Provider
10
+ include org.openhab.core.automation.RuleProvider
11
+
12
+ class << self
13
+ #
14
+ # The Rule registry
15
+ #
16
+ # @return [org.openhab.core.automation.RuleRegistry]
17
+ #
18
+ def registry
19
+ $rules
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+
5
+ module OpenHAB
6
+ module Core
7
+ module Rules
8
+ #
9
+ # Provides access to all OpenHAB {Rule rules}, and acts like an array.
10
+ #
11
+ class Registry
12
+ include LazyArray
13
+ include Singleton
14
+
15
+ #
16
+ # Gets a specific Rule
17
+ #
18
+ # @param [String] uid Rule UID
19
+ # @return [Rule, nil]
20
+ #
21
+ def [](uid)
22
+ $rules.get(uid)
23
+ end
24
+ alias_method :include?, :[]
25
+ alias_method :key?, :[]
26
+ # @deprecated
27
+ alias_method :has_key?, :[]
28
+
29
+ #
30
+ # Explicit conversion to array
31
+ #
32
+ # @return [Array<Rule>]
33
+ #
34
+ def to_a
35
+ $rules.all.to_a
36
+ end
37
+
38
+ #
39
+ # Enter the Rule Builder DSL.
40
+ # @param (see Core::Provider.current)
41
+ # @yield Block executed in the context of a {DSL::Rules::Builder}.
42
+ # @return [Object] The result of the block.
43
+ #
44
+ def build(preferred_provider = nil, &block)
45
+ DSL::Rules::Builder.new(preferred_provider).instance_eval(&block)
46
+ end
47
+
48
+ #
49
+ # Remove a Rule.
50
+ #
51
+ # The rule must be a managed thing (typically created by Ruby or in the UI).
52
+ #
53
+ # @param [String, Rule] rule_uid
54
+ # @return [Rule, nil] The removed rule, if found.
55
+ #
56
+ # @example
57
+ # my_rule = rule do
58
+ # every :day
59
+ # run { nil }
60
+ # end
61
+ #
62
+ # rules.remove(my_rule)
63
+ #
64
+ def remove(rule_uid)
65
+ rule_uid = rule_uid.uid if rule_uid.is_a?(Rule)
66
+ provider = Provider.registry.provider_for(rule_uid)
67
+ unless provider.is_a?(org.openhab.core.common.registry.ManagedProvider)
68
+ raise "Cannot remove rule #{rule_uid} from non-managed provider #{provider.inspect}"
69
+ end
70
+
71
+ provider.remove(rule_uid)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ module Rules
6
+ # @interface
7
+ java_import org.openhab.core.automation.Rule
8
+
9
+ #
10
+ # A {Rule} is a chunk of code that can execute when certain conditions are
11
+ # met, enabling the core dynamic functionality of openHAB.
12
+ #
13
+ module Rule
14
+ #
15
+ # @!method visible?
16
+ # Check if visibility == `VISIBLE`
17
+ # @return [true,false]
18
+ #
19
+
20
+ #
21
+ # @!method hidden?
22
+ # Check if visibility == `HIDDEN`
23
+ # @return [true,false]
24
+ #
25
+
26
+ #
27
+ # @!method expert?
28
+ # Check if visibility == `EXPERT`
29
+ # @return [true,false]
30
+ #
31
+
32
+ #
33
+ # @!method initializing?
34
+ # Check if rule status == `INITIALIZING`
35
+ # @return [true,false]
36
+ #
37
+ #
38
+ # @!method idle?
39
+ # Check if rule status == `IDLE`
40
+ # @return [true,false]
41
+ #
42
+ #
43
+ # @!method running?
44
+ # Check if rule status == `RUNNING`
45
+ # @return [true,false]
46
+ #
47
+
48
+ Visibility.constants.each do |visibility|
49
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
50
+ def #{visibility.to_s.downcase}? # def visibile?
51
+ visibility == Visibility::#{visibility} # visibility == Visibility::VISIBLE
52
+ end # end
53
+ RUBY
54
+ end
55
+
56
+ RuleStatus.constants.each do |status|
57
+ next if status == :UNINITIALIZED
58
+
59
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
60
+ def #{status.to_s.downcase}? # def initializing?
61
+ status == RuleStatus::#{status} # status == RuleStatus::INITIALIZING
62
+ end # end
63
+ RUBY
64
+ end
65
+
66
+ #
67
+ # Check if rule status == `UNINITIALIZED`
68
+ #
69
+ # @return [true,false]
70
+ #
71
+ def uninitialized?
72
+ s = status
73
+ s.nil? || s == RuleStatus::UNINITIALIZED
74
+ end
75
+
76
+ #
77
+ # Enable the Rule
78
+ #
79
+ # @param [true, false] enabled
80
+ # @return [void]
81
+ #
82
+ def enable(enabled: true)
83
+ Rules.manager.set_enabled(uid, enabled)
84
+ end
85
+
86
+ #
87
+ # Disable the Rule
88
+ #
89
+ # @return [void]
90
+ #
91
+ def disable
92
+ enable(enabled: false)
93
+ end
94
+
95
+ #
96
+ # Check if the rule's status detail == `DISABLED`
97
+ #
98
+ # @return [true, false]
99
+ #
100
+ def disabled?
101
+ info = status_info
102
+ info.nil? || info.status_detail == RuleStatusDetail::DISABLED
103
+ end
104
+
105
+ #
106
+ # @!attribute [r] status
107
+ # @return [RuleStatus nil]
108
+ #
109
+ def status
110
+ Rules.manager.get_status(uid)
111
+ end
112
+
113
+ #
114
+ # @!attribute [r] status_info
115
+ # @return [RuleStatusInfo, nil]
116
+ #
117
+ def status_info
118
+ Rules.manager.get_status_info(uid)
119
+ end
120
+
121
+ # @return [String]
122
+ def inspect
123
+ r = "#<OpenHAB::Core::Rules::Rule #{uid}"
124
+ r += " #{name.inspect}" if name
125
+ r += " #{visibility}" unless visible?
126
+ r += " #{status || "<detached>"}"
127
+ r += " (#{status_info.status_detail})" if status_info && status_info.status_detail != RuleStatusDetail::NONE
128
+ r += " tags=#{tags.to_a.inspect}" unless tags.empty?
129
+ r += " configuration=#{configuration.properties.to_h}" if configuration && !configuration.properties.empty?
130
+ "#{r}>"
131
+ end
132
+
133
+ # @return [String]
134
+ def to_s
135
+ uid
136
+ end
137
+
138
+ #
139
+ # Manually trigger the rule
140
+ #
141
+ # @param [Object, nil] event The event to pass to the rule's execution blocks.
142
+ # @return [void]
143
+ #
144
+ def trigger(event = nil)
145
+ Rules.manager.run_now(uid, false, { "event" => event })
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ #
6
+ # Contains the core {Rule} as well as related infrastructure.
7
+ #
8
+ module Rules
9
+ java_import org.openhab.core.automation.RuleStatus,
10
+ org.openhab.core.automation.RuleStatusInfo,
11
+ org.openhab.core.automation.RuleStatusDetail,
12
+ org.openhab.core.automation.Visibility
13
+
14
+ class << self
15
+ #
16
+ # @!attribute [r] rule_manager
17
+ # @return [org.openhab.core.automation.RuleManager] The OpenHAB rule manager/engine
18
+ #
19
+ def manager
20
+ @manager ||= OSGi.service("org.openhab.core.automation.RuleManager")
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -2,6 +2,56 @@
2
2
 
3
3
  module OpenHAB
4
4
  module Core
5
+ #
6
+ # Provide callback mechanisms for script handling
7
+ #
8
+ module ScriptHandling
9
+ module_function
10
+
11
+ #
12
+ # Add a block of code to be executed once the rule script has finished loading.
13
+ #
14
+ # This can occur on OpenHAB start up, when the script is first created, or updated.
15
+ #
16
+ # Multiple hooks can be added by calling {#script_loaded} multiple times.
17
+ # They can be used to perform final initializations.
18
+ #
19
+ # @return [void]
20
+ #
21
+ # @example
22
+ # script_loaded do
23
+ # logger.info 'Hi, this script has just finished loading'
24
+ # end
25
+ #
26
+ # @example
27
+ # script_loaded do
28
+ # logger.info 'I will be called after the script finished loading too'
29
+ # end
30
+ #
31
+ def script_loaded(&block)
32
+ Core::ScriptHandlingCallbacks.script_loaded_hooks << block
33
+ end
34
+
35
+ #
36
+ # Add a block of code to be executed when the script is unloaded.
37
+ #
38
+ # This can occur when OpenHAB shuts down, or when the script is being reloaded.
39
+ #
40
+ # Multiple hooks can be added by calling {#script_unloaded} multiple times.
41
+ # They can be used to perform final cleanup.
42
+ #
43
+ # @return [void]
44
+ #
45
+ # @example
46
+ # script_unloaded do
47
+ # logger.info 'Hi, this script has been unloaded'
48
+ # end
49
+ #
50
+ def script_unloaded(&block)
51
+ Core::ScriptHandlingCallbacks.script_unloaded_hooks << block
52
+ end
53
+ end
54
+
5
55
  #
6
56
  # Manages script loading and unloading
7
57
  #
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ module Things
6
+ #
7
+ # Contains the link between a {Thing Thing's} {Channel Channels} and {GenericItem Items}.
8
+ #
9
+ module Links
10
+ #
11
+ # Provides {Items::GenericItem items} linked to {Channel channels} in Ruby to openHAB.
12
+ #
13
+ class Provider < Core::Provider
14
+ include org.openhab.core.thing.link.ItemChannelLinkProvider
15
+
16
+ class << self
17
+ #
18
+ # The ItemChannelLink registry
19
+ #
20
+ # @return [org.openhab.core.thing.link.ItemChanneLinkRegistry]
21
+ #
22
+ def registry
23
+ @registry ||= OSGi.service("org.openhab.core.thing.link.ItemChannelLinkRegistry")
24
+ end
25
+
26
+ # @!visibility private
27
+ def link(item, channel, config = {})
28
+ config = org.openhab.core.config.core.Configuration.new(config.transform_keys(&:to_s))
29
+ channel = ChannelUID.new(channel) if channel.is_a?(String)
30
+ channel = channel.uid if channel.is_a?(Channel)
31
+ link = org.openhab.core.thing.link.ItemChannelLink.new(item.name, channel, config)
32
+
33
+ current.add(link)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ module Things
6
+ #
7
+ # Provides {Thing Things} created in Ruby to openHAB
8
+ #
9
+ class Provider < Core::Provider
10
+ include org.openhab.core.thing.ThingProvider
11
+
12
+ class << self
13
+ #
14
+ # The Thing registry
15
+ #
16
+ # @return [org.openhab.core.thing.ThingRegistry]
17
+ #
18
+ def registry
19
+ $things
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -63,6 +63,16 @@ module OpenHAB
63
63
 
64
64
  super
65
65
  end
66
+
67
+ #
68
+ # Non equality comparison
69
+ #
70
+ # @return [true, false]
71
+ #
72
+ # @!visibility private
73
+ def !=(other)
74
+ !(self == other) # rubocop:disable Style/InverseMethods
75
+ end
66
76
  end
67
77
  end
68
78
  end