openhab-scripting 2.27.1 → 3.0.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: f73567aa2e4ca6070bbcb6963c46babc966e069f62d60f4def67fbca8aa0b70e
4
- data.tar.gz: d01862005948c69fb130ba93a14732f6fa565528b40d13ce13252c6da7523359
3
+ metadata.gz: 7eb19f2aa4bac30a6fb3b4f07953a9b78a54419795d4845c073432d803fa8629
4
+ data.tar.gz: 7528671d2c2db7a58ecdc46b33f9b94656ff2cfc878ab76bc2703fcff4c49a7b
5
5
  SHA512:
6
- metadata.gz: bbdae9215b3347eabc65ea92eb70ac44834b374233ce7f31b15bfa8f99dcc05c9b85d2c1b7fad3c29d63be62100966648bac9e4255ab614edf40a2dd231b24a8
7
- data.tar.gz: 5d8b30987d208674337ffddd43caaeee1c72596ae82e9a3792b74adbb0d7c82879040333173230c6016fb0552be191de877ec664566cbd61f9b14fc150ed4d9e
6
+ metadata.gz: 6ef8331db3b6985bcc1ebb3b3b16fb251b61a482e10fc586e1d6bb2f7460ca197ecf8e38492613effd7fe6ff3f62f3975b443879f698373083c0b6ec192542d5
7
+ data.tar.gz: 20451cc85edb7a50ad3d5f7d80415b6b769129d5ce5b9cd246f98d51f1c588036340a7c1c9211184c396b1919a44c8d49fa303b3637d6182964b28cf76ca6edb
@@ -9,9 +9,9 @@ require 'openhab/dsl/items/number_item'
9
9
  require 'openhab/dsl/items/string_item'
10
10
  require 'openhab/dsl/items/datetime_item'
11
11
  require 'openhab/dsl/items/rollershutter_item'
12
+ require 'openhab/dsl/items/group_item'
12
13
 
13
14
  # Automation lookup and injection of OpenHab entities
14
- java_import org.openhab.core.items.GroupItem
15
15
 
16
16
  module OpenHAB
17
17
  module Core
@@ -88,10 +88,10 @@ module OpenHAB
88
88
  #
89
89
  # rubocop: disable Metrics/MethodLength
90
90
  # Disabled line length and branch size - case dispatch pattern
91
- private_class_method def self.decorate_item(item)
91
+ def self.decorate_item(item)
92
92
  case item
93
- when GroupItem
94
- decorate_group(item)
93
+ when Java::OrgOpenhabCoreItems::GroupItem
94
+ OpenHAB::DSL::Items::GroupItem.new(item)
95
95
  when Java::OrgOpenhabCoreLibraryItems::NumberItem
96
96
  OpenHAB::DSL::Items::NumberItem.new(item)
97
97
  when Java::OrgOpenhabCoreLibraryItems::StringItem
@@ -144,19 +144,6 @@ module OpenHAB
144
144
  # rubocop: enable Style/GlobalVars
145
145
  decorate_item(item)
146
146
  end
147
-
148
- #
149
- # Decorate a group from an item base
150
- #
151
- # @param [OpenHAB item] item item to convert to a group item
152
- #
153
- # @return [OpenHAB::DSL::Groups::Group] Group created from supplied item
154
- #
155
- private_class_method def self.decorate_group(item)
156
- group = OpenHAB::DSL::Groups::Group.new(Set.new(decorate_items(item.all_members.to_a)))
157
- group.group = item
158
- group
159
- end
160
147
  end
161
148
  end
162
149
  end
@@ -16,6 +16,7 @@ require 'openhab/dsl/items/items'
16
16
  require 'openhab/dsl/items/datetime_item'
17
17
  require 'openhab/dsl/items/number_item'
18
18
  require 'openhab/dsl/items/player_item'
19
+ require 'openhab/dsl/items/group_item'
19
20
  require 'openhab/dsl/time_of_day'
20
21
  require 'openhab/dsl/gems'
21
22
  require 'openhab/dsl/persistence'
@@ -3,6 +3,7 @@
3
3
  require 'delegate'
4
4
  require 'forwardable'
5
5
  require 'openhab/core/entity_lookup'
6
+ require 'openhab/dsl/items/group_item'
6
7
 
7
8
  module OpenHAB
8
9
  module DSL
@@ -10,11 +11,6 @@ module OpenHAB
10
11
  # Provides access to OpenHAB Groups
11
12
  #
12
13
  module Groups
13
- #
14
- # Indicator struct interpreted by rules to trigger based on items contained in a group
15
- #
16
- GroupItems = Struct.new(:group, keyword_init: true)
17
-
18
14
  #
19
15
  # Provide access to groups as a set
20
16
  #
@@ -27,7 +23,7 @@ module OpenHAB
27
23
  #
28
24
  def[](name)
29
25
  group = OpenHAB::Core::EntityLookup.lookup_item(name)
30
- group.is_a?(Group) ? group : nil
26
+ group.is_a?(OpenHAB::DSL::Items::GroupItem) ? group : nil
31
27
  end
32
28
  end
33
29
 
@@ -38,64 +34,9 @@ module OpenHAB
38
34
  #
39
35
  def groups
40
36
  # rubocop: disable Style/GlobalVars
41
- Groups.new(OpenHAB::Core::EntityLookup.decorate_items($ir.items.select { |item| item.is_a? GroupItem }))
37
+ Groups.new(OpenHAB::Core::EntityLookup.decorate_items($ir.items.grep(Java::OrgOpenhabCoreItems::GroupItem)))
42
38
  # rubocop: enable Style/GlobalVars
43
39
  end
44
-
45
- # Group class that provides access to OpenHAB group object and delegates other methods to
46
- # a set of group items
47
- class Group < SimpleDelegator
48
- extend Forwardable
49
-
50
- java_import Java::OrgOpenhabCoreItems::GroupItem
51
-
52
- # @return [org.openhab.core.items.GroupItem] OpenHAB Java Group Item
53
- attr_accessor :group
54
-
55
- # @!macro [attach] def_delegators
56
- # @!method $2
57
- # Forwards to org.openhab.core.items.GroupItem
58
- # @see org::openhab::core::items::GroupItem
59
- %i[name label << command].each do |method|
60
- def_delegator :@group, method
61
- end
62
-
63
- #
64
- # Gets members of this group that are themselves a group
65
- #
66
- # @return [Set] Set of members that are of type group
67
- #
68
- def groups
69
- group.members.grep(GroupItem)
70
- end
71
-
72
- #
73
- # Wraps the group in a struct, this method is intended to be called
74
- # as an indicator to the rule method that the user wishes to trigger
75
- # based on changes to group items
76
- #
77
- # @return [GroupItems] Indicator struct used by rules engine to trigger based on item changes
78
- #
79
- def items
80
- GroupItems.new(group: group)
81
- end
82
-
83
- #
84
- # @return [String] List of groups seperated by commas
85
- #
86
- def to_s
87
- "[#{map(&:to_s).join(',')}]"
88
- end
89
-
90
- #
91
- # Get an ID for the group, using the label if set, otherwise group name
92
- #
93
- # @return [String] label if set otherwise name
94
- #
95
- def id
96
- label || name
97
- end
98
- end
99
40
  end
100
41
  end
101
42
  end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+ require 'forwardable'
5
+ require 'java'
6
+ require 'openhab/dsl/items/item_command'
7
+ require 'openhab/dsl/items/item_delegate'
8
+ require 'openhab/core/entity_lookup'
9
+
10
+ module OpenHAB
11
+ module DSL
12
+ module Items
13
+ #
14
+ # Class for indicating to triggers that a group trigger should be used
15
+ #
16
+ class GroupMembers < SimpleDelegator
17
+ attr_reader :group
18
+
19
+ #
20
+ # Create a new GroupMembers instance from a GroupItem
21
+ #
22
+ # @param [GroupItem] group_item GroupItem to use as trigger
23
+ #
24
+ def initialize(group_item)
25
+ @group = group_item
26
+ super(OpenHAB::Core::EntityLookup.decorate_items(@group.members.to_a))
27
+ end
28
+ end
29
+
30
+ #
31
+ # Delegator to OpenHAB Group Item
32
+ #
33
+ class GroupItem
34
+ extend OpenHAB::DSL::Items::ItemCommand
35
+ extend OpenHAB::DSL::Items::ItemDelegate
36
+ include Enumerable
37
+ include Comparable
38
+
39
+ def_item_delegator :@group_item
40
+
41
+ #
42
+ # @return [Hash] A hash of lambdas with default filters for `all_members`
43
+ #
44
+ DEFAULT_FILTERS = {
45
+ groups: ->(item) { item.is_a?(Java::OrgOpenhabCoreItems::GroupItem) },
46
+ all: -> { true }
47
+ }.freeze
48
+
49
+ private_constant :DEFAULT_FILTERS
50
+
51
+ #
52
+ # Create a new GroupItem
53
+ #
54
+ # @param [Java::Org::openhab::core::items::GroupItem] group_item OpenHAB GroupItem to delegate to
55
+ #
56
+ def initialize(group_item)
57
+ @group_item = group_item
58
+
59
+ item_missing_delegate { @group_item }
60
+ item_missing_delegate { OpenHAB::Core::EntityLookup.decorate_item(base_item) }
61
+ end
62
+
63
+ #
64
+ # Create a GroupMembers object for use in triggers
65
+ #
66
+ # @return [GroupMembers] A GroupMembers object
67
+ #
68
+ def members
69
+ GroupMembers.new(@group_item)
70
+ end
71
+
72
+ #
73
+ # Iterates through the direct members of the Group
74
+ #
75
+ def each(&block)
76
+ OpenHAB::Core::EntityLookup.decorate_items(@group_item.members.to_a).each(&block)
77
+ end
78
+
79
+ #
80
+ # Get all members of the group recursively. Optionally filter the items to only return
81
+ # Groups or regular Items
82
+ #
83
+ # @param [Symbol] filter Either :groups or :items
84
+ #
85
+ # @return [Array] An Array containing all descendants of the Group, optionally filtered
86
+ #
87
+ def all_members(filter = nil, &block)
88
+ predicate = DEFAULT_FILTERS[filter] || block
89
+
90
+ return OpenHAB::Core::EntityLookup.decorate_items(@group_item.all_members.to_a) unless predicate
91
+
92
+ OpenHAB::Core::EntityLookup.decorate_items(@group_item.get_members(&predicate).to_a)
93
+ end
94
+
95
+ #
96
+ # Test for equality
97
+ #
98
+ # @param [Object] other Other object to compare against
99
+ #
100
+ # @return [Boolean] true if self and other can be considered equal, false otherwise
101
+ #
102
+ def ==(other)
103
+ if other.respond_to?(:java_class) && accepted_data_types.include?(other.java_class)
104
+ get_state_as(other.class) == other
105
+ elsif other.respond_to?(:state)
106
+ base_item ? OpenHAB::Core::EntityLookup.decorate_item(base_item) == other.state : self == other.state
107
+ else
108
+ super
109
+ end
110
+ end
111
+
112
+ #
113
+ # Compare GroupItem to supplied object
114
+ #
115
+ # @param [Object] other object to compare to
116
+ #
117
+ # @return [Integer] -1,0,1 or nil depending on value supplied,
118
+ # nil comparison to supplied object is not possible.
119
+ #
120
+ def <=>(other)
121
+ if base_item
122
+ OpenHAB::Core::EntityLookup.decorate_item(base_item) <=> other
123
+ elsif state?
124
+ -(other <=> state)
125
+ else
126
+ super
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -33,12 +33,11 @@ module OpenHAB
33
33
  alias key? include?
34
34
  end
35
35
 
36
- java_import Java::OrgOpenhabCoreItems::GroupItem
37
36
  # Fetches all non-group items from the item registry
38
37
  # @return [OpenHAB::DSL::Items::Items]
39
38
  def items
40
39
  # rubocop: disable Style/GlobalVars
41
- Items.new(OpenHAB::Core::EntityLookup.decorate_items($ir.items.reject { |item| item.is_a? GroupItem }))
40
+ Items.new(OpenHAB::Core::EntityLookup.decorate_items($ir.items.grep_v(Java::OrgOpenhabCoreItems::GroupItem)))
42
41
  # rubocop: enable Style/GlobalVars
43
42
  end
44
43
  end
@@ -10,7 +10,6 @@ require 'openhab/dsl/monkey_patch/items/persistence'
10
10
  require 'openhab/dsl/monkey_patch/items/contact_item'
11
11
  require 'openhab/dsl/monkey_patch/items/dimmer_item'
12
12
  require 'openhab/dsl/monkey_patch/items/switch_item'
13
- require 'openhab/dsl/monkey_patch/items/group_item'
14
13
 
15
14
  module OpenHAB
16
15
  module DSL
@@ -8,6 +8,7 @@ module OpenHAB
8
8
  # Persistence extension for Items
9
9
  #
10
10
  module Persistence
11
+ java_import Java::OrgOpenhabCoreTypesUtil::UnitUtils
11
12
  # All persistence methods that could return a Quantity
12
13
  QUANTITY_METHODS = %i[average_since
13
14
  delta_since
@@ -81,9 +82,10 @@ module OpenHAB
81
82
  # @return [Object] Quantity or the original value
82
83
  #
83
84
  def quantify(value)
84
- if value.is_a?(Java::OrgOpenhabCoreLibraryTypes::DecimalType) && respond_to?(:unit) && unit
85
- logger.trace("Unitizing #{value} with unit #{unit}")
86
- Quantity.new(Java::OrgOpenhabCoreLibraryTypes::QuantityType.new(value.to_big_decimal, unit))
85
+ if value.is_a?(Java::OrgOpenhabCoreLibraryTypes::DecimalType) && state_description&.pattern
86
+ item_unit = UnitUtils.parse_unit(state_description.pattern)
87
+ logger.trace("Unitizing #{value} with unit #{item_unit}")
88
+ Quantity.new(Java::OrgOpenhabCoreLibraryTypes::QuantityType.new(value.to_big_decimal, item_unit))
87
89
  else
88
90
  value
89
91
  end
@@ -25,9 +25,13 @@ module OpenHAB
25
25
  # @return [Boolean] True if the other object is a ContactItem and has the same state
26
26
  #
27
27
  def ===(other)
28
- super unless other.is_a? ContactItem
29
-
30
- self == other.state
28
+ if other.respond_to?(:state)
29
+ self == other.state
30
+ elsif other.is_a? OpenClosedType
31
+ self == other
32
+ else
33
+ super
34
+ end
31
35
  end
32
36
  end
33
37
  end
@@ -22,9 +22,13 @@ module OpenHAB
22
22
  # @return [Boolean] True if the other object is a RollershutterItem and has the same state
23
23
  #
24
24
  def ===(other)
25
- super unless other.is_a? OpenHAB::DSL::Items::RollershutterItem
26
-
27
- equals(other.state.as(UpDownType))
25
+ if other.respond_to?(:state)
26
+ self == other.state&.as(UpDownType)
27
+ elsif other.is_a? UpDownType
28
+ self == other
29
+ else
30
+ super
31
+ end
28
32
  end
29
33
  end
30
34
  end
@@ -31,8 +31,6 @@ module OpenHAB
31
31
  include OpenHAB::DSL::Rules::Property
32
32
  extend OpenHAB::DSL
33
33
 
34
- java_import org.openhab.core.library.items.SwitchItem
35
-
36
34
  # @return [Array] Of triggers
37
35
  attr_reader :triggers
38
36
 
@@ -31,7 +31,7 @@ module OpenHAB
31
31
  # @return [Trigger] OpenHAB trigger
32
32
  #
33
33
  def changed(*items, to: nil, from: nil, for: nil)
34
- items.flatten.each do |item|
34
+ separate_groups(items).each do |item|
35
35
  logger.trace("Creating changed trigger for entity(#{item}), to(#{to}), from(#{from})")
36
36
  # for is a reserved word in ruby, so use local_variable_get :for
37
37
  if (wait_duration = binding.local_variable_get(:for))
@@ -73,7 +73,8 @@ module OpenHAB
73
73
  #
74
74
  def create_changed_trigger(item, from, to)
75
75
  trigger, config = case item
76
- when GroupItems then create_group_changed_trigger(item, from, to)
76
+ when OpenHAB::DSL::Items::GroupItem::GroupMembers
77
+ create_group_changed_trigger(item, from, to)
77
78
  when Thing then create_thing_changed_trigger(item, from, to)
78
79
  else create_item_changed_trigger(item, from, to)
79
80
  end
@@ -22,7 +22,7 @@ module OpenHAB
22
22
  #
23
23
  #
24
24
  def received_command(*items, command: nil, commands: nil)
25
- items.flatten.each do |item|
25
+ separate_groups(items).flatten.each do |item|
26
26
  logger.trace("Creating received command trigger for item(#{item})"\
27
27
  "command(#{command}) commands(#{commands})")
28
28
 
@@ -43,7 +43,7 @@ module OpenHAB
43
43
  #
44
44
  def create_received_trigger(commands, item)
45
45
  commands.each do |command|
46
- if item.is_a? GroupItems
46
+ if item.is_a? OpenHAB::DSL::Items::GroupItem::GroupMembers
47
47
  config, trigger = create_group_command_trigger(item)
48
48
  else
49
49
  config, trigger = create_item_command_trigger(item)
@@ -53,6 +53,20 @@ module OpenHAB
53
53
  trigger
54
54
  end
55
55
 
56
+ #
57
+ # Separates groups from items, and flattens any nested arrays of items
58
+ #
59
+ # @param [Array] item_array Array of items passed to a trigger
60
+ #
61
+ # @return [Array] A new flat array with any GroupMembers object left intact
62
+ #
63
+ def separate_groups(item_array)
64
+ return item_array if item_array.length <= 1 && item_array.grep(Array).length.zero?
65
+
66
+ groups, items = item_array.partition { |item| item.is_a? OpenHAB::DSL::Items::GroupItem::GroupMembers }
67
+ groups + separate_groups(items.flatten(1))
68
+ end
69
+
56
70
  #
57
71
  # Class for creating and managing triggers
58
72
  #
@@ -20,7 +20,7 @@ module OpenHAB
20
20
  # @return [Trigger] Trigger for updated entity
21
21
  #
22
22
  def updated(*items, to: nil)
23
- items.flatten.each do |item|
23
+ separate_groups(items).flatten.each do |item|
24
24
  logger.trace("Creating updated trigger for item(#{item}) to(#{to})")
25
25
  [to].flatten.each do |to_state|
26
26
  trigger, config = create_update_trigger(item, to_state)
@@ -42,7 +42,7 @@ module OpenHAB
42
42
  #
43
43
  def create_update_trigger(item, to_state)
44
44
  case item
45
- when GroupItems then group_update(item, to_state)
45
+ when OpenHAB::DSL::Items::GroupItem::GroupMembers then group_update(item, to_state)
46
46
  when Thing then thing_update(item, to_state)
47
47
  else item_update(item, to_state)
48
48
  end
@@ -48,8 +48,7 @@ module OpenHAB
48
48
  # @return [StateStorage] item states
49
49
  #
50
50
  def store_states(*items)
51
- items = items.flatten.map { |item| item.is_a?(Group) ? item.group : item }
52
- states = StateStorage.new(BusEvent.storeStates(*items).to_h)
51
+ states = StateStorage.new(BusEvent.storeStates(*items.flatten).to_h)
53
52
  if block_given?
54
53
  yield
55
54
  states.restore
@@ -5,5 +5,5 @@
5
5
  #
6
6
  module OpenHAB
7
7
  # @return [String] Version of OpenHAB helper libraries
8
- VERSION = '2.27.1'
8
+ VERSION = '3.0.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: 2.27.1
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian O'Connell
@@ -40,6 +40,7 @@ files:
40
40
  - lib/openhab/dsl/gems.rb
41
41
  - lib/openhab/dsl/group.rb
42
42
  - lib/openhab/dsl/items/datetime_item.rb
43
+ - lib/openhab/dsl/items/group_item.rb
43
44
  - lib/openhab/dsl/items/item_command.rb
44
45
  - lib/openhab/dsl/items/item_delegate.rb
45
46
  - lib/openhab/dsl/items/items.rb
@@ -57,7 +58,6 @@ files:
57
58
  - lib/openhab/dsl/monkey_patch/events/thing_status_info.rb
58
59
  - lib/openhab/dsl/monkey_patch/items/contact_item.rb
59
60
  - lib/openhab/dsl/monkey_patch/items/dimmer_item.rb
60
- - lib/openhab/dsl/monkey_patch/items/group_item.rb
61
61
  - lib/openhab/dsl/monkey_patch/items/items.rb
62
62
  - lib/openhab/dsl/monkey_patch/items/metadata.rb
63
63
  - lib/openhab/dsl/monkey_patch/items/persistence.rb
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module OpenHAB
4
- module DSL
5
- module MonkeyPatch
6
- #
7
- # Patches OpenHAB items
8
- #
9
- module Items
10
- java_import Java::OrgOpenhabCoreItems::GroupItem
11
-
12
- #
13
- # Monkey patch Group Item
14
- #
15
- class GroupItem
16
- #
17
- # Get all items in a group
18
- #
19
- # @return [Array] Array of items in the group
20
- #
21
- def items
22
- to_a
23
- end
24
-
25
- #
26
- # Get all items in the group as an Array
27
- #
28
- # @return [Array] All items in the group
29
- #
30
- def to_a
31
- all_members.each_with_object([]) { |item, arr| arr << item }
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end