openhab-scripting 4.16.0 → 4.17.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f765fc75455c9aace6d355e897477c727dcdc7e826bb3b16824979c2cf882f56
4
- data.tar.gz: cfb0262989931a22e637e1e2f625ca3f5256da37587d8400b10f68ece4b6c358
3
+ metadata.gz: 15ce3ee9beba70f7ec3bb9f22b7c805a3c73dfb08e8b13f8ca7eb9cf8625f367
4
+ data.tar.gz: 26afc00545927a29657b00ef76bcce40f3d6b831d01362d4a5e9d187c8a6c4b8
5
5
  SHA512:
6
- metadata.gz: 99b0f1896dd66a599449dd96b061f38cc6ad92694bd9502bf14b5b6767330d8eebd714ea41536bb49f730a6fdb9c48e64a04b77c7cb9d54e72d61d617336c2d9
7
- data.tar.gz: ff13507c8f80c3f7dbae3089d8ef322e0c0fbaccf835cdb80ea58ea4e595ac8e92b2e440cf4a2c8c2bf9c9401f9da7f98219857ed88ead80adbe853f3b2f2b76
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
@@ -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
- if (wait_duration = binding.local_variable_get(:for))
38
- changed_wait(item, to: to, from: from, duration: wait_duration, attach: attach)
39
- else
40
- # Place in array and flatten to support multiple to elements or single or nil
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
  #
@@ -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
@@ -5,5 +5,5 @@
5
5
  #
6
6
  module OpenHAB
7
7
  # @return [String] Version of OpenHAB helper libraries
8
- VERSION = '4.16.0'
8
+ VERSION = '4.17.0'
9
9
  end
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.16.0
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