openhab-scripting 4.46.2 → 5.0.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.
Files changed (281) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab/core/actions/audio.rb +47 -0
  3. data/lib/openhab/core/actions/ephemeris.rb +39 -0
  4. data/lib/openhab/core/actions/exec.rb +51 -0
  5. data/lib/openhab/core/actions/http.rb +80 -0
  6. data/lib/openhab/core/actions/ping.rb +30 -0
  7. data/lib/openhab/core/actions/transformation.rb +32 -0
  8. data/lib/openhab/core/actions/voice.rb +36 -0
  9. data/lib/openhab/core/actions.rb +82 -0
  10. data/lib/openhab/core/dependency_tracking.rb +34 -0
  11. data/lib/openhab/core/dto/item_channel_link.rb +33 -0
  12. data/lib/openhab/core/dto/thing.rb +27 -0
  13. data/lib/openhab/core/dto.rb +11 -0
  14. data/lib/openhab/core/entity_lookup.rb +152 -70
  15. data/lib/openhab/core/events/abstract_event.rb +18 -0
  16. data/lib/openhab/core/events/abstract_item_registry_event.rb +36 -0
  17. data/lib/openhab/core/events/abstract_thing_registry_event.rb +40 -0
  18. data/lib/openhab/core/events/item_command_event.rb +78 -0
  19. data/lib/openhab/core/events/item_event.rb +22 -0
  20. data/lib/openhab/core/events/item_state_changed_event.rb +75 -0
  21. data/lib/openhab/core/events/item_state_event.rb +79 -0
  22. data/lib/openhab/core/events/thing_status_info_event.rb +55 -0
  23. data/lib/openhab/core/events.rb +10 -0
  24. data/lib/openhab/core/items/accepted_data_types.rb +29 -0
  25. data/lib/openhab/core/items/color_item.rb +52 -0
  26. data/lib/openhab/core/items/contact_item.rb +52 -0
  27. data/lib/openhab/core/items/date_time_item.rb +59 -0
  28. data/lib/openhab/core/items/dimmer_item.rb +148 -0
  29. data/lib/openhab/core/items/generic_item.rb +292 -0
  30. data/lib/openhab/core/items/group_item.rb +176 -0
  31. data/lib/openhab/{dsl → core}/items/image_item.rb +35 -29
  32. data/lib/openhab/core/items/item.rb +273 -0
  33. data/lib/openhab/core/items/location_item.rb +34 -0
  34. data/lib/openhab/core/items/metadata/hash.rb +433 -0
  35. data/lib/openhab/core/items/metadata/namespace_hash.rb +475 -0
  36. data/lib/openhab/core/items/metadata/provider.rb +48 -0
  37. data/lib/openhab/core/items/metadata.rb +11 -0
  38. data/lib/openhab/core/items/number_item.rb +62 -0
  39. data/lib/openhab/core/items/numeric_item.rb +22 -0
  40. data/lib/openhab/core/items/persistence.rb +416 -0
  41. data/lib/openhab/core/items/player_item.rb +66 -0
  42. data/lib/openhab/core/items/provider.rb +44 -0
  43. data/lib/openhab/core/items/proxy.rb +136 -0
  44. data/lib/openhab/core/items/registry.rb +86 -0
  45. data/lib/openhab/core/items/rollershutter_item.rb +68 -0
  46. data/lib/openhab/core/items/semantics/enumerable.rb +177 -0
  47. data/lib/openhab/core/items/semantics.rb +473 -0
  48. data/lib/openhab/core/items/state_storage.rb +53 -0
  49. data/lib/openhab/core/items/string_item.rb +28 -0
  50. data/lib/openhab/core/items/switch_item.rb +78 -0
  51. data/lib/openhab/core/items.rb +108 -0
  52. data/lib/openhab/{dsl → core}/lazy_array.rb +9 -3
  53. data/lib/openhab/core/profile_factory.rb +132 -0
  54. data/lib/openhab/core/provider.rb +230 -0
  55. data/lib/openhab/core/proxy.rb +130 -0
  56. data/lib/openhab/core/registry.rb +40 -0
  57. data/lib/openhab/core/rules/module.rb +26 -0
  58. data/lib/openhab/core/rules/provider.rb +25 -0
  59. data/lib/openhab/core/rules/registry.rb +76 -0
  60. data/lib/openhab/core/rules/rule.rb +150 -0
  61. data/lib/openhab/core/rules.rb +25 -0
  62. data/lib/openhab/core/script_handling.rb +78 -20
  63. data/lib/openhab/core/things/channel.rb +48 -0
  64. data/lib/openhab/core/things/channel_uid.rb +51 -0
  65. data/lib/openhab/core/things/item_channel_link.rb +33 -0
  66. data/lib/openhab/core/things/links/provider.rb +78 -0
  67. data/lib/openhab/core/things/profile_callback.rb +52 -0
  68. data/lib/openhab/core/things/provider.rb +29 -0
  69. data/lib/openhab/core/things/proxy.rb +87 -0
  70. data/lib/openhab/core/things/registry.rb +73 -0
  71. data/lib/openhab/core/things/thing.rb +194 -0
  72. data/lib/openhab/core/things.rb +22 -0
  73. data/lib/openhab/core/timer.rb +148 -0
  74. data/lib/openhab/{dsl → core}/types/comparable_type.rb +5 -3
  75. data/lib/openhab/{dsl → core}/types/date_time_type.rb +55 -127
  76. data/lib/openhab/{dsl → core}/types/decimal_type.rb +50 -48
  77. data/lib/openhab/{dsl → core}/types/hsb_type.rb +35 -83
  78. data/lib/openhab/core/types/increase_decrease_type.rb +34 -0
  79. data/lib/openhab/core/types/next_previous_type.rb +34 -0
  80. data/lib/openhab/{dsl → core}/types/numeric_type.rb +20 -7
  81. data/lib/openhab/core/types/on_off_type.rb +46 -0
  82. data/lib/openhab/core/types/open_closed_type.rb +41 -0
  83. data/lib/openhab/{dsl → core}/types/percent_type.rb +19 -20
  84. data/lib/openhab/core/types/play_pause_type.rb +38 -0
  85. data/lib/openhab/core/types/point_type.rb +117 -0
  86. data/lib/openhab/core/types/quantity_type.rb +325 -0
  87. data/lib/openhab/core/types/raw_type.rb +26 -0
  88. data/lib/openhab/core/types/refresh_type.rb +27 -0
  89. data/lib/openhab/core/types/rewind_fastforward_type.rb +38 -0
  90. data/lib/openhab/core/types/stop_move_type.rb +34 -0
  91. data/lib/openhab/{dsl → core}/types/string_type.rb +17 -28
  92. data/lib/openhab/{dsl → core}/types/type.rb +42 -40
  93. data/lib/openhab/core/types/un_def_type.rb +38 -0
  94. data/lib/openhab/core/types/up_down_type.rb +50 -0
  95. data/lib/openhab/core/types.rb +82 -0
  96. data/lib/openhab/{dsl → core}/uid.rb +4 -23
  97. data/lib/openhab/core/value_cache.rb +188 -0
  98. data/lib/openhab/core.rb +98 -0
  99. data/lib/openhab/core_ext/between.rb +32 -0
  100. data/lib/openhab/core_ext/ephemeris.rb +53 -0
  101. data/lib/openhab/core_ext/java/class.rb +34 -0
  102. data/lib/openhab/core_ext/java/duration.rb +142 -0
  103. data/lib/openhab/core_ext/java/list.rb +436 -0
  104. data/lib/openhab/core_ext/java/local_date.rb +104 -0
  105. data/lib/openhab/core_ext/java/local_time.rb +118 -0
  106. data/lib/openhab/core_ext/java/map.rb +66 -0
  107. data/lib/openhab/core_ext/java/month.rb +71 -0
  108. data/lib/openhab/core_ext/java/month_day.rb +119 -0
  109. data/lib/openhab/core_ext/java/period.rb +103 -0
  110. data/lib/openhab/core_ext/java/temporal_amount.rb +34 -0
  111. data/lib/openhab/core_ext/java/time.rb +62 -0
  112. data/lib/openhab/core_ext/java/unit.rb +15 -0
  113. data/lib/openhab/core_ext/java/zoned_date_time.rb +213 -0
  114. data/lib/openhab/core_ext/ruby/array.rb +21 -0
  115. data/lib/openhab/core_ext/ruby/date.rb +96 -0
  116. data/lib/openhab/core_ext/ruby/date_time.rb +55 -0
  117. data/lib/openhab/core_ext/ruby/module.rb +15 -0
  118. data/lib/openhab/core_ext/ruby/numeric.rb +195 -0
  119. data/lib/openhab/core_ext/ruby/range.rb +70 -0
  120. data/lib/openhab/core_ext/ruby/symbol.rb +7 -0
  121. data/lib/openhab/core_ext/ruby/time.rb +108 -0
  122. data/lib/openhab/core_ext.rb +18 -0
  123. data/lib/openhab/dsl/debouncer.rb +259 -0
  124. data/lib/openhab/dsl/events/watch_event.rb +18 -0
  125. data/lib/openhab/dsl/events.rb +9 -0
  126. data/lib/openhab/dsl/gems.rb +1 -1
  127. data/lib/openhab/dsl/items/builder.rb +578 -0
  128. data/lib/openhab/dsl/items/ensure.rb +73 -82
  129. data/lib/openhab/dsl/items/timed_command.rb +214 -159
  130. data/lib/openhab/dsl/rules/automation_rule.rb +126 -115
  131. data/lib/openhab/dsl/rules/builder.rb +1935 -0
  132. data/lib/openhab/dsl/rules/guard.rb +51 -114
  133. data/lib/openhab/dsl/rules/name_inference.rb +66 -25
  134. data/lib/openhab/dsl/rules/property.rb +48 -75
  135. data/lib/openhab/dsl/rules/rule_triggers.rb +22 -27
  136. data/lib/openhab/dsl/rules/terse.rb +58 -14
  137. data/lib/openhab/dsl/rules/triggers/changed.rb +48 -94
  138. data/lib/openhab/dsl/rules/triggers/channel.rb +9 -40
  139. data/lib/openhab/dsl/rules/triggers/command.rb +14 -63
  140. data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +34 -69
  141. data/lib/openhab/dsl/rules/triggers/conditions/proc.rb +6 -14
  142. data/lib/openhab/dsl/rules/triggers/cron/cron.rb +48 -82
  143. data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +30 -47
  144. data/lib/openhab/dsl/rules/triggers/trigger.rb +7 -28
  145. data/lib/openhab/dsl/rules/triggers/updated.rb +21 -45
  146. data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +257 -102
  147. data/lib/openhab/dsl/rules/triggers.rb +12 -0
  148. data/lib/openhab/dsl/rules.rb +8 -0
  149. data/lib/openhab/dsl/things/builder.rb +299 -0
  150. data/lib/openhab/{core → dsl}/thread_local.rb +27 -17
  151. data/lib/openhab/dsl/timer_manager.rb +204 -0
  152. data/lib/openhab/dsl/version.rb +9 -0
  153. data/lib/openhab/dsl.rb +979 -0
  154. data/lib/openhab/log.rb +355 -0
  155. data/lib/openhab/osgi.rb +68 -0
  156. data/lib/openhab/rspec/configuration.rb +56 -0
  157. data/lib/openhab/rspec/example_group.rb +132 -0
  158. data/lib/openhab/rspec/helpers.rb +458 -0
  159. data/lib/openhab/rspec/hooks.rb +113 -0
  160. data/lib/openhab/rspec/jruby.rb +46 -0
  161. data/lib/openhab/rspec/karaf.rb +851 -0
  162. data/lib/openhab/rspec/mocks/bundle_install_support.rb +25 -0
  163. data/lib/openhab/rspec/mocks/bundle_resolver.rb +30 -0
  164. data/lib/openhab/rspec/mocks/event_admin.rb +146 -0
  165. data/lib/openhab/rspec/mocks/instance_method_stasher.rb +22 -0
  166. data/lib/openhab/rspec/mocks/persistence_service.rb +155 -0
  167. data/lib/openhab/rspec/mocks/safe_caller.rb +40 -0
  168. data/lib/openhab/rspec/mocks/space.rb +23 -0
  169. data/lib/openhab/rspec/mocks/synchronous_executor.rb +63 -0
  170. data/lib/openhab/rspec/mocks/thing_handler.rb +76 -0
  171. data/lib/openhab/rspec/mocks/timer.rb +134 -0
  172. data/lib/openhab/rspec/openhab/core/actions.rb +38 -0
  173. data/lib/openhab/rspec/openhab/core/items/proxy.rb +15 -0
  174. data/lib/openhab/rspec/openhab/core/things/proxy.rb +27 -0
  175. data/lib/openhab/rspec/shell.rb +31 -0
  176. data/lib/openhab/rspec/suspend_rules.rb +50 -0
  177. data/lib/openhab/rspec.rb +26 -0
  178. data/lib/openhab/yard/base_helper.rb +19 -0
  179. data/lib/openhab/yard/cli/stats.rb +23 -0
  180. data/lib/openhab/yard/code_objects/group_object.rb +23 -0
  181. data/lib/openhab/yard/code_objects/java/base.rb +31 -0
  182. data/lib/openhab/yard/code_objects/java/class_object.rb +11 -0
  183. data/lib/openhab/yard/code_objects/java/field_object.rb +15 -0
  184. data/lib/openhab/yard/code_objects/java/interface_object.rb +15 -0
  185. data/lib/openhab/yard/code_objects/java/package_object.rb +11 -0
  186. data/lib/openhab/yard/code_objects/java/proxy.rb +23 -0
  187. data/lib/openhab/yard/coderay.rb +17 -0
  188. data/lib/openhab/yard/handlers/jruby/base.rb +58 -0
  189. data/lib/openhab/yard/handlers/jruby/class_handler.rb +18 -0
  190. data/lib/openhab/yard/handlers/jruby/constant_handler.rb +18 -0
  191. data/lib/openhab/yard/handlers/jruby/java_import_handler.rb +30 -0
  192. data/lib/openhab/yard/handlers/jruby/mixin_handler.rb +23 -0
  193. data/lib/openhab/yard/html_helper.rb +78 -0
  194. data/lib/openhab/yard/markdown_helper.rb +148 -0
  195. data/lib/openhab/yard/tags/constant_directive.rb +20 -0
  196. data/lib/openhab/yard/tags/group_directive.rb +24 -0
  197. data/lib/openhab/yard/tags/library.rb +3 -0
  198. data/lib/openhab/yard.rb +38 -0
  199. metadata +475 -106
  200. data/lib/openhab/core/item_proxy.rb +0 -29
  201. data/lib/openhab/core/load_path.rb +0 -19
  202. data/lib/openhab/core/openhab_setup.rb +0 -29
  203. data/lib/openhab/core/osgi.rb +0 -58
  204. data/lib/openhab/core/services.rb +0 -24
  205. data/lib/openhab/dsl/actions.rb +0 -114
  206. data/lib/openhab/dsl/between.rb +0 -25
  207. data/lib/openhab/dsl/channel.rb +0 -43
  208. data/lib/openhab/dsl/dsl.rb +0 -59
  209. data/lib/openhab/dsl/group.rb +0 -54
  210. data/lib/openhab/dsl/imports.rb +0 -21
  211. data/lib/openhab/dsl/items/color_item.rb +0 -76
  212. data/lib/openhab/dsl/items/comparable_item.rb +0 -62
  213. data/lib/openhab/dsl/items/contact_item.rb +0 -41
  214. data/lib/openhab/dsl/items/date_time_item.rb +0 -65
  215. data/lib/openhab/dsl/items/dimmer_item.rb +0 -65
  216. data/lib/openhab/dsl/items/generic_item.rb +0 -229
  217. data/lib/openhab/dsl/items/group_item.rb +0 -127
  218. data/lib/openhab/dsl/items/item_equality.rb +0 -59
  219. data/lib/openhab/dsl/items/item_registry.rb +0 -54
  220. data/lib/openhab/dsl/items/items.rb +0 -109
  221. data/lib/openhab/dsl/items/location_item.rb +0 -59
  222. data/lib/openhab/dsl/items/metadata.rb +0 -326
  223. data/lib/openhab/dsl/items/number_item.rb +0 -17
  224. data/lib/openhab/dsl/items/numeric_item.rb +0 -87
  225. data/lib/openhab/dsl/items/persistence.rb +0 -307
  226. data/lib/openhab/dsl/items/player_item.rb +0 -58
  227. data/lib/openhab/dsl/items/rollershutter_item.rb +0 -51
  228. data/lib/openhab/dsl/items/semantics/enumerable.rb +0 -91
  229. data/lib/openhab/dsl/items/semantics.rb +0 -227
  230. data/lib/openhab/dsl/items/string_item.rb +0 -51
  231. data/lib/openhab/dsl/items/switch_item.rb +0 -70
  232. data/lib/openhab/dsl/monkey_patch/actions/actions.rb +0 -4
  233. data/lib/openhab/dsl/monkey_patch/actions/script_thing_actions.rb +0 -39
  234. data/lib/openhab/dsl/monkey_patch/events/events.rb +0 -7
  235. data/lib/openhab/dsl/monkey_patch/events/item_command.rb +0 -85
  236. data/lib/openhab/dsl/monkey_patch/events/item_event.rb +0 -28
  237. data/lib/openhab/dsl/monkey_patch/events/item_state.rb +0 -61
  238. data/lib/openhab/dsl/monkey_patch/events/item_state_changed.rb +0 -60
  239. data/lib/openhab/dsl/monkey_patch/events/thing_status_info.rb +0 -33
  240. data/lib/openhab/dsl/monkey_patch/java/java.rb +0 -4
  241. data/lib/openhab/dsl/monkey_patch/java/local_time.rb +0 -44
  242. data/lib/openhab/dsl/monkey_patch/java/time_extensions.rb +0 -50
  243. data/lib/openhab/dsl/monkey_patch/java/zoned_date_time.rb +0 -45
  244. data/lib/openhab/dsl/monkey_patch/ruby/number.rb +0 -104
  245. data/lib/openhab/dsl/monkey_patch/ruby/ruby.rb +0 -6
  246. data/lib/openhab/dsl/monkey_patch/ruby/string.rb +0 -47
  247. data/lib/openhab/dsl/monkey_patch/ruby/time.rb +0 -61
  248. data/lib/openhab/dsl/openhab.rb +0 -30
  249. data/lib/openhab/dsl/persistence.rb +0 -27
  250. data/lib/openhab/dsl/rules/item_event.rb +0 -19
  251. data/lib/openhab/dsl/rules/rule.rb +0 -160
  252. data/lib/openhab/dsl/rules/rule_config.rb +0 -147
  253. data/lib/openhab/dsl/rules/triggers/generic.rb +0 -31
  254. data/lib/openhab/dsl/rules/triggers/triggers.rb +0 -11
  255. data/lib/openhab/dsl/rules/triggers/watch/watch.rb +0 -81
  256. data/lib/openhab/dsl/states.rb +0 -89
  257. data/lib/openhab/dsl/things.rb +0 -147
  258. data/lib/openhab/dsl/time/month_day.rb +0 -180
  259. data/lib/openhab/dsl/time/time_of_day.rb +0 -235
  260. data/lib/openhab/dsl/timers/manager.rb +0 -119
  261. data/lib/openhab/dsl/timers/reentrant_timer.rb +0 -38
  262. data/lib/openhab/dsl/timers/timer.rb +0 -132
  263. data/lib/openhab/dsl/timers.rb +0 -77
  264. data/lib/openhab/dsl/types/increase_decrease_type.rb +0 -23
  265. data/lib/openhab/dsl/types/next_previous_type.rb +0 -23
  266. data/lib/openhab/dsl/types/on_off_type.rb +0 -28
  267. data/lib/openhab/dsl/types/open_closed_type.rb +0 -29
  268. data/lib/openhab/dsl/types/play_pause_type.rb +0 -27
  269. data/lib/openhab/dsl/types/point_type.rb +0 -180
  270. data/lib/openhab/dsl/types/quantity_type.rb +0 -265
  271. data/lib/openhab/dsl/types/refresh_type.rb +0 -18
  272. data/lib/openhab/dsl/types/rewind_fastforward_type.rb +0 -33
  273. data/lib/openhab/dsl/types/stop_move_type.rb +0 -23
  274. data/lib/openhab/dsl/types/types.rb +0 -83
  275. data/lib/openhab/dsl/types/un_def_type.rb +0 -22
  276. data/lib/openhab/dsl/types/up_down_type.rb +0 -32
  277. data/lib/openhab/dsl/units.rb +0 -45
  278. data/lib/openhab/log/configuration.rb +0 -21
  279. data/lib/openhab/log/logger.rb +0 -282
  280. data/lib/openhab/version.rb +0 -9
  281. data/lib/openhab.rb +0 -36
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ module Things
6
+ #
7
+ # Contains methods for {OpenHAB::DSL.profile profile}'s callback to forward commands between items
8
+ # and channels.
9
+ #
10
+ module ProfileCallback
11
+ class << self
12
+ #
13
+ # Wraps the parent class's method to format non-Types.
14
+ #
15
+ # @!macro def_state_parsing_method
16
+ # @!method $1($2)
17
+ # @return [void]
18
+ # @!visibility private
19
+ def def_state_parsing_method(method, param_name)
20
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
21
+ def #{method}(type) # def handle_command(type)
22
+ type = link.item.format_#{(param_name == :state) ? :update : param_name}(type) # type = link.item.format_command(type)
23
+ super(type) # super(type)
24
+ end # end
25
+ RUBY
26
+ end
27
+ end
28
+
29
+ #
30
+ # Forward the given command to the respective thing handler.
31
+ #
32
+ # @param [Command] command
33
+ #
34
+ def_state_parsing_method(:handle_command, :command)
35
+
36
+ #
37
+ # Send a command to the framework.
38
+ #
39
+ # @param [Command] command
40
+ #
41
+ def_state_parsing_method(:send_command, :command)
42
+
43
+ #
44
+ # Send a state update to the framework.
45
+ #
46
+ # @param [State] state
47
+ #
48
+ def_state_parsing_method(:send_update, :state)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,29 @@
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
+
23
+ def initialize
24
+ super(unload_priority: 60)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "delegate"
4
+ require "forwardable"
5
+
6
+ module OpenHAB
7
+ module Core
8
+ module Things
9
+ # Class is a proxy to underlying thing
10
+ # @!visibility private
11
+ class Proxy < Delegator
12
+ extend Forwardable
13
+ def_delegators :__getobj__, :class, :is_a?, :kind_of?
14
+
15
+ # @!visibility private
16
+ EVENTS = [Events::ThingAddedEvent::TYPE, Events::ThingUpdatedEvent::TYPE,
17
+ Events::ThingRemovedEvent::TYPE].freeze
18
+ # @!visibility private
19
+ UID_METHOD = :uid
20
+
21
+ include Core::Proxy
22
+
23
+ # Returns the list of channels associated with this Thing
24
+ #
25
+ # @note This is defined on this class, and not on {Thing}, because
26
+ # that's the interface and if you define it there, it will be hidden
27
+ # by the method on ThingImpl.
28
+ #
29
+ # @return [Array] channels
30
+ def channels
31
+ Thing::ChannelsArray.new(super.to_a)
32
+ end
33
+
34
+ #
35
+ # Set the proxy item (called by super)
36
+ #
37
+ def __setobj__(thing)
38
+ @uid = thing.uid
39
+ end
40
+
41
+ #
42
+ # Lookup thing from thing registry
43
+ #
44
+ def __getobj__
45
+ $things.get(@uid)
46
+ end
47
+
48
+ #
49
+ # Need to check if `self` _or_ the delegate is an instance of the
50
+ # given class
51
+ #
52
+ # So that {#==} can work
53
+ #
54
+ # @return [true, false]
55
+ #
56
+ # @!visibility private
57
+ def instance_of?(klass)
58
+ __getobj__.instance_of?(klass) || super
59
+ end
60
+
61
+ #
62
+ # Check if delegates are equal for comparison
63
+ #
64
+ # Otherwise items can't be used in Java maps
65
+ #
66
+ # @return [true, false]
67
+ #
68
+ # @!visibility private
69
+ def ==(other)
70
+ return __getobj__ == other.__getobj__ if other.instance_of?(Proxy)
71
+
72
+ super
73
+ end
74
+
75
+ #
76
+ # Non equality comparison
77
+ #
78
+ # @return [true, false]
79
+ #
80
+ # @!visibility private
81
+ def !=(other)
82
+ !(self == other) # rubocop:disable Style/InverseMethods
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+
5
+ module OpenHAB
6
+ module Core
7
+ module Things
8
+ #
9
+ # Provides access to all openHAB {Thing things}, and acts like an array.
10
+ #
11
+ class Registry
12
+ include LazyArray
13
+ include Singleton
14
+
15
+ #
16
+ # Gets a specific {Thing}
17
+ #
18
+ # @param [String, ThingUID] uid Thing UID in the format `binding_id:type_id:thing_id`
19
+ # or via the ThingUID
20
+ # @return [Thing, nil]
21
+ #
22
+ def [](uid)
23
+ EntityLookup.lookup_thing(uid)
24
+ end
25
+ alias_method :include?, :[]
26
+ alias_method :key?, :[]
27
+ # @deprecated
28
+ alias_method :has_key?, :[]
29
+
30
+ #
31
+ # Explicit conversion to array
32
+ #
33
+ # @return [Array<Thing>]
34
+ #
35
+ def to_a
36
+ $things.all.map { |thing| Proxy.new(thing) }
37
+ end
38
+
39
+ #
40
+ # Enter the Thing Builder DSL.
41
+ # @param (see Core::Provider.current)
42
+ # @yield Block executed in the context of a {DSL::Things::Builder}.
43
+ # @return [Object] The result of the block.
44
+ #
45
+ def build(preferred_provider = nil, &block)
46
+ DSL::Things::Builder.new(preferred_provider).instance_eval(&block)
47
+ end
48
+
49
+ #
50
+ # Remove a Thing.
51
+ #
52
+ # The thing must be a managed thing (typically created by Ruby or in the UI).
53
+ #
54
+ # @param [String, Thing, ThingUID] thing_uid
55
+ # @return [Thing, nil] The removed item, if found.
56
+ def remove(thing_uid)
57
+ thing_uid = thing.uid if thing_uid.is_a?(Thing)
58
+ thing_uid = ThingUID.new(thing_uid) if thing_uid.is_a?(String)
59
+ provider = Provider.registry.provider_for(thing_uid)
60
+ unless provider.is_a?(org.openhab.core.common.registry.ManagedProvider)
61
+ raise "Cannot remove thing #{thing_uid} from non-managed provider #{provider.inspect}"
62
+ end
63
+
64
+ Links::Provider.registry.providers.grep(ManagedProvider).each do |managed_provider|
65
+ managed_provider.remove_links_for_thing(thing_uid)
66
+ end
67
+
68
+ provider.remove(thing_uid)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,194 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ module Things
6
+ # @interface
7
+ java_import org.openhab.core.thing.Thing
8
+
9
+ #
10
+ # A {Thing} is a representation of a connected part (e.g. physical device
11
+ # or cloud service) from the real world. It contains a list of
12
+ # {Channel Channels}, which can be bound to {Item Items}.
13
+ #
14
+ # @see OpenHAB::DSL.things things[]
15
+ # @see EntityLookup
16
+ #
17
+ # @example
18
+ # thing = things["chromecast:audiogroup:dd9f8622-eee-4eaf-b33f-cdcdcdeee001121"]
19
+ # logger.info("Audiogroup Status: #{thing&.status}")
20
+ # logger.info("Audiogroup Online? #{thing&.online?}")
21
+ # logger.info("Channel ids: #{thing.channels.map(&:uid)}")
22
+ # logger.info("Items linked to volume channel: #{thing.channels['volume']&.items&.map(&:name)&.join(', ')}")
23
+ # logger.info("Item linked to volume channel: #{thing.channels['volume']&.item&.name}")
24
+ #
25
+ # @example Thing actions can be called directly through a Thing object
26
+ # things["mqtt:broker:mosquitto"].publish_mqtt("zigbee2mqttt/bridge/config/permit_join", "true")
27
+ # things["mail:smtp:local"].send_mail("me@example.com", "Subject", "Email body")
28
+ #
29
+ # @example Thing can be accessed directly through {EntityLookup entity lookup}
30
+ # # replace ':' with '_' in thing uid
31
+ # mqtt_broker_mosquitto.online? # is mqtt:broker:mosquitto thing online?
32
+ #
33
+ # @!attribute [r] status
34
+ # Return the {https://www.openhab.org/docs/concepts/things.html#thing-status thing status}
35
+ # @return [org.openhab.core.thing.ThingStatus]
36
+ #
37
+ # @!attribute [r] channels
38
+ # @return [ChannelArray]
39
+ #
40
+ module Thing
41
+ # Array wrapper class to allow searching a list of channels
42
+ # by channel id
43
+ class ChannelsArray < Array
44
+ # Allows indexing by both integer as an array or channel id acting like a hash.
45
+ # @param [Integer, String] index Numeric index or string channel id to search for.
46
+ def [](index)
47
+ if index.respond_to?(:to_str)
48
+ key = index.to_str
49
+ return find { |channel| channel.uid.id == key }
50
+ end
51
+
52
+ super
53
+ end
54
+ end
55
+
56
+ class << self
57
+ # @!visibility private
58
+ #
59
+ # Override to support Proxy
60
+ #
61
+ def ===(other)
62
+ other.is_a?(self)
63
+ end
64
+ end
65
+
66
+ #
67
+ # @!method uninitialized?
68
+ # Check if thing status == UNINITIALIZED
69
+ # @return [true,false]
70
+ #
71
+
72
+ #
73
+ # @!method initialized?
74
+ # Check if thing status == INITIALIZED
75
+ # @return [true,false]
76
+ #
77
+
78
+ #
79
+ # @!method unknown?
80
+ # Check if thing status == UNKNOWN
81
+ # @return [true,false]
82
+ #
83
+
84
+ #
85
+ # @!method online?
86
+ # Check if thing status == ONLINE
87
+ # @return [true,false]
88
+ #
89
+
90
+ #
91
+ # @!method offline?
92
+ # Check if thing status == OFFLINE
93
+ # @return [true,false]
94
+ #
95
+
96
+ #
97
+ # @!method removing?
98
+ # Check if thing status == REMOVING
99
+ # @return [true,false]
100
+ #
101
+
102
+ #
103
+ # @!method removed?
104
+ # Check if thing status == REMOVED
105
+ # @return [true,false]
106
+ #
107
+
108
+ ThingStatus.constants.each do |thingstatus|
109
+ define_method("#{thingstatus.to_s.downcase}?") { status == ThingStatus.value_of(thingstatus) }
110
+ end
111
+
112
+ #
113
+ # Enable the Thing
114
+ #
115
+ # @param [true, false] enabled
116
+ # @return [void]
117
+ #
118
+ def enable(enabled: true)
119
+ Things.manager.set_enabled(uid, enabled)
120
+ end
121
+
122
+ #
123
+ # Disable the Thing
124
+ #
125
+ # @return [void]
126
+ #
127
+ def disable
128
+ enable(enabled: false)
129
+ end
130
+
131
+ # @return [String]
132
+ def inspect
133
+ r = "#<OpenHAB::Core::Things::Thing #{uid}"
134
+ r += " #{label.inspect}" if label
135
+ r += " (#{location.inspect})" if location
136
+ r += " #{status}"
137
+ unless status_info.status_detail == org.openhab.core.thing.ThingStatusDetail::NONE
138
+ r += " (#{status_info.status_detail})"
139
+ end
140
+ r += " configuration=#{configuration.properties.to_h}" unless configuration.properties.empty?
141
+ r += " properties=#{properties.to_h}" unless properties.empty?
142
+ "#{r}>"
143
+ end
144
+
145
+ #
146
+ # Return Thing's uid as a string
147
+ #
148
+ # @return [String]
149
+ #
150
+ def to_s
151
+ uid.to_s
152
+ end
153
+
154
+ #
155
+ # Fetches the actions available for this thing.
156
+ #
157
+ # Default scope actions are available directly on the thing object, via
158
+ # {#method_missing}.
159
+ #
160
+ # @param [String, nil] scope The action scope. Default's to the thing's binding.
161
+ # @return [Object, nil]
162
+ #
163
+ # @example
164
+ # things["max:thermostat:mybridge:thermostat"].actions("max-devices").delete_from_cube
165
+ #
166
+ # @example (see #method_missing)
167
+ #
168
+ def actions(scope = nil)
169
+ $actions.get(scope || uid.binding_id, uid.to_s)
170
+ end
171
+
172
+ #
173
+ # Delegate missing methods to the thing's default actions scope.
174
+ #
175
+ # @example
176
+ # things['mail:smtp:local'].send_email('me@example.com', 'subject', 'message')
177
+ #
178
+ def method_missing(method, *args, &block)
179
+ return actions.public_send(method, *args, &block) if actions.respond_to?(method)
180
+
181
+ super
182
+ end
183
+
184
+ # @!visibility private
185
+ def respond_to_missing?(method_name, _include_private = false)
186
+ logger.trace("Checking if Thing #{uid} supports #{method_name} action")
187
+ return true if actions.respond_to?(method_name)
188
+
189
+ super
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenHAB
4
+ module Core
5
+ #
6
+ # Contains the core {Thing} that bindings use to represent connected devices,
7
+ # as well as related infrastructure.
8
+ #
9
+ module Things
10
+ java_import org.openhab.core.thing.ThingStatus,
11
+ org.openhab.core.thing.ThingUID,
12
+ org.openhab.core.thing.ThingTypeUID
13
+
14
+ class << self
15
+ # @!visibility private
16
+ def manager
17
+ @manager ||= OSGi.service("org.openhab.core.thing.ThingManager")
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module OpenHAB
6
+ module Core
7
+ #
8
+ # Timer allows you to administer the block of code that
9
+ # has been scheduled to run later with {OpenHAB::DSL.after after}.
10
+ #
11
+ class Timer
12
+ extend Forwardable
13
+
14
+ # @!method active?
15
+ # Check if the timer will execute in the future.
16
+ # @return [true,false]
17
+
18
+ # @!method cancelled?
19
+ # Check if the timer has been cancelled.
20
+ # @return [true,false]
21
+
22
+ # @!method running?
23
+ # Check if the timer code is currently running.
24
+ # @return [true,false]
25
+
26
+ # @!method terminated?
27
+ # Check if the timer has terminated.
28
+ # @return [true,false]
29
+
30
+ def_delegator :@timer, :has_terminated, :terminated?
31
+ def_delegators :@timer, :active?, :cancelled?, :running?, :execution_time
32
+
33
+ # @return [Object, nil]
34
+ attr_accessor :id
35
+
36
+ # @!visibility private
37
+ attr_reader :block
38
+
39
+ #
40
+ # Create a new Timer Object
41
+ #
42
+ # @param [java.time.temporal.TemporalAmount, #to_zoned_date_time, Proc] time When to execute the block
43
+ # @yield Block to execute when timer fires
44
+ # @yieldparam [self]
45
+ #
46
+ # @!visibility private
47
+ def initialize(time, id:, thread_locals:, block:)
48
+ @time = time
49
+ @id = id
50
+ @thread_locals = thread_locals
51
+ @block = block
52
+ @timer = ScriptExecution.create_timer(1.minute.from_now) { execute }
53
+ reschedule!(@time)
54
+ end
55
+
56
+ # @return [String]
57
+ def inspect
58
+ r = "#<#{self.class.name} #{"#{id.inspect} " if id}#{block.source_location.join(":")}"
59
+ if cancelled?
60
+ r += " (cancelled)"
61
+ else
62
+ r += " @ #{execution_time}"
63
+ r += " (executed)" if terminated?
64
+ end
65
+ "#{r}>"
66
+ end
67
+ alias_method :to_s, :inspect
68
+
69
+ # @!attribute [r] execution_time
70
+ # @return [ZonedDateTime, nil] the scheduled execution time, or `nil` if the timer was cancelled
71
+
72
+ #
73
+ # Reschedule timer.
74
+ #
75
+ # If the timer had been cancelled or executed, restart the timer.
76
+ #
77
+ # @param [java.time.temporal.TemporalAmount, ZonedDateTime, Proc, nil] time When to reschedule the timer for.
78
+ # If unspecified, the original time is used.
79
+ #
80
+ # @return [self]
81
+ #
82
+ def reschedule(time = nil)
83
+ return reschedule!(time) unless id
84
+
85
+ # re-add ourself to the TimerManager's @timers_by_id
86
+ DSL.timers.schedule(id) do |old_timer|
87
+ old_timer&.cancel unless old_timer.eql?(self)
88
+ self.id = nil
89
+ reschedule!(time)
90
+ end
91
+ end
92
+
93
+ # @return [self]
94
+ # @!visibility private
95
+ def reschedule!(time = nil)
96
+ Thread.current[:openhab_rescheduled_timer] = true if Thread.current[:openhab_rescheduled_timer] == self
97
+ DSL.timers.add(self)
98
+ @timer.reschedule(new_execution_time(time || @time))
99
+ self
100
+ end
101
+
102
+ #
103
+ # Cancel timer
104
+ #
105
+ # @return [true,false] True if cancel was successful, false otherwise
106
+ #
107
+ def cancel
108
+ DSL.timers.delete(self)
109
+ cancel!
110
+ end
111
+
112
+ #
113
+ # Cancel the timer but do not remove self from the timer manager
114
+ #
115
+ # To be used internally by {TimerManager} from inside ConcurrentHashMap's compute blocks
116
+ #
117
+ # @return [true,false] True if cancel was successful, false otherwise
118
+ #
119
+ # @!visibility private
120
+ def cancel!
121
+ @timer.cancel
122
+ end
123
+
124
+ private
125
+
126
+ #
127
+ # Calls the block with thread locals set up, and cleans up after itself
128
+ #
129
+ # @return [void]
130
+ #
131
+ def execute
132
+ Thread.current[:openhab_rescheduled_timer] = self
133
+ DSL::ThreadLocal.thread_local(**@thread_locals) { @block.call(self) }
134
+ DSL.timers.delete(self) unless Thread.current[:openhab_rescheduled_timer] == true
135
+ Thread.current[:openhab_rescheduled_timer] = nil
136
+ end
137
+
138
+ #
139
+ # @return [ZonedDateTime]
140
+ #
141
+ def new_execution_time(time)
142
+ time = time.call if time.is_a?(Proc)
143
+ time = time.from_now if time.is_a?(java.time.temporal.TemporalAmount)
144
+ time.to_zoned_date_time
145
+ end
146
+ end
147
+ end
148
+ end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "type"
4
+
3
5
  module OpenHAB
4
- module DSL
5
- # Comparable#== is overwritten by Type, because DecimalType etc.
6
- # inherits from Comparable on the Java side, so it's in the wrong place
6
+ module Core
7
+ # `Comparable#==` is overwritten by Type, because {DecimalType} etc.
8
+ # inherit from `Comparable` on the Java side, so it's in the wrong place
7
9
  # in the ancestor list
8
10
  # @!visibility private
9
11
  module ComparableType