@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,90 +1,71 @@
1
- import { broadlinkDefaultPort, broadlinkDefaultTimeoutSeconds } from './broadlink.constants.js';
1
+ import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
2
+ import { readBroadlinkActions } from './broadlink.actions.js';
3
+ import { broadlinkConfigKey, broadlinkRecord, readBroadlinkSelection } from './broadlink.validation.js';
2
4
  export class BroadlinkConfigFlow {
3
- async start(candidateArg, contextArg) {
4
- void contextArg;
5
- const metadata = candidateArg.metadata || {};
6
- const host = candidateArg.host || this.stringValue(metadata.host) || '';
7
- const deviceType = candidateArg.model || this.stringValue(metadata.deviceType) || '';
8
- const name = candidateArg.name || this.stringValue(metadata.name) || '';
9
- return {
10
- kind: 'form',
11
- title: 'Connect Broadlink device',
12
- description: 'Provide the local host and device identity. This TypeScript port maps snapshots and commands, and requires an injected executor for live Broadlink UDP/auth traffic.',
13
- fields: [
14
- { name: 'host', label: host ? `Host (${host})` : 'Host', type: 'text', required: true },
15
- { name: 'port', label: `Port (${candidateArg.port || broadlinkDefaultPort})`, type: 'number' },
16
- { name: 'timeout', label: `Timeout seconds (${broadlinkDefaultTimeoutSeconds})`, type: 'number' },
17
- { name: 'name', label: name ? `Name (${name})` : 'Name', type: 'text' },
18
- { name: 'type', label: deviceType ? `Device type (${deviceType})` : 'Device type', type: 'text' },
19
- { name: 'macAddress', label: candidateArg.macAddress ? `MAC (${candidateArg.macAddress})` : 'MAC address', type: 'text' },
20
- { name: 'snapshotJson', label: 'Snapshot JSON', type: 'text' },
21
- ],
22
- submit: async (valuesArg) => this.submit(candidateArg, valuesArg),
23
- };
5
+ #scope;
6
+ constructor(scopeArg) {
7
+ this.#scope = scopeArg ?? new NativeIntegrationOwner('broadlink').createFlowScope();
24
8
  }
25
- async submit(candidateArg, valuesArg) {
26
- const snapshot = this.snapshotFromInput(valuesArg.snapshotJson);
27
- if (snapshot instanceof Error) {
28
- return { kind: 'error', title: 'Invalid snapshot', error: snapshot.message };
29
- }
30
- const host = this.stringValue(valuesArg.host) || candidateArg.host || snapshot?.host;
31
- if (!host && !snapshot) {
32
- return { kind: 'error', title: 'Host required', error: 'Broadlink setup requires a host unless a config is created directly from a snapshot.' };
33
- }
34
- const metadata = candidateArg.metadata || {};
35
- const config = {
36
- host,
37
- port: this.numberValue(valuesArg.port) || candidateArg.port || snapshot?.port || broadlinkDefaultPort,
38
- timeout: this.numberValue(valuesArg.timeout) || this.numberValue(metadata.timeout) || broadlinkDefaultTimeoutSeconds,
39
- name: this.stringValue(valuesArg.name) || candidateArg.name,
40
- macAddress: this.stringValue(valuesArg.macAddress) || candidateArg.macAddress,
41
- deviceId: candidateArg.id,
42
- type: (this.stringValue(valuesArg.type) || this.stringValue(metadata.deviceType) || candidateArg.model),
43
- devtype: this.numberValue(metadata.devtype),
44
- model: candidateArg.model,
45
- manufacturer: candidateArg.manufacturer || 'Broadlink',
46
- isLocked: metadata.isLocked === true,
47
- snapshot,
48
- metadata: {
49
- discoverySource: candidateArg.source,
50
- discoveryMetadata: metadata,
51
- liveUdpAuthImplemented: false,
52
- },
53
- };
54
- return {
55
- kind: 'done',
56
- title: 'Broadlink device configured',
57
- config,
58
- };
59
- }
60
- snapshotFromInput(valueArg) {
61
- const text = this.stringValue(valueArg);
62
- if (!text) {
63
- return undefined;
64
- }
9
+ async start(candidateArg, contextArg) {
65
10
  try {
66
- const parsed = JSON.parse(text);
67
- if (!parsed || !Array.isArray(parsed.devices)) {
68
- return new Error('Snapshot JSON must include a devices array.');
69
- }
70
- return parsed;
71
- }
72
- catch (errorArg) {
73
- return errorArg instanceof Error ? errorArg : new Error(String(errorArg));
74
- }
75
- }
76
- stringValue(valueArg) {
77
- return typeof valueArg === 'string' && valueArg.trim() ? valueArg.trim() : undefined;
78
- }
79
- numberValue(valueArg) {
80
- if (typeof valueArg === 'number' && Number.isFinite(valueArg)) {
81
- return valueArg;
11
+ const context = this.#scope.admit(contextArg);
12
+ return await this.#scope.run(context, undefined, async (leaseArg) => {
13
+ leaseArg.assertOpen();
14
+ const host = candidateArg.host;
15
+ const macAddress = candidateArg.macAddress;
16
+ const candidateType = candidateArg.metadata?.devtype;
17
+ const name = candidateArg.name;
18
+ return {
19
+ kind: 'form', title: 'Select Broadlink IR bridge',
20
+ description: 'Select one RM mini 3 or RM4 mini on a trusted local network and provide owner-approved native IR action packets. Bridge acceptance cannot confirm appliance effects.',
21
+ fields: [
22
+ { name: 'host', label: host ? `Private IPv4 (${host})` : 'Private IPv4', type: 'text', required: true },
23
+ { name: 'macAddress', label: macAddress ? `MAC (${macAddress})` : 'Exact MAC', type: 'text', required: true },
24
+ { name: 'deviceType', label: 'Exact bridge type', type: 'select', required: true,
25
+ options: [{ label: 'RM mini 3 (0x2737)', value: '0x2737' }, { label: 'RM4 mini (0x51da)', value: '0x51da' }] },
26
+ { name: 'name', label: name ? `Name (${name})` : 'Bridge name', type: 'text' },
27
+ { name: 'port', label: 'UDP port (80)', type: 'number' },
28
+ { name: 'localAddress', label: 'Local private IPv4 interface (optional)', type: 'text' },
29
+ { name: 'timeoutMs', label: 'Operation timeout milliseconds (5000)', type: 'number' },
30
+ { name: 'maxPendingOperations', label: 'Pending operation limit (32)', type: 'number' },
31
+ { name: 'actionsJson', label: 'Owner IR actions JSON: id, name, packetBase64', type: 'text', required: true },
32
+ ],
33
+ submit: async (valuesArg) => {
34
+ try {
35
+ const values = broadlinkRecord(valuesArg, ['host', 'macAddress', 'deviceType', 'name', 'port', 'localAddress',
36
+ 'timeoutMs', 'maxPendingOperations', 'actionsJson']);
37
+ const deviceType = values.deviceType === '0x2737' ? 0x2737 : values.deviceType === '0x51da' ? 0x51da
38
+ : values.deviceType ?? candidateType;
39
+ return await this.#scope.run(context, context.homeId, async (submissionArg) => {
40
+ const selection = readBroadlinkSelection({ homeId: context.homeId, host: values.host ?? host,
41
+ macAddress: values.macAddress ?? macAddress, deviceType, name: values.name ?? name,
42
+ port: values.port, localAddress: values.localAddress, timeoutMs: values.timeoutMs,
43
+ maxPendingOperations: values.maxPendingOperations });
44
+ if (typeof values.actionsJson !== 'string' || values.actionsJson.length > 60000)
45
+ throw new TypeError('Owner IR actions require bounded JSON.');
46
+ const actions = readBroadlinkActions(JSON.parse(values.actionsJson));
47
+ submissionArg.assertOpen();
48
+ if (submissionArg.context.configStore) {
49
+ await submissionArg.context.configStore.set(broadlinkConfigKey(selection), { version: 1, selection, actions });
50
+ }
51
+ return { kind: 'done', title: 'Broadlink selection configured', config: { ...selection,
52
+ ...(submissionArg.context.configStore ? {} : { actions: actions.map((actionArg) => ({ ...actionArg })) }) } };
53
+ });
54
+ }
55
+ catch (error) {
56
+ return { kind: 'error', title: 'Invalid Broadlink selection',
57
+ error: error instanceof Error ? error.message : 'Broadlink configuration failed.' };
58
+ }
59
+ },
60
+ };
61
+ });
82
62
  }
83
- if (typeof valueArg === 'string' && valueArg.trim()) {
84
- const value = Number(valueArg);
85
- return Number.isFinite(value) ? value : undefined;
63
+ catch (error) {
64
+ return { kind: 'error', title: 'Broadlink home admission failed',
65
+ error: error instanceof Error ? error.message : 'Provide an explicit authorized host home.' };
86
66
  }
87
- return undefined;
88
67
  }
68
+ destroy() { return this.#scope.close(); }
69
+ retryCleanup() { return this.#scope.retryCleanup(); }
89
70
  }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRsaW5rLmNsYXNzZXMuY29uZmlnZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2ludGVncmF0aW9ucy9icm9hZGxpbmsvYnJvYWRsaW5rLmNsYXNzZXMuY29uZmlnZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdoRyxNQUFNLE9BQU8sbUJBQW1CO0lBQ3ZCLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBaUMsRUFBRSxVQUE4QjtRQUNsRixLQUFLLFVBQVUsQ0FBQztRQUNoQixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyRixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4RSxPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU07WUFDWixLQUFLLEVBQUUsMEJBQTBCO1lBQ2pDLFdBQVcsRUFBRSxzS0FBc0s7WUFDbkwsTUFBTSxFQUFFO2dCQUNOLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUN2RixFQUFF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
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRsaW5rLmNsYXNzZXMuY29uZmlnZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2ludGVncmF0aW9ucy9icm9hZGxpbmsvYnJvYWRsaW5rLmNsYXNzZXMuY29uZmlnZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQStCLE1BQU0sOENBQThDLENBQUM7QUFFbkgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3hHLE1BQU0sT0FBTyxtQkFBbUI7SUFDckIsTUFBTSxDQUF5QjtJQUV4QyxZQUFZLFFBQWlDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxJQUFJLElBQUksc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdEYsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBaUMsRUFBRSxVQUE4QjtRQUNsRixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQW9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUNyRyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQy9CLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUM7Z0JBQzNDLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO2dCQUNyRCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFB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
@@ -2,43 +2,40 @@ import { BaseIntegration } from '../../core/classes.baseintegration.js';
2
2
  import type { IIntegrationRuntime, IIntegrationSetupContext } from '../../core/types.js';
3
3
  import { BroadlinkConfigFlow } from './broadlink.classes.configflow.js';
4
4
  import type { IBroadlinkConfig } from './broadlink.types.js';
5
+ export interface IBroadlinkIntegrationOptions {
6
+ readonly homeId?: string;
7
+ readonly capacity?: number;
8
+ }
5
9
  export declare class BroadlinkIntegration extends BaseIntegration<IBroadlinkConfig> {
10
+ #private;
6
11
  readonly domain = "broadlink";
7
12
  readonly displayName = "Broadlink";
8
13
  readonly status: 'control-runtime';
9
14
  readonly discoveryDescriptor: import("../../index.js").DiscoveryDescriptor;
10
15
  readonly configFlow: BroadlinkConfigFlow;
11
16
  readonly metadata: {
12
- source: string;
13
- upstreamPath: string;
14
- upstreamDomain: string;
15
17
  integrationType: string;
16
18
  iotClass: string;
17
- requirements: string[];
18
- dependencies: never[];
19
- afterDependencies: never[];
20
- codeowners: string[];
21
- documentation: string;
22
- configFlow: boolean;
23
- discovery: {
24
- dhcp: boolean;
25
- manual: boolean;
26
- localHelloRecords: boolean;
27
- note: string;
28
- };
29
19
  runtime: {
30
20
  type: string;
31
- polling: string;
32
- services: string[];
33
21
  liveUdpAuthImplemented: boolean;
22
+ services: string[];
23
+ physicalEffectConfirmed: boolean;
24
+ hardwareVerified: boolean;
34
25
  };
35
26
  localApi: {
36
- implemented: string[];
37
- explicitUnsupported: string[];
27
+ supportedDeviceTypes: number[];
28
+ ownerConfiguredRawIrOnly: boolean;
29
+ cryptographicPeerTrust: boolean;
30
+ learning: boolean;
31
+ rf: boolean;
32
+ retransmission: boolean;
38
33
  };
39
34
  };
35
+ constructor(optionsArg?: IBroadlinkIntegrationOptions);
40
36
  setup(configArg: IBroadlinkConfig, contextArg: IIntegrationSetupContext): Promise<IIntegrationRuntime>;
41
37
  destroy(): Promise<void>;
38
+ retryCleanup(): Promise<void>;
42
39
  }
43
40
  export declare class HomeAssistantBroadlinkIntegration extends BroadlinkIntegration {
44
41
  }
@@ -1,88 +1,143 @@
1
+ import * as plugins from '../../plugins.js';
1
2
  import { BaseIntegration } from '../../core/classes.baseintegration.js';
3
+ import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
2
4
  import { BroadlinkClient } from './broadlink.classes.client.js';
3
5
  import { BroadlinkConfigFlow } from './broadlink.classes.configflow.js';
4
6
  import { createBroadlinkDiscoveryDescriptor } from './broadlink.discovery.js';
5
- import { BroadlinkMapper } from './broadlink.mapper.js';
7
+ import { BroadlinkSelectedMapper } from './broadlink.selected.mapper.js';
8
+ import { readBroadlinkActions } from './broadlink.actions.js';
9
+ import { broadlinkRecord, readBroadlinkSelection } from './broadlink.validation.js';
10
+ const refused = (messageArg) => ({ success: false, error: messageArg,
11
+ data: { outcome: 'not-sent', physicalEffectConfirmed: false } });
6
12
  export class BroadlinkIntegration extends BaseIntegration {
7
13
  domain = 'broadlink';
8
14
  displayName = 'Broadlink';
9
15
  status = 'control-runtime';
10
16
  discoveryDescriptor = createBroadlinkDiscoveryDescriptor();
11
- configFlow = new BroadlinkConfigFlow();
17
+ configFlow;
12
18
  metadata = {
13
- source: 'home-assistant/core',
14
- upstreamPath: 'homeassistant/components/broadlink',
15
- upstreamDomain: 'broadlink',
16
- integrationType: 'device',
17
- iotClass: 'local_polling',
18
- requirements: ['broadlink==0.19.0'],
19
- dependencies: [],
20
- afterDependencies: [],
21
- codeowners: ['@danielhiversen', '@felipediel', '@L-I-Am', '@eifinger'],
22
- documentation: 'https://www.home-assistant.io/integrations/broadlink',
23
- configFlow: true,
24
- discovery: {
25
- dhcp: true,
26
- manual: true,
27
- localHelloRecords: true,
28
- note: 'Home Assistant uses python-broadlink UDP hello/auth. This native port recognizes DHCP/manual/local hello candidates; live UDP is an injected executor boundary.',
29
- },
30
- runtime: {
31
- type: 'control-runtime',
32
- polling: 'snapshot/manual',
33
- services: ['remote.send_command', 'remote.learn_command', 'remote.delete_command', 'switch.turn_on', 'switch.turn_off', 'infrared.send_command', 'radio_frequency.send_command', 'broadlink.send_packet'],
34
- liveUdpAuthImplemented: false,
35
- },
36
- localApi: {
37
- implemented: [
38
- 'Broadlink DHCP/manual/local hello discovery candidate mapping',
39
- 'Config flow shape for host, MAC, device type, timeout, and optional snapshot JSON',
40
- 'Snapshot mapping for RM remote entities, Broadlink switch/outlet slots, custom IR/RF switches, and safe sensor keys',
41
- 'Packet encoding for Broadlink IR timings and 315/433 MHz RF timings',
42
- 'Explicit service command shapes for learned-code send/delete, learn IR/RF, send packet, switch power, IR, and RF commands',
43
- ],
44
- explicitUnsupported: [
45
- 'Native Broadlink UDP discovery broadcast from this package',
46
- 'Native Broadlink encrypted UDP auth/session transport',
47
- 'Claiming live packets were sent without an injected commandExecutor or transport.execute',
48
- ],
49
- },
19
+ integrationType: 'device', iotClass: 'local_polling',
20
+ runtime: { type: 'control-runtime', liveUdpAuthImplemented: true,
21
+ services: ['button.press', 'broadlink.send_ir'], physicalEffectConfirmed: false, hardwareVerified: false },
22
+ localApi: { supportedDeviceTypes: [0x2737, 0x51da], ownerConfiguredRawIrOnly: true,
23
+ cryptographicPeerTrust: false, learning: false, rf: false, retransmission: false },
50
24
  };
25
+ #owner;
26
+ constructor(optionsArg = {}) {
27
+ super();
28
+ this.#owner = new NativeIntegrationOwner('broadlink', optionsArg);
29
+ this.configFlow = new BroadlinkConfigFlow(this.#owner.createFlowScope());
30
+ }
51
31
  async setup(configArg, contextArg) {
52
- void contextArg;
53
- return new BroadlinkRuntime(new BroadlinkClient(configArg));
32
+ const config = broadlinkRecord(configArg, ['homeId', 'host', 'macAddress', 'deviceType', 'port',
33
+ 'localAddress', 'timeoutMs', 'maxPendingOperations', 'name', 'actions']);
34
+ const selection = readBroadlinkSelection(config);
35
+ const actions = config.actions === undefined ? undefined : readBroadlinkActions(config.actions);
36
+ const captured = { ...selection, actions: actions?.map((actionArg) => ({ ...actionArg })) };
37
+ return this.#owner.runSetup(contextArg, selection.homeId, async (leaseArg) => {
38
+ const client = new BroadlinkClient(captured, { ...leaseArg.context, abortSignal: leaseArg.signal });
39
+ leaseArg.own(() => client.retryCleanup());
40
+ await client.initialize();
41
+ leaseArg.assertOpen();
42
+ const runtime = new BroadlinkRuntime(client, leaseArg);
43
+ leaseArg.promoteToRuntime();
44
+ return runtime;
45
+ });
54
46
  }
55
- async destroy() { }
47
+ destroy() { return this.#owner.close(); }
48
+ retryCleanup() { return this.#owner.retryCleanup(); }
56
49
  }
57
50
  export class HomeAssistantBroadlinkIntegration extends BroadlinkIntegration {
58
51
  }
59
52
  class BroadlinkRuntime {
60
53
  client;
54
+ lease;
61
55
  domain = 'broadlink';
62
- constructor(client) {
56
+ constructor(client, lease) {
63
57
  this.client = client;
58
+ this.lease = lease;
64
59
  }
65
- async devices() {
66
- return BroadlinkMapper.toDevices(await this.client.getSnapshot());
60
+ isHealthy() { return this.client.isHealthy(); }
61
+ async devices(signalArg) {
62
+ return BroadlinkSelectedMapper.toDevices(await this.client.getSnapshot(signalArg));
67
63
  }
68
64
  async entities() {
69
- return BroadlinkMapper.toEntities(await this.client.getSnapshot());
70
- }
71
- async subscribe(handlerArg) {
72
- const unsubscribe = this.client.onEvent((eventArg) => handlerArg(BroadlinkMapper.toIntegrationEvent(eventArg)));
73
- return async () => unsubscribe();
65
+ return BroadlinkSelectedMapper.toEntities(await this.client.getSnapshot());
74
66
  }
75
67
  async callService(requestArg) {
76
- const snapshot = await this.client.getSnapshot();
77
- const command = BroadlinkMapper.commandForService(snapshot, requestArg);
78
- if (!command) {
79
- return { success: false, error: `Unsupported Broadlink service or target: ${requestArg.domain}.${requestArg.service}` };
68
+ try {
69
+ const request = broadlinkRecord(requestArg, ['domain', 'service', 'target', 'data']);
70
+ const target = broadlinkRecord(request.target, ['entityId', 'deviceId']);
71
+ const snapshot = this.client.currentSnapshot;
72
+ const knownDeviceId = BroadlinkSelectedMapper.deviceId(snapshot.selection);
73
+ if (target.deviceId !== undefined && target.deviceId !== knownDeviceId)
74
+ return refused('Broadlink service target is outside the selected home and bridge.');
75
+ if (request.domain === 'button' && request.service === 'press') {
76
+ if (request.data !== undefined)
77
+ broadlinkRecord(request.data, []);
78
+ const action = snapshot.actions.find((actionArg) => BroadlinkSelectedMapper.entityId(snapshot.selection, actionArg.id) === target.entityId);
79
+ if (!action)
80
+ return refused('Broadlink button press requires one known action entity.');
81
+ return this.transmit(action.id);
82
+ }
83
+ if (request.domain === 'broadlink' && request.service === 'send_ir') {
84
+ const data = broadlinkRecord(request.data, ['actionId']);
85
+ const action = snapshot.actions.find((actionArg) => actionArg.id === data.actionId);
86
+ if (target.deviceId !== knownDeviceId || !action
87
+ || target.entityId !== undefined && target.entityId !== BroadlinkSelectedMapper.entityId(snapshot.selection, action.id)) {
88
+ return refused('Broadlink IR service requires the known bridge and one configured action ID.');
89
+ }
90
+ return this.transmit(action.id);
91
+ }
92
+ return refused('Broadlink supports only configured button.press and broadlink.send_ir actions.');
93
+ }
94
+ catch {
95
+ return refused('Broadlink service request is invalid.');
96
+ }
97
+ }
98
+ async writeFeature(requestArg, signalArg) {
99
+ try {
100
+ const request = broadlinkRecord(requestArg, ['device', 'feature', 'value']);
101
+ const device = broadlinkRecord(request.device, ['id', 'integrationDomain', 'name', 'room', 'protocol', 'manufacturer',
102
+ 'model', 'online', 'features', 'state', 'metadata']);
103
+ const metadata = broadlinkRecord(device.metadata, ['homeId', 'macAddress', 'deviceType', 'physicalEffectConfirmed',
104
+ 'cryptographicPeerTrust', 'hardwareVerified']);
105
+ const feature = broadlinkRecord(request.feature, ['id', 'capability', 'name', 'readable', 'writable', 'unit']);
106
+ const snapshot = this.client.currentSnapshot;
107
+ const canonical = BroadlinkSelectedMapper.toDevices(snapshot)[0];
108
+ const current = canonical.features.find((featureArg) => featureArg.id === feature.id && featureArg.writable);
109
+ if (device.id !== canonical.id || device.integrationDomain !== 'broadlink' || device.protocol !== 'udp'
110
+ || metadata.homeId !== snapshot.selection.homeId || metadata.macAddress !== snapshot.selection.macAddress
111
+ || metadata.deviceType !== snapshot.selection.deviceType || !current
112
+ || feature.capability !== current.capability || feature.name !== current.name
113
+ || feature.readable !== false || feature.writable !== true || feature.unit !== undefined || request.value !== true) {
114
+ return refused('Broadlink feature write requires the canonical selected action and trigger value true.');
115
+ }
116
+ if (signalArg !== undefined && !(signalArg instanceof AbortSignal))
117
+ return refused('Broadlink cancellation requires an AbortSignal.');
118
+ return this.transmit(current.id.slice(3), signalArg);
119
+ }
120
+ catch {
121
+ return refused('Broadlink feature request is invalid.');
80
122
  }
81
- const result = await this.client.sendCommand(command);
82
- return { success: result.success, error: result.error, data: result.data };
83
123
  }
84
- async destroy() {
85
- await this.client.destroy();
124
+ async transmit(actionIdArg, signalArg) {
125
+ if (!this.client.isHealthy())
126
+ return refused('Broadlink selected bridge is unavailable.');
127
+ try {
128
+ const receipt = await this.client.sendAction(actionIdArg, signalArg);
129
+ return { success: true, data: receipt };
130
+ }
131
+ catch (error) {
132
+ if (error instanceof plugins.ecobridgeDeviceManager.BroadlinkProtocolError)
133
+ return {
134
+ success: false, error: 'Broadlink IR transmission failed.',
135
+ data: { code: error.code, outcome: error.effectOutcome, physicalEffectConfirmed: false },
136
+ };
137
+ return { success: false, error: 'Broadlink IR transmission failed.',
138
+ data: { outcome: 'indeterminate', physicalEffectConfirmed: false } };
139
+ }
86
140
  }
141
+ destroy() { return this.lease.close(); }
87
142
  }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRsaW5rLmNsYXNzZXMuaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9pbnRlZ3JhdGlvbnMvYnJvYWRsaW5rL2Jyb2FkbGluay5jbGFzc2VzLmludGVncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3hELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxlQUFpQztJQUN6RCxNQUFNLEdBQUcsV0FBVyxDQUFDO0lBQ3JCLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDMUIsTUFBTSxHQUFHLGlCQUEwQixDQUFDO0lBQ3BDLG1CQUFtQixHQUFHLGtDQUFrQyxFQUFFLENBQUM7SUFDM0QsVUFBVSxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUN2QyxRQUFRLEdBQUc7UUFDekIsTUFBTSxFQUFFLHFCQUFxQjtRQUM3QixZQUFZLEVBQUUsb0NBQW9DO1FBQ2xELGNBQWMsRUFBRSxXQUFXO1FBQzNCLGVBQWUsRUFBRSxRQUFRO1FBQ3pCLFFBQVEsRUFBRSxlQUFlO1FBQ3pCLFlBQVksRUFBRSxDQUFDLG1CQUFtQixDQUFDO1FBQ25DLFlBQVksRUFBRSxFQUFFO1FBQ2hCLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsVUFBVSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUM7UUFDdEUsYUFBYSxFQUFFLHNEQUFzRDtRQUNyRSxVQUFVLEVBQUUsSUFBSTtRQUNoQixTQUFT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
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRsaW5rLmNsYXNzZXMuaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9pbnRlZ3JhdGlvbnMvYnJvYWRsaW5rL2Jyb2FkbGluay5jbGFzc2VzLmludGVncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBMEIsTUFBTSw4Q0FBOEMsQ0FBQztBQUc5RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3BGLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBa0IsRUFBc0IsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVO0lBQzlGLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBT25FLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxlQUFpQztJQUN6RCxNQUFNLEdBQUcsV0FBVyxDQUFDO0lBQ3JCLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDMUIsTUFBTSxHQUFHLGlCQUEwQixDQUFDO0lBQ3BDLG1CQUFtQixHQUFHLGtDQUFrQyxFQUFFLENBQUM7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
@@ -1,8 +1,9 @@
1
1
  import * as plugins from '../../plugins.js';
2
2
  import type { IIntegrationEntity, IIntegrationEvent, IServiceCallRequest } from '../../core/types.js';
3
- import type { IBroadlinkCommand, IBroadlinkConfig, IBroadlinkDevice, IBroadlinkEvent, IBroadlinkSnapshot } from './broadlink.types.js';
3
+ import type { IBroadlinkCommand, IBroadlinkOfflineConfig, IBroadlinkDevice, IBroadlinkEvent, IBroadlinkSnapshot } from './broadlink.types.js';
4
+ /** Explicit offline mapping helpers; these do not validate or execute live controls. */
4
5
  export declare class BroadlinkMapper {
5
- static toSnapshot(configArg: IBroadlinkConfig, connectedArg?: boolean, eventsArg?: IBroadlinkEvent[]): IBroadlinkSnapshot;
6
+ static toSnapshot(configArg: IBroadlinkOfflineConfig, connectedArg?: boolean, eventsArg?: IBroadlinkEvent[]): IBroadlinkSnapshot;
6
7
  static toDevices(snapshotArg: IBroadlinkSnapshot): plugins.shxInterfaces.data.IDeviceDefinition[];
7
8
  static toEntities(snapshotArg: IBroadlinkSnapshot): IIntegrationEntity[];
8
9
  static toIntegrationEvent(eventArg: IBroadlinkEvent): IIntegrationEvent;