openhab-jrubyscripting 5.0.0.rc5 → 5.0.0.rc6
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.rb +6 -6
- data/lib/openhab/core/dependency_tracking.rb +34 -0
- data/lib/openhab/core/entity_lookup.rb +132 -78
- data/lib/openhab/core/events/item_channel_link.rb +2 -2
- data/lib/openhab/core/events/item_command_event.rb +1 -1
- data/lib/openhab/core/events/item_event.rb +2 -2
- data/lib/openhab/core/events/item_state_changed_event.rb +1 -1
- data/lib/openhab/core/events/thing.rb +1 -1
- data/lib/openhab/core/items/accepted_data_types.rb +2 -2
- data/lib/openhab/core/items/contact_item.rb +1 -1
- data/lib/openhab/core/items/dimmer_item.rb +2 -2
- data/lib/openhab/core/items/generic_item.rb +45 -224
- data/lib/openhab/core/items/group_item.rb +5 -3
- data/lib/openhab/core/items/image_item.rb +2 -2
- data/lib/openhab/core/items/item.rb +219 -0
- data/lib/openhab/core/items/metadata/hash.rb +1 -1
- data/lib/openhab/core/items/persistence.rb +4 -5
- data/lib/openhab/core/items/provider.rb +2 -2
- data/lib/openhab/core/items/proxy.rb +68 -7
- data/lib/openhab/core/items/registry.rb +6 -6
- data/lib/openhab/core/items/semantics/enumerable.rb +6 -6
- data/lib/openhab/core/items/semantics.rb +8 -7
- data/lib/openhab/core/items.rb +2 -1
- data/lib/openhab/core/provider.rb +14 -7
- data/lib/openhab/core/rules/registry.rb +2 -2
- data/lib/openhab/core/rules.rb +1 -1
- data/lib/openhab/core/script_handling.rb +6 -6
- data/lib/openhab/core/things/channel.rb +1 -1
- data/lib/openhab/core/things/channel_uid.rb +2 -2
- data/lib/openhab/core/things/item_channel_link.rb +2 -2
- data/lib/openhab/core/things/links/provider.rb +2 -2
- data/lib/openhab/core/things/registry.rb +1 -1
- data/lib/openhab/core/things/thing.rb +1 -1
- data/lib/openhab/core/types/date_time_type.rb +4 -4
- data/lib/openhab/core/types/hsb_type.rb +2 -2
- data/lib/openhab/core/types/quantity_type.rb +1 -1
- data/lib/openhab/core/types.rb +1 -1
- data/lib/openhab/core/uid.rb +1 -1
- data/lib/openhab/core/value_cache.rb +188 -0
- data/lib/openhab/core.rb +57 -15
- data/lib/openhab/core_ext/ruby/symbol.rb +7 -0
- data/lib/openhab/dsl/items/builder.rb +17 -10
- data/lib/openhab/dsl/items/ensure.rb +5 -5
- data/lib/openhab/dsl/items/timed_command.rb +4 -4
- data/lib/openhab/dsl/rules/automation_rule.rb +53 -39
- data/lib/openhab/dsl/rules/builder.rb +128 -79
- data/lib/openhab/dsl/rules/guard.rb +5 -5
- data/lib/openhab/dsl/rules/name_inference.rb +20 -1
- data/lib/openhab/dsl/rules/rule_triggers.rb +3 -3
- data/lib/openhab/dsl/rules/terse.rb +1 -0
- data/lib/openhab/dsl/rules/triggers/changed.rb +26 -23
- data/lib/openhab/dsl/rules/triggers/command.rb +6 -5
- data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +2 -2
- data/lib/openhab/dsl/rules/triggers/cron/cron.rb +2 -2
- data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +6 -6
- data/lib/openhab/dsl/rules/triggers/updated.rb +5 -5
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +11 -12
- data/lib/openhab/dsl/things/builder.rb +73 -14
- data/lib/openhab/dsl/version.rb +2 -2
- data/lib/openhab/dsl.rb +43 -17
- data/lib/openhab/log.rb +5 -5
- data/lib/openhab/rspec/configuration.rb +5 -5
- data/lib/openhab/rspec/example_group.rb +1 -1
- data/lib/openhab/rspec/helpers.rb +4 -4
- data/lib/openhab/rspec/hooks.rb +19 -1
- data/lib/openhab/rspec/karaf.rb +12 -19
- data/lib/openhab/rspec/suspend_rules.rb +2 -1
- data/lib/openhab/yard/base_helper.rb +46 -0
- data/lib/openhab/yard/markdown_directive.rb +125 -0
- data/lib/openhab/yard/markdown_helper.rb +99 -0
- metadata +10 -3
@@ -18,7 +18,7 @@ module OpenHAB
|
|
18
18
|
# @param [Object] command to check against
|
19
19
|
# @param [Object] attach object to be attached to the trigger
|
20
20
|
#
|
21
|
-
# @return [Trigger]
|
21
|
+
# @return [org.openhab.core.automation.Trigger]
|
22
22
|
#
|
23
23
|
def trigger(item:, command:, attach:)
|
24
24
|
case command
|
@@ -31,9 +31,9 @@ module OpenHAB
|
|
31
31
|
#
|
32
32
|
# Creates a trigger with a range condition on the 'command' field
|
33
33
|
# @param [Object] item to create changed trigger on
|
34
|
-
# @param [
|
34
|
+
# @param [Range] command to restrict trigger to
|
35
35
|
# @param [Object] attach object to be attached to the trigger
|
36
|
-
# @return [Trigger]
|
36
|
+
# @return [org.openhab.core.automation.Trigger]
|
37
37
|
#
|
38
38
|
def range_trigger(item:, command:, attach:)
|
39
39
|
command_range, * = Conditions::Proc.range_procs(command)
|
@@ -45,7 +45,7 @@ module OpenHAB
|
|
45
45
|
# @param [Object] item to create changed trigger on
|
46
46
|
# @param [Object] command to restrict trigger to
|
47
47
|
# @param [Object] attach object to be attached to the trigger
|
48
|
-
# @return [Trigger]
|
48
|
+
# @return [org.openhab.core.automation.Trigger]
|
49
49
|
#
|
50
50
|
def proc_trigger(item:, command:, attach:)
|
51
51
|
conditions = Conditions::Proc.new(command: command)
|
@@ -58,6 +58,7 @@ module OpenHAB
|
|
58
58
|
# @param [Object] item to create trigger for
|
59
59
|
# @param [String] command to create trigger for
|
60
60
|
# @param [Object] attach object to be attached to the trigger
|
61
|
+
# @return [org.openhab.core.automation.Trigger]
|
61
62
|
#
|
62
63
|
def command_trigger(item:, command:, attach: nil, conditions: nil)
|
63
64
|
type, config = if item.is_a?(GroupItem::Members)
|
@@ -92,7 +93,7 @@ module OpenHAB
|
|
92
93
|
#
|
93
94
|
# Create trigger for group items
|
94
95
|
#
|
95
|
-
# @param [
|
96
|
+
# @param [GroupItem::Members] group to create trigger for
|
96
97
|
#
|
97
98
|
# @return [Array<Hash,Trigger>] first element is hash of trigger config properties
|
98
99
|
# second element is trigger type
|
@@ -57,7 +57,7 @@ module OpenHAB
|
|
57
57
|
#
|
58
58
|
# Check if trigger guards prevent rule execution
|
59
59
|
#
|
60
|
-
# @param [Map] inputs
|
60
|
+
# @param [java.util.Map] inputs map object describing rule trigger
|
61
61
|
#
|
62
62
|
# @return [true,false] True if the rule should execute, false if trigger guard prevents execution
|
63
63
|
#
|
@@ -70,7 +70,7 @@ module OpenHAB
|
|
70
70
|
# Rerieve the newState and oldState, alternatively newStatus and oldStatus
|
71
71
|
# from the input map
|
72
72
|
#
|
73
|
-
# @param [Map] inputs
|
73
|
+
# @param [java.util.Map] inputs map object describing rule trigger
|
74
74
|
#
|
75
75
|
# @return [Array] An array of the values for [newState, oldState] or [newStatus, oldStatus]
|
76
76
|
#
|
@@ -33,7 +33,7 @@ module OpenHAB
|
|
33
33
|
}.freeze
|
34
34
|
private_constant :CRON_EXPRESSION_MAP
|
35
35
|
|
36
|
-
# @return [Hash] Map of days of the week from symbols to to
|
36
|
+
# @return [Hash] Map of days of the week from symbols to to openHAB cron strings
|
37
37
|
DAY_OF_WEEK_MAP = {
|
38
38
|
monday: "MON",
|
39
39
|
tuesday: "TUE",
|
@@ -134,7 +134,7 @@ module OpenHAB
|
|
134
134
|
#
|
135
135
|
# @param [Map] map of cron expression
|
136
136
|
#
|
137
|
-
# @return [String]
|
137
|
+
# @return [String] openHAB cron string
|
138
138
|
#
|
139
139
|
def self.map_to_cron(map)
|
140
140
|
%i[second minute hour dom month dow year].map { |field| map.fetch(field) }.join(" ")
|
@@ -12,7 +12,7 @@ module OpenHAB
|
|
12
12
|
#
|
13
13
|
module CronHandler
|
14
14
|
# Cron Trigger Handler that provides trigger IDs
|
15
|
-
# Unfortunatly because the CronTriggerHandler in
|
15
|
+
# Unfortunatly because the CronTriggerHandler in openHAB core is marked internal
|
16
16
|
# the entire thing must be recreated here
|
17
17
|
class CronTriggerHandler < org.openhab.core.automation.handler.BaseTriggerModuleHandler
|
18
18
|
include org.openhab.core.scheduler.SchedulerRunnable
|
@@ -22,7 +22,7 @@ module OpenHAB
|
|
22
22
|
field_accessor :callback
|
23
23
|
|
24
24
|
# Creates a new CronTriggerHandler
|
25
|
-
# @param [Trigger] trigger
|
25
|
+
# @param [org.openhab.core.automation.Trigger] trigger openHAB trigger associated with handler
|
26
26
|
#
|
27
27
|
def initialize(trigger)
|
28
28
|
@trigger = trigger
|
@@ -79,8 +79,8 @@ module OpenHAB
|
|
79
79
|
class CronTriggerHandlerFactory
|
80
80
|
include org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory
|
81
81
|
|
82
|
-
# Invoked by
|
83
|
-
# @param [Trigger] trigger
|
82
|
+
# Invoked by openHAB core to get a trigger handler for the supllied trigger
|
83
|
+
# @param [org.openhab.core.automation.Trigger] trigger
|
84
84
|
#
|
85
85
|
# @return [WatchTriggerHandler] trigger handler for supplied trigger
|
86
86
|
def get(trigger)
|
@@ -92,7 +92,7 @@ module OpenHAB
|
|
92
92
|
private
|
93
93
|
|
94
94
|
#
|
95
|
-
# Creates trigger types and trigger type factories for
|
95
|
+
# Creates trigger types and trigger type factories for openHAB
|
96
96
|
#
|
97
97
|
def add_script_cron_handler
|
98
98
|
Core.automation_manager.add_trigger_handler(
|
@@ -105,7 +105,7 @@ module OpenHAB
|
|
105
105
|
end
|
106
106
|
|
107
107
|
#
|
108
|
-
# Creates trigger types and trigger type factories for
|
108
|
+
# Creates trigger types and trigger type factories for openHAB
|
109
109
|
#
|
110
110
|
def cron_trigger_type
|
111
111
|
org.openhab.core.automation.type.TriggerType.new(
|
@@ -18,7 +18,7 @@ module OpenHAB
|
|
18
18
|
# @param [Item State] to state to restrict trigger to
|
19
19
|
# @param [Object] attach object to be attached to the trigger
|
20
20
|
#
|
21
|
-
# @return [Trigger]
|
21
|
+
# @return [org.openhab.core.automation.Trigger]
|
22
22
|
#
|
23
23
|
def trigger(item:, to:, attach:)
|
24
24
|
case to
|
@@ -44,7 +44,7 @@ module OpenHAB
|
|
44
44
|
# @param [Object] item to create changed trigger on
|
45
45
|
# @param [Object] to state restrict trigger to
|
46
46
|
# @param [Object] attach object to be attached to the trigger
|
47
|
-
# @return [Trigger]
|
47
|
+
# @return [org.openhab.core.automation.Trigger]
|
48
48
|
#
|
49
49
|
def range_trigger(item:, to:, attach:)
|
50
50
|
to, * = Conditions::Proc.range_procs(to)
|
@@ -56,7 +56,7 @@ module OpenHAB
|
|
56
56
|
# @param [Object] item to create changed trigger on
|
57
57
|
# @param [Object] to state restrict trigger to
|
58
58
|
# @param [Object] attach object to be attached to the trigger
|
59
|
-
# @return [Trigger]
|
59
|
+
# @return [org.openhab.core.automation.Trigger]
|
60
60
|
#
|
61
61
|
def proc_trigger(item:, to:, attach:)
|
62
62
|
conditions = Conditions::Proc.new(to: to)
|
@@ -70,7 +70,7 @@ module OpenHAB
|
|
70
70
|
# @param [State] to state restriction on trigger
|
71
71
|
# @param [Object] attach object to be attached to the trigger
|
72
72
|
#
|
73
|
-
# @return [Trigger]
|
73
|
+
# @return [org.openhab.core.automation.Trigger]
|
74
74
|
#
|
75
75
|
def update_trigger(item:, to:, attach: nil, conditions: nil)
|
76
76
|
type, config = case item
|
@@ -103,7 +103,7 @@ module OpenHAB
|
|
103
103
|
#
|
104
104
|
# Create an update trigger for a group
|
105
105
|
#
|
106
|
-
# @param [
|
106
|
+
# @param [GroupItem::Members] item to create trigger for
|
107
107
|
# @param [State] to optional state restriction for target
|
108
108
|
#
|
109
109
|
# @return [Array<Hash,String>] first element is a String specifying trigger type
|
@@ -10,7 +10,7 @@ module OpenHAB
|
|
10
10
|
#
|
11
11
|
module WatchHandler
|
12
12
|
#
|
13
|
-
# Creates trigger types and trigger type factories for
|
13
|
+
# Creates trigger types and trigger type factories for openHAB
|
14
14
|
#
|
15
15
|
private_class_method def self.watch_trigger_type
|
16
16
|
org.openhab.core.automation.type.TriggerType.new(
|
@@ -27,7 +27,7 @@ module OpenHAB
|
|
27
27
|
# Trigger ID for Watch Triggers
|
28
28
|
WATCH_TRIGGER_MODULE_ID = "jsr223.jruby.WatchTrigger"
|
29
29
|
|
30
|
-
# Extends the
|
30
|
+
# Extends the openHAB watch service to watch directories
|
31
31
|
#
|
32
32
|
# Must match java method name style
|
33
33
|
# rubocop:disable Naming/MethodName
|
@@ -75,12 +75,12 @@ module OpenHAB
|
|
75
75
|
end
|
76
76
|
# rubocop:enable Naming/MethodName
|
77
77
|
|
78
|
-
# Implements the
|
78
|
+
# Implements the openHAB TriggerHandler interface to process Watch Triggers
|
79
79
|
class WatchTriggerHandler
|
80
80
|
include org.openhab.core.automation.handler.TriggerHandler
|
81
81
|
|
82
82
|
# Creates a new WatchTriggerHandler
|
83
|
-
# @param [Trigger] trigger
|
83
|
+
# @param [org.openhab.core.automation.Trigger] trigger
|
84
84
|
#
|
85
85
|
def initialize(trigger)
|
86
86
|
@trigger = trigger
|
@@ -94,21 +94,20 @@ module OpenHAB
|
|
94
94
|
# Create a lambda to use to invoke rule engine when file watch notification happens
|
95
95
|
# @param [String] glob to match for notification events
|
96
96
|
#
|
97
|
-
# @return [
|
97
|
+
# @return [Proc] lambda to execute on notification events
|
98
98
|
#
|
99
99
|
def watch_event_handler(glob)
|
100
|
-
lambda
|
100
|
+
lambda do |watch_event|
|
101
101
|
if watch_event.path.fnmatch?(glob)
|
102
102
|
logger.trace("Received event(#{watch_event})")
|
103
103
|
@rule_engine_callback&.triggered(@trigger, { "event" => watch_event })
|
104
104
|
else
|
105
105
|
logger.trace("Event #{watch_event} did not match glob(#{glob})")
|
106
106
|
end
|
107
|
-
|
107
|
+
end
|
108
108
|
end
|
109
109
|
|
110
|
-
# Called by
|
111
|
-
# Must match java method name style
|
110
|
+
# Called by openHAB to set the rule engine to invoke when triggered
|
112
111
|
def setCallback(callback) # rubocop:disable Naming/MethodName
|
113
112
|
@rule_engine_callback = callback
|
114
113
|
end
|
@@ -126,8 +125,8 @@ module OpenHAB
|
|
126
125
|
class WatchTriggerHandlerFactory
|
127
126
|
include org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory
|
128
127
|
|
129
|
-
# Invoked by
|
130
|
-
# @param [Trigger] trigger
|
128
|
+
# Invoked by openHAB core to get a trigger handler for the supllied trigger
|
129
|
+
# @param [org.openhab.core.automation.Trigger] trigger
|
131
130
|
#
|
132
131
|
# @return [WatchTriggerHandler] trigger handler for supplied trigger
|
133
132
|
def get(trigger)
|
@@ -136,7 +135,7 @@ module OpenHAB
|
|
136
135
|
end
|
137
136
|
|
138
137
|
#
|
139
|
-
# Creates trigger types and trigger type factories for
|
138
|
+
# Creates trigger types and trigger type factories for openHAB
|
140
139
|
#
|
141
140
|
def self.add_watch_handler
|
142
141
|
Core.automation_manager.add_trigger_handler(
|
@@ -6,14 +6,36 @@ module OpenHAB
|
|
6
6
|
# Contains extensions to simplify working with {Core::Things::Thing Thing}s.
|
7
7
|
#
|
8
8
|
module Things
|
9
|
-
# A thing builder allows you to dynamically create
|
9
|
+
# A thing builder allows you to dynamically create openHAB things at runtime.
|
10
10
|
# This can be useful either to create things as soon as the script loads,
|
11
11
|
# or even later based on a rule executing.
|
12
12
|
#
|
13
|
-
# @example
|
13
|
+
# @example Create a Thing from the Astro Binding
|
14
14
|
# things.build do
|
15
15
|
# thing "astro:sun:home", "Astro Sun Data", config: { "geolocation" => "0,0" }
|
16
16
|
# end
|
17
|
+
#
|
18
|
+
# @example Create a Thing with Channels
|
19
|
+
# thing_config = {
|
20
|
+
# availabilityTopic: "my-switch/status",
|
21
|
+
# payloadAvailable: "online",
|
22
|
+
# payloadNotAvailable: "offline"
|
23
|
+
# }
|
24
|
+
# things.build do
|
25
|
+
# thing("mqtt:topic:my-switch", "My Switch", bridge: "mqtt:bridge:mosquitto", config: thing_config) do
|
26
|
+
# channel("switch1", "switch", config: {
|
27
|
+
# stateTopic: "stat/my-switch/switch1/state", commandTopic="cmnd/my-switch/switch1/command"
|
28
|
+
# })
|
29
|
+
# channel("button1", "string", config: {
|
30
|
+
# stateTopic: "stat/my-switch/button1/state", commandTopic="cmnd/my-switch/button1/command"
|
31
|
+
# })
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# @see ThingBuilder#initialize ThingBuilder#initialize for #thing's parameters
|
36
|
+
# @see ChannelBuilder#initialize ChannelBuilder#initialize for #channel's parameters
|
37
|
+
# @see Items::Builder
|
38
|
+
#
|
17
39
|
class Builder
|
18
40
|
# @return [org.openhab.core.things.ManagedThingProvider]
|
19
41
|
attr_reader :provider
|
@@ -96,6 +118,26 @@ module OpenHAB
|
|
96
118
|
end
|
97
119
|
end
|
98
120
|
|
121
|
+
#
|
122
|
+
# Constructor for ThingBuilder
|
123
|
+
#
|
124
|
+
# @param [String] uid The ThingUID for the created Thing.
|
125
|
+
# This can consist one or more segments separated by a colon. When the uid contains:
|
126
|
+
# - One segment: When the uid contains one segment, `binding` or `bridge` id must be provided.
|
127
|
+
# - Two segments: `typeid:thingid` The `binding` or `bridge` id must be provided.
|
128
|
+
# - Three or more segments: `bindingid:typeid:[bridgeid...]:thingid`. The `type` and `bridge` can be omitted
|
129
|
+
# @param [String] label The Thing's label.
|
130
|
+
# @param [String] binding The binding id. When this argument is not provided,
|
131
|
+
# the binding id must be deducible from the `uid`, `type`, or `bridge`.
|
132
|
+
# @param [String] type The type id. When this argument is not provided,
|
133
|
+
# it will be deducible from the `uid` if it contains two or more segments.
|
134
|
+
# To create a Thing with a blank type id, use one segment for `uid` and provide the binding id.
|
135
|
+
# @param [String, BridgeBuilder] bridge The bridge uid, if the Thing should belong to a bridge.
|
136
|
+
# @param [String, Item] location The location of this Thing.
|
137
|
+
# When given an Item, use the item's label as the location.
|
138
|
+
# @param [Hash] config The Thing's configuration, as required by the binding. The key can be strings or symbols.
|
139
|
+
# @param [true,false] enabled Whether the Thing should be enabled or disabled.
|
140
|
+
#
|
99
141
|
def initialize(uid, label = nil, binding: nil, type: nil, bridge: nil, location: nil, config: {}, enabled: nil)
|
100
142
|
@channels = []
|
101
143
|
uid = uid.to_s
|
@@ -117,13 +159,18 @@ module OpenHAB
|
|
117
159
|
@bridge_uid = org.openhab.core.thing.ThingUID.new(*bridge_segments)
|
118
160
|
end
|
119
161
|
|
120
|
-
|
121
|
-
|
162
|
+
thinguid = if uid_segments.length > 2
|
163
|
+
[binding, type, uid_segments.last].compact
|
164
|
+
else
|
165
|
+
[binding, type, @bridge_uid&.id, uid_segments.last].compact
|
166
|
+
end
|
167
|
+
|
168
|
+
@uid = org.openhab.core.thing.ThingUID.new(*thinguid)
|
122
169
|
@thing_type_uid = org.openhab.core.thing.ThingTypeUID.new(*@uid.all_segments[0..1])
|
123
170
|
@label = label
|
124
171
|
@location = location
|
125
|
-
@location = location.label if location.is_a?(
|
126
|
-
@config = config
|
172
|
+
@location = location.label if location.is_a?(Item)
|
173
|
+
@config = config.transform_keys(&:to_s)
|
127
174
|
@enabled = enabled
|
128
175
|
end
|
129
176
|
|
@@ -132,7 +179,7 @@ module OpenHAB
|
|
132
179
|
def channel(*args, **kwargs, &block)
|
133
180
|
channel = ChannelBuilder.new(*args, thing: self, **kwargs)
|
134
181
|
channel.instance_eval(&block) if block
|
135
|
-
@channels << channel
|
182
|
+
@channels << channel.build
|
136
183
|
end
|
137
184
|
|
138
185
|
# @!visibility private
|
@@ -190,9 +237,22 @@ module OpenHAB
|
|
190
237
|
# The ChannelBuilder DSL allows you to customize a channel
|
191
238
|
class ChannelBuilder
|
192
239
|
attr_accessor :label
|
193
|
-
attr_reader :uid, :
|
240
|
+
attr_reader :uid, :config, :type
|
194
241
|
|
195
|
-
|
242
|
+
#
|
243
|
+
# Constructor for ChannelBuilder
|
244
|
+
#
|
245
|
+
# This class is instantiated by the {ThingBuilder#channel #channel} method inside a {Builder#thing} block.
|
246
|
+
#
|
247
|
+
# @param [String] uid The channel's ID.
|
248
|
+
# @param [String, ChannelTypeUID, :trigger] type The concrete type of the channel.
|
249
|
+
# @param [String] label The channel label.
|
250
|
+
# @param [thing] thing The thing associated with this channel.
|
251
|
+
# This parameter is not needed for the {ThingBuilder#channel} method.
|
252
|
+
# @param [String] group The group name.
|
253
|
+
# @param [Hash] config Channel configuration. The keys can be strings or symbols.
|
254
|
+
#
|
255
|
+
def initialize(uid, type, label = nil, thing:, group: nil, config: {})
|
196
256
|
@thing = thing
|
197
257
|
|
198
258
|
uid = uid.to_s
|
@@ -207,13 +267,12 @@ module OpenHAB
|
|
207
267
|
uid_segments[-1] = group_segments.join(org.openhab.core.thing.ChannelUID::CHANNEL_GROUP_SEPARATOR)
|
208
268
|
end
|
209
269
|
@uid = org.openhab.core.thing.ChannelUID.new(thing.uid, uid_segments.last)
|
210
|
-
unless type.is_a?(org.openhab.core.thing.ChannelTypeUID)
|
211
|
-
type = org.openhab.core.thing.ChannelTypeUID.new(thing.uid.binding_id,
|
212
|
-
type)
|
270
|
+
unless type.is_a?(org.openhab.core.thing.type.ChannelTypeUID)
|
271
|
+
type = org.openhab.core.thing.type.ChannelTypeUID.new(thing.uid.binding_id, type)
|
213
272
|
end
|
214
273
|
@type = type
|
215
274
|
@label = label
|
216
|
-
@
|
275
|
+
@config = config.transform_keys(&:to_s)
|
217
276
|
end
|
218
277
|
|
219
278
|
# @!visibility private
|
@@ -221,7 +280,7 @@ module OpenHAB
|
|
221
280
|
org.openhab.core.thing.binding.builder.ChannelBuilder.create(uid)
|
222
281
|
.with_kind(kind)
|
223
282
|
.with_type(type)
|
224
|
-
.with_configuration(org.openhab.core.config.core.Configuration.new(
|
283
|
+
.with_configuration(org.openhab.core.config.core.Configuration.new(config))
|
225
284
|
.build
|
226
285
|
end
|
227
286
|
|
data/lib/openhab/dsl/version.rb
CHANGED
data/lib/openhab/dsl.rb
CHANGED
@@ -16,7 +16,7 @@ end
|
|
16
16
|
require_relative "core_ext"
|
17
17
|
|
18
18
|
#
|
19
|
-
# Main
|
19
|
+
# Main openHAB Module
|
20
20
|
#
|
21
21
|
module OpenHAB
|
22
22
|
#
|
@@ -69,7 +69,7 @@ module OpenHAB
|
|
69
69
|
# The state being sent for `:state_from_item` and `:state_from_handler` events.
|
70
70
|
# @yieldparam [Core::Things::ItemChannelLink] link
|
71
71
|
# The link between the item and the channel, including its configuration.
|
72
|
-
# @yieldparam [
|
72
|
+
# @yieldparam [Item] item The linked item.
|
73
73
|
# @yieldparam [Core::Things::ChannelUID] channel_uid The linked channel.
|
74
74
|
# @yieldparam [Hash] configuration The profile configuration.
|
75
75
|
# @yieldparam [org.openhab.core.thing.profiles.ProfileContext] context The profile context.
|
@@ -106,6 +106,19 @@ module OpenHAB
|
|
106
106
|
|
107
107
|
# @!group Object Access
|
108
108
|
|
109
|
+
#
|
110
|
+
# (see Core::ValueCache)
|
111
|
+
#
|
112
|
+
# @return [Core::ValueCache] the cache shared among all scripts and UI rules in all languages.
|
113
|
+
#
|
114
|
+
# @see Core::ValueCache ValueCache
|
115
|
+
#
|
116
|
+
# @since openHAB 3.4.0
|
117
|
+
#
|
118
|
+
def shared_cache
|
119
|
+
$sharedCache
|
120
|
+
end
|
121
|
+
|
109
122
|
#
|
110
123
|
# Fetches all rules from the rule registry.
|
111
124
|
#
|
@@ -141,7 +154,7 @@ module OpenHAB
|
|
141
154
|
#
|
142
155
|
# @example
|
143
156
|
# rule 'search for a suitable item' do
|
144
|
-
#
|
157
|
+
# on_load
|
145
158
|
# triggered do
|
146
159
|
# # Send ON to DimmerTest if it exists, otherwise send it to SwitchTest
|
147
160
|
# (items['DimmerTest'] || items['SwitchTest'])&.on
|
@@ -153,9 +166,9 @@ module OpenHAB
|
|
153
166
|
end
|
154
167
|
|
155
168
|
#
|
156
|
-
# Get all things known to
|
169
|
+
# Get all things known to openHAB
|
157
170
|
#
|
158
|
-
# @return [Core::Things::Registry] all Thing objects known to
|
171
|
+
# @return [Core::Things::Registry] all Thing objects known to openHAB
|
159
172
|
#
|
160
173
|
# @example
|
161
174
|
# things.each { |thing| logger.info("Thing: #{thing.uid}")}
|
@@ -171,7 +184,7 @@ module OpenHAB
|
|
171
184
|
end
|
172
185
|
|
173
186
|
#
|
174
|
-
# Provides access to timers created by {after}
|
187
|
+
# Provides access to timers created by {after after}
|
175
188
|
#
|
176
189
|
# @return [TimerManager]
|
177
190
|
def timers
|
@@ -186,7 +199,8 @@ module OpenHAB
|
|
186
199
|
# ### Reentrant Timers
|
187
200
|
#
|
188
201
|
# Timers with an id are reentrant by id. Reentrant means that when the same id is encountered,
|
189
|
-
# the timer is rescheduled rather than creating a second new timer.
|
202
|
+
# the timer is rescheduled rather than creating a second new timer. Note that the timer will
|
203
|
+
# execute the block provided in the latest call.
|
190
204
|
#
|
191
205
|
# This removes the need for the usual boilerplate code to manually keep track of timer objects.
|
192
206
|
#
|
@@ -194,7 +208,7 @@ module OpenHAB
|
|
194
208
|
#
|
195
209
|
# When a timer is cancelled, it will be removed from the object.
|
196
210
|
#
|
197
|
-
# Be sure that your ids are unique. For example, if you're using {
|
211
|
+
# Be sure that your ids are unique. For example, if you're using {Item items} as your
|
198
212
|
# ids, you either need to be sure you don't use the same item for multiple logical contexts,
|
199
213
|
# or you need to make your id more specific, by doing something like embedding the item in
|
200
214
|
# array with a symbol of the timer's purpose, like `[:vacancy, item]`. But also note that
|
@@ -221,7 +235,7 @@ module OpenHAB
|
|
221
235
|
# logger.info("Timer Fired")
|
222
236
|
# end
|
223
237
|
#
|
224
|
-
# @example Timers delegate methods to
|
238
|
+
# @example Timers delegate methods to openHAB timer objects
|
225
239
|
# after 1.second do |timer|
|
226
240
|
# logger.info("Timer is active? #{timer.active?}")
|
227
241
|
# end
|
@@ -267,9 +281,21 @@ module OpenHAB
|
|
267
281
|
# end
|
268
282
|
#
|
269
283
|
# @example Only create a new timer if it isn't already scheduled
|
270
|
-
#
|
271
|
-
#
|
272
|
-
#
|
284
|
+
# after(1.minute, id: :foo, reschedule: false) do
|
285
|
+
# logger.info("Timer fired")
|
286
|
+
# end
|
287
|
+
#
|
288
|
+
# @example Reentrant timers will execute the block from the most recent call
|
289
|
+
# # In the following example, if Item1 received a command, followed by Item2,
|
290
|
+
# # the timer will execute the block referring to Item2.
|
291
|
+
# rule "Execute The Most Recent Block" do
|
292
|
+
# received_command Item1, Item2
|
293
|
+
# run do |event|
|
294
|
+
# after(10.minutes, id: :common_timer) do
|
295
|
+
# logger.info "The latest command was received from #{event.item}"
|
296
|
+
# end
|
297
|
+
# end
|
298
|
+
# end
|
273
299
|
#
|
274
300
|
def after(duration, id: nil, reschedule: true, &block)
|
275
301
|
raise ArgumentError, "Block is required" unless block
|
@@ -313,10 +339,10 @@ module OpenHAB
|
|
313
339
|
# Store states of supplied items
|
314
340
|
#
|
315
341
|
# Takes one or more items and returns a map `{Item => State}` with the
|
316
|
-
# current state of each item. It is implemented by calling
|
342
|
+
# current state of each item. It is implemented by calling openHAB's
|
317
343
|
# [events.storeStates()](https://www.openhab.org/docs/configuration/actions.html#event-bus-actions).
|
318
344
|
#
|
319
|
-
# @param [
|
345
|
+
# @param [Item] items Items to store states of.
|
320
346
|
#
|
321
347
|
# @return [Core::Items::StateStorage] item states
|
322
348
|
#
|
@@ -603,7 +629,7 @@ module OpenHAB
|
|
603
629
|
# Otherwise it's applied to all types.
|
604
630
|
# @param [Hash] providers_by_type
|
605
631
|
# A list of providers by type. Type can be `:items`, `:metadata`, `:things`, `:links`,
|
606
|
-
#
|
632
|
+
# an {Item} applying the provider to all metadata on that item, or a String or Symbol
|
607
633
|
# applying the provider to all metadata of that namespace.
|
608
634
|
#
|
609
635
|
# The provider can be a {org.openhab.core.common.registry.Provider Provider}, `:persistent`,
|
@@ -667,7 +693,7 @@ module OpenHAB
|
|
667
693
|
thread_providers[type] = provider
|
668
694
|
when Symbol, String
|
669
695
|
(thread_providers[:metadata_namespaces] ||= {})[type.to_s] = provider
|
670
|
-
when
|
696
|
+
when Item
|
671
697
|
(thread_providers[:metadata_items] ||= {})[type.name] = provider
|
672
698
|
else
|
673
699
|
raise ArgumentError, "#{type.inspect} is not provider type"
|
@@ -702,4 +728,4 @@ OpenHAB::Core::Items.import_into_global_namespace
|
|
702
728
|
# Extend `main` with DSL methods
|
703
729
|
singleton_class.include(OpenHAB::DSL)
|
704
730
|
|
705
|
-
logger.debug "
|
731
|
+
logger.debug "openHAB JRuby Scripting Library Version #{OpenHAB::DSL::VERSION} Loaded"
|
data/lib/openhab/log.rb
CHANGED
@@ -6,7 +6,7 @@ module OpenHAB
|
|
6
6
|
# rubocop:disable Layout/LineLength
|
7
7
|
|
8
8
|
#
|
9
|
-
# Provides access to the
|
9
|
+
# Provides access to the openHAB logging facilities using Ruby logging methods
|
10
10
|
#
|
11
11
|
# Logging is available everywhere through the {#logger} object.
|
12
12
|
#
|
@@ -26,7 +26,7 @@ module OpenHAB
|
|
26
26
|
# @example The following entries are in a file named 'log_test.rb'
|
27
27
|
# rule 'foo' do
|
28
28
|
# run { logger.trace('Test logging at trace') } # 2020-12-03 18:05:20.903 [TRACE] [org.openhab.automation.jrubyscripting.foo] - Test logging at trace
|
29
|
-
#
|
29
|
+
# on_load
|
30
30
|
# end
|
31
31
|
#
|
32
32
|
#
|
@@ -122,7 +122,7 @@ module OpenHAB
|
|
122
122
|
end
|
123
123
|
|
124
124
|
#
|
125
|
-
# Ruby Logger that forwards messages at appropriate levels to
|
125
|
+
# Ruby Logger that forwards messages at appropriate levels to openHAB Logger
|
126
126
|
#
|
127
127
|
class Logger
|
128
128
|
# The base prefix for all loggers from this gem.
|
@@ -150,7 +150,7 @@ module OpenHAB
|
|
150
150
|
private_constant :JAVA_INTERNAL_CALL_REGEX
|
151
151
|
|
152
152
|
class << self
|
153
|
-
# The root logger (all of
|
153
|
+
# The root logger (all of openHAB)
|
154
154
|
# @return [Logger]
|
155
155
|
def root
|
156
156
|
Log.logger(org.slf4j.Logger::ROOT_LOGGER_NAME)
|
@@ -299,7 +299,7 @@ module OpenHAB
|
|
299
299
|
end
|
300
300
|
|
301
301
|
#
|
302
|
-
# Log a message to the
|
302
|
+
# Log a message to the openHAB Logger
|
303
303
|
#
|
304
304
|
# @param [Symbol] severity Severity to log message at
|
305
305
|
# @param [Object] msg to log, if no msg supplied and a block is provided,
|
@@ -3,13 +3,13 @@
|
|
3
3
|
module OpenHAB
|
4
4
|
module RSpec
|
5
5
|
#
|
6
|
-
# Contains configuration for how the
|
6
|
+
# Contains configuration for how the openHAB instance should be set
|
7
7
|
# up for the testing environment.
|
8
8
|
#
|
9
9
|
module Configuration
|
10
10
|
class << self
|
11
11
|
#
|
12
|
-
# Copy binding configuration from the root
|
12
|
+
# Copy binding configuration from the root openHAB instance.
|
13
13
|
#
|
14
14
|
# Default `true`.
|
15
15
|
# @return [true, false]
|
@@ -18,7 +18,7 @@ module OpenHAB
|
|
18
18
|
|
19
19
|
#
|
20
20
|
# Copy the JSONDB (managed thing and item configuration) from the root
|
21
|
-
#
|
21
|
+
# openHAB instance.
|
22
22
|
#
|
23
23
|
# Default `true`.
|
24
24
|
#
|
@@ -28,7 +28,7 @@ module OpenHAB
|
|
28
28
|
|
29
29
|
#
|
30
30
|
# Use a private (empty) confdir (scripts, rules, items, and things
|
31
|
-
# files), instead of sharing with the root
|
31
|
+
# files), instead of sharing with the root openHAB instance.
|
32
32
|
#
|
33
33
|
# Default `false`.
|
34
34
|
#
|
@@ -37,7 +37,7 @@ module OpenHAB
|
|
37
37
|
attr_accessor :private_confdir
|
38
38
|
|
39
39
|
#
|
40
|
-
# Use the root
|
40
|
+
# Use the root openHAB instance directly, rather than creating a
|
41
41
|
# private (but linked) instance.
|
42
42
|
#
|
43
43
|
# Default `false`.
|
@@ -94,7 +94,7 @@ module OpenHAB
|
|
94
94
|
# it "logs exceptions in rule execution" do
|
95
95
|
# expect(self.class.propagate_exceptions?).to be false
|
96
96
|
# rule do
|
97
|
-
#
|
97
|
+
# on_load
|
98
98
|
# run { raise "exception is logged" }
|
99
99
|
# end
|
100
100
|
# expect(spec_log_lines).to include(match(/exception is logged/))
|