openhab-scripting 2.27.1 → 3.1.2

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: f4238eb3161f714b74aed518a4a3e6d02f2aeed634fc21d7276df152f8aeead8
4
+ data.tar.gz: 57666ad4b06970ea2859ab252a19b5801c34657025e11becb766ad2876157a1b
5
5
  SHA512:
6
- metadata.gz: bbdae9215b3347eabc65ea92eb70ac44834b374233ce7f31b15bfa8f99dcc05c9b85d2c1b7fad3c29d63be62100966648bac9e4255ab614edf40a2dd231b24a8
7
- data.tar.gz: 5d8b30987d208674337ffddd43caaeee1c72596ae82e9a3792b74adbb0d7c82879040333173230c6016fb0552be191de877ec664566cbd61f9b14fc150ed4d9e
6
+ metadata.gz: 4617faef054fc5f6e388314ff2ab46c1a80ad525fb576fb1d2d2a89bde37f5f420a3ca77000da6bf62546f8b3ab2ba77d24ab271c9ea2c232c02d547677ad61f
7
+ data.tar.gz: bf889c204885dc28b6416138d8cba0d116e8d3c408bfd2720b481f47820ea51bb5e067c1492df352db13e2e0267b4f647b48ed3d68591a5a8d444972640d6270
@@ -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
@@ -87,11 +87,13 @@ module OpenHAB
87
87
  # @return [Object] the ruby wrapper for the item
88
88
  #
89
89
  # rubocop: disable Metrics/MethodLength
90
+ # rubocop: disable Metrics/CyclomaticComplexity
90
91
  # Disabled line length and branch size - case dispatch pattern
91
- private_class_method def self.decorate_item(item)
92
+ def self.decorate_item(item)
93
+ logger.trace("Decorating #{item.class}")
92
94
  case item
93
- when GroupItem
94
- decorate_group(item)
95
+ when Java::OrgOpenhabCoreItems::GroupItem
96
+ OpenHAB::DSL::Items::GroupItem.new(item)
95
97
  when Java::OrgOpenhabCoreLibraryItems::NumberItem
96
98
  OpenHAB::DSL::Items::NumberItem.new(item)
97
99
  when Java::OrgOpenhabCoreLibraryItems::StringItem
@@ -102,11 +104,15 @@ module OpenHAB
102
104
  OpenHAB::DSL::Items::RollershutterItem.new(item)
103
105
  when Java::OrgOpenhabCoreLibraryItems::PlayerItem
104
106
  OpenHAB::DSL::Items::PlayerItem.new(item)
107
+ when Java::OrgOpenhabCoreLibraryItems::ImageItem
108
+ OpenHAB::DSL::Items::ImageItem.new(item)
105
109
  else
110
+ logger.trace("Returning undecorated item #{item.class}")
106
111
  item
107
112
  end
108
113
  end
109
114
  # rubocop: enable Metrics/MethodLength
115
+ # rubocop: enable Metrics/CyclomaticComplexity
110
116
 
111
117
  #
112
118
  # Looks up a Thing in the OpenHAB registry replacing '_' with ':'
@@ -144,19 +150,6 @@ module OpenHAB
144
150
  # rubocop: enable Style/GlobalVars
145
151
  decorate_item(item)
146
152
  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
153
  end
161
154
  end
162
155
  end
@@ -14,8 +14,10 @@ require 'openhab/dsl/group'
14
14
  require 'openhab/dsl/things'
15
15
  require 'openhab/dsl/items/items'
16
16
  require 'openhab/dsl/items/datetime_item'
17
+ require 'openhab/dsl/items/image_item'
17
18
  require 'openhab/dsl/items/number_item'
18
19
  require 'openhab/dsl/items/player_item'
20
+ require 'openhab/dsl/items/group_item'
19
21
  require 'openhab/dsl/time_of_day'
20
22
  require 'openhab/dsl/gems'
21
23
  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
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+ require 'net/http'
5
+ require 'java'
6
+ require 'mimemagic'
7
+ require 'openhab/dsl/items/item_command'
8
+ require 'openhab/dsl/items/item_delegate'
9
+
10
+ module OpenHAB
11
+ module DSL
12
+ module Items
13
+ #
14
+ # Delegator to OpenHAB Player Item
15
+ #
16
+ class ImageItem
17
+ extend OpenHAB::DSL::Items::ItemCommand
18
+ extend OpenHAB::DSL::Items::ItemDelegate
19
+
20
+ def_item_delegator :@image_item
21
+
22
+ item_type Java::OrgOpenhabCoreLibraryItems::ImageItem
23
+
24
+ #
25
+ # Creates a new ImageItem
26
+ #
27
+ # @param [Java::OrgOpenhabCoreLibraryItems::ImageItem] image_item
28
+ # The OpenHAB ImageItem to delegate to
29
+ #
30
+ def initialize(image_item)
31
+ logger.trace("Wrapping #{image_item}")
32
+ @image_item = image_item
33
+
34
+ item_missing_delegate { @image_item }
35
+
36
+ super()
37
+ end
38
+
39
+ #
40
+ #
41
+ # Update image with base64 encoded OpenHAB compatable image
42
+ #
43
+ # @param [String] base_64 base_64 encoding of an image
44
+ #
45
+ #
46
+ def update(base_64_encoded_image)
47
+ logger.trace { "Updating #{self} with Base64 image #{base_64_encoded_image}" }
48
+ @image_item.update base_64_encoded_image
49
+ end
50
+
51
+ #
52
+ # Update image from file
53
+ #
54
+ # @param [String] file location
55
+ # @param [String] mime_type of image
56
+ #
57
+ #
58
+ def update_from_file(file, mime_type: nil)
59
+ file_data = IO.binread(file)
60
+ mime_type ||= (MimeMagic.by_path(file) || MimeMagic.by_magic(file_data))&.type
61
+ update_from_bytes(file_data, mime_type: mime_type)
62
+ end
63
+
64
+ #
65
+ # Update image from image at URL
66
+ #
67
+ # @param [String] uri location of image
68
+ #
69
+ #
70
+ def update_from_url(uri)
71
+ logger.debug("Downloading image from #{uri}")
72
+ response = Net::HTTP.get_response(URI(uri))
73
+ mime_type = response['content-type']
74
+ bytes = response.body
75
+ mime_type ||= detect_mime_from_bytes(bytes: bytes)
76
+ update_from_bytes(bytes, mime_type: mime_type)
77
+ end
78
+
79
+ #
80
+ # Update image from image bytes
81
+ #
82
+ # @param [String] mime_type of image
83
+ # @param [Object] bytes image data
84
+ #
85
+ #
86
+ def update_from_bytes(bytes, mime_type: nil)
87
+ mime_type ||= detect_mime_from_bytes(bytes: bytes)
88
+ base_64_image = encode_image(mime_type: mime_type, bytes: bytes)
89
+ update base_64_image
90
+ end
91
+
92
+ #
93
+ # Get the mime type for the image item
94
+ #
95
+ # @return [String] mime type for image, e.g. image/png
96
+ #
97
+ def mime_type
98
+ state&.mime_type
99
+ end
100
+
101
+ #
102
+ # Get the bytes of the image
103
+ #
104
+ # @return [Array] Bytes that comprise the image
105
+ #
106
+ def bytes
107
+ state&.get_bytes
108
+ end
109
+
110
+ private
111
+
112
+ #
113
+ # Encode image information in the format required by OpenHAB
114
+ #
115
+ # @param [String] mime_type for image
116
+ # @param [Object] bytes image data
117
+ #
118
+ # @return [String] OpenHAB image format with image data Base64 encoded
119
+ #
120
+ def encode_image(mime_type:, bytes:)
121
+ "data:#{mime_type};base64,#{Base64.strict_encode64(bytes)}"
122
+ end
123
+
124
+ #
125
+ # Detect the mime type based on bytes
126
+ #
127
+ # @param [Array] bytes representing image data
128
+ #
129
+ # @return [String] mime type if it can be detected, nil otherwise
130
+ #
131
+ def detect_mime_from_bytes(bytes:)
132
+ logger.trace('Detecting mime type from file image contents')
133
+ MimeMagic.by_magic(bytes)&.type
134
+ end
135
+ end
136
+ end
137
+ end
138
+ 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
@@ -43,7 +43,7 @@ module OpenHAB
43
43
  # @return [Java::OrgOpenhabCoreLibraryTypes::PercentType] the position of the rollershutter
44
44
  #
45
45
  def position
46
- state.as(PercentType)
46
+ state&.as(PercentType)
47
47
  end
48
48
 
49
49
  #
@@ -54,6 +54,8 @@ module OpenHAB
54
54
  # @return [Integer] -1, 0 or 1 depending on the result of the comparison
55
55
  #
56
56
  def <=>(other)
57
+ return nil unless state?
58
+
57
59
  case other
58
60
  when PercentType, Java::OrgOpenhabCoreLibraryTypes::DecimalType then position.compare_to(other)
59
61
  when Numeric then position.int_value <=> other
@@ -73,8 +75,8 @@ module OpenHAB
73
75
  raise ArgumentError, "Cannot coerce to #{other.class}" unless other.is_a? Numeric
74
76
 
75
77
  case other
76
- when Integer then [other, position.int_value]
77
- when Float then [other, position.float_value]
78
+ when Integer then [other, position&.int_value]
79
+ when Float then [other, position&.float_value]
78
80
  end
79
81
  end
80
82
 
@@ -84,7 +86,7 @@ module OpenHAB
84
86
  %i[+ - * / %].each do |operator|
85
87
  define_method(operator) do |other|
86
88
  right, left = coerce(other)
87
- left.send(operator, right)
89
+ left&.send(operator, right)
88
90
  end
89
91
  end
90
92
  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
@@ -29,6 +29,7 @@ module OpenHAB
29
29
  set_name(config.name)
30
30
  set_description(config.description)
31
31
  set_triggers(config.triggers)
32
+ @run_context = config.caller
32
33
  @run_queue = config.run
33
34
  @guard = config.guard
34
35
  between = config.between&.yield_self { between(config.between) }
@@ -288,7 +289,7 @@ module OpenHAB
288
289
  #
289
290
  def process_otherwise_task(event, task)
290
291
  logger.trace { "Executing rule '#{name}' otherwise block with event(#{event})" }
291
- task.block.call(event)
292
+ @run_context.instance_exec(event, &task.block)
292
293
  end
293
294
 
294
295
  #
@@ -316,7 +317,7 @@ module OpenHAB
316
317
  return unless event&.item
317
318
 
318
319
  logger.trace { "Executing rule '#{name}' trigger block with item (#{event.item})" }
319
- task.block.call(event.item)
320
+ @run_context.instance_exec(event.item, &task.block)
320
321
  end
321
322
 
322
323
  #
@@ -328,7 +329,7 @@ module OpenHAB
328
329
  #
329
330
  def process_run_task(event, task)
330
331
  logger.trace { "Executing rule '#{name}' run block with event(#{event})" }
331
- task.block.call(event)
332
+ @run_context.instance_exec(event, &task.block)
332
333
  end
333
334
 
334
335
  #
@@ -23,10 +23,11 @@ module OpenHAB
23
23
  def rule(rule_name, &block)
24
24
  @rule_name = rule_name
25
25
  config = RuleConfig.new(rule_name, block.binding)
26
- config.instance_eval(&block)
26
+ config.instance_exec(config, &block)
27
27
  config.guard = Guard::Guard.new(only_if: config.only_if, not_if: config.not_if)
28
28
  logger.trace { config.inspect }
29
29
  process_rule_config(config)
30
+ config
30
31
  rescue StandardError => e
31
32
  re_raise_with_backtrace(e)
32
33
  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
 
@@ -42,6 +40,9 @@ module OpenHAB
42
40
  # @return [Array] Of trigger guards
43
41
  attr_accessor :guard
44
42
 
43
+ # @return [Object] object that invoked rule method
44
+ attr_accessor :caller
45
+
45
46
  #
46
47
  # Struct holding a run block
47
48
  #
@@ -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.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.1.2'
9
9
  end
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: 2.27.1
4
+ version: 3.1.2
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-03-02 00:00:00.000000000 Z
11
+ date: 2021-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mimemagic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.3'
27
41
  description: JRuby Helper Libraries for OpenHAB Scripting
28
42
  email:
29
43
  - broconne@gmail.com
@@ -40,6 +54,8 @@ files:
40
54
  - lib/openhab/dsl/gems.rb
41
55
  - lib/openhab/dsl/group.rb
42
56
  - lib/openhab/dsl/items/datetime_item.rb
57
+ - lib/openhab/dsl/items/group_item.rb
58
+ - lib/openhab/dsl/items/image_item.rb
43
59
  - lib/openhab/dsl/items/item_command.rb
44
60
  - lib/openhab/dsl/items/item_delegate.rb
45
61
  - lib/openhab/dsl/items/items.rb
@@ -57,7 +73,6 @@ files:
57
73
  - lib/openhab/dsl/monkey_patch/events/thing_status_info.rb
58
74
  - lib/openhab/dsl/monkey_patch/items/contact_item.rb
59
75
  - lib/openhab/dsl/monkey_patch/items/dimmer_item.rb
60
- - lib/openhab/dsl/monkey_patch/items/group_item.rb
61
76
  - lib/openhab/dsl/monkey_patch/items/items.rb
62
77
  - lib/openhab/dsl/monkey_patch/items/metadata.rb
63
78
  - 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