openhab-jrubyscripting 5.0.0.rc9 → 5.0.0.rc11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|