openhab-jrubyscripting 5.0.0.rc12 → 5.0.0.rc.13
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/transformation.rb +3 -3
- data/lib/openhab/core/actions.rb +1 -1
- data/lib/openhab/core/events/item_command_event.rb +31 -31
- data/lib/openhab/core/events/item_state_changed_event.rb +41 -18
- data/lib/openhab/core/events/item_state_event.rb +46 -18
- data/lib/openhab/core/items/generic_item.rb +29 -1
- data/lib/openhab/core/items/item.rb +54 -1
- data/lib/openhab/core/items/provider.rb +4 -0
- data/lib/openhab/core/items/semantics/enumerable.rb +29 -6
- data/lib/openhab/core/items.rb +6 -13
- data/lib/openhab/core/provider.rb +2 -2
- data/lib/openhab/core/rules/provider.rb +0 -15
- data/lib/openhab/core/script_handling.rb +8 -8
- data/lib/openhab/core/things/provider.rb +4 -0
- data/lib/openhab/core/types/decimal_type.rb +4 -9
- data/lib/openhab/core/types/hsb_type.rb +2 -2
- data/lib/openhab/core/types/quantity_type.rb +4 -9
- data/lib/openhab/core/types/string_type.rb +1 -1
- data/lib/openhab/core/types/type.rb +8 -28
- data/lib/openhab/core/types.rb +16 -3
- data/lib/openhab/core_ext/ruby/{class.rb → module.rb} +3 -3
- data/lib/openhab/dsl/items/ensure.rb +8 -6
- data/lib/openhab/dsl/rules/terse.rb +15 -13
- data/lib/openhab/dsl/timer_manager.rb +1 -1
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +11 -0
- data/lib/openhab/osgi.rb +1 -3
- data/lib/openhab/rspec/helpers.rb +0 -3
- metadata +23 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ef6b7b058463c4bbcbc500b23baf44e1ef8f3872c39f88f3819875523b9d350
|
4
|
+
data.tar.gz: f2c5511e9c61eb79a1464161d35ba239570e45172be44415784994688a789c67
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b4aca0a4cb592c7bcb84c4c50772d359cfc704f4bccb31e3aa58a1e76be0e15de9276c0184bcd696aed1c05cb7361e0f4d74f892eb9347f0a43f54ac596ecdb
|
7
|
+
data.tar.gz: 1053d9bd85f8013bcfa37242f1354e333587884179f8600c4f48ad19c5d1aa8cfdbb7795a32b37147d83d1b11334cb993663e761c4a0c2cf9574b5ec1355586e
|
@@ -7,7 +7,7 @@ module OpenHAB
|
|
7
7
|
class Transformation
|
8
8
|
class << self
|
9
9
|
# @!visibility private
|
10
|
-
alias_method :
|
10
|
+
alias_method :raw_transform, :transform if instance_methods.include?(:transform)
|
11
11
|
|
12
12
|
#
|
13
13
|
# Applies a transformation of a given type with some function to a value.
|
@@ -20,10 +20,10 @@ module OpenHAB
|
|
20
20
|
# @return [String] the transformed value, or the original value if an error occurred
|
21
21
|
#
|
22
22
|
# @example Run a transformation
|
23
|
-
#
|
23
|
+
# transform(:map, "myfan.map", 0)
|
24
24
|
#
|
25
25
|
def transform(type, function, value)
|
26
|
-
|
26
|
+
raw_transform(type.to_s.upcase, function.to_s, value.to_s)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/openhab/core/actions.rb
CHANGED
@@ -43,7 +43,7 @@ module OpenHAB
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# Import common actions
|
46
|
-
%w[Exec HTTP Ping].each do |action|
|
46
|
+
%w[Exec HTTP Ping Transformation].each do |action|
|
47
47
|
klass = (java_import "org.openhab.core.model.script.actions.#{action}").first
|
48
48
|
Object.const_set(action, klass)
|
49
49
|
end
|
@@ -7,71 +7,71 @@ module OpenHAB
|
|
7
7
|
module Events
|
8
8
|
java_import org.openhab.core.items.events.ItemCommandEvent
|
9
9
|
|
10
|
-
#
|
10
|
+
# {AbstractEvent} sent when an item receives a command.
|
11
11
|
class ItemCommandEvent < ItemEvent
|
12
12
|
# @!attribute [r] command
|
13
13
|
# @return [Command] The command sent to the item.
|
14
14
|
alias_method :command, :item_command
|
15
15
|
|
16
16
|
# @!method refresh?
|
17
|
-
# Check if
|
18
|
-
# @return [true,false]
|
17
|
+
# Check if {#command} is {REFRESH}
|
18
|
+
# @return [true, false]
|
19
19
|
|
20
20
|
# @!method on?
|
21
|
-
# Check if
|
22
|
-
# @return [true,false]
|
21
|
+
# Check if {#command} is (implicitly convertible to) {ON}
|
22
|
+
# @return [true, false]
|
23
23
|
|
24
24
|
# @!method off?
|
25
|
-
# Check if
|
26
|
-
# @return [true,false]
|
25
|
+
# Check if {#command} is (implicitly convertible to) {OFF}
|
26
|
+
# @return [true, false]
|
27
27
|
|
28
28
|
# @!method up?
|
29
|
-
# Check if
|
30
|
-
# @return [true,false]
|
29
|
+
# Check if {#command} is (implicitly convertible to) {UP}
|
30
|
+
# @return [true, false]
|
31
31
|
|
32
32
|
# @!method down?
|
33
|
-
# Check if
|
34
|
-
# @return [true,false]
|
33
|
+
# Check if {#command} is (implicitly convertible to) {DOWN}
|
34
|
+
# @return [true, false]
|
35
35
|
|
36
36
|
# @!method stop?
|
37
|
-
# Check if
|
38
|
-
# @return [true,false]
|
37
|
+
# Check if {#command} is {STOP}
|
38
|
+
# @return [true, false]
|
39
39
|
|
40
40
|
# @!method move?
|
41
|
-
# Check if
|
42
|
-
# @return [true,false]
|
41
|
+
# Check if {#command} is {MOVE}
|
42
|
+
# @return [true, false]
|
43
43
|
|
44
44
|
# @!method increase?
|
45
|
-
# Check if
|
46
|
-
# @return [true,false]
|
45
|
+
# Check if {#command} is {INCREASE}
|
46
|
+
# @return [true, false]
|
47
47
|
|
48
48
|
# @!method decrease?
|
49
|
-
# Check if
|
50
|
-
# @return [true,false]
|
49
|
+
# Check if {#command} is {DECREASE}
|
50
|
+
# @return [true, false]
|
51
51
|
|
52
52
|
# @!method play?
|
53
|
-
# Check if
|
54
|
-
# @return [true,false]
|
53
|
+
# Check if {#command} is {PLAY}
|
54
|
+
# @return [true, false]
|
55
55
|
|
56
56
|
# @!method pause?
|
57
|
-
# Check if
|
58
|
-
# @return [true,false]
|
57
|
+
# Check if {#command} is {PAUSE}
|
58
|
+
# @return [true, false]
|
59
59
|
|
60
60
|
# @!method rewind?
|
61
|
-
# Check if
|
62
|
-
# @return [true,false]
|
61
|
+
# Check if {#command} is {REWIND}
|
62
|
+
# @return [true, false]
|
63
63
|
|
64
64
|
# @!method fast_forward?
|
65
|
-
# Check if
|
66
|
-
# @return [true,false]
|
65
|
+
# Check if {#command} is {FASTFORWARD}
|
66
|
+
# @return [true, false]
|
67
67
|
|
68
68
|
# @!method next?
|
69
|
-
# Check if
|
70
|
-
# @return [true,false]
|
69
|
+
# Check if {#command} is {NEXT}
|
70
|
+
# @return [true, false]
|
71
71
|
|
72
72
|
# @!method previous?
|
73
|
-
# Check if
|
74
|
-
# @return [true,false]
|
73
|
+
# Check if {#command} is {PREVIOUS}
|
74
|
+
# @return [true, false]
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
@@ -8,32 +8,55 @@ module OpenHAB
|
|
8
8
|
java_import org.openhab.core.items.events.ItemStateChangedEvent
|
9
9
|
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# {AbstractEvent} sent when an item's state has changed.
|
12
12
|
#
|
13
13
|
class ItemStateChangedEvent < ItemEvent
|
14
14
|
include ItemState
|
15
15
|
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# @return [true,false] True if the state is {UNDEF}, false otherwise
|
20
|
-
#
|
21
|
-
def was_undef?
|
22
|
-
old_item_state == UNDEF
|
23
|
-
end
|
16
|
+
# @!method was_undef?
|
17
|
+
# Check if {#was} is {UNDEF}
|
18
|
+
# @return [true, false]
|
24
19
|
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
20
|
+
# @!method was_null?
|
21
|
+
# Check if {#was} is {NULL}
|
22
|
+
# @return [true, false]
|
23
|
+
|
24
|
+
# @!method was_on?
|
25
|
+
# Check if {#was} is (implicitly convertible to) {ON}
|
26
|
+
# @return [true, false]
|
27
|
+
|
28
|
+
# @!method was_off?
|
29
|
+
# Check if {#was} is (implicitly convertible to) {OFF}
|
30
|
+
# @return [true, false]
|
31
|
+
|
32
|
+
# @!method was_up?
|
33
|
+
# Check if {#was} is (implicitly convertible to) {UP}
|
34
|
+
# @return [true, false]
|
35
|
+
|
36
|
+
# @!method was_down?
|
37
|
+
# Check if {#was} is (implicitly convertible to) {DOWN}
|
38
|
+
# @return [true, false]
|
39
|
+
|
40
|
+
# @!method was_open?
|
41
|
+
# Check if {#was} is (implicitly convertible to) {OPEN}
|
42
|
+
# @return [true, false]
|
43
|
+
|
44
|
+
# @!method was_closed?
|
45
|
+
# Check if {#was} is (implicitly convertible to) {CLOSED}
|
46
|
+
# @return [true, false]
|
47
|
+
|
48
|
+
# @!method was_playing?
|
49
|
+
# Check if {#was} is {PLAY}
|
50
|
+
# @return [true, false]
|
51
|
+
|
52
|
+
# @!method was_paused?
|
53
|
+
# Check if {#was} is {PAUSE}
|
54
|
+
# @return [true, false]
|
32
55
|
|
33
56
|
#
|
34
57
|
# Check if state was defined (not {UNDEF} or {NULL})
|
35
58
|
#
|
36
|
-
# @return [true,false]
|
59
|
+
# @return [true,false]
|
37
60
|
#
|
38
61
|
def was?
|
39
62
|
!old_item_state.is_a?(UnDefType)
|
@@ -41,7 +64,7 @@ module OpenHAB
|
|
41
64
|
|
42
65
|
#
|
43
66
|
# @!attribute [r] was
|
44
|
-
# @return [State, nil]
|
67
|
+
# @return [State, nil] the prior state of the item if it was not {UNDEF} or {NULL}, `nil` otherwise.
|
45
68
|
#
|
46
69
|
def was
|
47
70
|
old_item_state if was?
|
@@ -5,29 +5,57 @@ module OpenHAB
|
|
5
5
|
module Events
|
6
6
|
java_import org.openhab.core.items.events.ItemStateEvent
|
7
7
|
|
8
|
+
#
|
8
9
|
# Helpers common to {ItemStateEvent} and {ItemStateChangedEvent}.
|
10
|
+
#
|
11
|
+
# Methods that refer to implicit conversion mean that for example
|
12
|
+
# a PercentType of 100% will be `true` for {#on?}, etc.
|
13
|
+
#
|
9
14
|
module ItemState
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# @return [true,false] True if the state is {UNDEF}, false otherwise
|
14
|
-
#
|
15
|
-
def undef?
|
16
|
-
item_state == UNDEF
|
17
|
-
end
|
15
|
+
# @!method undef?
|
16
|
+
# Check if {#state} is {UNDEF}
|
17
|
+
# @return [true, false]
|
18
18
|
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
# @!method null?
|
20
|
+
# Check if {#state} is {NULL}
|
21
|
+
# @return [true, false]
|
22
|
+
|
23
|
+
# @!method on?
|
24
|
+
# Check if {#state} is (implicitly convertible to) {ON}
|
25
|
+
# @return [true, false]
|
26
|
+
|
27
|
+
# @!method off?
|
28
|
+
# Check if {#state} is (implicitly convertible to) {OFF}
|
29
|
+
# @return [true, false]
|
30
|
+
|
31
|
+
# @!method up?
|
32
|
+
# Check if {#state} is (implicitly convertible to) {UP}
|
33
|
+
# @return [true, false]
|
34
|
+
|
35
|
+
# @!method down?
|
36
|
+
# Check if {#state} is (implicitly convertible to) {DOWN}
|
37
|
+
# @return [true, false]
|
38
|
+
|
39
|
+
# @!method open?
|
40
|
+
# Check if {#state} is (implicitly convertible to) {OPEN}
|
41
|
+
# @return [true, false]
|
42
|
+
|
43
|
+
# @!method closed?
|
44
|
+
# Check if {#state} is (implicitly convertible to) {CLOSED}
|
45
|
+
# @return [true, false]
|
46
|
+
|
47
|
+
# @!method playing?
|
48
|
+
# Check if {#state} is {PLAY}
|
49
|
+
# @return [true, false]
|
50
|
+
|
51
|
+
# @!method paused?
|
52
|
+
# Check if {#state} is {PAUSE}
|
53
|
+
# @return [true, false]
|
26
54
|
|
27
55
|
#
|
28
|
-
# Check if
|
56
|
+
# Check if {#state} is defined (not {UNDEF} or {NULL})
|
29
57
|
#
|
30
|
-
# @return [true,false]
|
58
|
+
# @return [true, false]
|
31
59
|
#
|
32
60
|
def state?
|
33
61
|
!item_state.is_a?(UnDefType)
|
@@ -35,7 +63,7 @@ module OpenHAB
|
|
35
63
|
|
36
64
|
#
|
37
65
|
# @!attribute [r] state
|
38
|
-
# @return [State, nil]
|
66
|
+
# @return [State, nil] the state of the item if it is not {UNDEF} or {NULL}, `nil` otherwise.
|
39
67
|
#
|
40
68
|
def state
|
41
69
|
item_state if state?
|
@@ -71,6 +71,34 @@ module OpenHAB
|
|
71
71
|
!raw_state.is_a?(Types::UnDefType)
|
72
72
|
end
|
73
73
|
|
74
|
+
# @!attribute [r] formatted_state
|
75
|
+
#
|
76
|
+
# Format the item's state according to its state description
|
77
|
+
#
|
78
|
+
# This may include running a transformation.
|
79
|
+
#
|
80
|
+
# @return [String]
|
81
|
+
#
|
82
|
+
# @example
|
83
|
+
# logger.info(Exterior_WindDirection.formatted_state) # => "NE (36°)"
|
84
|
+
#
|
85
|
+
def formatted_state
|
86
|
+
# use to_string, not to_s, to get the original openHAB toString(), instead of any overrides
|
87
|
+
# the JRuby library has defined
|
88
|
+
raw_state_string = raw_state.to_string
|
89
|
+
|
90
|
+
return raw_state_string unless (pattern = state_description&.pattern)
|
91
|
+
|
92
|
+
transformed_state_string = org.openhab.core.transform.TransformationHelper.transform(OSGi.bundle_context,
|
93
|
+
pattern,
|
94
|
+
raw_state_string)
|
95
|
+
return state.format(pattern) if transformed_state_string.nil? || transformed_state_string == raw_state_string
|
96
|
+
|
97
|
+
transformed_state_string
|
98
|
+
rescue org.openhab.core.transform.TransformationException
|
99
|
+
raw_state_string
|
100
|
+
end
|
101
|
+
|
74
102
|
#
|
75
103
|
# @!attribute [r] state
|
76
104
|
# @return [State, nil]
|
@@ -153,7 +181,7 @@ module OpenHAB
|
|
153
181
|
return state if state.is_a?(Types::State)
|
154
182
|
|
155
183
|
state = state.to_s
|
156
|
-
org.openhab.core.types.TypeParser.parse_state(getAcceptedDataTypes, state) || state
|
184
|
+
org.openhab.core.types.TypeParser.parse_state(getAcceptedDataTypes, state) || StringType.new(state)
|
157
185
|
end
|
158
186
|
|
159
187
|
# formats a {Types::Type} to send to the event bus
|
@@ -44,12 +44,49 @@ module OpenHAB
|
|
44
44
|
#
|
45
45
|
# Returns all groups that this item is part of
|
46
46
|
#
|
47
|
-
# @return [Array<
|
47
|
+
# @return [Array<GroupItem>] All groups that this item is part of
|
48
48
|
#
|
49
49
|
def groups
|
50
50
|
group_names.map { |name| EntityLookup.lookup_item(name) }.compact
|
51
51
|
end
|
52
52
|
|
53
|
+
#
|
54
|
+
# Checks if this item is a member of at least one of the given groups.
|
55
|
+
#
|
56
|
+
# @param groups [String, GroupItem] the group to check membership in
|
57
|
+
# @return [true, false]
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# event.item.member_of?(gFullOn)
|
61
|
+
#
|
62
|
+
def member_of?(*groups)
|
63
|
+
groups = groups.map! do |group|
|
64
|
+
group.is_a?(GroupItem) ? group.name : group
|
65
|
+
end
|
66
|
+
!(group_names & groups).empty?
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# @!attribute [r] all_groups
|
71
|
+
#
|
72
|
+
# Returns all groups that this item is a part of, as well as those groups' groups, recursively
|
73
|
+
#
|
74
|
+
# @return [Array<GroupItem>]
|
75
|
+
#
|
76
|
+
def all_groups
|
77
|
+
result = []
|
78
|
+
new_groups = Set.new(groups)
|
79
|
+
|
80
|
+
until new_groups.empty?
|
81
|
+
result.concat(new_groups.to_a)
|
82
|
+
new_groups.replace(new_groups.flat_map(&:groups))
|
83
|
+
# remove any groups we already have in the result to avoid loops
|
84
|
+
new_groups.subtract(result)
|
85
|
+
end
|
86
|
+
|
87
|
+
result
|
88
|
+
end
|
89
|
+
|
53
90
|
# rubocop:disable Layout/LineLength
|
54
91
|
|
55
92
|
# @!attribute [r] metadata
|
@@ -172,6 +209,22 @@ module OpenHAB
|
|
172
209
|
end
|
173
210
|
# rubocop:enable Layout/LineLength
|
174
211
|
|
212
|
+
#
|
213
|
+
# Checks if this item has at least one of the given tags.
|
214
|
+
#
|
215
|
+
# @param tags [String, Module] the tag(s) to check
|
216
|
+
# @return [true, false]
|
217
|
+
#
|
218
|
+
# @example
|
219
|
+
# event.item.tagged?("Setpoint")
|
220
|
+
#
|
221
|
+
def tagged?(*tags)
|
222
|
+
tags = tags.map! do |tag|
|
223
|
+
tag.is_a?(Module) ? tag.simple_name : tag
|
224
|
+
end
|
225
|
+
!(self.tags.to_a & tags).empty?
|
226
|
+
end
|
227
|
+
|
175
228
|
# Return the item's thing if this item is linked with a thing. If an item is linked to more than one thing,
|
176
229
|
# this method only returns the first thing.
|
177
230
|
#
|
@@ -40,33 +40,56 @@ module Enumerable
|
|
40
40
|
#
|
41
41
|
|
42
42
|
# Returns a new array of items that have at least one of the given tags
|
43
|
+
#
|
44
|
+
# @param tags [String, Module]
|
43
45
|
# @return [Array<Item>]
|
44
46
|
def tagged(*tags)
|
45
|
-
|
47
|
+
select { |i| i.tagged?(*tags) }
|
46
48
|
end
|
47
49
|
|
48
50
|
# Returns a new array of items that do not have any of the given tags
|
51
|
+
# @param tags [String, Module]
|
49
52
|
# @return [Array<Item>]
|
50
53
|
def not_tagged(*tags)
|
51
|
-
|
54
|
+
reject { |i| i.tagged?(*tags) }
|
52
55
|
end
|
53
56
|
|
54
57
|
# Returns a new array of items that are a member of at least one of the given groups
|
58
|
+
# @param groups [String, GroupItem]
|
55
59
|
# @return [Array<Item>]
|
56
60
|
def member_of(*groups)
|
57
|
-
|
61
|
+
select { |i| i.member_of?(*groups) }
|
58
62
|
end
|
59
63
|
|
60
64
|
# Returns a new array of items that are not a member of any of the given groups
|
65
|
+
# @param groups [String, GroupItem]
|
61
66
|
# @return [Array<Item>]
|
62
67
|
def not_member_of(*groups)
|
63
|
-
|
68
|
+
reject { |i| i.member_of?(*groups) }
|
64
69
|
end
|
65
70
|
|
66
|
-
# Returns the group members
|
71
|
+
# Returns the group members of all group elements
|
67
72
|
# @return [Array<Item>]
|
68
73
|
def members
|
69
|
-
grep(OpenHAB::Core::Items::GroupItem).flat_map(&:members)
|
74
|
+
grep(OpenHAB::Core::Items::GroupItem).flat_map(&:members).uniq
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns all non-group members of all group elements, recursively
|
78
|
+
# @return [Array<Item>]
|
79
|
+
def all_members
|
80
|
+
grep(OpenHAB::Core::Items::GroupItem).flat_map(&:all_members).uniq
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns the groups of all elements
|
84
|
+
# @return [Array<GroupItem>]
|
85
|
+
def groups
|
86
|
+
flat_map(&:groups).uniq
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns all groups all elements are a part of, recursively
|
90
|
+
# @return [Array<GroupItem>]
|
91
|
+
def all_groups
|
92
|
+
flat_map(&:all_groups).uniq
|
70
93
|
end
|
71
94
|
|
72
95
|
# @!group Items State and Command Methods
|
data/lib/openhab/core/items.rb
CHANGED
@@ -46,9 +46,9 @@ module OpenHAB
|
|
46
46
|
|
47
47
|
logger.trace("Defining #{klass}##{state_predicate} for #{state}")
|
48
48
|
klass.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
49
|
-
def #{state_predicate}
|
50
|
-
raw_state
|
51
|
-
end
|
49
|
+
def #{state_predicate} # def on?
|
50
|
+
raw_state.as(#{state.class.java_class.simple_name}).equal?(#{state}) # raw_state.as(OnOffType) == ON
|
51
|
+
end # end
|
52
52
|
RUBY
|
53
53
|
end
|
54
54
|
end
|
@@ -74,18 +74,11 @@ module OpenHAB
|
|
74
74
|
end # end
|
75
75
|
RUBY
|
76
76
|
|
77
|
-
# Override the inherited methods from Enumerable and send it to the base_item
|
78
|
-
GroupItem.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
79
|
-
def #{command} # def on
|
80
|
-
method_missing(:#{command}) # method_missing(:on)
|
81
|
-
end # end
|
82
|
-
RUBY
|
83
|
-
|
84
77
|
logger.trace("Defining ItemCommandEvent##{command}? for #{value}")
|
85
78
|
Events::ItemCommandEvent.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
86
|
-
def #{command}?
|
87
|
-
command
|
88
|
-
end
|
79
|
+
def #{command}? # def refresh?
|
80
|
+
command.as(#{value.class.java_class.simple_name}).equal?(#{value}) # command.as(RefreshType).equal?(REFRESH)
|
81
|
+
end # end
|
89
82
|
RUBY
|
90
83
|
end
|
91
84
|
end
|
@@ -219,11 +219,11 @@ module OpenHAB
|
|
219
219
|
|
220
220
|
private
|
221
221
|
|
222
|
-
def initialize(
|
222
|
+
def initialize(unload_priority: nil)
|
223
223
|
super()
|
224
224
|
@elements = java.util.concurrent.ConcurrentHashMap.new
|
225
225
|
self.class.registry.add_provider(self)
|
226
|
-
ScriptHandling.script_unloaded(
|
226
|
+
ScriptHandling.script_unloaded(priority: unload_priority) { unregister }
|
227
227
|
end
|
228
228
|
end
|
229
229
|
end
|
@@ -19,21 +19,6 @@ module OpenHAB
|
|
19
19
|
$rules
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
23
|
-
def initialize
|
24
|
-
super(script_unloaded_before: lambda do |callbacks|
|
25
|
-
callbacks.index do |cb|
|
26
|
-
case cb.binding.receiver
|
27
|
-
when Items::Provider,
|
28
|
-
Things::Provider,
|
29
|
-
DSL::TimerManager
|
30
|
-
true
|
31
|
-
else
|
32
|
-
false
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end)
|
36
|
-
end
|
37
22
|
end
|
38
23
|
end
|
39
24
|
end
|
@@ -32,8 +32,6 @@ module OpenHAB
|
|
32
32
|
ScriptHandlingCallbacks.script_loaded_hooks << block
|
33
33
|
end
|
34
34
|
|
35
|
-
#
|
36
|
-
# @!method script_unloaded(&block)
|
37
35
|
#
|
38
36
|
# Add a block of code to be executed when the script is unloaded.
|
39
37
|
#
|
@@ -42,6 +40,10 @@ module OpenHAB
|
|
42
40
|
# Multiple hooks can be added by calling {#script_unloaded} multiple times.
|
43
41
|
# They can be used to perform final cleanup.
|
44
42
|
#
|
43
|
+
# @param [Integer, nil] priority The order at which the the given hook will be executed.
|
44
|
+
# The higher the number, the lower the priority. Higher priority hooks will be executed
|
45
|
+
# first, before the lower priority hooks. When nil, the default priority of zero will
|
46
|
+
# be used.
|
45
47
|
# @return [void]
|
46
48
|
#
|
47
49
|
# @example
|
@@ -49,10 +51,8 @@ module OpenHAB
|
|
49
51
|
# logger.info 'Hi, this script has been unloaded'
|
50
52
|
# end
|
51
53
|
#
|
52
|
-
def script_unloaded(
|
53
|
-
|
54
|
-
index = before.call(ScriptHandlingCallbacks.script_unloaded_hooks) if before
|
55
|
-
ScriptHandlingCallbacks.script_unloaded_hooks.insert(index || -1, block)
|
54
|
+
def script_unloaded(priority: nil, &block)
|
55
|
+
ScriptHandlingCallbacks.script_unloaded_hooks[priority || 0] << block
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -82,7 +82,7 @@ module OpenHAB
|
|
82
82
|
#
|
83
83
|
# @!visibility private
|
84
84
|
def script_unloaded_hooks
|
85
|
-
@script_unloaded_hooks ||= []
|
85
|
+
@script_unloaded_hooks ||= Hash.new { |hash, key| hash[key] = [] }
|
86
86
|
end
|
87
87
|
end
|
88
88
|
self.script_loaded = false
|
@@ -92,7 +92,7 @@ module OpenHAB
|
|
92
92
|
#
|
93
93
|
def scriptUnloaded # rubocop:disable Naming/MethodName method name dictated by openHAB
|
94
94
|
logger.trace("Script unloaded")
|
95
|
-
ScriptHandlingCallbacks.script_unloaded_hooks.each do |hook|
|
95
|
+
ScriptHandlingCallbacks.script_unloaded_hooks.sort_by(&:first).flat_map(&:last).each do |hook|
|
96
96
|
hook.call
|
97
97
|
rescue => e
|
98
98
|
logger.error("Failed to call script_unloaded hook #{hook}: #{e}")
|
@@ -110,20 +110,15 @@ module OpenHAB
|
|
110
110
|
#
|
111
111
|
# Coerce object to a {DecimalType DecimalType}
|
112
112
|
#
|
113
|
-
# @param [Numeric
|
114
|
-
#
|
115
|
-
# If `other` is a {Type}, `self` will instead be coerced
|
116
|
-
# to that type to accomodate comparison with things such as {OnOffType}.
|
113
|
+
# @param [Numeric] other object to coerce to a {DecimalType DecimalType}
|
117
114
|
#
|
118
115
|
# @return [Array<(DecimalType, DecimalType)>, nil]
|
119
116
|
#
|
120
117
|
def coerce(other)
|
121
118
|
logger.trace("Coercing #{self} as a request from #{other.class}")
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
[self.class.new(other.to_d), self]
|
126
|
-
end
|
119
|
+
return unless other.respond_to?(:to_d)
|
120
|
+
|
121
|
+
[self.class.new(other.to_d), self]
|
127
122
|
end
|
128
123
|
|
129
124
|
#
|
@@ -142,7 +142,7 @@ module OpenHAB
|
|
142
142
|
end
|
143
143
|
|
144
144
|
# Convert to an HTML-style string of 6 hex characters in the default sRGB color model.
|
145
|
-
# @return [String]
|
145
|
+
# @return [String] `"#xxxxxx"`
|
146
146
|
def to_hex
|
147
147
|
Kernel.format("#%06x", rgb)
|
148
148
|
end
|
@@ -174,7 +174,7 @@ module OpenHAB
|
|
174
174
|
|
175
175
|
# @!method to_xy
|
176
176
|
# Convert to the xyY values representing this object's color in CIE XY color model
|
177
|
-
# @return [[PercentType, PercentType]]
|
177
|
+
# @return [[PercentType, PercentType, PercentType]]
|
178
178
|
end
|
179
179
|
end
|
180
180
|
end
|
@@ -157,19 +157,14 @@ module OpenHAB
|
|
157
157
|
#
|
158
158
|
# Coerce object to a {QuantityType}
|
159
159
|
#
|
160
|
-
# @param [Numeric
|
161
|
-
#
|
162
|
-
# if `other` is a {Type}, `self` will instead be coerced
|
163
|
-
# to that type to accomodate comparison with things such as {OnOffType}
|
160
|
+
# @param [Numeric] other object to coerce to a {QuantityType}
|
164
161
|
#
|
165
162
|
# @return [Array<(QuantityType, QuantityType)>, nil]
|
166
163
|
def coerce(other)
|
167
164
|
logger.trace("Coercing #{self} as a request from #{other.class}")
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
[QuantityType.new(other.to_d.to_java, Units::ONE), self]
|
172
|
-
end
|
165
|
+
return unless other.respond_to?(:to_d)
|
166
|
+
|
167
|
+
[QuantityType.new(other.to_d.to_java, Units::ONE), self]
|
173
168
|
end
|
174
169
|
|
175
170
|
# arithmetic operators
|
@@ -63,7 +63,7 @@ module OpenHAB
|
|
63
63
|
#
|
64
64
|
def coerce(other)
|
65
65
|
logger.trace("Coercing #{self} as a request from #{other.class}")
|
66
|
-
return [
|
66
|
+
return [other.to_str, self] if other.respond_to?(:to_str)
|
67
67
|
end
|
68
68
|
|
69
69
|
# any method that exists on String gets forwarded to to_s
|
@@ -25,21 +25,6 @@ module OpenHAB
|
|
25
25
|
to_s
|
26
26
|
end
|
27
27
|
|
28
|
-
#
|
29
|
-
# Type Coercion
|
30
|
-
#
|
31
|
-
# Coerce object to the same Type
|
32
|
-
#
|
33
|
-
# @param [Type] other object to coerce to the same
|
34
|
-
# Type as this one
|
35
|
-
#
|
36
|
-
# @return [[Type, Type], nil]
|
37
|
-
#
|
38
|
-
def coerce(other)
|
39
|
-
logger.trace("Coercing #{self} (#{self.class}) as a request from #{other.class}")
|
40
|
-
return [other.as(self.class), self] if other.is_a?(Type) && other.respond_to?(:as)
|
41
|
-
end
|
42
|
-
|
43
28
|
#
|
44
29
|
# Check equality without type conversion
|
45
30
|
#
|
@@ -51,19 +36,6 @@ module OpenHAB
|
|
51
36
|
equals(other)
|
52
37
|
end
|
53
38
|
|
54
|
-
#
|
55
|
-
# Case equality
|
56
|
-
#
|
57
|
-
# @return [true,false] if the values are of the same Type
|
58
|
-
# or item state of the same type
|
59
|
-
#
|
60
|
-
def ===(other)
|
61
|
-
logger.trace { "Type (#{self.class}) #{self} === #{other} (#{other.class})" }
|
62
|
-
return false unless instance_of?(other.class)
|
63
|
-
|
64
|
-
eql?(other)
|
65
|
-
end
|
66
|
-
|
67
39
|
#
|
68
40
|
# Check equality, including type conversion
|
69
41
|
#
|
@@ -95,6 +67,14 @@ module OpenHAB
|
|
95
67
|
|
96
68
|
super
|
97
69
|
end
|
70
|
+
|
71
|
+
# @!visibility private
|
72
|
+
#
|
73
|
+
# some openHAB Types don't implement as; do it for them
|
74
|
+
#
|
75
|
+
def as(klass)
|
76
|
+
self if klass == self.class
|
77
|
+
end
|
98
78
|
end
|
99
79
|
|
100
80
|
#
|
data/lib/openhab/core/types.rb
CHANGED
@@ -57,11 +57,24 @@ module OpenHAB
|
|
57
57
|
([command] | states).each do |method|
|
58
58
|
logger.trace("Defining #{klass}##{method} for #{value}")
|
59
59
|
klass.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
60
|
-
def #{method}
|
61
|
-
|
62
|
-
end
|
60
|
+
def #{method} # def on?
|
61
|
+
as(#{value.class.java_class.simple_name}).equal?(#{value}) # as(OnOffType).equal?(ON)
|
62
|
+
end # end
|
63
63
|
RUBY
|
64
64
|
end
|
65
|
+
|
66
|
+
method = states.last
|
67
|
+
Events::ItemState.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
68
|
+
def #{method} # def on?
|
69
|
+
item_state.as(#{value.class.java_class.simple_name}).equal?(#{value}) # item_state.as(OnOffType).equal?(ON)
|
70
|
+
end # end
|
71
|
+
RUBY
|
72
|
+
|
73
|
+
Events::ItemStateChangedEvent.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
74
|
+
def was_#{method} # def was_on?
|
75
|
+
old_item_state.as(#{value.class.java_class.simple_name}).equal?(#{value}) # old_item_state.as(OnOffType).equal?(ON)
|
76
|
+
end # end
|
77
|
+
RUBY
|
65
78
|
end
|
66
79
|
end
|
67
80
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Extensions to
|
4
|
-
class
|
3
|
+
# Extensions to Module
|
4
|
+
class Module
|
5
5
|
#
|
6
|
-
# Returns the name of the class, without any containing module or package.
|
6
|
+
# Returns the name of the class or module, without any containing module or package.
|
7
7
|
#
|
8
8
|
# @return [String, nil]
|
9
9
|
#
|
@@ -38,23 +38,25 @@ module OpenHAB
|
|
38
38
|
# def command(state)
|
39
39
|
# return super(state) unless Thread.current[:openhab_ensure_states]
|
40
40
|
#
|
41
|
+
# formatted_state = format_command(state)
|
41
42
|
# logger.trace do
|
42
|
-
# "#{name} ensure #{state}, format_command: #{
|
43
|
+
# "#{name} ensure #{state}, format_command: #{formatted_state}, current state: #{raw_state}"
|
43
44
|
# end
|
44
|
-
# return if
|
45
|
+
# return if raw_state == formatted_state
|
45
46
|
#
|
46
|
-
# super(
|
47
|
+
# super(formatted_state)
|
47
48
|
# end
|
48
49
|
class_eval <<~RUBY, __FILE__, __LINE__ + 1 # rubocop:disable Style/DocumentDynamicEvalDefinition
|
49
50
|
def #{ensured_method}(state)
|
50
51
|
return super(state) unless Thread.current[:openhab_ensure_states]
|
51
52
|
|
53
|
+
formatted_state = format_#{ensured_method}(state)
|
52
54
|
logger.trace do
|
53
|
-
"\#{name} ensure \#{state}, format_#{ensured_method}: \#{
|
55
|
+
"\#{name} ensure \#{state}, format_#{ensured_method}: \#{formatted_state}, current state: \#{raw_state}"
|
54
56
|
end
|
55
|
-
return if
|
57
|
+
return if raw_state.as(formatted_state.class) == formatted_state
|
56
58
|
|
57
|
-
super(
|
59
|
+
super(formatted_state)
|
58
60
|
end
|
59
61
|
RUBY
|
60
62
|
end
|
@@ -20,27 +20,29 @@ module OpenHAB
|
|
20
20
|
class << self
|
21
21
|
# @!visibility private
|
22
22
|
# @!macro def_terse_rule
|
23
|
-
# @!method $1(*args, name :nil, id: nil, **kwargs, &block)
|
23
|
+
# @!method $1(*args, name :nil, id: nil, on_load: false, **kwargs, &block)
|
24
24
|
# Create a new rule with a $1 trigger.
|
25
25
|
# @param name [String] The name for the rule.
|
26
26
|
# @param id [String] The ID for the rule.
|
27
|
+
# @param on_load [true, false] If the rule should _also_ trigger immediately when the script loads.
|
27
28
|
# @yield The execution block for the rule.
|
28
29
|
# @return [void]
|
29
30
|
# @see BuilderDSL#$1
|
30
31
|
def def_terse_rule(trigger)
|
31
32
|
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
32
|
-
def #{trigger}(*args, name: nil, id: nil, **kwargs, &block) # def changed(*args, name: nil, id: nil, **kwargs, &block)
|
33
|
-
raise ArgumentError, "Block is required" unless block
|
34
|
-
|
35
|
-
id ||= NameInference.infer_rule_id_from_block(block)
|
36
|
-
script = block.source rescue nil
|
37
|
-
caller_binding = block.binding
|
38
|
-
rule name, id: id, script: script, binding: caller_binding do
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
33
|
+
def #{trigger}(*args, name: nil, id: nil, on_load: false, **kwargs, &block) # def changed(*args, name: nil, id: nil, on_load: false, **kwargs, &block)
|
34
|
+
raise ArgumentError, "Block is required" unless block # raise ArgumentError, "Block is required" unless block
|
35
|
+
#
|
36
|
+
id ||= NameInference.infer_rule_id_from_block(block) # id ||= NameInference.infer_rule_id_from_block(block)
|
37
|
+
script = block.source rescue nil # script = block.source rescue nil
|
38
|
+
caller_binding = block.binding # caller_binding = block.binding
|
39
|
+
rule name, id: id, script: script, binding: caller_binding do # rule name, id: id, script: script, binding: caller_binding do
|
40
|
+
self.on_load if on_load # self.on_load if on_load
|
41
|
+
#{trigger}(*args, **kwargs) # changed(*args, **kwargs)
|
42
|
+
run(&block) # run(&block)
|
43
|
+
end # end
|
44
|
+
end # end
|
45
|
+
module_function #{trigger.inspect} # module_function :changed
|
44
46
|
RUBY
|
45
47
|
end
|
46
48
|
end
|
data/lib/openhab/dsl/version.rb
CHANGED
data/lib/openhab/dsl.rb
CHANGED
@@ -30,6 +30,12 @@ module OpenHAB
|
|
30
30
|
# include this before Core::Actions so that Core::Action's method_missing
|
31
31
|
# takes priority
|
32
32
|
include Core::EntityLookup
|
33
|
+
#
|
34
|
+
# @!parse
|
35
|
+
# include Core::Actions
|
36
|
+
# include Core::ScriptHandling
|
37
|
+
# include Rules::Terse
|
38
|
+
#
|
33
39
|
[Core::Actions, Core::ScriptHandling, Rules::Terse].each do |mod|
|
34
40
|
# make these available both as regular and class methods
|
35
41
|
include mod
|
@@ -473,6 +479,11 @@ module OpenHAB
|
|
473
479
|
debounce(for: duration, id: id, &block)
|
474
480
|
end
|
475
481
|
|
482
|
+
# (see Core::Actions::Transformation.transform)
|
483
|
+
def transform(type, function, value)
|
484
|
+
Transformation.transform(type, function, value)
|
485
|
+
end
|
486
|
+
|
476
487
|
#
|
477
488
|
# Limit how often the given block executes to the specified interval.
|
478
489
|
#
|
data/lib/openhab/osgi.rb
CHANGED
@@ -52,10 +52,8 @@ module OpenHAB
|
|
52
52
|
)
|
53
53
|
end
|
54
54
|
|
55
|
-
private
|
56
|
-
|
57
55
|
# @!attribute [r] bundle_context
|
58
|
-
# @return [org.osgi.framework.BundleContext] OSGi bundle context
|
56
|
+
# @return [org.osgi.framework.BundleContext] OSGi bundle context for ScriptExtension Class
|
59
57
|
def bundle_context
|
60
58
|
@bundle_context ||= bundle.bundle_context
|
61
59
|
end
|
@@ -12,9 +12,6 @@ module OpenHAB
|
|
12
12
|
# @example Corresponds to `transform/compass.script`
|
13
13
|
# OpenHAB::Transform.compass("30", param: "7")
|
14
14
|
#
|
15
|
-
# @example Corresponds to `transform/ruby/compass.script`
|
16
|
-
# OpenHAB::Transform::Ruby.compass("59 °")
|
17
|
-
|
18
15
|
module Transform
|
19
16
|
class << self
|
20
17
|
# @!visibility private
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openhab-jrubyscripting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.0.
|
4
|
+
version: 5.0.0.rc.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1.2'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: gem-release
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.2'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.2'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: guard-rubocop
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -453,9 +467,9 @@ files:
|
|
453
467
|
- lib/openhab/core_ext/java/unit.rb
|
454
468
|
- lib/openhab/core_ext/java/zoned_date_time.rb
|
455
469
|
- lib/openhab/core_ext/ruby/array.rb
|
456
|
-
- lib/openhab/core_ext/ruby/class.rb
|
457
470
|
- lib/openhab/core_ext/ruby/date.rb
|
458
471
|
- lib/openhab/core_ext/ruby/date_time.rb
|
472
|
+
- lib/openhab/core_ext/ruby/module.rb
|
459
473
|
- lib/openhab/core_ext/ruby/numeric.rb
|
460
474
|
- lib/openhab/core_ext/ruby/range.rb
|
461
475
|
- lib/openhab/core_ext/ruby/symbol.rb
|
@@ -537,14 +551,14 @@ files:
|
|
537
551
|
- lib/openhab/yard/tags/constant_directive.rb
|
538
552
|
- lib/openhab/yard/tags/group_directive.rb
|
539
553
|
- lib/openhab/yard/tags/library.rb
|
540
|
-
homepage: https://
|
554
|
+
homepage: https://openhab.github.io/openhab-jruby/
|
541
555
|
licenses:
|
542
556
|
- EPL-2.0
|
543
557
|
metadata:
|
544
|
-
homepage_uri: https://
|
545
|
-
source_code_uri: https://github.com/
|
546
|
-
documentation_uri: https://
|
547
|
-
changelog_uri: https://
|
558
|
+
homepage_uri: https://openhab.github.io/openhab-jruby/
|
559
|
+
source_code_uri: https://github.com/openhab/openhab-jruby
|
560
|
+
documentation_uri: https://openhab.github.io/openhab-jruby/
|
561
|
+
changelog_uri: https://openhab.github.io/openhab-jruby/file.CHANGELOG.html
|
548
562
|
rubygems_mfa_required: 'true'
|
549
563
|
post_install_message:
|
550
564
|
rdoc_options: []
|
@@ -561,7 +575,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
561
575
|
- !ruby/object:Gem::Version
|
562
576
|
version: 1.3.1
|
563
577
|
requirements: []
|
564
|
-
rubygems_version: 3.3.
|
578
|
+
rubygems_version: 3.3.26
|
565
579
|
signing_key:
|
566
580
|
specification_version: 4
|
567
581
|
summary: JRuby Helper Libraries for openHAB Scripting
|