openhab-scripting 4.47.0 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab/core/actions/audio.rb +54 -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/item_state_updated_event.rb +22 -0
  23. data/lib/openhab/core/events/thing_status_info_event.rb +55 -0
  24. data/lib/openhab/core/events.rb +10 -0
  25. data/lib/openhab/core/items/accepted_data_types.rb +29 -0
  26. data/lib/openhab/core/items/color_item.rb +52 -0
  27. data/lib/openhab/core/items/contact_item.rb +52 -0
  28. data/lib/openhab/core/items/date_time_item.rb +59 -0
  29. data/lib/openhab/core/items/dimmer_item.rb +148 -0
  30. data/lib/openhab/core/items/generic_item.rb +292 -0
  31. data/lib/openhab/core/items/group_item.rb +176 -0
  32. data/lib/openhab/{dsl → core}/items/image_item.rb +35 -29
  33. data/lib/openhab/core/items/item.rb +273 -0
  34. data/lib/openhab/core/items/location_item.rb +34 -0
  35. data/lib/openhab/core/items/metadata/hash.rb +433 -0
  36. data/lib/openhab/core/items/metadata/namespace_hash.rb +475 -0
  37. data/lib/openhab/core/items/metadata/provider.rb +48 -0
  38. data/lib/openhab/core/items/metadata.rb +11 -0
  39. data/lib/openhab/core/items/number_item.rb +62 -0
  40. data/lib/openhab/core/items/numeric_item.rb +22 -0
  41. data/lib/openhab/core/items/persistence.rb +416 -0
  42. data/lib/openhab/core/items/player_item.rb +66 -0
  43. data/lib/openhab/core/items/provider.rb +44 -0
  44. data/lib/openhab/core/items/proxy.rb +136 -0
  45. data/lib/openhab/core/items/registry.rb +86 -0
  46. data/lib/openhab/core/items/rollershutter_item.rb +68 -0
  47. data/lib/openhab/core/items/semantics/enumerable.rb +177 -0
  48. data/lib/openhab/core/items/semantics.rb +473 -0
  49. data/lib/openhab/core/items/state_storage.rb +53 -0
  50. data/lib/openhab/core/items/string_item.rb +28 -0
  51. data/lib/openhab/core/items/switch_item.rb +78 -0
  52. data/lib/openhab/core/items.rb +108 -0
  53. data/lib/openhab/{dsl → core}/lazy_array.rb +9 -3
  54. data/lib/openhab/core/profile_factory.rb +132 -0
  55. data/lib/openhab/core/provider.rb +230 -0
  56. data/lib/openhab/core/proxy.rb +130 -0
  57. data/lib/openhab/core/registry.rb +40 -0
  58. data/lib/openhab/core/rules/module.rb +26 -0
  59. data/lib/openhab/core/rules/provider.rb +25 -0
  60. data/lib/openhab/core/rules/registry.rb +94 -0
  61. data/lib/openhab/core/rules/rule.rb +174 -0
  62. data/lib/openhab/core/rules.rb +25 -0
  63. data/lib/openhab/core/script_handling.rb +78 -20
  64. data/lib/openhab/core/things/channel.rb +48 -0
  65. data/lib/openhab/core/things/channel_uid.rb +51 -0
  66. data/lib/openhab/core/things/item_channel_link.rb +33 -0
  67. data/lib/openhab/core/things/links/provider.rb +78 -0
  68. data/lib/openhab/core/things/profile_callback.rb +52 -0
  69. data/lib/openhab/core/things/provider.rb +29 -0
  70. data/lib/openhab/core/things/proxy.rb +87 -0
  71. data/lib/openhab/core/things/registry.rb +73 -0
  72. data/lib/openhab/core/things/thing.rb +194 -0
  73. data/lib/openhab/core/things.rb +22 -0
  74. data/lib/openhab/core/timer.rb +148 -0
  75. data/lib/openhab/{dsl → core}/types/comparable_type.rb +5 -3
  76. data/lib/openhab/{dsl → core}/types/date_time_type.rb +55 -127
  77. data/lib/openhab/{dsl → core}/types/decimal_type.rb +50 -48
  78. data/lib/openhab/{dsl → core}/types/hsb_type.rb +35 -83
  79. data/lib/openhab/core/types/increase_decrease_type.rb +34 -0
  80. data/lib/openhab/core/types/next_previous_type.rb +34 -0
  81. data/lib/openhab/{dsl → core}/types/numeric_type.rb +20 -7
  82. data/lib/openhab/core/types/on_off_type.rb +46 -0
  83. data/lib/openhab/core/types/open_closed_type.rb +41 -0
  84. data/lib/openhab/{dsl → core}/types/percent_type.rb +19 -20
  85. data/lib/openhab/core/types/play_pause_type.rb +38 -0
  86. data/lib/openhab/core/types/point_type.rb +117 -0
  87. data/lib/openhab/core/types/quantity_type.rb +325 -0
  88. data/lib/openhab/core/types/raw_type.rb +26 -0
  89. data/lib/openhab/core/types/refresh_type.rb +27 -0
  90. data/lib/openhab/core/types/rewind_fastforward_type.rb +38 -0
  91. data/lib/openhab/core/types/stop_move_type.rb +34 -0
  92. data/lib/openhab/{dsl → core}/types/string_type.rb +17 -28
  93. data/lib/openhab/{dsl → core}/types/type.rb +42 -40
  94. data/lib/openhab/core/types/un_def_type.rb +38 -0
  95. data/lib/openhab/core/types/up_down_type.rb +50 -0
  96. data/lib/openhab/core/types.rb +82 -0
  97. data/lib/openhab/{dsl → core}/uid.rb +4 -23
  98. data/lib/openhab/core/value_cache.rb +188 -0
  99. data/lib/openhab/core.rb +98 -0
  100. data/lib/openhab/core_ext/between.rb +32 -0
  101. data/lib/openhab/core_ext/ephemeris.rb +53 -0
  102. data/lib/openhab/core_ext/java/class.rb +34 -0
  103. data/lib/openhab/core_ext/java/duration.rb +142 -0
  104. data/lib/openhab/core_ext/java/list.rb +436 -0
  105. data/lib/openhab/core_ext/java/local_date.rb +104 -0
  106. data/lib/openhab/core_ext/java/local_time.rb +118 -0
  107. data/lib/openhab/core_ext/java/map.rb +66 -0
  108. data/lib/openhab/core_ext/java/month.rb +71 -0
  109. data/lib/openhab/core_ext/java/month_day.rb +119 -0
  110. data/lib/openhab/core_ext/java/period.rb +103 -0
  111. data/lib/openhab/core_ext/java/temporal_amount.rb +34 -0
  112. data/lib/openhab/core_ext/java/time.rb +62 -0
  113. data/lib/openhab/core_ext/java/unit.rb +15 -0
  114. data/lib/openhab/core_ext/java/zoned_date_time.rb +213 -0
  115. data/lib/openhab/core_ext/ruby/array.rb +21 -0
  116. data/lib/openhab/core_ext/ruby/date.rb +96 -0
  117. data/lib/openhab/core_ext/ruby/date_time.rb +55 -0
  118. data/lib/openhab/core_ext/ruby/module.rb +15 -0
  119. data/lib/openhab/core_ext/ruby/numeric.rb +195 -0
  120. data/lib/openhab/core_ext/ruby/range.rb +70 -0
  121. data/lib/openhab/core_ext/ruby/symbol.rb +7 -0
  122. data/lib/openhab/core_ext/ruby/time.rb +108 -0
  123. data/lib/openhab/core_ext.rb +18 -0
  124. data/lib/openhab/dsl/debouncer.rb +259 -0
  125. data/lib/openhab/dsl/events/watch_event.rb +18 -0
  126. data/lib/openhab/dsl/events.rb +9 -0
  127. data/lib/openhab/dsl/gems.rb +1 -1
  128. data/lib/openhab/dsl/items/builder.rb +578 -0
  129. data/lib/openhab/dsl/items/ensure.rb +73 -82
  130. data/lib/openhab/dsl/items/timed_command.rb +214 -159
  131. data/lib/openhab/dsl/rules/automation_rule.rb +129 -116
  132. data/lib/openhab/dsl/rules/builder.rb +1935 -0
  133. data/lib/openhab/dsl/rules/guard.rb +51 -114
  134. data/lib/openhab/dsl/rules/name_inference.rb +66 -25
  135. data/lib/openhab/dsl/rules/property.rb +48 -75
  136. data/lib/openhab/dsl/rules/rule_triggers.rb +22 -27
  137. data/lib/openhab/dsl/rules/terse.rb +58 -14
  138. data/lib/openhab/dsl/rules/triggers/changed.rb +48 -94
  139. data/lib/openhab/dsl/rules/triggers/channel.rb +9 -40
  140. data/lib/openhab/dsl/rules/triggers/command.rb +14 -63
  141. data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +34 -69
  142. data/lib/openhab/dsl/rules/triggers/conditions/proc.rb +6 -14
  143. data/lib/openhab/dsl/rules/triggers/cron/cron.rb +48 -82
  144. data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +30 -47
  145. data/lib/openhab/dsl/rules/triggers/trigger.rb +7 -28
  146. data/lib/openhab/dsl/rules/triggers/updated.rb +21 -45
  147. data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +257 -102
  148. data/lib/openhab/dsl/rules/triggers.rb +12 -0
  149. data/lib/openhab/dsl/rules.rb +8 -0
  150. data/lib/openhab/dsl/things/builder.rb +299 -0
  151. data/lib/openhab/{core → dsl}/thread_local.rb +27 -17
  152. data/lib/openhab/dsl/timer_manager.rb +204 -0
  153. data/lib/openhab/dsl/version.rb +9 -0
  154. data/lib/openhab/dsl.rb +979 -0
  155. data/lib/openhab/log.rb +355 -0
  156. data/lib/openhab/osgi.rb +68 -0
  157. data/lib/openhab/rspec/configuration.rb +56 -0
  158. data/lib/openhab/rspec/example_group.rb +132 -0
  159. data/lib/openhab/rspec/helpers.rb +458 -0
  160. data/lib/openhab/rspec/hooks.rb +113 -0
  161. data/lib/openhab/rspec/jruby.rb +46 -0
  162. data/lib/openhab/rspec/karaf.rb +851 -0
  163. data/lib/openhab/rspec/mocks/bundle_install_support.rb +25 -0
  164. data/lib/openhab/rspec/mocks/bundle_resolver.rb +30 -0
  165. data/lib/openhab/rspec/mocks/event_admin.rb +146 -0
  166. data/lib/openhab/rspec/mocks/instance_method_stasher.rb +22 -0
  167. data/lib/openhab/rspec/mocks/persistence_service.rb +155 -0
  168. data/lib/openhab/rspec/mocks/safe_caller.rb +40 -0
  169. data/lib/openhab/rspec/mocks/space.rb +23 -0
  170. data/lib/openhab/rspec/mocks/synchronous_executor.rb +63 -0
  171. data/lib/openhab/rspec/mocks/thing_handler.rb +76 -0
  172. data/lib/openhab/rspec/mocks/timer.rb +134 -0
  173. data/lib/openhab/rspec/openhab/core/actions.rb +38 -0
  174. data/lib/openhab/rspec/openhab/core/items/proxy.rb +15 -0
  175. data/lib/openhab/rspec/openhab/core/things/proxy.rb +27 -0
  176. data/lib/openhab/rspec/shell.rb +31 -0
  177. data/lib/openhab/rspec/suspend_rules.rb +50 -0
  178. data/lib/openhab/rspec.rb +26 -0
  179. data/lib/openhab/yard/base_helper.rb +19 -0
  180. data/lib/openhab/yard/cli/stats.rb +23 -0
  181. data/lib/openhab/yard/code_objects/group_object.rb +23 -0
  182. data/lib/openhab/yard/code_objects/java/base.rb +31 -0
  183. data/lib/openhab/yard/code_objects/java/class_object.rb +11 -0
  184. data/lib/openhab/yard/code_objects/java/field_object.rb +15 -0
  185. data/lib/openhab/yard/code_objects/java/interface_object.rb +15 -0
  186. data/lib/openhab/yard/code_objects/java/package_object.rb +11 -0
  187. data/lib/openhab/yard/code_objects/java/proxy.rb +23 -0
  188. data/lib/openhab/yard/coderay.rb +17 -0
  189. data/lib/openhab/yard/handlers/jruby/base.rb +58 -0
  190. data/lib/openhab/yard/handlers/jruby/class_handler.rb +18 -0
  191. data/lib/openhab/yard/handlers/jruby/constant_handler.rb +18 -0
  192. data/lib/openhab/yard/handlers/jruby/java_import_handler.rb +30 -0
  193. data/lib/openhab/yard/handlers/jruby/mixin_handler.rb +23 -0
  194. data/lib/openhab/yard/html_helper.rb +78 -0
  195. data/lib/openhab/yard/markdown_helper.rb +148 -0
  196. data/lib/openhab/yard/tags/constant_directive.rb +20 -0
  197. data/lib/openhab/yard/tags/group_directive.rb +24 -0
  198. data/lib/openhab/yard/tags/library.rb +3 -0
  199. data/lib/openhab/yard.rb +38 -0
  200. metadata +476 -106
  201. data/lib/openhab/core/item_proxy.rb +0 -29
  202. data/lib/openhab/core/load_path.rb +0 -19
  203. data/lib/openhab/core/openhab_setup.rb +0 -29
  204. data/lib/openhab/core/osgi.rb +0 -58
  205. data/lib/openhab/core/services.rb +0 -24
  206. data/lib/openhab/dsl/actions.rb +0 -114
  207. data/lib/openhab/dsl/between.rb +0 -25
  208. data/lib/openhab/dsl/channel.rb +0 -43
  209. data/lib/openhab/dsl/dsl.rb +0 -59
  210. data/lib/openhab/dsl/group.rb +0 -54
  211. data/lib/openhab/dsl/imports.rb +0 -21
  212. data/lib/openhab/dsl/items/color_item.rb +0 -76
  213. data/lib/openhab/dsl/items/comparable_item.rb +0 -62
  214. data/lib/openhab/dsl/items/contact_item.rb +0 -41
  215. data/lib/openhab/dsl/items/date_time_item.rb +0 -65
  216. data/lib/openhab/dsl/items/dimmer_item.rb +0 -65
  217. data/lib/openhab/dsl/items/generic_item.rb +0 -229
  218. data/lib/openhab/dsl/items/group_item.rb +0 -127
  219. data/lib/openhab/dsl/items/item_equality.rb +0 -59
  220. data/lib/openhab/dsl/items/item_registry.rb +0 -54
  221. data/lib/openhab/dsl/items/items.rb +0 -109
  222. data/lib/openhab/dsl/items/location_item.rb +0 -59
  223. data/lib/openhab/dsl/items/metadata.rb +0 -326
  224. data/lib/openhab/dsl/items/number_item.rb +0 -17
  225. data/lib/openhab/dsl/items/numeric_item.rb +0 -87
  226. data/lib/openhab/dsl/items/persistence.rb +0 -307
  227. data/lib/openhab/dsl/items/player_item.rb +0 -58
  228. data/lib/openhab/dsl/items/rollershutter_item.rb +0 -51
  229. data/lib/openhab/dsl/items/semantics/enumerable.rb +0 -91
  230. data/lib/openhab/dsl/items/semantics.rb +0 -227
  231. data/lib/openhab/dsl/items/string_item.rb +0 -51
  232. data/lib/openhab/dsl/items/switch_item.rb +0 -70
  233. data/lib/openhab/dsl/monkey_patch/actions/actions.rb +0 -4
  234. data/lib/openhab/dsl/monkey_patch/actions/script_thing_actions.rb +0 -39
  235. data/lib/openhab/dsl/monkey_patch/events/events.rb +0 -7
  236. data/lib/openhab/dsl/monkey_patch/events/item_command.rb +0 -85
  237. data/lib/openhab/dsl/monkey_patch/events/item_event.rb +0 -28
  238. data/lib/openhab/dsl/monkey_patch/events/item_state.rb +0 -61
  239. data/lib/openhab/dsl/monkey_patch/events/item_state_changed.rb +0 -60
  240. data/lib/openhab/dsl/monkey_patch/events/thing_status_info.rb +0 -33
  241. data/lib/openhab/dsl/monkey_patch/java/java.rb +0 -4
  242. data/lib/openhab/dsl/monkey_patch/java/local_time.rb +0 -44
  243. data/lib/openhab/dsl/monkey_patch/java/time_extensions.rb +0 -50
  244. data/lib/openhab/dsl/monkey_patch/java/zoned_date_time.rb +0 -45
  245. data/lib/openhab/dsl/monkey_patch/ruby/number.rb +0 -104
  246. data/lib/openhab/dsl/monkey_patch/ruby/ruby.rb +0 -6
  247. data/lib/openhab/dsl/monkey_patch/ruby/string.rb +0 -47
  248. data/lib/openhab/dsl/monkey_patch/ruby/time.rb +0 -61
  249. data/lib/openhab/dsl/openhab.rb +0 -30
  250. data/lib/openhab/dsl/persistence.rb +0 -27
  251. data/lib/openhab/dsl/rules/item_event.rb +0 -19
  252. data/lib/openhab/dsl/rules/rule.rb +0 -160
  253. data/lib/openhab/dsl/rules/rule_config.rb +0 -147
  254. data/lib/openhab/dsl/rules/triggers/generic.rb +0 -31
  255. data/lib/openhab/dsl/rules/triggers/triggers.rb +0 -11
  256. data/lib/openhab/dsl/rules/triggers/watch/watch.rb +0 -81
  257. data/lib/openhab/dsl/states.rb +0 -89
  258. data/lib/openhab/dsl/things.rb +0 -147
  259. data/lib/openhab/dsl/time/month_day.rb +0 -180
  260. data/lib/openhab/dsl/time/time_of_day.rb +0 -235
  261. data/lib/openhab/dsl/timers/manager.rb +0 -119
  262. data/lib/openhab/dsl/timers/reentrant_timer.rb +0 -38
  263. data/lib/openhab/dsl/timers/timer.rb +0 -132
  264. data/lib/openhab/dsl/timers.rb +0 -77
  265. data/lib/openhab/dsl/types/increase_decrease_type.rb +0 -23
  266. data/lib/openhab/dsl/types/next_previous_type.rb +0 -23
  267. data/lib/openhab/dsl/types/on_off_type.rb +0 -28
  268. data/lib/openhab/dsl/types/open_closed_type.rb +0 -29
  269. data/lib/openhab/dsl/types/play_pause_type.rb +0 -27
  270. data/lib/openhab/dsl/types/point_type.rb +0 -180
  271. data/lib/openhab/dsl/types/quantity_type.rb +0 -265
  272. data/lib/openhab/dsl/types/refresh_type.rb +0 -18
  273. data/lib/openhab/dsl/types/rewind_fastforward_type.rb +0 -33
  274. data/lib/openhab/dsl/types/stop_move_type.rb +0 -23
  275. data/lib/openhab/dsl/types/types.rb +0 -83
  276. data/lib/openhab/dsl/types/un_def_type.rb +0 -22
  277. data/lib/openhab/dsl/types/up_down_type.rb +0 -32
  278. data/lib/openhab/dsl/units.rb +0 -45
  279. data/lib/openhab/log/configuration.rb +0 -21
  280. data/lib/openhab/log/logger.rb +0 -282
  281. data/lib/openhab/version.rb +0 -9
  282. data/lib/openhab.rb +0 -38
@@ -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