openhab-scripting 4.15.0 → 4.18.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/items/switch_item.rb +8 -0
- data/lib/openhab/dsl/rules/rule.rb +1 -1
- data/lib/openhab/dsl/rules/triggers/changed.rb +43 -7
- data/lib/openhab/dsl/things.rb +34 -4
- data/lib/openhab/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 775d56e757a494c9b854b963f2c15393c2521597cd83e5d36452a41033508339
|
4
|
+
data.tar.gz: 9dfd101285ad28b310156016e524a370352b192147f3fbf87d130135b5a48b9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 773d6bc398e5b24a9aecfb265c6025c75c4863ddf80932e875e9cb60eea4e6fdbf8036803d17c25dfd429127fc5164f1264b4bc48f7fce2cee1cd3fde837372a
|
7
|
+
data.tar.gz: 2e19d2dd05b40da151bd85a253e022209c93819acd20872bd1a30f02d9ad96cdb931c81499f7c222c2c487f962cb56f9db851dee6e3c038a671bac4d44f5481d
|
@@ -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
|
#
|
@@ -20,6 +20,14 @@ module OpenHAB
|
|
20
20
|
on?
|
21
21
|
end
|
22
22
|
|
23
|
+
# Convert boolean commands to ON/OFF
|
24
|
+
# @!visibility private
|
25
|
+
def format_type(command)
|
26
|
+
return Types::OnOffType.from(command) if [true, false].include?(command)
|
27
|
+
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
23
31
|
#
|
24
32
|
# Send a command to invert the state of the switch
|
25
33
|
#
|
@@ -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
|
#
|
@@ -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
|
#
|
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
|
#
|
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.18.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
|