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.
Files changed (42) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/nodes/commonFunctions.js +46 -2
  3. package/nodes/hue-config.js +13 -0
  4. package/nodes/knxUltimate.html +52 -58
  5. package/nodes/knxUltimateHueController.html +246 -35
  6. package/nodes/knxUltimateMatterControllerDevice.html +15 -3
  7. package/nodes/locales/de/knxUltimate.html +1 -1
  8. package/nodes/locales/de/knxUltimateHueController.html +3 -2
  9. package/nodes/locales/de/knxUltimateHueController.json +7 -0
  10. package/nodes/locales/de/knxUltimateMatterControllerDevice.html +2 -0
  11. package/nodes/locales/de/matter-config.html +1 -1
  12. package/nodes/locales/en/knxUltimate.html +1 -1
  13. package/nodes/locales/en/knxUltimateHueController.html +3 -2
  14. package/nodes/locales/en/knxUltimateHueController.json +7 -0
  15. package/nodes/locales/en/knxUltimateMatterControllerDevice.html +2 -0
  16. package/nodes/locales/en/matter-config.html +1 -1
  17. package/nodes/locales/es/knxUltimate.html +1 -1
  18. package/nodes/locales/es/knxUltimateHueController.html +3 -2
  19. package/nodes/locales/es/knxUltimateHueController.json +7 -0
  20. package/nodes/locales/es/knxUltimateMatterControllerDevice.html +2 -0
  21. package/nodes/locales/es/matter-config.html +1 -1
  22. package/nodes/locales/fr/knxUltimate.html +1 -1
  23. package/nodes/locales/fr/knxUltimateHueController.html +3 -2
  24. package/nodes/locales/fr/knxUltimateHueController.json +7 -0
  25. package/nodes/locales/fr/knxUltimateMatterControllerDevice.html +2 -0
  26. package/nodes/locales/fr/matter-config.html +1 -1
  27. package/nodes/locales/it/knxUltimate.html +1 -1
  28. package/nodes/locales/it/knxUltimateHueController.html +3 -2
  29. package/nodes/locales/it/knxUltimateHueController.json +7 -0
  30. package/nodes/locales/it/knxUltimateMatterControllerDevice.html +2 -0
  31. package/nodes/locales/it/matter-config.html +1 -1
  32. package/nodes/locales/zh-CN/knxUltimate.html +1 -1
  33. package/nodes/locales/zh-CN/knxUltimateHueController.html +3 -2
  34. package/nodes/locales/zh-CN/knxUltimateHueController.json +7 -0
  35. package/nodes/locales/zh-CN/knxUltimateMatterControllerDevice.html +2 -0
  36. package/nodes/locales/zh-CN/matter-config.html +1 -1
  37. package/nodes/matter-config.html +67 -6
  38. package/nodes/matter-config.js +51 -0
  39. package/nodes/utils/hueControllerResourceCatalog.js +71 -0
  40. package/nodes/utils/matterEngine.mjs +111 -2
  41. package/package.json +1 -1
  42. 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.3** - August 2026<br/>
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/>
@@ -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
- const matterServer = RED.nodes.getNode(req.query.serverId)
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
- const nodeId = await matterServer.commission(req.query.code, { targetHost: req.query.targetHost })
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 })
@@ -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 ''
@@ -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
- background-color: #e8f5e9 !important;
12
- }
13
- /* Monaco editor - second area (bus to output): light yellow */
14
- #receiveMsgFromKNXCode-editor .monaco-editor,
15
- #receiveMsgFromKNXCode-editor .monaco-editor-background,
16
- #receiveMsgFromKNXCode-editor .monaco-editor .margin,
17
- #receiveMsgFromKNXCode-editor .monaco-editor .overflow-guard,
18
- #receiveMsgFromKNXCode-editor .monaco-editor .lines-content,
19
- #receiveMsgFromKNXCode-editor .monaco-editor .editor-scrollable {
20
- background-color: #fffde7 !important;
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
- button: {
80
- enabled: function () {
81
- return !this.changed;
82
- },
83
- visible: function () {
84
- const isUniversal = this.setTopicType === 'listenAllGA' || this.listenallga === true || this.listenallga === 'true';
85
- if (isUniversal) return false;
86
- return this.buttonEnabled === true || this.buttonEnabled === "true";
87
- },
88
- onclick: function () {
89
- const node = this;
90
- const mode = node.buttonMode || 'toggle';
91
- const request = { id: node.id, mode };
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
- }).focus(function () {
968
- $(this).autocomplete('search', $(this).val() + 'exactmatch');
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
- <input type="text" id="node-input-topic" data-i18n="[placeholder]knxUltimate.placeholder.search"
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:200px;min-height:150px;padding:0px;"></div>
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>