node-red-contrib-knx-ultimate 4.1.7 → 4.1.9

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 (252) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/nodes/commonFunctions.js +37 -0
  3. package/nodes/hue-config.js +32 -1
  4. package/nodes/knxUltimateHueAreaMotion.html +600 -0
  5. package/nodes/knxUltimateHueAreaMotion.js +212 -0
  6. package/nodes/knxUltimateLogger.html +42 -16
  7. package/nodes/locales/de/common.json +1 -2
  8. package/nodes/locales/de/hue-config.html +3 -2
  9. package/nodes/locales/de/knxUltimate-config.html +35 -35
  10. package/nodes/locales/de/knxUltimate-config.json +17 -17
  11. package/nodes/locales/de/knxUltimate.html +28 -28
  12. package/nodes/locales/de/knxUltimateAlerter.html +3 -3
  13. package/nodes/locales/de/knxUltimateGlobalContext.html +11 -11
  14. package/nodes/locales/de/knxUltimateHueAreaMotion.html +36 -0
  15. package/nodes/locales/de/knxUltimateHueAreaMotion.json +31 -0
  16. package/nodes/locales/de/knxUltimateHueBattery.html +3 -3
  17. package/nodes/locales/de/knxUltimateHueBattery.json +1 -1
  18. package/nodes/locales/de/knxUltimateHueButton.html +1 -1
  19. package/nodes/locales/de/knxUltimateHueButton.json +1 -1
  20. package/nodes/locales/de/knxUltimateHueCameraMotion.html +3 -3
  21. package/nodes/locales/de/knxUltimateHueCameraMotion.json +1 -1
  22. package/nodes/locales/de/knxUltimateHueContactSensor.html +5 -5
  23. package/nodes/locales/de/knxUltimateHueContactSensor.json +1 -1
  24. package/nodes/locales/de/knxUltimateHueHumiditySensor.html +1 -1
  25. package/nodes/locales/de/knxUltimateHueHumiditySensor.json +1 -1
  26. package/nodes/locales/de/knxUltimateHueLight.html +27 -27
  27. package/nodes/locales/de/knxUltimateHueLight.json +1 -1
  28. package/nodes/locales/de/knxUltimateHueLightSensor.html +8 -8
  29. package/nodes/locales/de/knxUltimateHueLightSensor.json +1 -1
  30. package/nodes/locales/de/knxUltimateHueMotion.html +3 -3
  31. package/nodes/locales/de/knxUltimateHueMotion.json +1 -1
  32. package/nodes/locales/de/knxUltimateHuePlug.html +2 -2
  33. package/nodes/locales/de/knxUltimateHuePlug.json +1 -1
  34. package/nodes/locales/de/knxUltimateHueScene.html +3 -3
  35. package/nodes/locales/de/knxUltimateHueScene.json +1 -1
  36. package/nodes/locales/de/knxUltimateHueTapDial.html +2 -2
  37. package/nodes/locales/de/knxUltimateHueTapDial.json +1 -1
  38. package/nodes/locales/de/knxUltimateHueTemperatureSensor.html +7 -7
  39. package/nodes/locales/de/knxUltimateHueTemperatureSensor.json +1 -1
  40. package/nodes/locales/de/knxUltimateHueZigbeeConnectivity.html +6 -6
  41. package/nodes/locales/de/knxUltimateHueZigbeeConnectivity.json +1 -1
  42. package/nodes/locales/de/knxUltimateHuedevice_software_update.html +6 -6
  43. package/nodes/locales/de/knxUltimateHuedevice_software_update.json +1 -1
  44. package/nodes/locales/de/knxUltimateLoadControl.html +9 -9
  45. package/nodes/locales/de/knxUltimateLogger.html +18 -18
  46. package/nodes/locales/de/knxUltimateLogger.json +2 -2
  47. package/nodes/locales/de/knxUltimateSceneController.html +12 -12
  48. package/nodes/locales/de/knxUltimateViewer.html +10 -10
  49. package/nodes/locales/de/knxUltimateWatchDog.html +28 -28
  50. package/nodes/locales/en/common.json +1 -2
  51. package/nodes/locales/en/hue-config.html +3 -2
  52. package/nodes/locales/en/hue-config.json +1 -1
  53. package/nodes/locales/en/knxUltimate.html +1 -1
  54. package/nodes/locales/en/knxUltimateGarage.html +7 -2
  55. package/nodes/locales/en/knxUltimateGlobalContext.html +1 -1
  56. package/nodes/locales/en/knxUltimateHueAreaMotion.html +36 -0
  57. package/nodes/locales/en/knxUltimateHueAreaMotion.json +31 -0
  58. package/nodes/locales/en/knxUltimateHueBattery.html +2 -2
  59. package/nodes/locales/en/knxUltimateHueBattery.json +1 -1
  60. package/nodes/locales/en/knxUltimateHueButton.html +2 -2
  61. package/nodes/locales/en/knxUltimateHueButton.json +1 -1
  62. package/nodes/locales/en/knxUltimateHueCameraMotion.html +2 -2
  63. package/nodes/locales/en/knxUltimateHueCameraMotion.json +3 -3
  64. package/nodes/locales/en/knxUltimateHueContactSensor.html +4 -4
  65. package/nodes/locales/en/knxUltimateHueContactSensor.json +1 -1
  66. package/nodes/locales/en/knxUltimateHueHumiditySensor.html +3 -3
  67. package/nodes/locales/en/knxUltimateHueHumiditySensor.json +3 -3
  68. package/nodes/locales/en/knxUltimateHueLight.html +15 -15
  69. package/nodes/locales/en/knxUltimateHueLight.json +6 -6
  70. package/nodes/locales/en/knxUltimateHueLightSensor.html +3 -3
  71. package/nodes/locales/en/knxUltimateHueLightSensor.json +2 -2
  72. package/nodes/locales/en/knxUltimateHueMotion.html +2 -2
  73. package/nodes/locales/en/knxUltimateHueMotion.json +1 -1
  74. package/nodes/locales/en/knxUltimateHuePlug.html +2 -2
  75. package/nodes/locales/en/knxUltimateHuePlug.json +2 -2
  76. package/nodes/locales/en/knxUltimateHueScene.html +3 -3
  77. package/nodes/locales/en/knxUltimateHueScene.json +3 -3
  78. package/nodes/locales/en/knxUltimateHueTapDial.html +2 -2
  79. package/nodes/locales/en/knxUltimateHueTapDial.json +2 -2
  80. package/nodes/locales/en/knxUltimateHueTemperatureSensor.html +3 -3
  81. package/nodes/locales/en/knxUltimateHueTemperatureSensor.json +1 -1
  82. package/nodes/locales/en/knxUltimateHueZigbeeConnectivity.html +3 -3
  83. package/nodes/locales/en/knxUltimateHueZigbeeConnectivity.json +1 -1
  84. package/nodes/locales/en/knxUltimateHuedevice_software_update.html +3 -3
  85. package/nodes/locales/en/knxUltimateHuedevice_software_update.json +1 -1
  86. package/nodes/locales/en/knxUltimateLoadControl.html +2 -2
  87. package/nodes/locales/en/knxUltimateLogger.html +3 -3
  88. package/nodes/locales/en/knxUltimateLogger.json +2 -2
  89. package/nodes/locales/en/knxUltimateWatchDog.html +2 -2
  90. package/nodes/locales/es/common.json +1 -1
  91. package/nodes/locales/es/hue-config.html +3 -2
  92. package/nodes/locales/es/knxUltimate-config.html +8 -7
  93. package/nodes/locales/es/knxUltimate.html +2 -2
  94. package/nodes/locales/es/knxUltimateGarage.html +9 -4
  95. package/nodes/locales/es/knxUltimateGlobalContext.html +7 -4
  96. package/nodes/locales/es/knxUltimateHueAreaMotion.html +36 -0
  97. package/nodes/locales/es/knxUltimateHueAreaMotion.json +31 -0
  98. package/nodes/locales/es/knxUltimateHueBattery.html +2 -2
  99. package/nodes/locales/es/knxUltimateHueBattery.json +1 -1
  100. package/nodes/locales/es/knxUltimateHueButton.html +1 -1
  101. package/nodes/locales/es/knxUltimateHueButton.json +1 -1
  102. package/nodes/locales/es/knxUltimateHueCameraMotion.html +2 -2
  103. package/nodes/locales/es/knxUltimateHueCameraMotion.json +1 -1
  104. package/nodes/locales/es/knxUltimateHueContactSensor.html +2 -2
  105. package/nodes/locales/es/knxUltimateHueContactSensor.json +1 -1
  106. package/nodes/locales/es/knxUltimateHueHumiditySensor.html +1 -1
  107. package/nodes/locales/es/knxUltimateHueHumiditySensor.json +1 -1
  108. package/nodes/locales/es/knxUltimateHueLight.html +1 -1
  109. package/nodes/locales/es/knxUltimateHueLight.json +1 -1
  110. package/nodes/locales/es/knxUltimateHueLightSensor.html +2 -2
  111. package/nodes/locales/es/knxUltimateHueLightSensor.json +1 -1
  112. package/nodes/locales/es/knxUltimateHueMotion.html +2 -2
  113. package/nodes/locales/es/knxUltimateHueMotion.json +1 -1
  114. package/nodes/locales/es/knxUltimateHuePlug.html +1 -1
  115. package/nodes/locales/es/knxUltimateHuePlug.json +1 -1
  116. package/nodes/locales/es/knxUltimateHueScene.html +3 -3
  117. package/nodes/locales/es/knxUltimateHueScene.json +1 -1
  118. package/nodes/locales/es/knxUltimateHueTapDial.html +2 -2
  119. package/nodes/locales/es/knxUltimateHueTapDial.json +1 -1
  120. package/nodes/locales/es/knxUltimateHueTemperatureSensor.html +2 -2
  121. package/nodes/locales/es/knxUltimateHueTemperatureSensor.json +1 -1
  122. package/nodes/locales/es/knxUltimateHueZigbeeConnectivity.html +2 -2
  123. package/nodes/locales/es/knxUltimateHueZigbeeConnectivity.json +1 -1
  124. package/nodes/locales/es/knxUltimateHuedevice_software_update.html +2 -2
  125. package/nodes/locales/es/knxUltimateHuedevice_software_update.json +1 -1
  126. package/nodes/locales/es/knxUltimateLoadControl.html +4 -4
  127. package/nodes/locales/es/knxUltimateLogger.html +9 -10
  128. package/nodes/locales/es/knxUltimateLogger.json +2 -2
  129. package/nodes/locales/es/knxUltimateWatchDog.html +6 -6
  130. package/nodes/locales/fr/common.json +1 -1
  131. package/nodes/locales/fr/hue-config.html +3 -2
  132. package/nodes/locales/fr/knxUltimate-config.html +10 -10
  133. package/nodes/locales/fr/knxUltimate.html +2 -2
  134. package/nodes/locales/fr/knxUltimateGarage.html +9 -4
  135. package/nodes/locales/fr/knxUltimateGlobalContext.html +2 -2
  136. package/nodes/locales/fr/knxUltimateHueAreaMotion.html +36 -0
  137. package/nodes/locales/fr/knxUltimateHueAreaMotion.json +31 -0
  138. package/nodes/locales/fr/knxUltimateHueBattery.html +1 -1
  139. package/nodes/locales/fr/knxUltimateHueBattery.json +1 -1
  140. package/nodes/locales/fr/knxUltimateHueButton.html +2 -2
  141. package/nodes/locales/fr/knxUltimateHueButton.json +1 -1
  142. package/nodes/locales/fr/knxUltimateHueCameraMotion.html +2 -2
  143. package/nodes/locales/fr/knxUltimateHueCameraMotion.json +1 -1
  144. package/nodes/locales/fr/knxUltimateHueContactSensor.html +2 -2
  145. package/nodes/locales/fr/knxUltimateHueContactSensor.json +1 -1
  146. package/nodes/locales/fr/knxUltimateHueHumiditySensor.html +1 -1
  147. package/nodes/locales/fr/knxUltimateHueHumiditySensor.json +1 -1
  148. package/nodes/locales/fr/knxUltimateHueLight.html +1 -1
  149. package/nodes/locales/fr/knxUltimateHueLight.json +1 -1
  150. package/nodes/locales/fr/knxUltimateHueLightSensor.html +2 -2
  151. package/nodes/locales/fr/knxUltimateHueLightSensor.json +1 -1
  152. package/nodes/locales/fr/knxUltimateHueMotion.html +2 -2
  153. package/nodes/locales/fr/knxUltimateHueMotion.json +1 -1
  154. package/nodes/locales/fr/knxUltimateHuePlug.html +1 -1
  155. package/nodes/locales/fr/knxUltimateHuePlug.json +1 -1
  156. package/nodes/locales/fr/knxUltimateHueScene.html +3 -3
  157. package/nodes/locales/fr/knxUltimateHueScene.json +1 -1
  158. package/nodes/locales/fr/knxUltimateHueTapDial.json +1 -1
  159. package/nodes/locales/fr/knxUltimateHueTemperatureSensor.html +2 -2
  160. package/nodes/locales/fr/knxUltimateHueTemperatureSensor.json +1 -1
  161. package/nodes/locales/fr/knxUltimateHueZigbeeConnectivity.html +2 -2
  162. package/nodes/locales/fr/knxUltimateHueZigbeeConnectivity.json +1 -1
  163. package/nodes/locales/fr/knxUltimateHuedevice_software_update.html +2 -2
  164. package/nodes/locales/fr/knxUltimateHuedevice_software_update.json +1 -1
  165. package/nodes/locales/fr/knxUltimateLoadControl.html +4 -4
  166. package/nodes/locales/fr/knxUltimateLogger.html +9 -10
  167. package/nodes/locales/fr/knxUltimateLogger.json +2 -2
  168. package/nodes/locales/fr/knxUltimateWatchDog.html +6 -6
  169. package/nodes/locales/it/common.json +1 -2
  170. package/nodes/locales/it/hue-config.html +4 -3
  171. package/nodes/locales/it/hue-config.json +1 -1
  172. package/nodes/locales/it/knxUltimate-config.html +9 -9
  173. package/nodes/locales/it/knxUltimate.html +8 -8
  174. package/nodes/locales/it/knxUltimateGarage.html +9 -4
  175. package/nodes/locales/it/knxUltimateGlobalContext.html +3 -3
  176. package/nodes/locales/it/knxUltimateHueAreaMotion.html +36 -0
  177. package/nodes/locales/it/knxUltimateHueAreaMotion.json +31 -0
  178. package/nodes/locales/it/knxUltimateHueBattery.html +3 -3
  179. package/nodes/locales/it/knxUltimateHueBattery.json +1 -1
  180. package/nodes/locales/it/knxUltimateHueButton.html +1 -1
  181. package/nodes/locales/it/knxUltimateHueButton.json +1 -1
  182. package/nodes/locales/it/knxUltimateHueCameraMotion.html +2 -2
  183. package/nodes/locales/it/knxUltimateHueCameraMotion.json +1 -1
  184. package/nodes/locales/it/knxUltimateHueContactSensor.html +3 -3
  185. package/nodes/locales/it/knxUltimateHueContactSensor.json +1 -1
  186. package/nodes/locales/it/knxUltimateHueHumiditySensor 2.html +1 -1
  187. package/nodes/locales/it/knxUltimateHueHumiditySensor.html +1 -1
  188. package/nodes/locales/it/knxUltimateHueHumiditySensor.json +1 -1
  189. package/nodes/locales/it/knxUltimateHueLight.html +2 -2
  190. package/nodes/locales/it/knxUltimateHueLight.json +1 -1
  191. package/nodes/locales/it/knxUltimateHueLightSensor.html +3 -3
  192. package/nodes/locales/it/knxUltimateHueLightSensor.json +1 -1
  193. package/nodes/locales/it/knxUltimateHueMotion.html +3 -3
  194. package/nodes/locales/it/knxUltimateHueMotion.json +1 -1
  195. package/nodes/locales/it/knxUltimateHuePlug.html +2 -2
  196. package/nodes/locales/it/knxUltimateHuePlug.json +1 -1
  197. package/nodes/locales/it/knxUltimateHueScene.html +6 -6
  198. package/nodes/locales/it/knxUltimateHueScene.json +1 -1
  199. package/nodes/locales/it/knxUltimateHueTapDial.html +3 -3
  200. package/nodes/locales/it/knxUltimateHueTapDial.json +1 -1
  201. package/nodes/locales/it/knxUltimateHueTemperatureSensor.html +3 -3
  202. package/nodes/locales/it/knxUltimateHueTemperatureSensor.json +1 -1
  203. package/nodes/locales/it/knxUltimateHueZigbeeConnectivity.html +3 -3
  204. package/nodes/locales/it/knxUltimateHueZigbeeConnectivity.json +1 -1
  205. package/nodes/locales/it/knxUltimateHuedevice_software_update.html +3 -3
  206. package/nodes/locales/it/knxUltimateHuedevice_software_update.json +1 -1
  207. package/nodes/locales/it/knxUltimateLoadControl.html +5 -5
  208. package/nodes/locales/it/knxUltimateLogger.html +5 -5
  209. package/nodes/locales/it/knxUltimateLogger.json +2 -2
  210. package/nodes/locales/it/knxUltimateViewer.html +2 -2
  211. package/nodes/locales/it/knxUltimateWatchDog.html +16 -16
  212. package/nodes/locales/zh-CN/common.json +1 -2
  213. package/nodes/locales/zh-CN/hue-config.html +3 -2
  214. package/nodes/locales/zh-CN/hue-config.json +1 -1
  215. package/nodes/locales/zh-CN/knxUltimate-config.html +10 -10
  216. package/nodes/locales/zh-CN/knxUltimate.html +4 -4
  217. package/nodes/locales/zh-CN/knxUltimateGlobalContext.html +4 -4
  218. package/nodes/locales/zh-CN/knxUltimateHueAreaMotion.html +36 -0
  219. package/nodes/locales/zh-CN/knxUltimateHueAreaMotion.json +31 -0
  220. package/nodes/locales/zh-CN/knxUltimateHueBattery.html +3 -3
  221. package/nodes/locales/zh-CN/knxUltimateHueBattery.json +1 -1
  222. package/nodes/locales/zh-CN/knxUltimateHueButton.html +1 -1
  223. package/nodes/locales/zh-CN/knxUltimateHueButton.json +1 -1
  224. package/nodes/locales/zh-CN/knxUltimateHueCameraMotion.html +1 -1
  225. package/nodes/locales/zh-CN/knxUltimateHueCameraMotion.json +1 -1
  226. package/nodes/locales/zh-CN/knxUltimateHueContactSensor.html +3 -3
  227. package/nodes/locales/zh-CN/knxUltimateHueContactSensor.json +1 -1
  228. package/nodes/locales/zh-CN/knxUltimateHueHumiditySensor.json +1 -1
  229. package/nodes/locales/zh-CN/knxUltimateHueLight.html +1 -1
  230. package/nodes/locales/zh-CN/knxUltimateHueLight.json +1 -1
  231. package/nodes/locales/zh-CN/knxUltimateHueLightSensor.html +1 -1
  232. package/nodes/locales/zh-CN/knxUltimateHueMotion.html +3 -3
  233. package/nodes/locales/zh-CN/knxUltimateHueMotion.json +1 -1
  234. package/nodes/locales/zh-CN/knxUltimateHuePlug.html +2 -2
  235. package/nodes/locales/zh-CN/knxUltimateHuePlug.json +1 -1
  236. package/nodes/locales/zh-CN/knxUltimateHueScene.html +6 -6
  237. package/nodes/locales/zh-CN/knxUltimateHueScene.json +1 -1
  238. package/nodes/locales/zh-CN/knxUltimateHueTapDial.html +2 -2
  239. package/nodes/locales/zh-CN/knxUltimateHueTapDial.json +1 -1
  240. package/nodes/locales/zh-CN/knxUltimateHueTemperatureSensor.html +3 -3
  241. package/nodes/locales/zh-CN/knxUltimateHueTemperatureSensor.json +1 -1
  242. package/nodes/locales/zh-CN/knxUltimateHueZigbeeConnectivity.html +3 -3
  243. package/nodes/locales/zh-CN/knxUltimateHueZigbeeConnectivity.json +1 -1
  244. package/nodes/locales/zh-CN/knxUltimateHuedevice_software_update.html +2 -2
  245. package/nodes/locales/zh-CN/knxUltimateHuedevice_software_update.json +1 -1
  246. package/nodes/locales/zh-CN/knxUltimateLogger.html +8 -8
  247. package/nodes/locales/zh-CN/knxUltimateLogger.json +2 -2
  248. package/nodes/locales/zh-CN/knxUltimateViewer.html +2 -2
  249. package/nodes/locales/zh-CN/knxUltimateWatchDog.html +15 -15
  250. package/package.json +3 -2
  251. package/scripts/inject-wiki-header.js +13 -13
  252. package/scripts/wiki-menu.json +6 -6
package/CHANGELOG.md CHANGED
@@ -6,6 +6,17 @@
6
6
 
7
7
  # CHANGELOG
8
8
 
9
+ **Version 4.1.9** - December 2025<br/>
10
+ - NEW: added **Hue Motion Area** node for Philips Hue Bridge Pro MotionAware areas, exposing aggregated motion state from Hue `convenience_area_motion` and `security_area_motion` services to KNX or Node-RED flows.<br/>
11
+ - Hue config: extended the internal resource browser to resolve MotionAware area services against their `motion_area_configuration`, showing friendly area names and linked rooms/zones in the editor device picker.<br/>
12
+ <br/>
13
+
14
+ **Version 4.1.8** - December 2025<br/>
15
+ - Logger node editor: when **Action** is set to `Emit payload only`, the file path row is now completely hidden (instead of just disabled), using a dedicated row id for better future Node-RED compatibility.<br/>
16
+ - Logger node editor: added a **Download** button next to the file path.<br/>
17
+ - Logger node: updated labels, help and wiki pages in all languages to explain both the **payload interval** and **Max rows** behaviour, including how the XML/file is **rotated** when the configured row limit is reached.<br/>
18
+ <br/>
19
+
9
20
  **Version 4.1.7** - December 2025<br/>
10
21
  - Logger node: replaced the checkbox with an explicit **Action** selector (`Emit payload only` / `Emit payload and save to file`), keeping backward compatibility with existing flows.<br/>
11
22
  - Logger node: file saving now appends and enforces **Max rows** by trimming oldest lines in both buffer and file; removed the folder picker/listDirs endpoint in favour of a single full-path field.<br/>
@@ -327,6 +327,43 @@ module.exports = (RED) => {
327
327
  }
328
328
  })
329
329
 
330
+ // 2025-12 Download logger XML file configured in a knxUltimateLogger node
331
+ RED.httpAdmin.get('/knxUltimateLoggerDownload', RED.auth.needsPermission('knxUltimate-config.read'), (req, res) => {
332
+ try {
333
+ const nodeId = (req.query.nodeId || req.query.id || '').toString()
334
+ if (!nodeId) {
335
+ res.status(400).json({ error: 'NO_NODE_ID' })
336
+ return
337
+ }
338
+ const loggerNode = RED.nodes.getNode(nodeId)
339
+ if (!loggerNode || loggerNode.isLogger !== true) {
340
+ res.status(404).json({ error: 'LOGGER_NOT_FOUND' })
341
+ return
342
+ }
343
+ const filePath = (loggerNode.filePath || '').toString()
344
+ if (!filePath) {
345
+ res.status(404).json({ error: 'NO_FILE_PATH' })
346
+ return
347
+ }
348
+ if (!fs.existsSync(filePath)) {
349
+ res.status(404).json({ error: 'FILE_NOT_FOUND' })
350
+ return
351
+ }
352
+ const safeName = path.basename(filePath) || 'knx-logger.xml'
353
+ res.setHeader('Content-Type', 'application/xml; charset=utf-8')
354
+ res.setHeader('Content-Disposition', `attachment; filename="${safeName}"`)
355
+ const stream = fs.createReadStream(filePath)
356
+ stream.on('error', (err) => {
357
+ try { RED.log.error(`KNXUltimateLoggerDownload error reading file ${filePath}: ${err.message}`) } catch (e) {}
358
+ if (!res.headersSent) res.status(500).json({ error: 'READ_ERROR' })
359
+ })
360
+ stream.pipe(res)
361
+ } catch (error) {
362
+ try { RED.log.error(`KNXUltimateLoggerDownload error: ${error.message}`) } catch (e) {}
363
+ if (!res.headersSent) res.status(500).json({ error: 'UNEXPECTED_ERROR' })
364
+ }
365
+ })
366
+
330
367
  // 2025-09 List interfaces (IA) from KNX Secure keyring
331
368
  RED.httpAdmin.get('/knxUltimateKeyringInterfaces', RED.auth.needsPermission('knxUltimate-config.read'), async (req, res) => {
332
369
  try {
@@ -347,7 +347,8 @@ module.exports = (RED) => {
347
347
  allResources = node.hueAllResources.filter((a) => a.type === 'light' || a.type === 'grouped_light')
348
348
  } else if (_rtype === 'plug') {
349
349
  allResources = node.hueAllResources.filter((a) => a.type === 'plug' || a.type === 'smartplug' || a.type === 'smart_plug')
350
- //console.log('getResources plug raw resources', allResources.map((res) => ({ id: res.id, type: res.type, owner: res.owner?.rtype })))
350
+ } else if (_rtype === 'area_motion') {
351
+ allResources = node.hueAllResources.filter((a) => a.type === 'convenience_area_motion' || a.type === 'security_area_motion')
351
352
  } else {
352
353
  allResources = node.hueAllResources.filter((a) => a.type === _rtype)
353
354
  }
@@ -411,6 +412,36 @@ module.exports = (RED) => {
411
412
  id: resource.id
412
413
  })
413
414
  }
415
+ if (_rtype === 'convenience_area_motion' || _rtype === 'security_area_motion' || (_rtype === 'area_motion' && (resource.type === 'convenience_area_motion' || resource.type === 'security_area_motion'))) {
416
+ let areaName = ''
417
+ let areaGroupLabel = ''
418
+ const isConvenience = resource.type === 'convenience_area_motion'
419
+ const areaTypeLabel = isConvenience ? 'Convenience area' : 'Security area'
420
+ let configuration = node.hueAllResources.find((res) => {
421
+ if (res.type !== 'motion_area_configuration' || !Array.isArray(res.services)) return false
422
+ return res.services.some((svc) => svc.rid === resource.id)
423
+ })
424
+ if (!configuration && resource.owner && resource.owner.rid) {
425
+ const candidate = node.hueAllResources.find((res) => res.id === resource.owner.rid)
426
+ if (candidate && candidate.type === 'motion_area_configuration') configuration = candidate
427
+ }
428
+ if (configuration && typeof configuration.name === 'string' && configuration.name.trim() !== '') {
429
+ areaName = configuration.name.trim()
430
+ } else {
431
+ areaName = resource.id
432
+ }
433
+ if (configuration && configuration.group && configuration.group.rid) {
434
+ const groupRes = node.hueAllResources.find((res) => res.id === configuration.group.rid)
435
+ if (groupRes && groupRes.metadata && typeof groupRes.metadata.name === 'string') {
436
+ const groupType = configuration.group.rtype ? capStr(configuration.group.rtype) : 'Group'
437
+ areaGroupLabel = `, ${groupType} ${groupRes.metadata.name}`
438
+ }
439
+ }
440
+ retArray.push({
441
+ name: `${areaTypeLabel}: ${areaName}${areaGroupLabel}`,
442
+ id: resource.id
443
+ })
444
+ }
414
445
  if (_rtype === 'relative_rotary') {
415
446
  const linkedDevName = node.hueAllResources.find((dev) => dev.type === 'device' && dev.services.find((serv) => serv.rid === resource.id)).metadata.name || ''
416
447
  retArray.push({