openhab-scripting 4.14.2 → 4.17.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.
- checksums.yaml +4 -4
- data/lib/openhab/dsl/channel.rb +43 -0
- data/lib/openhab/dsl/dsl.rb +1 -0
- data/lib/openhab/dsl/items/generic_item.rb +19 -0
- data/lib/openhab/dsl/rules/automation_rule.rb +20 -10
- data/lib/openhab/dsl/rules/rule.rb +1 -1
- data/lib/openhab/dsl/rules/rule_config.rb +1 -0
- data/lib/openhab/dsl/rules/triggers/changed.rb +43 -7
- data/lib/openhab/dsl/rules/triggers/generic.rb +29 -0
- data/lib/openhab/dsl/rules/triggers/trigger.rb +1 -0
- data/lib/openhab/dsl/things.rb +34 -4
- data/lib/openhab/dsl/types/quantity_type.rb +1 -5
- data/lib/openhab/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15ce3ee9beba70f7ec3bb9f22b7c805a3c73dfb08e8b13f8ca7eb9cf8625f367
|
4
|
+
data.tar.gz: 26afc00545927a29657b00ef76bcce40f3d6b831d01362d4a5e9d187c8a6c4b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8db2e2ae436fb49c7de5de26c1570de4b32f279b43b26c5e5e445460c3b496feb9bbeb0a90acab7954de8b664b22d8051f32f4bd8d97fc0ae04e916cbbb9661
|
7
|
+
data.tar.gz: f43eaebacfb2bae1c84c9aa5b275d6256dfd10bffae4aa8722e84d6c83adca275a057080b98acb4875c001bb15c405ade84692008b25aef1d5df20ca87b3666a
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module OpenHAB
|
6
|
+
module DSL
|
7
|
+
java_import org.openhab.core.thing.Channel
|
8
|
+
java_import org.openhab.core.thing.ChannelUID
|
9
|
+
|
10
|
+
# Adds methods to core OpenHAB Channel to make it more natural in Ruby
|
11
|
+
class Channel
|
12
|
+
extend Forwardable
|
13
|
+
|
14
|
+
delegate %i[thing item items] => :uid
|
15
|
+
end
|
16
|
+
|
17
|
+
# Adds methods to core OpenHAB ChannelUID to make it more natural in Ruby
|
18
|
+
class ChannelUID
|
19
|
+
# Return the thing this channel is associated with.
|
20
|
+
#
|
21
|
+
# @return [Thing] The thing associated with this channel or nil
|
22
|
+
def thing
|
23
|
+
things[thing_uid]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Return the item if this channel is linked with an item. If a channel is linked to more than one item,
|
27
|
+
# this method only returns the first item.
|
28
|
+
#
|
29
|
+
# @return [GenericItem] The item associated with this channel or nil
|
30
|
+
def item
|
31
|
+
items.first
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns all of the channel's linked items.
|
35
|
+
#
|
36
|
+
# @return [Array<GenericItem>] An array of things or an empty array
|
37
|
+
def items
|
38
|
+
registry = OpenHAB::Core::OSGI.service('org.openhab.core.thing.link.ItemChannelLinkRegistry')
|
39
|
+
registry.get_linked_items(self).to_a
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/openhab/dsl/dsl.rb
CHANGED
@@ -12,6 +12,7 @@ require 'openhab/dsl/monkey_patch/actions/actions'
|
|
12
12
|
require 'openhab/dsl/rules/rule'
|
13
13
|
require 'openhab/dsl/rules/terse'
|
14
14
|
require 'openhab/dsl/actions'
|
15
|
+
require 'openhab/dsl/channel'
|
15
16
|
require 'openhab/dsl/timers'
|
16
17
|
require 'openhab/dsl/group'
|
17
18
|
require 'openhab/dsl/things'
|
@@ -131,6 +131,25 @@ module OpenHAB
|
|
131
131
|
group_names.map { |name| Groups.groups[name] }
|
132
132
|
end
|
133
133
|
|
134
|
+
# Return the item's thing if this item is linked with a thing. If an item is linked to more than one thing,
|
135
|
+
# this method only returns the first thing.
|
136
|
+
#
|
137
|
+
# @return [Thing] The thing associated with this item or nil
|
138
|
+
def thing
|
139
|
+
all_linked_things.first
|
140
|
+
end
|
141
|
+
alias linked_thing thing
|
142
|
+
|
143
|
+
# Returns all of the item's linked things.
|
144
|
+
#
|
145
|
+
# @return [Array] An array of things or an empty array
|
146
|
+
def things
|
147
|
+
registry = OpenHAB::Core::OSGI.service('org.openhab.core.thing.link.ItemChannelLinkRegistry')
|
148
|
+
channels = registry.get_bound_channels(name).to_a
|
149
|
+
channels.map(&:thing_uid).uniq.map { |tuid| Object.things[tuid] }
|
150
|
+
end
|
151
|
+
alias all_linked_things things
|
152
|
+
|
134
153
|
#
|
135
154
|
# Check equality without type conversion
|
136
155
|
#
|
@@ -87,7 +87,7 @@ module OpenHAB
|
|
87
87
|
# @return [Queue] <description>
|
88
88
|
#
|
89
89
|
def create_queue(inputs)
|
90
|
-
case check_guards(event: inputs
|
90
|
+
case check_guards(event: extract_event(inputs))
|
91
91
|
when true
|
92
92
|
@run_queue.dup.grep_v(RuleConfig::Otherwise)
|
93
93
|
when false
|
@@ -95,13 +95,30 @@ module OpenHAB
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
+
#
|
99
|
+
# Extract the event object from inputs
|
100
|
+
# and merge other inputs keys/values into the event
|
101
|
+
#
|
102
|
+
# @param [Map] inputs rule inputs
|
103
|
+
#
|
104
|
+
# @return [Object] event object
|
105
|
+
#
|
106
|
+
def extract_event(inputs)
|
107
|
+
event = inputs&.dig('event')
|
108
|
+
unless event
|
109
|
+
event = Struct.new(:event, :attachment, :command).new
|
110
|
+
event.command = inputs&.dig('command')
|
111
|
+
end
|
112
|
+
add_attachment(event, inputs)
|
113
|
+
end
|
114
|
+
|
98
115
|
#
|
99
116
|
# Get the trigger_id for the trigger that caused the rule creation
|
100
117
|
#
|
101
118
|
# @return [Hash] Input hash potentially containing trigger id
|
102
119
|
#
|
103
120
|
def trigger_id(inputs)
|
104
|
-
inputs&.
|
121
|
+
inputs&.dig('module')
|
105
122
|
end
|
106
123
|
|
107
124
|
#
|
@@ -128,10 +145,6 @@ module OpenHAB
|
|
128
145
|
attachment = @attachments[trigger_id(inputs)]
|
129
146
|
return event unless attachment
|
130
147
|
|
131
|
-
# Some events, like those from cron triggers don't have an event
|
132
|
-
# so an event is created
|
133
|
-
event ||= Struct.new(:event).new
|
134
|
-
|
135
148
|
event.attachment = attachment
|
136
149
|
event
|
137
150
|
end
|
@@ -301,11 +314,9 @@ module OpenHAB
|
|
301
314
|
# @param [Map] inputs OpenHAB map object describing rule trigge
|
302
315
|
#
|
303
316
|
#
|
304
|
-
# rubocop:disable Metrics/MethodLength
|
305
317
|
# No logical way to break this method up
|
306
318
|
def process_queue(run_queue, mod, inputs)
|
307
|
-
event = inputs
|
308
|
-
event = add_attachment(event, inputs)
|
319
|
+
event = extract_event(inputs)
|
309
320
|
|
310
321
|
while (task = run_queue.shift)
|
311
322
|
if task.is_a? RuleConfig::Delay
|
@@ -317,7 +328,6 @@ module OpenHAB
|
|
317
328
|
rescue StandardError => e
|
318
329
|
print_backtrace(e)
|
319
330
|
end
|
320
|
-
# rubocop:enable Metrics/MethodLength
|
321
331
|
|
322
332
|
#
|
323
333
|
# Dispatch execution block tasks to different methods
|
@@ -38,7 +38,6 @@ module OpenHAB
|
|
38
38
|
config.guard = Guard::Guard.new(only_if: config.only_if, not_if: config.not_if)
|
39
39
|
logger.trace { config.inspect }
|
40
40
|
process_rule_config(config)
|
41
|
-
config
|
42
41
|
rescue StandardError => e
|
43
42
|
re_raise_with_backtrace(e)
|
44
43
|
end
|
@@ -89,6 +88,7 @@ module OpenHAB
|
|
89
88
|
Rules.script_rules << rule
|
90
89
|
add_rule(rule)
|
91
90
|
rule.execute(nil, { 'event' => Struct.new(:attachment).new(config.start_attachment) }) if config.on_start?
|
91
|
+
rule
|
92
92
|
end
|
93
93
|
|
94
94
|
#
|
@@ -8,6 +8,7 @@ require 'openhab/dsl/rules/triggers/changed'
|
|
8
8
|
require 'openhab/dsl/rules/triggers/channel'
|
9
9
|
require 'openhab/dsl/rules/triggers/command'
|
10
10
|
require 'openhab/dsl/rules/triggers/updated'
|
11
|
+
require 'openhab/dsl/rules/triggers/generic'
|
11
12
|
require 'openhab/dsl/rules/guard'
|
12
13
|
require 'openhab/core/entity_lookup'
|
13
14
|
require 'openhab/dsl/between'
|
@@ -33,20 +33,56 @@ module OpenHAB
|
|
33
33
|
def changed(*items, to: nil, from: nil, for: nil, attach: nil)
|
34
34
|
separate_groups(items).map do |item|
|
35
35
|
logger.trace("Creating changed trigger for entity(#{item}), to(#{to}), from(#{from})")
|
36
|
+
|
36
37
|
# for is a reserved word in ruby, so use local_variable_get :for
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
[to].flatten.map do |to_state|
|
42
|
-
[from].flatten.map { |from_state| create_changed_trigger(item, from_state, to_state, attach) }
|
43
|
-
end
|
38
|
+
wait_duration = binding.local_variable_get(:for)
|
39
|
+
|
40
|
+
each_state(from, to) do |from_state, to_state|
|
41
|
+
changed_or_wait(item, from_state, to_state, wait_duration, attach)
|
44
42
|
end
|
45
43
|
end.flatten
|
46
44
|
end
|
47
45
|
|
48
46
|
private
|
49
47
|
|
48
|
+
#
|
49
|
+
# Run block for each state combination
|
50
|
+
#
|
51
|
+
# @param [Item State, Array<Item State>] from state to restrict trigger to
|
52
|
+
# @param [Item State, Array<Item State>] to state to restrict trigger to
|
53
|
+
#
|
54
|
+
# @yieldparam [Item State] from_state from state
|
55
|
+
# @yieldparam [Item State] to_state to state
|
56
|
+
#
|
57
|
+
# @return [Array] array of block return values
|
58
|
+
#
|
59
|
+
def each_state(from, to)
|
60
|
+
[to].flatten.each_with_object([]) do |to_state, agg|
|
61
|
+
[from].flatten.each do |from_state|
|
62
|
+
agg.push(yield(from_state, to_state))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# Create regular or delayed trigger based on duration
|
69
|
+
#
|
70
|
+
# @param [Object] item item to create trigger for
|
71
|
+
# @param [Item State] from state to restrict trigger to
|
72
|
+
# @param [Item State] to state to restrict trigger to
|
73
|
+
# @param [OpenHAB::Core::Duration, nil] duration ruration to delay trigger until to state is met
|
74
|
+
# @param attach attachment
|
75
|
+
#
|
76
|
+
# @return [Trigger] OpenHAB triggers
|
77
|
+
#
|
78
|
+
def changed_or_wait(item, from, to, duration, attach)
|
79
|
+
if duration
|
80
|
+
changed_wait(item, from: from, to: to, duration: duration, attach: attach)
|
81
|
+
else
|
82
|
+
create_changed_trigger(item, from, to, attach)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
50
86
|
#
|
51
87
|
# Create a TriggerDelay for for an item or group that is changed for a specific duration
|
52
88
|
#
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openhab/log/logger'
|
4
|
+
|
5
|
+
module OpenHAB
|
6
|
+
module DSL
|
7
|
+
module Rules
|
8
|
+
#
|
9
|
+
# Module holds rule triggers
|
10
|
+
#
|
11
|
+
module Triggers
|
12
|
+
include OpenHAB::Log
|
13
|
+
|
14
|
+
#
|
15
|
+
# Create a generic trigger given the trigger type uid and a configuration hash
|
16
|
+
#
|
17
|
+
# @param [Type] Trigger type UID
|
18
|
+
# @param [Configuration] A hash containing the trigger configuration entries
|
19
|
+
#
|
20
|
+
# @return [Trigger] Trigger object
|
21
|
+
#
|
22
|
+
def trigger(type, attach: nil, **configuration)
|
23
|
+
logger.trace("Creating a generic trigger for type(#{type}) with configuration(#{configuration})")
|
24
|
+
append_trigger(type, configuration, attach: attach)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -48,6 +48,7 @@ module OpenHAB
|
|
48
48
|
#
|
49
49
|
def append_trigger(type, config, attach: nil)
|
50
50
|
logger.trace("Creating trigger of type #{type} for #{config}")
|
51
|
+
config.transform_keys!(&:to_s)
|
51
52
|
trigger = Trigger.trigger(type: type, config: config)
|
52
53
|
@attachments[trigger.id] = attach if attach
|
53
54
|
@triggers << trigger
|
data/lib/openhab/dsl/things.rb
CHANGED
@@ -21,6 +21,21 @@ module OpenHAB
|
|
21
21
|
# Ruby Delegator for Thing
|
22
22
|
#
|
23
23
|
class Thing < SimpleDelegator
|
24
|
+
# Array wrapper class to allow searching a list of channels
|
25
|
+
# by channel id
|
26
|
+
class ChannelsArray < Array
|
27
|
+
# Allows indexing by both integer as an array or channel id acting like a hash.
|
28
|
+
# @param [Integer, String] index Numeric index or string channel id to search for.
|
29
|
+
def [](index)
|
30
|
+
if index.respond_to?(:to_str)
|
31
|
+
key = index.to_str
|
32
|
+
return find { |channel| channel.uid.id == key }
|
33
|
+
end
|
34
|
+
|
35
|
+
super
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
24
39
|
include OpenHAB::DSL::Actions
|
25
40
|
include OpenHAB::Log
|
26
41
|
|
@@ -45,6 +60,12 @@ module OpenHAB
|
|
45
60
|
define_method("#{thingstatus.to_s.downcase}?") { status == ThingStatus.value_of(thingstatus) }
|
46
61
|
end
|
47
62
|
|
63
|
+
# Returns the list of channels associated with this Thing
|
64
|
+
# @return [Array] channels
|
65
|
+
def channels
|
66
|
+
ChannelsArray.new(super.to_a)
|
67
|
+
end
|
68
|
+
|
48
69
|
private
|
49
70
|
|
50
71
|
java_import org.openhab.core.automation.annotation.RuleAction
|
@@ -83,11 +104,11 @@ module OpenHAB
|
|
83
104
|
include LazyArray
|
84
105
|
include Singleton
|
85
106
|
|
86
|
-
# Gets a specific thing by name in the format binding_id:type_id:thing_id
|
87
|
-
# @return Thing specified by name or nil if name does not exist in thing registry
|
107
|
+
# Gets a specific thing by name in the format binding_id:type_id:thing_id or via the ThingUID
|
108
|
+
# @return Thing specified by name/UID or nil if name/UID does not exist in thing registry
|
88
109
|
def [](uid)
|
89
|
-
|
90
|
-
thing = $things.get(
|
110
|
+
uid = generate_thing_uid(uid) unless uid.is_a?(org.openhab.core.thing.ThingUID)
|
111
|
+
thing = $things.get(uid) # rubocop: disable Style/GlobalVars
|
91
112
|
return unless thing
|
92
113
|
|
93
114
|
logger.trace("Retrieved Thing(#{thing}) from registry for uid: #{uid}")
|
@@ -100,6 +121,15 @@ module OpenHAB
|
|
100
121
|
def to_a
|
101
122
|
$things.getAll.map { |thing| Thing.new(thing) } # rubocop: disable Style/GlobalVars
|
102
123
|
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
# Returns a ThingUID given a string like object
|
128
|
+
#
|
129
|
+
# @return ThingUID generated by given name
|
130
|
+
def generate_thing_uid(uid)
|
131
|
+
org.openhab.core.thing.ThingUID.new(*uid.split(':'))
|
132
|
+
end
|
103
133
|
end
|
104
134
|
|
105
135
|
#
|
@@ -30,11 +30,7 @@ module OpenHAB
|
|
30
30
|
#
|
31
31
|
# @return [QuantityType] This quantity converted to another unit
|
32
32
|
#
|
33
|
-
|
34
|
-
other = org.openhab.core.types.util.UnitUtils.parse_unit(other) if other.is_a?(String)
|
35
|
-
|
36
|
-
to_unit(other)
|
37
|
-
end
|
33
|
+
alias | to_unit
|
38
34
|
|
39
35
|
#
|
40
36
|
# Comparison
|
data/lib/openhab/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openhab-scripting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian O'Connell
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- lib/openhab/core/thread_local.rb
|
55
55
|
- lib/openhab/dsl/actions.rb
|
56
56
|
- lib/openhab/dsl/between.rb
|
57
|
+
- lib/openhab/dsl/channel.rb
|
57
58
|
- lib/openhab/dsl/dsl.rb
|
58
59
|
- lib/openhab/dsl/gems.rb
|
59
60
|
- lib/openhab/dsl/group.rb
|
@@ -103,6 +104,7 @@ files:
|
|
103
104
|
- lib/openhab/dsl/rules/triggers/channel.rb
|
104
105
|
- lib/openhab/dsl/rules/triggers/command.rb
|
105
106
|
- lib/openhab/dsl/rules/triggers/cron.rb
|
107
|
+
- lib/openhab/dsl/rules/triggers/generic.rb
|
106
108
|
- lib/openhab/dsl/rules/triggers/trigger.rb
|
107
109
|
- lib/openhab/dsl/rules/triggers/updated.rb
|
108
110
|
- lib/openhab/dsl/states.rb
|