openhab-scripting 4.16.0 → 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/rules/triggers/changed.rb +43 -7
- data/lib/openhab/dsl/things.rb +21 -0
- data/lib/openhab/version.rb +1 -1
- metadata +2 -1
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'
|
@@ -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
|
data/lib/openhab/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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
|
@@ -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
|