node-red-contrib-knx-ultimate 7.0.4 → 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 +7 -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
@@ -1,33 +1,9 @@
1
1
  const loggerClass = require('./utils/sysLogger')
2
2
 
3
- let sendNowEndpointRegistered = false
3
+ const registerSendNowEndpoint = require('./utils/knxDateTimeSendNow')
4
4
 
5
5
  module.exports = function (RED) {
6
- if (!sendNowEndpointRegistered) {
7
- RED.httpAdmin.post('/knxUltimateDateTime/sendNow', RED.auth.needsPermission('knxUltimate-config.write'), (req, res) => {
8
- try {
9
- const { id } = req.body || {}
10
- if (!id) {
11
- res.status(400).json({ error: 'Missing node id' })
12
- return
13
- }
14
- const targetNode = RED.nodes.getNode(id)
15
- if (!targetNode) {
16
- res.status(404).json({ error: 'KNX DateTime node not found' })
17
- return
18
- }
19
- if (typeof targetNode.triggerSend !== 'function') {
20
- res.status(400).json({ error: 'Node does not support sendNow' })
21
- return
22
- }
23
- const result = targetNode.triggerSend({ reason: 'button' })
24
- res.json({ status: 'ok', queued: result && result.queued === true })
25
- } catch (error) {
26
- res.status(500).json({ error: error.message || 'KNX DateTime send failed' })
27
- }
28
- })
29
- sendNowEndpointRegistered = true
30
- }
6
+ registerSendNowEndpoint(RED)
31
7
 
32
8
  function knxUltimateDateTime (config) {
33
9
  RED.nodes.createNode(this, config)
@@ -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('knxUltimateGarage', {
5
- category: 'KNX Ultimate',
6
- color: '#C7E9C0',
7
+ category: 'deprecated',
8
+ color: '#E5F0E2',
7
9
  defaults: {
8
10
  server: { type: 'knxUltimate-config', required: true },
9
11
  name: { value: '' },
@@ -37,9 +39,9 @@
37
39
  outputs: 1,
38
40
  icon: 'node-knx-icon.svg',
39
41
  label: function () {
40
- return this.name || 'KNX Garage';
42
+ return (this.name || 'KNX Garage') + " (deprecated)";
41
43
  },
42
- paletteLabel: 'KNX Garage',
44
+ paletteLabel: 'KNX Garage (deprecated)',
43
45
  oneditprepare: function () {
44
46
  const node = this;
45
47
  const $knxServerInput = $('#node-input-server');
@@ -183,6 +185,15 @@
183
185
  </script>
184
186
 
185
187
  <script type="text/html" data-template-name="knxUltimateGarage">
188
+ <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;">
189
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
190
+ <span data-i18n="knxUltimateGarage.legacy_notice"></span>
191
+ </div>
192
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
193
+ <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]knxUltimateGarage.migration_button_title">
194
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateGarage.migration_button"></span>
195
+ </button>
196
+ </div>
186
197
  <div class="form-row" style="margin-bottom:10px;">
187
198
  <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>
188
199
  </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('knxUltimateGlobalContext', {
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);
21
+ return ((this.name)) + " (deprecated)";
20
22
  },
21
- paletteLabel: "KNX Global Context",
23
+ paletteLabel: "KNX Global Context (deprecated)",
22
24
  // button: {
23
25
  // enabled: function() {
24
26
  // // return whether or not the button is enabled, based on the current
@@ -64,6 +66,15 @@
64
66
  </script>
65
67
 
66
68
  <script type="text/html" data-template-name="knxUltimateGlobalContext">
69
+ <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;">
70
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
71
+ <span data-i18n="knxUltimateGlobalContext.legacy_notice"></span>
72
+ </div>
73
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
74
+ <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]knxUltimateGlobalContext.migration_button_title">
75
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateGlobalContext.migration_button"></span>
76
+ </button>
77
+ </div>
67
78
  <div class="form-row" style="margin-bottom:10px;">
68
79
  <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>
69
80
  </div>
@@ -1,6 +1,8 @@
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">
2
4
  RED.nodes.registerType('knxUltimateHATranslator', {
3
- category: 'KNX Ultimate',
5
+ category: 'deprecated',
4
6
  defaults: {
5
7
  name: { value: "" },
6
8
  payloadPropName: { value: "payload", required: false },
@@ -10,10 +12,10 @@
10
12
  outputs: 1,
11
13
  icon: "node-ha-icon.svg",
12
14
  label: function () {
13
- return (this.name || 'HA -> KNX');
15
+ return (this.name || 'HA -> KNX') + ' (deprecated)';
14
16
  },
15
- color: '#AED6F1',
16
- paletteLabel: "Home Assistant translator",
17
+ color: '#E5F0E2',
18
+ paletteLabel: "Home Assistant translator (deprecated)",
17
19
  oneditprepare: function () {
18
20
  // Go to the help panel
19
21
  try {
@@ -47,6 +49,15 @@
47
49
  </script>
48
50
 
49
51
  <script type="text/html" data-template-name="knxUltimateHATranslator">
52
+ <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;">
53
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
54
+ <span data-i18n="knxUltimateHATranslator.legacy_notice"></span>
55
+ </div>
56
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
57
+ <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]knxUltimateHATranslator.migration_button_title">
58
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateHATranslator.migration_button"></span>
59
+ </button>
60
+ </div>
50
61
  <div class="form-row" style="margin-bottom:10px;">
51
62
  <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>
52
63
  </div>
@@ -3,6 +3,7 @@
3
3
  <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/hueControllerEditorSelection.js"></script>
4
4
  <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/hueControllerProfiles.js"></script>
5
5
  <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/hueControllerMigration.js"></script>
6
+ <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/flowMigrationBackup.js"></script>
6
7
  <script type="text/javascript" src="resources/node-red-contrib-knx-ultimate/hueControllerMigrationDialog.js"></script>
7
8
 
8
9
  <script type="text/javascript">
@@ -1067,11 +1068,9 @@ The controller supports lights and grouped lights, plugs, buttons, Tap dial, mot
1067
1068
 
1068
1069
  ## Convert a legacy HUE flow
1069
1070
 
1070
- Use **Convert legacy HUE flow**, paste a complete Node-RED flow export, and press **Convert**. The conversion runs only in the browser: it does not inspect or modify the open flow. The returned JSON replaces every supported legacy HUE node with HUE Controller while preserving IDs, configuration references, properties, positions, and wires. Copy the result and import it into Node-RED, preferably as a new flow for comparison before removing the original.
1071
+ Use **Convert legacy HUE flow** in HUE Controller or the conversion button in a legacy HUE editor. After confirmation, the browser automatically starts downloading a dated JSON backup of all current editor flows, including tabs, subflows, configuration nodes, groups and wires. The backup uses the standard Node-RED export format and excludes declared credentials. Your browser may ask where to save the file. If the backup cannot be created or its download cannot be started, no nodes are converted.
1071
1072
 
1072
- Node-RED intentionally excludes credentials from flow exports. When importing into the same Node-RED installation, keep **Reuse existing Hue and KNX config nodes** selected: referenced `hue-config` and `knxUltimate-config` objects are omitted from the converted JSON, while their IDs remain on the converted nodes so the existing configurations retain their keys and passwords. Clear the option only for a different installation, where credentials must be entered again after import.
1073
-
1074
- **Copy converted flow** uses the browser Clipboard API and falls back to a temporary selected textarea when direct clipboard access is unavailable. If the browser blocks both methods, the output JSON is selected so it can be copied manually.
1073
+ The current editor then closes and discards unsaved form edits. Conversion runs locally in the editor and preserves node IDs, settings, configuration references, positions, groups and wiring. A single Undo restores the original nodes. Review the converted flows and click **Deploy** yourself; conversion does not deploy automatically.
1075
1074
 
1076
1075
  ## Compatibility and loop protection
1077
1076
 
@@ -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('knxUltimateLoadControl', {
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 },
@@ -54,9 +56,9 @@
54
56
  outputs: 1,
55
57
  icon: "node-alerter-icon.svg",
56
58
  label: function () {
57
- return (this.name || this.topic || "KNX Load Control");
59
+ return ((this.name || this.topic || "KNX Load Control")) + " (deprecated)";
58
60
  },
59
- paletteLabel: "KNX Load Control",
61
+ paletteLabel: "KNX Load Control (deprecated)",
60
62
  // button: {
61
63
  // enabled: function() {
62
64
  // // return whether or not the button is enabled, based on the current
@@ -205,6 +207,15 @@
205
207
  </script>
206
208
 
207
209
  <script type="text/html" data-template-name="knxUltimateLoadControl">
210
+ <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;">
211
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
212
+ <span data-i18n="knxUltimateLoadControl.legacy_notice"></span>
213
+ </div>
214
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
215
+ <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]knxUltimateLoadControl.migration_button_title">
216
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateLoadControl.migration_button"></span>
217
+ </button>
218
+ </div>
208
219
  <div class="form-row" style="margin-bottom:10px;">
209
220
  <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>
210
221
  </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('knxUltimateLogger', {
5
- category: "KNX Ultimate",
6
- color: '#C7E9C0',
7
+ category: 'deprecated',
8
+ color: '#E5F0E2',
7
9
  defaults: {
8
10
  server: { type: "knxUltimate-config", required: true },
9
11
  topic: { value: "" },
@@ -22,9 +24,9 @@
22
24
  outputLabels: ["ETS Diag file", "Telegram Count"],
23
25
  icon: "node-logger-icon.svg",
24
26
  label: function () {
25
- return ((this.name || "KNX Logger") + " " + this.topic);
27
+ return (((this.name || "KNX Logger") + " " + this.topic)) + " (deprecated)";
26
28
  },
27
- paletteLabel: "KNX Logger",
29
+ paletteLabel: "KNX Logger (deprecated)",
28
30
  oneditprepare: function () {
29
31
  // Go to the help panel
30
32
  try {
@@ -110,6 +112,15 @@
110
112
  </script>
111
113
 
112
114
  <script type="text/html" data-template-name="knxUltimateLogger">
115
+ <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;">
116
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
117
+ <span data-i18n="knxUltimateLogger.legacy_notice"></span>
118
+ </div>
119
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
120
+ <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]knxUltimateLogger.migration_button_title">
121
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateLogger.migration_button"></span>
122
+ </button>
123
+ </div>
113
124
  <div class="form-row" style="margin-bottom:10px;">
114
125
  <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>
115
126
  </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('knxUltimateSceneController', {
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 },
@@ -24,9 +26,9 @@
24
26
  outputs: 1,
25
27
  icon: "node-scene-icon.svg",
26
28
  label: function () {
27
- return (this.outputRBE == true ? "|rbe| " : "") + (this.name || this.topic || "KNX Scene Controller") + (this.inputRBE == true ? " |rbe|" : "")
29
+ return ((this.outputRBE == true ? "|rbe| " : "") + (this.name || this.topic || "KNX Scene Controller") + (this.inputRBE == true ? " |rbe|" : "")) + " (deprecated)";
28
30
  },
29
- paletteLabel: "KNX Scene Controller",
31
+ paletteLabel: "KNX Scene Controller (deprecated)",
30
32
  // button: {
31
33
  // enabled: function() {
32
34
  // // return whether or not the button is enabled, based on the current
@@ -451,6 +453,15 @@
451
453
  </script>
452
454
 
453
455
  <script type="text/html" data-template-name="knxUltimateSceneController">
456
+ <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;">
457
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
458
+ <span data-i18n="knxUltimateSceneController.legacy_notice"></span>
459
+ </div>
460
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
461
+ <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]knxUltimateSceneController.migration_button_title">
462
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateSceneController.migration_button"></span>
463
+ </button>
464
+ </div>
454
465
  <div class="form-row" style="margin-bottom:10px;">
455
466
  <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>
456
467
  </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('knxUltimateStaircase', {
5
- category: 'KNX Ultimate',
6
- color: '#C7E9C0',
7
+ category: 'deprecated',
8
+ color: '#E5F0E2',
7
9
  defaults: {
8
10
  server: { type: 'knxUltimate-config', required: true },
9
11
  name: { value: '' },
@@ -37,9 +39,9 @@
37
39
  outputs: 1,
38
40
  icon: 'node-knx-icon.svg',
39
41
  label: function () {
40
- return this.name || 'KNX Staircase';
42
+ return (this.name || 'KNX Staircase') + " (deprecated)";
41
43
  },
42
- paletteLabel: 'KNX Staircase',
44
+ paletteLabel: 'KNX Staircase (deprecated)',
43
45
  oneditprepare: function () {
44
46
  const node = this;
45
47
  const $knxServerInput = $('#node-input-server');
@@ -195,6 +197,15 @@
195
197
 
196
198
 
197
199
  <script type="text/html" data-template-name="knxUltimateStaircase">
200
+ <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;">
201
+ <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
202
+ <span data-i18n="knxUltimateStaircase.legacy_notice"></span>
203
+ </div>
204
+ <div class="form-row knx-utility-legacy-migration-action" style="margin-bottom:14px;">
205
+ <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]knxUltimateStaircase.migration_button_title">
206
+ <i class="fa fa-exchange" style="color:#fff !important;"></i> <span style="color:#fff !important;" data-i18n="knxUltimateStaircase.migration_button"></span>
207
+ </button>
208
+ </div>
198
209
  <div class="form-row" style="margin-bottom:10px;">
199
210
  <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>
200
211
  </div>