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
@@ -1,134 +1,71 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'openhab/dsl/rules/property'
4
- require 'openhab/log/logger'
5
-
6
3
  module OpenHAB
7
4
  module DSL
8
5
  module Rules
9
6
  #
10
- # Guards for rules
7
+ # Guard that can prevent execution of a rule if not satisfied
11
8
  #
12
- module Guard
13
- include OpenHAB::DSL::Rules::Property
14
-
15
- prop_array(:only_if) do |item|
16
- unless item.is_a?(Proc) || [item].flatten.all? { |it| it.respond_to?(:truthy?) }
17
- raise ArgumentError, "Object passed to only_if must respond_to 'truthy?'"
18
- end
9
+ # @!visibility private
10
+ class Guard
11
+ #
12
+ # Create a new Guard
13
+ #
14
+ # @param [Array<Proc>] only_if Array of Procs to use as guard
15
+ # @param [Array<Proc>] not_if Array of Procs to use as guard
16
+ #
17
+ def initialize(run_context:, only_if: nil, not_if: nil)
18
+ @run_context = run_context
19
+ @only_if = only_if
20
+ @not_if = not_if
19
21
  end
20
22
 
21
- prop_array(:not_if) do |item|
22
- unless item.is_a?(Proc) || [item].flatten.all? { |it| it.respond_to?(:truthy?) }
23
- raise ArgumentError, "Object passed to not_if must respond_to 'truthy?'"
24
- end
23
+ #
24
+ # Convert the guard into a string
25
+ #
26
+ # @return [String] describing the only_of and not_if guards
27
+ #
28
+ def to_s
29
+ "only_if: #{@only_if}, not_if: #{@not_if}"
25
30
  end
26
31
 
27
32
  #
28
- # Guard that can prevent execute of a rule if not satisfied
33
+ # Checks if a guard should run
29
34
  #
30
- class Guard
31
- include OpenHAB::Log
32
-
33
- #
34
- # Create a new Guard
35
- #
36
- # @param [Object] only_if Item or Proc to use as guard
37
- # @param [Object] not_if Item or Proc to use as guard
38
- #
39
- def initialize(run_context:, only_if: nil, not_if: nil)
40
- @run_context = run_context
41
- @only_if = only_if
42
- @not_if = not_if
43
- end
44
-
45
- #
46
- # Convert the guard into a string
47
- #
48
- # @return [String] describing the only_of and not_if guards
49
- #
50
- def to_s
51
- "only_if: #{@only_if}, not_if: #{@not_if}"
52
- end
53
-
54
- #
55
- # Checks if a guard should run
56
- #
57
- # @param [OpenHAB Trigger Event] event OpenHAB Trigger Event
58
- #
59
- # @return [Boolean] True if guard is satisfied, false otherwise
60
- #
61
- def should_run?(event)
62
- logger.trace("Checking guards #{self}")
63
- check(@only_if, :check_type => :only_if,
64
- :event => event) && check(@not_if, :check_type => :not_if, :event => event)
65
- end
66
-
67
- private
68
-
69
- #
70
- # Check if guard is satisfied
71
- #
72
- # @param [Array] conditions to check
73
- # @param [Symbol] check_type type of check to perform (:only_if or :not_if)
74
- # @param [Event] event OpenHAB event to see if it satisfies the guard
75
- #
76
- # @return [Boolean] True if guard is satisfied, false otherwise
77
- #
78
- def check(conditions, check_type:, event:)
79
- return true if conditions.nil? || conditions.empty?
80
-
81
- procs, items = conditions.flatten.partition { |condition| condition.is_a? Proc }
82
- logger.trace("Procs: #{procs} Items: #{items}")
83
-
84
- items.each { |item| logger.trace { "#{item} truthy? #{item.truthy?}" } }
35
+ # @param [Object] event openHAB Trigger Event
36
+ #
37
+ # @return [true,false] True if guard is satisfied, false otherwise
38
+ #
39
+ def should_run?(event)
40
+ logger.trace("Checking guards #{self}")
41
+ return false unless check_only_if(event)
42
+ return false unless check_not_if(event)
85
43
 
86
- process_check(check_type: check_type, event: event, items: items, procs: procs)
87
- end
44
+ true
45
+ end
88
46
 
89
- #
90
- # Execute the guard check
91
- #
92
- # @param [Symbol] check_type :only_if or :not_if to check
93
- # @param [OpenHAB Event] event event to check if meets guard
94
- # @param [Array<Item>] items to check if satisfy criteria
95
- # @param [Array] procs to check if satisfy criteria
96
- #
97
- # @return [Boolean] True if criteria are satisfied, false otherwise
98
- #
99
- def process_check(check_type:, event:, items:, procs:)
100
- case check_type
101
- when :only_if then process_only_if(event, items, procs)
102
- when :not_if then process_not_if(event, items, procs)
103
- else raise ArgumentError, "Unexpected check type: #{check_type}"
104
- end
105
- end
47
+ private
106
48
 
107
- #
108
- # Check not_if guard
109
- #
110
- # @param [OpenHAB Event] event to check if meets guard
111
- # @param [Array<Item>] items to check if satisfy criteria
112
- # @param [Array] procs to check if satisfy criteria
113
- #
114
- # @return [Boolean] True if criteria are satisfied, false otherwise
115
- #
116
- def process_not_if(event, items, procs)
117
- items.flatten.none?(&:truthy?) && procs.none? { |proc| @run_context.instance_exec(event, &proc) }
118
- end
49
+ #
50
+ # Check not_if guards
51
+ #
52
+ # @param [Object] event to check if meets guard
53
+ #
54
+ # @return [true,false] True if criteria are satisfied, false otherwise
55
+ #
56
+ def check_not_if(event)
57
+ @not_if.nil? || @not_if.none? { |proc| @run_context.instance_exec(event, &proc) }
58
+ end
119
59
 
120
- #
121
- # Check only_if guard
122
- #
123
- # @param [OpenHAB Event] event to check if meets guard
124
- # @param [Array<Item>] items to check if satisfy criteria
125
- # @param [Array] procs to check if satisfy criteria
126
- #
127
- # @return [Boolean] True if criteria are satisfied, false otherwise
128
- #
129
- def process_only_if(event, items, procs)
130
- items.flatten.all?(&:truthy?) && procs.all? { |proc| @run_context.instance_exec(event, &proc) }
131
- end
60
+ #
61
+ # Check only_if guards
62
+ #
63
+ # @param [Object] event to check if meets guard
64
+ #
65
+ # @return [true,false] True if criteria are satisfied, false otherwise
66
+ #
67
+ def check_only_if(event)
68
+ @only_if.nil? || @only_if.all? { |proc| @run_context.instance_exec(event, &proc) }
132
69
  end
133
70
  end
134
71
  end
@@ -1,19 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "triggers/cron/cron"
4
+
3
5
  module OpenHAB
4
6
  module DSL
5
7
  module Rules
6
8
  # Contains helper methods for inferring a rule name from its triggers
9
+ # @!visibility private
7
10
  module NameInference
8
11
  # Trigger Type UIDs that we know how to generate a name for
9
12
  KNOWN_TRIGGER_TYPES = [
10
- 'core.ChannelEventTrigger',
11
- 'core.GroupCommandTrigger',
12
- 'core.GroupStateChangeTrigger',
13
- 'core.GroupStateUpdateTrigger',
14
- 'core.ItemCommandTrigger',
15
- 'core.ItemStateChangeTrigger',
16
- 'core.ItemStateUpdateTrigger',
13
+ "core.ChannelEventTrigger",
14
+ "core.GenericEventTrigger",
15
+ "core.GroupCommandTrigger",
16
+ "core.GroupStateChangeTrigger",
17
+ "core.GroupStateUpdateTrigger",
18
+ "core.ItemCommandTrigger",
19
+ "core.ItemStateChangeTrigger",
20
+ "core.ItemStateUpdateTrigger",
21
+ "core.SystemStartlevelTrigger",
17
22
  Triggers::Cron::CRON_TRIGGER_MODULE_ID
18
23
  ].freeze
19
24
  private_constant :KNOWN_TRIGGER_TYPES
@@ -26,13 +31,13 @@ module OpenHAB
26
31
  end
27
32
 
28
33
  # formulate a readable rule name such as "TestSwitch received command ON" if possible
29
- def infer_rule_name(config) # rubocop:disable Metrics
34
+ def infer_rule_name(config)
30
35
  known_triggers, unknown_triggers = config.triggers.partition do |t|
31
36
  KNOWN_TRIGGER_TYPES.include?(t.type_uid)
32
37
  end
33
38
  return nil unless unknown_triggers.empty?
34
39
 
35
- cron_triggers = known_triggers.select { |t| t.type_uid == 'jsr223.jruby.CronTrigger' }
40
+ cron_triggers = known_triggers.select { |t| t.type_uid == "jsr223.jruby.CronTrigger" }
36
41
  ruby_every_triggers = config.ruby_triggers.select { |t| t.first == :every }
37
42
 
38
43
  # makes sure there aren't any true cron triggers cause we can't format them
@@ -45,7 +50,7 @@ module OpenHAB
45
50
  private
46
51
 
47
52
  # formulate a readable rule name from a single trigger if possible
48
- def infer_rule_name_from_trigger(trigger, items, kwargs)
53
+ def infer_rule_name_from_trigger(trigger, items = nil, kwargs = {})
49
54
  case trigger
50
55
  when :every
51
56
  infer_rule_name_from_every_trigger(items, **kwargs)
@@ -53,11 +58,19 @@ module OpenHAB
53
58
  infer_rule_name_from_channel_trigger(items, **kwargs)
54
59
  when :changed, :updated, :received_command
55
60
  infer_rule_name_from_item_trigger(trigger, items, kwargs)
61
+ when :channel_linked, :channel_unlinked
62
+ infer_rule_name_from_channel_link_trigger(trigger)
63
+ when :item_added, :item_removed, :item_updated
64
+ infer_rule_name_from_item_registry_trigger(trigger)
65
+ when :thing_added, :thing_removed, :thing_updated
66
+ infer_rule_name_from_thing_trigger(trigger)
67
+ when :on_start
68
+ infer_rule_name_from_on_start_trigger(items)
56
69
  end
57
70
  end
58
71
 
59
72
  # formulate a readable rule name from an item-type trigger
60
- def infer_rule_name_from_item_trigger(trigger, items, kwargs) # rubocop:disable Metrics
73
+ def infer_rule_name_from_item_trigger(trigger, items, kwargs)
61
74
  kwargs.delete(:command) if kwargs[:command] == [nil]
62
75
  return unless items.length <= 3 &&
63
76
  (kwargs.keys - %i[from to command duration]).empty?
@@ -68,15 +81,15 @@ module OpenHAB
68
81
  v.is_a?(Proc) || v.is_a?(Enumerable)
69
82
  end
70
83
 
71
- trigger_name = trigger.to_s.tr('_', ' ')
84
+ trigger_name = trigger.to_s.tr("_", " ")
72
85
  item_names = items.map do |item|
73
- if item.is_a?(GroupItem::GroupMembers)
86
+ if item.is_a?(GroupItem::Members)
74
87
  "#{item.group.name}.members"
75
88
  else
76
89
  item.name
77
90
  end
78
91
  end
79
- name = "#{format_beginning_of_sentence_array(item_names)} #{trigger_name}"
92
+ name = "#{format_array(item_names)} #{trigger_name}"
80
93
 
81
94
  name += " from #{format_inspected_array(kwargs[:from])}" if kwargs[:from]
82
95
  name += " to #{format_inspected_array(kwargs[:to])}" if kwargs[:to]
@@ -95,20 +108,48 @@ module OpenHAB
95
108
  # formulate a readable rule name from a channel trigger
96
109
  def infer_rule_name_from_channel_trigger(channels, triggers:)
97
110
  triggers = [] if triggers == [nil]
98
- name = "#{format_beginning_of_sentence_array(channels)} triggered"
111
+ name = "#{format_array(channels)} triggered"
99
112
  name += " #{format_inspected_array(triggers)}" unless triggers.empty?
100
113
  name
101
114
  end
102
115
 
103
- # format an array of words that will be the beginning of a sentence
104
- def format_beginning_of_sentence_array(array)
105
- result = format_array(array)
106
- if array.length > 2
107
- result = result.dup
108
- result[0] = 'A'
109
- result.freeze
110
- end
111
- result
116
+ # formulate a readable rule name from a channel link trigger
117
+ def infer_rule_name_from_channel_link_trigger(trigger)
118
+ (trigger == :channel_linked) ? "Channel linked to item" : "Channel unlinked from item"
119
+ end
120
+
121
+ # formulate a readable rule name from an item added/updated/remove trigger
122
+ def infer_rule_name_from_item_registry_trigger(trigger)
123
+ {
124
+ item_added: "Item added",
125
+ item_updated: "Item updated",
126
+ item_removed: "Item removed"
127
+ }[trigger]
128
+ end
129
+
130
+ # formulate a readable rule name from a thing added/updated/remove trigger
131
+ def infer_rule_name_from_thing_trigger(trigger)
132
+ {
133
+ thing_added: "Thing Added",
134
+ thing_updated: "Thing updated",
135
+ thing_removed: "Thing removed"
136
+ }[trigger]
137
+ end
138
+
139
+ # formulate a readable rule name from an on_start trigger
140
+ def infer_rule_name_from_on_start_trigger(levels)
141
+ levels = levels.map { |level| "#{level} (#{start_level_description(level)})" }
142
+ levels = format_array(levels)
143
+ "System Start Level reached #{levels}"
144
+ end
145
+
146
+ def start_level_description(level)
147
+ klass = org.openhab.core.service.StartLevelService.java_class
148
+ start_level_type = klass.declared_field("STARTLEVEL_OSGI").type
149
+ klass.declared_fields
150
+ .select { |field| field.type == start_level_type && field.name.start_with?("STARTLEVEL_") }
151
+ .find { |field| field.get_int(klass) == level }
152
+ .name.split("_", 2).last.downcase
112
153
  end
113
154
 
114
155
  # format an array of items that need to be inspected individually
@@ -124,7 +165,7 @@ module OpenHAB
124
165
  return array[0] if array.length == 1
125
166
  return "#{array[0]} or #{array[1]}" if array.length == 2
126
167
 
127
- "any of #{array.join(', ')}"
168
+ "#{array[0..-2].join(", ")}, or #{array[-1]}"
128
169
  end
129
170
  end
130
171
  end
@@ -1,101 +1,74 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'openhab/log/logger'
4
-
5
3
  module OpenHAB
6
4
  module DSL
7
5
  module Rules
8
6
  #
9
7
  # Provides methods to support DSL properties
10
8
  #
9
+ # @visibility private
11
10
  module Property
12
- include OpenHAB::Log
13
-
14
11
  #
15
- # Extend the calling object with the property methods
12
+ # Dynamically creates a property that acts as an accessor with no arguments
13
+ # and a setter with any number of arguments or a block.
16
14
  #
17
- # @param [Object] base object to extend
15
+ # @param [String] name of the property
18
16
  #
19
- #
20
- def self.included(base)
21
- base.extend PropertyMethods
17
+ def prop(name)
18
+ # rubocop rules are disabled because this method is dynamically defined on the calling
19
+ # object making calls to other methods in this module impossible, or if done on methods
20
+ # in this module than instance variable belong to the module not the calling class
21
+ define_method(name) do |*args, &block|
22
+ if args.empty? && block.nil? == true
23
+ instance_variable_get("@#{name}")
24
+ else
25
+ logger.trace("Property '#{name}' called with args(#{args}) and block(#{block})")
26
+ if args.length == 1
27
+ instance_variable_set("@#{name}", args.first)
28
+ elsif args.length > 1
29
+ instance_variable_set("@#{name}", args)
30
+ elsif block
31
+ instance_variable_set("@#{name}", block)
32
+ end
33
+ end
34
+ end
22
35
  end
23
36
 
24
37
  #
25
- # Methods that support creating properties in the DSL
38
+ # Dynamically creates a property array that acts as an accessor with no arguments
39
+ # and pushes any number of arguments or a block onto the property array
40
+ # You can provide a block to this method which can be used to check if the provided value is acceptable.
41
+ #
42
+ # @param [String] name of the property
43
+ # @param [String] array_name name of the array to use, defaults to name of property
44
+ # @param [Class] wrapper object to put around elements added to the array
26
45
  #
27
- module PropertyMethods
28
- #
29
- # Dynamically creates a property that acts and an accessor with no arguments
30
- # and a setter with any number of arguments or a block.
31
- #
32
- # @param [String] name of the property
33
- #
34
- #
35
- # rubocop:disable Metrics/MethodLength
36
- # rubocop:disable Metrics/AbcSize
37
- # rubocop:disable Metrics/CyclomaticComplexity
38
- # rubocop:disable Metrics/PerceivedComplexity
39
- def prop(name)
40
- # rubocop rules are disabled because this method is dynamically defined on the calling
41
- # object making calls to other methods in this module impossible, or if done on methods
42
- # in this module than instance variable belong to the module not the calling class
43
- define_method(name) do |*args, &block|
44
- if args.length.zero? && block.nil? == true
45
- instance_variable_get("@#{name}")
46
- else
47
- logger.trace("Property '#{name}' called with args(#{args}) and block(#{block})")
48
- if args.length == 1
49
- instance_variable_set("@#{name}", args.first)
50
- elsif args.length > 1
51
- instance_variable_set("@#{name}", args)
52
- elsif block
53
- instance_variable_set("@#{name}", block)
54
- end
46
+ def prop_array(name, array_name: nil, wrapper: nil)
47
+ define_method(name) do |*args, &block|
48
+ array_name ||= name
49
+ if args.empty? && block.nil? == true
50
+ instance_variable_get("@#{array_name}")
51
+ else
52
+ logger.trace("Property '#{name}' called with args(#{args}) and block(#{block})")
53
+ if args.length == 1
54
+ insert = args.first
55
+ elsif args.length > 1
56
+ insert = args
57
+ elsif block
58
+ insert = block
55
59
  end
60
+ yield insert if block_given?
61
+ insert = wrapper.new(insert) if wrapper
62
+ instance_variable_set("@#{array_name}", (instance_variable_get("@#{array_name}") || []) << insert)
56
63
  end
57
64
  end
58
65
 
59
- #
60
- # Dynamically creates a property array acts and an accessor with no arguments
61
- # and a pushes any number of arguments or a block onto they property array
62
- # You can provide a block to this method which can be used to check if the provided value is acceptable.
63
- #
64
- # @param [String] name of the property
65
- # @param [String] array_name name of the array to use, defaults to name of property
66
- # @param [Class] wrapper object to put around elements added to the array
67
- #
68
- def prop_array(name, array_name: nil, wrapper: nil)
69
- define_method(name) do |*args, &block|
70
- array_name ||= name
71
- if args.length.zero? && block.nil? == true
72
- instance_variable_get("@#{array_name}")
73
- else
74
- logger.trace("Property '#{name}' called with args(#{args}) and block(#{block})")
75
- if args.length == 1
76
- insert = args.first
77
- elsif args.length > 1
78
- insert = args
79
- elsif block
80
- insert = block
81
- end
82
- yield insert if block_given?
83
- insert = wrapper.new(insert) if wrapper
84
- instance_variable_set("@#{array_name}", (instance_variable_get("@#{array_name}") || []) << insert)
85
- end
86
- end
87
-
88
- return unless array_name
66
+ return unless array_name
89
67
 
90
- define_method(array_name) do
91
- instance_variable_get("@#{array_name}")
92
- end
68
+ define_method(array_name) do
69
+ instance_variable_get("@#{array_name}")
93
70
  end
94
71
  end
95
- # rubocop:enable Metrics/MethodLength
96
- # rubocop:enable Metrics/AbcSize
97
- # rubocop:enable Metrics/CyclomaticComplexity
98
- # rubocop:enable Metrics/PerceivedComplexity
99
72
  end
100
73
  end
101
74
  end
@@ -1,26 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
4
- require 'java'
5
- require 'securerandom'
6
- require 'openhab/log/logger'
7
- require_relative 'triggers/conditions/proc'
3
+ require "forwardable"
4
+
5
+ require "securerandom"
6
+
7
+ require_relative "triggers/conditions/proc"
8
8
 
9
9
  module OpenHAB
10
10
  module DSL
11
- #
12
- # Creates and manages OpenHAB Rules
13
- #
14
11
  module Rules
15
12
  #
16
- # Rule configuration for OpenHAB Rules engine
13
+ # Rule configuration for openHAB Rules engine
17
14
  #
15
+ # @!visibility private
18
16
  class RuleTriggers
19
- include OpenHAB::Log
20
-
21
- java_import org.openhab.core.automation.util.TriggerBuilder
22
- java_import org.openhab.core.config.core.Configuration
23
-
24
17
  # @return [Array] Of triggers
25
18
  attr_accessor :triggers
26
19
 
@@ -35,7 +28,7 @@ module OpenHAB
35
28
  #
36
29
  def initialize
37
30
  @triggers = []
38
- @trigger_conditions = Hash.new(OpenHAB::DSL::Rules::Triggers::Conditions::Proc::ANY)
31
+ @trigger_conditions = Hash.new(Triggers::Conditions::Proc::ANY)
39
32
  @attachments = {}
40
33
  end
41
34
 
@@ -46,12 +39,12 @@ module OpenHAB
46
39
  # @param [Map] config map describing trigger configuration
47
40
  # @param [Object] attach object to be attached to the trigger
48
41
  #
49
- # @return [Trigger] OpenHAB trigger
42
+ # @return [org.openhab.core.automation.Trigger] openHAB trigger
50
43
  #
51
44
  def append_trigger(type:, config:, attach: nil, conditions: nil)
52
45
  config.transform_keys!(&:to_s)
53
46
  RuleTriggers.trigger(type: type, config: config).tap do |trigger|
54
- logger.trace("Appending trigger (#{trigger}) attach (#{attach}) conditions(#{conditions})")
47
+ logger.trace("Appending trigger (#{trigger.inspect}) attach (#{attach}) conditions(#{conditions})")
55
48
  @triggers << trigger
56
49
  @attachments[trigger.id] = attach if attach
57
50
  @trigger_conditions[trigger.id] = conditions if conditions
@@ -64,15 +57,15 @@ module OpenHAB
64
57
  # @param [String] type of trigger
65
58
  # @param [Map] config map
66
59
  #
67
- # @return [OpenHAB Trigger] configured by type and supplied config
60
+ # @return [org.openhab.core.automation.Trigger] configured by type and supplied config
68
61
  #
69
62
  def self.trigger(type:, config:)
70
63
  logger.trace("Creating trigger of type '#{type}' config: #{config}")
71
- TriggerBuilder.create
72
- .with_id(uuid)
73
- .with_type_uid(type)
74
- .with_configuration(Configuration.new(config))
75
- .build
64
+ org.openhab.core.automation.util.TriggerBuilder.create
65
+ .with_id(uuid)
66
+ .with_type_uid(type)
67
+ .with_configuration(org.openhab.core.config.core.Configuration.new(config))
68
+ .build
76
69
  end
77
70
 
78
71
  #
@@ -90,10 +83,12 @@ module OpenHAB
90
83
  # @return [String] details of the config object
91
84
  #
92
85
  def inspect
93
- "Triggers: (#{triggers}) " \
94
- "Trigger Conditions: #{trigger_conditions} " \
95
- "Trigger UIDs: #{triggers.map(&:id).join(', ')}" \
96
- "Attachments: #{attachments} "
86
+ <<~TEXT.tr("\n", " ")
87
+ #<RuleTriggers #{triggers.inspect}
88
+ Conditions: #{trigger_conditions.inspect}
89
+ UIDs: #{triggers.map(&:id).inspect}
90
+ Attachments: #{attachments.inspect}>
91
+ TEXT
97
92
  end
98
93
  end
99
94
  end