openhab-scripting 5.12.0 → 5.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/openhab/core/{uid.rb → abstract_uid.rb} +1 -1
- data/lib/openhab/core/sitemaps/provider.rb +35 -11
- data/lib/openhab/core/things/abstract_description_type.rb +21 -0
- data/lib/openhab/core/things/channel.rb +9 -0
- data/lib/openhab/core/things/channel_definition.rb +61 -0
- data/lib/openhab/core/things/channel_group_definition.rb +51 -0
- data/lib/openhab/core/things/channel_group_type.rb +45 -0
- data/lib/openhab/core/things/channel_group_type_uid.rb +37 -0
- data/lib/openhab/core/things/channel_group_uid.rb +25 -0
- data/lib/openhab/core/things/channel_type.rb +74 -0
- data/lib/openhab/core/things/channel_type_uid.rb +53 -0
- data/lib/openhab/core/things/channel_uid.rb +19 -2
- data/lib/openhab/core/things/thing.rb +11 -2
- data/lib/openhab/core/things/thing_type.rb +62 -0
- data/lib/openhab/core/things/thing_type_uid.rb +54 -0
- data/lib/openhab/core/things/thing_uid.rb +30 -0
- data/lib/openhab/core/things/uid.rb +25 -0
- data/lib/openhab/core/things.rb +1 -3
- data/lib/openhab/dsl/rules/builder.rb +46 -8
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +1 -0
- data/lib/openhab/dsl/sitemaps/builder.rb +199 -57
- data/lib/openhab/dsl/things/builder.rb +52 -18
- data/lib/openhab/dsl/version.rb +1 -1
- data/lib/openhab/dsl.rb +4 -4
- metadata +15 -3
@@ -36,8 +36,14 @@ module OpenHAB
|
|
36
36
|
# Base class for all widgets
|
37
37
|
# @see org.openhab.core.model.sitemap.sitemap.Widget
|
38
38
|
class WidgetBuilder
|
39
|
-
|
40
|
-
|
39
|
+
include Core::EntityLookup
|
40
|
+
|
41
|
+
# This is copied out of UIComponentSitemapProvider.java
|
42
|
+
# The original pattern will match plain state e.g. "ON" as item="O" and state="N"
|
43
|
+
# this pattern is modified so it matches as item=nil and state="ON" by using atomic grouping `(?>subexpression)`
|
44
|
+
# rubocop:disable Layout/LineLength
|
45
|
+
CONDITION_PATTERN = /(?>(?<item>[A-Za-z]\w*)?\s*(?<condition>==|!=|<=|>=|<|>))?\s*(?<sign>\+|-)?(?<state>.+)/.freeze
|
46
|
+
# rubocop:enable Layout/LineLength
|
41
47
|
private_constant :CONDITION_PATTERN
|
42
48
|
|
43
49
|
# @return [String, nil]
|
@@ -45,19 +51,39 @@ module OpenHAB
|
|
45
51
|
# The item whose state to show
|
46
52
|
# @return [String, Core::Items::Item, nil]
|
47
53
|
attr_accessor :item
|
48
|
-
#
|
54
|
+
# The icon to show
|
55
|
+
# It can be a string, or a hash of conditions and icons.
|
56
|
+
# @example A simple icon
|
57
|
+
# sitemaps.build { text icon: "f7:house" }
|
58
|
+
#
|
59
|
+
# @example A dynamic icon with conditions
|
60
|
+
# sitemaps.build do
|
61
|
+
# text item: Wifi_Status, icon: {
|
62
|
+
# "ON" => "f7:wifi",
|
63
|
+
# "OFF" => "f7:wifi_slash",
|
64
|
+
# default: "f7:wifi_exclamationmark"
|
65
|
+
# }
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# @return [String, Hash<String, String>, Hash<Array<String>, String>, nil]
|
49
69
|
# @see https://www.openhab.org/docs/ui/sitemaps.html#icons
|
50
70
|
attr_accessor :icon
|
71
|
+
# The static icon to show
|
72
|
+
# This is mutually exclusive with {#icon}
|
73
|
+
# @return [String, nil]
|
74
|
+
# @since openHAB 4.1
|
75
|
+
# @see https://www.openhab.org/docs/ui/sitemaps.html#element-types
|
76
|
+
attr_accessor :static_icon
|
51
77
|
# Label color rules
|
52
|
-
# @return [Hash<String, String>]
|
78
|
+
# @return [Hash<String, String>, Hash<Array<String>, String>]
|
53
79
|
# @see https://www.openhab.org/docs/ui/sitemaps.html#label-value-and-icon-colors
|
54
80
|
attr_reader :label_colors
|
55
81
|
# Value color rules
|
56
|
-
# @return [Hash<String, String>]
|
82
|
+
# @return [Hash<String, String>, Hash<Array<String>, String>]
|
57
83
|
# @see https://www.openhab.org/docs/ui/sitemaps.html#label-value-and-icon-colors
|
58
84
|
attr_reader :value_colors
|
59
85
|
# Icon color rules
|
60
|
-
# @return [Hash<String, String>]
|
86
|
+
# @return [Hash<String, String>, Hash<Array<String>, String>]
|
61
87
|
# @see https://www.openhab.org/docs/ui/sitemaps.html#label-value-and-icon-colors
|
62
88
|
attr_reader :icon_colors
|
63
89
|
# Visibility rules
|
@@ -67,16 +93,22 @@ module OpenHAB
|
|
67
93
|
|
68
94
|
# @param item [String, Core::Items::Item, nil] The item whose state to show (see {#item})
|
69
95
|
# @param label [String, nil] (see {#label})
|
70
|
-
# @param icon [String, nil] (see {#icon})
|
71
|
-
# @param
|
72
|
-
# @param
|
73
|
-
#
|
74
|
-
# @param
|
96
|
+
# @param icon [String, Hash<String, String>, Hash<Array<String>, String>, nil] (see {#icon})
|
97
|
+
# @param static_icon [String, nil] (see {#static_icon})
|
98
|
+
# @param label_color [String, Hash<String, String>, Hash<Array<String>, String>, nil]
|
99
|
+
# One or more label color rules (see {#label_color})
|
100
|
+
# @param value_color [String, Hash<String, String>, Hash<Array<String>, String>, nil]
|
101
|
+
# One or more value color rules (see {#value_color})
|
102
|
+
# @param icon_color [String, Hash<String, String>, Hash<Array<String>, String>, nil]
|
103
|
+
# One or more icon color rules (see {#icon_color})
|
104
|
+
# @param visibility [String, Array<String>, Array<Array<String>>, nil]
|
105
|
+
# One or more visibility rules (see {#visibility})
|
75
106
|
# @!visibility private
|
76
107
|
def initialize(type,
|
77
108
|
item: nil,
|
78
109
|
label: nil,
|
79
110
|
icon: nil,
|
111
|
+
static_icon: nil,
|
80
112
|
label_color: nil,
|
81
113
|
value_color: nil,
|
82
114
|
icon_color: nil,
|
@@ -90,6 +122,7 @@ module OpenHAB
|
|
90
122
|
@item = item
|
91
123
|
@label = label
|
92
124
|
@icon = icon
|
125
|
+
@static_icon = static_icon
|
93
126
|
@visibilities = []
|
94
127
|
@label_colors = {}
|
95
128
|
@value_colors = {}
|
@@ -104,18 +137,21 @@ module OpenHAB
|
|
104
137
|
# Adds one or more new rules for setting the label color
|
105
138
|
# @return [Hash<String, String>] the current rules
|
106
139
|
def label_color(rules)
|
140
|
+
rules = { default: rules } if rules.is_a?(String)
|
107
141
|
@label_colors.merge!(rules)
|
108
142
|
end
|
109
143
|
|
110
144
|
# Adds one or more new rules for setting the value color
|
111
145
|
# @return [Hash<String, String>] the current rules
|
112
146
|
def value_color(rules)
|
147
|
+
rules = { default: rules } if rules.is_a?(String)
|
113
148
|
@value_colors.merge!(rules)
|
114
149
|
end
|
115
150
|
|
116
151
|
# Adds one or more new rules for setting the icon color
|
117
152
|
# @return [Hash<String, String>] the current rules
|
118
153
|
def icon_color(rules)
|
154
|
+
rules = { default: rules } if rules.is_a?(String)
|
119
155
|
@icon_colors.merge!(rules)
|
120
156
|
end
|
121
157
|
|
@@ -132,31 +168,24 @@ module OpenHAB
|
|
132
168
|
item = item.name if item.respond_to?(:name)
|
133
169
|
widget.item = item if item
|
134
170
|
widget.label = @label
|
135
|
-
|
171
|
+
|
172
|
+
raise ArgumentError, "icon and static_icon are mutually exclusive" if icon && static_icon
|
173
|
+
|
174
|
+
if static_icon
|
175
|
+
widget.static_icon = static_icon
|
176
|
+
elsif icon.is_a?(String)
|
177
|
+
widget.icon = @icon
|
178
|
+
elsif icon.is_a?(Hash)
|
179
|
+
add_icons(widget)
|
180
|
+
elsif !icon.nil?
|
181
|
+
raise ArgumentError, "icon must be a String or a Hash"
|
182
|
+
end
|
136
183
|
|
137
184
|
add_colors(widget, :label_color, label_colors)
|
138
185
|
add_colors(widget, :value_color, value_colors)
|
139
186
|
add_colors(widget, :icon_color, icon_colors)
|
140
187
|
|
141
|
-
|
142
|
-
if SitemapBuilder.factory.respond_to?(:create_condition)
|
143
|
-
add_conditions(widget, :visibility, visibilities, :create_visibility_rule)
|
144
|
-
else
|
145
|
-
visibilities.each do |v|
|
146
|
-
raise ArgumentError, "AND conditions not supported prior to openHAB 4.1" if v.is_a?(Array)
|
147
|
-
|
148
|
-
unless (match = CONDITION_PATTERN.match(v))
|
149
|
-
raise ArgumentError, "Syntax error in visibility rule #{v.inspect}"
|
150
|
-
end
|
151
|
-
|
152
|
-
rule = SitemapBuilder.factory.create_visibility_rule
|
153
|
-
rule.item = match["item"]
|
154
|
-
rule.condition = match["condition"]
|
155
|
-
rule.sign = match["sign"]
|
156
|
-
rule.state = match["state"]
|
157
|
-
widget.visibility.add(rule)
|
158
|
-
end
|
159
|
-
end
|
188
|
+
add_conditions(widget, :visibility, visibilities, :create_visibility_rule)
|
160
189
|
|
161
190
|
widget
|
162
191
|
end
|
@@ -173,12 +202,19 @@ module OpenHAB
|
|
173
202
|
|
174
203
|
private
|
175
204
|
|
176
|
-
def add_colors(widget, method,
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
205
|
+
def add_colors(widget, method, colors)
|
206
|
+
# ensure that the default color is at the end, and make the conditions nil (no conditions)
|
207
|
+
colors.delete(:default)&.tap { |default_color| colors.merge!(nil => default_color) }
|
208
|
+
|
209
|
+
add_conditions(widget, method, colors.keys, :create_color_array) do |color_array, key|
|
210
|
+
color_array.arg = colors[key]
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def add_icons(widget)
|
215
|
+
icon.delete(:default)&.tap { |default_icon| icon.merge!(nil => default_icon) }
|
216
|
+
add_conditions(widget, :icon_rules, icon.keys, :create_icon_rule) do |icon_array, key|
|
217
|
+
icon_array.arg = icon[key]
|
182
218
|
end
|
183
219
|
end
|
184
220
|
|
@@ -186,25 +222,22 @@ module OpenHAB
|
|
186
222
|
return if conditions.empty?
|
187
223
|
|
188
224
|
object = widget.send(method)
|
189
|
-
|
190
|
-
|
191
|
-
if !SitemapBuilder.factory.respond_to?(:create_condition) && has_and_conditions
|
225
|
+
# @deprecated OH 4.0
|
226
|
+
if conditions.any?(Array) && !SitemapBuilder.factory.respond_to?(:create_condition)
|
192
227
|
raise ArgumentError, "AND conditions not supported prior to openHAB 4.1"
|
193
228
|
end
|
194
229
|
|
195
|
-
conditions = [conditions] unless has_and_conditions
|
196
|
-
|
197
230
|
conditions.each do |sub_conditions|
|
198
231
|
container = SitemapBuilder.factory.send(container_method)
|
199
232
|
|
200
233
|
add_conditions_to_container(container, sub_conditions)
|
201
|
-
yield container if block_given?
|
234
|
+
yield container, sub_conditions if block_given?
|
202
235
|
object.add(container)
|
203
236
|
end
|
204
237
|
end
|
205
238
|
|
206
239
|
def add_conditions_to_container(container, conditions)
|
207
|
-
# @deprecated OH 4.
|
240
|
+
# @deprecated OH 4.0
|
208
241
|
supports_and_conditions = SitemapBuilder.factory.respond_to?(:create_condition)
|
209
242
|
|
210
243
|
Array.wrap(conditions).each do |c|
|
@@ -235,7 +268,7 @@ module OpenHAB
|
|
235
268
|
attr_accessor :mappings
|
236
269
|
|
237
270
|
# (see WidgetBuilder#initialize)
|
238
|
-
# @!method initialize(item: nil, label: nil, icon: nil, mappings: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
271
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, mappings: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
239
272
|
# @param mappings [Hash, Array, nil] Mappings from command to label (see {SwitchBuilder#mappings})
|
240
273
|
# @!visibility private
|
241
274
|
def initialize(type, mappings: nil, **kwargs)
|
@@ -275,7 +308,7 @@ module OpenHAB
|
|
275
308
|
attr_accessor :step
|
276
309
|
|
277
310
|
# (see WidgetBuilder#initialize)
|
278
|
-
# @!method initialize(item: nil, label: nil, icon: nil, range: nil, step: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
311
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, range: nil, step: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
279
312
|
# @param range [Range, nil] Allowed range of the value (see {SetpointBuilder#range})
|
280
313
|
# @param step [Numeric,nil] How far the value will change with each button press (see {SetpointBuilder#step})
|
281
314
|
# @!visibility private
|
@@ -309,7 +342,7 @@ module OpenHAB
|
|
309
342
|
attr_writer :switch
|
310
343
|
|
311
344
|
# (see SetpointBuilder#initialize)
|
312
|
-
# @!method initialize(item: nil, label: nil, icon: nil, range: nil, step: nil, switch: nil, frequency: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
345
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, range: nil, step: nil, switch: nil, frequency: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
313
346
|
# @param switch [true, false, nil]
|
314
347
|
# A short press on the item toggles the item on or off (see {SliderBuilder#switch=})
|
315
348
|
# @param frequency [Numeric, nil]
|
@@ -350,7 +383,7 @@ module OpenHAB
|
|
350
383
|
attr_reader :encoding
|
351
384
|
|
352
385
|
# (see WidgetBuilder#initialize)
|
353
|
-
# @!method initialize(item: nil, label: nil, icon: nil, url: nil, encoding: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
386
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, url: nil, encoding: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
354
387
|
# @param [String, nil] url (see {VideoBuilder#url})
|
355
388
|
# @param [:mjpeg, :hls, nil] encoding (see {VideoBuilder#encoding})
|
356
389
|
# @!visibility private
|
@@ -408,7 +441,7 @@ module OpenHAB
|
|
408
441
|
attr_accessor :y_axis_pattern
|
409
442
|
|
410
443
|
# (see WidgetBuilder#initialize)
|
411
|
-
# @!method initialize(item: nil, label: nil, icon: nil, service: nil, refresh: nil, period: nil, legend: nil, group: nil, y_axis_pattern: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
444
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, service: nil, refresh: nil, period: nil, legend: nil, group: nil, y_axis_pattern: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
412
445
|
# @param service [String, nil]
|
413
446
|
# The persistence service to use (see {ChartBuilder#service})
|
414
447
|
# @param refresh [Numeric, nil)]
|
@@ -477,7 +510,7 @@ module OpenHAB
|
|
477
510
|
attr_accessor :height
|
478
511
|
|
479
512
|
# (see WidgetBuilder#initialize)
|
480
|
-
# @!method initialize(item: nil, label: nil, icon: nil, height: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
513
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, height: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
481
514
|
# @param height [Integer] The number of element rows to fill (see {DefaultBuilder#height})
|
482
515
|
# @!visibility private
|
483
516
|
def initialize(type, height: nil, **kwargs)
|
@@ -502,7 +535,7 @@ module OpenHAB
|
|
502
535
|
attr_accessor :url
|
503
536
|
|
504
537
|
# (see DefaultBuilder#initialize)
|
505
|
-
# @!method initialize(item: nil, label: nil, icon: nil, url: nil, height: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
538
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, url: nil, height: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
506
539
|
# @param url [String, nil] (see {WebviewBuilder#url})
|
507
540
|
# @!visibility private
|
508
541
|
def initialize(type, url: nil, **kwargs)
|
@@ -528,7 +561,7 @@ module OpenHAB
|
|
528
561
|
attr_accessor :frequency
|
529
562
|
|
530
563
|
# (see WidgetBuilder#initialize)
|
531
|
-
# @!method initialize(item: nil, label: nil, icon: nil, frequency: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
564
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, frequency: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
532
565
|
# @param frequency [Numeric, nil] How often to send requests (see {ColorpickerBuilder#frequency})
|
533
566
|
# @!visibility private
|
534
567
|
def initialize(type, frequency: nil, **kwargs)
|
@@ -563,7 +596,7 @@ module OpenHAB
|
|
563
596
|
attr_reader :hint
|
564
597
|
|
565
598
|
# (see WidgetBuilder#initialize)
|
566
|
-
# @!method initialize(item: nil, label: nil, icon: nil, hint: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
599
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, hint: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
567
600
|
# @param [:text, :number, :date, :time, :datetime, nil] hint
|
568
601
|
# Gives a hint to the user interface to use a widget adapted to a specific use (see {InputBuilder#hint})
|
569
602
|
# @!visibility private
|
@@ -588,11 +621,87 @@ module OpenHAB
|
|
588
621
|
end
|
589
622
|
end
|
590
623
|
|
624
|
+
# Builds a `Buttongrid` element
|
625
|
+
# @since openHAB 4.1
|
626
|
+
# @see https://www.openhab.org/docs/ui/sitemaps.html#element-type-buttongrid
|
627
|
+
# @see org.openhab.core.model.sitemap.sitemap.Buttongrid
|
628
|
+
class ButtongridBuilder < WidgetBuilder
|
629
|
+
# @return [Array<Array<int, int, Command, String, String>>]
|
630
|
+
# An array of buttons to display
|
631
|
+
attr_reader :buttons
|
632
|
+
|
633
|
+
# (see WidgetBuilder#initialize)
|
634
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, buttons: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
635
|
+
# @param [Array<Array<int, int, Command, String, String>>] buttons An array of buttons to display.
|
636
|
+
# Each element is an array with the following elements:
|
637
|
+
# - row: 1-12
|
638
|
+
# - column: 1-12
|
639
|
+
# - command: The command to send when the button is pressed
|
640
|
+
# - label: The label to display on the button
|
641
|
+
# - icon: The icon to display on the button (optional)
|
642
|
+
#
|
643
|
+
# @example
|
644
|
+
# # This creates a buttongrid to emulate a TV remote control
|
645
|
+
# sitemaps.build do
|
646
|
+
# buttongrid item: LivingRoom_TV_RCButton, buttons: [
|
647
|
+
# [1, 1, "BACK", "Back", "f7:return"],
|
648
|
+
# [1, 2, "HOME", "Menu", "material:apps"],
|
649
|
+
# [1, 3, "YELLOW", "Search", "f7:search"],
|
650
|
+
# [2, 2, "UP", "Up", "f7:arrowtriangle_up"],
|
651
|
+
# [4, 2, "DOWN", "Down", "f7:arrowtriangle_down"],
|
652
|
+
# [3, 1, "LEFT", "Left", "f7:arrowtriangle_left"],
|
653
|
+
# [3, 3, "RIGHT", "Right", "f7:arrowtriangle_right"],
|
654
|
+
# [3, 2, "ENTER", "Enter", "material:adjust"]
|
655
|
+
# ]
|
656
|
+
# end
|
657
|
+
#
|
658
|
+
# @see https://www.openhab.org/docs/ui/sitemaps.html#element-type-buttongrid
|
659
|
+
# @!visibility private
|
660
|
+
def initialize(type, buttons: [], **kwargs)
|
661
|
+
super(type, **kwargs)
|
662
|
+
buttons.each { |button| validate_button(button) }
|
663
|
+
@buttons = buttons
|
664
|
+
end
|
665
|
+
|
666
|
+
#
|
667
|
+
# Adds a button to the buttongrid
|
668
|
+
#
|
669
|
+
# @param [Array<int, int, Command, String, String>] button the button to add
|
670
|
+
# @return [Array<Array<int, int, Command, String, String>>] the current buttons
|
671
|
+
#
|
672
|
+
def button(button)
|
673
|
+
validate_button(button)
|
674
|
+
@buttons << button
|
675
|
+
end
|
676
|
+
|
677
|
+
# @!visibility private
|
678
|
+
def build
|
679
|
+
widget = super
|
680
|
+
buttons.each do |button|
|
681
|
+
button_object = SitemapBuilder.factory.create_button
|
682
|
+
button_object.row = button[0]
|
683
|
+
button_object.column = button[1]
|
684
|
+
button_object.cmd = button[2]
|
685
|
+
button_object.label = button[3]
|
686
|
+
button_object.icon = button[4] if button[4]
|
687
|
+
widget.buttons.add(button_object)
|
688
|
+
end
|
689
|
+
|
690
|
+
widget
|
691
|
+
end
|
692
|
+
|
693
|
+
private
|
694
|
+
|
695
|
+
def validate_button(button)
|
696
|
+
return if (4..5).cover?(button.size)
|
697
|
+
|
698
|
+
raise ArgumentError, "Invalid button: '#{button.inspect}'. It must be an array with (4..5) elements"
|
699
|
+
end
|
700
|
+
end
|
701
|
+
|
591
702
|
# Parent class for builders of widgets that can contain other widgets.
|
592
703
|
# @see org.openhab.core.model.sitemap.sitemap.LinkableWidget
|
593
704
|
class LinkableWidgetBuilder < WidgetBuilder
|
594
|
-
include Core::EntityLookup
|
595
|
-
|
596
705
|
# allow referring to items that don't exist yet
|
597
706
|
self.create_dummy_items = true
|
598
707
|
|
@@ -609,6 +718,7 @@ module OpenHAB
|
|
609
718
|
# def frame(item: nil,
|
610
719
|
# label: nil,
|
611
720
|
# icon: nil,
|
721
|
+
# static_icon: nil,
|
612
722
|
# label_color: nil,
|
613
723
|
# value_color: nil,
|
614
724
|
# icon_color: nil,
|
@@ -623,6 +733,7 @@ module OpenHAB
|
|
623
733
|
# def text(item: nil,
|
624
734
|
# label: nil,
|
625
735
|
# icon: nil,
|
736
|
+
# static_icon: nil,
|
626
737
|
# label_color: nil,
|
627
738
|
# value_color: nil,
|
628
739
|
# icon_color: nil,
|
@@ -637,6 +748,7 @@ module OpenHAB
|
|
637
748
|
# def group(item: nil,
|
638
749
|
# label: nil,
|
639
750
|
# icon: nil,
|
751
|
+
# static_icon: nil,
|
640
752
|
# label_color: nil,
|
641
753
|
# value_color: nil,
|
642
754
|
# icon_color: nil,
|
@@ -651,6 +763,7 @@ module OpenHAB
|
|
651
763
|
# def image(item: nil,
|
652
764
|
# label: nil,
|
653
765
|
# icon: nil,
|
766
|
+
# static_icon: nil,
|
654
767
|
# url: nil,
|
655
768
|
# refresh: nil,
|
656
769
|
# label_color: nil,
|
@@ -667,6 +780,7 @@ module OpenHAB
|
|
667
780
|
# def video(item: nil,
|
668
781
|
# label: nil,
|
669
782
|
# icon: nil,
|
783
|
+
# static_icon: nil,
|
670
784
|
# url: nil,
|
671
785
|
# encoding: nil,
|
672
786
|
# label_color: nil,
|
@@ -683,6 +797,7 @@ module OpenHAB
|
|
683
797
|
# def chart(item: nil,
|
684
798
|
# label: nil,
|
685
799
|
# icon: nil,
|
800
|
+
# static_icon: nil,
|
686
801
|
# service: nil,
|
687
802
|
# refresh: nil,
|
688
803
|
# period: nil,
|
@@ -703,6 +818,7 @@ module OpenHAB
|
|
703
818
|
# def webview(item: nil,
|
704
819
|
# label: nil,
|
705
820
|
# icon: nil,
|
821
|
+
# static_icon: nil,
|
706
822
|
# url: nil,
|
707
823
|
# height: nil,
|
708
824
|
# label_color: nil,
|
@@ -719,6 +835,7 @@ module OpenHAB
|
|
719
835
|
# def switch(item: nil,
|
720
836
|
# label: nil,
|
721
837
|
# icon: nil,
|
838
|
+
# static_icon: nil,
|
722
839
|
# mappings: nil,
|
723
840
|
# label_color: nil,
|
724
841
|
# value_color: nil,
|
@@ -734,6 +851,7 @@ module OpenHAB
|
|
734
851
|
# def mapview(item: nil,
|
735
852
|
# label: nil,
|
736
853
|
# icon: nil,
|
854
|
+
# static_icon: nil,
|
737
855
|
# height: nil,
|
738
856
|
# label_color: nil,
|
739
857
|
# value_color: nil,
|
@@ -749,6 +867,7 @@ module OpenHAB
|
|
749
867
|
# def slider(item: nil,
|
750
868
|
# label: nil,
|
751
869
|
# icon: nil,
|
870
|
+
# static_icon: nil,
|
752
871
|
# range: nil,
|
753
872
|
# step: nil,
|
754
873
|
# switch: nil,
|
@@ -767,6 +886,7 @@ module OpenHAB
|
|
767
886
|
# def selection(item: nil,
|
768
887
|
# label: nil,
|
769
888
|
# icon: nil,
|
889
|
+
# static_icon: nil,
|
770
890
|
# mappings: nil,
|
771
891
|
# label_color: nil,
|
772
892
|
# value_color: nil,
|
@@ -783,6 +903,7 @@ module OpenHAB
|
|
783
903
|
# def input(item: nil,
|
784
904
|
# label: nil,
|
785
905
|
# icon: nil,
|
906
|
+
# static_icon: nil,
|
786
907
|
# hint: nil,
|
787
908
|
# label_color: nil,
|
788
909
|
# value_color: nil,
|
@@ -790,6 +911,23 @@ module OpenHAB
|
|
790
911
|
# visibility: nil)
|
791
912
|
# end
|
792
913
|
#
|
914
|
+
# # (see ButtongridBuilder#initialize)
|
915
|
+
# # Create a new `Buttongrid` element.
|
916
|
+
# # @yield Block executed in the context of an {ButtongridBuilder}
|
917
|
+
# # @return [ButtongridBuilder]
|
918
|
+
# # @since openHAB 4.1
|
919
|
+
# # @!visibility public
|
920
|
+
# def buttongrid(item: nil,
|
921
|
+
# label: nil,
|
922
|
+
# icon: nil,
|
923
|
+
# static_icon: nil,
|
924
|
+
# buttons: nil,
|
925
|
+
# label_color: nil,
|
926
|
+
# value_color: nil,
|
927
|
+
# icon_color: nil,
|
928
|
+
# visibility: nil)
|
929
|
+
# end
|
930
|
+
#
|
793
931
|
# # (see SetpointBuilder#initialize)
|
794
932
|
# # Create a new `Setpoint` element.
|
795
933
|
# # @yield Block executed in the context of a {SetpointBuilder}
|
@@ -798,6 +936,7 @@ module OpenHAB
|
|
798
936
|
# def setpoint(item: nil,
|
799
937
|
# label: nil,
|
800
938
|
# icon: nil,
|
939
|
+
# static_icon: nil,
|
801
940
|
# range: nil,
|
802
941
|
# step: nil,
|
803
942
|
# label_color: nil,
|
@@ -814,6 +953,7 @@ module OpenHAB
|
|
814
953
|
# def colorpicker(item: nil,
|
815
954
|
# label: nil,
|
816
955
|
# icon: nil,
|
956
|
+
# static_icon: nil,
|
817
957
|
# frequency: nil,
|
818
958
|
# label_color: nil,
|
819
959
|
# value_color: nil,
|
@@ -829,6 +969,7 @@ module OpenHAB
|
|
829
969
|
# def default(item: nil,
|
830
970
|
# label: nil,
|
831
971
|
# icon: nil,
|
972
|
+
# static_icon: nil,
|
832
973
|
# height: nil,
|
833
974
|
# label_color: nil,
|
834
975
|
# value_color: nil,
|
@@ -849,6 +990,7 @@ module OpenHAB
|
|
849
990
|
slider
|
850
991
|
selection
|
851
992
|
input
|
993
|
+
buttongrid
|
852
994
|
setpoint
|
853
995
|
colorpicker
|
854
996
|
default].each do |method|
|
@@ -865,7 +1007,7 @@ module OpenHAB
|
|
865
1007
|
end
|
866
1008
|
|
867
1009
|
# (see WidgetBuilder#initialize)
|
868
|
-
# @!method initialize(item: nil, label: nil, icon: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
1010
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
869
1011
|
# @!visibility private
|
870
1012
|
def initialize(*, **)
|
871
1013
|
super
|
@@ -915,7 +1057,7 @@ module OpenHAB
|
|
915
1057
|
attr_accessor :refresh
|
916
1058
|
|
917
1059
|
# (see LinkableWidgetBuilder#initialize)
|
918
|
-
# @!method initialize(item: nil, label: nil, icon: nil, url: nil, refresh: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
1060
|
+
# @!method initialize(item: nil, label: nil, icon: nil, static_icon: nil, url: nil, refresh: nil, label_color: nil, value_color: nil, icon_color: nil, visibility: nil)
|
919
1061
|
# @param url [String, nil] The URL for the image (see {ImageBuilder#url})
|
920
1062
|
# @param refresh [Numeric, nil] How often to refresh the image (see {ImageBuilder#refresh})
|
921
1063
|
# @!visibility private
|
@@ -32,6 +32,36 @@ module OpenHAB
|
|
32
32
|
# end
|
33
33
|
# end
|
34
34
|
#
|
35
|
+
# @example Create a Thing within a Bridge
|
36
|
+
# things.build do
|
37
|
+
# bridge "mqtt:broker:mosquitto", config: { host: "127.0.0.1", enableDiscovery: false } do
|
38
|
+
# thing "mqtt:topic:window1", "My Window Sensor" do
|
39
|
+
# channel "contact1", "contact", config: {
|
40
|
+
# stateTopic: "zigbee2mqtt/window1/contact",
|
41
|
+
# on: "false",
|
42
|
+
# off: "true"
|
43
|
+
# }
|
44
|
+
# end
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# items.build do
|
49
|
+
# contact_item Window1_Contact, channel: "mqtt:topic:window1:contact1"
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# @example Create a Thing separately from the Bridge
|
53
|
+
# things.build do
|
54
|
+
# bridge = bridge "mqtt:broker:mosquitto", config: { host: "127.0.0.1", enableDiscovery: false }
|
55
|
+
#
|
56
|
+
# thing "mqtt:topic:window1", "My Window Sensor", bridge: bridge do
|
57
|
+
# channel "contact1", "contact", config: {
|
58
|
+
# stateTopic: "zigbee2mqtt/window1/contact",
|
59
|
+
# on: "false",
|
60
|
+
# off: "true"
|
61
|
+
# }
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
#
|
35
65
|
# @see ThingBuilder#initialize ThingBuilder#initialize for #thing's parameters
|
36
66
|
# @see ChannelBuilder#initialize ChannelBuilder#initialize for #channel's parameters
|
37
67
|
# @see Items::Builder
|
@@ -61,6 +91,7 @@ module OpenHAB
|
|
61
91
|
|
62
92
|
def build(klass, *args, **kwargs, &block)
|
63
93
|
builder = klass.new(*args, **kwargs)
|
94
|
+
builder.parent_builder = self if builder.respond_to?(:parent_builder=)
|
64
95
|
builder.instance_eval(&block) if block
|
65
96
|
thing = builder.build
|
66
97
|
|
@@ -190,6 +221,7 @@ module OpenHAB
|
|
190
221
|
@location = location.label if location.is_a?(Item)
|
191
222
|
@config = config.transform_keys(&:to_s)
|
192
223
|
@enabled = enabled
|
224
|
+
@builder = org.openhab.core.thing.binding.builder.ThingBuilder unless instance_variable_defined?(:@builder)
|
193
225
|
end
|
194
226
|
|
195
227
|
# Add an explicitly configured channel to this item
|
@@ -222,13 +254,12 @@ module OpenHAB
|
|
222
254
|
@channels = merged_channels.values
|
223
255
|
end
|
224
256
|
|
225
|
-
builder =
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
.with_channels(channels)
|
257
|
+
builder = @builder.create(thing_type_uid, uid)
|
258
|
+
.with_label(label)
|
259
|
+
.with_location(location)
|
260
|
+
.with_configuration(configuration)
|
261
|
+
.with_bridge(bridge_uid)
|
262
|
+
.with_channels(channels)
|
232
263
|
|
233
264
|
builder.with_properties(thing_type.properties) if thing_type
|
234
265
|
|
@@ -244,16 +275,26 @@ module OpenHAB
|
|
244
275
|
|
245
276
|
# The BridgeBuilder DSL allows you to customize a thing
|
246
277
|
class BridgeBuilder < ThingBuilder
|
278
|
+
# @!visibility private
|
279
|
+
attr_accessor :parent_builder
|
280
|
+
|
281
|
+
# Constructor for BridgeBuilder
|
282
|
+
# @see ThingBuilder#initialize
|
283
|
+
def initialize(uid, label = nil, binding: nil, type: nil, bridge: nil, location: nil, config: {}, enabled: nil)
|
284
|
+
@builder = org.openhab.core.thing.binding.builder.BridgeBuilder
|
285
|
+
super
|
286
|
+
end
|
287
|
+
|
247
288
|
# Create a new Bridge with this Bridge as its Bridge
|
248
289
|
# @see BridgeBuilder#initialize
|
249
290
|
def bridge(*args, **kwargs, &block)
|
250
|
-
|
291
|
+
parent_builder.bridge(*args, bridge: self, **kwargs, &block)
|
251
292
|
end
|
252
293
|
|
253
294
|
# Create a new Thing with this Bridge as its Bridge
|
254
295
|
# @see ThingBuilder#initialize
|
255
296
|
def thing(*args, **kwargs, &block)
|
256
|
-
|
297
|
+
parent_builder.thing(*args, bridge: self, **kwargs, &block)
|
257
298
|
end
|
258
299
|
end
|
259
300
|
|
@@ -268,13 +309,6 @@ module OpenHAB
|
|
268
309
|
:description,
|
269
310
|
:auto_update_policy
|
270
311
|
|
271
|
-
class << self
|
272
|
-
# @!visibility private
|
273
|
-
def channel_type_registry
|
274
|
-
@channel_type_registry ||= OSGi.service("org.openhab.core.thing.type.ChannelTypeRegistry")
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
312
|
#
|
279
313
|
# Constructor for ChannelBuilder
|
280
314
|
#
|
@@ -283,7 +317,7 @@ module OpenHAB
|
|
283
317
|
# @param [String] uid The channel's ID.
|
284
318
|
# @param [String, ChannelTypeUID, :trigger] type The concrete type of the channel.
|
285
319
|
# @param [String] label The channel label.
|
286
|
-
# @param [
|
320
|
+
# @param [Thing] thing The thing associated with this channel.
|
287
321
|
# This parameter is not needed for the {ThingBuilder#channel} method.
|
288
322
|
# @param [String] description The channel description.
|
289
323
|
# @param [String] group The group name.
|
@@ -355,7 +389,7 @@ module OpenHAB
|
|
355
389
|
# @!attribute [r] accepted_item_type
|
356
390
|
# @return [String] The accepted item type.
|
357
391
|
def accepted_item_type
|
358
|
-
@accepted_item_type ||=
|
392
|
+
@accepted_item_type ||= type.channel_type&.item_type
|
359
393
|
end
|
360
394
|
|
361
395
|
private
|