openhab-scripting 2.16.2 → 2.16.3

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.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openhab.rb +12 -16
  3. data/lib/openhab/core/entity_lookup.rb +162 -0
  4. data/lib/openhab/core/openhab_setup.rb +31 -0
  5. data/lib/openhab/core/osgi.rb +61 -0
  6. data/lib/openhab/dsl/actions.rb +105 -0
  7. data/lib/openhab/dsl/dsl.rb +47 -0
  8. data/lib/openhab/{core/dsl → dsl}/gems.rb +0 -1
  9. data/lib/openhab/dsl/group.rb +100 -0
  10. data/lib/openhab/dsl/items/items.rb +46 -0
  11. data/lib/openhab/dsl/items/number_item.rb +352 -0
  12. data/lib/openhab/dsl/items/string_item.rb +120 -0
  13. data/lib/openhab/dsl/monkey_patch/actions/actions.rb +4 -0
  14. data/lib/openhab/dsl/monkey_patch/actions/script_thing_actions.rb +32 -0
  15. data/lib/openhab/dsl/monkey_patch/events/events.rb +5 -0
  16. data/lib/openhab/dsl/monkey_patch/events/item_command.rb +23 -0
  17. data/lib/openhab/dsl/monkey_patch/events/item_state_changed.rb +35 -0
  18. data/lib/openhab/dsl/monkey_patch/events/thing_status_info.rb +33 -0
  19. data/lib/openhab/dsl/monkey_patch/items/contact_item.rb +61 -0
  20. data/lib/openhab/dsl/monkey_patch/items/dimmer_item.rb +193 -0
  21. data/lib/openhab/dsl/monkey_patch/items/group_item.rb +37 -0
  22. data/lib/openhab/dsl/monkey_patch/items/items.rb +133 -0
  23. data/lib/openhab/dsl/monkey_patch/items/metadata.rb +281 -0
  24. data/lib/openhab/dsl/monkey_patch/items/persistence.rb +70 -0
  25. data/lib/openhab/dsl/monkey_patch/items/switch_item.rb +95 -0
  26. data/lib/openhab/dsl/monkey_patch/ruby/number.rb +39 -0
  27. data/lib/openhab/dsl/monkey_patch/ruby/range.rb +47 -0
  28. data/lib/openhab/dsl/monkey_patch/ruby/ruby.rb +7 -0
  29. data/lib/openhab/dsl/monkey_patch/ruby/string.rb +41 -0
  30. data/lib/openhab/dsl/monkey_patch/types/decimal_type.rb +70 -0
  31. data/lib/openhab/dsl/monkey_patch/types/on_off_type.rb +51 -0
  32. data/lib/openhab/dsl/monkey_patch/types/open_closed_type.rb +36 -0
  33. data/lib/openhab/dsl/monkey_patch/types/percent_type.rb +32 -0
  34. data/lib/openhab/dsl/monkey_patch/types/quantity_type.rb +69 -0
  35. data/lib/openhab/dsl/monkey_patch/types/types.rb +8 -0
  36. data/lib/openhab/dsl/persistence.rb +25 -0
  37. data/lib/openhab/dsl/rules/automation_rule.rb +342 -0
  38. data/lib/openhab/dsl/rules/guard.rb +134 -0
  39. data/lib/openhab/dsl/rules/property.rb +102 -0
  40. data/lib/openhab/dsl/rules/rule.rb +116 -0
  41. data/lib/openhab/dsl/rules/rule_config.rb +151 -0
  42. data/lib/openhab/dsl/rules/triggers/changed.rb +143 -0
  43. data/lib/openhab/dsl/rules/triggers/channel.rb +53 -0
  44. data/lib/openhab/dsl/rules/triggers/command.rb +104 -0
  45. data/lib/openhab/dsl/rules/triggers/cron.rb +177 -0
  46. data/lib/openhab/dsl/rules/triggers/trigger.rb +124 -0
  47. data/lib/openhab/dsl/rules/triggers/updated.rb +98 -0
  48. data/lib/openhab/dsl/states.rb +61 -0
  49. data/lib/openhab/dsl/things.rb +91 -0
  50. data/lib/openhab/dsl/time_of_day.rb +228 -0
  51. data/lib/openhab/dsl/timers.rb +77 -0
  52. data/lib/openhab/dsl/types/quantity.rb +290 -0
  53. data/lib/openhab/dsl/units.rb +39 -0
  54. data/lib/openhab/log/configuration.rb +21 -0
  55. data/lib/openhab/log/logger.rb +172 -0
  56. data/lib/openhab/version.rb +1 -1
  57. metadata +55 -58
  58. data/lib/openhab/configuration.rb +0 -16
  59. data/lib/openhab/core/cron.rb +0 -27
  60. data/lib/openhab/core/debug.rb +0 -34
  61. data/lib/openhab/core/dsl.rb +0 -51
  62. data/lib/openhab/core/dsl/actions.rb +0 -107
  63. data/lib/openhab/core/dsl/entities.rb +0 -147
  64. data/lib/openhab/core/dsl/group.rb +0 -102
  65. data/lib/openhab/core/dsl/items/items.rb +0 -51
  66. data/lib/openhab/core/dsl/items/number_item.rb +0 -323
  67. data/lib/openhab/core/dsl/items/string_item.rb +0 -122
  68. data/lib/openhab/core/dsl/monkey_patch/actions/actions.rb +0 -4
  69. data/lib/openhab/core/dsl/monkey_patch/actions/script_thing_actions.rb +0 -22
  70. data/lib/openhab/core/dsl/monkey_patch/events.rb +0 -5
  71. data/lib/openhab/core/dsl/monkey_patch/events/item_command.rb +0 -13
  72. data/lib/openhab/core/dsl/monkey_patch/events/item_state_changed.rb +0 -25
  73. data/lib/openhab/core/dsl/monkey_patch/events/thing_status_info.rb +0 -26
  74. data/lib/openhab/core/dsl/monkey_patch/items/contact_item.rb +0 -54
  75. data/lib/openhab/core/dsl/monkey_patch/items/dimmer_item.rb +0 -182
  76. data/lib/openhab/core/dsl/monkey_patch/items/group_item.rb +0 -27
  77. data/lib/openhab/core/dsl/monkey_patch/items/items.rb +0 -132
  78. data/lib/openhab/core/dsl/monkey_patch/items/metadata.rb +0 -283
  79. data/lib/openhab/core/dsl/monkey_patch/items/persistence.rb +0 -72
  80. data/lib/openhab/core/dsl/monkey_patch/items/switch_item.rb +0 -87
  81. data/lib/openhab/core/dsl/monkey_patch/ruby/number.rb +0 -41
  82. data/lib/openhab/core/dsl/monkey_patch/ruby/range.rb +0 -47
  83. data/lib/openhab/core/dsl/monkey_patch/ruby/ruby.rb +0 -7
  84. data/lib/openhab/core/dsl/monkey_patch/ruby/string.rb +0 -43
  85. data/lib/openhab/core/dsl/monkey_patch/types/decimal_type.rb +0 -60
  86. data/lib/openhab/core/dsl/monkey_patch/types/on_off_type.rb +0 -41
  87. data/lib/openhab/core/dsl/monkey_patch/types/open_closed_type.rb +0 -25
  88. data/lib/openhab/core/dsl/monkey_patch/types/percent_type.rb +0 -23
  89. data/lib/openhab/core/dsl/monkey_patch/types/quantity_type.rb +0 -58
  90. data/lib/openhab/core/dsl/monkey_patch/types/types.rb +0 -8
  91. data/lib/openhab/core/dsl/persistence.rb +0 -27
  92. data/lib/openhab/core/dsl/property.rb +0 -96
  93. data/lib/openhab/core/dsl/rule/automation_rule.rb +0 -345
  94. data/lib/openhab/core/dsl/rule/guard.rb +0 -136
  95. data/lib/openhab/core/dsl/rule/rule.rb +0 -117
  96. data/lib/openhab/core/dsl/rule/rule_config.rb +0 -153
  97. data/lib/openhab/core/dsl/rule/triggers/changed.rb +0 -145
  98. data/lib/openhab/core/dsl/rule/triggers/channel.rb +0 -55
  99. data/lib/openhab/core/dsl/rule/triggers/command.rb +0 -106
  100. data/lib/openhab/core/dsl/rule/triggers/cron.rb +0 -160
  101. data/lib/openhab/core/dsl/rule/triggers/trigger.rb +0 -126
  102. data/lib/openhab/core/dsl/rule/triggers/updated.rb +0 -100
  103. data/lib/openhab/core/dsl/states.rb +0 -63
  104. data/lib/openhab/core/dsl/things.rb +0 -93
  105. data/lib/openhab/core/dsl/time_of_day.rb +0 -231
  106. data/lib/openhab/core/dsl/timers.rb +0 -79
  107. data/lib/openhab/core/dsl/types/quantity.rb +0 -292
  108. data/lib/openhab/core/dsl/units.rb +0 -41
  109. data/lib/openhab/core/log.rb +0 -170
  110. data/lib/openhab/core/patch_load_path.rb +0 -7
  111. data/lib/openhab/core/startup_delay.rb +0 -23
  112. data/lib/openhab/osgi.rb +0 -59
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bigdecimal'
4
+ require 'forwardable'
5
+ require 'java'
6
+
7
+ module OpenHAB
8
+ module DSL
9
+ module Items
10
+ #
11
+ # Delegator to OpenHAB String Item
12
+ #
13
+ class StringItem
14
+ extend Forwardable
15
+ include Comparable
16
+
17
+ # @return [Regex] Regular expression matching blank strings
18
+ BLANK_RE = /\A[[:space:]]*\z/.freeze
19
+ private_constant :BLANK_RE
20
+
21
+ def_delegator :@string_item, :to_s
22
+
23
+ #
24
+ # Create a new StringItem
25
+ #
26
+ # @param [Java::Org::openhab::core::library::items::StringItem] string_item OpenHAB string item to delegate to
27
+ #
28
+ def initialize(string_item)
29
+ @string_item = string_item
30
+ super()
31
+ end
32
+
33
+ #
34
+ # Convert the StringItem into a String
35
+ #
36
+ # @return [String] String representation of the StringItem or
37
+ # nil if underlying OpenHAB StringItem does not have a state
38
+ #
39
+ def to_str
40
+ @string_item.state&.to_full_string&.to_s
41
+ end
42
+
43
+ #
44
+ # Detect if the string is blank (not set or only whitespace)
45
+ #
46
+ # @return [Boolean] True if string item is not set or contains only whitespace, false otherwise
47
+ #
48
+ def blank?
49
+ return true unless @string_item.state?
50
+
51
+ @string_item.state.to_full_string.to_s.empty? || BLANK_RE.match?(self)
52
+ end
53
+
54
+ #
55
+ # Check if StringItem is truthy? as per defined by library
56
+ #
57
+ # @return [Boolean] True if item is not in state UNDEF or NULL and value is not blank
58
+ #
59
+ def truthy?
60
+ @string_item.state? && blank? == false
61
+ end
62
+
63
+ #
64
+ # Compare StringItem to supplied object
65
+ #
66
+ # @param [Object] other object to compare to
67
+ #
68
+ # @return [Integer] -1,0,1 or nil depending on value supplied,
69
+ # nil comparison to supplied object is not possible.
70
+ #
71
+ def <=>(other)
72
+ case other
73
+ when StringItem
74
+ @string_item.state <=> other.state
75
+ when String
76
+ @string_item.state.to_s <=> other
77
+ else
78
+ @string_item.state <=> other
79
+ end
80
+ end
81
+
82
+ #
83
+ # Forward missing methods to Openhab String Item or String representation of the item if they are defined
84
+ #
85
+ # @param [String] meth method name
86
+ # @param [Array] args arguments for method
87
+ # @param [Proc] block <description>
88
+ #
89
+ # @return [Object] Value from delegated method in OpenHAB StringItem or Ruby String
90
+ #
91
+ def method_missing(meth, *args, &block)
92
+ if @string_item.respond_to?(meth)
93
+ @string_item.__send__(meth, *args, &block)
94
+ elsif @string_item.state&.to_full_string&.to_s.respond_to?(meth)
95
+ @string_item.state.to_full_string.to_s.__send__(meth, *args, &block)
96
+ elsif ::Kernel.method_defined?(meth) || ::Kernel.private_method_defined?(meth)
97
+ ::Kernel.instance_method(meth).bind_call(self, *args, &block)
98
+ else
99
+ super(meth, *args, &block)
100
+ end
101
+ end
102
+
103
+ #
104
+ # Checks if this method responds to the missing method
105
+ #
106
+ # @param [String] method_name Name of the method to check
107
+ # @param [Boolean] _include_private boolean if private methods should be checked
108
+ #
109
+ # @return [Boolean] true if this object will respond to the supplied method, false otherwise
110
+ #
111
+ def respond_to_missing?(method_name, _include_private = false)
112
+ @string_item.respond_to?(method_name) ||
113
+ @string_item.state&.to_full_string&.to_s.respond_to?(method_name) ||
114
+ ::Kernel.method_defined?(method_name) ||
115
+ ::Kernel.private_method_defined?(method_name)
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Monkey patch actions
4
+ require 'openhab/dsl/monkey_patch/actions/script_thing_actions'
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'java'
4
+
5
+ module OpenHAB
6
+ module DSL
7
+ module MonkeyPatch
8
+ #
9
+ # Patches OpenHAB actions
10
+ #
11
+ module Actions
12
+ java_import Java::OrgOpenhabCoreAutomationModuleScriptInternalDefaultscope::ScriptThingActions
13
+
14
+ #
15
+ # MonkeyPatching ScriptThingActions
16
+ #
17
+ class ScriptThingActions
18
+ field_reader :THING_ACTIONS_MAP
19
+
20
+ #
21
+ # Fetch keys for all actions defined in OpenHAB
22
+ #
23
+ # @return [Set] of keys for defined actions in the form of 'scope-thing_uid'
24
+ #
25
+ def action_keys
26
+ ScriptThingActions.THING_ACTIONS_MAP.keys
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openhab/dsl/monkey_patch/events/item_state_changed'
4
+ require 'openhab/dsl/monkey_patch/events/thing_status_info'
5
+ require 'openhab/dsl/monkey_patch/events/item_command'
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'java'
4
+
5
+ module OpenHAB
6
+ module DSL
7
+ module MonkeyPatch
8
+ #
9
+ # Patches OpenHAB events
10
+ #
11
+ module Events
12
+ java_import Java::OrgOpenhabCoreItemsEvents::ItemCommandEvent
13
+
14
+ #
15
+ # Monkey patch with ruby style accesors
16
+ #
17
+ class ItemCommandEvent
18
+ alias command item_command
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'java'
4
+
5
+ module OpenHAB
6
+ module DSL
7
+ module MonkeyPatch
8
+ #
9
+ # Patches OpenHAB events
10
+ #
11
+ module Events
12
+ java_import Java::OrgOpenhabCoreItemsEvents::ItemStateChangedEvent
13
+
14
+ #
15
+ # MonkeyPatch with ruby style accessors
16
+ #
17
+ class ItemStateChangedEvent
18
+ #
19
+ # Get the item that caused the state change
20
+ #
21
+ # @return [Item] Item that caused state change
22
+ #
23
+ def item
24
+ # rubocop:disable Style/GlobalVars
25
+ $ir.get(item_name)
26
+ # rubocop:enable Style/GlobalVars
27
+ end
28
+
29
+ alias state item_state
30
+ alias last old_item_state
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'java'
4
+
5
+ module OpenHAB
6
+ module DSL
7
+ module MonkeyPatch
8
+ #
9
+ # Patches OpenHAB events
10
+ #
11
+ module Event
12
+ java_import Java::OrgOpenhabCoreThingEvents::ThingStatusInfoChangedEvent
13
+ java_import Java::OrgOpenhabCoreThingEvents::ThingStatusInfoEvent
14
+ #
15
+ # Monkey patch with ruby style accessors
16
+ #
17
+ class ThingStatusInfoChangedEvent
18
+ alias uid get_thing_uid
19
+ alias last get_old_status_info
20
+ alias status status_info
21
+ end
22
+
23
+ #
24
+ # Monkey patch with ruby style accessors
25
+ #
26
+ class ThingStatusInfoEvent
27
+ alias uid get_thing_uid
28
+ alias status status_info
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'java'
4
+
5
+ module OpenHAB
6
+ module DSL
7
+ module MonkeyPatch
8
+ #
9
+ # Patches OpenHAB items
10
+ #
11
+ module Items
12
+ java_import Java::OrgOpenhabCoreLibraryItems::ContactItem
13
+
14
+ #
15
+ # Alias class for ContactItem
16
+ #
17
+ ::Contact = ContactItem
18
+
19
+ #
20
+ # Monkey patch Contact Item with Ruby methods
21
+ #
22
+ class ContactItem
23
+ java_import org.openhab.core.library.types.OpenClosedType
24
+ #
25
+ # Check if the contact is open
26
+ #
27
+ # @return [Boolean] True if contact has state and is open, false otherwise
28
+ #
29
+ def open?
30
+ state? && state == OpenClosedType::OPEN
31
+ end
32
+
33
+ #
34
+ # Check if the contact is closed
35
+ #
36
+ # @return [Boolean] True if contact has state and is closed, false otherwise
37
+ #
38
+ def closed?
39
+ state? && state == OpenClosedType::CLOSED
40
+ end
41
+
42
+ #
43
+ # Compares contacts to OpenClosedTypes
44
+ #
45
+ # @param [Object] other object to compare to
46
+ #
47
+ # @return [Boolean] True if contact has a state and state equals other, nil if no state,
48
+ # result from super if not supplied an OpenClosedType
49
+ #
50
+ def ==(other)
51
+ if other.is_a? OpenClosedType
52
+ state? && state == other
53
+ else
54
+ super
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,193 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'java'
4
+
5
+ module OpenHAB
6
+ module DSL
7
+ module MonkeyPatch
8
+ #
9
+ # Patches OpenHAB items
10
+ #
11
+ module Items
12
+ java_import Java::OrgOpenhabCoreLibraryItems::DimmerItem
13
+ java_import Java::OrgOpenhabCoreItems::GenericItem
14
+
15
+ #
16
+ # Alias class for is_a? testing
17
+ #
18
+ ::Dimmer = DimmerItem
19
+
20
+ #
21
+ # Monkey Patch DimmerItem
22
+ #
23
+ class DimmerItem
24
+ include Comparable
25
+ java_import Java::OrgOpenhabCoreLibraryTypes::DecimalType
26
+ java_import Java::OrgOpenhabCoreLibraryTypes::IncreaseDecreaseType
27
+
28
+ #
29
+ # Add the current dimmer value to the supplied object
30
+ #
31
+ # @param [Object] other object to add the dimmer value to
32
+ #
33
+ # @return [Integer] Current dimmer value plus value of supplied object
34
+ #
35
+ def +(other)
36
+ return unless state?
37
+
38
+ state.to_big_decimal.intValue + other
39
+ end
40
+
41
+ #
42
+ # Subtract the supplied object from the current value of the dimmer
43
+ #
44
+ # @param [Object] other object to subtract from the dimmer value
45
+ #
46
+ # @return [Integer] Current dimmer value minus value of supplied object
47
+ #
48
+ def -(other)
49
+ return unless state?
50
+
51
+ state.to_big_decimal.intValue - other
52
+ end
53
+
54
+ #
55
+ # Dim the dimmer
56
+ #
57
+ # @param [Integer] amount to dim by
58
+ #
59
+ # @return [Integer] level target for dimmer
60
+ #
61
+ def dim(amount = 1)
62
+ return unless state?
63
+
64
+ target = [state.to_big_decimal.intValue - amount, 0].max
65
+
66
+ if amount == 1
67
+ command(IncreaseDecreaseType::DECREASE)
68
+ else
69
+ command(target)
70
+ end
71
+
72
+ target
73
+ end
74
+
75
+ #
76
+ # Brighten the dimmer
77
+ #
78
+ # @param [Integer] amount to brighten by
79
+ #
80
+ # @return [Integer] level target for dimmer
81
+ #
82
+ def brighten(amount = 1)
83
+ return unless state?
84
+
85
+ target = state.to_big_decimal.intValue + amount
86
+
87
+ if amount == 1
88
+ command(IncreaseDecreaseType::INCREASE)
89
+ else
90
+ command(target)
91
+ end
92
+ target
93
+ end
94
+
95
+ #
96
+ # Compare DimmerItem to supplied object
97
+ #
98
+ # @param [Object] other object to compare to
99
+ #
100
+ # @return [Integer] -1,0,1 or nil depending on value supplied,
101
+ # nil comparison to supplied object is not possible.
102
+ #
103
+ def <=>(other)
104
+ logger.trace("Comparing #{self} to #{other}")
105
+ case other
106
+ when GenericItem, NumberItem then state <=> other.state
107
+ when DecimalType then state <=> other
108
+ when Numeric then state.to_big_decimal.to_d <=> other.to_d
109
+ else compare_to(other)
110
+ end
111
+ end
112
+
113
+ #
114
+ # Coerce objects into a DimmerItem
115
+ #
116
+ # @param [Object] other object to coerce to a DimmerItem if possible
117
+ #
118
+ # @return [Object] Numeric when applicable
119
+ #
120
+ def coerce(other)
121
+ logger.trace("Coercing #{self} as a request from #{other.class}")
122
+ case other
123
+ when Numeric
124
+ [other, state.to_big_decimal.to_d]
125
+ else
126
+ [other, state]
127
+ end
128
+ end
129
+
130
+ #
131
+ # Compare DimmerItem to supplied object.
132
+ # The == operator needs to be overridden because the parent java object
133
+ # has .equals which overrides the <=> operator above
134
+ #
135
+ # @param [Object] other object to compare to
136
+ #
137
+ # @return [Integer] true if the two objects contain the same value, false otherwise
138
+ #
139
+ def ==(other)
140
+ (self <=> other).zero?
141
+ end
142
+
143
+ #
144
+ # Check if dimmer has a state and state is not zero
145
+ #
146
+ # @return [Boolean] True if dimmer is not NULL or UNDEF and value is not 0
147
+ #
148
+ def truthy?
149
+ state? && state != DecimalType::ZERO
150
+ end
151
+
152
+ #
153
+ # Value of dimmer
154
+ #
155
+ # @return [Integer] Value of dimmer or nil if state is UNDEF or NULL
156
+ #
157
+ def to_i
158
+ state&.to_big_decimal&.intValue
159
+ end
160
+
161
+ alias to_int to_i
162
+
163
+ #
164
+ # Return the string representation of the dimmer item
165
+ #
166
+ # @return [String] String version of the dimmer value
167
+ #
168
+ def to_s
169
+ to_i.to_s
170
+ end
171
+
172
+ #
173
+ # Check if dimmer is on
174
+ #
175
+ # @return [Boolean] True if item is not UNDEF or NULL and has a value greater than 0
176
+ #
177
+ def on?
178
+ state&.to_big_decimal&.intValue&.positive?
179
+ end
180
+
181
+ #
182
+ # Check if dimmer is off
183
+ #
184
+ # @return [Boolean] True if item is not UNDEF or NULL and has a state of 0
185
+ #
186
+ def off?
187
+ state&.to_big_decimal&.intValue&.zero?
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end