node-red-contrib-knx-ultimate 6.2.3-beta.3 → 6.2.3-beta.5
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.
- package/CHANGELOG.md +7 -1
- package/nodes/commonFunctions.js +46 -2
- package/nodes/hue-config.js +13 -0
- package/nodes/knxUltimate.html +52 -58
- package/nodes/knxUltimateHueController.html +246 -35
- package/nodes/knxUltimateMatterControllerDevice.html +15 -3
- package/nodes/locales/de/knxUltimate.html +1 -1
- package/nodes/locales/de/knxUltimateHueController.html +3 -2
- package/nodes/locales/de/knxUltimateHueController.json +7 -0
- package/nodes/locales/de/knxUltimateMatterControllerDevice.html +2 -0
- package/nodes/locales/de/matter-config.html +1 -1
- package/nodes/locales/en/knxUltimate.html +1 -1
- package/nodes/locales/en/knxUltimateHueController.html +3 -2
- package/nodes/locales/en/knxUltimateHueController.json +7 -0
- package/nodes/locales/en/knxUltimateMatterControllerDevice.html +2 -0
- package/nodes/locales/en/matter-config.html +1 -1
- package/nodes/locales/es/knxUltimate.html +1 -1
- package/nodes/locales/es/knxUltimateHueController.html +3 -2
- package/nodes/locales/es/knxUltimateHueController.json +7 -0
- package/nodes/locales/es/knxUltimateMatterControllerDevice.html +2 -0
- package/nodes/locales/es/matter-config.html +1 -1
- package/nodes/locales/fr/knxUltimate.html +1 -1
- package/nodes/locales/fr/knxUltimateHueController.html +3 -2
- package/nodes/locales/fr/knxUltimateHueController.json +7 -0
- package/nodes/locales/fr/knxUltimateMatterControllerDevice.html +2 -0
- package/nodes/locales/fr/matter-config.html +1 -1
- package/nodes/locales/it/knxUltimate.html +1 -1
- package/nodes/locales/it/knxUltimateHueController.html +3 -2
- package/nodes/locales/it/knxUltimateHueController.json +7 -0
- package/nodes/locales/it/knxUltimateMatterControllerDevice.html +2 -0
- package/nodes/locales/it/matter-config.html +1 -1
- package/nodes/locales/zh-CN/knxUltimate.html +1 -1
- package/nodes/locales/zh-CN/knxUltimateHueController.html +3 -2
- package/nodes/locales/zh-CN/knxUltimateHueController.json +7 -0
- package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.html +2 -0
- package/nodes/locales/zh-CN/matter-config.html +1 -1
- package/nodes/matter-config.html +67 -6
- package/nodes/matter-config.js +51 -0
- package/nodes/utils/hueControllerResourceCatalog.js +71 -0
- package/nodes/utils/matterEngine.mjs +111 -2
- package/package.json +1 -1
- package/resources/hueControllerProfiles.js +7 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,8 +6,14 @@
|
|
|
6
6
|
|
|
7
7
|
# CHANGELOG
|
|
8
8
|
|
|
9
|
-
**Version 6.2.3-beta.
|
|
9
|
+
**Version 6.2.3-beta.5** - August 2026<br/>
|
|
10
10
|
|
|
11
|
+
- **HUE Controller**: device-first selection with automatic type detection and all supported Hue API v2 resources.<br/>
|
|
12
|
+
- **Device pickers**: Hue, Matter and KNX Group Address lists now stay open on click and show all entries before filtering.<br/>
|
|
13
|
+
|
|
14
|
+
**Version 6.2.3-beta.4** - August 2026<br/>
|
|
15
|
+
|
|
16
|
+
- **Matter Controller — live commissioning progress**: replaced the pairing overlay spinner with a milestone-based progress bar driven by the actual matter.js commissioning flow. The blocking panel now describes the active discovery, PASE, device-information, fail-safe, regulatory, time-sync, attestation, credential, access-control, CASE reconnect and completion phase in English; when exposed by the commissionee, its product name, Vendor ID and Product ID appear below the current operation. Progress polling is local to the Node-RED editor, stops with the pairing request and is isolated by operation ID across editor tabs.<br/>
|
|
11
17
|
- **HUE Controller — unified Hue API v2 node**: added one controller node covering the complete set of existing Hue functions: lights and grouped lights, plugs, buttons, Tap dial, motion and camera motion, contacts, light level, temperature, humidity, scenes, battery, Zigbee connectivity and device software update. The compact device-function selector uses one third of the available width and opens the established dedicated editor with its localized labels; KNX mapping fields are hidden whenever no **KNX Gateway** is selected, including `none`, an empty value and **Add new...**. The YouTube tutorial playlist now appears once at the top of the editor, while routine inline `form-tips` are removed from the unified UI and a compact migration privacy disclaimer remains directly below the conversion button. The migration action runs entirely inside the browser and changes only the legacy HUE nodes requiring conversion, preserving every existing property, config reference, group, position and link; no flow or node data leaves the editor and the workspace remains undeployed for user review. After a successful conversion, an editable email draft addressed to the author opens without navigating the top-level Node-RED page and contains only the converted-node count and space for optional notes; the user decides whether to send it and nothing is sent automatically. The final Node-RED message offers an optional support button, and the PayPal donation page opens only when the user clicks it. Each profile executes the same mature runtime contract, preserving KNX telegram types, Hue event/status direction, flow pins and loop protection. Runtime implementations, editor definitions, templates and all six translation catalogs are embedded as package-internal HUE Controller profiles; registration order no longer matters, the KNX and Hue gateway fields remain real config-node selectors, and the controller has no runtime or editor dependency on deprecated node types. The original Hue Light node remains unchanged. Existing dedicated Hue nodes remain fully compatible and registered, use Node-RED's special `deprecated` category so they no longer appear in the palette, retain the lighter `#E7E9F6` color and `(deprecated)` canvas suffix without changing saved names, and show a localized HUE Controller migration notice at the top of their editors.<br/>
|
|
12
18
|
- **HUE Controller — complete per-function help**: the established help of every dedicated Hue node is now incorporated under the corresponding HUE Controller function key, with an anchor index and automatic sidebar focus when the function changes. The same 15-section reference is included in the Controller wiki documentation in EN, IT, DE, FR, ES and zh-CN; legacy deprecation notices are deliberately excluded from the embedded copies.<br/>
|
|
13
19
|
- **HUE Controller — legacy-independent maintenance boundary**: private runtime profiles and the private editor/template/translation sources are now the canonical implementation of HUE Controller. Its generator and consistency check read only those private sources and never inspect the frozen legacy nodes, so future Controller fixes remain isolated and the dedicated deprecated nodes can eventually be removed without breaking either runtime or UI. Added detailed architecture and lifecycle comments around runtime constructor capture, RED facades, editor mounting, profile drafts, dynamic pins, translations and the Hue Light bootstrap path.<br/>
|
package/nodes/commonFunctions.js
CHANGED
|
@@ -800,18 +800,51 @@ module.exports = (RED) => {
|
|
|
800
800
|
}
|
|
801
801
|
})
|
|
802
802
|
|
|
803
|
+
// MATTER: current commissioning milestone for the blocking editor overlay.
|
|
804
|
+
// The operation id keeps simultaneous editor tabs from displaying each other's progress.
|
|
805
|
+
RED.httpAdmin.get('/KNXUltimateMatterPairProgress', RED.auth.needsPermission('matter-config.read'), (req, res) => {
|
|
806
|
+
try {
|
|
807
|
+
const matterServer = RED.nodes.getNode(req.query.serverId)
|
|
808
|
+
if (matterServer === null || matterServer === undefined) {
|
|
809
|
+
res.json({ active: false, percent: 0, error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
810
|
+
return
|
|
811
|
+
}
|
|
812
|
+
res.json(matterServer.getCommissioningProgress(req.query.operationId))
|
|
813
|
+
} catch (error) {
|
|
814
|
+
RED.log.error(`Err KNXUltimateMatterPairProgress: ${error.message}`)
|
|
815
|
+
res.json({ active: false, percent: 0, error: error.message })
|
|
816
|
+
}
|
|
817
|
+
})
|
|
818
|
+
|
|
803
819
|
// MATTER: commissions (pairs) a new Matter device using a pairing code or QR code string
|
|
804
820
|
RED.httpAdmin.get('/KNXUltimateMatterPair', RED.auth.needsPermission('matter-config.write'), async (req, res) => {
|
|
821
|
+
let matterServer
|
|
822
|
+
const requestedOperationId = String(req.query.operationId || '').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 80)
|
|
823
|
+
// Keep direct callers of the pre-progress endpoint backward compatible. The editor
|
|
824
|
+
// supplies its own id so it can poll; legacy callers receive a server-only id.
|
|
825
|
+
const operationId = requestedOperationId || `server-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`
|
|
805
826
|
try {
|
|
806
|
-
|
|
827
|
+
matterServer = RED.nodes.getNode(req.query.serverId)
|
|
807
828
|
if (matterServer === null || matterServer === undefined) {
|
|
808
829
|
res.json({ error: 'PLEASE DEPLOY FIRST: then try again.' })
|
|
809
830
|
return
|
|
810
831
|
}
|
|
811
|
-
|
|
832
|
+
if (!matterServer.beginCommissioningProgress(operationId)) {
|
|
833
|
+
res.json({ error: 'Another Matter commissioning operation is already in progress.' })
|
|
834
|
+
return
|
|
835
|
+
}
|
|
836
|
+
const nodeId = await matterServer.commission(req.query.code, {
|
|
837
|
+
targetHost: req.query.targetHost,
|
|
838
|
+
onProgress: (progress) => matterServer.reportCommissioningProgress(operationId, progress)
|
|
839
|
+
})
|
|
812
840
|
const requestedName = String(req.query.name || '').trim()
|
|
813
841
|
let renameError = null
|
|
814
842
|
if (requestedName !== '') {
|
|
843
|
+
matterServer.reportCommissioningProgress(operationId, {
|
|
844
|
+
phase: 'naming',
|
|
845
|
+
percent: 99,
|
|
846
|
+
message: 'Applying the requested device name…'
|
|
847
|
+
})
|
|
815
848
|
try {
|
|
816
849
|
await matterServer.renameCommissionedNode(nodeId, requestedName)
|
|
817
850
|
} catch (error) {
|
|
@@ -823,8 +856,19 @@ module.exports = (RED) => {
|
|
|
823
856
|
try {
|
|
824
857
|
device = matterServer.getCommissionedNodesDetails().find((item) => String(item.nodeId) === String(nodeId)) || null
|
|
825
858
|
} catch (error) { /* empty */ }
|
|
859
|
+
matterServer.endCommissioningProgress(operationId, {
|
|
860
|
+
phase: 'complete',
|
|
861
|
+
percent: 100,
|
|
862
|
+
message: 'Matter commissioning completed successfully.'
|
|
863
|
+
})
|
|
826
864
|
res.json({ nodeId, name: device?.name, productName: device?.productName, vendorName: device?.vendorName, renameError })
|
|
827
865
|
} catch (error) {
|
|
866
|
+
try {
|
|
867
|
+
matterServer?.endCommissioningProgress(operationId, {
|
|
868
|
+
phase: 'error',
|
|
869
|
+
message: `Commissioning failed: ${error.message}`
|
|
870
|
+
})
|
|
871
|
+
} catch (progressError) { /* empty */ }
|
|
828
872
|
const targetHost = req.query.targetHost ? ` targetHost=${req.query.targetHost}` : ''
|
|
829
873
|
RED.log.error(`Err KNXUltimateMatterPair:${targetHost} ${error.stack || error.message}`)
|
|
830
874
|
res.json({ error: error.message })
|
package/nodes/hue-config.js
CHANGED
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
/* eslint-disable no-inner-declarations */
|
|
6
6
|
/* eslint-disable max-len */
|
|
7
7
|
const cloneDeep = require('lodash/cloneDeep')
|
|
8
|
+
const {
|
|
9
|
+
HUE_CONTROLLER_RESOURCE_TYPES,
|
|
10
|
+
buildHueControllerResourceCatalog
|
|
11
|
+
} = require('./utils/hueControllerResourceCatalog')
|
|
8
12
|
// const classHUE = require("./utils/hueEngine").classHUE;
|
|
9
13
|
const hueColorConverter = require('./utils/colorManipulators/hueColorConverter')
|
|
10
14
|
|
|
@@ -355,6 +359,15 @@ module.exports = (RED) => {
|
|
|
355
359
|
}
|
|
356
360
|
}
|
|
357
361
|
if (node.hueAllResources === undefined) return
|
|
362
|
+
if (_rtype === 'hue_controller') {
|
|
363
|
+
const resourceResults = await Promise.all(HUE_CONTROLLER_RESOURCE_TYPES.map(async (resourceType) => {
|
|
364
|
+
const result = await node.getResources(resourceType)
|
|
365
|
+
return [resourceType, Array.isArray(result?.devices) ? result.devices : []]
|
|
366
|
+
}))
|
|
367
|
+
return {
|
|
368
|
+
devices: buildHueControllerResourceCatalog(Object.fromEntries(resourceResults))
|
|
369
|
+
}
|
|
370
|
+
}
|
|
358
371
|
// Returns capitalized string
|
|
359
372
|
function capStr (s) {
|
|
360
373
|
if (typeof s !== 'string') return ''
|
package/nodes/knxUltimate.html
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
<!-- <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/jquery.searchableSelect.js"></script> -->
|
|
2
2
|
|
|
3
3
|
<style>
|
|
4
|
-
/* Monaco editor - first area (input to bus): light green */
|
|
5
|
-
#sendMsgToKNXCode-editor .monaco-editor,
|
|
6
|
-
#sendMsgToKNXCode-editor .monaco-editor-background,
|
|
7
|
-
#sendMsgToKNXCode-editor .monaco-editor .margin,
|
|
8
|
-
#sendMsgToKNXCode-editor .monaco-editor .overflow-guard,
|
|
9
|
-
#sendMsgToKNXCode-editor .monaco-editor .lines-content,
|
|
10
|
-
#sendMsgToKNXCode-editor .monaco-editor .editor-scrollable {
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
#receiveMsgFromKNXCode-editor .monaco-editor
|
|
16
|
-
#receiveMsgFromKNXCode-editor .monaco-editor
|
|
17
|
-
#receiveMsgFromKNXCode-editor .monaco-editor .
|
|
18
|
-
#receiveMsgFromKNXCode-editor .monaco-editor .
|
|
19
|
-
#receiveMsgFromKNXCode-editor .monaco-editor .
|
|
20
|
-
|
|
21
|
-
|
|
4
|
+
/* Monaco editor - first area (input to bus): light green */
|
|
5
|
+
#sendMsgToKNXCode-editor .monaco-editor,
|
|
6
|
+
#sendMsgToKNXCode-editor .monaco-editor-background,
|
|
7
|
+
#sendMsgToKNXCode-editor .monaco-editor .margin,
|
|
8
|
+
#sendMsgToKNXCode-editor .monaco-editor .overflow-guard,
|
|
9
|
+
#sendMsgToKNXCode-editor .monaco-editor .lines-content,
|
|
10
|
+
#sendMsgToKNXCode-editor .monaco-editor .editor-scrollable {
|
|
11
|
+
background-color: #e8f5e9 !important;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Monaco editor - second area (bus to output): light yellow */
|
|
15
|
+
#receiveMsgFromKNXCode-editor .monaco-editor,
|
|
16
|
+
#receiveMsgFromKNXCode-editor .monaco-editor-background,
|
|
17
|
+
#receiveMsgFromKNXCode-editor .monaco-editor .margin,
|
|
18
|
+
#receiveMsgFromKNXCode-editor .monaco-editor .overflow-guard,
|
|
19
|
+
#receiveMsgFromKNXCode-editor .monaco-editor .lines-content,
|
|
20
|
+
#receiveMsgFromKNXCode-editor .monaco-editor .editor-scrollable {
|
|
21
|
+
background-color: #fffde7 !important;
|
|
22
|
+
}
|
|
22
23
|
</style>
|
|
23
24
|
|
|
24
25
|
<script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/htmlUtils.js"></script>
|
|
@@ -76,19 +77,19 @@
|
|
|
76
77
|
return ((this.outputRBE === "true" || this.outputRBE === true) ? "|rbe| " : "") + functionSendMsgToKNXCode + (this.name || this.topic || "KNX Device") + (this.setTopicType === 'str' || this.setTopicType === undefined ? '' : ' [' + (this.setTopicType === 'listenAllGA' ? 'Universal' : this.setTopicType) + ']') + functionreceiveMsgFromKNXCode + ((this.inputRBE === "true" || this.inputRBE === true) ? " |rbe|" : "")
|
|
77
78
|
},
|
|
78
79
|
paletteLabel: "KNX DEVICE",
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
80
|
+
button: {
|
|
81
|
+
enabled: function () {
|
|
82
|
+
return !this.changed;
|
|
83
|
+
},
|
|
84
|
+
visible: function () {
|
|
85
|
+
const isUniversal = this.setTopicType === 'listenAllGA' || this.listenallga === true || this.listenallga === 'true';
|
|
86
|
+
if (isUniversal) return false;
|
|
87
|
+
return this.buttonEnabled === true || this.buttonEnabled === "true";
|
|
88
|
+
},
|
|
89
|
+
onclick: function () {
|
|
90
|
+
const node = this;
|
|
91
|
+
const mode = node.buttonMode || 'toggle';
|
|
92
|
+
const request = { id: node.id, mode };
|
|
92
93
|
if (mode === 'value') {
|
|
93
94
|
request.value = node.buttonStaticValue;
|
|
94
95
|
}
|
|
@@ -148,6 +149,7 @@
|
|
|
148
149
|
|
|
149
150
|
|
|
150
151
|
var node = this;
|
|
152
|
+
let topicPickerMouseDown = false;
|
|
151
153
|
if ($("#node-input-server").val() === "_ADD_") {
|
|
152
154
|
// Node-Red 4.0.x has a bug not selecting the default server node
|
|
153
155
|
try {
|
|
@@ -964,8 +966,20 @@ return msg;`
|
|
|
964
966
|
}
|
|
965
967
|
} catch (e) { }
|
|
966
968
|
}
|
|
967
|
-
}).
|
|
968
|
-
|
|
969
|
+
}).on('mousedown.knxUltimateTopicPicker', function () {
|
|
970
|
+
topicPickerMouseDown = true;
|
|
971
|
+
}).on('focus.knxUltimateTopicPicker', function () {
|
|
972
|
+
if (!topicPickerMouseDown) {
|
|
973
|
+
$(this).autocomplete('search', '');
|
|
974
|
+
}
|
|
975
|
+
}).on('click.knxUltimateTopicPicker', function () {
|
|
976
|
+
topicPickerMouseDown = false;
|
|
977
|
+
const input = this;
|
|
978
|
+
setTimeout(function () {
|
|
979
|
+
$(input).autocomplete('search', '');
|
|
980
|
+
}, 0);
|
|
981
|
+
}).on('blur.knxUltimateTopicPicker', function () {
|
|
982
|
+
topicPickerMouseDown = false;
|
|
969
983
|
}).autocomplete("instance")._renderItem = function (ul, item) {
|
|
970
984
|
const isSecure = !!item.isSecure;
|
|
971
985
|
const colorStyle = isSecure ? 'color: green;' : '';
|
|
@@ -1185,10 +1199,6 @@ return msg;`
|
|
|
1185
1199
|
<input id="node-input-gaSecure" name="node-input-gaSecure" type="hidden" value="false" />
|
|
1186
1200
|
|
|
1187
1201
|
<div class="form-row">
|
|
1188
|
-
<b>KNX Device node</b>
|
|
1189
|
-
<br />
|
|
1190
|
-
<br />
|
|
1191
|
-
|
|
1192
1202
|
<label for="node-input-server">
|
|
1193
1203
|
<i class="fa fa-circle-o"></i> <span data-i18n="knxUltimate.properties.node-input-server"></span>
|
|
1194
1204
|
</label>
|
|
@@ -1209,13 +1219,14 @@ return msg;`
|
|
|
1209
1219
|
<option value="global" data-i18n="knxUltimate.selectlists.SetTopic_global"></option>
|
|
1210
1220
|
<option value="env" data-i18n="knxUltimate.selectlists.SetTopic_env"></option>
|
|
1211
1221
|
</select>
|
|
1212
|
-
|
|
1222
|
+
<input type="text" id="node-input-topic" data-i18n="[placeholder]knxUltimate.placeholder.search"
|
|
1213
1223
|
style="width:180px" />
|
|
1214
1224
|
<span id="gaSecureShield" title="Data Secure" style="display:none;color:green;margin-left:6px;"><i
|
|
1215
1225
|
class="fa fa-shield"></i></span>
|
|
1226
|
+
<input style="flex:1 1 240px; min-width:240px; max-width:240px;" type="text" id="node-input-name"
|
|
1227
|
+
data-i18n="[placeholder]knxUltimate.properties.node-input-name" />
|
|
1216
1228
|
</div>
|
|
1217
1229
|
|
|
1218
|
-
|
|
1219
1230
|
<div class="form-row" id="divDatapointSelection">
|
|
1220
1231
|
<label for="node-input-dpt">
|
|
1221
1232
|
<img
|
|
@@ -1229,19 +1240,10 @@ return msg;`
|
|
|
1229
1240
|
</div>
|
|
1230
1241
|
<div class="form-row">
|
|
1231
1242
|
<span id="dptDetailsContainer" style="display:none;width:100%;">
|
|
1232
|
-
<div id="sampleCodeEditor" class="dpt-details-helplink" style="color:red;margin-bottom:4px;"></div>
|
|
1233
|
-
<div class="node-text-editor" id="example-editor" style="height:
|
|
1243
|
+
<!-- <div id="sampleCodeEditor" class="dpt-details-helplink" style="color:red;margin-bottom:4px;"></div> -->
|
|
1244
|
+
<div class="node-text-editor" id="example-editor" style="height:110px;padding:0px;"></div>
|
|
1234
1245
|
</span>
|
|
1235
1246
|
</div>
|
|
1236
|
-
<!-- <div class="form-row">
|
|
1237
|
-
<input type="checkbox" id="node-input-listenallga"
|
|
1238
|
-
style="display:inline-block; width:auto; vertical-align:top;" />
|
|
1239
|
-
<label style="width:auto" for="node-input-listenallga">
|
|
1240
|
-
<img
|
|
1241
|
-
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAB7CAAAewgFu0HU+AAAFGmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDMtMjNUMTY6MjM6MjMrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTAzLTIzVDE2OjI1OjM0KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTAzLTIzVDE2OjI1OjM0KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJmNGM3NWVjLTIwNGYtNGY1YS05YTMxLTQ5NTU5YWJmZDE4NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiZjRjNzVlYy0yMDRmLTRmNWEtOWEzMS00OTU1OWFiZmQxODUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiZjRjNzVlYy0yMDRmLTRmNWEtOWEzMS00OTU1OWFiZmQxODUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJmNGM3NWVjLTIwNGYtNGY1YS05YTMxLTQ5NTU5YWJmZDE4NSIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yM1QxNjoyMzoyMyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjEgKE1hY2ludG9zaCkiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+nhtLUgAAAE9JREFUKJG1UMsOACAIgub//7IdqvVQtjrExU1EEQLuiGCvgTNgl5D74MmVZPu4wIxQAgm+/sDec2VhgQPgf0sq1unjMlYJE/3MZrvy+kMFZQkZEWfC7ikAAAAASUVORK5CYII="></img>
|
|
1242
|
-
<span data-i18n="knxUltimate.properties.node-input-listenallga"></span>
|
|
1243
|
-
</label>
|
|
1244
|
-
</div> -->
|
|
1245
1247
|
<div id="tabs">
|
|
1246
1248
|
<ul>
|
|
1247
1249
|
<li><a href="#tabs-1"><i class="fa fa-braille"></i> Advanced options</a></li>
|
|
@@ -1254,14 +1256,6 @@ return msg;`
|
|
|
1254
1256
|
<i class="fa fa-desktop"></i> General properties
|
|
1255
1257
|
</dt>
|
|
1256
1258
|
</div>
|
|
1257
|
-
<div class="form-row">
|
|
1258
|
-
<label style="width:180px" for="node-input-name">
|
|
1259
|
-
<i class="fa fa-tag"></i>
|
|
1260
|
-
<span data-i18n="knxUltimate.properties.node-input-name"></span>
|
|
1261
|
-
</label>
|
|
1262
|
-
<input style="flex:1 1 240px; min-width:240px; max-width:240px;" type="text" id="node-input-name"
|
|
1263
|
-
data-i18n="[placeholder]knxUltimate.properties.node-input-name" />
|
|
1264
|
-
</div>
|
|
1265
1259
|
<div class="form-row" id="divTopic">
|
|
1266
1260
|
<label style="width:180px" for="node-input-outputtopic">
|
|
1267
1261
|
<i class="fa fa-tasks"></i>
|