openhab-jrubyscripting 5.0.0.rc9 → 5.0.0.rc11
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.
- checksums.yaml +4 -4
- data/lib/openhab/core/actions/audio.rb +47 -0
- data/lib/openhab/core/actions/ephemeris.rb +39 -0
- data/lib/openhab/core/actions/exec.rb +51 -0
- data/lib/openhab/core/actions/http.rb +80 -0
- data/lib/openhab/core/actions/ping.rb +30 -0
- data/lib/openhab/core/actions/transformation.rb +32 -0
- data/lib/openhab/core/actions/voice.rb +36 -0
- data/lib/openhab/core/actions.rb +23 -120
- data/lib/openhab/core/{events → dto}/item_channel_link.rb +1 -4
- data/lib/openhab/core/{events → dto}/thing.rb +10 -12
- data/lib/openhab/core/dto.rb +11 -0
- data/lib/openhab/core/entity_lookup.rb +1 -1
- data/lib/openhab/core/events/abstract_event.rb +1 -0
- data/lib/openhab/core/events/abstract_item_registry_event.rb +36 -0
- data/lib/openhab/core/events/abstract_thing_registry_event.rb +40 -0
- data/lib/openhab/core/events/item_command_event.rb +1 -1
- data/lib/openhab/core/events/item_state_changed_event.rb +6 -6
- data/lib/openhab/core/events/item_state_event.rb +6 -6
- data/lib/openhab/core/events/thing_status_info_event.rb +8 -6
- data/lib/openhab/core/items/generic_item.rb +2 -1
- data/lib/openhab/core/items/persistence.rb +52 -18
- data/lib/openhab/core/items/player_item.rb +1 -1
- data/lib/openhab/core/items/proxy.rb +20 -14
- data/lib/openhab/core/items/registry.rb +2 -0
- data/lib/openhab/core/items.rb +3 -3
- data/lib/openhab/core/profile_factory.rb +3 -1
- data/lib/openhab/core/proxy.rb +125 -0
- data/lib/openhab/core/things/links/provider.rb +1 -1
- data/lib/openhab/core/things/proxy.rb +8 -0
- data/lib/openhab/core/types/date_time_type.rb +2 -1
- data/lib/openhab/core/types/decimal_type.rb +1 -1
- data/lib/openhab/core/types/un_def_type.rb +2 -2
- data/lib/openhab/core/value_cache.rb +1 -1
- data/lib/openhab/core_ext/ephemeris.rb +53 -0
- data/lib/openhab/core_ext/java/class.rb +1 -1
- data/lib/openhab/core_ext/java/duration.rb +25 -1
- data/lib/openhab/core_ext/java/local_date.rb +2 -0
- data/lib/openhab/core_ext/java/month_day.rb +2 -0
- data/lib/openhab/core_ext/java/zoned_date_time.rb +85 -0
- data/lib/openhab/core_ext/ruby/date.rb +2 -0
- data/lib/openhab/core_ext/ruby/date_time.rb +1 -0
- data/lib/openhab/core_ext/ruby/time.rb +1 -0
- data/lib/openhab/dsl/debouncer.rb +259 -0
- data/lib/openhab/dsl/items/builder.rb +4 -2
- data/lib/openhab/dsl/items/timed_command.rb +31 -13
- data/lib/openhab/dsl/rules/automation_rule.rb +28 -21
- data/lib/openhab/dsl/rules/builder.rb +357 -37
- data/lib/openhab/dsl/rules/guard.rb +12 -54
- data/lib/openhab/dsl/rules/name_inference.rb +11 -0
- data/lib/openhab/dsl/rules/property.rb +3 -4
- data/lib/openhab/dsl/rules/terse.rb +4 -1
- data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +5 -6
- data/lib/openhab/dsl/rules/triggers/cron/cron.rb +1 -0
- data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +19 -31
- data/lib/openhab/dsl/rules/triggers/watch/watch.rb +1 -0
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +22 -30
- data/lib/openhab/dsl/things/builder.rb +1 -1
- data/lib/openhab/dsl/thread_local.rb +1 -0
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +224 -3
- data/lib/openhab/rspec/hooks.rb +5 -2
- data/lib/openhab/rspec/karaf.rb +7 -0
- data/lib/openhab/rspec/mocks/instance_method_stasher.rb +22 -0
- data/lib/openhab/rspec/mocks/space.rb +23 -0
- data/lib/openhab/rspec/openhab/core/actions.rb +16 -4
- data/lib/openhab/rspec/openhab/core/items/proxy.rb +1 -13
- data/lib/openhab/rspec/suspend_rules.rb +1 -14
- data/lib/openhab/yard/base_helper.rb +19 -0
- data/lib/openhab/yard/code_objects/group_object.rb +9 -3
- data/lib/openhab/yard/coderay.rb +17 -0
- data/lib/openhab/yard/handlers/jruby/base.rb +10 -1
- data/lib/openhab/yard/handlers/jruby/java_import_handler.rb +3 -0
- data/lib/openhab/yard/html_helper.rb +49 -15
- data/lib/openhab/yard/markdown_helper.rb +135 -0
- data/lib/openhab/yard.rb +6 -0
- metadata +36 -4
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "property"
|
4
|
-
|
5
3
|
module OpenHAB
|
6
4
|
module DSL
|
7
5
|
module Rules
|
@@ -13,8 +11,8 @@ module OpenHAB
|
|
13
11
|
#
|
14
12
|
# Create a new Guard
|
15
13
|
#
|
16
|
-
# @param [
|
17
|
-
# @param [
|
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
|
18
16
|
#
|
19
17
|
def initialize(run_context:, only_if: nil, not_if: nil)
|
20
18
|
@run_context = run_context
|
@@ -40,74 +38,34 @@ module OpenHAB
|
|
40
38
|
#
|
41
39
|
def should_run?(event)
|
42
40
|
logger.trace("Checking guards #{self}")
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
#
|
50
|
-
# Check if guard is satisfied
|
51
|
-
#
|
52
|
-
# @param [Array] conditions to check
|
53
|
-
# @param [Symbol] check_type type of check to perform (:only_if or :not_if)
|
54
|
-
# @param [Event] event openHAB event to see if it satisfies the guard
|
55
|
-
#
|
56
|
-
# @return [true,false] True if guard is satisfied, false otherwise
|
57
|
-
#
|
58
|
-
def check(conditions, check_type:, event:)
|
59
|
-
return true if conditions.nil? || conditions.empty?
|
41
|
+
return false unless check_only_if(event)
|
42
|
+
return false unless check_not_if(event)
|
60
43
|
|
61
|
-
|
62
|
-
logger.trace("Procs: #{procs} Items: #{items}")
|
63
|
-
|
64
|
-
items.each { |item| logger.trace { "#{item} truthy? #{item.truthy?}" } }
|
65
|
-
|
66
|
-
process_check(check_type: check_type, event: event, items: items, procs: procs)
|
44
|
+
true
|
67
45
|
end
|
68
46
|
|
69
|
-
|
70
|
-
# Execute the guard check
|
71
|
-
#
|
72
|
-
# @param [Symbol] check_type :only_if or :not_if to check
|
73
|
-
# @param [Object] event event to check if meets guard
|
74
|
-
# @param [Array<Item>] items to check if satisfy criteria
|
75
|
-
# @param [Array] procs to check if satisfy criteria
|
76
|
-
#
|
77
|
-
# @return [true,false] True if criteria are satisfied, false otherwise
|
78
|
-
#
|
79
|
-
def process_check(check_type:, event:, items:, procs:)
|
80
|
-
case check_type
|
81
|
-
when :only_if then process_only_if(event, items, procs)
|
82
|
-
when :not_if then process_not_if(event, items, procs)
|
83
|
-
else raise ArgumentError, "Unexpected check type: #{check_type}"
|
84
|
-
end
|
85
|
-
end
|
47
|
+
private
|
86
48
|
|
87
49
|
#
|
88
|
-
# Check not_if
|
50
|
+
# Check not_if guards
|
89
51
|
#
|
90
52
|
# @param [Object] event to check if meets guard
|
91
|
-
# @param [Array<Item>] items to check if satisfy criteria
|
92
|
-
# @param [Array] procs to check if satisfy criteria
|
93
53
|
#
|
94
54
|
# @return [true,false] True if criteria are satisfied, false otherwise
|
95
55
|
#
|
96
|
-
def
|
97
|
-
|
56
|
+
def check_not_if(event)
|
57
|
+
@not_if.nil? || @not_if.none? { |proc| @run_context.instance_exec(event, &proc) }
|
98
58
|
end
|
99
59
|
|
100
60
|
#
|
101
|
-
# Check only_if
|
61
|
+
# Check only_if guards
|
102
62
|
#
|
103
63
|
# @param [Object] event to check if meets guard
|
104
|
-
# @param [Array<Item>] items to check if satisfy criteria
|
105
|
-
# @param [Array] procs to check if satisfy criteria
|
106
64
|
#
|
107
65
|
# @return [true,false] True if criteria are satisfied, false otherwise
|
108
66
|
#
|
109
|
-
def
|
110
|
-
|
67
|
+
def check_only_if(event)
|
68
|
+
@only_if.nil? || @only_if.all? { |proc| @run_context.instance_exec(event, &proc) }
|
111
69
|
end
|
112
70
|
end
|
113
71
|
end
|
@@ -60,6 +60,8 @@ module OpenHAB
|
|
60
60
|
infer_rule_name_from_item_trigger(trigger, items, kwargs)
|
61
61
|
when :channel_linked, :channel_unlinked
|
62
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)
|
63
65
|
when :thing_added, :thing_removed, :thing_updated
|
64
66
|
infer_rule_name_from_thing_trigger(trigger)
|
65
67
|
when :on_start
|
@@ -116,6 +118,15 @@ module OpenHAB
|
|
116
118
|
(trigger == :channel_linked) ? "Channel linked to item" : "Channel unlinked from item"
|
117
119
|
end
|
118
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
|
+
|
119
130
|
# formulate a readable rule name from a thing added/updated/remove trigger
|
120
131
|
def infer_rule_name_from_thing_trigger(trigger)
|
121
132
|
{
|
@@ -9,12 +9,11 @@ module OpenHAB
|
|
9
9
|
# @visibility private
|
10
10
|
module Property
|
11
11
|
#
|
12
|
-
# Dynamically creates a property that acts
|
12
|
+
# Dynamically creates a property that acts as an accessor with no arguments
|
13
13
|
# and a setter with any number of arguments or a block.
|
14
14
|
#
|
15
15
|
# @param [String] name of the property
|
16
16
|
#
|
17
|
-
#
|
18
17
|
def prop(name)
|
19
18
|
# rubocop rules are disabled because this method is dynamically defined on the calling
|
20
19
|
# object making calls to other methods in this module impossible, or if done on methods
|
@@ -36,8 +35,8 @@ module OpenHAB
|
|
36
35
|
end
|
37
36
|
|
38
37
|
#
|
39
|
-
# Dynamically creates a property array acts
|
40
|
-
# and
|
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
|
41
40
|
# You can provide a block to this method which can be used to check if the provided value is acceptable.
|
42
41
|
#
|
43
42
|
# @param [String] name of the property
|
@@ -51,12 +51,15 @@ module OpenHAB
|
|
51
51
|
def_terse_rule(:channel_unlinked)
|
52
52
|
def_terse_rule(:cron)
|
53
53
|
def_terse_rule(:every)
|
54
|
+
def_terse_rule(:item_added)
|
55
|
+
def_terse_rule(:item_updated)
|
56
|
+
def_terse_rule(:item_removed)
|
57
|
+
def_terse_rule(:on_start)
|
54
58
|
def_terse_rule(:received_command)
|
55
59
|
def_terse_rule(:thing_added)
|
56
60
|
def_terse_rule(:thing_updated)
|
57
61
|
def_terse_rule(:thing_removed)
|
58
62
|
def_terse_rule(:updated)
|
59
|
-
def_terse_rule(:on_start)
|
60
63
|
end
|
61
64
|
end
|
62
65
|
end
|
@@ -96,7 +96,7 @@ module OpenHAB
|
|
96
96
|
yield
|
97
97
|
end
|
98
98
|
rule.on_removal(self)
|
99
|
-
|
99
|
+
_, @tracking_from = retrieve_states(inputs)
|
100
100
|
end
|
101
101
|
|
102
102
|
#
|
@@ -106,12 +106,11 @@ module OpenHAB
|
|
106
106
|
# @param [Hash] mod rule trigger mods
|
107
107
|
#
|
108
108
|
def process_active_timer(inputs, mod, &block)
|
109
|
-
|
110
|
-
if
|
111
|
-
logger.trace("Item changed to #{
|
112
|
-
@timer.reschedule(@duration)
|
109
|
+
new_state, old_state = retrieve_states(inputs)
|
110
|
+
if new_state != @tracking_from && @conditions.check_to(inputs: {})
|
111
|
+
logger.trace("Item changed from #{old_state} to #{new_state} for #{self}, keep waiting.")
|
113
112
|
else
|
114
|
-
logger.trace("Item changed to #{
|
113
|
+
logger.trace("Item changed from #{old_state} to #{new_state} for #{self}, canceling timer.")
|
115
114
|
@timer.cancel
|
116
115
|
# Reprocess trigger delay after canceling to track new state (if guards matched, etc)
|
117
116
|
process(mod: mod, inputs: inputs, &block)
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "singleton"
|
4
|
+
|
3
5
|
require_relative "cron"
|
4
6
|
|
5
7
|
module OpenHAB
|
@@ -77,49 +79,35 @@ module OpenHAB
|
|
77
79
|
|
78
80
|
# Implements the ScriptedTriggerHandlerFactory interface to create a new Cron Trigger Handler
|
79
81
|
class CronTriggerHandlerFactory
|
82
|
+
include Singleton
|
80
83
|
include org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory
|
81
84
|
|
82
|
-
|
83
|
-
# @param [org.openhab.core.automation.Trigger] trigger
|
84
|
-
#
|
85
|
-
# @return [WatchTriggerHandler] trigger handler for supplied trigger
|
86
|
-
def get(trigger)
|
87
|
-
CronTriggerHandler.new(trigger)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
class << self
|
92
|
-
private
|
93
|
-
|
94
|
-
#
|
95
|
-
# Creates trigger types and trigger type factories for openHAB
|
96
|
-
#
|
97
|
-
def add_script_cron_handler
|
85
|
+
def initialize
|
98
86
|
Core.automation_manager.add_trigger_handler(
|
99
87
|
Cron::CRON_TRIGGER_MODULE_ID,
|
100
|
-
|
88
|
+
self
|
101
89
|
)
|
102
90
|
|
103
|
-
Core.automation_manager.add_trigger_type(
|
91
|
+
Core.automation_manager.add_trigger_type(org.openhab.core.automation.type.TriggerType.new(
|
92
|
+
Cron::CRON_TRIGGER_MODULE_ID,
|
93
|
+
nil,
|
94
|
+
"A specific instant occurs",
|
95
|
+
"Triggers when the specified instant occurs",
|
96
|
+
nil,
|
97
|
+
org.openhab.core.automation.Visibility::VISIBLE,
|
98
|
+
nil
|
99
|
+
))
|
104
100
|
logger.trace("Added script cron trigger handler")
|
105
101
|
end
|
106
102
|
|
103
|
+
# Invoked by openHAB core to get a trigger handler for the supplied trigger
|
104
|
+
# @param [org.openhab.core.automation.Trigger] trigger
|
107
105
|
#
|
108
|
-
#
|
109
|
-
|
110
|
-
|
111
|
-
org.openhab.core.automation.type.TriggerType.new(
|
112
|
-
Cron::CRON_TRIGGER_MODULE_ID,
|
113
|
-
nil,
|
114
|
-
"A specific instant occurs",
|
115
|
-
"Triggers when the specified instant occurs",
|
116
|
-
nil,
|
117
|
-
org.openhab.core.automation.Visibility::VISIBLE,
|
118
|
-
nil
|
119
|
-
)
|
106
|
+
# @return [WatchTriggerHandler] trigger handler for supplied trigger
|
107
|
+
def get(trigger)
|
108
|
+
CronTriggerHandler.new(trigger)
|
120
109
|
end
|
121
110
|
end
|
122
|
-
add_script_cron_handler
|
123
111
|
end
|
124
112
|
end
|
125
113
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "singleton"
|
4
|
+
|
3
5
|
module OpenHAB
|
4
6
|
module DSL
|
5
7
|
module Rules
|
@@ -9,21 +11,6 @@ module OpenHAB
|
|
9
11
|
# Module for watching directories/files
|
10
12
|
#
|
11
13
|
module WatchHandler
|
12
|
-
#
|
13
|
-
# Creates trigger types and trigger type factories for openHAB
|
14
|
-
#
|
15
|
-
private_class_method def self.watch_trigger_type
|
16
|
-
org.openhab.core.automation.type.TriggerType.new(
|
17
|
-
WATCH_TRIGGER_MODULE_ID,
|
18
|
-
nil,
|
19
|
-
"A path change event is detected",
|
20
|
-
"Triggers when a path change event is detected",
|
21
|
-
nil,
|
22
|
-
org.openhab.core.automation.Visibility::VISIBLE,
|
23
|
-
nil
|
24
|
-
)
|
25
|
-
end
|
26
|
-
|
27
14
|
# Trigger ID for Watch Triggers
|
28
15
|
WATCH_TRIGGER_MODULE_ID = "jsr223.jruby.WatchTrigger"
|
29
16
|
|
@@ -68,7 +55,7 @@ module OpenHAB
|
|
68
55
|
# Invoked by java super class when an watch event occurs
|
69
56
|
# @param [String] _event ignored
|
70
57
|
# @param [StandardWatchEventKind] kind NIO watch event kind
|
71
|
-
# @param [java.nio.Path] path that had an event
|
58
|
+
# @param [java.nio.file.Path] path that had an event
|
72
59
|
def processWatchEvent(_event, kind, path)
|
73
60
|
@block.call(Events::WatchEvent.new(EVENT_TO_SYMBOL[kind], Pathname.new(path.to_s)))
|
74
61
|
end
|
@@ -123,8 +110,27 @@ module OpenHAB
|
|
123
110
|
|
124
111
|
# Implements the ScriptedTriggerHandlerFactory interface to create a new Trigger Handler
|
125
112
|
class WatchTriggerHandlerFactory
|
113
|
+
include Singleton
|
126
114
|
include org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory
|
127
115
|
|
116
|
+
def initialize
|
117
|
+
Core.automation_manager.add_trigger_handler(
|
118
|
+
WATCH_TRIGGER_MODULE_ID,
|
119
|
+
self
|
120
|
+
)
|
121
|
+
|
122
|
+
Core.automation_manager.add_trigger_type(org.openhab.core.automation.type.TriggerType.new(
|
123
|
+
WATCH_TRIGGER_MODULE_ID,
|
124
|
+
nil,
|
125
|
+
"A path change event is detected",
|
126
|
+
"Triggers when a path change event is detected",
|
127
|
+
nil,
|
128
|
+
org.openhab.core.automation.Visibility::VISIBLE,
|
129
|
+
nil
|
130
|
+
))
|
131
|
+
logger.trace("Added watch trigger handler")
|
132
|
+
end
|
133
|
+
|
128
134
|
# Invoked by openHAB core to get a trigger handler for the supllied trigger
|
129
135
|
# @param [org.openhab.core.automation.Trigger] trigger
|
130
136
|
#
|
@@ -133,20 +139,6 @@ module OpenHAB
|
|
133
139
|
WatchTriggerHandler.new(trigger)
|
134
140
|
end
|
135
141
|
end
|
136
|
-
|
137
|
-
#
|
138
|
-
# Creates trigger types and trigger type factories for openHAB
|
139
|
-
#
|
140
|
-
def self.add_watch_handler
|
141
|
-
Core.automation_manager.add_trigger_handler(
|
142
|
-
WATCH_TRIGGER_MODULE_ID,
|
143
|
-
WatchTriggerHandlerFactory.new
|
144
|
-
)
|
145
|
-
|
146
|
-
Core.automation_manager.add_trigger_type(watch_trigger_type)
|
147
|
-
logger.trace("Added watch trigger handler")
|
148
|
-
end
|
149
|
-
add_watch_handler
|
150
142
|
end
|
151
143
|
end
|
152
144
|
end
|