@smarthome.exchange/integrations 1.0.0 → 3.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 (529) hide show
  1. package/changelog.md +84 -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 +81 -0
  8. package/dist_ts/core/classes.nativeintegrationowner.js +273 -0
  9. package/dist_ts/core/classes.runtimemanager.d.ts +2 -0
  10. package/dist_ts/core/classes.runtimemanager.js +11 -3
  11. package/dist_ts/core/index.d.ts +2 -0
  12. package/dist_ts/core/index.js +3 -1
  13. package/dist_ts/core/types.d.ts +16 -0
  14. package/dist_ts/integrations/braviatv/braviatv.classes.client.d.ts +23 -72
  15. package/dist_ts/integrations/braviatv/braviatv.classes.client.js +265 -625
  16. package/dist_ts/integrations/braviatv/braviatv.classes.configflow.d.ts +7 -7
  17. package/dist_ts/integrations/braviatv/braviatv.classes.configflow.js +51 -68
  18. package/dist_ts/integrations/braviatv/braviatv.classes.integration.d.ts +8 -11
  19. package/dist_ts/integrations/braviatv/braviatv.classes.integration.js +186 -135
  20. package/dist_ts/integrations/braviatv/braviatv.discovery.js +12 -11
  21. package/dist_ts/integrations/braviatv/braviatv.mapper.d.ts +6 -14
  22. package/dist_ts/integrations/braviatv/braviatv.mapper.js +37 -131
  23. package/dist_ts/integrations/braviatv/braviatv.types.d.ts +55 -133
  24. package/dist_ts/integrations/braviatv/braviatv.validation.d.ts +7 -0
  25. package/dist_ts/integrations/braviatv/braviatv.validation.js +72 -0
  26. package/dist_ts/integrations/broadlink/broadlink.actions.d.ts +2 -0
  27. package/dist_ts/integrations/broadlink/broadlink.actions.js +36 -0
  28. package/dist_ts/integrations/broadlink/broadlink.classes.client.d.ts +21 -19
  29. package/dist_ts/integrations/broadlink/broadlink.classes.client.js +185 -124
  30. package/dist_ts/integrations/broadlink/broadlink.classes.configflow.d.ts +5 -4
  31. package/dist_ts/integrations/broadlink/broadlink.classes.configflow.js +64 -83
  32. package/dist_ts/integrations/broadlink/broadlink.classes.integration.d.ts +16 -19
  33. package/dist_ts/integrations/broadlink/broadlink.classes.integration.js +114 -59
  34. package/dist_ts/integrations/broadlink/broadlink.mapper.d.ts +3 -2
  35. package/dist_ts/integrations/broadlink/broadlink.mapper.js +2 -1
  36. package/dist_ts/integrations/broadlink/broadlink.selected.mapper.d.ts +10 -0
  37. package/dist_ts/integrations/broadlink/broadlink.selected.mapper.js +41 -0
  38. package/dist_ts/integrations/broadlink/broadlink.types.d.ts +43 -7
  39. package/dist_ts/integrations/broadlink/broadlink.validation.d.ts +7 -0
  40. package/dist_ts/integrations/broadlink/broadlink.validation.js +63 -0
  41. package/dist_ts/integrations/daikin/daikin.classes.client.d.ts +10 -52
  42. package/dist_ts/integrations/daikin/daikin.classes.client.js +55 -614
  43. package/dist_ts/integrations/daikin/daikin.classes.configflow.d.ts +8 -12
  44. package/dist_ts/integrations/daikin/daikin.classes.configflow.js +77 -138
  45. package/dist_ts/integrations/daikin/daikin.classes.integration.d.ts +7 -24
  46. package/dist_ts/integrations/daikin/daikin.classes.integration.js +175 -67
  47. package/dist_ts/integrations/daikin/daikin.discovery.d.ts +11 -24
  48. package/dist_ts/integrations/daikin/daikin.discovery.js +98 -305
  49. package/dist_ts/integrations/daikin/daikin.mapper.d.ts +6 -7
  50. package/dist_ts/integrations/daikin/daikin.mapper.js +95 -155
  51. package/dist_ts/integrations/daikin/daikin.types.d.ts +24 -44
  52. package/dist_ts/integrations/daikin/daikin.types.js +1 -1
  53. package/dist_ts/integrations/daikin/daikin.validation.d.ts +5 -0
  54. package/dist_ts/integrations/daikin/daikin.validation.js +53 -0
  55. package/dist_ts/integrations/deconz/deconz.classes.client.d.ts +37 -29
  56. package/dist_ts/integrations/deconz/deconz.classes.client.js +521 -294
  57. package/dist_ts/integrations/deconz/deconz.classes.configflow.d.ts +6 -1
  58. package/dist_ts/integrations/deconz/deconz.classes.configflow.js +63 -33
  59. package/dist_ts/integrations/deconz/deconz.classes.integration.d.ts +4 -3
  60. package/dist_ts/integrations/deconz/deconz.classes.integration.js +85 -40
  61. package/dist_ts/integrations/deconz/deconz.mapper.d.ts +1 -0
  62. package/dist_ts/integrations/deconz/deconz.mapper.js +24 -6
  63. package/dist_ts/integrations/deconz/deconz.types.d.ts +43 -6
  64. package/dist_ts/integrations/deconz/deconz.validation.d.ts +7 -1
  65. package/dist_ts/integrations/deconz/deconz.validation.js +215 -4
  66. package/dist_ts/integrations/denonavr/denonavr.classes.client.d.ts +31 -40
  67. package/dist_ts/integrations/denonavr/denonavr.classes.client.js +149 -404
  68. package/dist_ts/integrations/denonavr/denonavr.classes.configflow.d.ts +7 -2
  69. package/dist_ts/integrations/denonavr/denonavr.classes.configflow.js +44 -36
  70. package/dist_ts/integrations/denonavr/denonavr.classes.integration.d.ts +6 -11
  71. package/dist_ts/integrations/denonavr/denonavr.classes.integration.js +192 -113
  72. package/dist_ts/integrations/denonavr/denonavr.discovery.d.ts +10 -18
  73. package/dist_ts/integrations/denonavr/denonavr.discovery.js +71 -193
  74. package/dist_ts/integrations/denonavr/denonavr.mapper.d.ts +5 -13
  75. package/dist_ts/integrations/denonavr/denonavr.mapper.js +35 -159
  76. package/dist_ts/integrations/denonavr/denonavr.types.d.ts +55 -90
  77. package/dist_ts/integrations/denonavr/denonavr.validation.d.ts +10 -0
  78. package/dist_ts/integrations/denonavr/denonavr.validation.js +86 -0
  79. package/dist_ts/integrations/esphome/esphome.classes.client.d.ts +19 -7
  80. package/dist_ts/integrations/esphome/esphome.classes.client.js +183 -89
  81. package/dist_ts/integrations/esphome/esphome.classes.configflow.d.ts +5 -2
  82. package/dist_ts/integrations/esphome/esphome.classes.configflow.js +43 -33
  83. package/dist_ts/integrations/esphome/esphome.classes.integration.d.ts +8 -6
  84. package/dist_ts/integrations/esphome/esphome.classes.integration.js +71 -43
  85. package/dist_ts/integrations/esphome/esphome.discovery.js +4 -12
  86. package/dist_ts/integrations/esphome/esphome.mapper.d.ts +2 -2
  87. package/dist_ts/integrations/esphome/esphome.mapper.js +6 -4
  88. package/dist_ts/integrations/esphome/esphome.types.d.ts +31 -6
  89. package/dist_ts/integrations/esphome/esphome.types.js +1 -1
  90. package/dist_ts/integrations/esphome/esphome.validation.d.ts +7 -0
  91. package/dist_ts/integrations/esphome/esphome.validation.js +66 -0
  92. package/dist_ts/integrations/homeassistant/homeassistant.classes.client.d.ts +32 -4
  93. package/dist_ts/integrations/homeassistant/homeassistant.classes.client.js +345 -116
  94. package/dist_ts/integrations/homeassistant/homeassistant.classes.integration.d.ts +8 -5
  95. package/dist_ts/integrations/homeassistant/homeassistant.classes.integration.js +34 -8
  96. package/dist_ts/integrations/homeassistant/homeassistant.classes.runtime.d.ts +7 -4
  97. package/dist_ts/integrations/homeassistant/homeassistant.classes.runtime.js +44 -56
  98. package/dist_ts/integrations/homeassistant/homeassistant.types.d.ts +12 -1
  99. package/dist_ts/integrations/hue/hue.classes.client.d.ts +6 -1
  100. package/dist_ts/integrations/hue/hue.classes.client.js +120 -45
  101. package/dist_ts/integrations/hue/hue.classes.configflow.js +16 -7
  102. package/dist_ts/integrations/hue/hue.classes.integration.d.ts +2 -0
  103. package/dist_ts/integrations/hue/hue.classes.integration.js +103 -30
  104. package/dist_ts/integrations/hue/hue.validation.d.ts +1 -0
  105. package/dist_ts/integrations/hue/hue.validation.js +14 -4
  106. package/dist_ts/integrations/kodi/kodi.classes.client.d.ts +11 -45
  107. package/dist_ts/integrations/kodi/kodi.classes.client.js +84 -310
  108. package/dist_ts/integrations/kodi/kodi.classes.configflow.d.ts +9 -8
  109. package/dist_ts/integrations/kodi/kodi.classes.configflow.js +53 -48
  110. package/dist_ts/integrations/kodi/kodi.classes.integration.d.ts +11 -11
  111. package/dist_ts/integrations/kodi/kodi.classes.integration.js +114 -171
  112. package/dist_ts/integrations/kodi/kodi.discovery.js +53 -29
  113. package/dist_ts/integrations/kodi/kodi.mapper.d.ts +7 -2
  114. package/dist_ts/integrations/kodi/kodi.mapper.js +48 -10
  115. package/dist_ts/integrations/kodi/kodi.types.d.ts +32 -28
  116. package/dist_ts/integrations/kodi/kodi.validation.d.ts +9 -0
  117. package/dist_ts/integrations/kodi/kodi.validation.js +62 -0
  118. package/dist_ts/integrations/modbus/modbus.classes.client.d.ts +15 -61
  119. package/dist_ts/integrations/modbus/modbus.classes.client.js +117 -776
  120. package/dist_ts/integrations/modbus/modbus.classes.configflow.d.ts +9 -5
  121. package/dist_ts/integrations/modbus/modbus.classes.configflow.js +70 -38
  122. package/dist_ts/integrations/modbus/modbus.classes.integration.d.ts +6 -17
  123. package/dist_ts/integrations/modbus/modbus.classes.integration.js +133 -57
  124. package/dist_ts/integrations/modbus/modbus.discovery.d.ts +5 -8
  125. package/dist_ts/integrations/modbus/modbus.discovery.js +38 -93
  126. package/dist_ts/integrations/modbus/modbus.mapper.d.ts +8 -32
  127. package/dist_ts/integrations/modbus/modbus.mapper.js +71 -431
  128. package/dist_ts/integrations/modbus/modbus.types.d.ts +82 -332
  129. package/dist_ts/integrations/modbus/modbus.validation.d.ts +10 -0
  130. package/dist_ts/integrations/modbus/modbus.validation.js +128 -0
  131. package/dist_ts/integrations/mqtt/mqtt.classes.client.d.ts +15 -2
  132. package/dist_ts/integrations/mqtt/mqtt.classes.client.js +173 -23
  133. package/dist_ts/integrations/mqtt/mqtt.classes.configflow.d.ts +5 -1
  134. package/dist_ts/integrations/mqtt/mqtt.classes.configflow.js +53 -33
  135. package/dist_ts/integrations/mqtt/mqtt.classes.integration.d.ts +4 -1
  136. package/dist_ts/integrations/mqtt/mqtt.classes.integration.js +127 -56
  137. package/dist_ts/integrations/mqtt/mqtt.classes.session.d.ts +13 -0
  138. package/dist_ts/integrations/mqtt/mqtt.classes.session.js +130 -0
  139. package/dist_ts/integrations/mqtt/mqtt.mapper.d.ts +3 -0
  140. package/dist_ts/integrations/mqtt/mqtt.mapper.js +44 -1
  141. package/dist_ts/integrations/mqtt/mqtt.types.d.ts +46 -0
  142. package/dist_ts/integrations/mqtt/mqtt.validation.d.ts +7 -0
  143. package/dist_ts/integrations/mqtt/mqtt.validation.js +180 -0
  144. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.client.d.ts +12 -34
  145. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.client.js +143 -231
  146. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.configflow.d.ts +6 -1
  147. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.configflow.js +105 -18
  148. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.integration.d.ts +8 -8
  149. package/dist_ts/integrations/nanoleaf/nanoleaf.classes.integration.js +141 -155
  150. package/dist_ts/integrations/nanoleaf/nanoleaf.credentials.d.ts +9 -0
  151. package/dist_ts/integrations/nanoleaf/nanoleaf.credentials.js +35 -0
  152. package/dist_ts/integrations/nanoleaf/nanoleaf.mapper.d.ts +6 -18
  153. package/dist_ts/integrations/nanoleaf/nanoleaf.mapper.js +45 -220
  154. package/dist_ts/integrations/nanoleaf/nanoleaf.types.d.ts +33 -147
  155. package/dist_ts/integrations/nanoleaf/nanoleaf.validation.d.ts +6 -0
  156. package/dist_ts/integrations/nanoleaf/nanoleaf.validation.js +82 -0
  157. package/dist_ts/integrations/onkyo/onkyo.classes.client.d.ts +15 -20
  158. package/dist_ts/integrations/onkyo/onkyo.classes.client.js +161 -404
  159. package/dist_ts/integrations/onkyo/onkyo.classes.configflow.d.ts +9 -4
  160. package/dist_ts/integrations/onkyo/onkyo.classes.configflow.js +51 -6
  161. package/dist_ts/integrations/onkyo/onkyo.classes.integration.d.ts +22 -6
  162. package/dist_ts/integrations/onkyo/onkyo.classes.integration.js +144 -11
  163. package/dist_ts/integrations/onkyo/onkyo.discovery.d.ts +6 -1
  164. package/dist_ts/integrations/onkyo/onkyo.discovery.js +40 -4
  165. package/dist_ts/integrations/onkyo/onkyo.mapper.d.ts +7 -8
  166. package/dist_ts/integrations/onkyo/onkyo.mapper.js +45 -12
  167. package/dist_ts/integrations/onkyo/onkyo.types.d.ts +58 -8
  168. package/dist_ts/integrations/onkyo/onkyo.types.js +13 -102
  169. package/dist_ts/integrations/onkyo/onkyo.validation.d.ts +16 -0
  170. package/dist_ts/integrations/onkyo/onkyo.validation.js +77 -0
  171. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.client.d.ts +25 -25
  172. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.client.js +116 -360
  173. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.d.ts +11 -3
  174. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.js +76 -6
  175. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.integration.d.ts +26 -4
  176. package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.integration.js +142 -9
  177. package/dist_ts/integrations/panasonic_viera/panasonic_viera.discovery.d.ts +2 -1
  178. package/dist_ts/integrations/panasonic_viera/panasonic_viera.discovery.js +31 -4
  179. package/dist_ts/integrations/panasonic_viera/panasonic_viera.mapper.d.ts +9 -9
  180. package/dist_ts/integrations/panasonic_viera/panasonic_viera.mapper.js +31 -149
  181. package/dist_ts/integrations/panasonic_viera/panasonic_viera.types.d.ts +51 -11
  182. package/dist_ts/integrations/panasonic_viera/panasonic_viera.types.js +22 -87
  183. package/dist_ts/integrations/panasonic_viera/panasonic_viera.validation.d.ts +6 -0
  184. package/dist_ts/integrations/panasonic_viera/panasonic_viera.validation.js +56 -0
  185. package/dist_ts/integrations/pioneer/pioneer.classes.client.d.ts +31 -16
  186. package/dist_ts/integrations/pioneer/pioneer.classes.client.js +167 -409
  187. package/dist_ts/integrations/pioneer/pioneer.classes.configflow.d.ts +10 -3
  188. package/dist_ts/integrations/pioneer/pioneer.classes.configflow.js +66 -6
  189. package/dist_ts/integrations/pioneer/pioneer.classes.integration.d.ts +13 -5
  190. package/dist_ts/integrations/pioneer/pioneer.classes.integration.js +239 -11
  191. package/dist_ts/integrations/pioneer/pioneer.discovery.d.ts +14 -1
  192. package/dist_ts/integrations/pioneer/pioneer.discovery.js +51 -4
  193. package/dist_ts/integrations/pioneer/pioneer.mapper.d.ts +14 -8
  194. package/dist_ts/integrations/pioneer/pioneer.mapper.js +54 -12
  195. package/dist_ts/integrations/pioneer/pioneer.types.d.ts +79 -12
  196. package/dist_ts/integrations/pioneer/pioneer.types.js +12 -76
  197. package/dist_ts/integrations/pioneer/pioneer.validation.d.ts +10 -0
  198. package/dist_ts/integrations/pioneer/pioneer.validation.js +85 -0
  199. package/dist_ts/integrations/samsungtv/samsungtv.classes.client.d.ts +4 -2
  200. package/dist_ts/integrations/samsungtv/samsungtv.classes.client.js +41 -16
  201. package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.d.ts +5 -0
  202. package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.js +20 -7
  203. package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.d.ts +1 -0
  204. package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.js +53 -50
  205. package/dist_ts/integrations/samsungtv/samsungtv.types.d.ts +4 -1
  206. package/dist_ts/integrations/shelly/shelly.classes.client.d.ts +26 -30
  207. package/dist_ts/integrations/shelly/shelly.classes.client.js +504 -276
  208. package/dist_ts/integrations/shelly/shelly.classes.configflow.d.ts +8 -3
  209. package/dist_ts/integrations/shelly/shelly.classes.configflow.js +43 -38
  210. package/dist_ts/integrations/shelly/shelly.classes.integration.d.ts +6 -6
  211. package/dist_ts/integrations/shelly/shelly.classes.integration.js +103 -101
  212. package/dist_ts/integrations/shelly/shelly.classes.subscription.d.ts +4 -0
  213. package/dist_ts/integrations/shelly/shelly.classes.subscription.js +24 -2
  214. package/dist_ts/integrations/shelly/shelly.mapper.d.ts +1 -2
  215. package/dist_ts/integrations/shelly/shelly.mapper.js +21 -20
  216. package/dist_ts/integrations/shelly/shelly.rpc.js +4 -1
  217. package/dist_ts/integrations/shelly/shelly.types.d.ts +42 -2
  218. package/dist_ts/integrations/shelly/shelly.types.js +11 -2
  219. package/dist_ts/integrations/shelly/shelly.validation.d.ts +7 -0
  220. package/dist_ts/integrations/shelly/shelly.validation.js +79 -0
  221. package/dist_ts/integrations/sonos/sonos.classes.client.d.ts +79 -22
  222. package/dist_ts/integrations/sonos/sonos.classes.client.js +427 -139
  223. package/dist_ts/integrations/sonos/sonos.classes.configflow.d.ts +9 -2
  224. package/dist_ts/integrations/sonos/sonos.classes.configflow.js +26 -28
  225. package/dist_ts/integrations/sonos/sonos.classes.integration.d.ts +7 -6
  226. package/dist_ts/integrations/sonos/sonos.classes.integration.js +289 -224
  227. package/dist_ts/integrations/sonos/sonos.config.d.ts +6 -1
  228. package/dist_ts/integrations/sonos/sonos.config.js +23 -2
  229. package/dist_ts/integrations/sonos/sonos.mapper.d.ts +1 -1
  230. package/dist_ts/integrations/sonos/sonos.mapper.js +14 -9
  231. package/dist_ts/integrations/sonos/sonos.matchers.js +3 -3
  232. package/dist_ts/integrations/sonos/sonos.types.d.ts +26 -1
  233. package/dist_ts/integrations/soundtouch/soundtouch.classes.client.d.ts +13 -36
  234. package/dist_ts/integrations/soundtouch/soundtouch.classes.client.js +179 -502
  235. package/dist_ts/integrations/soundtouch/soundtouch.classes.configflow.d.ts +6 -1
  236. package/dist_ts/integrations/soundtouch/soundtouch.classes.configflow.js +50 -40
  237. package/dist_ts/integrations/soundtouch/soundtouch.classes.integration.d.ts +14 -15
  238. package/dist_ts/integrations/soundtouch/soundtouch.classes.integration.js +108 -128
  239. package/dist_ts/integrations/soundtouch/soundtouch.discovery.d.ts +2 -20
  240. package/dist_ts/integrations/soundtouch/soundtouch.discovery.js +23 -113
  241. package/dist_ts/integrations/soundtouch/soundtouch.mapper.d.ts +3 -12
  242. package/dist_ts/integrations/soundtouch/soundtouch.mapper.js +35 -189
  243. package/dist_ts/integrations/soundtouch/soundtouch.types.d.ts +57 -142
  244. package/dist_ts/integrations/soundtouch/soundtouch.types.js +18 -3
  245. package/dist_ts/integrations/soundtouch/soundtouch.validation.d.ts +22 -0
  246. package/dist_ts/integrations/soundtouch/soundtouch.validation.js +65 -0
  247. package/dist_ts/integrations/tasmota/tasmota.classes.integration.d.ts +5 -0
  248. package/dist_ts/integrations/tasmota/tasmota.classes.integration.js +23 -7
  249. package/dist_ts/integrations/tasmota/tasmota.classes.runtime.d.ts +19 -5
  250. package/dist_ts/integrations/tasmota/tasmota.classes.runtime.js +115 -41
  251. package/dist_ts/integrations/tasmota/tasmota.config.js +23 -1
  252. package/dist_ts/integrations/tasmota/tasmota.credentials.d.ts +11 -0
  253. package/dist_ts/integrations/tasmota/tasmota.credentials.js +97 -0
  254. package/dist_ts/integrations/tasmota/tasmota.discovery.d.ts +7 -1
  255. package/dist_ts/integrations/tasmota/tasmota.discovery.js +108 -30
  256. package/dist_ts/integrations/tasmota/tasmota.mapper.d.ts +2 -2
  257. package/dist_ts/integrations/tasmota/tasmota.mapper.js +7 -7
  258. package/dist_ts/integrations/tasmota/tasmota.types.d.ts +41 -2
  259. package/dist_ts/integrations/tuya/tuya.classes.integration.d.ts +4 -1
  260. package/dist_ts/integrations/tuya/tuya.classes.integration.js +79 -110
  261. package/dist_ts/integrations/tuya/tuya.classes.runtime.d.ts +5 -2
  262. package/dist_ts/integrations/tuya/tuya.classes.runtime.js +73 -26
  263. package/dist_ts/integrations/tuya/tuya.mapper.js +2 -2
  264. package/dist_ts/integrations/tuya/tuya.types.d.ts +3 -0
  265. package/dist_ts/integrations/tuya/tuya.validation.d.ts +2 -2
  266. package/dist_ts/integrations/tuya/tuya.validation.js +6 -11
  267. package/dist_ts/integrations/webostv/webostv.classes.client.d.ts +6 -5
  268. package/dist_ts/integrations/webostv/webostv.classes.client.js +147 -76
  269. package/dist_ts/integrations/webostv/webostv.classes.configflow.d.ts +7 -2
  270. package/dist_ts/integrations/webostv/webostv.classes.configflow.js +36 -20
  271. package/dist_ts/integrations/webostv/webostv.classes.integration.d.ts +4 -4
  272. package/dist_ts/integrations/webostv/webostv.classes.integration.js +46 -54
  273. package/dist_ts/integrations/webostv/webostv.mapper.js +5 -5
  274. package/dist_ts/integrations/webostv/webostv.types.d.ts +16 -3
  275. package/dist_ts/integrations/webostv/webostv.types.js +1 -1
  276. package/dist_ts/integrations/webostv/webostv.validation.d.ts +3 -1
  277. package/dist_ts/integrations/webostv/webostv.validation.js +23 -1
  278. package/dist_ts/integrations/wiz/index.d.ts +1 -0
  279. package/dist_ts/integrations/wiz/index.js +2 -1
  280. package/dist_ts/integrations/wiz/wiz.classes.client.d.ts +14 -28
  281. package/dist_ts/integrations/wiz/wiz.classes.client.js +93 -229
  282. package/dist_ts/integrations/wiz/wiz.classes.configflow.d.ts +6 -4
  283. package/dist_ts/integrations/wiz/wiz.classes.configflow.js +38 -67
  284. package/dist_ts/integrations/wiz/wiz.classes.integration.d.ts +10 -21
  285. package/dist_ts/integrations/wiz/wiz.classes.integration.js +204 -44
  286. package/dist_ts/integrations/wiz/wiz.discovery.d.ts +10 -31
  287. package/dist_ts/integrations/wiz/wiz.discovery.js +48 -249
  288. package/dist_ts/integrations/wiz/wiz.mapper.d.ts +7 -51
  289. package/dist_ts/integrations/wiz/wiz.mapper.js +82 -668
  290. package/dist_ts/integrations/wiz/wiz.types.d.ts +34 -208
  291. package/dist_ts/integrations/wiz/wiz.validation.d.ts +8 -0
  292. package/dist_ts/integrations/wiz/wiz.validation.js +72 -0
  293. package/dist_ts/integrations/yamaha/index.d.ts +1 -0
  294. package/dist_ts/integrations/yamaha/index.js +2 -1
  295. package/dist_ts/integrations/yamaha/yamaha.classes.client.d.ts +30 -4
  296. package/dist_ts/integrations/yamaha/yamaha.classes.client.js +162 -6
  297. package/dist_ts/integrations/yamaha/yamaha.classes.configflow.d.ts +10 -3
  298. package/dist_ts/integrations/yamaha/yamaha.classes.configflow.js +106 -6
  299. package/dist_ts/integrations/yamaha/yamaha.classes.integration.d.ts +22 -4
  300. package/dist_ts/integrations/yamaha/yamaha.classes.integration.js +243 -8
  301. package/dist_ts/integrations/yamaha/yamaha.discovery.d.ts +13 -1
  302. package/dist_ts/integrations/yamaha/yamaha.discovery.js +57 -4
  303. package/dist_ts/integrations/yamaha/yamaha.mapper.d.ts +16 -8
  304. package/dist_ts/integrations/yamaha/yamaha.mapper.js +58 -12
  305. package/dist_ts/integrations/yamaha/yamaha.types.d.ts +73 -6
  306. package/dist_ts/integrations/yamaha/yamaha.types.js +8 -94
  307. package/dist_ts/integrations/yamaha/yamaha.validation.d.ts +12 -0
  308. package/dist_ts/integrations/yamaha/yamaha.validation.js +89 -0
  309. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.d.ts +6 -1
  310. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.js +18 -8
  311. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.d.ts +4 -1
  312. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.js +54 -6
  313. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.d.ts +12 -6
  314. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.js +73 -59
  315. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.d.ts +3 -2
  316. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.js +17 -12
  317. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.types.d.ts +31 -2
  318. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.d.ts +9 -1
  319. package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.js +57 -7
  320. package/dist_ts/integrations/zwave_js/zwave_js.classes.client.d.ts +10 -4
  321. package/dist_ts/integrations/zwave_js/zwave_js.classes.client.js +167 -31
  322. package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.d.ts +6 -1
  323. package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.js +57 -35
  324. package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.d.ts +3 -1
  325. package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.js +59 -37
  326. package/dist_ts/integrations/zwave_js/zwave_js.discovery.js +3 -3
  327. package/dist_ts/integrations/zwave_js/zwave_js.mapper.js +41 -24
  328. package/dist_ts/integrations/zwave_js/zwave_js.types.d.ts +25 -3
  329. package/dist_ts/integrations/zwave_js/zwave_js.validation.d.ts +6 -2
  330. package/dist_ts/integrations/zwave_js/zwave_js.validation.js +52 -17
  331. package/dist_ts/plugins.d.ts +2 -1
  332. package/dist_ts/plugins.js +3 -2
  333. package/package.json +9 -9
  334. package/readme.md +539 -8
  335. package/ts/00_commitinfo_data.ts +1 -1
  336. package/ts/core/classes.configstore.ts +84 -27
  337. package/ts/core/classes.nativehomeadmission.ts +96 -0
  338. package/ts/core/classes.nativeintegrationowner.ts +302 -0
  339. package/ts/core/classes.runtimemanager.ts +11 -2
  340. package/ts/core/index.ts +2 -0
  341. package/ts/core/types.ts +18 -0
  342. package/ts/integrations/braviatv/braviatv.classes.client.ts +245 -709
  343. package/ts/integrations/braviatv/braviatv.classes.configflow.ts +47 -76
  344. package/ts/integrations/braviatv/braviatv.classes.integration.ts +167 -147
  345. package/ts/integrations/braviatv/braviatv.discovery.ts +11 -10
  346. package/ts/integrations/braviatv/braviatv.mapper.ts +39 -142
  347. package/ts/integrations/braviatv/braviatv.types.ts +53 -173
  348. package/ts/integrations/braviatv/braviatv.validation.ts +68 -0
  349. package/ts/integrations/broadlink/broadlink.actions.ts +31 -0
  350. package/ts/integrations/broadlink/broadlink.classes.client.ts +170 -144
  351. package/ts/integrations/broadlink/broadlink.classes.configflow.ts +59 -89
  352. package/ts/integrations/broadlink/broadlink.classes.integration.ts +110 -64
  353. package/ts/integrations/broadlink/broadlink.mapper.ts +5 -4
  354. package/ts/integrations/broadlink/broadlink.selected.mapper.ts +46 -0
  355. package/ts/integrations/broadlink/broadlink.types.ts +48 -8
  356. package/ts/integrations/broadlink/broadlink.validation.ts +66 -0
  357. package/ts/integrations/daikin/daikin.classes.client.ts +52 -661
  358. package/ts/integrations/daikin/daikin.classes.configflow.ts +72 -152
  359. package/ts/integrations/daikin/daikin.classes.integration.ts +166 -71
  360. package/ts/integrations/daikin/daikin.discovery.ts +94 -346
  361. package/ts/integrations/daikin/daikin.mapper.ts +83 -166
  362. package/ts/integrations/daikin/daikin.types.ts +27 -48
  363. package/ts/integrations/daikin/daikin.validation.ts +51 -0
  364. package/ts/integrations/daikin/readme.md +83 -0
  365. package/ts/integrations/deconz/deconz.classes.client.ts +348 -252
  366. package/ts/integrations/deconz/deconz.classes.configflow.ts +57 -29
  367. package/ts/integrations/deconz/deconz.classes.integration.ts +69 -37
  368. package/ts/integrations/deconz/deconz.mapper.ts +22 -5
  369. package/ts/integrations/deconz/deconz.types.ts +49 -6
  370. package/ts/integrations/deconz/deconz.validation.ts +177 -4
  371. package/ts/integrations/deconz/readme.md +15 -1
  372. package/ts/integrations/denonavr/denonavr.classes.client.ts +132 -421
  373. package/ts/integrations/denonavr/denonavr.classes.configflow.ts +44 -37
  374. package/ts/integrations/denonavr/denonavr.classes.integration.ts +171 -117
  375. package/ts/integrations/denonavr/denonavr.discovery.ts +67 -220
  376. package/ts/integrations/denonavr/denonavr.mapper.ts +36 -182
  377. package/ts/integrations/denonavr/denonavr.types.ts +48 -111
  378. package/ts/integrations/denonavr/denonavr.validation.ts +87 -0
  379. package/ts/integrations/esphome/esphome.classes.client.ts +179 -94
  380. package/ts/integrations/esphome/esphome.classes.configflow.ts +40 -33
  381. package/ts/integrations/esphome/esphome.classes.integration.ts +63 -36
  382. package/ts/integrations/esphome/esphome.discovery.ts +3 -12
  383. package/ts/integrations/esphome/esphome.mapper.ts +9 -7
  384. package/ts/integrations/esphome/esphome.types.ts +35 -6
  385. package/ts/integrations/esphome/esphome.validation.ts +66 -0
  386. package/ts/integrations/esphome/readme.md +20 -6
  387. package/ts/integrations/homeassistant/homeassistant.classes.client.ts +353 -125
  388. package/ts/integrations/homeassistant/homeassistant.classes.integration.ts +35 -18
  389. package/ts/integrations/homeassistant/homeassistant.classes.runtime.ts +50 -63
  390. package/ts/integrations/homeassistant/homeassistant.types.ts +17 -1
  391. package/ts/integrations/homeassistant/readme.md +22 -6
  392. package/ts/integrations/hue/hue.classes.client.ts +110 -41
  393. package/ts/integrations/hue/hue.classes.configflow.ts +12 -6
  394. package/ts/integrations/hue/hue.classes.integration.ts +92 -26
  395. package/ts/integrations/hue/hue.validation.ts +13 -3
  396. package/ts/integrations/hue/readme.md +3 -3
  397. package/ts/integrations/kodi/kodi.classes.client.ts +72 -352
  398. package/ts/integrations/kodi/kodi.classes.configflow.ts +52 -55
  399. package/ts/integrations/kodi/kodi.classes.integration.ts +97 -178
  400. package/ts/integrations/kodi/kodi.discovery.ts +49 -28
  401. package/ts/integrations/kodi/kodi.mapper.ts +52 -10
  402. package/ts/integrations/kodi/kodi.types.ts +33 -58
  403. package/ts/integrations/kodi/kodi.validation.ts +60 -0
  404. package/ts/integrations/modbus/modbus.classes.client.ts +100 -842
  405. package/ts/integrations/modbus/modbus.classes.configflow.ts +70 -41
  406. package/ts/integrations/modbus/modbus.classes.integration.ts +115 -60
  407. package/ts/integrations/modbus/modbus.discovery.ts +38 -106
  408. package/ts/integrations/modbus/modbus.mapper.ts +64 -467
  409. package/ts/integrations/modbus/modbus.types.ts +64 -381
  410. package/ts/integrations/modbus/modbus.validation.ts +119 -0
  411. package/ts/integrations/mqtt/mqtt.classes.client.ts +136 -19
  412. package/ts/integrations/mqtt/mqtt.classes.configflow.ts +45 -32
  413. package/ts/integrations/mqtt/mqtt.classes.integration.ts +99 -38
  414. package/ts/integrations/mqtt/mqtt.classes.session.ts +118 -0
  415. package/ts/integrations/mqtt/mqtt.mapper.ts +43 -1
  416. package/ts/integrations/mqtt/mqtt.types.ts +52 -0
  417. package/ts/integrations/mqtt/mqtt.validation.ts +157 -0
  418. package/ts/integrations/mqtt/readme.md +12 -3
  419. package/ts/integrations/nanoleaf/nanoleaf.classes.client.ts +115 -249
  420. package/ts/integrations/nanoleaf/nanoleaf.classes.configflow.ts +90 -19
  421. package/ts/integrations/nanoleaf/nanoleaf.classes.integration.ts +130 -181
  422. package/ts/integrations/nanoleaf/nanoleaf.credentials.ts +39 -0
  423. package/ts/integrations/nanoleaf/nanoleaf.mapper.ts +47 -260
  424. package/ts/integrations/nanoleaf/nanoleaf.types.ts +29 -147
  425. package/ts/integrations/nanoleaf/nanoleaf.validation.ts +77 -0
  426. package/ts/integrations/onkyo/onkyo.classes.client.ts +148 -457
  427. package/ts/integrations/onkyo/onkyo.classes.configflow.ts +52 -6
  428. package/ts/integrations/onkyo/onkyo.classes.integration.ts +121 -12
  429. package/ts/integrations/onkyo/onkyo.discovery.ts +41 -3
  430. package/ts/integrations/onkyo/onkyo.mapper.ts +46 -19
  431. package/ts/integrations/onkyo/onkyo.types.ts +55 -110
  432. package/ts/integrations/onkyo/onkyo.validation.ts +85 -0
  433. package/ts/integrations/onkyo/readme.md +126 -0
  434. package/ts/integrations/panasonic_viera/panasonic_viera.classes.client.ts +101 -398
  435. package/ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.ts +69 -5
  436. package/ts/integrations/panasonic_viera/panasonic_viera.classes.integration.ts +141 -9
  437. package/ts/integrations/panasonic_viera/panasonic_viera.discovery.ts +32 -3
  438. package/ts/integrations/panasonic_viera/panasonic_viera.mapper.ts +34 -161
  439. package/ts/integrations/panasonic_viera/panasonic_viera.types.ts +52 -96
  440. package/ts/integrations/panasonic_viera/panasonic_viera.validation.ts +56 -0
  441. package/ts/integrations/pioneer/pioneer.classes.client.ts +132 -428
  442. package/ts/integrations/pioneer/pioneer.classes.configflow.ts +67 -5
  443. package/ts/integrations/pioneer/pioneer.classes.integration.ts +225 -11
  444. package/ts/integrations/pioneer/pioneer.discovery.ts +45 -3
  445. package/ts/integrations/pioneer/pioneer.mapper.ts +57 -13
  446. package/ts/integrations/pioneer/pioneer.types.ts +87 -85
  447. package/ts/integrations/pioneer/pioneer.validation.ts +84 -0
  448. package/ts/integrations/samsungtv/readme.md +11 -5
  449. package/ts/integrations/samsungtv/samsungtv.classes.client.ts +40 -15
  450. package/ts/integrations/samsungtv/samsungtv.classes.configflow.ts +21 -6
  451. package/ts/integrations/samsungtv/samsungtv.classes.integration.ts +53 -38
  452. package/ts/integrations/samsungtv/samsungtv.types.ts +4 -1
  453. package/ts/integrations/shelly/readme.md +22 -7
  454. package/ts/integrations/shelly/shelly.classes.client.ts +386 -269
  455. package/ts/integrations/shelly/shelly.classes.configflow.ts +43 -38
  456. package/ts/integrations/shelly/shelly.classes.integration.ts +92 -111
  457. package/ts/integrations/shelly/shelly.classes.subscription.ts +24 -1
  458. package/ts/integrations/shelly/shelly.mapper.ts +19 -20
  459. package/ts/integrations/shelly/shelly.rpc.ts +2 -0
  460. package/ts/integrations/shelly/shelly.types.ts +50 -2
  461. package/ts/integrations/shelly/shelly.validation.ts +76 -0
  462. package/ts/integrations/sonos/readme.md +117 -38
  463. package/ts/integrations/sonos/sonos.classes.client.ts +392 -123
  464. package/ts/integrations/sonos/sonos.classes.configflow.ts +25 -28
  465. package/ts/integrations/sonos/sonos.classes.integration.ts +211 -186
  466. package/ts/integrations/sonos/sonos.config.ts +24 -2
  467. package/ts/integrations/sonos/sonos.mapper.ts +13 -8
  468. package/ts/integrations/sonos/sonos.matchers.ts +2 -2
  469. package/ts/integrations/sonos/sonos.types.ts +30 -1
  470. package/ts/integrations/soundtouch/soundtouch.classes.client.ts +152 -571
  471. package/ts/integrations/soundtouch/soundtouch.classes.configflow.ts +47 -42
  472. package/ts/integrations/soundtouch/soundtouch.classes.integration.ts +95 -150
  473. package/ts/integrations/soundtouch/soundtouch.discovery.ts +21 -133
  474. package/ts/integrations/soundtouch/soundtouch.mapper.ts +36 -207
  475. package/ts/integrations/soundtouch/soundtouch.types.ts +50 -195
  476. package/ts/integrations/soundtouch/soundtouch.validation.ts +60 -0
  477. package/ts/integrations/tasmota/readme.md +16 -5
  478. package/ts/integrations/tasmota/tasmota.classes.integration.ts +24 -6
  479. package/ts/integrations/tasmota/tasmota.classes.runtime.ts +112 -43
  480. package/ts/integrations/tasmota/tasmota.config.ts +17 -0
  481. package/ts/integrations/tasmota/tasmota.credentials.ts +92 -0
  482. package/ts/integrations/tasmota/tasmota.discovery.ts +87 -24
  483. package/ts/integrations/tasmota/tasmota.mapper.ts +6 -6
  484. package/ts/integrations/tasmota/tasmota.types.ts +43 -2
  485. package/ts/integrations/tuya/readme.md +52 -10
  486. package/ts/integrations/tuya/tuya.classes.integration.ts +69 -98
  487. package/ts/integrations/tuya/tuya.classes.runtime.ts +70 -24
  488. package/ts/integrations/tuya/tuya.mapper.ts +1 -1
  489. package/ts/integrations/tuya/tuya.types.ts +4 -0
  490. package/ts/integrations/tuya/tuya.validation.ts +5 -8
  491. package/ts/integrations/webostv/readme.md +115 -22
  492. package/ts/integrations/webostv/webostv.classes.client.ts +123 -50
  493. package/ts/integrations/webostv/webostv.classes.configflow.ts +35 -15
  494. package/ts/integrations/webostv/webostv.classes.integration.ts +44 -37
  495. package/ts/integrations/webostv/webostv.mapper.ts +4 -4
  496. package/ts/integrations/webostv/webostv.types.ts +18 -3
  497. package/ts/integrations/webostv/webostv.validation.ts +22 -1
  498. package/ts/integrations/wiz/index.ts +1 -0
  499. package/ts/integrations/wiz/wiz.classes.client.ts +84 -254
  500. package/ts/integrations/wiz/wiz.classes.configflow.ts +39 -70
  501. package/ts/integrations/wiz/wiz.classes.integration.ts +189 -45
  502. package/ts/integrations/wiz/wiz.discovery.ts +48 -291
  503. package/ts/integrations/wiz/wiz.mapper.ts +81 -754
  504. package/ts/integrations/wiz/wiz.types.ts +24 -224
  505. package/ts/integrations/wiz/wiz.validation.ts +73 -0
  506. package/ts/integrations/yamaha/index.ts +1 -0
  507. package/ts/integrations/yamaha/yamaha.classes.client.ts +150 -6
  508. package/ts/integrations/yamaha/yamaha.classes.configflow.ts +100 -5
  509. package/ts/integrations/yamaha/yamaha.classes.integration.ts +236 -8
  510. package/ts/integrations/yamaha/yamaha.discovery.ts +52 -3
  511. package/ts/integrations/yamaha/yamaha.mapper.ts +65 -13
  512. package/ts/integrations/yamaha/yamaha.types.ts +77 -97
  513. package/ts/integrations/yamaha/yamaha.validation.ts +86 -0
  514. package/ts/integrations/zigbee2mqtt/readme.md +22 -27
  515. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.ts +16 -7
  516. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.ts +53 -6
  517. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.ts +62 -49
  518. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.ts +17 -11
  519. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.types.ts +35 -2
  520. package/ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.ts +53 -7
  521. package/ts/integrations/zwave_js/readme.md +42 -9
  522. package/ts/integrations/zwave_js/zwave_js.classes.client.ts +155 -31
  523. package/ts/integrations/zwave_js/zwave_js.classes.configflow.ts +55 -31
  524. package/ts/integrations/zwave_js/zwave_js.classes.integration.ts +57 -35
  525. package/ts/integrations/zwave_js/zwave_js.discovery.ts +2 -2
  526. package/ts/integrations/zwave_js/zwave_js.mapper.ts +37 -23
  527. package/ts/integrations/zwave_js/zwave_js.types.ts +26 -3
  528. package/ts/integrations/zwave_js/zwave_js.validation.ts +52 -18
  529. package/ts/plugins.ts +2 -1
@@ -1,17 +1,245 @@
1
- import { SimpleLocalIntegration } from '../../core/index.js';
1
+ import * as plugins from '../../plugins.js';
2
+ import { BaseIntegration } from '../../core/classes.baseintegration.js';
3
+ import { NativeIntegrationOwner, type INativeSetupLease } from '../../core/classes.nativeintegrationowner.js';
4
+ import type { IDeviceFeatureWriteRequest, IIntegrationEntity, IIntegrationEvent, IIntegrationRuntime, INativeIntegrationSetupContext, IServiceCallRequest, IServiceCallResult } from '../../core/types.js';
5
+ import { YamahaClient } from './yamaha.classes.client.js';
2
6
  import { YamahaConfigFlow } from './yamaha.classes.configflow.js';
3
7
  import { createYamahaDiscoveryDescriptor } from './yamaha.discovery.js';
4
- import type { IYamahaConfig } from './yamaha.types.js';
5
- import { yamahaDomain, yamahaProfile } from './yamaha.types.js';
8
+ import { YamahaMapper } from './yamaha.mapper.js';
9
+ import { normalizeYamahaConfig, yamahaRecord, yamahaText, validateYamahaControl } from './yamaha.validation.js';
10
+ import type { IYamahaConfig, IYamahaEffectResult, IYamahaSnapshot, TYamahaControl } from './yamaha.types.js';
6
11
 
7
- export class YamahaIntegration extends SimpleLocalIntegration<IYamahaConfig> {
8
- public readonly domain = yamahaDomain;
12
+ export interface IYamahaIntegrationOptions { readonly homeId?: string; }
13
+
14
+ export class YamahaIntegration extends BaseIntegration<IYamahaConfig> {
15
+ public readonly domain = 'yamaha';
16
+ public readonly displayName = 'Yamaha RX-V485 main zone';
17
+ public readonly status = 'control-runtime' as const;
9
18
  public readonly discoveryDescriptor = createYamahaDiscoveryDescriptor();
10
- public readonly configFlow = new YamahaConfigFlow();
19
+ public readonly configFlow: YamahaConfigFlow;
20
+ public readonly metadata = { source: 'native-typescript', integrationType: 'device', iotClass: 'local_poll', selectedModel: 'RX-V485', zone: 'main' };
21
+ private readonly owner: NativeIntegrationOwner;
22
+ private closePromise?: Promise<void>;
23
+
24
+ public constructor(options: IYamahaIntegrationOptions = {}) {
25
+ super();
26
+ const values = yamahaRecord(options, ['homeId']);
27
+ this.owner = new NativeIntegrationOwner(this.domain, values.homeId === undefined ? {} : { homeId: yamahaText(values.homeId, 'constructor home ID') });
28
+ this.configFlow = new YamahaConfigFlow(this.owner.createFlowScope());
29
+ }
30
+
31
+ public setup(config: IYamahaConfig, context: INativeIntegrationSetupContext): Promise<IIntegrationRuntime> {
32
+ try {
33
+ const normalized = normalizeYamahaConfig(config);
34
+ return this.owner.runSetup(context, normalized.homeId, async (lease) => {
35
+ const client = new YamahaClient(normalized, lease.context);
36
+ let runtime: YamahaRuntime | undefined;
37
+ let cleanupStarted = false;
38
+ lease.own(() => {
39
+ const retry = cleanupStarted;
40
+ cleanupStarted = true;
41
+ return runtime ? runtime.closeOwnedResources(retry) : retry ? client.retryCleanup() : client.destroy();
42
+ });
43
+ const initial = await client.start(lease.signal);
44
+ lease.assertOpen();
45
+ runtime = new YamahaRuntime(client, initial, lease);
46
+ lease.promoteToRuntime();
47
+ return runtime;
48
+ });
49
+ } catch (error) { return Promise.reject(error); }
50
+ }
11
51
 
12
- constructor() {
13
- super(yamahaProfile);
52
+ public destroy(): Promise<void> {
53
+ if (!this.closePromise) {
54
+ let closing: Promise<void>[] = [];
55
+ this.closePromise = Promise.resolve().then(async () => {
56
+ const results = await Promise.allSettled(closing);
57
+ const failures = results.filter((entry): entry is PromiseRejectedResult => entry.status === 'rejected');
58
+ if (failures.length) throw new AggregateError(failures.map((entry) => entry.reason), 'Yamaha owned cleanup failed.');
59
+ });
60
+ closing = [this.configFlow.destroy(), this.owner.close()];
61
+ }
62
+ return this.closePromise;
14
63
  }
64
+ public retryCleanup(): Promise<void> { return this.owner.retryCleanup(); }
15
65
  }
16
66
 
17
67
  export class HomeAssistantYamahaIntegration extends YamahaIntegration {}
68
+
69
+ interface IYamahaSubscription {
70
+ handler: (event: IIntegrationEvent) => void;
71
+ active: boolean;
72
+ failed: boolean;
73
+ failure?: unknown;
74
+ callbacks: Set<Promise<void>>;
75
+ stopPromise?: Promise<void>;
76
+ detach(): void;
77
+ stop(): Promise<void>;
78
+ }
79
+
80
+ class YamahaRuntime implements IIntegrationRuntime {
81
+ public readonly domain = 'yamaha';
82
+ private readonly subscriptions = new Set<IYamahaSubscription>();
83
+ private closePromise?: Promise<void>;
84
+ private closed = false;
85
+
86
+ public constructor(private readonly client: YamahaClient, private snapshot: IYamahaSnapshot,
87
+ private readonly lease: INativeSetupLease) {}
88
+
89
+ public isHealthy(): boolean { return !this.closed && !this.lease.signal.aborted && this.client.isHealthy(); }
90
+
91
+ public async devices(signal?: AbortSignal): Promise<plugins.shxInterfaces.data.IDeviceDefinition[]> {
92
+ this.assertOpen();
93
+ const snapshot = await this.client.getSnapshot(signal);
94
+ this.publish(snapshot);
95
+ return YamahaMapper.toDevices(snapshot);
96
+ }
97
+
98
+ public async entities(): Promise<IIntegrationEntity[]> {
99
+ this.assertOpen();
100
+ const snapshot = await this.client.getSnapshot();
101
+ this.publish(snapshot);
102
+ return YamahaMapper.toEntities(snapshot);
103
+ }
104
+
105
+ public async writeFeature(input: IDeviceFeatureWriteRequest, signal?: AbortSignal): Promise<IServiceCallResult> {
106
+ this.assertOpen();
107
+ const request = yamahaRecord(input, ['device', 'feature', 'value']);
108
+ const device = yamahaRecord(request.device);
109
+ const feature = yamahaRecord(request.feature);
110
+ const canonical = YamahaMapper.toDevices(this.snapshot)[0];
111
+ if (device.id !== canonical.id || device.integrationDomain !== this.domain) throw new Error('Yamaha feature target is outside the selected home and receiver.');
112
+ const admitted = canonical.features.find((entry) => entry.id === feature.id);
113
+ if (!admitted?.writable || feature.capability !== admitted.capability) throw new Error('Yamaha feature is not writable for the selected receiver.');
114
+ return this.control(validateYamahaControl({ feature: admitted.id, value: request.value }), signal);
115
+ }
116
+
117
+ public async callService(input: IServiceCallRequest): Promise<IServiceCallResult> {
118
+ this.assertOpen();
119
+ const request = yamahaRecord(input, ['domain', 'service', 'target', 'data']);
120
+ const target = yamahaRecord(request.target, ['deviceId', 'entityId']);
121
+ const deviceId = YamahaMapper.deviceId(this.snapshot.homeId, this.snapshot.identity.deviceId);
122
+ const entityId = YamahaMapper.entityId(this.snapshot.homeId, this.snapshot.identity.deviceId);
123
+ if ((!target.deviceId && !target.entityId) || (target.deviceId !== undefined && target.deviceId !== deviceId) ||
124
+ (target.entityId !== undefined && target.entityId !== entityId)) throw new Error('Yamaha service target is outside the selected home and receiver.');
125
+ if (request.domain !== 'media_player') throw new Error('Yamaha services use media_player.');
126
+ let control: TYamahaControl;
127
+ if (request.service === 'turn_on' || request.service === 'turn_off') {
128
+ yamahaRecord(request.data ?? {}, []);
129
+ control = { feature: 'power', value: request.service === 'turn_on' };
130
+ } else if (request.service === 'volume_set') {
131
+ const data = yamahaRecord(request.data, ['volume_raw']);
132
+ control = validateYamahaControl({ feature: 'volume_raw', value: data.volume_raw });
133
+ } else if (request.service === 'volume_mute') {
134
+ const data = yamahaRecord(request.data, ['is_volume_muted']);
135
+ control = validateYamahaControl({ feature: 'muted', value: data.is_volume_muted });
136
+ } else if (request.service === 'select_source') {
137
+ const data = yamahaRecord(request.data, ['source']);
138
+ control = validateYamahaControl({ feature: 'input', value: data.source });
139
+ } else throw new Error('Yamaha supports explicit power, mute, absolute raw volume and freshly advertised inputs only.');
140
+ return this.control(control);
141
+ }
142
+
143
+ /** Observe calls publish completed snapshots; subscriptions never create a hidden polling loop. */
144
+ public async subscribe(handler: (event: IIntegrationEvent) => void, signal?: AbortSignal): Promise<() => Promise<void>> {
145
+ this.assertOpen();
146
+ if (typeof handler !== 'function' || (signal !== undefined && !(signal instanceof AbortSignal))) throw new TypeError('Yamaha subscription requires a callback and optional AbortSignal.');
147
+ signal?.throwIfAborted();
148
+ if (this.subscriptions.size >= 32) throw new Error('Yamaha subscription capacity reached.');
149
+ const subscription: IYamahaSubscription = {
150
+ handler, active: true, failed: false, callbacks: new Set(),
151
+ detach: () => { subscription.active = false; signal?.removeEventListener('abort', aborted); },
152
+ stop: () => {
153
+ if (!subscription.stopPromise) {
154
+ subscription.stopPromise = Promise.resolve().then(async () => {
155
+ const results = await Promise.allSettled([...subscription.callbacks]);
156
+ this.subscriptions.delete(subscription);
157
+ const failures = results.filter((entry): entry is PromiseRejectedResult => entry.status === 'rejected').map((entry) => entry.reason as unknown);
158
+ if (subscription.failed) failures.push(subscription.failure);
159
+ const errors = [...new Set(failures)];
160
+ if (errors.length === 1) throw errors[0];
161
+ if (errors.length) throw new AggregateError(errors, 'Yamaha subscriber cleanup failed.');
162
+ });
163
+ subscription.detach();
164
+ }
165
+ return subscription.stopPromise;
166
+ },
167
+ };
168
+ const aborted = () => {
169
+ subscription.detach();
170
+ if (!subscription.callbacks.size && !subscription.failed) this.subscriptions.delete(subscription);
171
+ };
172
+ signal?.addEventListener('abort', aborted, { once: true });
173
+ this.subscriptions.add(subscription);
174
+ if (signal?.aborted) aborted();
175
+ return subscription.stop;
176
+ }
177
+
178
+ public destroy(): Promise<void> { return this.lease.close(); }
179
+
180
+ /** Called only by the retained lease, including its explicit cleanup retry. */
181
+ public closeOwnedResources(retry = false): Promise<void> {
182
+ if (retry) return this.drainOwnedResources(true);
183
+ if (!this.closePromise) {
184
+ this.closed = true;
185
+ this.closePromise = Promise.resolve().then(() => this.drainOwnedResources(false));
186
+ for (const subscription of this.subscriptions) subscription.detach();
187
+ }
188
+ return this.closePromise;
189
+ }
190
+
191
+ private async drainOwnedResources(retry: boolean): Promise<void> {
192
+ const results = await Promise.allSettled([
193
+ Promise.resolve().then(() => retry ? this.client.retryCleanup() : this.client.destroy()),
194
+ ...[...this.subscriptions].map((entry) => Promise.resolve().then(() => entry.stop())),
195
+ ]);
196
+ const failures = results.filter((entry): entry is PromiseRejectedResult => entry.status === 'rejected');
197
+ if (failures.length) throw new AggregateError(failures.map((entry) => entry.reason), 'Yamaha owned cleanup or subscriber failed.');
198
+ }
199
+
200
+ private async control(control: TYamahaControl, signal?: AbortSignal): Promise<IServiceCallResult> {
201
+ try {
202
+ const result = await this.client.setControl(control, signal);
203
+ this.publish(result.snapshot);
204
+ return this.result(result);
205
+ } catch (error) {
206
+ return { success: false, error: error instanceof Error ? error.message : 'Yamaha control failed.',
207
+ data: { effectOutcome: error instanceof plugins.ecobridgeDeviceManager.YamahaProtocolError ? error.effectOutcome : 'not-sent' } };
208
+ }
209
+ }
210
+
211
+ private result(result: IYamahaEffectResult): IServiceCallResult {
212
+ return { success: result.outcome === 'observed-target', ...(result.outcome === 'indeterminate' ? { error: 'Requested receiver setting was not observed.' } : {}),
213
+ data: { dispatch: result.dispatch, outcome: result.outcome, devices: YamahaMapper.toDevices(result.snapshot), entities: YamahaMapper.toEntities(result.snapshot) } };
214
+ }
215
+
216
+ private publish(snapshot: IYamahaSnapshot): void {
217
+ if (this.closed) return;
218
+ this.snapshot = snapshot;
219
+ for (const subscription of [...this.subscriptions]) {
220
+ if (this.closed) break;
221
+ if (!subscription.active) continue;
222
+ if (subscription.callbacks.size) {
223
+ subscription.failed = true;
224
+ subscription.failure = new Error('Yamaha subscriber must drain its previous observation before another notification.');
225
+ subscription.detach();
226
+ continue;
227
+ }
228
+ const event: IIntegrationEvent = { type: 'state_changed', integrationDomain: this.domain,
229
+ deviceId: YamahaMapper.deviceId(snapshot.homeId, snapshot.identity.deviceId), entityId: YamahaMapper.entityId(snapshot.homeId, snapshot.identity.deviceId),
230
+ data: structuredClone(snapshot), timestamp: Date.now() };
231
+ // Register the actual callback promise before user code can synchronously close the runtime.
232
+ const pending = Promise.resolve().then(() => subscription.handler(event)).then(() => {}, (error: unknown) => {
233
+ subscription.failed = true; subscription.failure = error; subscription.detach(); throw error;
234
+ });
235
+ subscription.callbacks.add(pending);
236
+ const settled = (): void => {
237
+ subscription.callbacks.delete(pending);
238
+ if (!subscription.active && !subscription.failed) this.subscriptions.delete(subscription);
239
+ };
240
+ void pending.then(settled, settled);
241
+ }
242
+ }
243
+
244
+ private assertOpen(): void { if (this.closed) throw new Error('Yamaha runtime is closed.'); this.lease.assertOpen(); }
245
+ }
@@ -1,4 +1,53 @@
1
- import { createSimpleLocalDiscoveryDescriptor } from '../../core/index.js';
2
- import { yamahaProfile } from './yamaha.types.js';
1
+ import { DiscoveryDescriptor } from '../../core/classes.discoverydescriptor.js';
2
+ import type { IDiscoveryCandidate, IDiscoveryMatch, IDiscoveryMatcher, IDiscoveryValidator } from '../../core/types.js';
3
+ import type { IYamahaManualEntry } from './yamaha.types.js';
4
+ import { yamahaDeviceId, yamahaModel, yamahaOrigin, yamahaRecord, yamahaText } from './yamaha.validation.js';
3
5
 
4
- export const createYamahaDiscoveryDescriptor = () => createSimpleLocalDiscoveryDescriptor(yamahaProfile);
6
+ const miss = (reason: string): IDiscoveryMatch => ({ matched: false, confidence: 'low', reason });
7
+
8
+ function hint(origin: unknown, deviceId: unknown, model: unknown, name: unknown): IDiscoveryMatch {
9
+ const selectedOrigin = yamahaOrigin(origin);
10
+ const identity = yamahaDeviceId(deviceId);
11
+ const selectedModel = yamahaModel(model);
12
+ const selectedName = name === undefined ? undefined : yamahaText(name, 'display name', 128);
13
+ const url = new URL(selectedOrigin);
14
+ return { matched: true, confidence: 'medium', normalizedDeviceId: identity,
15
+ reason: 'Selected RX-V485 setup hint; live identity, features and main-zone status must still be verified.',
16
+ candidate: { source: 'manual', integrationDomain: 'yamaha', id: identity, host: url.hostname,
17
+ port: Number(url.port || 80), manufacturer: 'Yamaha', model: selectedModel, name: selectedName,
18
+ metadata: { origin: selectedOrigin, identityEvidence: 'unauthenticated-manual-hint' } } };
19
+ }
20
+
21
+ export class YamahaManualMatcher implements IDiscoveryMatcher<IYamahaManualEntry> {
22
+ public readonly id = 'yamaha-manual-match';
23
+ public readonly source = 'manual' as const;
24
+ public async matches(input: IYamahaManualEntry): Promise<IDiscoveryMatch> {
25
+ try {
26
+ const values = yamahaRecord(input, ['origin', 'expectedDeviceId', 'id', 'model', 'name', 'manufacturer', 'metadata']);
27
+ const metadata = values.metadata === undefined ? {} : yamahaRecord(values.metadata, ['origin']);
28
+ if (values.manufacturer !== undefined && values.manufacturer !== 'Yamaha') return miss('Manufacturer does not match the selected Yamaha profile.');
29
+ if (values.expectedDeviceId !== undefined && values.id !== undefined && values.expectedDeviceId !== values.id) return miss('Manual receiver identities conflict.');
30
+ if (values.origin !== undefined && metadata.origin !== undefined && yamahaOrigin(values.origin) !== yamahaOrigin(metadata.origin)) return miss('Manual selected origins conflict.');
31
+ return hint(values.origin ?? metadata.origin, values.expectedDeviceId ?? values.id, values.model, values.name);
32
+ } catch { return miss('Manual setup requires an exact RX-V485 identity and selected literal private HTTP origin.'); }
33
+ }
34
+ }
35
+
36
+ export class YamahaCandidateValidator implements IDiscoveryValidator {
37
+ public readonly id = 'yamaha-candidate-validator';
38
+ public async validate(input: IDiscoveryCandidate): Promise<IDiscoveryMatch> {
39
+ try {
40
+ const values = yamahaRecord(input, ['source', 'integrationDomain', 'id', 'host', 'port', 'name', 'manufacturer', 'model', 'metadata']);
41
+ if (values.source !== 'manual' || values.integrationDomain !== 'yamaha' || values.manufacturer !== 'Yamaha') return miss('Candidate does not belong to selected Yamaha manual admission.');
42
+ const metadata = yamahaRecord(values.metadata, ['origin', 'identityEvidence']);
43
+ const selectedOrigin = yamahaOrigin(metadata.origin);
44
+ const url = new URL(selectedOrigin);
45
+ if (values.host !== url.hostname || values.port !== Number(url.port || 80)) return miss('Candidate host or port conflicts with the selected origin.');
46
+ return hint(selectedOrigin, values.id, values.model, values.name);
47
+ } catch { return miss('Candidate cannot satisfy selected Yamaha admission.'); }
48
+ }
49
+ }
50
+
51
+ export const createYamahaDiscoveryDescriptor = (): DiscoveryDescriptor =>
52
+ new DiscoveryDescriptor({ integrationDomain: 'yamaha', displayName: 'Yamaha RX-V485 main zone' })
53
+ .addMatcher(new YamahaManualMatcher()).addValidator(new YamahaCandidateValidator());
@@ -1,26 +1,78 @@
1
- import type * as shxInterfaces from '@smarthome.exchange/interfaces';
2
- import { SimpleLocalMapper, type IIntegrationEntity, type ISimpleLocalSnapshot, type ISimpleLocalSnapshotOptions, type TSimpleLocalRawData } from '../../core/index.js';
3
- import type { IYamahaConfig } from './yamaha.types.js';
1
+ import type * as plugins from '../../plugins.js';
2
+ import { SimpleLocalMapper } from '../../core/classes.simplelocalintegration.js';
3
+ import type { ISimpleLocalSnapshotOptions } from '../../core/classes.simplelocalintegration.js';
4
+ import type { IIntegrationEntity } from '../../core/types.js';
5
+ import type { IYamahaOfflineConfig, IYamahaOfflineSnapshot, IYamahaSnapshot, TYamahaRawData } from './yamaha.types.js';
4
6
  import { yamahaProfile } from './yamaha.types.js';
5
7
 
6
8
  export class YamahaMapper {
7
- public static toSnapshot(optionsArg: Omit<ISimpleLocalSnapshotOptions<IYamahaConfig>, 'profile'>): ISimpleLocalSnapshot {
8
- return SimpleLocalMapper.toSnapshot({ ...optionsArg, profile: yamahaProfile });
9
+ public static deviceId(homeId: string, deviceId: string): string {
10
+ return `yamaha.receiver.${encodeURIComponent(homeId)}.${encodeURIComponent(deviceId)}`;
9
11
  }
10
12
 
11
- public static toSnapshotFromRaw(configArg: IYamahaConfig, rawDataArg: TSimpleLocalRawData): ISimpleLocalSnapshot {
12
- return SimpleLocalMapper.toSnapshot({ profile: yamahaProfile, config: configArg, rawData: rawDataArg, online: true, source: 'manual' });
13
+ public static entityId(homeId: string, deviceId: string): string {
14
+ return `media_player.yamaha.${encodeURIComponent(homeId)}.${encodeURIComponent(deviceId)}`;
13
15
  }
14
16
 
15
- public static toDevices(snapshotArg: ISimpleLocalSnapshot): shxInterfaces.data.IDeviceDefinition[] {
16
- return SimpleLocalMapper.toDevices(yamahaProfile, snapshotArg);
17
+ public static toDevices(snapshot: IYamahaSnapshot): plugins.shxInterfaces.data.IDeviceDefinition[] {
18
+ return [{
19
+ id: this.deviceId(snapshot.homeId, snapshot.identity.deviceId), integrationDomain: 'yamaha', name: snapshot.name,
20
+ protocol: 'http', manufacturer: 'Yamaha', model: snapshot.identity.model, online: true,
21
+ features: [
22
+ { id: 'power', capability: 'media', name: 'Main-zone power', readable: true, writable: true },
23
+ { id: 'muted', capability: 'media', name: 'Main-zone mute', readable: true, writable: true },
24
+ { id: 'volume_raw', capability: 'media', name: 'Main-zone absolute vendor volume', unit: 'raw', readable: true, writable: true },
25
+ { id: 'input', capability: 'media', name: 'Main-zone input', readable: true, writable: snapshot.inputs.length > 0 },
26
+ ],
27
+ state: [
28
+ { featureId: 'power', value: snapshot.power === 'on', updatedAt: snapshot.observedAt },
29
+ { featureId: 'muted', value: snapshot.muted, updatedAt: snapshot.observedAt },
30
+ { featureId: 'volume_raw', value: snapshot.volume, updatedAt: snapshot.observedAt },
31
+ { featureId: 'input', value: snapshot.input, updatedAt: snapshot.observedAt },
32
+ ],
33
+ metadata: { homeId: snapshot.homeId, deviceId: snapshot.identity.deviceId, origin: snapshot.origin, zone: 'main',
34
+ apiVersion: snapshot.identity.apiVersion, inputs: [...snapshot.inputs], volumeRange: { ...snapshot.volumeRange },
35
+ ownerMaxVolume: snapshot.ownerMaxVolume, receiverMaxVolume: snapshot.receiverMaxVolume,
36
+ stateSource: 'receiver-observation', identityAuthentication: 'unauthenticated-lan' },
37
+ }];
17
38
  }
18
39
 
19
- public static toEntities(snapshotArg: ISimpleLocalSnapshot): IIntegrationEntity[] {
20
- return SimpleLocalMapper.toEntities(yamahaProfile, snapshotArg);
40
+ public static toEntities(snapshot: IYamahaSnapshot): IIntegrationEntity[] {
41
+ return [{
42
+ id: this.entityId(snapshot.homeId, snapshot.identity.deviceId), uniqueId: this.deviceId(snapshot.homeId, snapshot.identity.deviceId),
43
+ integrationDomain: 'yamaha', deviceId: this.deviceId(snapshot.homeId, snapshot.identity.deviceId), platform: 'media_player',
44
+ name: snapshot.name, state: snapshot.power === 'on' ? 'on' : 'off', available: true,
45
+ attributes: { homeId: snapshot.homeId, deviceId: snapshot.identity.deviceId, zone: 'main', power: snapshot.power,
46
+ volumeRaw: snapshot.volume, volumeUnit: 'raw', muted: snapshot.muted, source: snapshot.input, sourceList: [...snapshot.inputs],
47
+ volumeRange: { ...snapshot.volumeRange }, ownerMaxVolume: snapshot.ownerMaxVolume, receiverMaxVolume: snapshot.receiverMaxVolume,
48
+ observedAt: snapshot.observedAt, stateSource: 'receiver-observation' },
49
+ }];
50
+ }
51
+ }
52
+
53
+ /** The former generic mapping remains available without admitting data as a live device. */
54
+ export class YamahaOfflineMapper {
55
+ public static toSnapshot(options: Omit<ISimpleLocalSnapshotOptions<IYamahaOfflineConfig>, 'profile'>): IYamahaOfflineSnapshot {
56
+ const snapshot = SimpleLocalMapper.toSnapshot({ ...options, profile: yamahaProfile, online: false });
57
+ return { ...snapshot, online: false, source: 'manual',
58
+ entities: snapshot.entities.map((entity) => ({ ...entity, available: false, writable: false })),
59
+ capabilities: { localRead: false, localControl: false, offlineData: true } };
60
+ }
61
+
62
+ public static toSnapshotFromRaw(config: IYamahaOfflineConfig, rawData: TYamahaRawData): IYamahaOfflineSnapshot {
63
+ return this.toSnapshot({ config, rawData, source: 'manual' });
64
+ }
65
+
66
+ public static toDevices(snapshot: IYamahaOfflineSnapshot): plugins.shxInterfaces.data.IDeviceDefinition[] {
67
+ return SimpleLocalMapper.toDevices(yamahaProfile, snapshot).map((device) => ({ ...device, online: false,
68
+ features: device.features.map((feature) => ({ ...feature, writable: false })),
69
+ metadata: { ...device.metadata, stateSource: 'explicit-offline-data' } }));
21
70
  }
22
71
 
23
- public static slug(valueArg: unknown): string {
24
- return SimpleLocalMapper.slug(valueArg);
72
+ public static toEntities(snapshot: IYamahaOfflineSnapshot): IIntegrationEntity[] {
73
+ return SimpleLocalMapper.toEntities(yamahaProfile, snapshot).map((entity) => ({ ...entity, available: false,
74
+ attributes: { ...entity.attributes, stateSource: 'explicit-offline-data' } }));
25
75
  }
76
+
77
+ public static slug(value: unknown): string { return SimpleLocalMapper.slug(value); }
26
78
  }
@@ -1,103 +1,83 @@
1
- import type { ISimpleLocalConfig, ISimpleLocalIntegrationProfile, ISimpleLocalSnapshot, TSimpleLocalRawData } from '../../core/index.js';
1
+ import type { ISimpleLocalConfig, ISimpleLocalIntegrationProfile, ISimpleLocalSnapshot, TSimpleLocalRawData } from '../../core/classes.simplelocalintegration.js';
2
2
 
3
- export const yamahaDomain = "yamaha";
4
- export const yamahaDefaultName = "Yamaha Network Receivers";
3
+ export const yamahaDomain = 'yamaha';
4
+ export const yamahaDefaultName = 'Yamaha RX-V485 main zone';
5
+ export type TYamahaModel = 'RX-V485';
6
+
7
+ export interface IYamahaConfig {
8
+ homeId: string;
9
+ origin: string;
10
+ expectedDeviceId: string;
11
+ model: TYamahaModel;
12
+ allowUnencryptedHttp: true;
13
+ maxVolume: number;
14
+ name?: string;
15
+ timeoutMs?: number;
16
+ maxResponseBytes?: number;
17
+ maxPendingOperations?: number;
18
+ }
5
19
 
6
- export type TYamahaRawData = TSimpleLocalRawData;
7
- export interface IYamahaSnapshot extends ISimpleLocalSnapshot {}
8
- export interface IYamahaConfig extends ISimpleLocalConfig {}
9
20
  export interface IHomeAssistantYamahaConfig extends IYamahaConfig {}
10
21
 
22
+ export interface IYamahaIdentity {
23
+ readonly deviceId: string;
24
+ readonly model: TYamahaModel;
25
+ readonly apiVersion: number;
26
+ }
27
+
28
+ export interface IYamahaVolumeRange {
29
+ readonly min: number;
30
+ readonly max: number;
31
+ readonly step: number;
32
+ }
33
+
34
+ /** Receiver settings are observations, without claims about an electrical or acoustic effect. */
35
+ export interface IYamahaSnapshot {
36
+ readonly homeId: string;
37
+ readonly origin: string;
38
+ readonly name: string;
39
+ readonly identity: IYamahaIdentity;
40
+ readonly power: 'on' | 'standby';
41
+ readonly muted: boolean;
42
+ readonly volume: number;
43
+ readonly receiverMaxVolume: number;
44
+ readonly ownerMaxVolume: number;
45
+ readonly input: string;
46
+ readonly inputs: readonly string[];
47
+ readonly volumeRange: IYamahaVolumeRange;
48
+ readonly observedAt: string;
49
+ }
50
+
51
+ export type TYamahaControl =
52
+ | { feature: 'power'; value: boolean }
53
+ | { feature: 'muted'; value: boolean }
54
+ | { feature: 'volume_raw'; value: number }
55
+ | { feature: 'input'; value: string };
56
+
57
+ export interface IYamahaEffectResult {
58
+ readonly dispatch: 'acknowledged';
59
+ readonly outcome: 'observed-target' | 'indeterminate';
60
+ readonly snapshot: IYamahaSnapshot;
61
+ }
62
+
63
+ export interface IYamahaManualEntry {
64
+ origin?: string;
65
+ expectedDeviceId?: string;
66
+ id?: string;
67
+ model?: string;
68
+ name?: string;
69
+ manufacturer?: string;
70
+ metadata?: Record<string, unknown>;
71
+ }
72
+
73
+ export type TYamahaRawData = TSimpleLocalRawData;
74
+ export interface IYamahaOfflineConfig extends ISimpleLocalConfig {}
75
+ export interface IYamahaOfflineSnapshot extends ISimpleLocalSnapshot {}
76
+
77
+ /** Pure offline mapping profile; it supplies no protocol client or live runtime admission. */
11
78
  export const yamahaProfile: ISimpleLocalIntegrationProfile = {
12
- domain: "yamaha",
13
- displayName: "Yamaha Network Receivers",
14
- manufacturer: "Yamaha",
15
- model: "Network receiver",
16
- defaultName: "Yamaha Network Receivers",
17
- defaultPort: 80,
18
- defaultHttpPath: "/YamahaRemoteControl/ctrl",
19
- defaultProtocol: "http",
20
- status: "control-runtime",
21
- platforms: [
22
- "media_player",
23
- "sensor"
24
- ],
25
- serviceDomains: [
26
- "media_player"
27
- ],
28
- controlServices: [
29
- "turn_on",
30
- "turn_off",
31
- "volume_up",
32
- "volume_down",
33
- "volume_mute",
34
- "select_source",
35
- "media_play",
36
- "media_pause",
37
- "media_stop",
38
- "media_next_track",
39
- "media_previous_track"
40
- ],
41
- discoverySources: [
42
- "manual",
43
- "mdns",
44
- "ssdp",
45
- "http",
46
- "custom"
47
- ],
48
- discoveryKeywords: [
49
- "yamaha",
50
- "rx-v",
51
- "receiver"
52
- ],
53
- metadata: {
54
- source: "home-assistant/core",
55
- upstreamPath: "homeassistant/components/yamaha",
56
- upstreamDomain: "yamaha",
57
- iotClass: "local_polling",
58
- qualityScale: "legacy",
59
- requirements: [
60
- "rxv==0.7.0"
61
- ],
62
- dependencies: [],
63
- afterDependencies: [],
64
- codeowners: [],
65
- configFlow: true,
66
- runtime: {
67
- type: "control-runtime",
68
- services: [
69
- "snapshot",
70
- "status",
71
- "refresh",
72
- "turn_on",
73
- "turn_off",
74
- "volume_up",
75
- "volume_down",
76
- "volume_mute",
77
- "select_source",
78
- "media_play",
79
- "media_pause",
80
- "media_stop",
81
- "media_next_track",
82
- "media_previous_track"
83
- ],
84
- platforms: [
85
- "media_player",
86
- "sensor"
87
- ],
88
- controls: true
89
- },
90
- localApi: {
91
- implemented: [
92
- "manual local endpoint setup",
93
- "snapshot, raw data, snapshotProvider, and injected native client operation",
94
- "generic HTTP/TCP local transport when config.path, config.transport, or documented defaults are supplied"
95
- ],
96
- explicitUnsupported: [
97
- "claiming live command success without injected client.execute or commandExecutor",
98
- "cloud account flows and remote API polling",
99
- "device-specific protocol features not represented by snapshot/rawData/client/executor inputs"
100
- ]
101
- }
102
- }
79
+ domain: yamahaDomain, displayName: 'Yamaha offline data', manufacturer: 'Yamaha', model: 'Unverified Yamaha receiver',
80
+ defaultName: 'Yamaha offline data', defaultProtocol: 'unknown', status: 'read-only-runtime',
81
+ platforms: ['media_player', 'sensor'], serviceDomains: [], controlServices: [],
82
+ discoverySources: [], discoveryKeywords: [], metadata: { source: 'explicit-offline-data', liveRuntime: false },
103
83
  };