node-red-contrib-huemagic 4.2.2 → 5.0.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 (515) hide show
  1. package/CHANGELOG.md +89 -5
  2. package/README.md +506 -123
  3. package/examples/Deutsch/Hue Automation.json +176 -0
  4. package/examples/Deutsch/Hue Bridge.json +256 -0
  5. package/examples/Deutsch/Hue Brightness.json +150 -0
  6. package/examples/Deutsch/Hue Buttons.json +88 -0
  7. package/examples/Deutsch/Hue Contact.json +150 -0
  8. package/examples/Deutsch/Hue Group.json +658 -0
  9. package/examples/Deutsch/Hue Light.json +893 -0
  10. package/examples/Deutsch/Hue Magic.json +148 -0
  11. package/examples/Deutsch/Hue Motion.json +150 -0
  12. package/examples/Deutsch/Hue Rules.json +150 -0
  13. package/examples/Deutsch/Hue Scene.json +178 -0
  14. package/examples/Deutsch/Hue Speaker.json +274 -0
  15. package/examples/Deutsch/Hue Sync Box.json +378 -0
  16. package/examples/Deutsch/Hue Temperature.json +150 -0
  17. package/examples/English/Hue Automation.json +176 -0
  18. package/examples/{Hue Bridge.json → English/Hue Bridge.json } +1 -1
  19. package/examples/{Hue Brightness.json → English/Hue Brightness.json } +1 -1
  20. package/examples/{Hue Buttons.json → English/Hue Buttons.json } +1 -1
  21. package/examples/English/Hue Contact.json +150 -0
  22. package/examples/{Hue Group.json → English/Hue Group.json } +1 -1
  23. package/examples/{Hue Light.json → English/Hue Light.json } +1 -1
  24. package/examples/{Hue Magic.json → English/Hue Magic.json } +1 -1
  25. package/examples/{Hue Motion.json → English/Hue Motion.json } +1 -1
  26. package/examples/{Hue Rules.json → English/Hue Rules.json } +1 -1
  27. package/examples/{Hue Scene.json → English/Hue Scene.json } +1 -1
  28. package/examples/English/Hue Speaker.json +274 -0
  29. package/examples/English/Hue Sync Box.json +378 -0
  30. package/examples/{Hue Temperature.json → English/Hue Temperature.json } +1 -1
  31. package/examples/Espa/303/261ol/Hue Automation.json" +176 -0
  32. package/examples/Espa/303/261ol/Hue Bridge.json" +256 -0
  33. package/examples/Espa/303/261ol/Hue Brightness.json" +150 -0
  34. package/examples/Espa/303/261ol/Hue Buttons.json" +88 -0
  35. package/examples/Espa/303/261ol/Hue Contact.json" +150 -0
  36. package/examples/Espa/303/261ol/Hue Group.json" +658 -0
  37. package/examples/Espa/303/261ol/Hue Light.json" +893 -0
  38. package/examples/Espa/303/261ol/Hue Magic.json" +148 -0
  39. package/examples/Espa/303/261ol/Hue Motion.json" +150 -0
  40. package/examples/Espa/303/261ol/Hue Rules.json" +150 -0
  41. package/examples/Espa/303/261ol/Hue Scene.json" +178 -0
  42. package/examples/Espa/303/261ol/Hue Speaker.json" +274 -0
  43. package/examples/Espa/303/261ol/Hue Sync Box.json" +378 -0
  44. package/examples/Espa/303/261ol/Hue Temperature.json" +150 -0
  45. package/examples/Fran/303/247ais/Hue Automation.json" +176 -0
  46. package/examples/Fran/303/247ais/Hue Bridge.json" +256 -0
  47. package/examples/Fran/303/247ais/Hue Brightness.json" +150 -0
  48. package/examples/Fran/303/247ais/Hue Buttons.json" +88 -0
  49. package/examples/Fran/303/247ais/Hue Contact.json" +150 -0
  50. package/examples/Fran/303/247ais/Hue Group.json" +658 -0
  51. package/examples/Fran/303/247ais/Hue Light.json" +893 -0
  52. package/examples/Fran/303/247ais/Hue Magic.json" +148 -0
  53. package/examples/Fran/303/247ais/Hue Motion.json" +150 -0
  54. package/examples/Fran/303/247ais/Hue Rules.json" +150 -0
  55. package/examples/Fran/303/247ais/Hue Scene.json" +178 -0
  56. package/examples/Fran/303/247ais/Hue Speaker.json" +274 -0
  57. package/examples/Fran/303/247ais/Hue Sync Box.json" +378 -0
  58. package/examples/Fran/303/247ais/Hue Temperature.json" +150 -0
  59. package/examples/Italiano/Hue Automation.json +176 -0
  60. package/examples/Italiano/Hue Bridge.json +256 -0
  61. package/examples/Italiano/Hue Brightness.json +150 -0
  62. package/examples/Italiano/Hue Buttons.json +88 -0
  63. package/examples/Italiano/Hue Contact.json +150 -0
  64. package/examples/Italiano/Hue Group.json +658 -0
  65. package/examples/Italiano/Hue Light.json +893 -0
  66. package/examples/Italiano/Hue Magic.json +148 -0
  67. package/examples/Italiano/Hue Motion.json +150 -0
  68. package/examples/Italiano/Hue Rules.json +150 -0
  69. package/examples/Italiano/Hue Scene.json +178 -0
  70. package/examples/Italiano/Hue Speaker.json +274 -0
  71. package/examples/Italiano/Hue Sync Box.json +378 -0
  72. package/examples/Italiano/Hue Temperature.json +150 -0
  73. package/examples/Nederlands/Hue Automation.json +176 -0
  74. package/examples/Nederlands/Hue Bridge.json +256 -0
  75. package/examples/Nederlands/Hue Brightness.json +150 -0
  76. package/examples/Nederlands/Hue Buttons.json +88 -0
  77. package/examples/Nederlands/Hue Contact.json +150 -0
  78. package/examples/Nederlands/Hue Group.json +658 -0
  79. package/examples/Nederlands/Hue Light.json +893 -0
  80. package/examples/Nederlands/Hue Magic.json +148 -0
  81. package/examples/Nederlands/Hue Motion.json +150 -0
  82. package/examples/Nederlands/Hue Rules.json +150 -0
  83. package/examples/Nederlands/Hue Scene.json +178 -0
  84. package/examples/Nederlands/Hue Speaker.json +274 -0
  85. package/examples/Nederlands/Hue Sync Box.json +378 -0
  86. package/examples/Nederlands/Hue Temperature.json +150 -0
  87. package/examples/Polski/Hue Automation.json +176 -0
  88. package/examples/Polski/Hue Bridge.json +256 -0
  89. package/examples/Polski/Hue Brightness.json +150 -0
  90. package/examples/Polski/Hue Buttons.json +88 -0
  91. package/examples/Polski/Hue Contact.json +150 -0
  92. package/examples/Polski/Hue Group.json +658 -0
  93. package/examples/Polski/Hue Light.json +893 -0
  94. package/examples/Polski/Hue Magic.json +148 -0
  95. package/examples/Polski/Hue Motion.json +150 -0
  96. package/examples/Polski/Hue Rules.json +150 -0
  97. package/examples/Polski/Hue Scene.json +178 -0
  98. package/examples/Polski/Hue Speaker.json +274 -0
  99. package/examples/Polski/Hue Sync Box.json +378 -0
  100. package/examples/Polski/Hue Temperature.json +150 -0
  101. package/examples/Portugu/303/252s/Hue Automation.json" +176 -0
  102. package/examples/Portugu/303/252s/Hue Bridge.json" +256 -0
  103. package/examples/Portugu/303/252s/Hue Brightness.json" +150 -0
  104. package/examples/Portugu/303/252s/Hue Buttons.json" +88 -0
  105. package/examples/Portugu/303/252s/Hue Contact.json" +150 -0
  106. package/examples/Portugu/303/252s/Hue Group.json" +658 -0
  107. package/examples/Portugu/303/252s/Hue Light.json" +893 -0
  108. package/examples/Portugu/303/252s/Hue Magic.json" +148 -0
  109. package/examples/Portugu/303/252s/Hue Motion.json" +150 -0
  110. package/examples/Portugu/303/252s/Hue Rules.json" +150 -0
  111. package/examples/Portugu/303/252s/Hue Scene.json" +178 -0
  112. package/examples/Portugu/303/252s/Hue Speaker.json" +274 -0
  113. package/examples/Portugu/303/252s/Hue Sync Box.json" +378 -0
  114. package/examples/Portugu/303/252s/Hue Temperature.json" +150 -0
  115. package/examples/T/303/274rk/303/247e/Hue Automation.json" +176 -0
  116. package/examples/T/303/274rk/303/247e/Hue Bridge.json" +256 -0
  117. package/examples/T/303/274rk/303/247e/Hue Brightness.json" +150 -0
  118. package/examples/T/303/274rk/303/247e/Hue Buttons.json" +88 -0
  119. package/examples/T/303/274rk/303/247e/Hue Contact.json" +150 -0
  120. package/examples/T/303/274rk/303/247e/Hue Group.json" +658 -0
  121. package/examples/T/303/274rk/303/247e/Hue Light.json" +893 -0
  122. package/examples/T/303/274rk/303/247e/Hue Magic.json" +148 -0
  123. package/examples/T/303/274rk/303/247e/Hue Motion.json" +150 -0
  124. package/examples/T/303/274rk/303/247e/Hue Rules.json" +150 -0
  125. package/examples/T/303/274rk/303/247e/Hue Scene.json" +178 -0
  126. package/examples/T/303/274rk/303/247e/Hue Speaker.json" +274 -0
  127. package/examples/T/303/274rk/303/247e/Hue Sync Box.json" +378 -0
  128. package/examples/T/303/274rk/303/247e/Hue Temperature.json" +150 -0
  129. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Automation.json" +176 -0
  130. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Bridge.json" +256 -0
  131. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Brightness.json" +150 -0
  132. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Buttons.json" +88 -0
  133. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Contact.json" +150 -0
  134. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Group.json" +658 -0
  135. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Light.json" +893 -0
  136. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Magic.json" +148 -0
  137. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Motion.json" +150 -0
  138. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Rules.json" +150 -0
  139. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Scene.json" +178 -0
  140. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Speaker.json" +274 -0
  141. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Sync Box.json" +378 -0
  142. package/examples//316/225/316/273/316/273/316/267/316/275/316/271/316/272/316/254/Hue Temperature.json" +150 -0
  143. package/huemagic/assets/huemagic-examples.gif +0 -0
  144. package/huemagic/hue-automation.html +218 -0
  145. package/huemagic/hue-automation.js +173 -0
  146. package/huemagic/hue-bridge-config.html +39 -32
  147. package/huemagic/hue-bridge-config.js +290 -99
  148. package/huemagic/hue-bridge.html +8 -8
  149. package/huemagic/hue-bridge.js +29 -4
  150. package/huemagic/hue-brightness.html +21 -9
  151. package/huemagic/hue-brightness.js +20 -10
  152. package/huemagic/hue-buttons.html +16 -9
  153. package/huemagic/hue-buttons.js +90 -27
  154. package/huemagic/hue-contact.html +218 -0
  155. package/huemagic/hue-contact.js +209 -0
  156. package/huemagic/hue-group.html +16 -9
  157. package/huemagic/hue-group.js +141 -179
  158. package/huemagic/hue-light.html +19 -12
  159. package/huemagic/hue-light.js +222 -167
  160. package/huemagic/hue-magic.html +3 -5
  161. package/huemagic/hue-motion.html +16 -9
  162. package/huemagic/hue-motion.js +37 -8
  163. package/huemagic/hue-rules.html +16 -9
  164. package/huemagic/hue-rules.js +16 -8
  165. package/huemagic/hue-scene.html +9 -5
  166. package/huemagic/hue-scene.js +52 -16
  167. package/huemagic/hue-speaker.html +218 -0
  168. package/huemagic/hue-speaker.js +257 -0
  169. package/huemagic/hue-syncbox-config.html +123 -0
  170. package/huemagic/hue-syncbox-config.js +179 -0
  171. package/huemagic/hue-syncbox.html +82 -0
  172. package/huemagic/hue-syncbox.js +274 -0
  173. package/huemagic/hue-temperature.html +21 -9
  174. package/huemagic/hue-temperature.js +18 -10
  175. package/huemagic/icons/hue-automation.png +0 -0
  176. package/huemagic/icons/hue-automation.svg +3 -0
  177. package/huemagic/icons/hue-contact.png +0 -0
  178. package/huemagic/icons/hue-contact.svg +4 -0
  179. package/huemagic/icons/hue-speaker.png +0 -0
  180. package/huemagic/icons/hue-speaker.svg +6 -0
  181. package/huemagic/icons/hue-syncbox.png +0 -0
  182. package/huemagic/icons/hue-syncbox.svg +7 -0
  183. package/huemagic/locales/de/hue-automation.html +59 -0
  184. package/huemagic/locales/de/hue-automation.json +33 -0
  185. package/huemagic/locales/de/hue-bridge-config.json +23 -12
  186. package/huemagic/locales/de/hue-bridge.html +7 -4
  187. package/huemagic/locales/de/hue-bridge.json +9 -10
  188. package/huemagic/locales/de/hue-brightness.html +9 -6
  189. package/huemagic/locales/de/hue-brightness.json +13 -9
  190. package/huemagic/locales/de/hue-buttons.html +5 -4
  191. package/huemagic/locales/de/hue-buttons.json +22 -8
  192. package/huemagic/locales/de/hue-contact.html +67 -0
  193. package/huemagic/locales/de/hue-contact.json +35 -0
  194. package/huemagic/locales/de/hue-group.html +17 -6
  195. package/huemagic/locales/de/hue-group.json +16 -9
  196. package/huemagic/locales/de/hue-light.html +6 -6
  197. package/huemagic/locales/de/hue-light.json +17 -9
  198. package/huemagic/locales/de/hue-magic.html +1 -1
  199. package/huemagic/locales/de/hue-magic.json +6 -8
  200. package/huemagic/locales/de/hue-motion.html +4 -4
  201. package/huemagic/locales/de/hue-motion.json +14 -9
  202. package/huemagic/locales/de/hue-rules.html +2 -2
  203. package/huemagic/locales/de/hue-rules.json +10 -9
  204. package/huemagic/locales/de/hue-scene.html +11 -3
  205. package/huemagic/locales/de/hue-scene.json +9 -9
  206. package/huemagic/locales/de/hue-speaker.html +80 -0
  207. package/huemagic/locales/de/hue-speaker.json +38 -0
  208. package/huemagic/locales/de/hue-syncbox-config.html +19 -0
  209. package/huemagic/locales/de/hue-syncbox-config.json +25 -0
  210. package/huemagic/locales/de/hue-syncbox.html +86 -0
  211. package/huemagic/locales/de/hue-syncbox.json +30 -0
  212. package/huemagic/locales/de/hue-temperature.html +7 -5
  213. package/huemagic/locales/de/hue-temperature.json +13 -9
  214. package/huemagic/locales/el/hue-automation.html +59 -0
  215. package/huemagic/locales/el/hue-automation.json +33 -0
  216. package/huemagic/locales/el/hue-bridge-config.html +31 -0
  217. package/huemagic/locales/el/hue-bridge-config.json +40 -0
  218. package/huemagic/locales/el/hue-bridge.html +96 -0
  219. package/huemagic/locales/el/hue-bridge.json +26 -0
  220. package/huemagic/locales/el/hue-brightness.html +70 -0
  221. package/huemagic/locales/el/hue-brightness.json +37 -0
  222. package/huemagic/locales/el/hue-buttons.html +59 -0
  223. package/huemagic/locales/el/hue-buttons.json +42 -0
  224. package/huemagic/locales/el/hue-contact.html +67 -0
  225. package/huemagic/locales/el/hue-contact.json +35 -0
  226. package/huemagic/locales/el/hue-group.html +87 -0
  227. package/huemagic/locales/el/hue-group.json +46 -0
  228. package/huemagic/locales/el/hue-light.html +97 -0
  229. package/huemagic/locales/el/hue-light.json +44 -0
  230. package/huemagic/locales/el/hue-magic.html +68 -0
  231. package/huemagic/locales/el/hue-magic.json +26 -0
  232. package/huemagic/locales/el/hue-motion.html +64 -0
  233. package/huemagic/locales/el/hue-motion.json +36 -0
  234. package/huemagic/locales/el/hue-rules.html +69 -0
  235. package/huemagic/locales/el/hue-rules.json +30 -0
  236. package/huemagic/locales/el/hue-scene.html +43 -0
  237. package/huemagic/locales/el/hue-scene.json +32 -0
  238. package/huemagic/locales/el/hue-speaker.html +80 -0
  239. package/huemagic/locales/el/hue-speaker.json +38 -0
  240. package/huemagic/locales/el/hue-syncbox-config.html +19 -0
  241. package/huemagic/locales/el/hue-syncbox-config.json +25 -0
  242. package/huemagic/locales/el/hue-syncbox.html +86 -0
  243. package/huemagic/locales/el/hue-syncbox.json +30 -0
  244. package/huemagic/locales/el/hue-temperature.html +69 -0
  245. package/huemagic/locales/el/hue-temperature.json +33 -0
  246. package/huemagic/locales/en/hue-automation.html +59 -0
  247. package/huemagic/locales/en/hue-automation.json +33 -0
  248. package/huemagic/locales/en/hue-bridge-config.json +40 -0
  249. package/huemagic/locales/{en-US → en}/hue-bridge.html +5 -2
  250. package/huemagic/locales/{en-US → en}/hue-bridge.json +8 -9
  251. package/huemagic/locales/{en-US → en}/hue-brightness.html +6 -3
  252. package/huemagic/locales/{en-US → en}/hue-brightness.json +11 -9
  253. package/huemagic/locales/{en-US → en}/hue-buttons.html +4 -3
  254. package/huemagic/locales/en/hue-buttons.json +42 -0
  255. package/huemagic/locales/en/hue-contact.html +67 -0
  256. package/huemagic/locales/en/hue-contact.json +35 -0
  257. package/huemagic/locales/{en-US → en}/hue-group.html +16 -5
  258. package/huemagic/locales/{en-US → en}/hue-group.json +15 -10
  259. package/huemagic/locales/{en-US → en}/hue-light.html +3 -3
  260. package/huemagic/locales/en/hue-light.json +44 -0
  261. package/huemagic/locales/{en-US → en}/hue-magic.html +1 -1
  262. package/huemagic/locales/{en-US → en}/hue-motion.html +2 -2
  263. package/huemagic/locales/{en-US → en}/hue-motion.json +12 -9
  264. package/huemagic/locales/{en-US → en}/hue-rules.html +2 -2
  265. package/huemagic/locales/{en-US → en}/hue-rules.json +10 -9
  266. package/huemagic/locales/{en-US → en}/hue-scene.html +11 -3
  267. package/huemagic/locales/{en-US → en}/hue-scene.json +9 -9
  268. package/huemagic/locales/en/hue-speaker.html +80 -0
  269. package/huemagic/locales/en/hue-speaker.json +38 -0
  270. package/huemagic/locales/en/hue-syncbox-config.html +19 -0
  271. package/huemagic/locales/en/hue-syncbox-config.json +25 -0
  272. package/huemagic/locales/en/hue-syncbox.html +86 -0
  273. package/huemagic/locales/en/hue-syncbox.json +30 -0
  274. package/huemagic/locales/{en-US → en}/hue-temperature.html +4 -2
  275. package/huemagic/locales/{en-US → en}/hue-temperature.json +11 -9
  276. package/huemagic/locales/es/hue-automation.html +59 -0
  277. package/huemagic/locales/es/hue-automation.json +33 -0
  278. package/huemagic/locales/es/hue-bridge-config.html +31 -0
  279. package/huemagic/locales/es/hue-bridge-config.json +40 -0
  280. package/huemagic/locales/es/hue-bridge.html +96 -0
  281. package/huemagic/locales/es/hue-bridge.json +26 -0
  282. package/huemagic/locales/es/hue-brightness.html +70 -0
  283. package/huemagic/locales/es/hue-brightness.json +37 -0
  284. package/huemagic/locales/es/hue-buttons.html +59 -0
  285. package/huemagic/locales/es/hue-buttons.json +42 -0
  286. package/huemagic/locales/es/hue-contact.html +67 -0
  287. package/huemagic/locales/es/hue-contact.json +35 -0
  288. package/huemagic/locales/es/hue-group.html +87 -0
  289. package/huemagic/locales/es/hue-group.json +46 -0
  290. package/huemagic/locales/es/hue-light.html +97 -0
  291. package/huemagic/locales/es/hue-light.json +44 -0
  292. package/huemagic/locales/es/hue-magic.html +68 -0
  293. package/huemagic/locales/es/hue-magic.json +26 -0
  294. package/huemagic/locales/es/hue-motion.html +64 -0
  295. package/huemagic/locales/es/hue-motion.json +36 -0
  296. package/huemagic/locales/es/hue-rules.html +69 -0
  297. package/huemagic/locales/es/hue-rules.json +30 -0
  298. package/huemagic/locales/es/hue-scene.html +43 -0
  299. package/huemagic/locales/es/hue-scene.json +32 -0
  300. package/huemagic/locales/es/hue-speaker.html +80 -0
  301. package/huemagic/locales/es/hue-speaker.json +38 -0
  302. package/huemagic/locales/es/hue-syncbox-config.html +19 -0
  303. package/huemagic/locales/es/hue-syncbox-config.json +25 -0
  304. package/huemagic/locales/es/hue-syncbox.html +86 -0
  305. package/huemagic/locales/es/hue-syncbox.json +30 -0
  306. package/huemagic/locales/es/hue-temperature.html +69 -0
  307. package/huemagic/locales/es/hue-temperature.json +33 -0
  308. package/huemagic/locales/fr/hue-automation.html +59 -0
  309. package/huemagic/locales/fr/hue-automation.json +33 -0
  310. package/huemagic/locales/fr/hue-bridge-config.html +31 -0
  311. package/huemagic/locales/fr/hue-bridge-config.json +40 -0
  312. package/huemagic/locales/fr/hue-bridge.html +96 -0
  313. package/huemagic/locales/fr/hue-bridge.json +26 -0
  314. package/huemagic/locales/fr/hue-brightness.html +70 -0
  315. package/huemagic/locales/fr/hue-brightness.json +37 -0
  316. package/huemagic/locales/fr/hue-buttons.html +59 -0
  317. package/huemagic/locales/fr/hue-buttons.json +42 -0
  318. package/huemagic/locales/fr/hue-contact.html +67 -0
  319. package/huemagic/locales/fr/hue-contact.json +35 -0
  320. package/huemagic/locales/fr/hue-group.html +87 -0
  321. package/huemagic/locales/fr/hue-group.json +46 -0
  322. package/huemagic/locales/fr/hue-light.html +97 -0
  323. package/huemagic/locales/fr/hue-light.json +44 -0
  324. package/huemagic/locales/fr/hue-magic.html +68 -0
  325. package/huemagic/locales/fr/hue-magic.json +26 -0
  326. package/huemagic/locales/fr/hue-motion.html +64 -0
  327. package/huemagic/locales/fr/hue-motion.json +36 -0
  328. package/huemagic/locales/fr/hue-rules.html +69 -0
  329. package/huemagic/locales/fr/hue-rules.json +30 -0
  330. package/huemagic/locales/fr/hue-scene.html +43 -0
  331. package/huemagic/locales/fr/hue-scene.json +32 -0
  332. package/huemagic/locales/fr/hue-speaker.html +80 -0
  333. package/huemagic/locales/fr/hue-speaker.json +38 -0
  334. package/huemagic/locales/fr/hue-syncbox-config.html +19 -0
  335. package/huemagic/locales/fr/hue-syncbox-config.json +25 -0
  336. package/huemagic/locales/fr/hue-syncbox.html +86 -0
  337. package/huemagic/locales/fr/hue-syncbox.json +30 -0
  338. package/huemagic/locales/fr/hue-temperature.html +69 -0
  339. package/huemagic/locales/fr/hue-temperature.json +33 -0
  340. package/huemagic/locales/it/hue-automation.html +59 -0
  341. package/huemagic/locales/it/hue-automation.json +33 -0
  342. package/huemagic/locales/it/hue-bridge-config.html +31 -0
  343. package/huemagic/locales/it/hue-bridge-config.json +40 -0
  344. package/huemagic/locales/it/hue-bridge.html +96 -0
  345. package/huemagic/locales/it/hue-bridge.json +26 -0
  346. package/huemagic/locales/it/hue-brightness.html +70 -0
  347. package/huemagic/locales/it/hue-brightness.json +37 -0
  348. package/huemagic/locales/it/hue-buttons.html +59 -0
  349. package/huemagic/locales/it/hue-buttons.json +42 -0
  350. package/huemagic/locales/it/hue-contact.html +67 -0
  351. package/huemagic/locales/it/hue-contact.json +35 -0
  352. package/huemagic/locales/it/hue-group.html +87 -0
  353. package/huemagic/locales/it/hue-group.json +46 -0
  354. package/huemagic/locales/it/hue-light.html +97 -0
  355. package/huemagic/locales/it/hue-light.json +44 -0
  356. package/huemagic/locales/it/hue-magic.html +68 -0
  357. package/huemagic/locales/it/hue-magic.json +26 -0
  358. package/huemagic/locales/it/hue-motion.html +64 -0
  359. package/huemagic/locales/it/hue-motion.json +36 -0
  360. package/huemagic/locales/it/hue-rules.html +69 -0
  361. package/huemagic/locales/it/hue-rules.json +30 -0
  362. package/huemagic/locales/it/hue-scene.html +43 -0
  363. package/huemagic/locales/it/hue-scene.json +32 -0
  364. package/huemagic/locales/it/hue-speaker.html +80 -0
  365. package/huemagic/locales/it/hue-speaker.json +38 -0
  366. package/huemagic/locales/it/hue-syncbox-config.html +19 -0
  367. package/huemagic/locales/it/hue-syncbox-config.json +25 -0
  368. package/huemagic/locales/it/hue-syncbox.html +86 -0
  369. package/huemagic/locales/it/hue-syncbox.json +30 -0
  370. package/huemagic/locales/it/hue-temperature.html +69 -0
  371. package/huemagic/locales/it/hue-temperature.json +33 -0
  372. package/huemagic/locales/nl/hue-automation.html +59 -0
  373. package/huemagic/locales/nl/hue-automation.json +33 -0
  374. package/huemagic/locales/nl/hue-bridge-config.html +31 -0
  375. package/huemagic/locales/nl/hue-bridge-config.json +40 -0
  376. package/huemagic/locales/nl/hue-bridge.html +96 -0
  377. package/huemagic/locales/nl/hue-bridge.json +26 -0
  378. package/huemagic/locales/nl/hue-brightness.html +70 -0
  379. package/huemagic/locales/nl/hue-brightness.json +37 -0
  380. package/huemagic/locales/nl/hue-buttons.html +59 -0
  381. package/huemagic/locales/nl/hue-buttons.json +42 -0
  382. package/huemagic/locales/nl/hue-contact.html +67 -0
  383. package/huemagic/locales/nl/hue-contact.json +35 -0
  384. package/huemagic/locales/nl/hue-group.html +87 -0
  385. package/huemagic/locales/nl/hue-group.json +46 -0
  386. package/huemagic/locales/nl/hue-light.html +97 -0
  387. package/huemagic/locales/nl/hue-light.json +44 -0
  388. package/huemagic/locales/nl/hue-magic.html +68 -0
  389. package/huemagic/locales/nl/hue-magic.json +26 -0
  390. package/huemagic/locales/nl/hue-motion.html +64 -0
  391. package/huemagic/locales/nl/hue-motion.json +36 -0
  392. package/huemagic/locales/nl/hue-rules.html +69 -0
  393. package/huemagic/locales/nl/hue-rules.json +30 -0
  394. package/huemagic/locales/nl/hue-scene.html +43 -0
  395. package/huemagic/locales/nl/hue-scene.json +32 -0
  396. package/huemagic/locales/nl/hue-speaker.html +80 -0
  397. package/huemagic/locales/nl/hue-speaker.json +38 -0
  398. package/huemagic/locales/nl/hue-syncbox-config.html +19 -0
  399. package/huemagic/locales/nl/hue-syncbox-config.json +25 -0
  400. package/huemagic/locales/nl/hue-syncbox.html +86 -0
  401. package/huemagic/locales/nl/hue-syncbox.json +30 -0
  402. package/huemagic/locales/nl/hue-temperature.html +69 -0
  403. package/huemagic/locales/nl/hue-temperature.json +33 -0
  404. package/huemagic/locales/pl/hue-automation.html +59 -0
  405. package/huemagic/locales/pl/hue-automation.json +33 -0
  406. package/huemagic/locales/pl/hue-bridge-config.html +31 -0
  407. package/huemagic/locales/pl/hue-bridge-config.json +40 -0
  408. package/huemagic/locales/pl/hue-bridge.html +96 -0
  409. package/huemagic/locales/pl/hue-bridge.json +26 -0
  410. package/huemagic/locales/pl/hue-brightness.html +70 -0
  411. package/huemagic/locales/pl/hue-brightness.json +37 -0
  412. package/huemagic/locales/pl/hue-buttons.html +59 -0
  413. package/huemagic/locales/pl/hue-buttons.json +42 -0
  414. package/huemagic/locales/pl/hue-contact.html +67 -0
  415. package/huemagic/locales/pl/hue-contact.json +35 -0
  416. package/huemagic/locales/pl/hue-group.html +87 -0
  417. package/huemagic/locales/pl/hue-group.json +46 -0
  418. package/huemagic/locales/pl/hue-light.html +97 -0
  419. package/huemagic/locales/pl/hue-light.json +44 -0
  420. package/huemagic/locales/pl/hue-magic.html +68 -0
  421. package/huemagic/locales/pl/hue-magic.json +26 -0
  422. package/huemagic/locales/pl/hue-motion.html +64 -0
  423. package/huemagic/locales/pl/hue-motion.json +36 -0
  424. package/huemagic/locales/pl/hue-rules.html +69 -0
  425. package/huemagic/locales/pl/hue-rules.json +30 -0
  426. package/huemagic/locales/pl/hue-scene.html +43 -0
  427. package/huemagic/locales/pl/hue-scene.json +32 -0
  428. package/huemagic/locales/pl/hue-speaker.html +80 -0
  429. package/huemagic/locales/pl/hue-speaker.json +38 -0
  430. package/huemagic/locales/pl/hue-syncbox-config.html +19 -0
  431. package/huemagic/locales/pl/hue-syncbox-config.json +25 -0
  432. package/huemagic/locales/pl/hue-syncbox.html +86 -0
  433. package/huemagic/locales/pl/hue-syncbox.json +30 -0
  434. package/huemagic/locales/pl/hue-temperature.html +69 -0
  435. package/huemagic/locales/pl/hue-temperature.json +33 -0
  436. package/huemagic/locales/pt/hue-automation.html +59 -0
  437. package/huemagic/locales/pt/hue-automation.json +33 -0
  438. package/huemagic/locales/pt/hue-bridge-config.html +31 -0
  439. package/huemagic/locales/pt/hue-bridge-config.json +40 -0
  440. package/huemagic/locales/pt/hue-bridge.html +96 -0
  441. package/huemagic/locales/pt/hue-bridge.json +26 -0
  442. package/huemagic/locales/pt/hue-brightness.html +70 -0
  443. package/huemagic/locales/pt/hue-brightness.json +37 -0
  444. package/huemagic/locales/pt/hue-buttons.html +59 -0
  445. package/huemagic/locales/pt/hue-buttons.json +42 -0
  446. package/huemagic/locales/pt/hue-contact.html +67 -0
  447. package/huemagic/locales/pt/hue-contact.json +35 -0
  448. package/huemagic/locales/pt/hue-group.html +87 -0
  449. package/huemagic/locales/pt/hue-group.json +46 -0
  450. package/huemagic/locales/pt/hue-light.html +97 -0
  451. package/huemagic/locales/pt/hue-light.json +44 -0
  452. package/huemagic/locales/pt/hue-magic.html +68 -0
  453. package/huemagic/locales/pt/hue-magic.json +26 -0
  454. package/huemagic/locales/pt/hue-motion.html +64 -0
  455. package/huemagic/locales/pt/hue-motion.json +36 -0
  456. package/huemagic/locales/pt/hue-rules.html +69 -0
  457. package/huemagic/locales/pt/hue-rules.json +30 -0
  458. package/huemagic/locales/pt/hue-scene.html +43 -0
  459. package/huemagic/locales/pt/hue-scene.json +32 -0
  460. package/huemagic/locales/pt/hue-speaker.html +80 -0
  461. package/huemagic/locales/pt/hue-speaker.json +38 -0
  462. package/huemagic/locales/pt/hue-syncbox-config.html +19 -0
  463. package/huemagic/locales/pt/hue-syncbox-config.json +25 -0
  464. package/huemagic/locales/pt/hue-syncbox.html +86 -0
  465. package/huemagic/locales/pt/hue-syncbox.json +30 -0
  466. package/huemagic/locales/pt/hue-temperature.html +69 -0
  467. package/huemagic/locales/pt/hue-temperature.json +33 -0
  468. package/huemagic/locales/tr/hue-automation.html +59 -0
  469. package/huemagic/locales/tr/hue-automation.json +33 -0
  470. package/huemagic/locales/tr/hue-bridge-config.html +31 -0
  471. package/huemagic/locales/tr/hue-bridge-config.json +40 -0
  472. package/huemagic/locales/tr/hue-bridge.html +96 -0
  473. package/huemagic/locales/tr/hue-bridge.json +26 -0
  474. package/huemagic/locales/tr/hue-brightness.html +70 -0
  475. package/huemagic/locales/tr/hue-brightness.json +37 -0
  476. package/huemagic/locales/tr/hue-buttons.html +59 -0
  477. package/huemagic/locales/tr/hue-buttons.json +42 -0
  478. package/huemagic/locales/tr/hue-contact.html +67 -0
  479. package/huemagic/locales/tr/hue-contact.json +35 -0
  480. package/huemagic/locales/tr/hue-group.html +87 -0
  481. package/huemagic/locales/tr/hue-group.json +46 -0
  482. package/huemagic/locales/tr/hue-light.html +97 -0
  483. package/huemagic/locales/tr/hue-light.json +44 -0
  484. package/huemagic/locales/tr/hue-magic.html +68 -0
  485. package/huemagic/locales/tr/hue-magic.json +26 -0
  486. package/huemagic/locales/tr/hue-motion.html +64 -0
  487. package/huemagic/locales/tr/hue-motion.json +36 -0
  488. package/huemagic/locales/tr/hue-rules.html +69 -0
  489. package/huemagic/locales/tr/hue-rules.json +30 -0
  490. package/huemagic/locales/tr/hue-scene.html +43 -0
  491. package/huemagic/locales/tr/hue-scene.json +32 -0
  492. package/huemagic/locales/tr/hue-speaker.html +80 -0
  493. package/huemagic/locales/tr/hue-speaker.json +38 -0
  494. package/huemagic/locales/tr/hue-syncbox-config.html +19 -0
  495. package/huemagic/locales/tr/hue-syncbox-config.json +25 -0
  496. package/huemagic/locales/tr/hue-syncbox.html +86 -0
  497. package/huemagic/locales/tr/hue-syncbox.json +30 -0
  498. package/huemagic/locales/tr/hue-temperature.html +69 -0
  499. package/huemagic/locales/tr/hue-temperature.json +33 -0
  500. package/huemagic/utils/api.js +158 -54
  501. package/huemagic/utils/color.js +20 -2
  502. package/huemagic/utils/merge.js +3 -2
  503. package/huemagic/utils/messages.js +506 -120
  504. package/huemagic/utils/sse.js +51 -0
  505. package/huemagic/utils/syncbox.js +84 -0
  506. package/package.json +19 -11
  507. package/.github/FUNDING.yml +0 -2
  508. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -30
  509. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  510. package/.github/workflows/npm.yml +0 -18
  511. package/huemagic/locales/en-US/hue-bridge-config.json +0 -29
  512. package/huemagic/locales/en-US/hue-buttons.json +0 -34
  513. package/huemagic/locales/en-US/hue-light.json +0 -38
  514. /package/huemagic/locales/{en-US → en}/hue-bridge-config.html +0 -0
  515. /package/huemagic/locales/{en-US → en}/hue-magic.json +0 -0
@@ -0,0 +1,274 @@
1
+ module.exports = function(RED)
2
+ {
3
+ "use strict";
4
+
5
+ function HueSyncBoxNode(config)
6
+ {
7
+ RED.nodes.createNode(this, config);
8
+
9
+ const scope = this;
10
+ const syncbox = RED.nodes.getNode(config.syncbox);
11
+ const async = require('async');
12
+
13
+ // SAVE LAST COMMAND
14
+ this.lastCommand = null;
15
+
16
+ //
17
+ // CHECK CONFIG
18
+ if(syncbox == null)
19
+ {
20
+ this.status({fill: "red", shape: "ring", text: "hue-syncbox.node.not-configured"});
21
+ return false;
22
+ }
23
+
24
+ //
25
+ // UPDATE STATE
26
+ this.status({fill: "grey", shape: "dot", text: "hue-syncbox.node.connecting"});
27
+
28
+ //
29
+ // SUBSCRIBE TO UPDATES FROM THE SYNC BOX
30
+ this.unsubscribe = syncbox.subscribe(function(info)
31
+ {
32
+ let currentState = syncbox.get();
33
+ if(currentState === false) { return false; }
34
+
35
+ // SEND MESSAGE
36
+ if(!config.skipevents && (config.initevents || info.suppressMessage == false) && (!config.onlycommands || scope.lastCommand !== null))
37
+ {
38
+ // SET LAST COMMAND
39
+ if(scope.lastCommand !== null)
40
+ {
41
+ currentState.command = scope.lastCommand;
42
+ }
43
+
44
+ // SEND STATE
45
+ scope.send(currentState);
46
+
47
+ // RESET LAST COMMAND
48
+ scope.lastCommand = null;
49
+ }
50
+
51
+ // CHANGE UI STATE
52
+ if(currentState.payload.on === false)
53
+ {
54
+ scope.status({fill: "grey", shape: "dot", text: "hue-syncbox.node.powersave"});
55
+ }
56
+ else if(currentState.payload.syncing === true)
57
+ {
58
+ scope.status({fill: "green", shape: "dot", text: RED._("hue-syncbox.node.syncing", { mode: currentState.payload.mode, intensity: currentState.payload.intensity })});
59
+ }
60
+ else
61
+ {
62
+ scope.status({fill: "blue", shape: "dot", text: "hue-syncbox.node.passthrough"});
63
+ }
64
+ });
65
+
66
+ //
67
+ // CONTROL THE SYNC BOX
68
+ this.on('input', function(msg, send, done)
69
+ {
70
+ // REDEFINE SEND AND DONE IF NOT AVAILABLE
71
+ send = send || function() { scope.send.apply(scope,arguments); }
72
+ done = done || function() { scope.done.apply(scope,arguments); }
73
+
74
+ // SAVE LAST COMMAND
75
+ scope.lastCommand = RED.util.cloneMessage(msg);
76
+
77
+ // GET CURRENT STATE
78
+ let currentState = syncbox.get();
79
+ if(currentState === false)
80
+ {
81
+ scope.error(RED._("hue-syncbox.node.error-not-available"), msg);
82
+ return false;
83
+ }
84
+
85
+ // JUST GIVE BACK THE CURRENT STATE
86
+ if( (typeof msg.payload != 'undefined' && typeof msg.payload.status != 'undefined') || (typeof msg.__user_inject_props__ != 'undefined' && msg.__user_inject_props__ == "status") )
87
+ {
88
+ // SET LAST COMMAND
89
+ if(scope.lastCommand !== null)
90
+ {
91
+ currentState.command = scope.lastCommand;
92
+ }
93
+
94
+ // SEND STATE
95
+ scope.send(currentState);
96
+
97
+ // RESET LAST COMMAND
98
+ scope.lastCommand = null;
99
+
100
+ if(done) { done(); }
101
+ return true;
102
+ }
103
+
104
+ // CREATE PATCH
105
+ let patchObject = {};
106
+
107
+ // TURN THE BOX ON OR OFF (SIMPLE MODE)
108
+ if(msg.payload === true || msg.payload === false)
109
+ {
110
+ patchObject["mode"] = (msg.payload === true) ? (currentState.payload.lastSyncMode || "video") : "powersave";
111
+ }
112
+
113
+ // SET THE MODE
114
+ if(typeof msg.payload != 'undefined' && typeof msg.payload.mode != 'undefined')
115
+ {
116
+ const modes = ["powersave", "passthrough", "video", "game", "music", "ambient"];
117
+
118
+ if(modes.indexOf(msg.payload.mode) === -1)
119
+ {
120
+ scope.error(RED._("hue-syncbox.node.error-invalid-mode", { modes: modes.join(", ") }), msg);
121
+ return false;
122
+ }
123
+
124
+ patchObject["mode"] = msg.payload.mode;
125
+ }
126
+
127
+ // START / STOP SYNCING
128
+ if(typeof msg.payload != 'undefined' && typeof msg.payload.sync != 'undefined')
129
+ {
130
+ patchObject["syncActive"] = (msg.payload.sync === true);
131
+ }
132
+
133
+ // TOGGLE SYNCING
134
+ if(typeof msg.payload != 'undefined' && typeof msg.payload.toggle != 'undefined')
135
+ {
136
+ patchObject["toggleSyncActive"] = true;
137
+ }
138
+
139
+ // PASS THE PICTURE THROUGH WITHOUT SYNCING
140
+ if(typeof msg.payload != 'undefined' && typeof msg.payload.passthrough != 'undefined')
141
+ {
142
+ patchObject["hdmiActive"] = (msg.payload.passthrough === true);
143
+ }
144
+
145
+ // HOW STRONG THE LIGHTS FOLLOW THE PICTURE
146
+ if(typeof msg.payload != 'undefined' && typeof msg.payload.intensity != 'undefined')
147
+ {
148
+ const intensities = ["subtle", "moderate", "high", "intense"];
149
+
150
+ if(intensities.indexOf(msg.payload.intensity) === -1)
151
+ {
152
+ scope.error(RED._("hue-syncbox.node.error-invalid-intensity", { intensities: intensities.join(", ") }), msg);
153
+ return false;
154
+ }
155
+
156
+ patchObject["intensity"] = msg.payload.intensity;
157
+ }
158
+
159
+ // BRIGHTNESS / THE BOX COUNTS TO 200, HUEMAGIC COUNTS IN PERCENT
160
+ if(typeof msg.payload != 'undefined' && typeof msg.payload.brightness != 'undefined')
161
+ {
162
+ const brightness = parseFloat(msg.payload.brightness);
163
+
164
+ if(isNaN(brightness) || brightness < 0 || brightness > 100)
165
+ {
166
+ scope.error(RED._("hue-syncbox.node.error-invalid-brightness"), msg);
167
+ return false;
168
+ }
169
+
170
+ patchObject["brightness"] = Math.round((200/100)*brightness);
171
+ }
172
+ else if(typeof msg.payload != 'undefined' && typeof msg.payload.brightnessLevel != 'undefined')
173
+ {
174
+ const level = parseInt(msg.payload.brightnessLevel);
175
+
176
+ if(isNaN(level) || level < 0 || level > 200)
177
+ {
178
+ scope.error(RED._("hue-syncbox.node.error-invalid-brightness-level"), msg);
179
+ return false;
180
+ }
181
+
182
+ patchObject["brightness"] = level;
183
+ }
184
+ else if(typeof msg.payload != 'undefined' && typeof msg.payload.incrementBrightness != 'undefined')
185
+ {
186
+ const step = (isNaN(msg.payload.incrementBrightness)) ? 10 : parseFloat(msg.payload.incrementBrightness);
187
+ patchObject["incrementBrightness"] = Math.round((200/100)*step);
188
+ }
189
+ else if(typeof msg.payload != 'undefined' && typeof msg.payload.decrementBrightness != 'undefined')
190
+ {
191
+ const step = (isNaN(msg.payload.decrementBrightness)) ? 10 : parseFloat(msg.payload.decrementBrightness);
192
+ patchObject["incrementBrightness"] = Math.round((-200/100)*step);
193
+ }
194
+
195
+ // WHICH HDMI INPUT THE BOX SHOWS
196
+ if(typeof msg.payload != 'undefined' && typeof msg.payload.input != 'undefined')
197
+ {
198
+ const input = (!isNaN(msg.payload.input)) ? ("input" + parseInt(msg.payload.input)) : (msg.payload.input + "");
199
+
200
+ if(["input1", "input2", "input3", "input4"].indexOf(input) === -1)
201
+ {
202
+ scope.error(RED._("hue-syncbox.node.error-invalid-input"), msg);
203
+ return false;
204
+ }
205
+
206
+ patchObject["hdmiSource"] = input;
207
+ }
208
+
209
+ // WHICH ENTERTAINMENT AREA THE BOX DRIVES
210
+ if(typeof msg.payload != 'undefined' && typeof msg.payload.entertainmentArea != 'undefined')
211
+ {
212
+ patchObject["hueTarget"] = msg.payload.entertainmentArea;
213
+ }
214
+
215
+ //
216
+ // SHOULD PATCH?
217
+ if(Object.values(patchObject).length > 0)
218
+ {
219
+ scope.status({fill: "grey", shape: "ring", text: "hue-syncbox.node.command"});
220
+
221
+ // PATCH!
222
+ async.retry({
223
+ times: 5,
224
+ errorFilter: function(err) {
225
+ return (err.status == 503 || err.status == 429);
226
+ },
227
+ interval: function(retryCount) { return 750*retryCount; }
228
+ },
229
+ function(callback, results)
230
+ {
231
+ syncbox.execute(patchObject)
232
+ .then(function() { callback(null, true); })
233
+ .catch(function(errors) { callback(errors, null); });
234
+ },
235
+ function(errors, success)
236
+ {
237
+ if(errors)
238
+ {
239
+ scope.error(errors, msg);
240
+ }
241
+ else if(done)
242
+ {
243
+ done();
244
+ }
245
+ });
246
+ }
247
+ else
248
+ {
249
+ // SET LAST COMMAND
250
+ if(scope.lastCommand !== null)
251
+ {
252
+ currentState.command = scope.lastCommand;
253
+ }
254
+
255
+ // SEND STATE
256
+ scope.send(currentState);
257
+
258
+ // RESET LAST COMMAND
259
+ scope.lastCommand = null;
260
+
261
+ if(done) { done(); }
262
+ }
263
+ });
264
+
265
+ //
266
+ // CLOSE NODE / DETACH FROM THE SYNC BOX
267
+ this.on('close', function()
268
+ {
269
+ if(scope.unsubscribe) { scope.unsubscribe(); }
270
+ });
271
+ }
272
+
273
+ RED.nodes.registerType("hue-syncbox", HueSyncBoxNode);
274
+ }
@@ -4,7 +4,7 @@
4
4
  <input type="text" id="node-input-name" data-i18n="[placeholder]hue-temperature.config.input-name" style="width: calc(100% - 105px)">
5
5
  </div>
6
6
  <div class="form-row">
7
- <label for="node-input-bridge"><i class="fa fa-server"></i> Bridge</label>
7
+ <label for="node-input-bridge"><i class="fa fa-server"></i> <span data-i18n="hue-temperature.config.bridge"></span></label>
8
8
  <input type="text" id="node-input-bridge" style="width: calc(100% - 105px)">
9
9
  </div>
10
10
  <div class="form-row">
@@ -18,16 +18,26 @@
18
18
  </button>
19
19
  </div>
20
20
  </div>
21
+ <div class="form-row">
22
+ <label for="node-input-offset"><i class="fa fa-sliders"></i> <span data-i18n="hue-temperature.config.offset"></span></label>
23
+ <input type="number" id="node-input-offset" placeholder="0" step="0.1" style="width: calc(100% - 105px)">
24
+ </div>
21
25
  <div class="form-row" style="margin-top: 30px">
22
- <div style="display: inline-flex; width: calc(100% - 105px)">
23
- <input type="checkbox" id="node-input-skipevents" style="flex: 15px;">
24
- <span data-i18n="hue-temperature.config.skipevents-node" style="width: 100%; margin-left: 10px;"></span>
26
+ <div style="display: inline-flex; align-items: center; width: calc(100% - 105px)">
27
+ <input type="checkbox" id="node-input-skipevents" style="flex: 0 0 auto; width: auto; margin: 0;">
28
+ <span data-i18n="hue-temperature.config.skipevents-node" style="flex: 1; margin-left: 8px;"></span>
25
29
  </div>
26
30
  </div>
27
31
  <div class="form-row">
28
- <div style="display: inline-flex; width: calc(100% - 105px)">
29
- <input type="checkbox" id="node-input-initevents" style="flex: 15px;">
30
- <span data-i18n="hue-temperature.config.sendinitevents-node" style="width: 100%; margin-left: 10px;"></span>
32
+ <div style="display: inline-flex; align-items: center; width: calc(100% - 105px)">
33
+ <input type="checkbox" id="node-input-initevents" style="flex: 0 0 auto; width: auto; margin: 0;">
34
+ <span data-i18n="hue-temperature.config.sendinitevents-node" style="flex: 1; margin-left: 8px;"></span>
35
+ </div>
36
+ </div>
37
+ <div class="form-row">
38
+ <div style="display: inline-flex; align-items: center; width: calc(100% - 105px)">
39
+ <input type="checkbox" id="node-input-onlycommands" style="flex: 0 0 auto; width: auto; margin: 0;">
40
+ <span data-i18n="hue-temperature.config.onlycommands-node" style="flex: 1; margin-left: 8px;"></span>
31
41
  </div>
32
42
  </div>
33
43
  </script>
@@ -40,13 +50,15 @@
40
50
  name: { value:"" },
41
51
  bridge: { type: "hue-bridge", required: true },
42
52
  sensorid: { value:"", required: false },
53
+ offset: { value: 0, validate: function(v) { return (v === "" || !isNaN(v)); } },
43
54
  skipevents: { value: false },
44
- initevents: { value: false }
55
+ initevents: { value: false },
56
+ onlycommands: { value: false }
45
57
  },
46
58
  inputs: 1,
47
59
  outputs: 1,
48
60
  align: 'left',
49
- icon: "hue-temperature.png",
61
+ icon: "hue-temperature.svg",
50
62
  label: function() {
51
63
  return this.name || this._("hue-temperature.node.title");
52
64
  },
@@ -37,15 +37,15 @@ module.exports = function(RED)
37
37
 
38
38
  //
39
39
  // SUBSCRIBE TO UPDATES FROM THE BRIDGE
40
- bridge.subscribe("temperature", config.sensorid, function(info)
40
+ this.unsubscribe = bridge.subscribe("temperature", config.sensorid, function(info)
41
41
  {
42
- let currentState = bridge.get("temperature", info.id);
42
+ let currentState = bridge.get("temperature", info.id, { offset: config.offset });
43
43
 
44
44
  // RESOURCE FOUND?
45
45
  if(currentState !== false)
46
46
  {
47
47
  // SEND MESSAGE
48
- if(!config.skipevents && (config.initevents || info.suppressMessage == false))
48
+ if(!config.skipevents && (config.initevents || info.suppressMessage == false) && (!config.onlycommands || scope.lastCommand !== null))
49
49
  {
50
50
  // SET LAST COMMAND
51
51
  if(scope.lastCommand !== null)
@@ -112,14 +112,14 @@ module.exports = function(RED)
112
112
  const tempSensorID = (!config.sensorid && typeof msg.topic != 'undefined' && bridge.validResourceID.test(msg.topic) === true) ? msg.topic : config.sensorid;
113
113
  if(!tempSensorID)
114
114
  {
115
- scope.error("Please submit a valid sensor ID.");
115
+ scope.error(RED._("hue-temperature.node.error-no-id"), msg);
116
116
  return false;
117
117
  }
118
118
 
119
- let currentState = bridge.get("temperature", tempSensorID);
119
+ let currentState = bridge.get("temperature", tempSensorID, { offset: config.offset });
120
120
  if(!currentState)
121
121
  {
122
- scope.error("The sensor in not yet available. Please wait until HueMagic has established a connection with the bridge or check whether the resource ID in the configuration is valid.");
122
+ scope.error(RED._("hue-temperature.node.error-not-available"), msg);
123
123
  return false;
124
124
  }
125
125
 
@@ -161,11 +161,11 @@ module.exports = function(RED)
161
161
 
162
162
  // PATCH!
163
163
  async.retry({
164
- times: 3,
164
+ times: 5,
165
165
  errorFilter: function(err) {
166
- return (err.status == 503);
166
+ return (err.status == 503 || err.status == 429);
167
167
  },
168
- interval: function(retryCount) { return retryCount*2000; }
168
+ interval: function(retryCount) { return 750*retryCount; }
169
169
  },
170
170
  function(callback, results)
171
171
  {
@@ -202,7 +202,15 @@ module.exports = function(RED)
202
202
  if(done) { done(); }
203
203
  }
204
204
  });
205
+
206
+ //
207
+ // CLOSE NODE / DETACH FROM THE BRIDGE
208
+ this.on('close', function()
209
+ {
210
+ if(scope.unsubscribe) { scope.unsubscribe(); }
211
+ });
212
+
205
213
  }
206
214
 
207
215
  RED.nodes.registerType("hue-temperature", HueTemperature);
208
- }
216
+ }
@@ -0,0 +1,3 @@
1
+ <svg width="40" height="60" viewBox="0 0 40 60" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M20 13C29.389 13 37 20.611 37 30C37 39.389 29.389 47 20 47C10.611 47 3 39.389 3 30C3 20.611 10.611 13 20 13ZM20 19.4C19.061 19.4 18.3 20.161 18.3 21.1V30C18.3 30.451 18.479 30.883 18.798 31.202L24.098 36.502C24.762 37.166 25.838 37.166 26.502 36.502C27.166 35.838 27.166 34.762 26.502 34.098L21.7 29.296V21.1C21.7 20.161 20.939 19.4 20 19.4Z" fill="white"/>
3
+ </svg>
Binary file
@@ -0,0 +1,4 @@
1
+ <svg width="40" height="60" viewBox="0 0 40 60" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M23 12C24.3807 12 25.5 13.1193 25.5 14.5V45.5C25.5 46.8807 24.3807 48 23 48H7C5.61929 48 4.5 46.8807 4.5 45.5V14.5C4.5 13.1193 5.61929 12 7 12H23ZM21.5 28.0996C20.4507 28.0996 19.5996 28.9507 19.5996 30C19.5996 31.0493 20.4507 31.9004 21.5 31.9004C22.5493 31.9004 23.4004 31.0493 23.4004 30C23.4004 28.9507 22.5493 28.0996 21.5 28.0996Z" fill="white"/>
3
+ <rect x="29.5" y="12" width="6" height="36" rx="2.5" fill="white"/>
4
+ </svg>
Binary file
@@ -0,0 +1,6 @@
1
+ <svg width="40" height="60" viewBox="0 0 40 60" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M6.5 26.5C6.5 25.67 7.17 25 8 25H13L20.2 17.8C21.15 16.85 22.5 17.52 22.5 18.86V41.14C22.5 42.48 21.15 43.15 20.2 42.2L13 35H8C7.17 35 6.5 34.33 6.5 33.5V26.5Z" fill="white"/>
3
+ <path d="M26.45 24.10A7.70 7.70 0 0 1 26.45 35.90L24.91 34.06A5.30 5.30 0 0 0 24.91 25.94Z" fill="white"/>
4
+ <path d="M29.02 21.04A11.70 11.70 0 0 1 29.02 38.96L27.48 37.12A9.30 9.30 0 0 0 27.48 22.88Z" fill="white"/>
5
+ <path d="M31.59 17.97A15.70 15.70 0 0 1 31.59 42.03L30.05 40.19A13.30 13.30 0 0 0 30.05 19.81Z" fill="white"/>
6
+ </svg>
Binary file
@@ -0,0 +1,7 @@
1
+ <svg width="40" height="60" viewBox="0 0 40 60" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M9 18C7.343 18 6 19.343 6 21V37C6 38.657 7.343 40 9 40H31C32.657 40 34 38.657 34 37V21C34 19.343 32.657 18 31 18H9ZM9.8 21.6C9.358 21.6 9 21.958 9 22.4V35.6C9 36.042 9.358 36.4 9.8 36.4H30.2C30.642 36.4 31 36.042 31 35.6V22.4C31 21.958 30.642 21.6 30.2 21.6H9.8Z" fill="white"/>
3
+ <path d="M16.5 42.4H23.5L24.4 45.4H29C29.663 45.4 30.2 45.937 30.2 46.6C30.2 47.263 29.663 47.8 29 47.8H11C10.337 47.8 9.8 47.263 9.8 46.6C9.8 45.937 10.337 45.4 11 45.4H15.6L16.5 42.4Z" fill="white"/>
4
+ <path d="M4.2 24.5C4.2 23.837 3.663 23.3 3 23.3C2.337 23.3 1.8 23.837 1.8 24.5V33.5C1.8 34.163 2.337 34.7 3 34.7C3.663 34.7 4.2 34.163 4.2 33.5V24.5Z" fill="white"/>
5
+ <path d="M38.2 24.5C38.2 23.837 37.663 23.3 37 23.3C36.337 23.3 35.8 23.837 35.8 24.5V33.5C35.8 34.163 36.337 34.7 37 34.7C37.663 34.7 38.2 34.163 38.2 33.5V24.5Z" fill="white"/>
6
+ <path d="M20 12.6C20.663 12.6 21.2 13.137 21.2 13.8V15.4C21.2 16.063 20.663 16.6 20 16.6C19.337 16.6 18.8 16.063 18.8 15.4V13.8C18.8 13.137 19.337 12.6 20 12.6Z" fill="white"/>
7
+ </svg>
@@ -0,0 +1,59 @@
1
+ <script type="text/markdown" data-help-name="hue-automation">
2
+ Der „Hue Automation“-Node kann die Automationen aktivieren und deaktivieren, die Sie in der Philips Hue App angelegt haben.
3
+
4
+ ### Einrichtung
5
+
6
+ Wählen Sie die vorkonfigurierte Hue Bridge und klicken Sie auf die Suchschaltfläche, um alle verfügbaren Automationen zu finden. Wenn Sie die ID der Automation bereits kennen, können Sie sie auch manuell an dieser Stelle eintragen. Sie können intern entweder einen neuen Namen für die Automation vergeben oder den vordefinierten Namen wählen. Optional können Sie auch alle automatischen Statusmeldungen dieses Nodes deaktivieren, indem Sie die Einstellung „Ignoriere die Mitteilungen des Nodes“ anklicken. Der Node wird anschließend keine Updates mehr ausgeben. Alternativ können Sie auch auswählen, ob die Initialisierungsnachricht des Nodes beim Start von Node-RED nicht unterdrückt werden soll. Wenn Sie diese Einstellung aktivieren, erhalten Sie nach jedem Deploy eine Statusmeldung der aktuell ausgewählten Automation. Wenn der Node lieber still bleiben soll, bis Sie ihm etwas schicken, aktivieren Sie „Nur nach einem Befehl melden“. Er ignoriert dann Änderungen aus der App oder von einem Schalter und antwortet nur auf Ihre eigenen Befehle.
7
+
8
+ Wenn Sie keine Automation auswählen und die Node-Konfiguration so anwenden, arbeitet der Node im sogenannten „Universalmodus“. In diesem Modus empfängt der Node alle Statusmitteilungen desselben Typs und gibt diese aus. Sie können aber auch Einstellungen im Universalmodus auf eine bestimmte Automation anwenden, indem Sie die entsprechende Automations-ID als String in `msg.topic` zusammen mit Ihren Einstellungen übergeben.
9
+
10
+ ### Automation aktivieren / deaktivieren
11
+
12
+ Eine deaktivierte Automation bleibt auf der Bridge erhalten und kann jederzeit wieder aktiviert werden. Übergeben Sie dafür ein Objekt mit folgendem Inhalt:
13
+
14
+ : payload (boolean) : `true` aktiviert die Automation, `false` deaktiviert sie
15
+ : enabled (boolean) : Dasselbe wie oben, falls Sie lieber ein Objekt übergeben
16
+ : toggle (boolean | any) : Wechselt zwischen aktiviert und deaktiviert, abhängig vom vorherigen Zustand
17
+
18
+ ### Statusnachrichten des Nodes
19
+
20
+ Sobald sich die Automation ändert, wird folgende Statusnachricht vom Node zurückgegeben:
21
+
22
+ #### Statusobjekt unter `msg.payload`
23
+
24
+ : enabled (boolean) : Zeigt an, ob die Automation aktiviert ist
25
+ : running (boolean) : `true`, solange die Bridge die Automation tatsächlich ausführt
26
+ : status (string | boolean) : Der aktuelle Status. Kann `initializing`, `running`, `disabled` oder `errored` als Wert beinhalten
27
+ : lastError (string | boolean) : Der letzte von der Bridge gemeldete Fehler oder `false`
28
+ : updated (string) : Zeitpunkt der letzten Aktualisierung der Ressource von HueMagic (ISO 8601)
29
+
30
+ #### Informationen zur Automation unter `msg.info`
31
+
32
+ : id (string) : Gibt die ID der Automation an
33
+ : idV1 (string | boolean) : Gibt die alte ID der Automation an
34
+ : name (string | boolean) : Der Name, den Sie der Automation in der Philips Hue App gegeben haben
35
+ : type (string) : Der Typ der Ressource (immer `automation`)
36
+ : script (string | boolean) : Die ID des Verhaltensskripts hinter der Automation
37
+
38
+ #### Konfiguration unter `msg.configuration`
39
+
40
+ Beinhaltet die Einstellungen der Automation, so wie sie von der Philips Hue App hinterlegt wurden. Der Aufbau hängt von der Art der Automation ab und wird unverändert durchgereicht.
41
+
42
+ #### Statusänderungen unter `msg.updated`
43
+
44
+ Listet einzelne Parameter in Form eines Objekts auf, die sich im Vergleich zum letzten Zustand der Automation geändert haben. Wenn keine Änderungen registriert wurden, ist dieses Objekt leer.
45
+
46
+ #### Letzter Zustand der Automation unter `msg.lastState`
47
+
48
+ Beinhaltet das komplette Statusobjekt (siehe Ausgabewerte oben) des letzten Zustands vor der zuletzt registrierten Änderung. Wenn der letzte Zustand von HueMagic noch nicht registriert wurde, wird `false` ausgegeben.
49
+
50
+ #### Letzter Befehl unter `msg.command` (optional)
51
+
52
+ Wenn sich der Status des Nodes über einen bestimmten Befehl geändert hat, wird zusätzlich der komplette Befehl ausgegeben, der ausgeführt wurde. Andernfalls wird dieses Objekt vom Node nicht ausgegeben.
53
+
54
+ ### Beispiele von HueMagic
55
+
56
+ HueMagic stellt einige Beispielkonfigurationen zu diesem Node zur Verfügung. Um ein fertiges Beispiel in Ihrer Node-RED-Oberfläche zu importieren, klicken Sie auf das Menü-Icon von Node-RED, wählen Sie dann „Import“ und navigieren Sie in der Sidebar des Popups auf „Beispiele“. Wählen Sie anschließend den HueMagic-Ordner aus und Ihren gewünschten Node, um einen Beispielflow zu importieren.
57
+
58
+ ![examples](hue/assets/huemagic-examples.gif)
59
+ </script>
@@ -0,0 +1,33 @@
1
+ {
2
+ "hue-automation": {
3
+ "config": {
4
+ "name": "Name",
5
+ "input-name": "Name der Automation",
6
+ "skipevents-node": "Ignoriere die Mitteilungen des Nodes",
7
+ "sendinitevents-node": "Initialisierungsnachricht nicht unterdrücken",
8
+ "onlycommands-node": "Nur nach einem Befehl melden",
9
+ "searching": "Suche nach Automationen…",
10
+ "none-found": "Keine Automationen gefunden!",
11
+ "unknown-error": "Etwas ist schief gelaufen. Bitte versuchen Sie es erneut.",
12
+ "automation": "Automation",
13
+ "bridge": "Bridge",
14
+ "universalevents": "Universelle Ereignisse",
15
+ "universalevents-node": "Empfängt alle Nachrichten von anderen Nodes des gleichen Typs (nur im Universalmodus)"
16
+ },
17
+ "node": {
18
+ "title": "Hue Automation",
19
+ "not-configured": "nicht konfiguriert",
20
+ "init": "initialisiere…",
21
+ "enabled": "aktiviert",
22
+ "disabled": "deaktiviert",
23
+ "errored": "Fehler",
24
+ "universal": "Universalmodus",
25
+ "input": "aktivieren / deaktivieren",
26
+ "output": "Automation",
27
+ "command": "führt Befehl aus…",
28
+ "statusmsg": "Status erfolgreich abgefragt…",
29
+ "error-no-id": "Bitte geben Sie eine gültige Automations-ID an.",
30
+ "error-not-available": "Die Automation ist noch nicht verfügbar. Bitte warten Sie, bis HueMagic eine Verbindung zur Bridge aufgebaut hat, oder prüfen Sie, ob die Ressourcen-ID in der Konfiguration gültig ist."
31
+ }
32
+ }
33
+ }
@@ -1,8 +1,6 @@
1
1
  {
2
- "hue-bridge-config":
3
- {
4
- "config":
5
- {
2
+ "hue-bridge-config": {
3
+ "config": {
6
4
  "name": "Name",
7
5
  "apikey": "Nutzer",
8
6
  "missing-ip": "Die IP-Adresse der Hue Bridge fehlt!",
@@ -13,17 +11,30 @@
13
11
  "unknown-error": "Etwas ist schief gelaufen. Bitte versuchen Sie es erneut.",
14
12
  "invalid": "Sorry. Die ausgewählte Hue Bridge ist ungültig: ",
15
13
  "error-select-first": "Bitte wählen Sie eine Hue Bridge, bevor Sie versuchen einen neuen Nutzer zu erstellen!",
16
- "waiting": "warte 20 Sekunden…",
17
- "new-user-press": "Bitte betätigen Sie die taste der Hue Bridge innerhalb der nächsten 20 Sekunden!",
18
- "retry": "Bitte versuchen Sie es erneut innerhalb von 20 Sekunden!",
14
+ "waiting": "warte auf den Knopfdruck…",
15
+ "new-user-press": "Bitte betätigen Sie jetzt die Taste auf der Hue Bridge!",
16
+ "retry": "Keine Taste erkannt. Bitte erneut versuchen…",
19
17
  "success": "Ein neuer Nutzer wurde erfolgreich angelegt!",
20
18
  "connecting": "Verbindungsaufbau mit der Hue Bridge…",
21
- "autoupdates": "Automatische Firmware-Updates aktivieren"
19
+ "autoupdates": "Automatische Firmware-Updates aktivieren",
20
+ "bridge-ip": "Bridge IP",
21
+ "worker": "Worker"
22
22
  },
23
- "node":
24
- {
23
+ "node": {
25
24
  "title": "Hue Bridge",
26
- "statusmsg": "Status erfolgreich abgefragt…"
25
+ "statusmsg": "Status erfolgreich abgefragt…",
26
+ "initializing": "Initialisiere die Bridge (__bridge__)…",
27
+ "connected": "Mit der Bridge verbunden",
28
+ "processing": "Verarbeite die Ressourcen der Bridge…",
29
+ "initial-emit": "Erstmalige Ausgabe der Ressourcen-Zustände…",
30
+ "keep-updated": "Halte die Nodes auf dem aktuellen Stand…",
31
+ "subscribing": "Abonniere die Ereignisse der Bridge…",
32
+ "unsubscribing": "Ereignisse der Bridge abbestellt…",
33
+ "no-legacy-api": "Die Bridge antwortet nicht auf die alte API, fahre ohne ihre Konfiguration fort…",
34
+ "request-error": "Fehler beim Abrufen der Informationen von der Bridge (__error__)",
35
+ "connection-lost": "Verbindung zur Bridge verloren (__reason__). Neuer Versuch in __seconds__ Sekunden…",
36
+ "resources-changed": "Die Ressourcen auf der Bridge haben sich geändert. Lade neu…",
37
+ "not-connected": "Die Bridge ist nicht verbunden."
27
38
  }
28
39
  }
29
- }
40
+ }
@@ -27,7 +27,10 @@ Mit dem „fetch“-Befehl können Sie eine Liste von spezifischen Geräten ausg
27
27
 
28
28
  ### Hue Bridge Einstellungen ändern
29
29
 
30
- Mit dem folgenden Befehl können Sie spezifische Einstellungen auf der Bridge ändern. Bitte beachten Sie, dass das Ändern der Netzwerkeinstellungen die Neukonfiguration der Bridge auf HueMagic erfordert. Übergeben Sie das Objekt `msg.payload.settings` mit folgenden Einstellungsmöglichkeiten an den Node:
30
+ Mit dem folgenden Befehl können Sie spezifische Einstellungen auf der Bridge ändern. Übergeben Sie das Objekt `msg.payload.settings` mit folgenden Einstellungsmöglichkeiten an den Node:
31
+
32
+ > [!WARNING]
33
+ > Das Ändern der Netzwerkeinstellungen erfordert die Neukonfiguration der Bridge auf HueMagic.
31
34
 
32
35
  : name (string) : Ändert den Namen der Bridge und muss mind. 4 bis max. 16 Zeichen enthalten
33
36
  : zigbeeChannel (int) : Ändert den aktuellen ZigBee-Kanal (entweder `11`, `15`, `20`, `25` oder `0`)
@@ -41,7 +44,7 @@ Mit dem folgenden Befehl können Sie spezifische Einstellungen auf der Bridge ä
41
44
 
42
45
  ### Statusnachrichten des Nodes
43
46
 
44
- Die Statusmittilungen des „Hue Bridge“-Nodes sind dynamisch. Sie folgen zwar einem bestimmten Muster, können aber in ihrer Ausgabe variieren, je nachdem welche Aktion auf dem Node gerade ausgeführt wurde.
47
+ Die Statusmitteilungen des „Hue Bridge“-Nodes sind dynamisch. Sie folgen zwar einem bestimmten Muster, können aber in ihrer Ausgabe variieren, je nachdem welche Aktion auf dem Node gerade ausgeführt wurde.
45
48
 
46
49
  #### Statusobjekt unter `msg.payload`
47
50
 
@@ -60,7 +63,7 @@ Die Statusmittilungen des „Hue Bridge“-Nodes sind dynamisch. Sie folgen zwar
60
63
  : netmask (string) : Netzmaske der Bridge
61
64
  : gateway (string) : Gateway der Bridge
62
65
  : proxyAddress (string | boolean) : Aktuell verwendete Proxy-Adresse oder `false`
63
- : proxyPort (string) : Aktuell verwender Proxy-Port
66
+ : proxyPort (string) : Aktuell verwendeter Proxy-Port
64
67
  : utcTime (string) : UTC-Zeit auf der Bridge
65
68
  : timeZone (string) : Aktuell eingestellte Zeitzone auf der Bridge
66
69
  : localTime (string) : Lokale Zeitzone
@@ -89,5 +92,5 @@ Sofern der Status des Nodes sich über einen bestimmten Befehl geändert hat, wi
89
92
 
90
93
  HueMagic stellt einige Beispielkonfigurationen zu diesem Node zur Verfügung. Um ein fertiges Beispiel in Ihrer Node-RED-Oberfläche zu importieren, klicken Sie auf das Menü-Icon von Node-RED, wählen Sie dann „Import“ und navigieren Sie in der Sidebar des Popups auf „Beispiele“. Wählen Sie anschließend den HueMagic-Ordner aus und Ihren gewünschten Node, um einen Beispielflow zu importieren.
91
94
 
92
- ![examples](https://user-images.githubusercontent.com/5302050/148681840-2275c15a-7c0c-4a37-b817-199608e571d2.gif)
95
+ ![examples](hue/assets/huemagic-examples.gif)
93
96
  </script>
@@ -1,27 +1,26 @@
1
1
  {
2
- "hue-bridge":
3
- {
4
- "config":
5
- {
2
+ "hue-bridge": {
3
+ "config": {
6
4
  "name": "Name",
7
5
  "input-name": "Hue Bridge Name",
8
6
  "skipglobalevents-info": "Globale Aktualisierungsmitteilungen auf diesem Node ignorieren",
9
- "sendinitevents-node": "Initialisierungsnachricht nicht unterdrücken"
7
+ "sendinitevents-node": "Initialisierungsnachricht nicht unterdrücken",
8
+ "bridge": "Bridge"
10
9
  },
11
- "node":
12
- {
10
+ "node": {
13
11
  "title": "Hue Bridge",
14
12
  "not-configured": "nicht konfiguriert",
15
13
  "connecting": "verbinden…",
16
14
  "connected": "verbunden",
17
15
  "starting-tl": "starte TouchLink…",
18
16
  "started-tl": "TouchLink gestartet",
19
- "f-resources": "hole Ressouren…",
17
+ "f-resources": "hole Ressourcen…",
20
18
  "updating-settings": "aktualisiere Einstellungen…",
21
19
  "settings-updated": "Einstellungen aktualisiert",
22
20
  "input": "Einstellungen / Abrufen",
23
21
  "output": "Bridge Informationen",
24
- "statusmsg": "Status erfolgreich abgefragt…"
22
+ "statusmsg": "Status erfolgreich abgefragt…",
23
+ "error-not-available": "Die Bridge ist noch nicht verfügbar. Bitte warten Sie, bis HueMagic eine Verbindung zur Bridge aufgebaut hat."
25
24
  }
26
25
  }
27
- }
26
+ }