openhab-scripting 4.38.0 → 4.40.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: 249167484484abf9fb6c7128e5e697fd4e1d767576ad52b22005ee473d52776e
4
- data.tar.gz: 6825c83f1cdd668882c3409c0cc828c69e259e553ba736eb9291a0ec1370c57d
3
+ metadata.gz: 7aaa16073cb2b4d71edb5e80debef49282a864bad1e057fb307b5cd8b9ca7844
4
+ data.tar.gz: 641502dca198f6cf42d5a489153f6c04fd3bf70900d4a0873bfb01d686bea6b7
5
5
  SHA512:
6
- metadata.gz: 7d8c8f1f4aab62fecedbe0b8e6693f263e3a21c2ddbb188e5f16cffaf59643d1ffc27c71bb1c14cd256f1852ab6187890c4289791d862ef8e6dcfb1e8f06d096
7
- data.tar.gz: ed683ceab7adbcdfb6882409f8c52fac4e06b15c23662f108488cc192594f21d13d1614b4e645f9c00dec94739321d931fa2c7cfcb1c78ebc6157882c0cdaff3
6
+ metadata.gz: 978fe9d74ac7bc6481bb59cfb32a5c917f7707933e68d686be6119096f64daf78a49af1c9e4870abaecc0eec234e50314fae8093f1f04d1c38f6e15cdbe89bd9
7
+ data.tar.gz: b959d2aef01f436f90a56142e4e2c9a4a532de091bd846b97b799a609e16d849d5df2e3de77d91b0a2de588f0da6cf3e6904205b9236538c123484552484565f
@@ -99,7 +99,6 @@ module OpenHAB
99
99
  module Items
100
100
  GenericItem.prepend(OpenHAB::DSL::Ensure::GenericItem)
101
101
  GroupItem::GroupMembers.include(OpenHAB::DSL::Ensure::Ensurable)
102
- Enumerable.include(OpenHAB::DSL::Ensure::Ensurable)
103
102
  end
104
103
  end
105
104
  end
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'openhab/dsl/items/metadata'
4
- require 'openhab/dsl/items/persistence'
5
- require 'openhab/dsl/items/semantics'
3
+ require 'delegate'
4
+ require 'forwardable'
5
+
6
+ require_relative 'metadata'
7
+ require_relative 'persistence'
8
+ require_relative 'semantics'
6
9
 
7
10
  require_relative 'item_equality'
8
11
 
@@ -170,6 +173,17 @@ module OpenHAB
170
173
  other.instance_of?(self.class) && hash == other.hash
171
174
  end
172
175
 
176
+ #
177
+ # A method to indicate that item comparison is requested instead of state comparison
178
+ #
179
+ # Example: Item1.item == items['Item1'].item should return true
180
+ #
181
+ # See ItemEquality#==
182
+ #
183
+ def item
184
+ @item ||= GenericItemObject.new(self)
185
+ end
186
+
173
187
  # @!method null?
174
188
  # Check if the item state == +NULL+
175
189
  # @return [Boolean]
@@ -201,5 +215,15 @@ module OpenHAB
201
215
  end
202
216
  end
203
217
  end
218
+
219
+ # A helper class to flag that item comparison is wanted instead of state comparison
220
+ # It is used by ItemEquality#===
221
+ class GenericItemObject < SimpleDelegator
222
+ extend Forwardable
223
+ include Log
224
+ include OpenHAB::DSL::Items::ItemEquality
225
+
226
+ def_delegator :__getobj__, :instance_of? # instance_of? is used by GenericItem#eql? to check for item equality
227
+ end
204
228
  end
205
229
  end
@@ -44,6 +44,7 @@ module OpenHAB
44
44
 
45
45
  include Enumerable
46
46
  include ComparableItem
47
+ prepend Semantics # make Semantics#points take precedence over Enumerable#points for GroupItem
47
48
 
48
49
  remove_method :==
49
50
 
@@ -22,7 +22,8 @@ module OpenHAB
22
22
  # @return [Boolean]
23
23
  #
24
24
  def ==(other)
25
- logger.trace("(#{self.class}) #{self} == #{other} (#{other.class})")
25
+ logger.trace { "ItemEquality#== (#{self.class}) #{self} == #{other} (#{other.class})" }
26
+ return eql?(other) if generic_item_object?(other)
26
27
  return true if equal?(other) || eql?(other)
27
28
  return true if !state? && other.nil?
28
29
 
@@ -30,6 +31,28 @@ module OpenHAB
30
31
 
31
32
  state == other
32
33
  end
34
+
35
+ #
36
+ # Check item object equality for grep
37
+ #
38
+ def ===(other)
39
+ logger.trace { "ItemEquality#=== (#{self.class}) #{self} == #{other} (#{other.class})" }
40
+ eql?(other)
41
+ end
42
+
43
+ private
44
+
45
+ #
46
+ # Determines if an object equality check is required, based on whether
47
+ # either operand is a GenericItemObject
48
+ #
49
+ # @param [Object] other
50
+ #
51
+ # @return [Boolean]
52
+ #
53
+ def generic_item_object?(other)
54
+ other.is_a?(OpenHAB::DSL::GenericItemObject) || is_a?(OpenHAB::DSL::GenericItemObject)
55
+ end
33
56
  end
34
57
  end
35
58
  end
@@ -32,6 +32,11 @@ module Enumerable
32
32
  each { |i| i.update(state) }
33
33
  end
34
34
 
35
+ # Returns the group members the elements
36
+ def members
37
+ select { |e| e.respond_to? :members }.flat_map(&:members)
38
+ end
39
+
35
40
  # @!method refresh
36
41
  # Send the +REFRESH+ command to every item in the collection
37
42
 
@@ -76,4 +81,11 @@ module Enumerable
76
81
 
77
82
  # @!method previous
78
83
  # Send the +PREVIOUS+ command to every item in the collection
84
+
85
+ # @!visibility private
86
+ # can't use `include`, because Enumerable has already been included
87
+ # in other classes
88
+ def ensure
89
+ OpenHAB::DSL::Ensure::GenericItemDelegate.new(self)
90
+ end
79
91
  end
@@ -4,168 +4,167 @@ require_relative 'semantics/enumerable'
4
4
 
5
5
  module OpenHAB
6
6
  module DSL
7
- # Module for implementing semantics helper methods on [GenericItem]
8
- #
9
- # Wraps https://www.openhab.org/javadoc/latest/org/openhab/core/model/script/actions/semantics,
10
- # as well as adding a few additional convenience methods.
11
- # Also includes Classes for each semantic tag.
12
- #
13
- # Be warned that the Semantic model is stricter than can actually be
14
- # described by tags and groups on an Item. It makes assumptions that any
15
- # given item only belongs to one semantic type (Location, Equipment, Point).
16
- #
17
- # See https://github.com/openhab/openhab-core/blob/main/bundles/org.openhab.core.semantics/model/SemanticTags.csv
18
- module Semantics
19
- # @!visibility private
20
- # import the actual semantics action
21
- SemanticsAction = org.openhab.core.model.script.actions.Semantics
22
- private_constant :SemanticsAction
23
-
24
- # import all the semantics constants
25
- [org.openhab.core.semantics.model.point.Points,
26
- org.openhab.core.semantics.model.property.Properties,
27
- org.openhab.core.semantics.model.equipment.Equipments,
28
- org.openhab.core.semantics.model.location.Locations].each do |parent_tag|
29
- parent_tag.stream.for_each do |tag|
30
- const_set(tag.simple_name.to_sym, tag.ruby_class)
7
+ module Items
8
+ # Module for implementing semantics helper methods on [GenericItem]
9
+ #
10
+ # Wraps https://www.openhab.org/javadoc/latest/org/openhab/core/model/script/actions/semantics,
11
+ # as well as adding a few additional convenience methods.
12
+ # Also includes Classes for each semantic tag.
13
+ #
14
+ # Be warned that the Semantic model is stricter than can actually be
15
+ # described by tags and groups on an Item. It makes assumptions that any
16
+ # given item only belongs to one semantic type (Location, Equipment, Point).
17
+ #
18
+ # See https://github.com/openhab/openhab-core/blob/main/bundles/org.openhab.core.semantics/model/SemanticTags.csv
19
+ module Semantics
20
+ # @!visibility private
21
+ # import the actual semantics action
22
+ SemanticsAction = org.openhab.core.model.script.actions.Semantics
23
+ private_constant :SemanticsAction
24
+
25
+ # import all the semantics constants
26
+ [org.openhab.core.semantics.model.point.Points,
27
+ org.openhab.core.semantics.model.property.Properties,
28
+ org.openhab.core.semantics.model.equipment.Equipments,
29
+ org.openhab.core.semantics.model.location.Locations].each do |parent_tag|
30
+ parent_tag.stream.for_each do |tag|
31
+ const_set(tag.simple_name.to_sym, tag.ruby_class)
32
+ end
31
33
  end
32
- end
33
-
34
- # put ourself into the global namespace, replacing the action
35
- ::Semantics = self # rubocop:disable Naming/ConstantName
36
34
 
37
- # Checks if this Item is a Location
38
- #
39
- # This is implemented as checking if the item's semantic_type
40
- # is a Location. I.e. an Item has a single semantic_type.
41
- #
42
- # @return [true, false]
43
- def location?
44
- SemanticsAction.location?(self)
45
- end
35
+ # put ourself into the global namespace, replacing the action
36
+ ::Semantics = self # rubocop:disable Naming/ConstantName
37
+
38
+ # Checks if this Item is a Location
39
+ #
40
+ # This is implemented as checking if the item's semantic_type
41
+ # is a Location. I.e. an Item has a single semantic_type.
42
+ #
43
+ # @return [true, false]
44
+ def location?
45
+ SemanticsAction.location?(self)
46
+ end
46
47
 
47
- # Checks if this Item is an Equipment
48
- #
49
- # This is implemented as checking if the item's semantic_type
50
- # is an Equipment. I.e. an Item has a single semantic_type.
51
- #
52
- # @return [true, false]
53
- def equipment?
54
- SemanticsAction.equipment?(self)
55
- end
48
+ # Checks if this Item is an Equipment
49
+ #
50
+ # This is implemented as checking if the item's semantic_type
51
+ # is an Equipment. I.e. an Item has a single semantic_type.
52
+ #
53
+ # @return [true, false]
54
+ def equipment?
55
+ SemanticsAction.equipment?(self)
56
+ end
56
57
 
57
- # Checks if this Item is a Point
58
- #
59
- # This is implemented as checking if the item's semantic_type
60
- # is a Point. I.e. an Item has a single semantic_type.
61
- #
62
- # @return [true, false]
63
- def point?
64
- SemanticsAction.point?(self)
65
- end
58
+ # Checks if this Item is a Point
59
+ #
60
+ # This is implemented as checking if the item's semantic_type
61
+ # is a Point. I.e. an Item has a single semantic_type.
62
+ #
63
+ # @return [true, false]
64
+ def point?
65
+ SemanticsAction.point?(self)
66
+ end
66
67
 
67
- # Checks if this Item has any semantic tags
68
- # @return [true, false]
69
- def semantic?
70
- !!semantic_type
71
- end
68
+ # Checks if this Item has any semantic tags
69
+ # @return [true, false]
70
+ def semantic?
71
+ !!semantic_type
72
+ end
72
73
 
73
- # Gets the related Location Item of this Item.
74
- #
75
- # Returns +self+ if this Item is a Location. Otherwise, checks ancestor
76
- # groups one level at a time, returning the first Location Item found.
77
- #
78
- # @return [GenericItem, nil]
79
- def location
80
- SemanticsAction.get_location(self)
81
- end
74
+ # Gets the related Location Item of this Item.
75
+ #
76
+ # Returns +self+ if this Item is a Location. Otherwise, checks ancestor
77
+ # groups one level at a time, returning the first Location Item found.
78
+ #
79
+ # @return [GenericItem, nil]
80
+ def location
81
+ SemanticsAction.get_location(self)
82
+ end
82
83
 
83
- # Returns the sub-class of [Location] related to this Item.
84
- #
85
- # In other words, the semantic_type of this Item's Location.
86
- #
87
- # @return [Class]
88
- def location_type
89
- SemanticsAction.get_location_type(self)&.ruby_class
90
- end
84
+ # Returns the sub-class of [Location] related to this Item.
85
+ #
86
+ # In other words, the semantic_type of this Item's Location.
87
+ #
88
+ # @return [Class]
89
+ def location_type
90
+ SemanticsAction.get_location_type(self)&.ruby_class
91
+ end
91
92
 
92
- # Gets the related Equipment Item of this Item.
93
- #
94
- # Returns +self+ if this Item is an Equipment. Otherwise, checks ancestor
95
- # groups one level at a time, returning the first Equipment Item found.
96
- #
97
- # @return [GenericItem, nil]
98
- def equipment
99
- SemanticsAction.get_equipment(self)
100
- end
93
+ # Gets the related Equipment Item of this Item.
94
+ #
95
+ # Returns +self+ if this Item is an Equipment. Otherwise, checks ancestor
96
+ # groups one level at a time, returning the first Equipment Item found.
97
+ #
98
+ # @return [GenericItem, nil]
99
+ def equipment
100
+ SemanticsAction.get_equipment(self)
101
+ end
101
102
 
102
- # Returns the sub-class of [Equipment] related to this Item.
103
- #
104
- # In other words, the semantic_type of this Item's Equipment.
105
- #
106
- # @return [Class]
107
- def equipment_type
108
- SemanticsAction.get_equipment_type(self)&.ruby_class
109
- end
103
+ # Returns the sub-class of [Equipment] related to this Item.
104
+ #
105
+ # In other words, the semantic_type of this Item's Equipment.
106
+ #
107
+ # @return [Class]
108
+ def equipment_type
109
+ SemanticsAction.get_equipment_type(self)&.ruby_class
110
+ end
110
111
 
111
- # Returns the sub-class of [Point] this Item is tagged with.
112
- #
113
- # @return [Class]
114
- def point_type
115
- SemanticsAction.get_point_type(self)&.ruby_class
116
- end
112
+ # Returns the sub-class of [Point] this Item is tagged with.
113
+ #
114
+ # @return [Class]
115
+ def point_type
116
+ SemanticsAction.get_point_type(self)&.ruby_class
117
+ end
117
118
 
118
- # Returns the sub-class of [Property] this Item is tagged with.
119
- # @return [Class]
120
- def property_type
121
- SemanticsAction.get_property_type(self)&.ruby_class
122
- end
119
+ # Returns the sub-class of [Property] this Item is tagged with.
120
+ # @return [Class]
121
+ def property_type
122
+ SemanticsAction.get_property_type(self)&.ruby_class
123
+ end
123
124
 
124
- # Returns the sub-class of [Tag] this Item is tagged with.
125
- #
126
- # It will only return the first applicable Tag, preferring
127
- # a sub-class of [Location], [Equipment], or [Point] first,
128
- # and if none of those are found, looks for a [Property].
129
- # @return [Class]
130
- def semantic_type
131
- SemanticsAction.get_semantic_type(self)&.ruby_class
132
- end
125
+ # Returns the sub-class of [Tag] this Item is tagged with.
126
+ #
127
+ # It will only return the first applicable Tag, preferring
128
+ # a sub-class of [Location], [Equipment], or [Point] first,
129
+ # and if none of those are found, looks for a [Property].
130
+ # @return [Class]
131
+ def semantic_type
132
+ SemanticsAction.get_semantic_type(self)&.ruby_class
133
+ end
133
134
 
134
- # Return the related Point Items.
135
- #
136
- # Searches this Equipment Item for Points that are tagged appropriately.
137
- #
138
- # If called on a Point Item, it will automatically search for sibling Points
139
- # (and remove itself if found).
140
- #
141
- # @example Get all points for a TV
142
- # eGreatTV.points
143
- # @example Search an Equipment item for its switch
144
- # eGuestFan.points(Semantics::Switch) # => [GuestFan_Dimmer]
145
- # @example Search a Thermostat item for its current temperature item
146
- # eFamilyThermostat.points(Semantics::Status, Semantics::Temperature)
147
- # # => [FamilyThermostat_AmbTemp]
148
- # @example Search a Thermostat item for is setpoints
149
- # eFamilyThermostat.points(Semantics::Control, Semantics::Temperature)
150
- # # => [FamilyThermostat_HeatingSetpoint, FamilyThermostat_CoolingSetpoint]
151
- # @example Given a A/V receiver's input item, search for it's power item
152
- # FamilyReceiver_Input.points(Semantics::Switch) # => FamilyReceiver_Switch
153
- #
154
- # @param [Class] point_or_property_types
155
- # Pass 1 or 2 classes that are sub-classes of [Point] or [Property].
156
- # Note that when comparing against semantic tags, it does a sub-class check.
157
- # So if you search for [Control], you'll get items tagged with [Switch].
158
- # @return [Array<GenericItem>]
159
- def points(*point_or_property_types)
160
- # automatically search the parent equipment (or location?!) for sibling points
161
- unless equipment? || location?
135
+ # Return the related Point Items.
136
+ #
137
+ # Searches this Equipment Item for Points that are tagged appropriately.
138
+ #
139
+ # If called on a Point Item, it will automatically search for sibling Points
140
+ # (and remove itself if found).
141
+ #
142
+ # @example Get all points for a TV
143
+ # eGreatTV.points
144
+ # @example Search an Equipment item for its switch
145
+ # eGuestFan.points(Semantics::Switch) # => [GuestFan_Dimmer]
146
+ # @example Search a Thermostat item for its current temperature item
147
+ # eFamilyThermostat.points(Semantics::Status, Semantics::Temperature)
148
+ # # => [FamilyThermostat_AmbTemp]
149
+ # @example Search a Thermostat item for is setpoints
150
+ # eFamilyThermostat.points(Semantics::Control, Semantics::Temperature)
151
+ # # => [FamilyThermostat_HeatingSetpoint, FamilyThermostat_CoolingSetpoint]
152
+ # @example Given a A/V receiver's input item, search for its power item
153
+ # FamilyReceiver_Input.points(Semantics::Switch) # => [FamilyReceiver_Switch]
154
+ #
155
+ # @param [Class] point_or_property_types
156
+ # Pass 1 or 2 classes that are sub-classes of [Point] or [Property].
157
+ # Note that when comparing against semantic tags, it does a sub-class check.
158
+ # So if you search for [Control], you'll get items tagged with [Switch].
159
+ # @return [Array<GenericItem>]
160
+ def points(*point_or_property_types)
161
+ return members.points(*point_or_property_types) if equipment? || location?
162
+
163
+ # automatically search the parent equipment (or location?!) for sibling points
162
164
  result = (equipment || location)&.points(*point_or_property_types) || []
163
165
  # remove self. but avoid state comparisons
164
166
  result.delete_if { |item| item.eql?(self) }
165
- return result
166
167
  end
167
-
168
- members.points(*point_or_property_types)
169
168
  end
170
169
  end
171
170
  end
@@ -175,7 +174,9 @@ end
175
174
  module Enumerable
176
175
  # Returns a new array of items that are a semantics Location (optionally of the given type)
177
176
  def sublocations(type = nil)
178
- raise ArgumentError, 'type must be a subclass of Location' if type && !(type < OpenHAB::DSL::Semantics::Location)
177
+ if type && !(type < OpenHAB::DSL::Items::Semantics::Location)
178
+ raise ArgumentError, 'type must be a subclass of Location'
179
+ end
179
180
 
180
181
  result = select(&:location?)
181
182
  result.select! { |i| i.location_type <= type } if type
@@ -188,7 +189,9 @@ module Enumerable
188
189
  # @example Get all TVs in a room
189
190
  # lGreatRoom.equipments(Semantics::Screen)
190
191
  def equipments(type = nil)
191
- raise ArgumentError, 'type must be a subclass of Equipment' if type && !(type < OpenHAB::DSL::Semantics::Equipment)
192
+ if type && !(type < OpenHAB::DSL::Items::Semantics::Equipment)
193
+ raise ArgumentError, 'type must be a subclass of Equipment'
194
+ end
192
195
 
193
196
  result = select(&:equipment?)
194
197
  result.select! { |i| i.equipment_type <= type } if type
@@ -199,27 +202,25 @@ module Enumerable
199
202
  # Returns a new array of items that are semantics points (optionally of a given type)
200
203
  #
201
204
  # @example Get all the power switch items for every equipment in a room
202
- # lGreatRoom.equipments.flat_map(&:members).points(Semantics::Switch)
205
+ # lGreatRoom.equipments.points(Semantics::Switch)
203
206
  def points(*point_or_property_types) # rubocop:disable Metrics
204
207
  unless (0..2).cover?(point_or_property_types.length)
205
208
  raise ArgumentError, "wrong number of arguments (given #{point_or_property_types.length}, expected 0..2)"
206
209
  end
207
210
  unless point_or_property_types.all? do |tag|
208
- tag < OpenHAB::DSL::Semantics::Point || tag < OpenHAB::DSL::Semantics::Property
211
+ tag < OpenHAB::DSL::Items::Semantics::Point || tag < OpenHAB::DSL::Items::Semantics::Property
209
212
  end
210
213
  raise ArgumentError, 'point_or_property_types must all be a subclass of Point or Property'
211
214
  end
212
- if point_or_property_types.count { |tag| tag < OpenHAB::DSL::Semantics::Point } > 1 ||
213
- point_or_property_types.count { |tag| tag < OpenHAB::DSL::Semantics::Property } > 1
215
+ if point_or_property_types.count { |tag| tag < OpenHAB::DSL::Items::Semantics::Point } > 1 ||
216
+ point_or_property_types.count { |tag| tag < OpenHAB::DSL::Items::Semantics::Property } > 1
214
217
  raise ArgumentError, 'point_or_property_types cannot both be a subclass of Point or Property'
215
218
  end
216
219
 
217
220
  select do |point|
218
- next unless point.point?
219
-
220
- point_or_property_types.all? do |tag|
221
- (tag < OpenHAB::DSL::Semantics::Point && point.point_type&.<=(tag)) ||
222
- (tag < OpenHAB::DSL::Semantics::Property && point.property_type&.<=(tag))
221
+ point.point? && point_or_property_types.all? do |tag|
222
+ (tag < OpenHAB::DSL::Items::Semantics::Point && point.point_type <= tag) ||
223
+ (tag < OpenHAB::DSL::Items::Semantics::Property && point.property_type&.<=(tag))
223
224
  end
224
225
  end
225
226
  end
@@ -35,7 +35,7 @@ module OpenHAB
35
35
  #
36
36
  # @param [String] expression OpenHAB style cron expression
37
37
  # @param [Object] attach object to be attached to the trigger
38
- # @param [Hash] elements cron expression elements (second, minute, hour, dom, month, dow, year)
38
+ # @param [Hash] fields cron expression elements (second, minute, hour, dom, month, dow, year)
39
39
  #
40
40
  def cron(expression = nil, attach: nil, **fields)
41
41
  if fields.any?
@@ -124,7 +124,7 @@ module OpenHAB
124
124
  #
125
125
  # Create a cron map from a MonthDay
126
126
  #
127
- # @param [Java::JavaTime::MonthDay] month_day
127
+ # @param [Java::JavaTime::MonthDay] monthday a {MonthDay} object
128
128
  # @param [Object] at TimeOfDay or String representing time of day
129
129
  #
130
130
  # @return [Hash] map describing cron expression
@@ -152,7 +152,7 @@ module OpenHAB
152
152
  #
153
153
  # Create a cron map from cron elements
154
154
  #
155
- # @param [Hash] elements Cron fields (second, minute, hour, dom, month, dow, year)
155
+ # @param [Hash] fields Cron fields (second, minute, hour, dom, month, dow, year)
156
156
  #
157
157
  # @return [Hash] map describing cron expression
158
158
  #
@@ -33,7 +33,7 @@ module OpenHAB
33
33
  # Check if all the given items have a state (not UNDEF or NULL)
34
34
  #
35
35
  # @param [Array] items whose state must be non-nil
36
- # @param [<Type>] check_things when true, also ensures that all linked things are online
36
+ # @param [<Type>] things when true, also ensures that all linked things are online
37
37
  #
38
38
  # @return [Boolean] true if all the items have a state, false otherwise
39
39
  #
@@ -51,7 +51,7 @@ module OpenHAB
51
51
  #
52
52
  # Create a StateStorage object that stores the states of the given items
53
53
  #
54
- # @param [Array<Item>] *items A list of items
54
+ # @param [Array<Item>] items A list of items
55
55
  #
56
56
  # @return [StateStorage] A state storage object
57
57
  #
@@ -57,7 +57,7 @@ module OpenHAB
57
57
  # @return [Boolean]
58
58
  #
59
59
  def ==(other) # rubocop:disable Metrics
60
- logger.trace("(#{self.class}) #{self} == #{other} (#{other.class})")
60
+ logger.trace { "(#{self.class}) #{self} == #{other} (#{other.class})" }
61
61
  if other.is_a?(Items::LocationItem) ||
62
62
  (other.is_a?(Items::GroupItem) && other.base_item.is_a?(LocationItem))
63
63
  return false unless other.state?
@@ -48,8 +48,8 @@ module OpenHAB
48
48
  # or item state of the same type
49
49
  #
50
50
  def ===(other)
51
- logger.trace("(#{self.class}) #{self} === #{other} (#{other.class})")
52
- other = other.state if other.respond_to?(:state)
51
+ logger.trace { "Type (#{self.class}) #{self} === #{other} (#{other.class})" }
52
+ other = other.state if other.respond_to?(:state) && !other.is_a?(OpenHAB::DSL::GenericItemObject)
53
53
  return false unless instance_of?(other.class)
54
54
 
55
55
  eql?(other)
@@ -62,7 +62,7 @@ module OpenHAB
62
62
  # type conversions
63
63
  #
64
64
  def ==(other) # rubocop:disable Metrics
65
- logger.trace("(#{self.class}) #{self} == #{other} (#{other.class})")
65
+ logger.trace { "(#{self.class}) #{self} == #{other} (#{other.class})" }
66
66
  return true if equal?(other)
67
67
 
68
68
  # i.e. ON == OFF, REFRESH == ON, ON == REFRESH
@@ -5,5 +5,5 @@
5
5
  #
6
6
  module OpenHAB
7
7
  # @return [String] Version of OpenHAB helper libraries
8
- VERSION = '4.38.0'
8
+ VERSION = '4.40.0'
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: 4.38.0
4
+ version: 4.40.0
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: 2022-04-15 00:00:00.000000000 Z
11
+ date: 2022-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler