node-red-contrib-knx-ultimate 7.0.3 → 7.1.0-beta.0

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 (212) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +2 -0
  3. package/examples/HA Translator - Payload Conversion.json +18 -8
  4. package/examples/KNX Utility - All functions.json +389 -0
  5. package/nodes/commonFunctions.js +5 -4
  6. package/nodes/knxUltimateAlerter.html +15 -4
  7. package/nodes/knxUltimateAutoResponder.html +15 -4
  8. package/nodes/knxUltimateDateTime.html +16 -5
  9. package/nodes/knxUltimateDateTime.js +2 -26
  10. package/nodes/knxUltimateGarage.html +15 -4
  11. package/nodes/knxUltimateGlobalContext.html +15 -4
  12. package/nodes/knxUltimateHATranslator.html +15 -4
  13. package/nodes/knxUltimateHueController.html +3 -4
  14. package/nodes/knxUltimateLoadControl.html +15 -4
  15. package/nodes/knxUltimateLogger.html +15 -4
  16. package/nodes/knxUltimateSceneController.html +15 -4
  17. package/nodes/knxUltimateStaircase.html +15 -4
  18. package/nodes/knxUltimateUtility.html +325 -0
  19. package/nodes/knxUltimateUtility.js +24 -0
  20. package/nodes/knxUltimateViewer.html +16 -3
  21. package/nodes/knxUltimateViewer.js +106 -27
  22. package/nodes/knxUltimateWatchDog.html +15 -4
  23. package/nodes/locales/de/knxUltimateAlerter.html +2 -0
  24. package/nodes/locales/de/knxUltimateAlerter.json +5 -3
  25. package/nodes/locales/de/knxUltimateAutoResponder.html +2 -0
  26. package/nodes/locales/de/knxUltimateAutoResponder.json +4 -2
  27. package/nodes/locales/de/knxUltimateDateTime.html +2 -0
  28. package/nodes/locales/de/knxUltimateDateTime.json +5 -3
  29. package/nodes/locales/de/knxUltimateGarage.html +2 -0
  30. package/nodes/locales/de/knxUltimateGarage.json +5 -2
  31. package/nodes/locales/de/knxUltimateGlobalContext.html +2 -0
  32. package/nodes/locales/de/knxUltimateGlobalContext.json +21 -18
  33. package/nodes/locales/de/knxUltimateHATranslator.html +2 -0
  34. package/nodes/locales/de/knxUltimateHATranslator.json +4 -2
  35. package/nodes/locales/de/knxUltimateHueController.html +2 -1
  36. package/nodes/locales/de/knxUltimateHueController.json +4 -3
  37. package/nodes/locales/de/knxUltimateLoadControl.html +2 -0
  38. package/nodes/locales/de/knxUltimateLoadControl.json +5 -2
  39. package/nodes/locales/de/knxUltimateLogger.html +2 -0
  40. package/nodes/locales/de/knxUltimateLogger.json +6 -3
  41. package/nodes/locales/de/knxUltimateSceneController.html +2 -0
  42. package/nodes/locales/de/knxUltimateSceneController.json +8 -6
  43. package/nodes/locales/de/knxUltimateStaircase.html +2 -0
  44. package/nodes/locales/de/knxUltimateStaircase.json +5 -2
  45. package/nodes/locales/de/knxUltimateUtility.html +922 -0
  46. package/nodes/locales/de/knxUltimateUtility.json +56 -0
  47. package/nodes/locales/de/knxUltimateViewer.html +19 -453
  48. package/nodes/locales/de/knxUltimateViewer.json +9 -1
  49. package/nodes/locales/de/knxUltimateWatchDog.html +2 -0
  50. package/nodes/locales/de/knxUltimateWatchDog.json +5 -2
  51. package/nodes/locales/en/knxUltimateAlerter.html +2 -0
  52. package/nodes/locales/en/knxUltimateAlerter.json +5 -3
  53. package/nodes/locales/en/knxUltimateAutoResponder.html +2 -0
  54. package/nodes/locales/en/knxUltimateAutoResponder.json +4 -2
  55. package/nodes/locales/en/knxUltimateDateTime.html +2 -0
  56. package/nodes/locales/en/knxUltimateDateTime.json +5 -3
  57. package/nodes/locales/en/knxUltimateGarage.html +2 -0
  58. package/nodes/locales/en/knxUltimateGarage.json +5 -2
  59. package/nodes/locales/en/knxUltimateGlobalContext.html +2 -0
  60. package/nodes/locales/en/knxUltimateGlobalContext.json +21 -18
  61. package/nodes/locales/en/knxUltimateHATranslator.html +2 -0
  62. package/nodes/locales/en/knxUltimateHATranslator.json +4 -2
  63. package/nodes/locales/en/knxUltimateHueController.html +2 -1
  64. package/nodes/locales/en/knxUltimateHueController.json +4 -3
  65. package/nodes/locales/en/knxUltimateLoadControl.html +2 -0
  66. package/nodes/locales/en/knxUltimateLoadControl.json +5 -2
  67. package/nodes/locales/en/knxUltimateLogger.html +2 -0
  68. package/nodes/locales/en/knxUltimateLogger.json +6 -3
  69. package/nodes/locales/en/knxUltimateSceneController.html +2 -0
  70. package/nodes/locales/en/knxUltimateSceneController.json +15 -14
  71. package/nodes/locales/en/knxUltimateStaircase.html +2 -0
  72. package/nodes/locales/en/knxUltimateStaircase.json +5 -2
  73. package/nodes/locales/en/knxUltimateUtility.html +1100 -0
  74. package/nodes/locales/en/knxUltimateUtility.json +56 -0
  75. package/nodes/locales/en/knxUltimateViewer.html +18 -457
  76. package/nodes/locales/en/knxUltimateViewer.json +9 -1
  77. package/nodes/locales/en/knxUltimateWatchDog.html +2 -0
  78. package/nodes/locales/en/knxUltimateWatchDog.json +5 -3
  79. package/nodes/locales/es/knxUltimateAlerter.html +2 -0
  80. package/nodes/locales/es/knxUltimateAlerter.json +5 -2
  81. package/nodes/locales/es/knxUltimateAutoResponder.html +2 -0
  82. package/nodes/locales/es/knxUltimateAutoResponder.json +4 -1
  83. package/nodes/locales/es/knxUltimateDateTime.html +2 -0
  84. package/nodes/locales/es/knxUltimateDateTime.json +5 -3
  85. package/nodes/locales/es/knxUltimateGarage.html +2 -0
  86. package/nodes/locales/es/knxUltimateGarage.json +5 -2
  87. package/nodes/locales/es/knxUltimateGlobalContext.html +2 -0
  88. package/nodes/locales/es/knxUltimateGlobalContext.json +5 -2
  89. package/nodes/locales/es/knxUltimateHATranslator.html +2 -0
  90. package/nodes/locales/es/knxUltimateHATranslator.json +4 -1
  91. package/nodes/locales/es/knxUltimateHueController.html +2 -1
  92. package/nodes/locales/es/knxUltimateHueController.json +4 -3
  93. package/nodes/locales/es/knxUltimateLoadControl.html +2 -0
  94. package/nodes/locales/es/knxUltimateLoadControl.json +5 -2
  95. package/nodes/locales/es/knxUltimateLogger.html +2 -0
  96. package/nodes/locales/es/knxUltimateLogger.json +5 -2
  97. package/nodes/locales/es/knxUltimateSceneController.html +2 -0
  98. package/nodes/locales/es/knxUltimateSceneController.json +5 -2
  99. package/nodes/locales/es/knxUltimateStaircase.html +2 -0
  100. package/nodes/locales/es/knxUltimateStaircase.json +5 -2
  101. package/nodes/locales/es/knxUltimateUtility.html +1080 -0
  102. package/nodes/locales/es/knxUltimateUtility.json +56 -0
  103. package/nodes/locales/es/knxUltimateViewer.html +18 -450
  104. package/nodes/locales/es/knxUltimateViewer.json +16 -8
  105. package/nodes/locales/es/knxUltimateWatchDog.html +2 -0
  106. package/nodes/locales/es/knxUltimateWatchDog.json +5 -2
  107. package/nodes/locales/fr/knxUltimateAlerter.html +2 -0
  108. package/nodes/locales/fr/knxUltimateAlerter.json +5 -2
  109. package/nodes/locales/fr/knxUltimateAutoResponder.html +2 -0
  110. package/nodes/locales/fr/knxUltimateAutoResponder.json +4 -1
  111. package/nodes/locales/fr/knxUltimateDateTime.html +2 -0
  112. package/nodes/locales/fr/knxUltimateDateTime.json +5 -3
  113. package/nodes/locales/fr/knxUltimateGarage.html +2 -0
  114. package/nodes/locales/fr/knxUltimateGarage.json +5 -2
  115. package/nodes/locales/fr/knxUltimateGlobalContext.html +2 -0
  116. package/nodes/locales/fr/knxUltimateGlobalContext.json +5 -2
  117. package/nodes/locales/fr/knxUltimateHATranslator.html +2 -0
  118. package/nodes/locales/fr/knxUltimateHATranslator.json +4 -1
  119. package/nodes/locales/fr/knxUltimateHueController.html +2 -1
  120. package/nodes/locales/fr/knxUltimateHueController.json +4 -3
  121. package/nodes/locales/fr/knxUltimateLoadControl.html +2 -0
  122. package/nodes/locales/fr/knxUltimateLoadControl.json +5 -2
  123. package/nodes/locales/fr/knxUltimateLogger.html +2 -0
  124. package/nodes/locales/fr/knxUltimateLogger.json +5 -2
  125. package/nodes/locales/fr/knxUltimateSceneController.html +2 -0
  126. package/nodes/locales/fr/knxUltimateSceneController.json +5 -2
  127. package/nodes/locales/fr/knxUltimateStaircase.html +2 -0
  128. package/nodes/locales/fr/knxUltimateStaircase.json +5 -2
  129. package/nodes/locales/fr/knxUltimateUtility.html +1081 -0
  130. package/nodes/locales/fr/knxUltimateUtility.json +56 -0
  131. package/nodes/locales/fr/knxUltimateViewer.html +18 -450
  132. package/nodes/locales/fr/knxUltimateViewer.json +16 -8
  133. package/nodes/locales/fr/knxUltimateWatchDog.html +2 -0
  134. package/nodes/locales/fr/knxUltimateWatchDog.json +5 -2
  135. package/nodes/locales/it/knxUltimateAlerter.html +2 -0
  136. package/nodes/locales/it/knxUltimateAlerter.json +5 -3
  137. package/nodes/locales/it/knxUltimateAutoResponder.html +2 -0
  138. package/nodes/locales/it/knxUltimateAutoResponder.json +4 -2
  139. package/nodes/locales/it/knxUltimateDateTime.html +2 -0
  140. package/nodes/locales/it/knxUltimateDateTime.json +5 -3
  141. package/nodes/locales/it/knxUltimateGarage.html +2 -0
  142. package/nodes/locales/it/knxUltimateGarage.json +5 -2
  143. package/nodes/locales/it/knxUltimateGlobalContext.html +2 -0
  144. package/nodes/locales/it/knxUltimateGlobalContext.json +21 -18
  145. package/nodes/locales/it/knxUltimateHATranslator.html +2 -0
  146. package/nodes/locales/it/knxUltimateHATranslator.json +4 -2
  147. package/nodes/locales/it/knxUltimateHueController.html +2 -1
  148. package/nodes/locales/it/knxUltimateHueController.json +4 -3
  149. package/nodes/locales/it/knxUltimateLoadControl.html +2 -0
  150. package/nodes/locales/it/knxUltimateLoadControl.json +5 -2
  151. package/nodes/locales/it/knxUltimateLogger.html +2 -0
  152. package/nodes/locales/it/knxUltimateLogger.json +6 -3
  153. package/nodes/locales/it/knxUltimateSceneController.html +2 -0
  154. package/nodes/locales/it/knxUltimateSceneController.json +8 -7
  155. package/nodes/locales/it/knxUltimateStaircase.html +2 -0
  156. package/nodes/locales/it/knxUltimateStaircase.json +5 -2
  157. package/nodes/locales/it/knxUltimateUtility.html +959 -0
  158. package/nodes/locales/it/knxUltimateUtility.json +56 -0
  159. package/nodes/locales/it/knxUltimateViewer.html +19 -453
  160. package/nodes/locales/it/knxUltimateViewer.json +9 -1
  161. package/nodes/locales/it/knxUltimateWatchDog.html +2 -0
  162. package/nodes/locales/it/knxUltimateWatchDog.json +6 -6
  163. package/nodes/locales/zh-CN/knxUltimateAlerter.html +2 -0
  164. package/nodes/locales/zh-CN/knxUltimateAlerter.json +5 -3
  165. package/nodes/locales/zh-CN/knxUltimateAutoResponder.html +2 -0
  166. package/nodes/locales/zh-CN/knxUltimateAutoResponder.json +4 -2
  167. package/nodes/locales/zh-CN/knxUltimateDateTime.html +2 -0
  168. package/nodes/locales/zh-CN/knxUltimateDateTime.json +5 -3
  169. package/nodes/locales/zh-CN/knxUltimateGarage.html +2 -0
  170. package/nodes/locales/zh-CN/knxUltimateGarage.json +5 -2
  171. package/nodes/locales/zh-CN/knxUltimateGlobalContext.html +2 -0
  172. package/nodes/locales/zh-CN/knxUltimateGlobalContext.json +21 -18
  173. package/nodes/locales/zh-CN/knxUltimateHATranslator.html +2 -0
  174. package/nodes/locales/zh-CN/knxUltimateHATranslator.json +4 -2
  175. package/nodes/locales/zh-CN/knxUltimateHueController.html +2 -1
  176. package/nodes/locales/zh-CN/knxUltimateHueController.json +4 -3
  177. package/nodes/locales/zh-CN/knxUltimateLoadControl.html +2 -0
  178. package/nodes/locales/zh-CN/knxUltimateLoadControl.json +5 -2
  179. package/nodes/locales/zh-CN/knxUltimateLogger.html +2 -0
  180. package/nodes/locales/zh-CN/knxUltimateLogger.json +6 -3
  181. package/nodes/locales/zh-CN/knxUltimateSceneController.html +2 -0
  182. package/nodes/locales/zh-CN/knxUltimateSceneController.json +12 -10
  183. package/nodes/locales/zh-CN/knxUltimateStaircase.html +2 -0
  184. package/nodes/locales/zh-CN/knxUltimateStaircase.json +5 -2
  185. package/nodes/locales/zh-CN/knxUltimateUtility.html +930 -0
  186. package/nodes/locales/zh-CN/knxUltimateUtility.json +56 -0
  187. package/nodes/locales/zh-CN/knxUltimateViewer.html +19 -452
  188. package/nodes/locales/zh-CN/knxUltimateViewer.json +9 -1
  189. package/nodes/locales/zh-CN/knxUltimateWatchDog.html +2 -0
  190. package/nodes/locales/zh-CN/knxUltimateWatchDog.json +5 -3
  191. package/nodes/plugins/knxUltimateViewer-vue/assets/app.css +1 -1
  192. package/nodes/plugins/knxUltimateViewer-vue/assets/app.js +2 -2
  193. package/nodes/utils/knxDateTimeSendNow.js +30 -0
  194. package/nodes/utils/knxUtilityProfileAdapter.js +66 -0
  195. package/nodes/utils/knxUtilityProfiles/runtime/alerter.js +305 -0
  196. package/nodes/utils/knxUtilityProfiles/runtime/autoresponder.js +266 -0
  197. package/nodes/utils/knxUtilityProfiles/runtime/datetime.js +279 -0
  198. package/nodes/utils/knxUtilityProfiles/runtime/garage.js +513 -0
  199. package/nodes/utils/knxUtilityProfiles/runtime/globalcontext.js +218 -0
  200. package/nodes/utils/knxUtilityProfiles/runtime/hatranslator.js +95 -0
  201. package/nodes/utils/knxUtilityProfiles/runtime/loadcontrol.js +448 -0
  202. package/nodes/utils/knxUtilityProfiles/runtime/logger.js +233 -0
  203. package/nodes/utils/knxUtilityProfiles/runtime/profileTimers.js +35 -0
  204. package/nodes/utils/knxUtilityProfiles/runtime/scenecontroller.js +487 -0
  205. package/nodes/utils/knxUtilityProfiles/runtime/staircase.js +472 -0
  206. package/nodes/utils/knxUtilityProfiles/runtime/watchdog.js +240 -0
  207. package/nodes/utils/knxViewerHistory.js +424 -0
  208. package/package.json +9 -6
  209. package/resources/flowMigrationBackup.js +81 -0
  210. package/resources/hueControllerMigrationDialog.js +15 -4
  211. package/resources/knxUtilityMigration.js +276 -0
  212. package/resources/knxUtilityProfiles.js +2488 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,17 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 7.1.0-beta.0** - September 2026<br/>
10
+
11
+ - New **KNX Utility** node with eleven functions, including Home Assistant Translator, and conversion of legacy nodes.<br/>
12
+ - Automatic flow backup before converting KNX and HUE nodes.<br/>
13
+ - Simple **KNX Viewer** telegram list with 24-hour history saved to file.<br/>
14
+ - KNX Engine updated to 6.0.6.<br/>
15
+
16
+ **Version 7.0.4** - September 2026<br/>
17
+
18
+ - KNX Engine bump to 6.0.5.<br/>
19
+
9
20
  **Version 7.0.3** - September 2026<br/>
10
21
 
11
22
  - Fixed some wrong translations.<br/>
package/README.md CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
  KNX Ultimate is the most advanced KNX integration for Node-RED, providing secure KNX/IP communication, routing, ETS project import, Philips Hue, Matter Controller and Matter Bridge (control matter device via KNX and expose KNX GA via Matter), MQTT, diagnostics, virtual devices, and powerful automation nodes. Build professional, reliable, and scalable smart home and building automation projects with minimal effort.
10
10
 
11
+ **KNX Utility** brings eleven functions into one palette node: Alerter, AutoResponder, DateTime, WatchDog, GlobalContext, Logger, Staircase, Garage, SceneController, LoadControl and Home Assistant Translator. Select a function to get its editor, icon and ports; KNX Device remains the main node. Home Assistant Translator converts message values to booleans without requiring a KNX gateway. Existing dedicated nodes continue to work. The migration button converts all compatible nodes in every flow and subflow, preserving IDs, settings, connections, saved scenes and values. Before KNX or HUE conversion, the browser automatically starts downloading a dated JSON backup of all current editor flows using the standard Node-RED export format, without declared credentials. Conversion supports a single Undo and waits for you to Deploy. See the [KNX Utility guide](https://supergiovane.github.io/node-red-contrib-knx-ultimate/wiki/KNX-Utility), localized node help and the [example flow with all eleven functions](examples/KNX%20Utility%20-%20All%20functions.json).
11
12
 
13
+ **KNX Viewer** opens a simple ETS-style list of group address state changes, with time, telegram type (Read, Write, Response), source, GA, name, DPT, previous value and new value. Read requests are also recorded, without changing the last known GA value. Search the history or pause the live view; the node keeps recording to local files and retains the last 24 hours across Node-RED restarts. See the [KNX Viewer guide](https://supergiovane.github.io/node-red-contrib-knx-ultimate/wiki/knxUltimateViewer).
12
14
 
13
15
  The former bundled AI assistant has moved to the standalone [Cerebrum Ultimate](https://github.com/Supergiovane/node-red-contrib-cerebrum-ultimate) package. Cerebrum Ultimate now provides the conversational, learning and supervised home-intelligence features, while using KNX Ultimate as an optional compatible integration. Hidden legacy runtime types remain in this package only so existing Node-RED flows continue to load; new installations should add the Cerebrum node from the standalone package.
14
16
 
@@ -2,7 +2,7 @@
2
2
  {
3
3
  "id": "ha_tab",
4
4
  "type": "tab",
5
- "label": "KNX HA Translator",
5
+ "label": "KNX Utility - HA Translator",
6
6
  "disabled": false,
7
7
  "info": ""
8
8
  },
@@ -11,25 +11,29 @@
11
11
  "type": "comment",
12
12
  "z": "ha_tab",
13
13
  "name": "Translate Home Assistant-like strings to booleans",
14
- "info": "",
14
+ "info": "Home Assistant Translator runs inside KNX Utility with no gateway. Deploy this example and click an inject button: the output payload is converted to a boolean, preserving the other message fields.",
15
15
  "x": 350,
16
16
  "y": 60,
17
17
  "wires": []
18
18
  },
19
19
  {
20
20
  "id": "ha_node",
21
- "type": "knxUltimateHATranslator",
21
+ "type": "knxUltimateUtility",
22
22
  "z": "ha_tab",
23
23
  "name": "HA Translator",
24
24
  "payloadPropName": "payload",
25
- "commandText": "on:true\noff:false\nopen:true\nclosed:false\nhome:true\nnot_home:false",
26
25
  "x": 560,
27
26
  "y": 220,
28
27
  "wires": [
29
28
  [
30
29
  "ha_dbg"
31
30
  ]
32
- ]
31
+ ],
32
+ "utilityType": "hatranslator",
33
+ "inputs": 1,
34
+ "outputs": 1,
35
+ "server": "",
36
+ "haTranslationTable": "on:true\noff:false\nopen:true\nclosed:false\nhome:true\nnot_home:false"
33
37
  },
34
38
  {
35
39
  "id": "ha_on",
@@ -51,7 +55,9 @@
51
55
  "x": 180,
52
56
  "y": 180,
53
57
  "wires": [
54
- "ha_node"
58
+ [
59
+ "ha_node"
60
+ ]
55
61
  ]
56
62
  },
57
63
  {
@@ -74,7 +80,9 @@
74
80
  "x": 180,
75
81
  "y": 220,
76
82
  "wires": [
77
- "ha_node"
83
+ [
84
+ "ha_node"
85
+ ]
78
86
  ]
79
87
  },
80
88
  {
@@ -97,7 +105,9 @@
97
105
  "x": 180,
98
106
  "y": 260,
99
107
  "wires": [
100
- "ha_node"
108
+ [
109
+ "ha_node"
110
+ ]
101
111
  ]
102
112
  },
103
113
  {
@@ -0,0 +1,389 @@
1
+ [
2
+ {
3
+ "id": "utility-examples",
4
+ "type": "tab",
5
+ "label": "KNX Utility examples"
6
+ },
7
+ {
8
+ "id": "utility-guide",
9
+ "type": "comment",
10
+ "z": "utility-examples",
11
+ "name": "Configure a KNX gateway for bus functions; Translator works without one",
12
+ "info": "Each KNX Utility instance has one function. This flow shows all eleven functions. Select a gateway and configure addresses for bus functions before deploying. Home Assistant Translator converts message values without a gateway; see the HA Translator - Payload Conversion example for a ready-to-run flow. Alerter has three outputs, Logger has two, and AutoResponder, DateTime and GlobalContext have no flow ports. GlobalContext uses its name for global variables, so keep KNXGlobalContext or choose letters only. AutoResponder starts with an empty list. DateTime schedules and Logger automatic output timers are disabled; WatchDog automatic start is disabled. No example supplies KNX group addresses. LoadControl uses message control. Read the selected function help before enabling it.",
13
+ "x": 340,
14
+ "y": 80,
15
+ "wires": []
16
+ },
17
+ {
18
+ "id": "utility-alert",
19
+ "type": "knxUltimateUtility",
20
+ "z": "utility-examples",
21
+ "name": "Alerter",
22
+ "utilityType": "alerter",
23
+ "server": "",
24
+ "inputs": 1,
25
+ "outputs": 3,
26
+ "rules": [],
27
+ "whentostart": "ifnewalert",
28
+ "timerinterval": "2",
29
+ "initialreadGAInRules": "1",
30
+ "x": 180,
31
+ "y": 180,
32
+ "wires": [
33
+ [
34
+ "utility-debug-each"
35
+ ],
36
+ [
37
+ "utility-debug-all"
38
+ ],
39
+ [
40
+ "utility-debug-last"
41
+ ]
42
+ ]
43
+ },
44
+ {
45
+ "id": "utility-response",
46
+ "type": "knxUltimateUtility",
47
+ "z": "utility-examples",
48
+ "name": "AutoResponder",
49
+ "utilityType": "autoresponder",
50
+ "server": "",
51
+ "inputs": 0,
52
+ "outputs": 0,
53
+ "commandText": "[]",
54
+ "x": 190,
55
+ "y": 340,
56
+ "wires": []
57
+ },
58
+ {
59
+ "id": "utility-datetime",
60
+ "type": "knxUltimateUtility",
61
+ "z": "utility-examples",
62
+ "name": "Date / Time",
63
+ "utilityType": "datetime",
64
+ "server": "",
65
+ "inputs": 0,
66
+ "outputs": 0,
67
+ "gaDateTime": "",
68
+ "gaDate": "",
69
+ "gaTime": "",
70
+ "dptDateTime": "19.001",
71
+ "dptDate": "11.001",
72
+ "dptTime": "10.001",
73
+ "sendOnDeploy": false,
74
+ "sendOnDeployDelay": 30,
75
+ "periodicSend": false,
76
+ "periodicSendInterval": 60,
77
+ "periodicSendUnit": "m",
78
+ "x": 190,
79
+ "y": 400,
80
+ "wires": []
81
+ },
82
+ {
83
+ "id": "utility-debug-each",
84
+ "type": "debug",
85
+ "z": "utility-examples",
86
+ "name": "Each alerted device",
87
+ "active": true,
88
+ "tosidebar": true,
89
+ "console": false,
90
+ "tostatus": false,
91
+ "complete": "true",
92
+ "targetType": "full",
93
+ "statusVal": "",
94
+ "statusType": "auto",
95
+ "x": 470,
96
+ "y": 140,
97
+ "wires": []
98
+ },
99
+ {
100
+ "id": "utility-debug-all",
101
+ "type": "debug",
102
+ "z": "utility-examples",
103
+ "name": "All alerted devices",
104
+ "active": true,
105
+ "tosidebar": true,
106
+ "console": false,
107
+ "tostatus": false,
108
+ "complete": "true",
109
+ "targetType": "full",
110
+ "statusVal": "",
111
+ "statusType": "auto",
112
+ "x": 470,
113
+ "y": 200,
114
+ "wires": []
115
+ },
116
+ {
117
+ "id": "utility-debug-last",
118
+ "type": "debug",
119
+ "z": "utility-examples",
120
+ "name": "Last alerted device",
121
+ "active": true,
122
+ "tosidebar": true,
123
+ "console": false,
124
+ "tostatus": false,
125
+ "complete": "true",
126
+ "targetType": "full",
127
+ "statusVal": "",
128
+ "statusType": "auto",
129
+ "x": 470,
130
+ "y": 260,
131
+ "wires": []
132
+ },
133
+ {
134
+ "server": "",
135
+ "topic": "",
136
+ "maxRetry": 6,
137
+ "retryInterval": 10,
138
+ "name": "WatchDog",
139
+ "autoStart": false,
140
+ "listenToKnxUltimateNodeErrors": true,
141
+ "checkLevel": "Ethernet",
142
+ "id": "utility-watchdog",
143
+ "type": "knxUltimateUtility",
144
+ "z": "utility-examples",
145
+ "utilityType": "watchdog",
146
+ "inputs": 1,
147
+ "outputs": 1,
148
+ "x": 200,
149
+ "y": 490,
150
+ "wires": [
151
+ []
152
+ ]
153
+ },
154
+ {
155
+ "server": "",
156
+ "name": "KNXGlobalContext",
157
+ "exposeAsVariable": "exposeAsVariableREADWRITE",
158
+ "writeExecutionInterval": 1000,
159
+ "contextStorage": "",
160
+ "id": "utility-globalcontext",
161
+ "type": "knxUltimateUtility",
162
+ "z": "utility-examples",
163
+ "utilityType": "globalcontext",
164
+ "inputs": 0,
165
+ "outputs": 0,
166
+ "x": 200,
167
+ "y": 560,
168
+ "wires": []
169
+ },
170
+ {
171
+ "server": "",
172
+ "topic": "",
173
+ "intervalCreateETSXML": 15,
174
+ "name": "Logger",
175
+ "autoStartTimerCreateETSXML": false,
176
+ "maxRowsInETSXML": 0,
177
+ "saveMode": "emit",
178
+ "filePath": "",
179
+ "autoStartTimerTelegramCounter": false,
180
+ "intervalTelegramCount": 60,
181
+ "id": "utility-logger",
182
+ "type": "knxUltimateUtility",
183
+ "z": "utility-examples",
184
+ "utilityType": "logger",
185
+ "inputs": 1,
186
+ "outputs": 2,
187
+ "x": 200,
188
+ "y": 630,
189
+ "wires": [
190
+ [],
191
+ []
192
+ ]
193
+ },
194
+ {
195
+ "server": "",
196
+ "name": "Staircase",
197
+ "outputtopic": "",
198
+ "gaTrigger": "",
199
+ "nameTrigger": "",
200
+ "dptTrigger": "1.001",
201
+ "gaOutput": "",
202
+ "nameOutput": "",
203
+ "dptOutput": "1.001",
204
+ "gaStatus": "",
205
+ "nameStatus": "",
206
+ "dptStatus": "1.001",
207
+ "gaOverride": "",
208
+ "nameOverride": "",
209
+ "dptOverride": "1.001",
210
+ "gaBlock": "",
211
+ "nameBlock": "",
212
+ "dptBlock": "1.001",
213
+ "timerSeconds": 120,
214
+ "extendMode": "restart",
215
+ "triggerOffCancels": "yes",
216
+ "preWarnEnable": false,
217
+ "preWarnSeconds": 15,
218
+ "preWarnMode": "status",
219
+ "preWarnFlashMs": 400,
220
+ "blockAction": "off",
221
+ "emitEvents": false,
222
+ "id": "utility-staircase",
223
+ "type": "knxUltimateUtility",
224
+ "z": "utility-examples",
225
+ "utilityType": "staircase",
226
+ "inputs": 1,
227
+ "outputs": 1,
228
+ "x": 200,
229
+ "y": 700,
230
+ "wires": [
231
+ []
232
+ ]
233
+ },
234
+ {
235
+ "server": "",
236
+ "name": "Garage",
237
+ "outputtopic": "",
238
+ "gaCommand": "",
239
+ "nameCommand": "",
240
+ "dptCommand": "1.001",
241
+ "gaImpulse": "",
242
+ "nameImpulse": "",
243
+ "dptImpulse": "1.017",
244
+ "gaHoldOpen": "",
245
+ "nameHoldOpen": "",
246
+ "dptHoldOpen": "1.001",
247
+ "gaDisable": "",
248
+ "nameDisable": "",
249
+ "dptDisable": "1.001",
250
+ "gaPhotocell": "",
251
+ "namePhotocell": "",
252
+ "dptPhotocell": "1.001",
253
+ "gaMoving": "",
254
+ "nameMoving": "",
255
+ "dptMoving": "1.001",
256
+ "gaObstruction": "",
257
+ "nameObstruction": "",
258
+ "dptObstruction": "1.001",
259
+ "autoCloseEnable": true,
260
+ "autoCloseSeconds": 120,
261
+ "emitEvents": false,
262
+ "id": "utility-garage",
263
+ "type": "knxUltimateUtility",
264
+ "z": "utility-examples",
265
+ "utilityType": "garage",
266
+ "inputs": 1,
267
+ "outputs": 1,
268
+ "x": 200,
269
+ "y": 770,
270
+ "wires": [
271
+ []
272
+ ]
273
+ },
274
+ {
275
+ "server": "",
276
+ "name": "Scene Controller",
277
+ "outputtopic": "",
278
+ "topic": "",
279
+ "dpt": "",
280
+ "topicTrigger": "true",
281
+ "topicSave": "",
282
+ "dptSave": "",
283
+ "topicSaveTrigger": "true",
284
+ "rules": [],
285
+ "id": "utility-scenecontroller",
286
+ "type": "knxUltimateUtility",
287
+ "z": "utility-examples",
288
+ "utilityType": "scenecontroller",
289
+ "inputs": 1,
290
+ "outputs": 1,
291
+ "x": 200,
292
+ "y": 840,
293
+ "wires": [
294
+ []
295
+ ]
296
+ },
297
+ {
298
+ "server": "",
299
+ "name": "Load Control",
300
+ "controlMode": "msg",
301
+ "topic": "",
302
+ "dpt": "",
303
+ "wattLimit": 3000,
304
+ "sheddingCheckInterval": 15,
305
+ "sheddingRestoreDelay": 60,
306
+ "GA1": "",
307
+ "DPT1": "",
308
+ "Name1": "",
309
+ "autoRestore1": true,
310
+ "MonitorGA1": "",
311
+ "MonitorDPT1": "",
312
+ "MonitorName1": "",
313
+ "GA2": "",
314
+ "DPT2": "",
315
+ "Name2": "",
316
+ "autoRestore2": true,
317
+ "MonitorGA2": "",
318
+ "MonitorDPT2": "",
319
+ "MonitorName2": "",
320
+ "GA3": "",
321
+ "DPT3": "",
322
+ "Name3": "",
323
+ "autoRestore3": true,
324
+ "MonitorGA3": "",
325
+ "MonitorDPT3": "",
326
+ "MonitorName3": "",
327
+ "GA4": "",
328
+ "DPT4": "",
329
+ "Name4": "",
330
+ "autoRestore4": true,
331
+ "MonitorGA4": "",
332
+ "MonitorDPT4": "",
333
+ "MonitorName4": "",
334
+ "GA5": "",
335
+ "DPT5": "",
336
+ "Name5": "",
337
+ "autoRestore5": true,
338
+ "MonitorGA5": "",
339
+ "MonitorDPT5": "",
340
+ "MonitorName5": "",
341
+ "id": "utility-loadcontrol",
342
+ "type": "knxUltimateUtility",
343
+ "z": "utility-examples",
344
+ "utilityType": "loadcontrol",
345
+ "inputs": 1,
346
+ "outputs": 1,
347
+ "x": 200,
348
+ "y": 910,
349
+ "wires": [
350
+ []
351
+ ]
352
+ },
353
+ {
354
+ "id": "utility-hatranslator",
355
+ "type": "knxUltimateUtility",
356
+ "z": "utility-examples",
357
+ "name": "HA Translator",
358
+ "payloadPropName": "payload",
359
+ "x": 220,
360
+ "y": 1000,
361
+ "wires": [
362
+ [
363
+ "utility-ha-debug"
364
+ ]
365
+ ],
366
+ "utilityType": "hatranslator",
367
+ "inputs": 1,
368
+ "outputs": 1,
369
+ "server": "",
370
+ "haTranslationTable": "on:true\noff:false\nopen:true\nclosed:false\nhome:true\nnot_home:false"
371
+ },
372
+ {
373
+ "id": "utility-ha-debug",
374
+ "type": "debug",
375
+ "z": "utility-examples",
376
+ "name": "Translated HA boolean",
377
+ "active": true,
378
+ "tosidebar": true,
379
+ "console": false,
380
+ "tostatus": false,
381
+ "complete": "true",
382
+ "targetType": "full",
383
+ "statusVal": "",
384
+ "statusType": "auto",
385
+ "x": 520,
386
+ "y": 1000,
387
+ "wires": []
388
+ }
389
+ ]
@@ -3,7 +3,6 @@
3
3
  const oOS = require('os')
4
4
  const fs = require('fs')
5
5
  const path = require('path')
6
- const yaml = require('js-yaml')
7
6
  const dptlib = require('knxultimate').dptlib
8
7
  const customHTTP = require('./utils/http')
9
8
  const KNXClient = require('knxultimate').KNXClient
@@ -281,8 +280,8 @@ module.exports = (RED) => {
281
280
  }
282
281
  })
283
282
 
284
- // 2025-12 Download logger XML file configured in a knxUltimateLogger node
285
- RED.httpAdmin.get('/knxUltimateLoggerDownload', normalizeAuthFromAccessTokenQuery, RED.auth.needsPermission('knxUltimate-config.read'), (req, res) => {
283
+ // Shared Logger download for legacy nodes and the private Utility profile.
284
+ const downloadLoggerFile = (req, res) => {
286
285
  try {
287
286
  const nodeId = (req.query.nodeId || req.query.id || '').toString()
288
287
  if (!nodeId) {
@@ -316,7 +315,9 @@ module.exports = (RED) => {
316
315
  try { RED.log.error(`KNXUltimateLoggerDownload error: ${error.message}`) } catch (e) {}
317
316
  if (!res.headersSent) res.status(500).json({ error: 'UNEXPECTED_ERROR' })
318
317
  }
319
- })
318
+ }
319
+ RED.httpAdmin.get('/knxUltimateLoggerDownload', normalizeAuthFromAccessTokenQuery, RED.auth.needsPermission('knxUltimate-config.read'), downloadLoggerFile)
320
+ RED.httpAdmin.get('/knxUltimateUtility/logger/download', normalizeAuthFromAccessTokenQuery, RED.auth.needsPermission('knxUltimate-config.read'), downloadLoggerFile)
320
321
 
321
322
  // 2025-09 List interfaces (IA) from KNX Secure keyring
322
323
  RED.httpAdmin.get('/knxUltimateKeyringInterfaces', RED.auth.needsPermission('knxUltimate-config.read'), async (req, res) => {
@@ -1,9 +1,11 @@
1
+ <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/flowMigrationBackup.js"></script>
2
+ <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/knxUtilityMigration.js"></script>
1
3
  <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/htmlUtils.js"></script>
2
4
 
3
5
  <script type="text/javascript">
4
6
  RED.nodes.registerType('knxUltimateAlerter', {
5
- category: "KNX Ultimate",
6
- color: '#C7E9C0',
7
+ category: 'deprecated',
8
+ color: '#E5F0E2',
7
9
  defaults: {
8
10
  //buttonState: {value: true},
9
11
  server: { type: "knxUltimate-config", required: false },
@@ -24,9 +26,9 @@
24
26
  },
25
27
  icon: "node-alerter-icon.svg",
26
28
  label: function () {
27
- return (this.outputRBE == true ? "|rbe| " : "") + (this.name || this.topic || "KNX Alerter") + (this.inputRBE == true ? " |rbe|" : "")
29
+ return (this.outputRBE == true ? "|rbe| " : "") + (this.name || this.topic || "KNX Alerter") + (this.inputRBE == true ? " |rbe|" : "") + " (deprecated)"
28
30
  },
29
- paletteLabel: "KNX Alerter",
31
+ paletteLabel: "KNX Alerter (deprecated)",
30
32
  // button: {
31
33
  // enabled: function() {
32
34
  // // return whether or not the button is enabled, based on the current
@@ -191,6 +193,15 @@
191
193
  </script>
192
194
 
193
195
  <script type="text/html" data-template-name="knxUltimateAlerter">
196
+ <div class="form-row knx-utility-legacy-notice" role="note" style="box-sizing:border-box; padding:10px 12px; margin-bottom:12px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;">
197
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
198
+ <span data-i18n="knxUltimateAlerter.legacy_notice"></span>
199
+ </div>
200
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
201
+ <button type="button" class="red-ui-button knx-utility-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff !important; font-weight:700;" data-i18n="[title]knxUltimateAlerter.migration_button_title">
202
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateAlerter.migration_button"></span>
203
+ </button>
204
+ </div>
194
205
  <div class="form-row" style="margin-bottom:10px;">
195
206
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;<a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
196
207
  </div>
@@ -1,9 +1,11 @@
1
+ <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/flowMigrationBackup.js"></script>
2
+ <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/knxUtilityMigration.js"></script>
1
3
  <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/htmlUtils.js"></script>
2
4
 
3
5
  <script type="text/javascript">
4
6
  RED.nodes.registerType('knxUltimateAutoResponder', {
5
- category: "KNX Ultimate",
6
- color: '#C7E9C0',
7
+ category: 'deprecated',
8
+ color: '#E5F0E2',
7
9
  defaults: {
8
10
  //buttonState: {value: true},
9
11
  server: { type: "knxUltimate-config", required: true },
@@ -16,9 +18,9 @@
16
18
  outputs: 0,
17
19
  icon: "node-knx-icon.svg",
18
20
  label: function () {
19
- return (this.name || "KNX Auto Responder");
21
+ return (this.name || "KNX Auto Responder") + " (deprecated)";
20
22
  },
21
- paletteLabel: "KNX Auto Responder",
23
+ paletteLabel: "KNX Auto Responder (deprecated)",
22
24
  // button: {
23
25
  // enabled: function() {
24
26
  // // return whether or not the button is enabled, based on the current
@@ -77,6 +79,15 @@
77
79
  </script>
78
80
 
79
81
  <script type="text/html" data-template-name="knxUltimateAutoResponder">
82
+ <div class="form-row knx-utility-legacy-notice" role="note" style="box-sizing:border-box; padding:10px 12px; margin-bottom:12px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;">
83
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
84
+ <span data-i18n="knxUltimateAutoResponder.legacy_notice"></span>
85
+ </div>
86
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
87
+ <button type="button" class="red-ui-button knx-utility-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff !important; font-weight:700;" data-i18n="[title]knxUltimateAutoResponder.migration_button_title">
88
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateAutoResponder.migration_button"></span>
89
+ </button>
90
+ </div>
80
91
  <div class="form-row" style="margin-bottom:10px;">
81
92
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;<a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
82
93
  </div>
@@ -1,3 +1,5 @@
1
+ <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/flowMigrationBackup.js"></script>
2
+ <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/knxUtilityMigration.js"></script>
1
3
  <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/htmlUtils.js"></script>
2
4
 
3
5
  <script type="text/javascript">
@@ -266,8 +268,8 @@
266
268
  }
267
269
 
268
270
  RED.nodes.registerType('knxUltimateDateTime', {
269
- category: 'KNX Ultimate',
270
- color: '#C7E9C0',
271
+ category: 'deprecated',
272
+ color: '#E5F0E2',
271
273
  defaults: {
272
274
  server: { type: 'knxUltimate-config', required: true },
273
275
  name: { value: '' },
@@ -291,13 +293,13 @@
291
293
  outputs: 0,
292
294
  icon: 'node-knx-icon.svg',
293
295
  label: function () {
294
- return this.name || 'KNX DateTime'
296
+ return (this.name || 'KNX DateTime') + ' (deprecated)'
295
297
  },
296
298
  paletteLabel: function () {
297
299
  try {
298
- return RED._('node-red-contrib-knx-ultimate/knxUltimateDateTime:knxUltimateDateTime.paletteLabel') || 'DateTime'
300
+ return RED._('node-red-contrib-knx-ultimate/knxUltimateDateTime:knxUltimateDateTime.paletteLabel') || 'DateTime (deprecated)'
299
301
  } catch (error) {
300
- return 'DateTime'
302
+ return 'DateTime (deprecated)'
301
303
  }
302
304
  },
303
305
  onadd: function () {
@@ -484,6 +486,15 @@
484
486
  </script>
485
487
 
486
488
  <script type="text/html" data-template-name="knxUltimateDateTime">
489
+ <div class="form-row knx-utility-legacy-notice" role="note" style="box-sizing:border-box; padding:10px 12px; margin-bottom:12px; border-left:4px solid #d79b00; background:#fff8df; color:#4d3a00;">
490
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
491
+ <span data-i18n="knxUltimateDateTime.legacy_notice"></span>
492
+ </div>
493
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
494
+ <button type="button" class="red-ui-button knx-utility-migrate-flow" style="background:#d97706; border-color:#b45309; color:#fff !important; font-weight:700;" data-i18n="[title]knxUltimateDateTime.migration_button_title">
495
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateDateTime.migration_button"></span>
496
+ </button>
497
+ </div>
487
498
  <div class="form-row" style="margin-bottom:10px;">
488
499
  <span style="color:#ff0000"><i class="fa fa-youtube"></i></span>&nbsp;<a target="_blank" href="https://www.youtube.com/playlist?list=PL9Yh1bjbLAYrU8PsVhW4xzEug2WtVFv3E"><b>KNX-Ultimate video tutorials (YouTube playlist)</b></a>
489
500
  </div>