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 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