@smarthome.exchange/integrations 1.0.0 → 2.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 (294) hide show
  1. package/changelog.md +49 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/core/classes.configstore.d.ts +2 -0
  4. package/dist_ts/core/classes.configstore.js +84 -27
  5. package/dist_ts/core/classes.nativehomeadmission.d.ts +19 -0
  6. package/dist_ts/core/classes.nativehomeadmission.js +84 -0
  7. package/dist_ts/core/classes.nativeintegrationowner.d.ts +79 -0
  8. package/dist_ts/core/classes.nativeintegrationowner.js +269 -0
  9. package/dist_ts/core/index.d.ts +2 -0
  10. package/dist_ts/core/index.js +3 -1
  11. package/dist_ts/core/types.d.ts +14 -0
  12. package/dist_ts/integrations/braviatv/braviatv.classes.client.d.ts +23 -72
  13. package/dist_ts/integrations/braviatv/braviatv.classes.client.js +265 -625
  14. package/dist_ts/integrations/braviatv/braviatv.classes.configflow.d.ts +7 -7
  15. package/dist_ts/integrations/braviatv/braviatv.classes.configflow.js +51 -68
  16. package/dist_ts/integrations/braviatv/braviatv.classes.integration.d.ts +8 -11
  17. package/dist_ts/integrations/braviatv/braviatv.classes.integration.js +186 -135
  18. package/dist_ts/integrations/braviatv/braviatv.discovery.js +12 -11
  19. package/dist_ts/integrations/braviatv/braviatv.mapper.d.ts +6 -14
  20. package/dist_ts/integrations/braviatv/braviatv.mapper.js +37 -131
  21. package/dist_ts/integrations/braviatv/braviatv.types.d.ts +55 -133
  22. package/dist_ts/integrations/braviatv/braviatv.validation.d.ts +7 -0
  23. package/dist_ts/integrations/braviatv/braviatv.validation.js +72 -0
  24. package/dist_ts/integrations/broadlink/broadlink.actions.d.ts +2 -0
  25. package/dist_ts/integrations/broadlink/broadlink.actions.js +36 -0
  26. package/dist_ts/integrations/broadlink/broadlink.classes.client.d.ts +21 -19
  27. package/dist_ts/integrations/broadlink/broadlink.classes.client.js +185 -124
  28. package/dist_ts/integrations/broadlink/broadlink.classes.configflow.d.ts +5 -4
  29. package/dist_ts/integrations/broadlink/broadlink.classes.configflow.js +64 -83
  30. package/dist_ts/integrations/broadlink/broadlink.classes.integration.d.ts +16 -19
  31. package/dist_ts/integrations/broadlink/broadlink.classes.integration.js +114 -59
  32. package/dist_ts/integrations/broadlink/broadlink.mapper.d.ts +3 -2
  33. package/dist_ts/integrations/broadlink/broadlink.mapper.js +2 -1
  34. package/dist_ts/integrations/broadlink/broadlink.selected.mapper.d.ts +10 -0
  35. package/dist_ts/integrations/broadlink/broadlink.selected.mapper.js +41 -0
  36. package/dist_ts/integrations/broadlink/broadlink.types.d.ts +43 -7
  37. package/dist_ts/integrations/broadlink/broadlink.validation.d.ts +7 -0
  38. package/dist_ts/integrations/broadlink/broadlink.validation.js +63 -0
  39. package/dist_ts/integrations/daikin/daikin.classes.client.d.ts +10 -52
  40. package/dist_ts/integrations/daikin/daikin.classes.client.js +55 -614
  41. package/dist_ts/integrations/daikin/daikin.classes.configflow.d.ts +8 -12
  42. package/dist_ts/integrations/daikin/daikin.classes.configflow.js +77 -138
  43. package/dist_ts/integrations/daikin/daikin.classes.integration.d.ts +7 -24
  44. package/dist_ts/integrations/daikin/daikin.classes.integration.js +175 -67
  45. package/dist_ts/integrations/daikin/daikin.discovery.d.ts +11 -24
  46. package/dist_ts/integrations/daikin/daikin.discovery.js +98 -305
  47. package/dist_ts/integrations/daikin/daikin.mapper.d.ts +6 -7
  48. package/dist_ts/integrations/daikin/daikin.mapper.js +95 -155
  49. package/dist_ts/integrations/daikin/daikin.types.d.ts +24 -44
  50. package/dist_ts/integrations/daikin/daikin.types.js +1 -1
  51. package/dist_ts/integrations/daikin/daikin.validation.d.ts +5 -0
  52. package/dist_ts/integrations/daikin/daikin.validation.js +53 -0
  53. package/dist_ts/integrations/denonavr/denonavr.classes.client.d.ts +31 -40
  54. package/dist_ts/integrations/denonavr/denonavr.classes.client.js +149 -404
  55. package/dist_ts/integrations/denonavr/denonavr.classes.configflow.d.ts +7 -2
  56. package/dist_ts/integrations/denonavr/denonavr.classes.configflow.js +44 -36
  57. package/dist_ts/integrations/denonavr/denonavr.classes.integration.d.ts +6 -11
  58. package/dist_ts/integrations/denonavr/denonavr.classes.integration.js +192 -113
  59. package/dist_ts/integrations/denonavr/denonavr.discovery.d.ts +10 -18
  60. package/dist_ts/integrations/denonavr/denonavr.discovery.js +71 -193
  61. package/dist_ts/integrations/denonavr/denonavr.mapper.d.ts +5 -13
  62. package/dist_ts/integrations/denonavr/denonavr.mapper.js +35 -159
  63. package/dist_ts/integrations/denonavr/denonavr.types.d.ts +55 -90
  64. package/dist_ts/integrations/denonavr/denonavr.validation.d.ts +10 -0
  65. package/dist_ts/integrations/denonavr/denonavr.validation.js +86 -0
  66. package/dist_ts/integrations/kodi/kodi.classes.client.d.ts +11 -45
  67. package/dist_ts/integrations/kodi/kodi.classes.client.js +84 -310
  68. package/dist_ts/integrations/kodi/kodi.classes.configflow.d.ts +9 -8
  69. package/dist_ts/integrations/kodi/kodi.classes.configflow.js +53 -48
  70. package/dist_ts/integrations/kodi/kodi.classes.integration.d.ts +11 -11
  71. package/dist_ts/integrations/kodi/kodi.classes.integration.js +114 -171
  72. package/dist_ts/integrations/kodi/kodi.discovery.js +53 -29
  73. package/dist_ts/integrations/kodi/kodi.mapper.d.ts +7 -2
  74. package/dist_ts/integrations/kodi/kodi.mapper.js +48 -10
  75. package/dist_ts/integrations/kodi/kodi.types.d.ts +32 -28
  76. package/dist_ts/integrations/kodi/kodi.validation.d.ts +9 -0
  77. package/dist_ts/integrations/kodi/kodi.validation.js +62 -0
  78. package/dist_ts/integrations/modbus/modbus.classes.client.d.ts +15 -61
  79. package/dist_ts/integrations/modbus/modbus.classes.client.js +117 -776
  80. package/dist_ts/integrations/modbus/modbus.classes.configflow.d.ts +9 -5
  81. package/dist_ts/integrations/modbus/modbus.classes.configflow.js +70 -38
  82. package/dist_ts/integrations/modbus/modbus.classes.integration.d.ts +6 -17
  83. package/dist_ts/integrations/modbus/modbus.classes.integration.js +133 -57
  84. package/dist_ts/integrations/modbus/modbus.discovery.d.ts +5 -8
  85. package/dist_ts/integrations/modbus/modbus.discovery.js +38 -93
  86. package/dist_ts/integrations/modbus/modbus.mapper.d.ts +8 -32
  87. package/dist_ts/integrations/modbus/modbus.mapper.js +71 -431
  88. package/dist_ts/integrations/modbus/modbus.types.d.ts +82 -332
  89. package/dist_ts/integrations/modbus/modbus.validation.d.ts +10 -0
  90. package/dist_ts/integrations/modbus/modbus.validation.js +128 -0
  91. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.client.d.ts +12 -34
  92. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.client.js +143 -231
  93. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.configflow.d.ts +6 -1
  94. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.configflow.js +105 -18
  95. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.integration.d.ts +8 -8
  96. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.integration.js +141 -155
  97. package/dist_ts/integrations/nanoleaf/nanoleaf.credentials.d.ts +9 -0
  98. package/dist_ts/integrations/nanoleaf/nanoleaf.credentials.js +35 -0
  99. package/dist_ts/integrations/nanoleaf/nanoleaf.mapper.d.ts +6 -18
  100. package/dist_ts/integrations/nanoleaf/nanoleaf.mapper.js +45 -220
  101. package/dist_ts/integrations/nanoleaf/nanoleaf.types.d.ts +33 -147
  102. package/dist_ts/integrations/nanoleaf/nanoleaf.validation.d.ts +6 -0
  103. package/dist_ts/integrations/nanoleaf/nanoleaf.validation.js +82 -0
  104. package/dist_ts/integrations/onkyo/onkyo.classes.client.d.ts +15 -20
  105. package/dist_ts/integrations/onkyo/onkyo.classes.client.js +161 -404
  106. package/dist_ts/integrations/onkyo/onkyo.classes.configflow.d.ts +9 -4
  107. package/dist_ts/integrations/onkyo/onkyo.classes.configflow.js +51 -6
  108. package/dist_ts/integrations/onkyo/onkyo.classes.integration.d.ts +22 -6
  109. package/dist_ts/integrations/onkyo/onkyo.classes.integration.js +144 -11
  110. package/dist_ts/integrations/onkyo/onkyo.discovery.d.ts +6 -1
  111. package/dist_ts/integrations/onkyo/onkyo.discovery.js +40 -4
  112. package/dist_ts/integrations/onkyo/onkyo.mapper.d.ts +7 -8
  113. package/dist_ts/integrations/onkyo/onkyo.mapper.js +45 -12
  114. package/dist_ts/integrations/onkyo/onkyo.types.d.ts +58 -8
  115. package/dist_ts/integrations/onkyo/onkyo.types.js +13 -102
  116. package/dist_ts/integrations/onkyo/onkyo.validation.d.ts +16 -0
  117. package/dist_ts/integrations/onkyo/onkyo.validation.js +77 -0
  118. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.client.d.ts +25 -25
  119. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.client.js +116 -360
  120. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.d.ts +11 -3
  121. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.js +76 -6
  122. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.integration.d.ts +26 -4
  123. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.integration.js +142 -9
  124. package/dist_ts/integrations/panasonic_viera/panasonic_viera.discovery.d.ts +2 -1
  125. package/dist_ts/integrations/panasonic_viera/panasonic_viera.discovery.js +31 -4
  126. package/dist_ts/integrations/panasonic_viera/panasonic_viera.mapper.d.ts +9 -9
  127. package/dist_ts/integrations/panasonic_viera/panasonic_viera.mapper.js +31 -149
  128. package/dist_ts/integrations/panasonic_viera/panasonic_viera.types.d.ts +51 -11
  129. package/dist_ts/integrations/panasonic_viera/panasonic_viera.types.js +22 -87
  130. package/dist_ts/integrations/panasonic_viera/panasonic_viera.validation.d.ts +6 -0
  131. package/dist_ts/integrations/panasonic_viera/panasonic_viera.validation.js +56 -0
  132. package/dist_ts/integrations/pioneer/pioneer.classes.client.d.ts +31 -16
  133. package/dist_ts/integrations/pioneer/pioneer.classes.client.js +167 -409
  134. package/dist_ts/integrations/pioneer/pioneer.classes.configflow.d.ts +10 -3
  135. package/dist_ts/integrations/pioneer/pioneer.classes.configflow.js +66 -6
  136. package/dist_ts/integrations/pioneer/pioneer.classes.integration.d.ts +13 -5
  137. package/dist_ts/integrations/pioneer/pioneer.classes.integration.js +239 -11
  138. package/dist_ts/integrations/pioneer/pioneer.discovery.d.ts +14 -1
  139. package/dist_ts/integrations/pioneer/pioneer.discovery.js +51 -4
  140. package/dist_ts/integrations/pioneer/pioneer.mapper.d.ts +14 -8
  141. package/dist_ts/integrations/pioneer/pioneer.mapper.js +54 -12
  142. package/dist_ts/integrations/pioneer/pioneer.types.d.ts +79 -12
  143. package/dist_ts/integrations/pioneer/pioneer.types.js +12 -76
  144. package/dist_ts/integrations/pioneer/pioneer.validation.d.ts +10 -0
  145. package/dist_ts/integrations/pioneer/pioneer.validation.js +85 -0
  146. package/dist_ts/integrations/soundtouch/soundtouch.classes.client.d.ts +13 -36
  147. package/dist_ts/integrations/soundtouch/soundtouch.classes.client.js +179 -502
  148. package/dist_ts/integrations/soundtouch/soundtouch.classes.configflow.d.ts +6 -1
  149. package/dist_ts/integrations/soundtouch/soundtouch.classes.configflow.js +50 -40
  150. package/dist_ts/integrations/soundtouch/soundtouch.classes.integration.d.ts +14 -15
  151. package/dist_ts/integrations/soundtouch/soundtouch.classes.integration.js +108 -128
  152. package/dist_ts/integrations/soundtouch/soundtouch.discovery.d.ts +2 -20
  153. package/dist_ts/integrations/soundtouch/soundtouch.discovery.js +23 -113
  154. package/dist_ts/integrations/soundtouch/soundtouch.mapper.d.ts +3 -12
  155. package/dist_ts/integrations/soundtouch/soundtouch.mapper.js +35 -189
  156. package/dist_ts/integrations/soundtouch/soundtouch.types.d.ts +57 -142
  157. package/dist_ts/integrations/soundtouch/soundtouch.types.js +18 -3
  158. package/dist_ts/integrations/soundtouch/soundtouch.validation.d.ts +22 -0
  159. package/dist_ts/integrations/soundtouch/soundtouch.validation.js +65 -0
  160. package/dist_ts/integrations/wiz/index.d.ts +1 -0
  161. package/dist_ts/integrations/wiz/index.js +2 -1
  162. package/dist_ts/integrations/wiz/wiz.classes.client.d.ts +14 -28
  163. package/dist_ts/integrations/wiz/wiz.classes.client.js +93 -229
  164. package/dist_ts/integrations/wiz/wiz.classes.configflow.d.ts +6 -4
  165. package/dist_ts/integrations/wiz/wiz.classes.configflow.js +38 -67
  166. package/dist_ts/integrations/wiz/wiz.classes.integration.d.ts +10 -21
  167. package/dist_ts/integrations/wiz/wiz.classes.integration.js +204 -44
  168. package/dist_ts/integrations/wiz/wiz.discovery.d.ts +10 -31
  169. package/dist_ts/integrations/wiz/wiz.discovery.js +48 -249
  170. package/dist_ts/integrations/wiz/wiz.mapper.d.ts +7 -51
  171. package/dist_ts/integrations/wiz/wiz.mapper.js +82 -668
  172. package/dist_ts/integrations/wiz/wiz.types.d.ts +34 -208
  173. package/dist_ts/integrations/wiz/wiz.validation.d.ts +8 -0
  174. package/dist_ts/integrations/wiz/wiz.validation.js +72 -0
  175. package/dist_ts/integrations/yamaha/index.d.ts +1 -0
  176. package/dist_ts/integrations/yamaha/index.js +2 -1
  177. package/dist_ts/integrations/yamaha/yamaha.classes.client.d.ts +30 -4
  178. package/dist_ts/integrations/yamaha/yamaha.classes.client.js +162 -6
  179. package/dist_ts/integrations/yamaha/yamaha.classes.configflow.d.ts +10 -3
  180. package/dist_ts/integrations/yamaha/yamaha.classes.configflow.js +106 -6
  181. package/dist_ts/integrations/yamaha/yamaha.classes.integration.d.ts +22 -4
  182. package/dist_ts/integrations/yamaha/yamaha.classes.integration.js +243 -8
  183. package/dist_ts/integrations/yamaha/yamaha.discovery.d.ts +13 -1
  184. package/dist_ts/integrations/yamaha/yamaha.discovery.js +57 -4
  185. package/dist_ts/integrations/yamaha/yamaha.mapper.d.ts +16 -8
  186. package/dist_ts/integrations/yamaha/yamaha.mapper.js +58 -12
  187. package/dist_ts/integrations/yamaha/yamaha.types.d.ts +73 -6
  188. package/dist_ts/integrations/yamaha/yamaha.types.js +8 -94
  189. package/dist_ts/integrations/yamaha/yamaha.validation.d.ts +12 -0
  190. package/dist_ts/integrations/yamaha/yamaha.validation.js +89 -0
  191. package/package.json +3 -3
  192. package/readme.md +514 -2
  193. package/ts/00_commitinfo_data.ts +1 -1
  194. package/ts/core/classes.configstore.ts +84 -27
  195. package/ts/core/classes.nativehomeadmission.ts +96 -0
  196. package/ts/core/classes.nativeintegrationowner.ts +297 -0
  197. package/ts/core/index.ts +2 -0
  198. package/ts/core/types.ts +16 -0
  199. package/ts/integrations/braviatv/braviatv.classes.client.ts +245 -709
  200. package/ts/integrations/braviatv/braviatv.classes.configflow.ts +47 -76
  201. package/ts/integrations/braviatv/braviatv.classes.integration.ts +167 -147
  202. package/ts/integrations/braviatv/braviatv.discovery.ts +11 -10
  203. package/ts/integrations/braviatv/braviatv.mapper.ts +39 -142
  204. package/ts/integrations/braviatv/braviatv.types.ts +53 -173
  205. package/ts/integrations/braviatv/braviatv.validation.ts +68 -0
  206. package/ts/integrations/broadlink/broadlink.actions.ts +31 -0
  207. package/ts/integrations/broadlink/broadlink.classes.client.ts +170 -144
  208. package/ts/integrations/broadlink/broadlink.classes.configflow.ts +59 -89
  209. package/ts/integrations/broadlink/broadlink.classes.integration.ts +110 -64
  210. package/ts/integrations/broadlink/broadlink.mapper.ts +5 -4
  211. package/ts/integrations/broadlink/broadlink.selected.mapper.ts +46 -0
  212. package/ts/integrations/broadlink/broadlink.types.ts +48 -8
  213. package/ts/integrations/broadlink/broadlink.validation.ts +66 -0
  214. package/ts/integrations/daikin/daikin.classes.client.ts +52 -661
  215. package/ts/integrations/daikin/daikin.classes.configflow.ts +72 -152
  216. package/ts/integrations/daikin/daikin.classes.integration.ts +166 -71
  217. package/ts/integrations/daikin/daikin.discovery.ts +94 -346
  218. package/ts/integrations/daikin/daikin.mapper.ts +83 -166
  219. package/ts/integrations/daikin/daikin.types.ts +27 -48
  220. package/ts/integrations/daikin/daikin.validation.ts +51 -0
  221. package/ts/integrations/daikin/readme.md +83 -0
  222. package/ts/integrations/denonavr/denonavr.classes.client.ts +132 -421
  223. package/ts/integrations/denonavr/denonavr.classes.configflow.ts +44 -37
  224. package/ts/integrations/denonavr/denonavr.classes.integration.ts +171 -117
  225. package/ts/integrations/denonavr/denonavr.discovery.ts +67 -220
  226. package/ts/integrations/denonavr/denonavr.mapper.ts +36 -182
  227. package/ts/integrations/denonavr/denonavr.types.ts +48 -111
  228. package/ts/integrations/denonavr/denonavr.validation.ts +87 -0
  229. package/ts/integrations/kodi/kodi.classes.client.ts +72 -352
  230. package/ts/integrations/kodi/kodi.classes.configflow.ts +52 -55
  231. package/ts/integrations/kodi/kodi.classes.integration.ts +97 -178
  232. package/ts/integrations/kodi/kodi.discovery.ts +49 -28
  233. package/ts/integrations/kodi/kodi.mapper.ts +52 -10
  234. package/ts/integrations/kodi/kodi.types.ts +33 -58
  235. package/ts/integrations/kodi/kodi.validation.ts +60 -0
  236. package/ts/integrations/modbus/modbus.classes.client.ts +100 -842
  237. package/ts/integrations/modbus/modbus.classes.configflow.ts +70 -41
  238. package/ts/integrations/modbus/modbus.classes.integration.ts +115 -60
  239. package/ts/integrations/modbus/modbus.discovery.ts +38 -106
  240. package/ts/integrations/modbus/modbus.mapper.ts +64 -467
  241. package/ts/integrations/modbus/modbus.types.ts +64 -381
  242. package/ts/integrations/modbus/modbus.validation.ts +119 -0
  243. package/ts/integrations/nanoleaf/nanoleaf.classes.client.ts +115 -249
  244. package/ts/integrations/nanoleaf/nanoleaf.classes.configflow.ts +90 -19
  245. package/ts/integrations/nanoleaf/nanoleaf.classes.integration.ts +130 -181
  246. package/ts/integrations/nanoleaf/nanoleaf.credentials.ts +39 -0
  247. package/ts/integrations/nanoleaf/nanoleaf.mapper.ts +47 -260
  248. package/ts/integrations/nanoleaf/nanoleaf.types.ts +29 -147
  249. package/ts/integrations/nanoleaf/nanoleaf.validation.ts +77 -0
  250. package/ts/integrations/onkyo/onkyo.classes.client.ts +148 -457
  251. package/ts/integrations/onkyo/onkyo.classes.configflow.ts +52 -6
  252. package/ts/integrations/onkyo/onkyo.classes.integration.ts +121 -12
  253. package/ts/integrations/onkyo/onkyo.discovery.ts +41 -3
  254. package/ts/integrations/onkyo/onkyo.mapper.ts +46 -19
  255. package/ts/integrations/onkyo/onkyo.types.ts +55 -110
  256. package/ts/integrations/onkyo/onkyo.validation.ts +85 -0
  257. package/ts/integrations/onkyo/readme.md +126 -0
  258. package/ts/integrations/panasonic_viera/panasonic_viera.classes.client.ts +101 -398
  259. package/ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.ts +69 -5
  260. package/ts/integrations/panasonic_viera/panasonic_viera.classes.integration.ts +141 -9
  261. package/ts/integrations/panasonic_viera/panasonic_viera.discovery.ts +32 -3
  262. package/ts/integrations/panasonic_viera/panasonic_viera.mapper.ts +34 -161
  263. package/ts/integrations/panasonic_viera/panasonic_viera.types.ts +52 -96
  264. package/ts/integrations/panasonic_viera/panasonic_viera.validation.ts +56 -0
  265. package/ts/integrations/pioneer/pioneer.classes.client.ts +132 -428
  266. package/ts/integrations/pioneer/pioneer.classes.configflow.ts +67 -5
  267. package/ts/integrations/pioneer/pioneer.classes.integration.ts +225 -11
  268. package/ts/integrations/pioneer/pioneer.discovery.ts +45 -3
  269. package/ts/integrations/pioneer/pioneer.mapper.ts +57 -13
  270. package/ts/integrations/pioneer/pioneer.types.ts +87 -85
  271. package/ts/integrations/pioneer/pioneer.validation.ts +84 -0
  272. package/ts/integrations/soundtouch/soundtouch.classes.client.ts +152 -571
  273. package/ts/integrations/soundtouch/soundtouch.classes.configflow.ts +47 -42
  274. package/ts/integrations/soundtouch/soundtouch.classes.integration.ts +95 -150
  275. package/ts/integrations/soundtouch/soundtouch.discovery.ts +21 -133
  276. package/ts/integrations/soundtouch/soundtouch.mapper.ts +36 -207
  277. package/ts/integrations/soundtouch/soundtouch.types.ts +50 -195
  278. package/ts/integrations/soundtouch/soundtouch.validation.ts +60 -0
  279. package/ts/integrations/wiz/index.ts +1 -0
  280. package/ts/integrations/wiz/wiz.classes.client.ts +84 -254
  281. package/ts/integrations/wiz/wiz.classes.configflow.ts +39 -70
  282. package/ts/integrations/wiz/wiz.classes.integration.ts +189 -45
  283. package/ts/integrations/wiz/wiz.discovery.ts +48 -291
  284. package/ts/integrations/wiz/wiz.mapper.ts +81 -754
  285. package/ts/integrations/wiz/wiz.types.ts +24 -224
  286. package/ts/integrations/wiz/wiz.validation.ts +73 -0
  287. package/ts/integrations/yamaha/index.ts +1 -0
  288. package/ts/integrations/yamaha/yamaha.classes.client.ts +150 -6
  289. package/ts/integrations/yamaha/yamaha.classes.configflow.ts +100 -5
  290. package/ts/integrations/yamaha/yamaha.classes.integration.ts +236 -8
  291. package/ts/integrations/yamaha/yamaha.discovery.ts +52 -3
  292. package/ts/integrations/yamaha/yamaha.mapper.ts +65 -13
  293. package/ts/integrations/yamaha/yamaha.types.ts +77 -97
  294. package/ts/integrations/yamaha/yamaha.validation.ts +86 -0
@@ -1,232 +1,57 @@
1
- import * as plugins from '../../plugins.js';
2
- const RESERVED_EFFECTS = new Set(['*Solid*', '*Static*', '*Dynamic*']);
3
1
  export class NanoleafMapper {
2
+ static deviceId(snapshotArg) {
3
+ return `nanoleaf:${encodeURIComponent(snapshotArg.homeId)}:${encodeURIComponent(snapshotArg.serialNumber)}`;
4
+ }
5
+ static lightEntityId(snapshotArg) { return `${this.deviceId(snapshotArg)}:light`; }
6
+ static effectEntityId(snapshotArg) { return `${this.deviceId(snapshotArg)}:effect`; }
4
7
  static toDevices(snapshotArg) {
5
- const devices = [];
6
- const updatedAt = new Date().toISOString();
7
- const controllerDeviceId = this.controllerDeviceId(snapshotArg);
8
- const controllerName = this.controllerName(snapshotArg);
8
+ const updatedAt = snapshotArg.observedAt;
9
9
  const features = [
10
- { id: 'connectivity', capability: 'sensor', name: 'Connectivity', readable: true, writable: false },
11
- { id: 'on', capability: 'light', name: 'Power', readable: true, writable: true },
12
- { id: 'brightness', capability: 'light', name: 'Brightness', readable: true, writable: true, unit: '%' },
13
- { id: 'hue', capability: 'light', name: 'Hue', readable: true, writable: true },
14
- { id: 'saturation', capability: 'light', name: 'Saturation', readable: true, writable: true, unit: '%' },
15
- { id: 'color_temperature', capability: 'light', name: 'Color temperature', readable: true, writable: true, unit: 'K' },
16
- { id: 'color_mode', capability: 'sensor', name: 'Color mode', readable: true, writable: false },
17
- { id: 'effect', capability: 'light', name: 'Effect', readable: true, writable: true },
10
+ { id: 'power', capability: 'light', name: 'Power', readable: true, writable: true },
11
+ { id: 'firmware', capability: 'sensor', name: 'Firmware', readable: true, writable: false },
18
12
  ];
19
13
  const state = [
20
- { featureId: 'connectivity', value: 'online', updatedAt },
21
- { featureId: 'on', value: this.stateValue(snapshotArg.state.on) ?? null, updatedAt },
22
- { featureId: 'brightness', value: this.stateValue(snapshotArg.state.brightness) ?? null, updatedAt },
23
- { featureId: 'hue', value: this.stateValue(snapshotArg.state.hue) ?? null, updatedAt },
24
- { featureId: 'saturation', value: this.stateValue(snapshotArg.state.sat) ?? null, updatedAt },
25
- { featureId: 'color_temperature', value: this.stateValue(snapshotArg.state.ct) ?? null, updatedAt },
26
- { featureId: 'color_mode', value: this.colorMode(snapshotArg.state) ?? null, updatedAt },
27
- { featureId: 'effect', value: this.currentEffect(snapshotArg) ?? null, updatedAt },
14
+ { featureId: 'power', value: snapshotArg.power, updatedAt },
15
+ { featureId: 'firmware', value: snapshotArg.firmwareVersion, updatedAt },
28
16
  ];
29
- if (snapshotArg.controllerInfo.firmwareVersion) {
30
- features.push({ id: 'firmware', capability: 'sensor', name: 'Firmware', readable: true, writable: false });
31
- state.push({ featureId: 'firmware', value: snapshotArg.controllerInfo.firmwareVersion, updatedAt });
32
- }
33
- const panelCount = this.panelCount(snapshotArg);
34
- if (panelCount !== undefined) {
35
- features.push({ id: 'panel_count', capability: 'sensor', name: 'Panel count', readable: true, writable: false });
36
- state.push({ featureId: 'panel_count', value: panelCount, updatedAt });
37
- }
38
- const rhythmConnected = this.valueLike(snapshotArg.rhythm?.rhythmConnected);
39
- if (rhythmConnected !== undefined) {
40
- features.push({ id: 'rhythm_connected', capability: 'sensor', name: 'Rhythm connected', readable: true, writable: false });
41
- state.push({ featureId: 'rhythm_connected', value: rhythmConnected, updatedAt });
42
- }
43
- devices.push({
44
- id: controllerDeviceId,
45
- integrationDomain: 'nanoleaf',
46
- name: controllerName,
47
- protocol: 'http',
48
- manufacturer: snapshotArg.controllerInfo.manufacturer || 'Nanoleaf',
49
- model: snapshotArg.controllerInfo.model || 'Nanoleaf Controller',
50
- online: true,
51
- features,
52
- state,
53
- metadata: {
54
- serialNumber: snapshotArg.controllerInfo.serialNo,
55
- hardwareVersion: snapshotArg.controllerInfo.hardwareVersion,
56
- firmwareVersion: snapshotArg.controllerInfo.firmwareVersion,
57
- effectsList: this.availableEffects(snapshotArg),
58
- },
59
- });
60
- for (const panel of this.panels(snapshotArg)) {
61
- devices.push(this.panelDevice(snapshotArg, panel, updatedAt));
62
- }
63
- return devices;
17
+ for (const [id, name, unit, observation] of [
18
+ ['brightness', 'Brightness', '%', snapshotArg.brightness],
19
+ ['color_temperature', 'Color temperature', 'K', snapshotArg.colorTemperatureKelvin],
20
+ ]) {
21
+ if (observation) {
22
+ features.push({ id, capability: 'light', name, unit, readable: true, writable: true });
23
+ state.push({ featureId: id, value: observation.value, updatedAt });
24
+ }
25
+ }
26
+ if (snapshotArg.availableEffects.length > 0)
27
+ features.push({ id: 'effect', capability: 'light', name: 'Advertised scene', readable: snapshotArg.selectedEffect !== undefined,
28
+ writable: true });
29
+ if (snapshotArg.selectedEffect !== undefined)
30
+ state.push({ featureId: 'effect', value: snapshotArg.selectedEffect, updatedAt });
31
+ if (snapshotArg.colorMode !== undefined) {
32
+ features.push({ id: 'color_mode', capability: 'sensor', name: 'Color mode', readable: true, writable: false });
33
+ state.push({ featureId: 'color_mode', value: snapshotArg.colorMode, updatedAt });
34
+ }
35
+ return [{ id: this.deviceId(snapshotArg), integrationDomain: 'nanoleaf', name: snapshotArg.name,
36
+ manufacturer: 'Nanoleaf', model: snapshotArg.model, protocol: 'http', online: true, features, state,
37
+ metadata: { homeId: snapshotArg.homeId, serialNumber: snapshotArg.serialNumber, origin: snapshotArg.origin,
38
+ observedAt: snapshotArg.observedAt, brightnessRange: snapshotArg.brightness && [snapshotArg.brightness.min, snapshotArg.brightness.max],
39
+ colorTemperatureRange: snapshotArg.colorTemperatureKelvin && [snapshotArg.colorTemperatureKelvin.min, snapshotArg.colorTemperatureKelvin.max],
40
+ availableEffects: [...snapshotArg.availableEffects], transportEncrypted: snapshotArg.origin.startsWith('https:'), physicalCompletion: 'unconfirmed' } }];
64
41
  }
65
42
  static toEntities(snapshotArg) {
66
- const deviceId = this.controllerDeviceId(snapshotArg);
67
- const deviceSlug = this.slug(this.controllerName(snapshotArg));
68
- const entities = [
69
- {
70
- id: `light.${deviceSlug}`,
71
- uniqueId: `nanoleaf_${this.slug(snapshotArg.controllerInfo.serialNo || deviceId)}_light`,
72
- integrationDomain: 'nanoleaf',
73
- deviceId,
74
- platform: 'light',
75
- name: this.controllerName(snapshotArg),
76
- state: this.stateValue(snapshotArg.state.on) ? 'on' : 'off',
77
- attributes: {
78
- brightness: this.stateValue(snapshotArg.state.brightness),
79
- hue: this.stateValue(snapshotArg.state.hue),
80
- saturation: this.stateValue(snapshotArg.state.sat),
81
- color_temp_kelvin: this.stateValue(snapshotArg.state.ct),
82
- color_mode: this.colorMode(snapshotArg.state),
83
- effect: this.currentEffect(snapshotArg),
84
- effect_list: this.availableEffects(snapshotArg),
85
- },
86
- available: true,
87
- },
88
- {
89
- id: `button.${deviceSlug}_identify`,
90
- uniqueId: `nanoleaf_${this.slug(snapshotArg.controllerInfo.serialNo || deviceId)}_identify`,
91
- integrationDomain: 'nanoleaf',
92
- deviceId,
93
- platform: 'button',
94
- name: `${this.controllerName(snapshotArg)} identify`,
95
- state: null,
96
- attributes: { deviceClass: 'identify' },
97
- available: true,
98
- },
99
- ];
100
- entities.push({
101
- id: `select.${deviceSlug}_effect`,
102
- uniqueId: `nanoleaf_${this.slug(snapshotArg.controllerInfo.serialNo || deviceId)}_effect`,
103
- integrationDomain: 'nanoleaf',
104
- deviceId,
105
- platform: 'select',
106
- name: `${this.controllerName(snapshotArg)} effect`,
107
- state: this.currentEffect(snapshotArg) ?? null,
108
- attributes: { options: this.availableEffects(snapshotArg) },
109
- available: true,
110
- });
111
- this.pushSensorEntity(entities, deviceId, `nanoleaf_${this.slug(deviceId)}_color_mode`, `sensor.${deviceSlug}_color_mode`, `${this.controllerName(snapshotArg)} color mode`, this.colorMode(snapshotArg.state));
112
- this.pushSensorEntity(entities, deviceId, `nanoleaf_${this.slug(deviceId)}_firmware`, `sensor.${deviceSlug}_firmware`, `${this.controllerName(snapshotArg)} firmware`, snapshotArg.controllerInfo.firmwareVersion);
113
- this.pushSensorEntity(entities, deviceId, `nanoleaf_${this.slug(deviceId)}_panel_count`, `sensor.${deviceSlug}_panel_count`, `${this.controllerName(snapshotArg)} panel count`, this.panelCount(snapshotArg));
114
- this.pushSensorEntity(entities, deviceId, `nanoleaf_${this.slug(deviceId)}_rhythm_connected`, `sensor.${deviceSlug}_rhythm_connected`, `${this.controllerName(snapshotArg)} rhythm connected`, this.valueLike(snapshotArg.rhythm?.rhythmConnected));
115
- this.pushSensorEntity(entities, deviceId, `nanoleaf_${this.slug(deviceId)}_rhythm_active`, `sensor.${deviceSlug}_rhythm_active`, `${this.controllerName(snapshotArg)} rhythm active`, this.valueLike(snapshotArg.rhythm?.rhythmActive));
116
- for (const panel of this.panels(snapshotArg)) {
117
- const panelDeviceId = this.panelDeviceId(snapshotArg, panel);
118
- entities.push({
119
- id: `sensor.${deviceSlug}_panel_${panel.panelId}`,
120
- uniqueId: `nanoleaf_${this.slug(deviceId)}_panel_${panel.panelId}`,
121
- integrationDomain: 'nanoleaf',
122
- deviceId: panelDeviceId,
123
- platform: 'sensor',
124
- name: `${this.controllerName(snapshotArg)} panel ${panel.panelId}`,
125
- state: panel.panelId,
126
- attributes: {
127
- x: panel.x,
128
- y: panel.y,
129
- orientation: panel.o,
130
- shapeType: panel.shapeType,
131
- },
132
- available: true,
133
- });
43
+ const lightId = this.lightEntityId(snapshotArg);
44
+ const entities = [{ id: lightId, uniqueId: lightId, deviceId: this.deviceId(snapshotArg), integrationDomain: 'nanoleaf',
45
+ platform: 'light', name: snapshotArg.name, state: snapshotArg.power ? 'on' : 'off', available: true,
46
+ attributes: { brightness: snapshotArg.brightness?.value, colorTemperatureKelvin: snapshotArg.colorTemperatureKelvin?.value,
47
+ colorMode: snapshotArg.colorMode, observedAt: snapshotArg.observedAt } }];
48
+ if (snapshotArg.availableEffects.length) {
49
+ const effectId = this.effectEntityId(snapshotArg);
50
+ entities.push({ id: effectId, uniqueId: effectId, deviceId: this.deviceId(snapshotArg), integrationDomain: 'nanoleaf',
51
+ platform: 'select', name: `${snapshotArg.name} scene`, state: snapshotArg.selectedEffect ?? null, available: true,
52
+ attributes: { options: [...snapshotArg.availableEffects], observedAt: snapshotArg.observedAt } });
134
53
  }
135
54
  return entities;
136
55
  }
137
- static toIntegrationEvent(eventArg) {
138
- return {
139
- type: 'state_changed',
140
- integrationDomain: 'nanoleaf',
141
- data: eventArg,
142
- timestamp: eventArg.timestamp ?? Date.now(),
143
- };
144
- }
145
- static panelDevice(snapshotArg, panelArg, updatedAtArg) {
146
- const features = [
147
- { id: 'layout_x', capability: 'sensor', name: 'Layout X', readable: true, writable: false },
148
- { id: 'layout_y', capability: 'sensor', name: 'Layout Y', readable: true, writable: false },
149
- { id: 'orientation', capability: 'sensor', name: 'Orientation', readable: true, writable: false },
150
- { id: 'shape_type', capability: 'sensor', name: 'Shape type', readable: true, writable: false },
151
- ];
152
- return {
153
- id: this.panelDeviceId(snapshotArg, panelArg),
154
- integrationDomain: 'nanoleaf',
155
- name: `${this.controllerName(snapshotArg)} Panel ${panelArg.panelId}`,
156
- protocol: 'http',
157
- manufacturer: 'Nanoleaf',
158
- model: panelArg.shapeType === undefined ? 'Panel' : `Panel shape ${panelArg.shapeType}`,
159
- online: true,
160
- features,
161
- state: [
162
- { featureId: 'layout_x', value: panelArg.x ?? null, updatedAt: updatedAtArg },
163
- { featureId: 'layout_y', value: panelArg.y ?? null, updatedAt: updatedAtArg },
164
- { featureId: 'orientation', value: panelArg.o ?? null, updatedAt: updatedAtArg },
165
- { featureId: 'shape_type', value: panelArg.shapeType ?? null, updatedAt: updatedAtArg },
166
- ],
167
- metadata: {
168
- panelId: panelArg.panelId,
169
- controllerDeviceId: this.controllerDeviceId(snapshotArg),
170
- },
171
- };
172
- }
173
- static pushSensorEntity(entitiesArg, deviceIdArg, uniqueIdArg, idArg, nameArg, valueArg) {
174
- if (valueArg === undefined) {
175
- return;
176
- }
177
- entitiesArg.push({
178
- id: idArg,
179
- uniqueId: uniqueIdArg,
180
- integrationDomain: 'nanoleaf',
181
- deviceId: deviceIdArg,
182
- platform: 'sensor',
183
- name: nameArg,
184
- state: valueArg,
185
- available: true,
186
- });
187
- }
188
- static controllerDeviceId(snapshotArg) {
189
- return `nanoleaf.controller.${this.slug(snapshotArg.controllerInfo.serialNo || snapshotArg.controllerInfo.name || 'unknown')}`;
190
- }
191
- static panelDeviceId(snapshotArg, panelArg) {
192
- return `nanoleaf.panel.${this.slug(snapshotArg.controllerInfo.serialNo || snapshotArg.controllerInfo.name || 'unknown')}.${panelArg.panelId}`;
193
- }
194
- static controllerName(snapshotArg) {
195
- return snapshotArg.controllerInfo.name || snapshotArg.controllerInfo.model || 'Nanoleaf';
196
- }
197
- static panels(snapshotArg) {
198
- return snapshotArg.panelLayout?.layout?.positionData ?? [];
199
- }
200
- static panelCount(snapshotArg) {
201
- return snapshotArg.panelLayout?.layout?.numPanels ?? snapshotArg.panelLayout?.layout?.positionData?.length;
202
- }
203
- static currentEffect(snapshotArg) {
204
- const effect = snapshotArg.effects.select;
205
- if (!effect || RESERVED_EFFECTS.has(effect)) {
206
- return undefined;
207
- }
208
- return effect;
209
- }
210
- static availableEffects(snapshotArg) {
211
- return (snapshotArg.effects.effectsList ?? []).filter((effectArg) => !RESERVED_EFFECTS.has(effectArg));
212
- }
213
- static colorMode(stateArg) {
214
- return this.valueLike(stateArg.colorMode);
215
- }
216
- static stateValue(valueArg) {
217
- return valueArg?.value;
218
- }
219
- static valueLike(valueArg) {
220
- if (this.isRecord(valueArg) && 'value' in valueArg) {
221
- return valueArg.value;
222
- }
223
- return valueArg;
224
- }
225
- static slug(valueArg) {
226
- return valueArg.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '') || 'nanoleaf';
227
- }
228
- static isRecord(valueArg) {
229
- return typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
230
- }
231
56
  }
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFub2xlYWYubWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvaW50ZWdyYXRpb25zL25hbm9sZWFmL25hbm9sZWFmLm1hcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBVTVDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFdkUsTUFBTSxPQUFPLGNBQWM7SUFDbEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUE4QjtRQUNwRCxNQUFNLE9BQU8sR0FBbUQsRUFBRSxDQUFDO1FBQ25FLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxNQUFNLFFBQVEsR0FBZ0Q7WUFDNUQsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7WUFDbkcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7WUFDaEYsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtZ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
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFub2xlYWYubWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvaW50ZWdyYXRpb25zL25hbm9sZWFmL25hbm9sZWFmLm1hcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLE9BQU8sY0FBYztJQUNsQixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQStEO1FBQ3BGLE9BQU8sWUFBWSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksa0JBQWtCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7SUFDOUcsQ0FBQztJQUVNLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBK0QsSUFBWSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvSSxNQUFNLENBQUMsY0FBYyxDQUFDLFdBQStELElBQVksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFakosTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUE4QjtRQUNwRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFnRDtZQUM1RCxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUNuRixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtTQUM1RixDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQThDO1lBQ3ZELEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEtB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
@@ -1,151 +1,37 @@
1
- export type TNanoleafProtocol = 'http' | 'https';
2
- export type TNanoleafColorMode = 'hs' | 'ct' | 'effect' | string;
3
- export type TNanoleafGesture = 'swipe_up' | 'swipe_down' | 'swipe_left' | 'swipe_right';
1
+ import type * as plugins from '../../plugins.js';
2
+ import type { IConfigEncryptionKeyProvider } from '../../core/classes.configstore.js';
4
3
  export interface INanoleafConfig {
5
- host?: string;
6
- port?: number;
7
- protocol?: TNanoleafProtocol;
8
- authToken?: string;
9
- token?: string;
10
- controllerInfo?: INanoleafControllerInfo;
11
- state?: INanoleafState;
12
- effects?: INanoleafEffects;
13
- panelLayout?: INanoleafPanelLayout;
14
- rhythm?: INanoleafRhythmInfo;
15
- snapshot?: INanoleafSnapshot;
16
- }
17
- export interface INanoleafValue<TValue> {
18
- value: TValue;
19
- min?: number;
20
- max?: number;
21
- }
22
- export interface INanoleafState {
23
- on?: INanoleafValue<boolean>;
24
- brightness?: INanoleafValue<number>;
25
- hue?: INanoleafValue<number>;
26
- sat?: INanoleafValue<number>;
27
- ct?: INanoleafValue<number>;
28
- colorMode?: TNanoleafColorMode | INanoleafValue<TNanoleafColorMode>;
29
- }
30
- export interface INanoleafPanelInfo {
31
- panelId: number;
32
- x?: number;
33
- y?: number;
34
- o?: number;
35
- shapeType?: number;
36
- }
37
- export interface INanoleafPanelLayout {
38
- globalOrientation?: INanoleafValue<number>;
39
- layout?: {
40
- numPanels?: number;
41
- sideLength?: number;
42
- positionData?: INanoleafPanelInfo[];
43
- };
44
- }
45
- export interface INanoleafRhythmInfo {
46
- rhythmConnected?: boolean | INanoleafValue<boolean>;
47
- rhythmActive?: boolean | INanoleafValue<boolean>;
48
- rhythmId?: number | INanoleafValue<number>;
49
- hardwareVersion?: string | INanoleafValue<string>;
50
- firmwareVersion?: string | INanoleafValue<string>;
51
- auxAvailable?: boolean | INanoleafValue<boolean>;
52
- rhythmMode?: number | string | INanoleafValue<number | string>;
53
- rhythmPos?: number | INanoleafValue<number>;
54
- }
55
- export interface INanoleafEffects {
56
- select?: string;
57
- effectsList?: string[];
58
- write?: INanoleafEffectsCommand;
59
- }
60
- export interface INanoleafEffectPaletteColor {
61
- hue?: number;
62
- saturation?: number;
63
- brightness?: number;
64
- probability?: number;
65
- }
66
- export interface INanoleafEffectPluginOption {
67
- name: string;
68
- value?: string | number | boolean;
69
- type?: string;
70
- defaultValue?: string | number | boolean;
71
- minValue?: number;
72
- maxValue?: number;
73
- strings?: string[];
74
- }
75
- export interface INanoleafEffectsCommand {
76
- command: 'add' | 'request' | 'delete' | 'display' | 'displayTemp' | 'rename' | 'requestAll' | 'requestPlugins' | string;
77
- version?: string;
78
- duration?: number;
79
- animName?: string;
80
- newName?: string;
81
- animType?: string;
82
- animData?: string | null;
83
- colorType?: string;
84
- palette?: INanoleafEffectPaletteColor[];
85
- Palette?: INanoleafEffectPaletteColor[];
86
- pluginUuid?: string;
87
- pluginType?: string;
88
- pluginOptions?: INanoleafEffectPluginOption[];
89
- loop?: boolean;
90
- [key: string]: unknown;
91
- }
92
- export interface INanoleafStateCommand {
93
- on?: INanoleafValue<boolean>;
94
- brightness?: INanoleafValue<number> & {
95
- duration?: number;
96
- increment?: number;
97
- };
98
- hue?: INanoleafValue<number> & {
99
- increment?: number;
100
- };
101
- sat?: INanoleafValue<number> & {
102
- increment?: number;
103
- };
104
- ct?: INanoleafValue<number> & {
105
- increment?: number;
106
- };
107
- }
108
- export interface INanoleafControllerInfo {
109
- name?: string;
110
- serialNo?: string;
111
- manufacturer?: string;
112
- firmwareVersion?: string;
113
- hardwareVersion?: string;
114
- model?: string;
115
- state?: INanoleafState;
116
- effects?: INanoleafEffects;
117
- panelLayout?: INanoleafPanelLayout;
118
- rhythm?: INanoleafRhythmInfo;
119
- }
120
- export interface INanoleafSnapshot {
121
- controllerInfo: INanoleafControllerInfo;
122
- state: INanoleafState;
123
- effects: INanoleafEffects;
124
- panelLayout?: INanoleafPanelLayout;
125
- rhythm?: INanoleafRhythmInfo;
126
- }
127
- export interface INanoleafAuthTokenResult {
128
- success: boolean;
129
- authToken?: string;
130
- error?: string;
131
- }
132
- export interface INanoleafEvent<TData = unknown> {
133
- type: 'state' | 'effects' | 'layout' | 'touch' | string;
134
- data: TData;
135
- timestamp?: number;
136
- }
137
- export interface INanoleafStateEventData {
138
- attribute: keyof INanoleafState | string;
139
- value: unknown;
140
- }
141
- export interface INanoleafEffectsEventData {
142
- effect?: string;
143
- effectsList?: string[];
144
- }
145
- export interface INanoleafTouchEventData {
146
- panelId?: number;
147
- gestureId?: number;
148
- gesture?: TNanoleafGesture;
4
+ homeId: string;
5
+ origin: string;
6
+ expectedSerialNumber: string;
7
+ expectedModel: string;
8
+ /** Existing token reference in the encrypted home/domain configuration store. */
9
+ credentialKey: string;
10
+ allowUnencryptedHttp?: boolean;
11
+ certificateAuthority?: string;
12
+ timeoutMs?: number;
13
+ maxResponseBytes?: number;
14
+ maxPendingOperations?: number;
15
+ }
16
+ export interface INanoleafIntegrationOptions {
17
+ readonly homeId?: string;
18
+ readonly db?: plugins.nosqldb.SmartdataDb;
19
+ readonly keyProvider?: IConfigEncryptionKeyProvider;
20
+ }
21
+ export interface INanoleafCredential {
22
+ version: 1;
23
+ origin: string;
24
+ serialNumber: string;
25
+ model: string;
26
+ authToken: string;
27
+ }
28
+ export interface INanoleafSnapshot extends plugins.ecobridgeDeviceManager.INanoleafSnapshot {
29
+ readonly homeId: string;
30
+ readonly origin: string;
31
+ }
32
+ export interface INanoleafWriteResult {
33
+ readonly acceptance: 'accepted';
34
+ readonly snapshot: INanoleafSnapshot;
149
35
  }
150
36
  export interface INanoleafMdnsRecord {
151
37
  name?: string;
@@ -0,0 +1,6 @@
1
+ import type { INanoleafConfig } from './nanoleaf.types.js';
2
+ export declare function nanoleafRecord(valueArg: unknown, nameArg: string): Record<string, unknown>;
3
+ export declare function nanoleafKeys(recordArg: Record<string, unknown>, keysArg: readonly string[]): void;
4
+ export declare function nanoleafText(valueArg: unknown, nameArg: string, maximumArg?: number): string;
5
+ export declare function nanoleafInteger(valueArg: unknown, minimumArg: number, maximumArg: number, nameArg: string): number;
6
+ export declare function normalizeNanoleafConfig(valueArg: unknown): Readonly<INanoleafConfig>;
@@ -0,0 +1,82 @@
1
+ import * as plugins from '../../plugins.js';
2
+ export function nanoleafRecord(valueArg, nameArg) {
3
+ if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg) ||
4
+ ![Object.prototype, null].includes(Object.getPrototypeOf(valueArg))) {
5
+ throw new TypeError(`Nanoleaf ${nameArg} must be a plain data object.`);
6
+ }
7
+ const result = {};
8
+ for (const key of Reflect.ownKeys(valueArg)) {
9
+ const descriptor = Object.getOwnPropertyDescriptor(valueArg, key);
10
+ if (typeof key !== 'string' || !descriptor || !('value' in descriptor) || !descriptor.enumerable) {
11
+ throw new TypeError(`Nanoleaf ${nameArg} may not contain symbols, accessors or hidden fields.`);
12
+ }
13
+ Object.defineProperty(result, key, { value: descriptor.value, enumerable: true });
14
+ }
15
+ return result;
16
+ }
17
+ export function nanoleafKeys(recordArg, keysArg) {
18
+ if (Object.keys(recordArg).some((keyArg) => !keysArg.includes(keyArg)))
19
+ throw new TypeError('Nanoleaf data contains unsupported fields.');
20
+ }
21
+ export function nanoleafText(valueArg, nameArg, maximumArg = 256) {
22
+ if (typeof valueArg !== 'string' || !valueArg.trim() || valueArg.length > maximumArg || /[\p{Cc}\p{Cs}]/u.test(valueArg)) {
23
+ throw new TypeError(`Nanoleaf ${nameArg} must be a bounded non-empty string without control characters.`);
24
+ }
25
+ return valueArg;
26
+ }
27
+ export function nanoleafInteger(valueArg, minimumArg, maximumArg, nameArg) {
28
+ if (typeof valueArg !== 'number' || !Number.isSafeInteger(valueArg) || valueArg < minimumArg || valueArg > maximumArg) {
29
+ throw new TypeError(`Nanoleaf ${nameArg} must be an integer from ${minimumArg} through ${maximumArg}.`);
30
+ }
31
+ return valueArg;
32
+ }
33
+ export function normalizeNanoleafConfig(valueArg) {
34
+ const config = nanoleafRecord(valueArg, 'configuration');
35
+ nanoleafKeys(config, ['homeId', 'origin', 'expectedSerialNumber', 'expectedModel', 'credentialKey',
36
+ 'allowUnencryptedHttp', 'certificateAuthority', 'timeoutMs', 'maxResponseBytes', 'maxPendingOperations']);
37
+ const homeId = nanoleafText(config.homeId, 'homeId');
38
+ const rawOrigin = nanoleafText(config.origin, 'origin', 2048);
39
+ let origin;
40
+ try {
41
+ origin = new URL(rawOrigin);
42
+ }
43
+ catch {
44
+ throw new TypeError('Nanoleaf origin must be a selected local HTTP(S) origin.');
45
+ }
46
+ const [first, second, third, fourth] = origin.hostname.split('.').map(Number);
47
+ const selectedOrigin = /^https?:\/\/((?:[0-9]{1,3}\.){3}[0-9]{1,3})(?::([0-9]{1,5}))?\/?$/.exec(rawOrigin);
48
+ const local = plugins.net.isIP(origin.hostname) === 4 && (first === 10 || first === 127 ||
49
+ first === 192 && second === 168 || first === 172 && second >= 16 && second <= 31 || first === 169 && second === 254);
50
+ if (!local || fourth === 255 || first === 169 && second === 254 && (third === 0 || third === 255) ||
51
+ !selectedOrigin || selectedOrigin[1] !== origin.hostname || selectedOrigin[2] !== undefined && Number(selectedOrigin[2]) === 0 ||
52
+ origin.username || origin.password || origin.search || origin.hash || origin.pathname !== '/' ||
53
+ !['http:', 'https:'].includes(origin.protocol)) {
54
+ throw new TypeError('Nanoleaf origin must select one private, loopback or link-local unicast IPv4 HTTP(S) controller.');
55
+ }
56
+ if (config.allowUnencryptedHttp !== undefined && typeof config.allowUnencryptedHttp !== 'boolean')
57
+ throw new TypeError('Nanoleaf HTTP consent must be a boolean.');
58
+ if (origin.protocol === 'http:' && config.allowUnencryptedHttp !== true)
59
+ throw new TypeError('Nanoleaf plaintext HTTP requires explicit allowUnencryptedHttp: true consent.');
60
+ const expectedModel = nanoleafText(config.expectedModel, 'expectedModel', 64);
61
+ if (!plugins.ecobridgeDeviceManager.nanoleafSupportedModels.some((modelArg) => modelArg === expectedModel)) {
62
+ throw new TypeError('Nanoleaf expectedModel must identify a documented Light Panels API controller.');
63
+ }
64
+ const certificateAuthority = config.certificateAuthority;
65
+ if (certificateAuthority !== undefined && (typeof certificateAuthority !== 'string' || certificateAuthority.length > 524288 ||
66
+ !certificateAuthority.includes('-----BEGIN CERTIFICATE-----')))
67
+ throw new TypeError('Nanoleaf certificateAuthority must be a bounded PEM certificate.');
68
+ const credentialKey = nanoleafText(config.credentialKey, 'credentialKey');
69
+ if (encodeURIComponent(credentialKey).length > 900)
70
+ throw new TypeError('Nanoleaf credentialKey exceeds the encrypted store key bound.');
71
+ return Object.freeze({
72
+ homeId, origin: origin.origin,
73
+ expectedSerialNumber: nanoleafText(config.expectedSerialNumber, 'expectedSerialNumber', 128), expectedModel,
74
+ credentialKey,
75
+ allowUnencryptedHttp: config.allowUnencryptedHttp === true,
76
+ certificateAuthority,
77
+ timeoutMs: nanoleafInteger(config.timeoutMs === undefined ? 5000 : config.timeoutMs, 1, 60000, 'timeoutMs'),
78
+ maxResponseBytes: nanoleafInteger(config.maxResponseBytes === undefined ? 1048576 : config.maxResponseBytes, 256, 1048576, 'maxResponseBytes'),
79
+ maxPendingOperations: nanoleafInteger(config.maxPendingOperations === undefined ? 32 : config.maxPendingOperations, 1, 64, 'maxPendingOperations'),
80
+ });
81
+ }
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFub2xlYWYudmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2ludGVncmF0aW9ucy9uYW5vbGVhZi9uYW5vbGVhZi52YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFHNUMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxRQUFpQixFQUFFLE9BQWU7SUFDL0QsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDdEUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxPQUFPLCtCQUErQixDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7SUFDM0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDNUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pHLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxPQUFPLHVEQUF1RCxDQUFDLENBQUM7UUFDbEcsQ0FBQztRQUNELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMs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