openhab-scripting 2.16.2 → 2.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab.rb +12 -16
  3. data/lib/openhab/core/entity_lookup.rb +173 -0
  4. data/lib/openhab/core/openhab_setup.rb +31 -0
  5. data/lib/openhab/core/osgi.rb +61 -0
  6. data/lib/openhab/dsl/actions.rb +105 -0
  7. data/lib/openhab/dsl/dsl.rb +49 -0
  8. data/lib/openhab/{core/dsl → dsl}/gems.rb +0 -1
  9. data/lib/openhab/dsl/group.rb +100 -0
  10. data/lib/openhab/dsl/items/datetime_item.rb +97 -0
  11. data/lib/openhab/dsl/items/items.rb +46 -0
  12. data/lib/openhab/dsl/items/number_item.rb +352 -0
  13. data/lib/openhab/dsl/items/rollershutter_item.rb +179 -0
  14. data/lib/openhab/dsl/items/string_item.rb +120 -0
  15. data/lib/openhab/dsl/monkey_patch/actions/actions.rb +4 -0
  16. data/lib/openhab/dsl/monkey_patch/actions/script_thing_actions.rb +32 -0
  17. data/lib/openhab/dsl/monkey_patch/events/events.rb +5 -0
  18. data/lib/openhab/dsl/monkey_patch/events/item_command.rb +23 -0
  19. data/lib/openhab/dsl/monkey_patch/events/item_state_changed.rb +35 -0
  20. data/lib/openhab/dsl/monkey_patch/events/thing_status_info.rb +33 -0
  21. data/lib/openhab/dsl/monkey_patch/items/contact_item.rb +61 -0
  22. data/lib/openhab/dsl/monkey_patch/items/dimmer_item.rb +193 -0
  23. data/lib/openhab/dsl/monkey_patch/items/group_item.rb +37 -0
  24. data/lib/openhab/dsl/monkey_patch/items/items.rb +133 -0
  25. data/lib/openhab/dsl/monkey_patch/items/metadata.rb +281 -0
  26. data/lib/openhab/dsl/monkey_patch/items/persistence.rb +70 -0
  27. data/lib/openhab/dsl/monkey_patch/items/switch_item.rb +95 -0
  28. data/lib/openhab/dsl/monkey_patch/ruby/number.rb +39 -0
  29. data/lib/openhab/dsl/monkey_patch/ruby/range.rb +47 -0
  30. data/lib/openhab/dsl/monkey_patch/ruby/ruby.rb +8 -0
  31. data/lib/openhab/dsl/monkey_patch/ruby/string.rb +41 -0
  32. data/lib/openhab/dsl/monkey_patch/ruby/time.rb +32 -0
  33. data/lib/openhab/dsl/monkey_patch/types/decimal_type.rb +70 -0
  34. data/lib/openhab/dsl/monkey_patch/types/on_off_type.rb +51 -0
  35. data/lib/openhab/dsl/monkey_patch/types/open_closed_type.rb +36 -0
  36. data/lib/openhab/dsl/monkey_patch/types/percent_type.rb +32 -0
  37. data/lib/openhab/dsl/monkey_patch/types/quantity_type.rb +69 -0
  38. data/lib/openhab/dsl/monkey_patch/types/types.rb +9 -0
  39. data/lib/openhab/dsl/monkey_patch/types/up_down_type.rb +33 -0
  40. data/lib/openhab/dsl/persistence.rb +25 -0
  41. data/lib/openhab/dsl/rules/automation_rule.rb +342 -0
  42. data/lib/openhab/dsl/rules/guard.rb +134 -0
  43. data/lib/openhab/dsl/rules/property.rb +102 -0
  44. data/lib/openhab/dsl/rules/rule.rb +116 -0
  45. data/lib/openhab/dsl/rules/rule_config.rb +151 -0
  46. data/lib/openhab/dsl/rules/triggers/changed.rb +143 -0
  47. data/lib/openhab/dsl/rules/triggers/channel.rb +53 -0
  48. data/lib/openhab/dsl/rules/triggers/command.rb +104 -0
  49. data/lib/openhab/dsl/rules/triggers/cron.rb +177 -0
  50. data/lib/openhab/dsl/rules/triggers/trigger.rb +124 -0
  51. data/lib/openhab/dsl/rules/triggers/updated.rb +98 -0
  52. data/lib/openhab/dsl/states.rb +61 -0
  53. data/lib/openhab/dsl/things.rb +91 -0
  54. data/lib/openhab/dsl/time_of_day.rb +232 -0
  55. data/lib/openhab/dsl/timers.rb +77 -0
  56. data/lib/openhab/dsl/types/datetime.rb +326 -0
  57. data/lib/openhab/dsl/types/quantity.rb +290 -0
  58. data/lib/openhab/dsl/units.rb +39 -0
  59. data/lib/openhab/log/configuration.rb +21 -0
  60. data/lib/openhab/log/logger.rb +172 -0
  61. data/lib/openhab/version.rb +1 -1
  62. metadata +60 -58
  63. data/lib/openhab/configuration.rb +0 -16
  64. data/lib/openhab/core/cron.rb +0 -27
  65. data/lib/openhab/core/debug.rb +0 -34
  66. data/lib/openhab/core/dsl.rb +0 -51
  67. data/lib/openhab/core/dsl/actions.rb +0 -107
  68. data/lib/openhab/core/dsl/entities.rb +0 -147
  69. data/lib/openhab/core/dsl/group.rb +0 -102
  70. data/lib/openhab/core/dsl/items/items.rb +0 -51
  71. data/lib/openhab/core/dsl/items/number_item.rb +0 -323
  72. data/lib/openhab/core/dsl/items/string_item.rb +0 -122
  73. data/lib/openhab/core/dsl/monkey_patch/actions/actions.rb +0 -4
  74. data/lib/openhab/core/dsl/monkey_patch/actions/script_thing_actions.rb +0 -22
  75. data/lib/openhab/core/dsl/monkey_patch/events.rb +0 -5
  76. data/lib/openhab/core/dsl/monkey_patch/events/item_command.rb +0 -13
  77. data/lib/openhab/core/dsl/monkey_patch/events/item_state_changed.rb +0 -25
  78. data/lib/openhab/core/dsl/monkey_patch/events/thing_status_info.rb +0 -26
  79. data/lib/openhab/core/dsl/monkey_patch/items/contact_item.rb +0 -54
  80. data/lib/openhab/core/dsl/monkey_patch/items/dimmer_item.rb +0 -182
  81. data/lib/openhab/core/dsl/monkey_patch/items/group_item.rb +0 -27
  82. data/lib/openhab/core/dsl/monkey_patch/items/items.rb +0 -132
  83. data/lib/openhab/core/dsl/monkey_patch/items/metadata.rb +0 -283
  84. data/lib/openhab/core/dsl/monkey_patch/items/persistence.rb +0 -72
  85. data/lib/openhab/core/dsl/monkey_patch/items/switch_item.rb +0 -87
  86. data/lib/openhab/core/dsl/monkey_patch/ruby/number.rb +0 -41
  87. data/lib/openhab/core/dsl/monkey_patch/ruby/range.rb +0 -47
  88. data/lib/openhab/core/dsl/monkey_patch/ruby/ruby.rb +0 -7
  89. data/lib/openhab/core/dsl/monkey_patch/ruby/string.rb +0 -43
  90. data/lib/openhab/core/dsl/monkey_patch/types/decimal_type.rb +0 -60
  91. data/lib/openhab/core/dsl/monkey_patch/types/on_off_type.rb +0 -41
  92. data/lib/openhab/core/dsl/monkey_patch/types/open_closed_type.rb +0 -25
  93. data/lib/openhab/core/dsl/monkey_patch/types/percent_type.rb +0 -23
  94. data/lib/openhab/core/dsl/monkey_patch/types/quantity_type.rb +0 -58
  95. data/lib/openhab/core/dsl/monkey_patch/types/types.rb +0 -8
  96. data/lib/openhab/core/dsl/persistence.rb +0 -27
  97. data/lib/openhab/core/dsl/property.rb +0 -96
  98. data/lib/openhab/core/dsl/rule/automation_rule.rb +0 -345
  99. data/lib/openhab/core/dsl/rule/guard.rb +0 -136
  100. data/lib/openhab/core/dsl/rule/rule.rb +0 -117
  101. data/lib/openhab/core/dsl/rule/rule_config.rb +0 -153
  102. data/lib/openhab/core/dsl/rule/triggers/changed.rb +0 -145
  103. data/lib/openhab/core/dsl/rule/triggers/channel.rb +0 -55
  104. data/lib/openhab/core/dsl/rule/triggers/command.rb +0 -106
  105. data/lib/openhab/core/dsl/rule/triggers/cron.rb +0 -160
  106. data/lib/openhab/core/dsl/rule/triggers/trigger.rb +0 -126
  107. data/lib/openhab/core/dsl/rule/triggers/updated.rb +0 -100
  108. data/lib/openhab/core/dsl/states.rb +0 -63
  109. data/lib/openhab/core/dsl/things.rb +0 -93
  110. data/lib/openhab/core/dsl/time_of_day.rb +0 -231
  111. data/lib/openhab/core/dsl/timers.rb +0 -79
  112. data/lib/openhab/core/dsl/types/quantity.rb +0 -292
  113. data/lib/openhab/core/dsl/units.rb +0 -41
  114. data/lib/openhab/core/log.rb +0 -170
  115. data/lib/openhab/core/patch_load_path.rb +0 -7
  116. data/lib/openhab/core/startup_delay.rb +0 -23
  117. data/lib/openhab/osgi.rb +0 -59
@@ -1,345 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'java'
4
-
5
- module OpenHAB
6
- module Core
7
- module DSL
8
- #
9
- # Creates and manages OpenHAB Rules
10
- #
11
- module Rule
12
- #
13
- # JRuby extension to OpenHAB Rule
14
- #
15
- # rubocop: disable Metrics/ClassLength
16
- # Disabled because this class has a single responsibility, there does not appear a logical
17
- # way of breaking it up into multiple classes
18
- class AutomationRule < Java::OrgOpenhabCoreAutomationModuleScriptRulesupportSharedSimple::SimpleRule
19
- include Logging
20
- include OpenHAB::Core::DSL::Tod
21
- java_import java.time.ZonedDateTime
22
-
23
- #
24
- # Create a new Rule
25
- #
26
- # @param [Config] config Rule configuration
27
- #
28
- def initialize(config:)
29
- super()
30
- set_name(config.name)
31
- set_description(config.description)
32
- set_triggers(config.triggers)
33
- @run_queue = config.run
34
- @guard = config.guard
35
- between = config.between&.yield_self { between(config.between) }
36
- @between = between || OpenHAB::Core::DSL::Tod::ALL_DAY
37
- # Convert between to correct range or nil if not set
38
- @trigger_delays = config.trigger_delays
39
- end
40
-
41
- #
42
- # Execute the rule
43
- #
44
- # @param [Map] mod map provided by OpenHAB rules engine
45
- # @param [Map] inputs map provided by OpenHAB rules engine containing event and other information
46
- #
47
- #
48
- def execute(mod = nil, inputs = nil)
49
- logger.trace { "Execute called with mod (#{mod&.to_string}) and inputs (#{inputs&.pretty_inspect}" }
50
- logger.trace { "Event details #{inputs['event'].pretty_inspect}" } if inputs&.key?('event')
51
- if trigger_delay inputs
52
- trigger_delay = trigger_delay(inputs)
53
- process_trigger_delay(trigger_delay, mod, inputs)
54
- else
55
- # If guards are satisfied execute the run type blocks
56
- # If they are not satisfied, execute the Othewise blocks
57
- queue = create_queue(inputs)
58
- process_queue(queue, mod, inputs)
59
- end
60
- end
61
-
62
- private
63
-
64
- #
65
- # Create the run queue based on guards
66
- #
67
- # @param [Map] inputs rule inputs
68
- #
69
- # @return [Queue] <description>
70
- #
71
- def create_queue(inputs)
72
- case check_guards(event: inputs&.dig('event'))
73
- when true
74
- @run_queue.dup
75
- when false
76
- @run_queue.dup.grep(RuleConfig::Otherwise)
77
- end
78
- end
79
-
80
- #
81
- # Returns trigger delay from inputs if it exists
82
- #
83
- # @param [Map] inputs map from OpenHAB containing UID
84
- #
85
- # @return [Array] Array of trigger delays that match rule UID
86
- #
87
- def trigger_delay(inputs)
88
- # Parse this to get the trigger UID:
89
- # ["72698819-83cb-498a-8e61-5aab8b812623.event", "oldState", "module", \
90
- # "72698819-83cb-498a-8e61-5aab8b812623.oldState", "event", "newState",\
91
- # "72698819-83cb-498a-8e61-5aab8b812623.newState"]
92
- @trigger_delays[inputs&.keys&.grep(/\.event$/)&.first&.chomp('.event')]
93
- end
94
-
95
- #
96
- # Check if trigger guards prevent rule execution
97
- #
98
- # @param [Delay] trigger_delay rules delaying trigger because of
99
- # @param [Map] inputs OpenHAB map object describing rule trigger
100
- #
101
- # @return [Boolean] True if the rule should execute, false if trigger guard prevents execution
102
- #
103
- def check_trigger_guards(trigger_delay, inputs)
104
- old_state = inputs['oldState']
105
- new_state = inputs['newState']
106
- if check_from(trigger_delay, old_state)
107
- return true if check_to(trigger_delay, new_state)
108
-
109
- logger.trace("Skipped execution of rule '#{name}' because to state #{new_state}"\
110
- " does not equal specified state(#{trigger_delay.to})")
111
- else
112
- logger.trace("Skipped execution of rule '#{name}' because old state #{old_state}"\
113
- " does not equal specified state(#{trigger_delay.from})")
114
- end
115
- end
116
-
117
- #
118
- # Check the from state against the trigger delay
119
- #
120
- # @param [TriggerDelay] trigger_delay Information about the trigger delay
121
- # @param [Item State] state from state to check
122
- #
123
- # @return [Boolean] true if no from state is defined or defined state equals supplied state
124
- #
125
- def check_from(trigger_delay, state)
126
- trigger_delay.from.nil? || trigger_delay.from == state
127
- end
128
-
129
- #
130
- # Check the to state against the trigger delay
131
- #
132
- # @param [TriggerDelay] trigger_delay Information about the trigger delay
133
- # @param [Item State] state to-state to check
134
- #
135
- # @return [Boolean] true if no to state is defined or defined state equals supplied state
136
- #
137
- def check_to(trigger_delay, state)
138
- trigger_delay.to.nil? || trigger_delay.to == state
139
- end
140
-
141
- #
142
- # Process any matching trigger delays
143
- #
144
- # @param [Map] mod OpenHAB map object describing rule trigger
145
- # @param [Map] inputs OpenHAB map object describing rule trigger
146
- #
147
- #
148
- def process_trigger_delay(trigger_delay, mod, inputs)
149
- if check_trigger_guards(trigger_delay, inputs)
150
- logger.trace("Trigger Guards Matched for #{trigger_delay}, delaying rule execution")
151
- # Add timer and attach timer to delay object, and also state being tracked to so timer can be cancelled if
152
- # state changes
153
- # Also another timer should not be created if changed to same value again but instead rescheduled
154
- if trigger_delay.timer_active?
155
- process_active_timer(inputs, mod, trigger_delay)
156
- else
157
- create_trigger_delay_timer(inputs, mod, trigger_delay)
158
- end
159
- else
160
- logger.trace("Trigger Guards did not match for #{trigger_delay}, ignoring trigger.")
161
- end
162
- end
163
-
164
- #
165
- # Creatas a timer for trigger delays
166
- #
167
- # @param [Hash] inputs rule trigger inputs
168
- # @param [Hash] mod rule trigger mods
169
- # @param [TriggerDelay] trigger_delay specifications
170
- #
171
- #
172
- def create_trigger_delay_timer(inputs, mod, trigger_delay)
173
- logger.trace("Creating timer for rule #{name} and trigger delay #{trigger_delay}")
174
- trigger_delay.timer = after(trigger_delay.duration) do
175
- logger.trace("Delay Complete for #{trigger_delay}, executing rule")
176
- trigger_delay.timer = nil
177
- process_queue(@run_queue.dup, mod, inputs)
178
- end
179
- trigger_delay.tracking_to = inputs['newState']
180
- end
181
-
182
- #
183
- # Process an active trigger timer
184
- #
185
- # @param [Hash] inputs rule trigger inputs
186
- # @param [Hash] mod rule trigger mods
187
- # @param [TriggerDelay] trigger_delay specifications
188
- #
189
- #
190
- def process_active_timer(inputs, mod, trigger_delay)
191
- state = inputs['newState']
192
- if state == trigger_delay.tracking_to
193
- logger.trace("Item changed to #{state} for #{trigger_delay}, rescheduling timer.")
194
- trigger_delay.timer.reschedule(ZonedDateTime.now.plus(duration))
195
- else
196
- logger.trace("Item changed to #{state} for #{trigger_delay}, cancelling timer.")
197
- trigger_delay.timer.cancel
198
- # Reprocess trigger delay after cancelling to track new state (if guards matched, etc)
199
- process_trigger_delay(trigger_delay, mod, inputs)
200
- end
201
- end
202
-
203
- #
204
- # Check if any guards prevent execution
205
- #
206
- # @param [Map] event OpenHAB rule trigger event
207
- #
208
- # @return [Boolean] True if guards says rule should execute, false otherwise
209
- #
210
- def check_guards(event:)
211
- if @guard.should_run? event
212
- now = TimeOfDay.now
213
- return true if @between.cover? now
214
-
215
- logger.trace("Skipped execution of rule '#{name}' because the current time #{now} "\
216
- "is not between #{@between.begin} and #{@between.end}")
217
- else
218
- logger.trace("Skipped execution of rule '#{name}' because of guard #{@guard}")
219
- end
220
- false
221
- end
222
-
223
- #
224
- # Patch event to decorate event.item with our item wrapper
225
- #
226
- # @param [OpenHAB Event] event patch
227
- #
228
- def decorate_event_item(event)
229
- return if event.nil?
230
-
231
- class << event
232
- def item
233
- EntityLookup.lookup_item(item_name)
234
- end
235
- end
236
- end
237
-
238
- #
239
- # Process the run queue
240
- #
241
- # @param [Array] run_queue array of procs of various types to execute
242
- # @param [Map] mod OpenHAB map object describing rule trigger
243
- # @param [Map] inputs OpenHAB map object describing rule trigge
244
- #
245
- #
246
- def process_queue(run_queue, mod, inputs)
247
- event = inputs&.dig('event')
248
-
249
- while (task = run_queue.shift)
250
- case task
251
- when RuleConfig::Run then process_run_task(event, inputs, task)
252
- when RuleConfig::Trigger then process_trigger_task(event, task)
253
- when RuleConfig::Delay then process_delay_task(inputs, mod, run_queue, task)
254
- when RuleConfig::Otherwise then process_otherwise_task(event, task)
255
- end
256
- end
257
- end
258
-
259
- #
260
- # Process an otherwise block
261
- #
262
- # @param [OpenHab Event] event that triggered the rule
263
- # @param [Task] task task containing otherwise block to execute
264
- #
265
- #
266
- def process_otherwise_task(event, task)
267
- decorate_event_item(event)
268
- logger.trace { "Executing rule '#{name}' otherwise block with event(#{event})" }
269
- task.block.call(event)
270
- end
271
-
272
- #
273
- # Process delay task
274
- #
275
- # @param [Map] inputs Rule trigger inputs
276
- # @param [Map] mod Rule modes
277
- # @param [Queue] run_queue Queue of tasks for this rule
278
- # @param [Delay] task to process
279
- #
280
- #
281
- def process_delay_task(inputs, mod, run_queue, task)
282
- remaining_queue = run_queue.slice!(0, run_queue.length)
283
- after(task.duration) { process_queue(remaining_queue, mod, inputs) }
284
- end
285
-
286
- #
287
- # Process a task that is caused by a group item
288
- #
289
- # @param [Map] event Rule event map
290
- # @param [Trigger] task to execute
291
- #
292
- #
293
- def process_trigger_task(event, task)
294
- triggering_item = EntityLookup.lookup_item(event&.itemName)
295
- logger.trace { "Executing rule '#{name}' trigger block with item (#{triggering_item})" }
296
- task.block.call(triggering_item) if triggering_item
297
- end
298
-
299
- #
300
- # Process a run task
301
- #
302
- # @param [OpenHab Event] event information
303
- # @param [Map] inputs of rule trigger information
304
- # @param [Run] task to execute
305
- #
306
- #
307
- def process_run_task(event, _inputs, task)
308
- decorate_event_item(event)
309
- logger.trace { "Executing rule '#{name}' run block with event(#{event})" }
310
- task.block.call(event)
311
- end
312
-
313
- #
314
- # Create a new hash in which all elements are converted to strings
315
- #
316
- # @param [Map] hash in which all elements should be converted to strings
317
- #
318
- # @return [Map] new map with values converted to strings
319
- #
320
- def inspect_hash(hash)
321
- hash.each_with_object({}) do |(key, value), new_hash|
322
- new_hash[inspect_item(key)] = inspect_item(value)
323
- end
324
- end
325
-
326
- #
327
- # Convert an individual element into a string based on if it a Ruby or Java object
328
- #
329
- # @param [Object] item to convert to a string
330
- #
331
- # @return [String] representation of item
332
- #
333
- def inspect_item(item)
334
- if item.respond_to? :to_string
335
- item.to_string
336
- elsif item.respond_to? :to_str
337
- item.to_str
338
- end
339
- end
340
- end
341
- end
342
- end
343
- end
344
- end
345
- # rubocop: enable Metrics/ClassLength
@@ -1,136 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'core/dsl/property'
4
- require 'core/log'
5
-
6
- module OpenHAB
7
- module Core
8
- module DSL
9
- module Rule
10
- #
11
- # Guards for rules
12
- #
13
- module Guard
14
- include DSLProperty
15
-
16
- prop_array(:only_if) do |item|
17
- unless item.is_a?(Proc) || item.respond_to?(:truthy?)
18
- raise ArgumentError, "Object passed to only_if must respond_to 'truthy?'"
19
- end
20
- end
21
-
22
- prop_array(:not_if) do |item|
23
- unless item.is_a?(Proc) || item.respond_to?(:truthy?)
24
- raise ArgumentError, "Object passed to not_if must respond_to 'truthy?'"
25
- end
26
- end
27
-
28
- #
29
- # Guard that can prevent execute of a rule if not satisfied
30
- #
31
- class Guard
32
- include Logging
33
-
34
- #
35
- # Create a new Guard
36
- #
37
- # @param [Object] only_if Item or Proc to use as guard
38
- # @param [Object] not_if Item or Proc to use as guard
39
- #
40
- def initialize(only_if: nil, not_if: nil)
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, event: event) && check(@not_if, check_type: :not_if, event: event)
64
- end
65
-
66
- private
67
-
68
- #
69
- # Check if guard is satisfied
70
- #
71
- # @param [Array] conditions to check
72
- # @param [Symbol] check_type type of check to perform (:only_if or :not_if)
73
- # @param [Event] event OpenHAB event to see if it satisfies the guard
74
- #
75
- # @return [Boolean] True if guard is satisfied, false otherwise
76
- #
77
- def check(conditions, check_type:, event:)
78
- return true if conditions.nil? || conditions.empty?
79
-
80
- procs, items = conditions.flatten.partition { |condition| condition.is_a? Proc }
81
- logger.trace("Procs: #{procs} Items: #{items}")
82
-
83
- items.each { |item| logger.trace("#{item} truthy? #{item.truthy?}") }
84
-
85
- process_check(check_type: check_type, event: event, items: items, procs: procs)
86
- end
87
-
88
- #
89
- # Execute the guard check
90
- #
91
- # @param [Symbol] check_type :only_if or :not_if to check
92
- # @param [OpenHAB Event] event event to check if meets guard
93
- # @param [Array<Item>] items to check if satisfy criteria
94
- # @param [Array] procs to check if satisfy criteria
95
- #
96
- # @return [Boolean] True if criteria are satisfied, false otherwise
97
- #
98
- def process_check(check_type:, event:, items:, procs:)
99
- case check_type
100
- when :only_if then process_only_if(event, items, procs)
101
- when :not_if then process_not_if(event, items, procs)
102
- else raise ArgumentError, "Unexpected check type: #{check_type}"
103
- end
104
- end
105
-
106
- #
107
- # Check not_if guard
108
- #
109
- # @param [OpenHAB Event] event event to check if meets guard
110
- # @param [Array<Item>] items to check if satisfy criteria
111
- # @param [Array] procs to check if satisfy criteria
112
- #
113
- # @return [Boolean] True if criteria are satisfied, false otherwise
114
- #
115
- def process_not_if(event, items, procs)
116
- items.none?(&:truthy?) && procs.none? { |proc| proc.call(event) }
117
- end
118
-
119
- #
120
- # Check only_if guard
121
- #
122
- # @param [OpenHAB Event] event event to check if meets guard
123
- # @param [Array<Item>] items to check if satisfy criteria
124
- # @param [Array] procs to check if satisfy criteria
125
- #
126
- # @return [Boolean] True if criteria are satisfied, false otherwise
127
- #
128
- def process_only_if(event, items, procs)
129
- items.all?(&:truthy?) && procs.all? { |proc| proc.call(event) }
130
- end
131
- end
132
- end
133
- end
134
- end
135
- end
136
- end