openhab-jrubyscripting 5.0.0.rc9 → 5.0.0.rc11
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 +4 -4
- data/lib/openhab/core/actions/audio.rb +47 -0
- data/lib/openhab/core/actions/ephemeris.rb +39 -0
- data/lib/openhab/core/actions/exec.rb +51 -0
- data/lib/openhab/core/actions/http.rb +80 -0
- data/lib/openhab/core/actions/ping.rb +30 -0
- data/lib/openhab/core/actions/transformation.rb +32 -0
- data/lib/openhab/core/actions/voice.rb +36 -0
- data/lib/openhab/core/actions.rb +23 -120
- data/lib/openhab/core/{events → dto}/item_channel_link.rb +1 -4
- data/lib/openhab/core/{events → dto}/thing.rb +10 -12
- data/lib/openhab/core/dto.rb +11 -0
- data/lib/openhab/core/entity_lookup.rb +1 -1
- data/lib/openhab/core/events/abstract_event.rb +1 -0
- data/lib/openhab/core/events/abstract_item_registry_event.rb +36 -0
- data/lib/openhab/core/events/abstract_thing_registry_event.rb +40 -0
- data/lib/openhab/core/events/item_command_event.rb +1 -1
- data/lib/openhab/core/events/item_state_changed_event.rb +6 -6
- data/lib/openhab/core/events/item_state_event.rb +6 -6
- data/lib/openhab/core/events/thing_status_info_event.rb +8 -6
- data/lib/openhab/core/items/generic_item.rb +2 -1
- data/lib/openhab/core/items/persistence.rb +52 -18
- data/lib/openhab/core/items/player_item.rb +1 -1
- data/lib/openhab/core/items/proxy.rb +20 -14
- data/lib/openhab/core/items/registry.rb +2 -0
- data/lib/openhab/core/items.rb +3 -3
- data/lib/openhab/core/profile_factory.rb +3 -1
- data/lib/openhab/core/proxy.rb +125 -0
- data/lib/openhab/core/things/links/provider.rb +1 -1
- data/lib/openhab/core/things/proxy.rb +8 -0
- data/lib/openhab/core/types/date_time_type.rb +2 -1
- data/lib/openhab/core/types/decimal_type.rb +1 -1
- data/lib/openhab/core/types/un_def_type.rb +2 -2
- data/lib/openhab/core/value_cache.rb +1 -1
- data/lib/openhab/core_ext/ephemeris.rb +53 -0
- data/lib/openhab/core_ext/java/class.rb +1 -1
- data/lib/openhab/core_ext/java/duration.rb +25 -1
- data/lib/openhab/core_ext/java/local_date.rb +2 -0
- data/lib/openhab/core_ext/java/month_day.rb +2 -0
- data/lib/openhab/core_ext/java/zoned_date_time.rb +85 -0
- data/lib/openhab/core_ext/ruby/date.rb +2 -0
- data/lib/openhab/core_ext/ruby/date_time.rb +1 -0
- data/lib/openhab/core_ext/ruby/time.rb +1 -0
- data/lib/openhab/dsl/debouncer.rb +259 -0
- data/lib/openhab/dsl/items/builder.rb +4 -2
- data/lib/openhab/dsl/items/timed_command.rb +31 -13
- data/lib/openhab/dsl/rules/automation_rule.rb +28 -21
- data/lib/openhab/dsl/rules/builder.rb +357 -37
- data/lib/openhab/dsl/rules/guard.rb +12 -54
- data/lib/openhab/dsl/rules/name_inference.rb +11 -0
- data/lib/openhab/dsl/rules/property.rb +3 -4
- data/lib/openhab/dsl/rules/terse.rb +4 -1
- data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +5 -6
- data/lib/openhab/dsl/rules/triggers/cron/cron.rb +1 -0
- data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +19 -31
- data/lib/openhab/dsl/rules/triggers/watch/watch.rb +1 -0
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +22 -30
- data/lib/openhab/dsl/things/builder.rb +1 -1
- data/lib/openhab/dsl/thread_local.rb +1 -0
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +224 -3
- data/lib/openhab/rspec/hooks.rb +5 -2
- data/lib/openhab/rspec/karaf.rb +7 -0
- data/lib/openhab/rspec/mocks/instance_method_stasher.rb +22 -0
- data/lib/openhab/rspec/mocks/space.rb +23 -0
- data/lib/openhab/rspec/openhab/core/actions.rb +16 -4
- data/lib/openhab/rspec/openhab/core/items/proxy.rb +1 -13
- data/lib/openhab/rspec/suspend_rules.rb +1 -14
- data/lib/openhab/yard/base_helper.rb +19 -0
- data/lib/openhab/yard/code_objects/group_object.rb +9 -3
- data/lib/openhab/yard/coderay.rb +17 -0
- data/lib/openhab/yard/handlers/jruby/base.rb +10 -1
- data/lib/openhab/yard/handlers/jruby/java_import_handler.rb +3 -0
- data/lib/openhab/yard/html_helper.rb +49 -15
- data/lib/openhab/yard/markdown_helper.rb +135 -0
- data/lib/openhab/yard.rb +6 -0
- metadata +36 -4
@@ -10,7 +10,7 @@ module OpenHAB
|
|
10
10
|
# Adds methods to core openHAB ItemCommandEvent to make it more natural in Ruby
|
11
11
|
class ItemCommandEvent < ItemEvent
|
12
12
|
# @!attribute [r] command
|
13
|
-
# @return [
|
13
|
+
# @return [Command] The command sent to the item.
|
14
14
|
alias_method :command, :item_command
|
15
15
|
|
16
16
|
# @!method refresh?
|
@@ -14,26 +14,26 @@ module OpenHAB
|
|
14
14
|
include ItemState
|
15
15
|
|
16
16
|
#
|
17
|
-
# Check if state was == UNDEF
|
17
|
+
# Check if state was == {UNDEF}
|
18
18
|
#
|
19
|
-
# @return [true,false] True if the state is UNDEF, false otherwise
|
19
|
+
# @return [true,false] True if the state is {UNDEF}, false otherwise
|
20
20
|
#
|
21
21
|
def was_undef?
|
22
22
|
old_item_state == UNDEF
|
23
23
|
end
|
24
24
|
|
25
25
|
#
|
26
|
-
# Check if state was == NULL
|
26
|
+
# Check if state was == {NULL}
|
27
27
|
#
|
28
|
-
# @return [true,false] True if the state is NULL, false otherwise
|
28
|
+
# @return [true,false] True if the state is {NULL}, false otherwise
|
29
29
|
def was_null?
|
30
30
|
old_item_state == NULL
|
31
31
|
end
|
32
32
|
|
33
33
|
#
|
34
|
-
# Check if state was defined (not UNDEF or NULL)
|
34
|
+
# Check if state was defined (not {UNDEF} or {NULL})
|
35
35
|
#
|
36
|
-
# @return [true,false] True if state is not UNDEF or NULL
|
36
|
+
# @return [true,false] True if state is not {UNDEF} or {NULL}
|
37
37
|
#
|
38
38
|
def was?
|
39
39
|
!old_item_state.is_a?(UnDefType)
|
@@ -8,26 +8,26 @@ module OpenHAB
|
|
8
8
|
# Helpers common to {ItemStateEvent} and {ItemStateChangedEvent}.
|
9
9
|
module ItemState
|
10
10
|
#
|
11
|
-
# Check if the state == UNDEF
|
11
|
+
# Check if the state == {UNDEF}
|
12
12
|
#
|
13
|
-
# @return [true,false] True if the state is UNDEF, false otherwise
|
13
|
+
# @return [true,false] True if the state is {UNDEF}, false otherwise
|
14
14
|
#
|
15
15
|
def undef?
|
16
16
|
item_state == UNDEF
|
17
17
|
end
|
18
18
|
|
19
19
|
#
|
20
|
-
# Check if the state == NULL
|
20
|
+
# Check if the state == {NULL}
|
21
21
|
#
|
22
|
-
# @return [true,false] True if the state is NULL, false otherwise
|
22
|
+
# @return [true,false] True if the state is {NULL}, false otherwise
|
23
23
|
def null?
|
24
24
|
item_state == NULL
|
25
25
|
end
|
26
26
|
|
27
27
|
#
|
28
|
-
# Check if the state is defined (not UNDEF or NULL)
|
28
|
+
# Check if the state is defined (not {UNDEF} or {NULL})
|
29
29
|
#
|
30
|
-
# @return [true,false] True if state is not UNDEF or NULL
|
30
|
+
# @return [true,false] True if state is not {UNDEF} or {NULL}
|
31
31
|
#
|
32
32
|
def state?
|
33
33
|
!item_state.is_a?(UnDefType)
|
@@ -6,16 +6,18 @@ module OpenHAB
|
|
6
6
|
java_import org.openhab.core.thing.events.ThingStatusInfoChangedEvent,
|
7
7
|
org.openhab.core.thing.events.ThingStatusInfoEvent
|
8
8
|
|
9
|
-
#
|
9
|
+
#
|
10
|
+
# The {AbstractEvent} sent when a {Things::Thing Thing's} status has changed.
|
11
|
+
#
|
10
12
|
class ThingStatusInfoChangedEvent < AbstractEvent
|
11
13
|
# @!attribute [r] uid
|
12
|
-
# @return [Things::ThingUID] The UID of the
|
14
|
+
# @return [Things::ThingUID] The UID of the {Things::Thing Thing} that triggered this event.
|
13
15
|
alias_method :uid, :get_thing_uid
|
14
16
|
# @!attribute [r] was
|
15
|
-
# @return [
|
17
|
+
# @return [org.openhab.core.thing.ThingStatusInfo] The thing's prior status.
|
16
18
|
alias_method :was, :get_old_status_info
|
17
19
|
# @!attribute [r] status
|
18
|
-
# @return [
|
20
|
+
# @return [org.openhab.core.thing.ThingStatusInfo] The thing's status.
|
19
21
|
alias_method :status, :status_info
|
20
22
|
|
21
23
|
#
|
@@ -31,12 +33,12 @@ module OpenHAB
|
|
31
33
|
class ThingStatusInfoEvent < AbstractEvent
|
32
34
|
#
|
33
35
|
# @!attribute [r] uid
|
34
|
-
# @return [Things::ThingUID] The UID of the
|
36
|
+
# @return [Things::ThingUID] The UID of the {Things::Thing Thing} that triggered this event.
|
35
37
|
#
|
36
38
|
alias_method :uid, :get_thing_uid
|
37
39
|
#
|
38
40
|
# @!attribute [r] status
|
39
|
-
# @return [
|
41
|
+
# @return [org.openhab.core.thing.ThingStatusInfo] The thing's status.
|
40
42
|
#
|
41
43
|
alias_method :status, :status_info
|
42
44
|
|
@@ -8,7 +8,7 @@ module OpenHAB
|
|
8
8
|
#
|
9
9
|
# The abstract base class for all items.
|
10
10
|
#
|
11
|
-
# @see
|
11
|
+
# @see org.openhab.core.items.GenericItem
|
12
12
|
#
|
13
13
|
class GenericItem
|
14
14
|
# @!parse include Item
|
@@ -49,6 +49,7 @@ module OpenHAB
|
|
49
49
|
# The item's descriptive label.
|
50
50
|
# @return [String, nil]
|
51
51
|
|
52
|
+
# @!visibility private
|
52
53
|
alias_method :hash, :hash_code
|
53
54
|
|
54
55
|
# @!attribute [r] raw_state
|
@@ -48,6 +48,8 @@ module OpenHAB
|
|
48
48
|
# that state into a {QuantityType} as necessary.
|
49
49
|
#
|
50
50
|
class HistoricState < SimpleDelegator
|
51
|
+
# @!attribute [r] state
|
52
|
+
# @return [Types::State]
|
51
53
|
alias_method :state, :__getobj__
|
52
54
|
|
53
55
|
def initialize(state, historic_item)
|
@@ -70,8 +72,11 @@ module OpenHAB
|
|
70
72
|
variance_since].freeze
|
71
73
|
|
72
74
|
# All persistence methods that require a timestamp
|
75
|
+
# Note the _between methods are automatically created from the _since methods
|
73
76
|
PERSISTENCE_METHODS = (QUANTITY_METHODS +
|
74
77
|
%i[changed_since?
|
78
|
+
count_since
|
79
|
+
count_state_changes_since
|
75
80
|
evolution_rate
|
76
81
|
historic_state
|
77
82
|
maximum_since
|
@@ -80,24 +85,24 @@ module OpenHAB
|
|
80
85
|
private_constant :QUANTITY_METHODS, :PERSISTENCE_METHODS
|
81
86
|
|
82
87
|
# @!method persist(service = nil)
|
83
|
-
#
|
88
|
+
# Persists the state of the item
|
84
89
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
85
90
|
# @return [void]
|
86
91
|
|
87
92
|
# @!method last_update(service = nil)
|
88
|
-
#
|
93
|
+
# Returns the time the item was last updated.
|
89
94
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
90
95
|
# @return [ZonedDateTime, nil] The timestamp of the last update
|
91
96
|
|
92
97
|
# @!method average_since(timestamp, service = nil)
|
93
|
-
#
|
98
|
+
# Returns the average value of the item's state since the given time
|
94
99
|
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
95
100
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
96
101
|
# @return [DecimalType, QuantityType, nil] The average value since `timestamp`,
|
97
102
|
# or nil if no previous state could be found.
|
98
103
|
|
99
104
|
# @!method average_between(start, finish, service = nil)
|
100
|
-
#
|
105
|
+
# Returns the average value of the item's state between two points in time
|
101
106
|
# @param [#to_zoned_date_time] start The point in time from which to search
|
102
107
|
# @param [#to_zoned_date_time] finish The point in time to which to search
|
103
108
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
@@ -105,14 +110,14 @@ module OpenHAB
|
|
105
110
|
# or nil if no previous state could be found.
|
106
111
|
|
107
112
|
# @!method delta_since(timestamp, service = nil)
|
108
|
-
#
|
113
|
+
# Returns the difference value of the item's state since the given time
|
109
114
|
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
110
115
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
111
116
|
# @return [DecimalType, QuantityType, nil] The difference value since `timestamp`,
|
112
117
|
# or nil if no previous state could be found.
|
113
118
|
|
114
119
|
# @!method delta_between(start, finish, service = nil)
|
115
|
-
#
|
120
|
+
# Returns the difference value of the item's state between two points in time
|
116
121
|
# @param [#to_zoned_date_time] start The point in time from which to search
|
117
122
|
# @param [#to_zoned_date_time] finish The point in time to which to search
|
118
123
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
@@ -120,14 +125,14 @@ module OpenHAB
|
|
120
125
|
# or nil if no previous state could be found.
|
121
126
|
|
122
127
|
# @!method deviation_since(timestamp, service = nil)
|
123
|
-
#
|
128
|
+
# Returns the standard deviation of the item's state since the given time
|
124
129
|
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
125
130
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
126
131
|
# @return [DecimalType, QuantityType, nil] The standard deviation since `timestamp`,
|
127
132
|
# or nil if no previous state could be found.
|
128
133
|
|
129
134
|
# @!method deviation_between(start, finish, service = nil)
|
130
|
-
#
|
135
|
+
# Returns the standard deviation of the item's state between two points in time
|
131
136
|
# @param [#to_zoned_date_time] start The point in time from which to search
|
132
137
|
# @param [#to_zoned_date_time] finish The point in time to which to search
|
133
138
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
@@ -135,14 +140,14 @@ module OpenHAB
|
|
135
140
|
# or nil if no previous state could be found.
|
136
141
|
|
137
142
|
# @!method sum_since(timestamp, service = nil)
|
138
|
-
#
|
143
|
+
# Returns the sum of the item's state since the given time
|
139
144
|
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
140
145
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
141
146
|
# @return [DecimalType, QuantityType, nil] The sum since `timestamp`,
|
142
147
|
# or nil if no previous state could be found.
|
143
148
|
|
144
149
|
# @!method sum_between(start, finish, service = nil)
|
145
|
-
#
|
150
|
+
# Returns the sum of the item's state between two points in time
|
146
151
|
# @param [#to_zoned_date_time] start The point in time from which to search
|
147
152
|
# @param [#to_zoned_date_time] finish The point in time to which to search
|
148
153
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
@@ -150,14 +155,14 @@ module OpenHAB
|
|
150
155
|
# or nil if no previous state could be found.
|
151
156
|
|
152
157
|
# @!method variance_since(timestamp, service = nil)
|
153
|
-
#
|
158
|
+
# Returns the variance of the item's state since the given time
|
154
159
|
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
155
160
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
156
161
|
# @return [DecimalType, QuantityType, nil] The variance since `timestamp`,
|
157
162
|
# or nil if no previous state could be found.
|
158
163
|
|
159
164
|
# @!method variance_between(start, finish, service = nil)
|
160
|
-
#
|
165
|
+
# Returns the variance of the item's state between two points in time
|
161
166
|
# @param [#to_zoned_date_time] start The point in time from which to search
|
162
167
|
# @param [#to_zoned_date_time] finish The point in time to which to search
|
163
168
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
@@ -178,28 +183,28 @@ module OpenHAB
|
|
178
183
|
# @return [true,false] True if the item's state changed between `start` and `finish`, False otherwise.
|
179
184
|
|
180
185
|
# @!method evolution_rate(timestamp, service = nil)
|
181
|
-
#
|
186
|
+
# Returns the evolution rate of the item's state since the given time
|
182
187
|
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
183
188
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
184
189
|
# @return [DecimalType, QuantityType, nil] The evolution rate since `timestamp`,
|
185
190
|
# or nil if no previous state could be found.
|
186
191
|
|
187
192
|
# @!method historic_state(timestamp, service = nil)
|
188
|
-
#
|
193
|
+
# Returns the the item's state at the given time
|
189
194
|
# @param [#to_zoned_date_time] timestamp The point in time at which to search
|
190
195
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
191
196
|
# @return [HistoricState, nil] The item's state at `timestamp`,
|
192
197
|
# or nil if no previous state could be found.
|
193
198
|
|
194
199
|
# @!method maximum_since(timestamp, service = nil)
|
195
|
-
#
|
200
|
+
# Returns the maximum value of the item's state since the given time
|
196
201
|
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
197
202
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
198
203
|
# @return [HistoricState, nil] The maximum value since `timestamp`,
|
199
204
|
# or nil if no previous state could be found.
|
200
205
|
|
201
206
|
# @!method maximum_between(start, finish, service = nil)
|
202
|
-
#
|
207
|
+
# Returns the maximum value of the item's state between two points in time
|
203
208
|
# @param [#to_zoned_date_time] start The point in time from which to search
|
204
209
|
# @param [#to_zoned_date_time] finish The point in time to which to search
|
205
210
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
@@ -207,14 +212,14 @@ module OpenHAB
|
|
207
212
|
# or nil if no previous state could be found.
|
208
213
|
|
209
214
|
# @!method minimum_since(timestamp, service = nil)
|
210
|
-
#
|
215
|
+
# Returns the minimum value of the item's state since the given time
|
211
216
|
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
212
217
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
213
218
|
# @return [HistoricState, nil] The minimum value since `timestamp`,
|
214
219
|
# or nil if no previous state could be found.
|
215
220
|
|
216
221
|
# @!method minimum_between(start, finish, service = nil)
|
217
|
-
#
|
222
|
+
# Returns the minimum value of the item's state between two points in time
|
218
223
|
# @param [#to_zoned_date_time] start The point in time from which to search
|
219
224
|
# @param [#to_zoned_date_time] finish The point in time to which to search
|
220
225
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
@@ -234,6 +239,32 @@ module OpenHAB
|
|
234
239
|
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
235
240
|
# @return [true,false] True if the item's state was updated between `start` and `finish`, False otherwise.
|
236
241
|
|
242
|
+
# @!method count_since(timestamp, service = nil)
|
243
|
+
# Returns the number of available historic data points from a point in time until now.
|
244
|
+
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
245
|
+
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
246
|
+
# @return [Integer] The number of values persisted for this item.
|
247
|
+
|
248
|
+
# @!method count_between(start, finish, service = nil)
|
249
|
+
# Returns the number of available historic data points between two points in time.
|
250
|
+
# @param [#to_zoned_date_time] start The point in time from which to search
|
251
|
+
# @param [#to_zoned_date_time] finish The point in time to which to search
|
252
|
+
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
253
|
+
# @return [Integer] The number of values persisted for this item.
|
254
|
+
|
255
|
+
# @!method count_state_changes_since(timestamp, service = nil)
|
256
|
+
# Returns the number of changes in historic data points from a point in time until now.
|
257
|
+
# @param [#to_zoned_date_time] timestamp The point in time from which to search
|
258
|
+
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
259
|
+
# @return [Integer] The number of values persisted for this item.
|
260
|
+
|
261
|
+
# @!method count_state_changes_between(start, finish, service = nil)
|
262
|
+
# Returns the number of changes in historic data points between two points in time.
|
263
|
+
# @param [#to_zoned_date_time] start The point in time from which to search
|
264
|
+
# @param [#to_zoned_date_time] finish The point in time to which to search
|
265
|
+
# @param [Symbol, String] service An optional persistence id instead of the default persistence service.
|
266
|
+
# @return [Integer] The number of values persisted for this item.
|
267
|
+
|
237
268
|
%i[persist last_update].each do |method|
|
238
269
|
define_method(method) do |service = nil|
|
239
270
|
service ||= persistence_service
|
@@ -286,6 +317,9 @@ module OpenHAB
|
|
286
317
|
end
|
287
318
|
end
|
288
319
|
|
320
|
+
alias_method :state_changes_since, :count_state_changes_since
|
321
|
+
alias_method :state_changes_between, :count_state_changes_between
|
322
|
+
|
289
323
|
private
|
290
324
|
|
291
325
|
#
|
@@ -16,7 +16,7 @@ module OpenHAB
|
|
16
16
|
# @example Start playing on a player item
|
17
17
|
# Chromecast.play
|
18
18
|
# @example Check if a player is paused
|
19
|
-
# logger.warn("#{item.name} is paused) if Chromecast.paused?
|
19
|
+
# logger.warn("#{item.name} is paused") if Chromecast.paused?
|
20
20
|
#
|
21
21
|
class PlayerItem < GenericItem
|
22
22
|
# @!method play?
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "delegate"
|
4
|
+
require_relative "../proxy"
|
4
5
|
|
5
6
|
module OpenHAB
|
6
7
|
module Core
|
@@ -11,6 +12,13 @@ module OpenHAB
|
|
11
12
|
# Not really an Item, but pretends to be
|
12
13
|
# @!parse include Item
|
13
14
|
|
15
|
+
# @!visibility private
|
16
|
+
EVENTS = [Events::ItemAddedEvent::TYPE, Events::ItemUpdatedEvent::TYPE, Events::ItemRemovedEvent::TYPE].freeze
|
17
|
+
# @!visibility private
|
18
|
+
UID_METHOD = :name
|
19
|
+
|
20
|
+
include Core::Proxy
|
21
|
+
|
14
22
|
# @return [String]
|
15
23
|
attr_reader :name
|
16
24
|
|
@@ -18,19 +26,15 @@ module OpenHAB
|
|
18
26
|
# Set the proxy item (called by super)
|
19
27
|
#
|
20
28
|
def __setobj__(item)
|
21
|
-
@
|
22
|
-
|
23
|
-
@java_name = item.name.to_java
|
29
|
+
@item = item.is_a?(Item) ? item : nil
|
30
|
+
@name ||= item.name if item
|
24
31
|
end
|
25
32
|
|
26
33
|
#
|
27
|
-
#
|
34
|
+
# @return [Item, nil]
|
28
35
|
#
|
29
36
|
def __getobj__
|
30
|
-
|
31
|
-
return yield if r.nil? && block_given?
|
32
|
-
|
33
|
-
r
|
37
|
+
@item
|
34
38
|
end
|
35
39
|
|
36
40
|
# @return [Module]
|
@@ -88,9 +92,9 @@ module OpenHAB
|
|
88
92
|
# @return [GroupItem::Members]
|
89
93
|
# @raise [NoMethodError] if item is not a GroupItem, or a dummy.
|
90
94
|
def members
|
91
|
-
return
|
95
|
+
return GroupItem::Members.new(self) if __getobj__.nil?
|
92
96
|
|
93
|
-
|
97
|
+
__getobj__.members
|
94
98
|
end
|
95
99
|
|
96
100
|
# @return [String]
|
@@ -112,15 +116,17 @@ module OpenHAB
|
|
112
116
|
end
|
113
117
|
|
114
118
|
# needs to return `false` if we know we're not a {GroupItem}
|
115
|
-
def respond_to?(method, *)
|
116
|
-
|
119
|
+
def respond_to?(method, *args)
|
120
|
+
obj = __getobj__
|
121
|
+
return obj.respond_to?(method, *args) if method.to_sym == :members && !obj.nil?
|
117
122
|
|
118
123
|
super
|
119
124
|
end
|
120
125
|
|
121
126
|
# needs to return `false` if we know we're not a {GroupItem}
|
122
|
-
def respond_to_missing?(method, *)
|
123
|
-
|
127
|
+
def respond_to_missing?(method, *args)
|
128
|
+
obj = __getobj__
|
129
|
+
return obj.respond_to_missing?(method, *args) if method.to_sym == :members && !obj.nil?
|
124
130
|
|
125
131
|
super
|
126
132
|
end
|
@@ -48,6 +48,8 @@ module OpenHAB
|
|
48
48
|
# @yield Block executed in the context of a {DSL::Items::Builder}
|
49
49
|
# @return [Object] The return value of the block.
|
50
50
|
#
|
51
|
+
# (see Items::Builder)
|
52
|
+
#
|
51
53
|
def build(preferred_provider = nil, &block)
|
52
54
|
DSL::Items::BaseBuilderDSL.new(preferred_provider).instance_eval_with_dummy_items(&block)
|
53
55
|
end
|
data/lib/openhab/core/items.rb
CHANGED
@@ -62,9 +62,9 @@ module OpenHAB
|
|
62
62
|
|
63
63
|
logger.trace("Defining #{klass}##{command} for #{value}")
|
64
64
|
klass.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
65
|
-
def #{command}(
|
66
|
-
command(#{value},
|
67
|
-
end
|
65
|
+
ruby2_keywords def #{command}(*args, &block) # ruby2_keywords def on(*args, &block)
|
66
|
+
command(#{value}, *args, &block) # command(ON, *args, &block)
|
67
|
+
end # end
|
68
68
|
RUBY
|
69
69
|
|
70
70
|
logger.trace("Defining Enumerable##{command} for #{value}")
|
@@ -69,10 +69,12 @@ module OpenHAB
|
|
69
69
|
|
70
70
|
params[:callback] = @callback
|
71
71
|
params[:context] = @context
|
72
|
-
params[:
|
72
|
+
params[:configuration] = @context.configuration.properties
|
73
73
|
params[:link] = @callback.link
|
74
74
|
params[:item] = @callback.link.item
|
75
75
|
params[:channel_uid] = @callback.link.linked_uid
|
76
|
+
params[:state] ||= nil
|
77
|
+
params[:command] ||= nil
|
76
78
|
|
77
79
|
kwargs = {}
|
78
80
|
@block.parameters.each do |(param_type, name)|
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "singleton"
|
4
|
+
require "weakref"
|
5
|
+
|
6
|
+
require_relative "script_handling"
|
7
|
+
|
8
|
+
module OpenHAB
|
9
|
+
module Core
|
10
|
+
#
|
11
|
+
# Contains the infrastructure necessary to listen for events when objects are
|
12
|
+
# added/removed from their registry, and keep Proxy objects up-to-date with
|
13
|
+
# their underlying object.
|
14
|
+
#
|
15
|
+
# The including class must meet a few requirements:
|
16
|
+
# * Have an `EVENTS` constant that is an Array<String> of the events to
|
17
|
+
# listen for
|
18
|
+
# * The _last_ entry in the `EVENTS` array must be the "removed" event
|
19
|
+
# * It must have a sibling class called `Provider`, with a `.registry`
|
20
|
+
# method
|
21
|
+
# * It's parent module, downcased and with trailing "s" stripped, must be
|
22
|
+
# the method name to retrieve an object from one of the incoming events
|
23
|
+
#
|
24
|
+
# @!visibility private
|
25
|
+
#
|
26
|
+
module Proxy
|
27
|
+
#
|
28
|
+
# Registers and listens to openHAB bus events for objects getting
|
29
|
+
# added/updated/removed, and updates references from proxy objects
|
30
|
+
# to real objects.
|
31
|
+
#
|
32
|
+
# Proxies are tracked (via a WeakRef), and their underlying object is
|
33
|
+
# if it has changed.
|
34
|
+
#
|
35
|
+
class EventSubscriber
|
36
|
+
include Singleton
|
37
|
+
include org.openhab.core.events.EventSubscriber
|
38
|
+
|
39
|
+
def initialize
|
40
|
+
@proxies = java.util.concurrent.ConcurrentHashMap.new
|
41
|
+
@parent_module = Object.const_get(self.class.name.split("::")[0..-3].join("::"), false)
|
42
|
+
@object_type = @parent_module.name.split("::").last.downcase[0..-2].to_sym
|
43
|
+
|
44
|
+
@event_types = @parent_module::Proxy::EVENTS
|
45
|
+
@uid_method = @parent_module::Proxy::UID_METHOD
|
46
|
+
@registry = @parent_module::Provider.registry
|
47
|
+
@registration = OSGi.register_service(self, "event.topics": "openhab/*")
|
48
|
+
ScriptHandling.script_unloaded { @registration.unregister }
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# @!attribute [r] subscribed_event_types
|
53
|
+
# @return [Set<String>]
|
54
|
+
#
|
55
|
+
def subscribed_event_types
|
56
|
+
@event_types.to_set
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [org.openhab.core.events.EventFilter, nil]
|
60
|
+
def event_filter
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# @param [Events::AbstractEvent] event
|
66
|
+
# @return [void]
|
67
|
+
#
|
68
|
+
def receive(event)
|
69
|
+
uid = event.__send__(@object_type).__send__(@uid_method)
|
70
|
+
object = @registry.get(uid) unless event.class.simple_name == @event_types.last
|
71
|
+
|
72
|
+
@proxies.compute_if_present(uid) do |_, proxy_ref|
|
73
|
+
proxy = resolve_ref(proxy_ref)
|
74
|
+
next nil unless proxy
|
75
|
+
|
76
|
+
proxy.__setobj__(object)
|
77
|
+
proxy_ref
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Get or create a Proxy for the given raw openHAB object.
|
83
|
+
#
|
84
|
+
def fetch(object)
|
85
|
+
result = nil
|
86
|
+
|
87
|
+
@proxies.compute(object.__send__(@uid_method)) do |_k, proxy_ref|
|
88
|
+
result = resolve_ref(proxy_ref)
|
89
|
+
proxy_ref = nil unless result
|
90
|
+
result ||= yield
|
91
|
+
|
92
|
+
proxy_ref || WeakRef.new(result)
|
93
|
+
end
|
94
|
+
|
95
|
+
result
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def resolve_ref(proxy_ref)
|
101
|
+
proxy_ref.__getobj__ if proxy_ref&.weakref_alive?
|
102
|
+
rescue WeakRef::RefError
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# @!visibility private
|
108
|
+
module ClassMethods
|
109
|
+
# Intercepts calls to create new proxies, and returns the already
|
110
|
+
# existing (and tracked) proxy if it exists. Otherwise it does create
|
111
|
+
# a new instance of Proxy.
|
112
|
+
def new(object)
|
113
|
+
self::EventSubscriber.instance.fetch(object) { super }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# @!visibility private
|
118
|
+
def self.included(klass)
|
119
|
+
klass.singleton_class.prepend(ClassMethods)
|
120
|
+
# define a sub-class of EventSubscriber as a child class of the including class
|
121
|
+
klass.const_set(:EventSubscriber, Class.new(EventSubscriber))
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -17,7 +17,7 @@ module OpenHAB
|
|
17
17
|
#
|
18
18
|
# The ItemChannelLink registry
|
19
19
|
#
|
20
|
-
# @return [org.openhab.core.thing.link.
|
20
|
+
# @return [org.openhab.core.thing.link.ItemChannelLinkRegistry]
|
21
21
|
#
|
22
22
|
def registry
|
23
23
|
@registry ||= OSGi.service("org.openhab.core.thing.link.ItemChannelLinkRegistry")
|
@@ -12,6 +12,14 @@ module OpenHAB
|
|
12
12
|
extend Forwardable
|
13
13
|
def_delegators :__getobj__, :class, :is_a?, :kind_of?
|
14
14
|
|
15
|
+
# @!visibility private
|
16
|
+
EVENTS = [Events::ThingAddedEvent::TYPE, Events::ThingUpdatedEvent::TYPE,
|
17
|
+
Events::ThingRemovedEvent::TYPE].freeze
|
18
|
+
# @!visibility private
|
19
|
+
UID_METHOD = :uid
|
20
|
+
|
21
|
+
include Core::Proxy
|
22
|
+
|
15
23
|
# Returns the list of channels associated with this Thing
|
16
24
|
#
|
17
25
|
# @note This is defined on this class, and not on {Thing}, because
|
@@ -33,7 +33,7 @@ module OpenHAB
|
|
33
33
|
|
34
34
|
class << self
|
35
35
|
#
|
36
|
-
# Parses a String representing a time into
|
36
|
+
# Parses a String representing a time into a {DateTimeType}. First tries to parse it
|
37
37
|
# using Java's parser, then falls back to the Ruby `Time.parse`.
|
38
38
|
#
|
39
39
|
# @param [String] time_string
|
@@ -71,6 +71,7 @@ module OpenHAB
|
|
71
71
|
def_delegator :zoned_date_time, :to_epoch_second, :to_i
|
72
72
|
def_delegator :zoned_date_time, :to_time
|
73
73
|
|
74
|
+
# @!visibility private
|
74
75
|
alias_method :day, :mday
|
75
76
|
|
76
77
|
#
|
@@ -11,7 +11,7 @@ module OpenHAB
|
|
11
11
|
DecimalType = org.openhab.core.library.types.DecimalType
|
12
12
|
|
13
13
|
#
|
14
|
-
# {DecimalType} uses a {java.
|
14
|
+
# {DecimalType} uses a {java.math.BigDecimal} internally and thus can be
|
15
15
|
# used for integers, longs and floating point numbers alike.
|
16
16
|
#
|
17
17
|
# @example DecimalType can be used in case statements with ranges
|