@zwave-js/cc 14.3.10 → 15.0.0-beta.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 (461) hide show
  1. package/build/cjs/cc/AlarmSensorCC.d.ts +139 -57
  2. package/build/cjs/cc/AlarmSensorCC.js.map +2 -2
  3. package/build/cjs/cc/AssociationCC.d.ts +178 -43
  4. package/build/cjs/cc/AssociationCC.js +0 -4
  5. package/build/cjs/cc/AssociationCC.js.map +2 -2
  6. package/build/cjs/cc/AssociationGroupInfoCC.d.ts +138 -38
  7. package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
  8. package/build/cjs/cc/BarrierOperatorCC.d.ts +275 -73
  9. package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
  10. package/build/cjs/cc/BasicCC.d.ts +316 -71
  11. package/build/cjs/cc/BasicCC.js.map +2 -2
  12. package/build/cjs/cc/BatteryCC.d.ts +759 -164
  13. package/build/cjs/cc/BatteryCC.js.map +2 -2
  14. package/build/cjs/cc/BinarySensorCC.d.ts +91 -26
  15. package/build/cjs/cc/BinarySensorCC.js.map +2 -2
  16. package/build/cjs/cc/BinarySwitchCC.d.ts +190 -38
  17. package/build/cjs/cc/BinarySwitchCC.js.map +2 -2
  18. package/build/cjs/cc/CRC16CC.d.ts +4 -8
  19. package/build/cjs/cc/CRC16CC.js +4 -27
  20. package/build/cjs/cc/CRC16CC.js.map +2 -2
  21. package/build/cjs/cc/CentralSceneCC.d.ts +272 -53
  22. package/build/cjs/cc/CentralSceneCC.js.map +2 -2
  23. package/build/cjs/cc/ClimateControlScheduleCC.d.ts +150 -37
  24. package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
  25. package/build/cjs/cc/ClockCC.d.ts +3 -3
  26. package/build/cjs/cc/ClockCC.js.map +2 -2
  27. package/build/cjs/cc/ColorSwitchCC.d.ts +423 -96
  28. package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
  29. package/build/cjs/cc/ConfigurationCC._validateArgs.js +1 -1
  30. package/build/cjs/cc/ConfigurationCC._validateArgs.js.map +1 -1
  31. package/build/cjs/cc/ConfigurationCC.d.ts +101 -37
  32. package/build/cjs/cc/ConfigurationCC.js +0 -8
  33. package/build/cjs/cc/ConfigurationCC.js.map +2 -2
  34. package/build/cjs/cc/DeviceResetLocallyCC.d.ts +1 -1
  35. package/build/cjs/cc/DeviceResetLocallyCC.js.map +2 -2
  36. package/build/cjs/cc/DoorLockCC._validateArgs.js +1 -1
  37. package/build/cjs/cc/DoorLockCC._validateArgs.js.map +1 -1
  38. package/build/cjs/cc/DoorLockCC.d.ts +1731 -419
  39. package/build/cjs/cc/DoorLockCC.js.map +2 -2
  40. package/build/cjs/cc/DoorLockLoggingCC.d.ts +64 -12
  41. package/build/cjs/cc/DoorLockLoggingCC.js.map +2 -2
  42. package/build/cjs/cc/EnergyProductionCC.d.ts +29 -14
  43. package/build/cjs/cc/EnergyProductionCC.js.map +2 -2
  44. package/build/cjs/cc/EntryControlCC.d.ts +308 -57
  45. package/build/cjs/cc/EntryControlCC.js.map +2 -2
  46. package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts +2 -0
  47. package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.js +26 -0
  48. package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.js.map +1 -1
  49. package/build/cjs/cc/FirmwareUpdateMetaDataCC.d.ts +389 -64
  50. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js +154 -8
  51. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +2 -2
  52. package/build/cjs/cc/HumidityControlModeCC.d.ts +125 -27
  53. package/build/cjs/cc/HumidityControlModeCC.js.map +2 -2
  54. package/build/cjs/cc/HumidityControlOperatingStateCC.d.ts +64 -18
  55. package/build/cjs/cc/HumidityControlOperatingStateCC.js.map +2 -2
  56. package/build/cjs/cc/HumidityControlSetpointCC.d.ts +116 -39
  57. package/build/cjs/cc/HumidityControlSetpointCC.js.map +2 -2
  58. package/build/cjs/cc/InclusionControllerCC.d.ts +4 -4
  59. package/build/cjs/cc/InclusionControllerCC.js.map +2 -2
  60. package/build/cjs/cc/IndicatorCC.d.ts +325 -83
  61. package/build/cjs/cc/IndicatorCC.js.map +2 -2
  62. package/build/cjs/cc/IrrigationCC.d.ts +2170 -683
  63. package/build/cjs/cc/IrrigationCC.js.map +2 -2
  64. package/build/cjs/cc/LanguageCC.d.ts +128 -26
  65. package/build/cjs/cc/LanguageCC.js.map +2 -2
  66. package/build/cjs/cc/LockCC.d.ts +64 -14
  67. package/build/cjs/cc/LockCC.js.map +2 -2
  68. package/build/cjs/cc/ManufacturerProprietaryCC.d.ts +2 -2
  69. package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
  70. package/build/cjs/cc/ManufacturerSpecificCC.d.ts +219 -57
  71. package/build/cjs/cc/ManufacturerSpecificCC.js.map +2 -2
  72. package/build/cjs/cc/MeterCC.d.ts +364 -89
  73. package/build/cjs/cc/MeterCC.js.map +2 -2
  74. package/build/cjs/cc/MultiChannelAssociationCC.d.ts +138 -40
  75. package/build/cjs/cc/MultiChannelAssociationCC.js +0 -5
  76. package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
  77. package/build/cjs/cc/MultiChannelCC.d.ts +469 -99
  78. package/build/cjs/cc/MultiChannelCC.js +8 -72
  79. package/build/cjs/cc/MultiChannelCC.js.map +2 -2
  80. package/build/cjs/cc/MultiCommandCC.d.ts +4 -8
  81. package/build/cjs/cc/MultiCommandCC.js +4 -37
  82. package/build/cjs/cc/MultiCommandCC.js.map +2 -2
  83. package/build/cjs/cc/MultilevelSensorCC.d.ts +118 -33
  84. package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
  85. package/build/cjs/cc/MultilevelSwitchCC.d.ts +490 -125
  86. package/build/cjs/cc/MultilevelSwitchCC.js.map +2 -2
  87. package/build/cjs/cc/NodeNamingCC.d.ts +128 -26
  88. package/build/cjs/cc/NodeNamingCC.js.map +2 -2
  89. package/build/cjs/cc/NotificationCC.d.ts +603 -161
  90. package/build/cjs/cc/NotificationCC.js +12 -1
  91. package/build/cjs/cc/NotificationCC.js.map +2 -2
  92. package/build/cjs/cc/PowerlevelCC.d.ts +6 -6
  93. package/build/cjs/cc/PowerlevelCC.js.map +2 -2
  94. package/build/cjs/cc/ProtectionCC.d.ts +496 -94
  95. package/build/cjs/cc/ProtectionCC.js.map +2 -2
  96. package/build/cjs/cc/SceneActivationCC.d.ts +127 -28
  97. package/build/cjs/cc/SceneActivationCC.js.map +2 -2
  98. package/build/cjs/cc/SceneActuatorConfigurationCC.d.ts +52 -25
  99. package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +2 -2
  100. package/build/cjs/cc/SceneControllerConfigurationCC.d.ts +53 -25
  101. package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
  102. package/build/cjs/cc/ScheduleEntryLockCC.d.ts +268 -64
  103. package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
  104. package/build/cjs/cc/Security2CC.d.ts +15 -21
  105. package/build/cjs/cc/Security2CC.js +32 -347
  106. package/build/cjs/cc/Security2CC.js.map +3 -3
  107. package/build/cjs/cc/SecurityCC.d.ts +12 -19
  108. package/build/cjs/cc/SecurityCC.js +12 -106
  109. package/build/cjs/cc/SecurityCC.js.map +2 -2
  110. package/build/cjs/cc/SoundSwitchCC.d.ts +253 -64
  111. package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
  112. package/build/cjs/cc/SupervisionCC.d.ts +28 -16
  113. package/build/cjs/cc/SupervisionCC.js +4 -29
  114. package/build/cjs/cc/SupervisionCC.js.map +2 -2
  115. package/build/cjs/cc/ThermostatFanModeCC.d.ts +187 -38
  116. package/build/cjs/cc/ThermostatFanModeCC.js.map +2 -2
  117. package/build/cjs/cc/ThermostatFanStateCC.d.ts +64 -18
  118. package/build/cjs/cc/ThermostatFanStateCC.js.map +2 -2
  119. package/build/cjs/cc/ThermostatModeCC.d.ts +189 -40
  120. package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
  121. package/build/cjs/cc/ThermostatOperatingStateCC.d.ts +65 -19
  122. package/build/cjs/cc/ThermostatOperatingStateCC.js.map +2 -2
  123. package/build/cjs/cc/ThermostatSetbackCC.d.ts +4 -4
  124. package/build/cjs/cc/ThermostatSetbackCC.js.map +2 -2
  125. package/build/cjs/cc/ThermostatSetpointCC.d.ts +116 -36
  126. package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
  127. package/build/cjs/cc/TimeCC.d.ts +6 -6
  128. package/build/cjs/cc/TimeCC.js.map +2 -2
  129. package/build/cjs/cc/TimeParametersCC.d.ts +63 -12
  130. package/build/cjs/cc/TimeParametersCC.js.map +2 -2
  131. package/build/cjs/cc/TransportServiceCC.d.ts +7 -12
  132. package/build/cjs/cc/TransportServiceCC.js +3 -20
  133. package/build/cjs/cc/TransportServiceCC.js.map +2 -2
  134. package/build/cjs/cc/UserCodeCC._validateArgs.js +1 -1
  135. package/build/cjs/cc/UserCodeCC._validateArgs.js.map +1 -1
  136. package/build/cjs/cc/UserCodeCC.d.ts +931 -176
  137. package/build/cjs/cc/UserCodeCC.js.map +2 -2
  138. package/build/cjs/cc/VersionCC.d.ts +897 -185
  139. package/build/cjs/cc/VersionCC.js.map +2 -2
  140. package/build/cjs/cc/WakeUpCC.d.ts +190 -38
  141. package/build/cjs/cc/WakeUpCC.js.map +2 -2
  142. package/build/cjs/cc/WindowCoveringCC.d.ts +193 -103
  143. package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
  144. package/build/cjs/cc/ZWavePlusCC.d.ts +311 -51
  145. package/build/cjs/cc/ZWavePlusCC.js.map +2 -2
  146. package/build/cjs/cc/ZWaveProtocolCC.d.ts +28 -28
  147. package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
  148. package/build/cjs/cc/manufacturerProprietary/FibaroCC.d.ts +4 -4
  149. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +2 -2
  150. package/build/cjs/index.d.ts +1 -0
  151. package/build/cjs/index.js.map +1 -1
  152. package/build/cjs/index_browser.d.ts +9 -0
  153. package/build/cjs/index_browser.js +41 -1
  154. package/build/cjs/index_browser.js.map +2 -2
  155. package/build/cjs/lib/API.d.ts +7 -5
  156. package/build/cjs/lib/API.js +1 -1
  157. package/build/cjs/lib/API.js.map +2 -2
  158. package/build/cjs/lib/CommandClass.d.ts +10 -21
  159. package/build/cjs/lib/CommandClass.js +51 -106
  160. package/build/cjs/lib/CommandClass.js.map +3 -3
  161. package/build/cjs/lib/CommandClassDecorators.d.ts +1 -1
  162. package/build/cjs/lib/CommandClassDecorators.js +3 -3
  163. package/build/cjs/lib/CommandClassDecorators.js.map +2 -2
  164. package/build/cjs/lib/Values.d.ts +2 -2
  165. package/build/cjs/lib/Values.js.map +2 -2
  166. package/build/cjs/lib/traits.d.ts +94 -0
  167. package/build/cjs/lib/traits.js +17 -0
  168. package/build/cjs/lib/traits.js.map +7 -0
  169. package/build/cjs/lib/utils.d.ts +2 -2
  170. package/build/cjs/lib/utils.js.map +2 -2
  171. package/build/esm/cc/AlarmSensorCC.d.ts +139 -57
  172. package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
  173. package/build/esm/cc/AlarmSensorCC.js +0 -1
  174. package/build/esm/cc/AlarmSensorCC.js.map +1 -1
  175. package/build/esm/cc/AssociationCC.d.ts +178 -43
  176. package/build/esm/cc/AssociationCC.d.ts.map +1 -1
  177. package/build/esm/cc/AssociationCC.js +0 -13
  178. package/build/esm/cc/AssociationCC.js.map +1 -1
  179. package/build/esm/cc/AssociationGroupInfoCC.d.ts +138 -38
  180. package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
  181. package/build/esm/cc/AssociationGroupInfoCC.js +0 -6
  182. package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
  183. package/build/esm/cc/BarrierOperatorCC.d.ts +275 -73
  184. package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
  185. package/build/esm/cc/BarrierOperatorCC.js +0 -3
  186. package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
  187. package/build/esm/cc/BasicCC.d.ts +316 -71
  188. package/build/esm/cc/BasicCC.d.ts.map +1 -1
  189. package/build/esm/cc/BasicCC.js +0 -2
  190. package/build/esm/cc/BasicCC.js.map +1 -1
  191. package/build/esm/cc/BatteryCC.d.ts +759 -164
  192. package/build/esm/cc/BatteryCC.d.ts.map +1 -1
  193. package/build/esm/cc/BatteryCC.js +1 -2
  194. package/build/esm/cc/BatteryCC.js.map +1 -1
  195. package/build/esm/cc/BinarySensorCC.d.ts +91 -26
  196. package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
  197. package/build/esm/cc/BinarySensorCC.js +0 -3
  198. package/build/esm/cc/BinarySensorCC.js.map +1 -1
  199. package/build/esm/cc/BinarySwitchCC.d.ts +190 -38
  200. package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -1
  201. package/build/esm/cc/BinarySwitchCC.js +0 -2
  202. package/build/esm/cc/BinarySwitchCC.js.map +1 -1
  203. package/build/esm/cc/CRC16CC.d.ts +4 -8
  204. package/build/esm/cc/CRC16CC.d.ts.map +1 -1
  205. package/build/esm/cc/CRC16CC.js +4 -34
  206. package/build/esm/cc/CRC16CC.js.map +1 -1
  207. package/build/esm/cc/CentralSceneCC.d.ts +272 -53
  208. package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
  209. package/build/esm/cc/CentralSceneCC.js +0 -1
  210. package/build/esm/cc/CentralSceneCC.js.map +1 -1
  211. package/build/esm/cc/ClimateControlScheduleCC.d.ts +150 -37
  212. package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -1
  213. package/build/esm/cc/ClimateControlScheduleCC.js +0 -3
  214. package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
  215. package/build/esm/cc/ClockCC.d.ts +3 -3
  216. package/build/esm/cc/ClockCC.d.ts.map +1 -1
  217. package/build/esm/cc/ClockCC.js +0 -1
  218. package/build/esm/cc/ClockCC.js.map +1 -1
  219. package/build/esm/cc/ColorSwitchCC.d.ts +423 -96
  220. package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
  221. package/build/esm/cc/ColorSwitchCC.js +0 -6
  222. package/build/esm/cc/ColorSwitchCC.js.map +1 -1
  223. package/build/esm/cc/ConfigurationCC._validateArgs.js +1 -1
  224. package/build/esm/cc/ConfigurationCC._validateArgs.js.map +1 -1
  225. package/build/esm/cc/ConfigurationCC.d.ts +101 -37
  226. package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
  227. package/build/esm/cc/ConfigurationCC.js +0 -25
  228. package/build/esm/cc/ConfigurationCC.js.map +1 -1
  229. package/build/esm/cc/DeviceResetLocallyCC.d.ts +1 -1
  230. package/build/esm/cc/DeviceResetLocallyCC.d.ts.map +1 -1
  231. package/build/esm/cc/DeviceResetLocallyCC.js.map +1 -1
  232. package/build/esm/cc/DoorLockCC._validateArgs.js +1 -1
  233. package/build/esm/cc/DoorLockCC._validateArgs.js.map +1 -1
  234. package/build/esm/cc/DoorLockCC.d.ts +1731 -419
  235. package/build/esm/cc/DoorLockCC.d.ts.map +1 -1
  236. package/build/esm/cc/DoorLockCC.js +0 -2
  237. package/build/esm/cc/DoorLockCC.js.map +1 -1
  238. package/build/esm/cc/DoorLockLoggingCC.d.ts +64 -12
  239. package/build/esm/cc/DoorLockLoggingCC.d.ts.map +1 -1
  240. package/build/esm/cc/DoorLockLoggingCC.js +0 -1
  241. package/build/esm/cc/DoorLockLoggingCC.js.map +1 -1
  242. package/build/esm/cc/EnergyProductionCC.d.ts +29 -14
  243. package/build/esm/cc/EnergyProductionCC.d.ts.map +1 -1
  244. package/build/esm/cc/EnergyProductionCC.js +0 -2
  245. package/build/esm/cc/EnergyProductionCC.js.map +1 -1
  246. package/build/esm/cc/EntryControlCC.d.ts +308 -57
  247. package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
  248. package/build/esm/cc/EntryControlCC.js +0 -1
  249. package/build/esm/cc/EntryControlCC.js.map +1 -1
  250. package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts +2 -0
  251. package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts.map +1 -1
  252. package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.js +20 -0
  253. package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.js.map +1 -1
  254. package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts +389 -64
  255. package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -1
  256. package/build/esm/cc/FirmwareUpdateMetaDataCC.js +158 -30
  257. package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
  258. package/build/esm/cc/HumidityControlModeCC.d.ts +125 -27
  259. package/build/esm/cc/HumidityControlModeCC.d.ts.map +1 -1
  260. package/build/esm/cc/HumidityControlModeCC.js +0 -1
  261. package/build/esm/cc/HumidityControlModeCC.js.map +1 -1
  262. package/build/esm/cc/HumidityControlOperatingStateCC.d.ts +64 -18
  263. package/build/esm/cc/HumidityControlOperatingStateCC.d.ts.map +1 -1
  264. package/build/esm/cc/HumidityControlOperatingStateCC.js.map +1 -1
  265. package/build/esm/cc/HumidityControlSetpointCC.d.ts +116 -39
  266. package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -1
  267. package/build/esm/cc/HumidityControlSetpointCC.js +0 -4
  268. package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
  269. package/build/esm/cc/InclusionControllerCC.d.ts +4 -4
  270. package/build/esm/cc/InclusionControllerCC.d.ts.map +1 -1
  271. package/build/esm/cc/InclusionControllerCC.js +0 -2
  272. package/build/esm/cc/InclusionControllerCC.js.map +1 -1
  273. package/build/esm/cc/IndicatorCC.d.ts +325 -83
  274. package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
  275. package/build/esm/cc/IndicatorCC.js +0 -7
  276. package/build/esm/cc/IndicatorCC.js.map +1 -1
  277. package/build/esm/cc/IrrigationCC.d.ts +2170 -683
  278. package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
  279. package/build/esm/cc/IrrigationCC.js +0 -9
  280. package/build/esm/cc/IrrigationCC.js.map +1 -1
  281. package/build/esm/cc/LanguageCC.d.ts +128 -26
  282. package/build/esm/cc/LanguageCC.d.ts.map +1 -1
  283. package/build/esm/cc/LanguageCC.js +0 -1
  284. package/build/esm/cc/LanguageCC.js.map +1 -1
  285. package/build/esm/cc/LockCC.d.ts +64 -14
  286. package/build/esm/cc/LockCC.d.ts.map +1 -1
  287. package/build/esm/cc/LockCC.js +0 -1
  288. package/build/esm/cc/LockCC.js.map +1 -1
  289. package/build/esm/cc/ManufacturerProprietaryCC.d.ts +2 -2
  290. package/build/esm/cc/ManufacturerProprietaryCC.d.ts.map +1 -1
  291. package/build/esm/cc/ManufacturerProprietaryCC.js +0 -1
  292. package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
  293. package/build/esm/cc/ManufacturerSpecificCC.d.ts +219 -57
  294. package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
  295. package/build/esm/cc/ManufacturerSpecificCC.js +0 -2
  296. package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
  297. package/build/esm/cc/MeterCC.d.ts +364 -89
  298. package/build/esm/cc/MeterCC.d.ts.map +1 -1
  299. package/build/esm/cc/MeterCC.js +0 -4
  300. package/build/esm/cc/MeterCC.js.map +1 -1
  301. package/build/esm/cc/MultiChannelAssociationCC.d.ts +138 -40
  302. package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
  303. package/build/esm/cc/MultiChannelAssociationCC.js +0 -16
  304. package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
  305. package/build/esm/cc/MultiChannelCC.d.ts +469 -99
  306. package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
  307. package/build/esm/cc/MultiChannelCC.js +8 -101
  308. package/build/esm/cc/MultiChannelCC.js.map +1 -1
  309. package/build/esm/cc/MultiCommandCC.d.ts +4 -8
  310. package/build/esm/cc/MultiCommandCC.d.ts.map +1 -1
  311. package/build/esm/cc/MultiCommandCC.js +4 -38
  312. package/build/esm/cc/MultiCommandCC.js.map +1 -1
  313. package/build/esm/cc/MultilevelSensorCC.d.ts +118 -33
  314. package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
  315. package/build/esm/cc/MultilevelSensorCC.js +0 -5
  316. package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
  317. package/build/esm/cc/MultilevelSwitchCC.d.ts +490 -125
  318. package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -1
  319. package/build/esm/cc/MultilevelSwitchCC.js +0 -4
  320. package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
  321. package/build/esm/cc/NodeNamingCC.d.ts +128 -26
  322. package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
  323. package/build/esm/cc/NodeNamingCC.js +0 -2
  324. package/build/esm/cc/NodeNamingCC.js.map +1 -1
  325. package/build/esm/cc/NotificationCC.d.ts +603 -161
  326. package/build/esm/cc/NotificationCC.d.ts.map +1 -1
  327. package/build/esm/cc/NotificationCC.js +18 -12
  328. package/build/esm/cc/NotificationCC.js.map +1 -1
  329. package/build/esm/cc/PowerlevelCC.d.ts +6 -6
  330. package/build/esm/cc/PowerlevelCC.d.ts.map +1 -1
  331. package/build/esm/cc/PowerlevelCC.js +0 -4
  332. package/build/esm/cc/PowerlevelCC.js.map +1 -1
  333. package/build/esm/cc/ProtectionCC.d.ts +496 -94
  334. package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
  335. package/build/esm/cc/ProtectionCC.js +0 -3
  336. package/build/esm/cc/ProtectionCC.js.map +1 -1
  337. package/build/esm/cc/SceneActivationCC.d.ts +127 -28
  338. package/build/esm/cc/SceneActivationCC.d.ts.map +1 -1
  339. package/build/esm/cc/SceneActivationCC.js +0 -1
  340. package/build/esm/cc/SceneActivationCC.js.map +1 -1
  341. package/build/esm/cc/SceneActuatorConfigurationCC.d.ts +52 -25
  342. package/build/esm/cc/SceneActuatorConfigurationCC.d.ts.map +1 -1
  343. package/build/esm/cc/SceneActuatorConfigurationCC.js +0 -2
  344. package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -1
  345. package/build/esm/cc/SceneControllerConfigurationCC.d.ts +53 -25
  346. package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
  347. package/build/esm/cc/SceneControllerConfigurationCC.js +0 -2
  348. package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
  349. package/build/esm/cc/ScheduleEntryLockCC.d.ts +268 -64
  350. package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
  351. package/build/esm/cc/ScheduleEntryLockCC.js +0 -14
  352. package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
  353. package/build/esm/cc/Security2CC.d.ts +15 -21
  354. package/build/esm/cc/Security2CC.d.ts.map +1 -1
  355. package/build/esm/cc/Security2CC.js +27 -475
  356. package/build/esm/cc/Security2CC.js.map +1 -1
  357. package/build/esm/cc/SecurityCC.d.ts +12 -19
  358. package/build/esm/cc/SecurityCC.d.ts.map +1 -1
  359. package/build/esm/cc/SecurityCC.js +13 -138
  360. package/build/esm/cc/SecurityCC.js.map +1 -1
  361. package/build/esm/cc/SoundSwitchCC.d.ts +253 -64
  362. package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
  363. package/build/esm/cc/SoundSwitchCC.js +0 -7
  364. package/build/esm/cc/SoundSwitchCC.js.map +1 -1
  365. package/build/esm/cc/SupervisionCC.d.ts +28 -16
  366. package/build/esm/cc/SupervisionCC.d.ts.map +1 -1
  367. package/build/esm/cc/SupervisionCC.js +4 -34
  368. package/build/esm/cc/SupervisionCC.js.map +1 -1
  369. package/build/esm/cc/ThermostatFanModeCC.d.ts +187 -38
  370. package/build/esm/cc/ThermostatFanModeCC.d.ts.map +1 -1
  371. package/build/esm/cc/ThermostatFanModeCC.js +0 -1
  372. package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
  373. package/build/esm/cc/ThermostatFanStateCC.d.ts +64 -18
  374. package/build/esm/cc/ThermostatFanStateCC.d.ts.map +1 -1
  375. package/build/esm/cc/ThermostatFanStateCC.js.map +1 -1
  376. package/build/esm/cc/ThermostatModeCC.d.ts +189 -40
  377. package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
  378. package/build/esm/cc/ThermostatModeCC.js +0 -3
  379. package/build/esm/cc/ThermostatModeCC.js.map +1 -1
  380. package/build/esm/cc/ThermostatOperatingStateCC.d.ts +65 -19
  381. package/build/esm/cc/ThermostatOperatingStateCC.d.ts.map +1 -1
  382. package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -1
  383. package/build/esm/cc/ThermostatSetbackCC.d.ts +4 -4
  384. package/build/esm/cc/ThermostatSetbackCC.d.ts.map +1 -1
  385. package/build/esm/cc/ThermostatSetbackCC.js +0 -2
  386. package/build/esm/cc/ThermostatSetbackCC.js.map +1 -1
  387. package/build/esm/cc/ThermostatSetpointCC.d.ts +116 -36
  388. package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
  389. package/build/esm/cc/ThermostatSetpointCC.js +0 -6
  390. package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
  391. package/build/esm/cc/TimeCC.d.ts +6 -6
  392. package/build/esm/cc/TimeCC.d.ts.map +1 -1
  393. package/build/esm/cc/TimeCC.js +0 -4
  394. package/build/esm/cc/TimeCC.js.map +1 -1
  395. package/build/esm/cc/TimeParametersCC.d.ts +63 -12
  396. package/build/esm/cc/TimeParametersCC.d.ts.map +1 -1
  397. package/build/esm/cc/TimeParametersCC.js +0 -1
  398. package/build/esm/cc/TimeParametersCC.js.map +1 -1
  399. package/build/esm/cc/TransportServiceCC.d.ts +7 -12
  400. package/build/esm/cc/TransportServiceCC.d.ts.map +1 -1
  401. package/build/esm/cc/TransportServiceCC.js +5 -38
  402. package/build/esm/cc/TransportServiceCC.js.map +1 -1
  403. package/build/esm/cc/UserCodeCC._validateArgs.js +1 -1
  404. package/build/esm/cc/UserCodeCC._validateArgs.js.map +1 -1
  405. package/build/esm/cc/UserCodeCC.d.ts +931 -176
  406. package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
  407. package/build/esm/cc/UserCodeCC.js +0 -12
  408. package/build/esm/cc/UserCodeCC.js.map +1 -1
  409. package/build/esm/cc/VersionCC.d.ts +897 -185
  410. package/build/esm/cc/VersionCC.d.ts.map +1 -1
  411. package/build/esm/cc/VersionCC.js +0 -4
  412. package/build/esm/cc/VersionCC.js.map +1 -1
  413. package/build/esm/cc/WakeUpCC.d.ts +190 -38
  414. package/build/esm/cc/WakeUpCC.d.ts.map +1 -1
  415. package/build/esm/cc/WakeUpCC.js +0 -1
  416. package/build/esm/cc/WakeUpCC.js.map +1 -1
  417. package/build/esm/cc/WindowCoveringCC.d.ts +193 -103
  418. package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
  419. package/build/esm/cc/WindowCoveringCC.js +0 -5
  420. package/build/esm/cc/WindowCoveringCC.js.map +1 -1
  421. package/build/esm/cc/ZWavePlusCC.d.ts +311 -51
  422. package/build/esm/cc/ZWavePlusCC.d.ts.map +1 -1
  423. package/build/esm/cc/ZWavePlusCC.js +0 -1
  424. package/build/esm/cc/ZWavePlusCC.js.map +1 -1
  425. package/build/esm/cc/ZWaveProtocolCC.d.ts +28 -28
  426. package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
  427. package/build/esm/cc/ZWaveProtocolCC.js +0 -27
  428. package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
  429. package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts +4 -4
  430. package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts.map +1 -1
  431. package/build/esm/cc/manufacturerProprietary/FibaroCC.js +0 -3
  432. package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
  433. package/build/esm/index.d.ts +1 -0
  434. package/build/esm/index.d.ts.map +1 -1
  435. package/build/esm/index_browser.d.ts +9 -0
  436. package/build/esm/index_browser.d.ts.map +1 -1
  437. package/build/esm/index_browser.js +8 -1
  438. package/build/esm/index_browser.js.map +1 -1
  439. package/build/esm/lib/API.d.ts +7 -5
  440. package/build/esm/lib/API.d.ts.map +1 -1
  441. package/build/esm/lib/API.js +1 -1
  442. package/build/esm/lib/API.js.map +1 -1
  443. package/build/esm/lib/CommandClass.d.ts +10 -21
  444. package/build/esm/lib/CommandClass.d.ts.map +1 -1
  445. package/build/esm/lib/CommandClass.js +8 -101
  446. package/build/esm/lib/CommandClass.js.map +1 -1
  447. package/build/esm/lib/CommandClassDecorators.d.ts +1 -1
  448. package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -1
  449. package/build/esm/lib/CommandClassDecorators.js +1 -1
  450. package/build/esm/lib/CommandClassDecorators.js.map +1 -1
  451. package/build/esm/lib/Values.d.ts +2 -2
  452. package/build/esm/lib/Values.d.ts.map +1 -1
  453. package/build/esm/lib/Values.js.map +1 -1
  454. package/build/esm/lib/traits.d.ts +94 -0
  455. package/build/esm/lib/traits.d.ts.map +1 -0
  456. package/build/esm/lib/traits.js +2 -0
  457. package/build/esm/lib/traits.js.map +1 -0
  458. package/build/esm/lib/utils.d.ts +2 -2
  459. package/build/esm/lib/utils.d.ts.map +1 -1
  460. package/build/esm/lib/utils.js.map +1 -1
  461. package/package.json +13 -13
@@ -874,12 +874,8 @@ let MultiChannelCCEndPointFindReport = (() => {
874
874
  expectMoreMessages() {
875
875
  return this.reportsToFollow > 0;
876
876
  }
877
- /** @deprecated Use {@link mergePartialCCsAsync} instead */
878
877
  mergePartialCCs(partials, _ctx) {
879
878
  this.foundEndpoints = [...partials, this].map((report) => report.foundEndpoints).reduce((prev, cur) => prev.concat(...cur), []);
880
- }
881
- mergePartialCCsAsync(partials, _ctx) {
882
- this.foundEndpoints = [...partials, this].map((report) => report.foundEndpoints).reduce((prev, cur) => prev.concat(...cur), []);
883
879
  return Promise.resolve();
884
880
  }
885
881
  toLogEntry(ctx) {
@@ -1098,8 +1094,7 @@ let MultiChannelCCCommandEncapsulation = (() => {
1098
1094
  }
1099
1095
  this.destination = options.destination;
1100
1096
  }
1101
- /** @deprecated Use {@link fromAsync} instead */
1102
- static from(raw, ctx) {
1097
+ static async from(raw, ctx) {
1103
1098
  (0, import_safe.validatePayload)(raw.payload.length >= 2);
1104
1099
  let endpointIndex;
1105
1100
  let destination;
@@ -1114,30 +1109,7 @@ let MultiChannelCCCommandEncapsulation = (() => {
1114
1109
  destination = (0, import_safe.parseBitMask)(import_safe2.Bytes.from([destination]));
1115
1110
  }
1116
1111
  }
1117
- const encapsulated = import_CommandClass.CommandClass.parse(raw.payload.subarray(2), ctx);
1118
- return new this({
1119
- nodeId: ctx.sourceNodeId,
1120
- endpointIndex,
1121
- destination,
1122
- encapsulated
1123
- });
1124
- }
1125
- static async fromAsync(raw, ctx) {
1126
- (0, import_safe.validatePayload)(raw.payload.length >= 2);
1127
- let endpointIndex;
1128
- let destination;
1129
- if (ctx.getDeviceConfig?.(ctx.sourceNodeId)?.compat?.treatDestinationEndpointAsSource) {
1130
- endpointIndex = raw.payload[1] & 127;
1131
- destination = 0;
1132
- } else {
1133
- endpointIndex = raw.payload[0] & 127;
1134
- const isBitMask = !!(raw.payload[1] & 128);
1135
- destination = raw.payload[1] & 127;
1136
- if (isBitMask) {
1137
- destination = (0, import_safe.parseBitMask)(import_safe2.Bytes.from([destination]));
1138
- }
1139
- }
1140
- const encapsulated = await import_CommandClass.CommandClass.parseAsync(raw.payload.subarray(2), ctx);
1112
+ const encapsulated = await import_CommandClass.CommandClass.parse(raw.payload.subarray(2), ctx);
1141
1113
  return new this({
1142
1114
  nodeId: ctx.sourceNodeId,
1143
1115
  endpointIndex,
@@ -1148,8 +1120,7 @@ let MultiChannelCCCommandEncapsulation = (() => {
1148
1120
  encapsulated;
1149
1121
  /** The destination end point (0-127) or an array of destination end points (1-7) */
1150
1122
  destination;
1151
- /** @deprecated Use {@link serializeAsync} instead */
1152
- serialize(ctx) {
1123
+ async serialize(ctx) {
1153
1124
  if (ctx.getDeviceConfig?.(this.nodeId)?.compat?.treatDestinationEndpointAsSource) {
1154
1125
  if (typeof this.destination === "number") {
1155
1126
  this.endpointIndex = this.destination;
@@ -1158,24 +1129,10 @@ let MultiChannelCCCommandEncapsulation = (() => {
1158
1129
  const destination = typeof this.destination === "number" ? this.destination & 127 : (0, import_safe.encodeBitMask)(this.destination, 7)[0] | 128;
1159
1130
  this.payload = import_safe2.Bytes.concat([
1160
1131
  import_safe2.Bytes.from([this.endpointIndex & 127, destination]),
1161
- // eslint-disable-next-line @typescript-eslint/no-deprecated
1162
- this.encapsulated.serialize(ctx)
1132
+ await this.encapsulated.serialize(ctx)
1163
1133
  ]);
1164
1134
  return super.serialize(ctx);
1165
1135
  }
1166
- async serializeAsync(ctx) {
1167
- if (ctx.getDeviceConfig?.(this.nodeId)?.compat?.treatDestinationEndpointAsSource) {
1168
- if (typeof this.destination === "number") {
1169
- this.endpointIndex = this.destination;
1170
- }
1171
- }
1172
- const destination = typeof this.destination === "number" ? this.destination & 127 : (0, import_safe.encodeBitMask)(this.destination, 7)[0] | 128;
1173
- this.payload = import_safe2.Bytes.concat([
1174
- import_safe2.Bytes.from([this.endpointIndex & 127, destination]),
1175
- await this.encapsulated.serializeAsync(ctx)
1176
- ]);
1177
- return super.serializeAsync(ctx);
1178
- }
1179
1136
  toLogEntry(ctx) {
1180
1137
  return {
1181
1138
  ...super.toLogEntry(ctx),
@@ -1323,23 +1280,11 @@ let MultiChannelCCV1CommandEncapsulation = (() => {
1323
1280
  this.encapsulated = options.encapsulated;
1324
1281
  this.endpointIndex = this.encapsulated.endpointIndex;
1325
1282
  }
1326
- /** @deprecated Use {@link fromAsync} instead */
1327
- static from(raw, ctx) {
1283
+ static async from(raw, ctx) {
1328
1284
  (0, import_safe.validatePayload)(raw.payload.length >= 1);
1329
1285
  const endpointIndex = raw.payload[0];
1330
1286
  const isV2withV1Header = raw.payload.length >= 2 && raw.payload[1] === 0;
1331
- const encapsulated = import_CommandClass.CommandClass.parse(raw.payload.subarray(isV2withV1Header ? 2 : 1), ctx);
1332
- return new this({
1333
- nodeId: ctx.sourceNodeId,
1334
- endpointIndex,
1335
- encapsulated
1336
- });
1337
- }
1338
- static async fromAsync(raw, ctx) {
1339
- (0, import_safe.validatePayload)(raw.payload.length >= 1);
1340
- const endpointIndex = raw.payload[0];
1341
- const isV2withV1Header = raw.payload.length >= 2 && raw.payload[1] === 0;
1342
- const encapsulated = await import_CommandClass.CommandClass.parseAsync(raw.payload.subarray(isV2withV1Header ? 2 : 1), ctx);
1287
+ const encapsulated = await import_CommandClass.CommandClass.parse(raw.payload.subarray(isV2withV1Header ? 2 : 1), ctx);
1343
1288
  return new this({
1344
1289
  nodeId: ctx.sourceNodeId,
1345
1290
  endpointIndex,
@@ -1347,22 +1292,13 @@ let MultiChannelCCV1CommandEncapsulation = (() => {
1347
1292
  });
1348
1293
  }
1349
1294
  encapsulated;
1350
- /** @deprecated Use {@link serializeAsync} instead */
1351
- serialize(ctx) {
1295
+ async serialize(ctx) {
1352
1296
  this.payload = import_safe2.Bytes.concat([
1353
1297
  import_safe2.Bytes.from([this.endpointIndex]),
1354
- // eslint-disable-next-line @typescript-eslint/no-deprecated
1355
- this.encapsulated.serialize(ctx)
1298
+ await this.encapsulated.serialize(ctx)
1356
1299
  ]);
1357
1300
  return super.serialize(ctx);
1358
1301
  }
1359
- async serializeAsync(ctx) {
1360
- this.payload = import_safe2.Bytes.concat([
1361
- import_safe2.Bytes.from([this.endpointIndex]),
1362
- await this.encapsulated.serializeAsync(ctx)
1363
- ]);
1364
- return super.serializeAsync(ctx);
1365
- }
1366
1302
  computeEncapsulationOverhead() {
1367
1303
  return super.computeEncapsulationOverhead() + 1;
1368
1304
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cc/MultiChannelCC.ts"],
4
- "sourcesContent": ["import {\n\ttype ApplicationNodeInformation,\n\tCommandClasses,\n\ttype GenericDeviceClass,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype SpecificDeviceClass,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeApplicationNodeInformation,\n\tencodeBitMask,\n\tgetCCName,\n\tgetGenericDeviceClass,\n\tgetSpecificDeviceClass,\n\tparseApplicationNodeInformation,\n\tparseBitMask,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetValueDB,\n} from \"@zwave-js/host/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { CCAPI } from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\tgetEffectiveCCVersion,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n} from \"../lib/CommandClassDecorators.js\";\nimport {\n\tisEncapsulatingCommandClass,\n\tisMultiEncapsulatingCommandClass,\n} from \"../lib/EncapsulatingCommandClass.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MultiChannelCommand } from \"../lib/_Types.js\";\n\n// TODO: Handle removal reports of dynamic endpoints\n\nexport const MultiChannelCCValues = Object.freeze({\n\t...V.defineStaticCCValues(CommandClasses[\"Multi Channel\"], {\n\t\t...V.staticProperty(\"endpointIndizes\", undefined, {\n\t\t\tinternal: true,\n\t\t\tsupportsEndpoints: false,\n\t\t}),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"individualEndpointCount\",\n\t\t\t\"individualCount\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinternal: true,\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"aggregatedEndpointCount\",\n\t\t\t\"aggregatedCount\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinternal: true,\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"endpointCountIsDynamic\",\n\t\t\t\"countIsDynamic\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinternal: true,\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"endpointsHaveIdenticalCapabilities\",\n\t\t\t\"identicalCapabilities\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinternal: true,\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"endpointCCs\",\n\t\t\t\"commandClasses\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"endpointDeviceClass\",\n\t\t\t\"deviceClass\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\t}),\n\n\t...V.defineDynamicCCValues(CommandClasses[\"Multi Channel\"], {\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"aggregatedEndpointMembers\",\n\t\t\t\"members\",\n\t\t\t(endpointIndex: number) => endpointIndex,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"members\" && typeof propertyKey === \"number\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\t}),\n});\n\n// @noSetValueAPI\n\n/**\n * Many devices unnecessarily use endpoints when they could (or do) provide all functionality via the root device.\n * This function gives an estimate if this is the case (i.e. all endpoints have a different device class)\n */\nfunction areEndpointsUnnecessary(\n\tctx: GetValueDB,\n\tnodeId: number,\n\tendpointIndizes: number[],\n): boolean {\n\t// Gather all device classes\n\tconst deviceClasses = new Map<\n\t\tnumber,\n\t\t{\n\t\t\tgeneric: number;\n\t\t\tspecific: number;\n\t\t}\n\t>();\n\tfor (const endpoint of endpointIndizes) {\n\t\tconst devClassValueId = MultiChannelCCValues.endpointDeviceClass\n\t\t\t.endpoint(endpoint);\n\t\tconst deviceClass = ctx.getValueDB(nodeId).getValue<{\n\t\t\tgeneric: number;\n\t\t\tspecific: number;\n\t\t}>(devClassValueId);\n\t\tif (deviceClass) {\n\t\t\tdeviceClasses.set(endpoint, {\n\t\t\t\tgeneric: deviceClass.generic,\n\t\t\t\tspecific: deviceClass.specific,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Endpoints may be useless if all of them have different device classes\n\tconst distinctDeviceClasses = distinct(\n\t\t[...deviceClasses.values()].map(\n\t\t\t({ generic, specific }) => generic * 256 + specific,\n\t\t),\n\t);\n\tif (distinctDeviceClasses.length !== endpointIndizes.length) {\n\t\t// There are endpoints with the same device class, so they are not unnecessary\n\t\treturn false;\n\t}\n\n\t// Endpoints are necessary if more than 1 of them has a switch-type device class\n\tconst switchTypeDeviceClasses = [\n\t\t0x10, // Binary Switch\n\t\t0x11, // Multilevel Switch\n\t\t0x12, // Remote Switch\n\t\t0x13, // Toggle Switch\n\t];\n\tconst numSwitchEndpoints = [...deviceClasses.values()].filter(\n\t\t({ generic }) => switchTypeDeviceClasses.includes(generic),\n\t).length;\n\tif (numSwitchEndpoints > 1) return false;\n\n\treturn true;\n}\n\n@API(CommandClasses[\"Multi Channel\"])\nexport class MultiChannelCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: MultiChannelCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\t// Legacy commands:\n\t\t\tcase MultiChannelCommand.GetV1:\n\t\t\t\treturn this.isSinglecast() && this.version === 1;\n\t\t\tcase MultiChannelCommand.CommandEncapsulationV1:\n\t\t\t\treturn this.version === 1;\n\n\t\t\t// The specs start at version 3 but according to OZW,\n\t\t\t// these do seem to be supported in version 2\n\t\t\tcase MultiChannelCommand.EndPointGet:\n\t\t\tcase MultiChannelCommand.CapabilityGet:\n\t\t\t\treturn this.version >= 2 && this.isSinglecast();\n\t\t\tcase MultiChannelCommand.CommandEncapsulation:\n\t\t\t\treturn this.version >= 2;\n\t\t\tcase MultiChannelCommand.EndPointFind:\n\t\t\t\treturn this.version >= 3 && this.isSinglecast();\n\t\t\tcase MultiChannelCommand.AggregatedMembersGet:\n\t\t\t\treturn this.version >= 4 && this.isSinglecast();\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getEndpoints() {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.EndPointGet,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCEndPointGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCEndPointReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn {\n\t\t\t\tisDynamicEndpointCount: response.countIsDynamic,\n\t\t\t\tidenticalCapabilities: response.identicalCapabilities,\n\t\t\t\tindividualEndpointCount: response.individualCount,\n\t\t\t\taggregatedEndpointCount: response.aggregatedCount,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async getEndpointCapabilities(\n\t\tendpoint: number,\n\t): Promise<MaybeNotKnown<EndpointCapability>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.CapabilityGet,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCCapabilityGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\trequestedEndpoint: endpoint,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCCapabilityReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\tconst generic = getGenericDeviceClass(\n\t\t\t\tresponse.genericDeviceClass,\n\t\t\t);\n\t\t\tconst specific = getSpecificDeviceClass(\n\t\t\t\tresponse.genericDeviceClass,\n\t\t\t\tresponse.specificDeviceClass,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tisDynamic: response.isDynamic,\n\t\t\t\twasRemoved: response.wasRemoved,\n\t\t\t\tsupportedCCs: response.supportedCCs,\n\t\t\t\tgeneric,\n\t\t\t\tspecific,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async findEndpoints(\n\t\tgenericClass: number,\n\t\tspecificClass: number,\n\t): Promise<MaybeNotKnown<readonly number[]>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.EndPointFind,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCEndPointFind({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tgenericClass,\n\t\t\tspecificClass,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCEndPointFindReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.foundEndpoints;\n\t}\n\n\t@validateArgs()\n\tpublic async getAggregatedMembers(\n\t\tendpoint: number,\n\t): Promise<MaybeNotKnown<readonly number[]>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.AggregatedMembersGet,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCAggregatedMembersGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\trequestedEndpoint: endpoint,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCAggregatedMembersReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.members;\n\t}\n\n\t// Encapsulation is used internally and too frequently that we\n\t// want to pay the cost of validating each call\n\t// eslint-disable-next-line @zwave-js/ccapi-validate-args\n\tpublic async sendEncapsulated(\n\t\toptions: MultiChannelCCCommandEncapsulationOptions,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.CommandEncapsulation,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCCommandEncapsulation({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\t...options,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async getEndpointCountV1(\n\t\tccId: CommandClasses,\n\t): Promise<MaybeNotKnown<number>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.GetV1,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCV1Get({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\trequestedCC: ccId,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCV1Report\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.endpointCount;\n\t}\n\n\t// Encapsulation is used internally and too frequently that we\n\t// want to pay the cost of validating each call\n\t// eslint-disable-next-line @zwave-js/ccapi-validate-args\n\tpublic async sendEncapsulatedV1(encapsulated: CommandClass): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.CommandEncapsulationV1,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCV1CommandEncapsulation({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tencapsulated,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n}\n\nexport interface EndpointCapability {\n\tgeneric: GenericDeviceClass;\n\tspecific: SpecificDeviceClass;\n\tsupportedCCs: CommandClasses[];\n\tisDynamic: boolean;\n\twasRemoved: boolean;\n}\n\n@commandClass(CommandClasses[\"Multi Channel\"])\n@implementedVersion(4)\n@ccValues(MultiChannelCCValues)\nexport class MultiChannelCC extends CommandClass {\n\tdeclare ccCommand: MultiChannelCommand;\n\n\t/** Tests if a command targets a specific endpoint and thus requires encapsulation */\n\tpublic static requiresEncapsulation(cc: CommandClass): boolean {\n\t\treturn (\n\t\t\tcc.endpointIndex !== 0\n\t\t\t&& !(cc instanceof MultiChannelCCCommandEncapsulation)\n\t\t\t&& !(cc instanceof MultiChannelCCV1CommandEncapsulation)\n\t\t);\n\t}\n\n\t/** Encapsulates a command that targets a specific endpoint, with version 2+ of the Multi Channel CC */\n\tpublic static encapsulate(\n\t\tcc: CommandClass,\n\t): MultiChannelCCCommandEncapsulation {\n\t\tconst ret = new MultiChannelCCCommandEncapsulation({\n\t\t\tnodeId: cc.nodeId,\n\t\t\tencapsulated: cc,\n\t\t\tdestination: cc.endpointIndex,\n\t\t});\n\n\t\t// Copy the encapsulation flags from the encapsulated command\n\t\tret.encapsulationFlags = cc.encapsulationFlags;\n\n\t\treturn ret;\n\t}\n\n\t/** Encapsulates a command that targets a specific endpoint, with version 1 of the Multi Channel CC */\n\tpublic static encapsulateV1(\n\t\tcc: CommandClass,\n\t): MultiChannelCCV1CommandEncapsulation {\n\t\tconst ret = new MultiChannelCCV1CommandEncapsulation({\n\t\t\tnodeId: cc.nodeId,\n\t\t\tencapsulated: cc,\n\t\t});\n\n\t\t// Copy the encapsulation flags from the encapsulated command\n\t\tret.encapsulationFlags = cc.encapsulationFlags;\n\n\t\treturn ret;\n\t}\n\n\tpublic skipEndpointInterview(): boolean {\n\t\t// The endpoints are discovered by querying the root device\n\t\treturn true;\n\t}\n\n\tpublic async interview(ctx: InterviewContext): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\tconst removeEndpoints = ctx.getDeviceConfig?.(node.id)?.compat\n\t\t\t?.removeEndpoints;\n\t\tif (removeEndpoints === \"*\") {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`Skipping ${this.ccName} interview b/c all endpoints are ignored by the device config file...`,\n\t\t\t\tdirection: \"none\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\t// Special interview procedure for legacy nodes\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\t\tif (ccVersion === 1) return this.interviewV1(ctx);\n\n\t\tconst endpoint = node.getEndpoint(this.endpointIndex)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multi Channel\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\t// Step 1: Retrieve general information about end points\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: \"querying device endpoint information...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst multiResponse = await api.getEndpoints();\n\t\tif (!multiResponse) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t\"Querying device endpoint information timed out, aborting interview...\",\n\t\t\t\tlevel: \"warn\",\n\t\t\t});\n\t\t\treturn this.throwMissingCriticalInterviewResponse();\n\t\t}\n\n\t\tlet logMessage = `received response for device endpoints:\nendpoint count (individual): ${multiResponse.individualEndpointCount}\ncount is dynamic: ${multiResponse.isDynamicEndpointCount}\nidentical capabilities: ${multiResponse.identicalCapabilities}`;\n\t\tif (multiResponse.aggregatedEndpointCount != undefined) {\n\t\t\tlogMessage +=\n\t\t\t\t`\\nendpoint count (aggregated): ${multiResponse.aggregatedEndpointCount}`;\n\t\t}\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: logMessage,\n\t\t\tdirection: \"inbound\",\n\t\t});\n\n\t\tlet allEndpoints: number[] = [];\n\t\tconst addSequentialEndpoints = (): void => {\n\t\t\tfor (\n\t\t\t\tlet i = 1;\n\t\t\t\ti\n\t\t\t\t\t<= multiResponse.individualEndpointCount\n\t\t\t\t\t\t+ (multiResponse.aggregatedEndpointCount ?? 0);\n\t\t\t\ti++\n\t\t\t) {\n\t\t\t\tallEndpoints.push(i);\n\t\t\t}\n\t\t};\n\t\tif (api.supportsCommand(MultiChannelCommand.EndPointFind)) {\n\t\t\t// Step 2a: Find all endpoints\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"querying all endpoints...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\n\t\t\tconst foundEndpoints = await api.findEndpoints(0xff, 0xff);\n\t\t\tif (foundEndpoints) allEndpoints.push(...foundEndpoints);\n\t\t\tif (!allEndpoints.length) {\n\t\t\t\t// Create a sequential list of endpoints\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Endpoint query returned no results, assuming that endpoints are sequential`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t\taddSequentialEndpoints();\n\t\t\t} else {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `received endpoints: ${\n\t\t\t\t\t\tallEndpoints\n\t\t\t\t\t\t\t.map(String)\n\t\t\t\t\t\t\t.join(\", \")\n\t\t\t\t\t}`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// Step 2b: Assume that the endpoints are in sequential order\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`does not support EndPointFind, assuming that endpoints are sequential`,\n\t\t\t\tdirection: \"none\",\n\t\t\t});\n\t\t\taddSequentialEndpoints();\n\t\t}\n\n\t\t// Step 2.5: remove ignored endpoints\n\t\tif (removeEndpoints?.length) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`The following endpoints are ignored through the config file: ${\n\t\t\t\t\t\tremoveEndpoints.join(\n\t\t\t\t\t\t\t\", \",\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\tdirection: \"none\",\n\t\t\t});\n\t\t\tallEndpoints = allEndpoints.filter(\n\t\t\t\t(e) => !removeEndpoints.includes(e),\n\t\t\t);\n\t\t}\n\n\t\t// Step 3: Query endpoints\n\t\tlet hasQueriedCapabilities = false;\n\t\tfor (const endpoint of allEndpoints) {\n\t\t\tif (\n\t\t\t\tendpoint > multiResponse.individualEndpointCount\n\t\t\t\t&& ccVersion >= 4\n\t\t\t) {\n\t\t\t\t// Find members of aggregated end point\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`querying members of aggregated endpoint #${endpoint}...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tconst members = await api.getAggregatedMembers(endpoint);\n\t\t\t\tif (members) {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`aggregated endpoint #${endpoint} has members ${\n\t\t\t\t\t\t\t\tmembers\n\t\t\t\t\t\t\t\t\t.map(String)\n\t\t\t\t\t\t\t\t\t.join(\", \")\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// When the device reports identical capabilities for all endpoints,\n\t\t\t// we don't need to query them all\n\t\t\tif (multiResponse.identicalCapabilities && hasQueriedCapabilities) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`all endpoints identical, skipping capability query for endpoint #${endpoint}...`,\n\t\t\t\t\tdirection: \"none\",\n\t\t\t\t});\n\n\t\t\t\t// copy the capabilities from the first endpoint\n\t\t\t\tconst devClass = valueDB.getValue(\n\t\t\t\t\tMultiChannelCCValues.endpointDeviceClass.endpoint(\n\t\t\t\t\t\tallEndpoints[0],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tvalueDB.setValue(\n\t\t\t\t\tMultiChannelCCValues.endpointDeviceClass.endpoint(endpoint),\n\t\t\t\t\tdevClass,\n\t\t\t\t);\n\t\t\t\tconst ep1Caps = valueDB.getValue<CommandClasses[]>(\n\t\t\t\t\tMultiChannelCCValues.endpointCCs.endpoint(allEndpoints[0]),\n\t\t\t\t)!;\n\t\t\t\tvalueDB.setValue(\n\t\t\t\t\tMultiChannelCCValues.endpointCCs.endpoint(endpoint),\n\t\t\t\t\t[...ep1Caps],\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: `querying capabilities for endpoint #${endpoint}...`,\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst caps = await api.getEndpointCapabilities(endpoint);\n\t\t\tif (caps) {\n\t\t\t\thasQueriedCapabilities = true;\n\t\t\t\tlogMessage =\n\t\t\t\t\t`received response for endpoint capabilities (#${endpoint}):\ngeneric device class: ${caps.generic.label}\nspecific device class: ${caps.specific.label}\nis dynamic end point: ${caps.isDynamic}\nsupported CCs:`;\n\t\t\t\tfor (const cc of caps.supportedCCs) {\n\t\t\t\t\tlogMessage += `\\n \u00B7 ${getCCName(cc)}`;\n\t\t\t\t}\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Querying endpoint #${endpoint} capabilities timed out, aborting interview...`,\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t\treturn this.throwMissingCriticalInterviewResponse();\n\t\t\t}\n\t\t}\n\n\t\t// Now that all endpoints have been interviewed, remember which ones are there\n\t\t// But first figure out if they seem unnecessary and if they do, which ones should be preserved\n\t\tif (\n\t\t\t!multiResponse.identicalCapabilities\n\t\t\t&& areEndpointsUnnecessary(ctx, node.id, allEndpoints)\n\t\t) {\n\t\t\tconst preserve = ctx.getDeviceConfig?.(node.id)?.compat\n\t\t\t\t?.preserveEndpoints;\n\t\t\tif (!preserve) {\n\t\t\t\tallEndpoints = [];\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Endpoints seem unnecessary b/c they have different device classes, ignoring all...`,\n\t\t\t\t});\n\t\t\t} else if (preserve === \"*\") {\n\t\t\t\t// preserve all endpoints, do nothing\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Endpoints seem unnecessary, but are configured to be preserved.`,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tallEndpoints = allEndpoints.filter((ep) =>\n\t\t\t\t\tpreserve.includes(ep)\n\t\t\t\t);\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tmessage: `Endpoints seem unnecessary, but endpoints ${\n\t\t\t\t\t\tallEndpoints.join(\n\t\t\t\t\t\t\t\", \",\n\t\t\t\t\t\t)\n\t\t\t\t\t} are configured to be preserved.`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.endpointIndizes,\n\t\t\tallEndpoints,\n\t\t);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tprivate async interviewV1(ctx: InterviewContext): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multi Channel\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t);\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\t// V1 works the opposite way - we scan all CCs and remember how many\n\t\t// endpoints they have\n\t\tconst supportedCCs = [...node.getCCs()]\n\t\t\t// Don't query CCs the node only controls\n\t\t\t.filter(([, info]) => info.isSupported)\n\t\t\t.map(([cc]) => cc)\n\t\t\t// Don't query CCs that want to skip the endpoint interview\n\t\t\t.filter(\n\t\t\t\t(cc) =>\n\t\t\t\t\t!CommandClass.createInstanceUnchecked(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tcc,\n\t\t\t\t\t)?.skipEndpointInterview(),\n\t\t\t);\n\t\tconst endpointCounts = new Map<CommandClasses, number>();\n\t\tfor (const ccId of supportedCCs) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tmessage: `Querying endpoint count for CommandClass ${\n\t\t\t\t\tgetCCName(\n\t\t\t\t\t\tccId,\n\t\t\t\t\t)\n\t\t\t\t}...`,\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst endpointCount = await api.getEndpointCountV1(ccId);\n\t\t\tif (endpointCount != undefined) {\n\t\t\t\tendpointCounts.set(ccId, endpointCount);\n\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tmessage: `CommandClass ${\n\t\t\t\t\t\tgetCCName(\n\t\t\t\t\t\t\tccId,\n\t\t\t\t\t\t)\n\t\t\t\t\t} has ${endpointCount} endpoints`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Store the collected information\n\t\t// We have only individual and no dynamic and no aggregated endpoints\n\t\tconst numEndpoints = Math.max(...endpointCounts.values());\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.endpointCountIsDynamic,\n\t\t\tfalse,\n\t\t);\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.aggregatedEndpointCount,\n\t\t\t0,\n\t\t);\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.individualEndpointCount,\n\t\t\tnumEndpoints,\n\t\t);\n\t\t// Since we queried all CCs separately, we can assume that all\n\t\t// endpoints have different capabilities\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.endpointsHaveIdenticalCapabilities,\n\t\t\tfalse,\n\t\t);\n\n\t\tfor (let endpoint = 1; endpoint <= numEndpoints; endpoint++) {\n\t\t\t// Check which CCs exist on this endpoint\n\t\t\tconst endpointCCs = [...endpointCounts.entries()]\n\t\t\t\t.filter(([, ccEndpoints]) => ccEndpoints >= endpoint)\n\t\t\t\t.map(([ccId]) => ccId);\n\t\t\t// And store it per endpoint\n\t\t\tvalueDB.setValue(\n\t\t\t\tMultiChannelCCValues.endpointCCs.endpoint(endpoint),\n\t\t\t\tendpointCCs,\n\t\t\t);\n\t\t}\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCEndPointReportOptions {\n\tcountIsDynamic: boolean;\n\tidenticalCapabilities: boolean;\n\tindividualCount: number;\n\taggregatedCount?: number;\n}\n\n@CCCommand(MultiChannelCommand.EndPointReport)\n@ccValueProperty(\"countIsDynamic\", MultiChannelCCValues.endpointCountIsDynamic)\n@ccValueProperty(\n\t\"identicalCapabilities\",\n\tMultiChannelCCValues.endpointsHaveIdenticalCapabilities,\n)\n@ccValueProperty(\n\t\"individualCount\",\n\tMultiChannelCCValues.individualEndpointCount,\n)\n@ccValueProperty(\n\t\"aggregatedCount\",\n\tMultiChannelCCValues.aggregatedEndpointCount,\n)\nexport class MultiChannelCCEndPointReport extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCEndPointReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.countIsDynamic = options.countIsDynamic;\n\t\tthis.identicalCapabilities = options.identicalCapabilities;\n\t\tthis.individualCount = options.individualCount;\n\t\tthis.aggregatedCount = options.aggregatedCount;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCEndPointReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst countIsDynamic = !!(raw.payload[0] & 0b10000000);\n\t\tconst identicalCapabilities = !!(raw.payload[0] & 0b01000000);\n\t\tconst individualCount = raw.payload[1] & 0b01111111;\n\t\tlet aggregatedCount: MaybeNotKnown<number>;\n\n\t\tif (raw.payload.length >= 3) {\n\t\t\taggregatedCount = raw.payload[2] & 0b01111111;\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tcountIsDynamic,\n\t\t\tidenticalCapabilities,\n\t\t\tindividualCount,\n\t\t\taggregatedCount,\n\t\t});\n\t}\n\n\tpublic countIsDynamic: boolean;\n\n\tpublic identicalCapabilities: boolean;\n\n\tpublic individualCount: number;\n\n\tpublic aggregatedCount: MaybeNotKnown<number>;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([\n\t\t\t(this.countIsDynamic ? 0b10000000 : 0)\n\t\t\t| (this.identicalCapabilities ? 0b01000000 : 0),\n\t\t\tthis.individualCount & 0b01111111,\n\t\t\tthis.aggregatedCount ?? 0,\n\t\t]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\t\"endpoint count (individual)\": this.individualCount,\n\t\t\t\"count is dynamic\": this.countIsDynamic,\n\t\t\t\"identical capabilities\": this.identicalCapabilities,\n\t\t};\n\t\tif (this.aggregatedCount != undefined) {\n\t\t\tmessage[\"endpoint count (aggregated)\"] = this.aggregatedCount;\n\t\t}\n\t\tconst ret = {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t\treturn ret;\n\t}\n}\n\n@CCCommand(MultiChannelCommand.EndPointGet)\n@expectedCCResponse(MultiChannelCCEndPointReport)\nexport class MultiChannelCCEndPointGet extends MultiChannelCC {}\n\n// @publicAPI\nexport interface MultiChannelCCCapabilityReportOptions {\n\tendpointIndex: number;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass: number;\n\tsupportedCCs: CommandClasses[];\n\tisDynamic: boolean;\n\twasRemoved: boolean;\n}\n\n@CCCommand(MultiChannelCommand.CapabilityReport)\nexport class MultiChannelCCCapabilityReport extends MultiChannelCC\n\timplements ApplicationNodeInformation\n{\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCCapabilityReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.endpointIndex = options.endpointIndex;\n\t\tthis.genericDeviceClass = options.genericDeviceClass;\n\t\tthis.specificDeviceClass = options.specificDeviceClass;\n\t\tthis.supportedCCs = options.supportedCCs;\n\t\tthis.isDynamic = options.isDynamic;\n\t\tthis.wasRemoved = options.wasRemoved;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCCapabilityReport {\n\t\t// Only validate the bytes we expect to see here\n\t\t// parseApplicationNodeInformation does its own validation\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst endpointIndex = raw.payload[0] & 0b01111111;\n\t\tconst isDynamic = !!(raw.payload[0] & 0b10000000);\n\t\tconst NIF = parseApplicationNodeInformation(\n\t\t\traw.payload.subarray(1),\n\t\t);\n\t\tconst genericDeviceClass = NIF.genericDeviceClass;\n\t\tconst specificDeviceClass = NIF.specificDeviceClass;\n\t\tconst supportedCCs: CommandClasses[] = NIF.supportedCCs;\n\n\t\t// Removal reports have very specific information\n\t\tconst wasRemoved: boolean = isDynamic\n\t\t\t&& genericDeviceClass === 0xff // \"Non-Interoperable\"\n\t\t\t&& specificDeviceClass === 0x00;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tendpointIndex,\n\t\t\tisDynamic,\n\t\t\tgenericDeviceClass,\n\t\t\tspecificDeviceClass,\n\t\t\tsupportedCCs,\n\t\t\twasRemoved,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tconst deviceClassValue = MultiChannelCCValues.endpointDeviceClass;\n\t\tconst ccsValue = MultiChannelCCValues.endpointCCs;\n\n\t\tif (this.wasRemoved) {\n\t\t\tthis.removeValue(ctx, deviceClassValue);\n\t\t\tthis.removeValue(ctx, ccsValue);\n\t\t} else {\n\t\t\tthis.setValue(ctx, deviceClassValue, {\n\t\t\t\tgeneric: this.genericDeviceClass,\n\t\t\t\tspecific: this.specificDeviceClass,\n\t\t\t});\n\t\t\tthis.setValue(ctx, ccsValue, this.supportedCCs);\n\t\t}\n\t\treturn true;\n\t}\n\n\t// The endpoint index must be overridden to be able to attribute the information to the correct endpoint\n\tpublic readonly genericDeviceClass: number;\n\tpublic readonly specificDeviceClass: number;\n\tpublic readonly supportedCCs: CommandClasses[];\n\tpublic readonly isDynamic: boolean;\n\tpublic readonly wasRemoved: boolean;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([\n\t\t\t\t(this.endpointIndex & 0b01111111)\n\t\t\t\t| (this.isDynamic ? 0b10000000 : 0),\n\t\t\t]),\n\t\t\tencodeApplicationNodeInformation(this),\n\t\t]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"endpoint index\": this.endpointIndex,\n\t\t\t\t\"generic device class\": getGenericDeviceClass(\n\t\t\t\t\tthis.genericDeviceClass,\n\t\t\t\t).label,\n\t\t\t\t\"specific device class\": getSpecificDeviceClass(\n\t\t\t\t\tthis.genericDeviceClass,\n\t\t\t\t\tthis.specificDeviceClass,\n\t\t\t\t).label,\n\t\t\t\t\"is dynamic end point\": this.isDynamic,\n\t\t\t\t\"supported CCs\": this.supportedCCs\n\t\t\t\t\t.map((cc) => `\\n\u00B7 ${getCCName(cc)}`)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCCapabilityGetOptions {\n\trequestedEndpoint: number;\n}\n\nfunction testResponseForMultiChannelCapabilityGet(\n\tsent: MultiChannelCCCapabilityGet,\n\treceived: MultiChannelCCCapabilityReport,\n) {\n\treturn received.endpointIndex === sent.requestedEndpoint;\n}\n\n@CCCommand(MultiChannelCommand.CapabilityGet)\n@expectedCCResponse(\n\tMultiChannelCCCapabilityReport,\n\ttestResponseForMultiChannelCapabilityGet,\n)\nexport class MultiChannelCCCapabilityGet extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCCapabilityGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.requestedEndpoint = options.requestedEndpoint;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCCapabilityGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst requestedEndpoint = raw.payload[0] & 0b01111111;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\trequestedEndpoint,\n\t\t});\n\t}\n\n\tpublic requestedEndpoint: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([this.requestedEndpoint & 0b01111111]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { endpoint: this.requestedEndpoint },\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCEndPointFindReportOptions {\n\tgenericClass: number;\n\tspecificClass: number;\n\tfoundEndpoints: number[];\n\treportsToFollow: number;\n}\n\n@CCCommand(MultiChannelCommand.EndPointFindReport)\nexport class MultiChannelCCEndPointFindReport extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCEndPointFindReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.genericClass = options.genericClass;\n\t\tthis.specificClass = options.specificClass;\n\t\tthis.foundEndpoints = options.foundEndpoints;\n\t\tthis.reportsToFollow = options.reportsToFollow;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCEndPointFindReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst reportsToFollow = raw.payload[0];\n\t\tconst genericClass = raw.payload[1];\n\t\tconst specificClass = raw.payload[2];\n\n\t\t// Some devices omit the endpoint list although that is not allowed in the specs\n\t\t// therefore don't validatePayload here.\n\t\tconst foundEndpoints = [...raw.payload.subarray(3)]\n\t\t\t.map((e) => e & 0b01111111)\n\t\t\t.filter((e) => e !== 0);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\treportsToFollow,\n\t\t\tgenericClass,\n\t\t\tspecificClass,\n\t\t\tfoundEndpoints,\n\t\t});\n\t}\n\n\tpublic genericClass: number;\n\tpublic specificClass: number;\n\tpublic foundEndpoints: number[];\n\tpublic reportsToFollow: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([\n\t\t\t\tthis.reportsToFollow,\n\t\t\t\tthis.genericClass,\n\t\t\t\tthis.specificClass,\n\t\t\t]),\n\t\t\tBytes.from(this.foundEndpoints.map((e) => e & 0b01111111)),\n\t\t]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic getPartialCCSessionId(): Record<string, any> | undefined {\n\t\t// Distinguish sessions by the requested device classes\n\t\treturn {\n\t\t\tgenericClass: this.genericClass,\n\t\t\tspecificClass: this.specificClass,\n\t\t};\n\t}\n\n\tpublic expectMoreMessages(): boolean {\n\t\treturn this.reportsToFollow > 0;\n\t}\n\n\t/** @deprecated Use {@link mergePartialCCsAsync} instead */\n\tpublic mergePartialCCs(\n\t\tpartials: MultiChannelCCEndPointFindReport[],\n\t\t_ctx: CCParsingContext,\n\t): void {\n\t\t// Concat the list of end points\n\t\tthis.foundEndpoints = [...partials, this]\n\t\t\t.map((report) => report.foundEndpoints)\n\t\t\t.reduce((prev, cur) => prev.concat(...cur), []);\n\t}\n\n\tpublic mergePartialCCsAsync(\n\t\tpartials: MultiChannelCCEndPointFindReport[],\n\t\t_ctx: CCParsingContext,\n\t): Promise<void> {\n\t\t// Concat the list of end points\n\t\tthis.foundEndpoints = [...partials, this]\n\t\t\t.map((report) => report.foundEndpoints)\n\t\t\t.reduce((prev, cur) => prev.concat(...cur), []);\n\t\treturn Promise.resolve();\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"generic device class\": getGenericDeviceClass(\n\t\t\t\t\tthis.genericClass,\n\t\t\t\t).label,\n\t\t\t\t\"specific device class\": getSpecificDeviceClass(\n\t\t\t\t\tthis.genericClass,\n\t\t\t\t\tthis.specificClass,\n\t\t\t\t).label,\n\t\t\t\t\"found endpoints\": this.foundEndpoints.join(\", \"),\n\t\t\t\t\"# of reports to follow\": this.reportsToFollow,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCEndPointFindOptions {\n\tgenericClass: number;\n\tspecificClass: number;\n}\n\n@CCCommand(MultiChannelCommand.EndPointFind)\n@expectedCCResponse(MultiChannelCCEndPointFindReport)\nexport class MultiChannelCCEndPointFind extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCEndPointFindOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.genericClass = options.genericClass;\n\t\tthis.specificClass = options.specificClass;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCEndPointFind {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst genericClass = raw.payload[0];\n\t\tconst specificClass = raw.payload[1];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tgenericClass,\n\t\t\tspecificClass,\n\t\t});\n\t}\n\n\tpublic genericClass: number;\n\tpublic specificClass: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([this.genericClass, this.specificClass]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"generic device class\":\n\t\t\t\t\tgetGenericDeviceClass(this.genericClass).label,\n\t\t\t\t\"specific device class\": getSpecificDeviceClass(\n\t\t\t\t\tthis.genericClass,\n\t\t\t\t\tthis.specificClass,\n\t\t\t\t).label,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCAggregatedMembersReportOptions {\n\taggregatedEndpointIndex: number;\n\tmembers: number[];\n}\n\n@CCCommand(MultiChannelCommand.AggregatedMembersReport)\n@ccValueProperty(\n\t\"members\",\n\tMultiChannelCCValues.aggregatedEndpointMembers,\n\t(self) => [self.aggregatedEndpointIndex],\n)\nexport class MultiChannelCCAggregatedMembersReport extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCAggregatedMembersReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\t// TODO: Check implementation:\n\t\tthis.aggregatedEndpointIndex = options.aggregatedEndpointIndex;\n\t\tthis.members = options.members;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCAggregatedMembersReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst aggregatedEndpointIndex = raw.payload[0] & 0b0111_1111;\n\t\tconst bitMaskLength = raw.payload[1];\n\t\tvalidatePayload(raw.payload.length >= 2 + bitMaskLength);\n\t\tconst bitMask = raw.payload.subarray(2, 2 + bitMaskLength);\n\t\tconst members = parseBitMask(bitMask);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\taggregatedEndpointIndex,\n\t\t\tmembers,\n\t\t});\n\t}\n\n\tpublic readonly aggregatedEndpointIndex: number;\n\n\tpublic readonly members: readonly number[];\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"aggregated endpoint\": this.aggregatedEndpointIndex,\n\t\t\t\tmembers: this.members.join(\", \"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCAggregatedMembersGetOptions {\n\trequestedEndpoint: number;\n}\n\n@CCCommand(MultiChannelCommand.AggregatedMembersGet)\n@expectedCCResponse(MultiChannelCCAggregatedMembersReport)\nexport class MultiChannelCCAggregatedMembersGet extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCAggregatedMembersGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.requestedEndpoint = options.requestedEndpoint;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): MultiChannelCCAggregatedMembersGet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new MultiChannelCCAggregatedMembersGet({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic requestedEndpoint: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([this.requestedEndpoint & 0b0111_1111]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { endpoint: this.requestedEndpoint },\n\t\t};\n\t}\n}\n\ntype MultiChannelCCDestination = number | (1 | 2 | 3 | 4 | 5 | 6 | 7)[];\n\n// @publicAPI\nexport interface MultiChannelCCCommandEncapsulationOptions {\n\tencapsulated: CommandClass;\n\tdestination: MultiChannelCCDestination;\n}\n\n// SDS13783: A receiving node MAY respond to a Multi Channel encapsulated command if the Destination\n// End Point field specifies a single End Point. In that case, the response MUST be Multi Channel\n// encapsulated.\n// A receiving node MUST NOT respond to a Multi Channel encapsulated command if the\n// Destination End Point field specifies multiple End Points via bit mask addressing.\n\nfunction getCCResponseForCommandEncapsulation(\n\tsent: MultiChannelCCCommandEncapsulation,\n) {\n\tif (\n\t\ttypeof sent.destination === \"number\"\n\t\t&& sent.encapsulated.expectsCCResponse()\n\t) {\n\t\t// Allow both versions of the encapsulation command\n\t\t// Our implementation check is a bit too strict, so change the return type\n\t\treturn [\n\t\t\tMultiChannelCCCommandEncapsulation,\n\t\t\tMultiChannelCCV1CommandEncapsulation,\n\t\t] as any as (typeof MultiChannelCCCommandEncapsulation)[];\n\t}\n}\n\nfunction testResponseForCommandEncapsulation(\n\tsent: MultiChannelCCCommandEncapsulation,\n\treceived:\n\t\t| MultiChannelCCCommandEncapsulation\n\t\t| MultiChannelCCV1CommandEncapsulation,\n) {\n\tif (\n\t\ttypeof sent.destination === \"number\"\n\t\t&& sent.destination === received.endpointIndex\n\t) {\n\t\treturn \"checkEncapsulated\";\n\t}\n\treturn false;\n}\n\n@CCCommand(MultiChannelCommand.CommandEncapsulation)\n@expectedCCResponse(\n\tgetCCResponseForCommandEncapsulation,\n\ttestResponseForCommandEncapsulation,\n)\nexport class MultiChannelCCCommandEncapsulation extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCCommandEncapsulationOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.encapsulated = options.encapsulated;\n\t\tthis.encapsulated.encapsulatingCC = this as any;\n\t\t// Propagate the endpoint index all the way down\n\t\tlet cur: CommandClass = this;\n\t\twhile (cur) {\n\t\t\tif (isMultiEncapsulatingCommandClass(cur)) {\n\t\t\t\tfor (const cc of cur.encapsulated) {\n\t\t\t\t\tcc.endpointIndex = this.endpointIndex;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (isEncapsulatingCommandClass(cur)) {\n\t\t\t\tcur.encapsulated.endpointIndex = this.endpointIndex;\n\t\t\t\tcur = cur.encapsulated;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.destination = options.destination;\n\t}\n\n\t/** @deprecated Use {@link fromAsync} instead */\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCCommandEncapsulation {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\n\t\tlet endpointIndex: number;\n\t\tlet destination: MultiChannelCCDestination;\n\n\t\tif (\n\t\t\tctx.getDeviceConfig?.(ctx.sourceNodeId)\n\t\t\t\t?.compat?.treatDestinationEndpointAsSource\n\t\t) {\n\t\t\t// This device incorrectly uses the destination field to indicate the source endpoint\n\t\t\tendpointIndex = raw.payload[1] & 0b0111_1111;\n\t\t\tdestination = 0;\n\t\t} else {\n\t\t\t// Parse normally\n\t\t\tendpointIndex = raw.payload[0] & 0b0111_1111;\n\t\t\tconst isBitMask = !!(raw.payload[1] & 0b1000_0000);\n\t\t\tdestination = raw.payload[1] & 0b0111_1111;\n\t\t\tif (isBitMask) {\n\t\t\t\tdestination = parseBitMask(\n\t\t\t\t\tBytes.from([destination]),\n\t\t\t\t) as any;\n\t\t\t}\n\t\t}\n\t\t// No need to validate further, each CC does it for itself\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\tconst encapsulated = CommandClass.parse(raw.payload.subarray(2), ctx);\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tendpointIndex,\n\t\t\tdestination,\n\t\t\tencapsulated,\n\t\t});\n\t}\n\n\tpublic static async fromAsync(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): Promise<MultiChannelCCCommandEncapsulation> {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\n\t\tlet endpointIndex: number;\n\t\tlet destination: MultiChannelCCDestination;\n\n\t\tif (\n\t\t\tctx.getDeviceConfig?.(ctx.sourceNodeId)\n\t\t\t\t?.compat?.treatDestinationEndpointAsSource\n\t\t) {\n\t\t\t// This device incorrectly uses the destination field to indicate the source endpoint\n\t\t\tendpointIndex = raw.payload[1] & 0b0111_1111;\n\t\t\tdestination = 0;\n\t\t} else {\n\t\t\t// Parse normally\n\t\t\tendpointIndex = raw.payload[0] & 0b0111_1111;\n\t\t\tconst isBitMask = !!(raw.payload[1] & 0b1000_0000);\n\t\t\tdestination = raw.payload[1] & 0b0111_1111;\n\t\t\tif (isBitMask) {\n\t\t\t\tdestination = parseBitMask(\n\t\t\t\t\tBytes.from([destination]),\n\t\t\t\t) as any;\n\t\t\t}\n\t\t}\n\t\t// No need to validate further, each CC does it for itself\n\t\tconst encapsulated = await CommandClass.parseAsync(\n\t\t\traw.payload.subarray(2),\n\t\t\tctx,\n\t\t);\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tendpointIndex,\n\t\t\tdestination,\n\t\t\tencapsulated,\n\t\t});\n\t}\n\n\tpublic encapsulated: CommandClass;\n\t/** The destination end point (0-127) or an array of destination end points (1-7) */\n\tpublic destination: MultiChannelCCDestination;\n\n\t/** @deprecated Use {@link serializeAsync} instead */\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tif (\n\t\t\tctx.getDeviceConfig?.(this.nodeId as number)?.compat\n\t\t\t\t?.treatDestinationEndpointAsSource\n\t\t) {\n\t\t\t// This device incorrectly responds from the endpoint we've passed as our source endpoint\n\t\t\tif (typeof this.destination === \"number\") {\n\t\t\t\tthis.endpointIndex = this.destination;\n\t\t\t}\n\t\t}\n\n\t\tconst destination = typeof this.destination === \"number\"\n\t\t\t// The destination is a single number\n\t\t\t? this.destination & 0b0111_1111\n\t\t\t// The destination is a bit mask\n\t\t\t: encodeBitMask(this.destination, 7)[0] | 0b1000_0000;\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.endpointIndex & 0b0111_1111, destination]),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tthis.encapsulated.serialize(ctx),\n\t\t]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic async serializeAsync(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (\n\t\t\tctx.getDeviceConfig?.(this.nodeId as number)?.compat\n\t\t\t\t?.treatDestinationEndpointAsSource\n\t\t) {\n\t\t\t// This device incorrectly responds from the endpoint we've passed as our source endpoint\n\t\t\tif (typeof this.destination === \"number\") {\n\t\t\t\tthis.endpointIndex = this.destination;\n\t\t\t}\n\t\t}\n\n\t\tconst destination = typeof this.destination === \"number\"\n\t\t\t// The destination is a single number\n\t\t\t? this.destination & 0b0111_1111\n\t\t\t// The destination is a bit mask\n\t\t\t: encodeBitMask(this.destination, 7)[0] | 0b1000_0000;\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.endpointIndex & 0b0111_1111, destination]),\n\t\t\tawait this.encapsulated.serializeAsync(ctx),\n\t\t]);\n\t\treturn super.serializeAsync(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tsource: this.endpointIndex,\n\t\t\t\tdestination: typeof this.destination === \"number\"\n\t\t\t\t\t? this.destination\n\t\t\t\t\t: this.destination.join(\", \"),\n\t\t\t},\n\t\t};\n\t}\n\n\tprotected computeEncapsulationOverhead(): number {\n\t\t// Multi Channel CC adds two bytes for the source and destination endpoint\n\t\treturn super.computeEncapsulationOverhead() + 2;\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCV1ReportOptions {\n\trequestedCC: CommandClasses;\n\tendpointCount: number;\n}\n\n@CCCommand(MultiChannelCommand.ReportV1)\nexport class MultiChannelCCV1Report extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCV1ReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\t// TODO: Check implementation:\n\t\tthis.requestedCC = options.requestedCC;\n\t\tthis.endpointCount = options.endpointCount;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCV1Report {\n\t\t// V1 won't be extended in the future, so do an exact check\n\t\tvalidatePayload(raw.payload.length === 2);\n\t\tconst requestedCC: CommandClasses = raw.payload[0];\n\t\tconst endpointCount = raw.payload[1];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\trequestedCC,\n\t\t\tendpointCount,\n\t\t});\n\t}\n\n\tpublic readonly requestedCC: CommandClasses;\n\tpublic readonly endpointCount: number;\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tCC: getCCName(this.requestedCC),\n\t\t\t\t\"# of endpoints\": this.endpointCount,\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction testResponseForMultiChannelV1Get(\n\tsent: MultiChannelCCV1Get,\n\treceived: MultiChannelCCV1Report,\n) {\n\treturn sent.requestedCC === received.requestedCC;\n}\n\n// @publicAPI\nexport interface MultiChannelCCV1GetOptions {\n\trequestedCC: CommandClasses;\n}\n\n@CCCommand(MultiChannelCommand.GetV1)\n@expectedCCResponse(MultiChannelCCV1Report, testResponseForMultiChannelV1Get)\nexport class MultiChannelCCV1Get extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCV1GetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.requestedCC = options.requestedCC;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): MultiChannelCCV1Get {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new MultiChannelCCV1Get({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic requestedCC: CommandClasses;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([this.requestedCC]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { CC: getCCName(this.requestedCC) },\n\t\t};\n\t}\n}\n\nfunction getResponseForV1CommandEncapsulation(\n\tsent: MultiChannelCCV1CommandEncapsulation,\n) {\n\tif (sent.encapsulated.expectsCCResponse()) {\n\t\treturn MultiChannelCCV1CommandEncapsulation;\n\t}\n}\n\nfunction testResponseForV1CommandEncapsulation(\n\tsent: MultiChannelCCV1CommandEncapsulation,\n\treceived: MultiChannelCCV1CommandEncapsulation,\n) {\n\tif (sent.endpointIndex === received.endpointIndex) {\n\t\treturn \"checkEncapsulated\";\n\t}\n\treturn false;\n}\n\n// @publicAPI\nexport interface MultiChannelCCV1CommandEncapsulationOptions {\n\tencapsulated: CommandClass;\n}\n\n@CCCommand(MultiChannelCommand.CommandEncapsulationV1)\n@expectedCCResponse(\n\tgetResponseForV1CommandEncapsulation,\n\ttestResponseForV1CommandEncapsulation,\n)\nexport class MultiChannelCCV1CommandEncapsulation extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCV1CommandEncapsulationOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.encapsulated = options.encapsulated;\n\t\t// No need to distinguish between source and destination in V1\n\t\tthis.endpointIndex = this.encapsulated.endpointIndex;\n\t}\n\n\t/** @deprecated Use {@link fromAsync} instead */\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCV1CommandEncapsulation {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst endpointIndex = raw.payload[0];\n\n\t\t// Some devices send invalid reports, i.e. MultiChannelCCV1CommandEncapsulation, but with V2+ binary format\n\t\t// This would be a NoOp CC, but it makes no sense to encapsulate that.\n\t\tconst isV2withV1Header = raw.payload.length >= 2\n\t\t\t&& raw.payload[1] === 0x00;\n\n\t\t// No need to validate further, each CC does it for itself\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\tconst encapsulated = CommandClass.parse(\n\t\t\traw.payload.subarray(isV2withV1Header ? 2 : 1),\n\t\t\tctx,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tendpointIndex,\n\t\t\tencapsulated,\n\t\t});\n\t}\n\n\tpublic static async fromAsync(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): Promise<MultiChannelCCV1CommandEncapsulation> {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst endpointIndex = raw.payload[0];\n\n\t\t// Some devices send invalid reports, i.e. MultiChannelCCV1CommandEncapsulation, but with V2+ binary format\n\t\t// This would be a NoOp CC, but it makes no sense to encapsulate that.\n\t\tconst isV2withV1Header = raw.payload.length >= 2\n\t\t\t&& raw.payload[1] === 0x00;\n\n\t\t// No need to validate further, each CC does it for itself\n\t\tconst encapsulated = await CommandClass.parseAsync(\n\t\t\traw.payload.subarray(isV2withV1Header ? 2 : 1),\n\t\t\tctx,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tendpointIndex,\n\t\t\tencapsulated,\n\t\t});\n\t}\n\n\tpublic encapsulated!: CommandClass;\n\n\t/** @deprecated Use {@link serializeAsync} instead */\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.endpointIndex]),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\tthis.encapsulated.serialize(ctx),\n\t\t]);\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic async serializeAsync(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.endpointIndex]),\n\t\t\tawait this.encapsulated.serializeAsync(ctx),\n\t\t]);\n\t\treturn super.serializeAsync(ctx);\n\t}\n\n\tprotected computeEncapsulationOverhead(): number {\n\t\t// Multi Channel CC V1 adds one byte for the endpoint index\n\t\treturn super.computeEncapsulationOverhead() + 1;\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { source: this.endpointIndex },\n\t\t};\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { type CCEncodingContext, type CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\ttype ApplicationNodeInformation,\n\tCommandClasses,\n\ttype GenericDeviceClass,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype SpecificDeviceClass,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeApplicationNodeInformation,\n\tencodeBitMask,\n\tgetCCName,\n\tgetGenericDeviceClass,\n\tgetSpecificDeviceClass,\n\tparseApplicationNodeInformation,\n\tparseBitMask,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { CCAPI } from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\tgetEffectiveCCVersion,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n} from \"../lib/CommandClassDecorators.js\";\nimport {\n\tisEncapsulatingCommandClass,\n\tisMultiEncapsulatingCommandClass,\n} from \"../lib/EncapsulatingCommandClass.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MultiChannelCommand } from \"../lib/_Types.js\";\n\n// TODO: Handle removal reports of dynamic endpoints\n\nexport const MultiChannelCCValues = Object.freeze({\n\t...V.defineStaticCCValues(CommandClasses[\"Multi Channel\"], {\n\t\t...V.staticProperty(\"endpointIndizes\", undefined, {\n\t\t\tinternal: true,\n\t\t\tsupportsEndpoints: false,\n\t\t}),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"individualEndpointCount\",\n\t\t\t\"individualCount\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinternal: true,\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"aggregatedEndpointCount\",\n\t\t\t\"aggregatedCount\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinternal: true,\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"endpointCountIsDynamic\",\n\t\t\t\"countIsDynamic\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinternal: true,\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"endpointsHaveIdenticalCapabilities\",\n\t\t\t\"identicalCapabilities\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tinternal: true,\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"endpointCCs\",\n\t\t\t\"commandClasses\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"endpointDeviceClass\",\n\t\t\t\"deviceClass\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\t}),\n\n\t...V.defineDynamicCCValues(CommandClasses[\"Multi Channel\"], {\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"aggregatedEndpointMembers\",\n\t\t\t\"members\",\n\t\t\t(endpointIndex: number) => endpointIndex,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"members\" && typeof propertyKey === \"number\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\t}),\n});\n\n// @noSetValueAPI\n\n/**\n * Many devices unnecessarily use endpoints when they could (or do) provide all functionality via the root device.\n * This function gives an estimate if this is the case (i.e. all endpoints have a different device class)\n */\nfunction areEndpointsUnnecessary(\n\tctx: GetValueDB,\n\tnodeId: number,\n\tendpointIndizes: number[],\n): boolean {\n\t// Gather all device classes\n\tconst deviceClasses = new Map<\n\t\tnumber,\n\t\t{\n\t\t\tgeneric: number;\n\t\t\tspecific: number;\n\t\t}\n\t>();\n\tfor (const endpoint of endpointIndizes) {\n\t\tconst devClassValueId = MultiChannelCCValues.endpointDeviceClass\n\t\t\t.endpoint(endpoint);\n\t\tconst deviceClass = ctx.getValueDB(nodeId).getValue<{\n\t\t\tgeneric: number;\n\t\t\tspecific: number;\n\t\t}>(devClassValueId);\n\t\tif (deviceClass) {\n\t\t\tdeviceClasses.set(endpoint, {\n\t\t\t\tgeneric: deviceClass.generic,\n\t\t\t\tspecific: deviceClass.specific,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Endpoints may be useless if all of them have different device classes\n\tconst distinctDeviceClasses = distinct(\n\t\t[...deviceClasses.values()].map(\n\t\t\t({ generic, specific }) => generic * 256 + specific,\n\t\t),\n\t);\n\tif (distinctDeviceClasses.length !== endpointIndizes.length) {\n\t\t// There are endpoints with the same device class, so they are not unnecessary\n\t\treturn false;\n\t}\n\n\t// Endpoints are necessary if more than 1 of them has a switch-type device class\n\tconst switchTypeDeviceClasses = [\n\t\t0x10, // Binary Switch\n\t\t0x11, // Multilevel Switch\n\t\t0x12, // Remote Switch\n\t\t0x13, // Toggle Switch\n\t];\n\tconst numSwitchEndpoints = [...deviceClasses.values()].filter(\n\t\t({ generic }) => switchTypeDeviceClasses.includes(generic),\n\t).length;\n\tif (numSwitchEndpoints > 1) return false;\n\n\treturn true;\n}\n\n@API(CommandClasses[\"Multi Channel\"])\nexport class MultiChannelCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: MultiChannelCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\t// Legacy commands:\n\t\t\tcase MultiChannelCommand.GetV1:\n\t\t\t\treturn this.isSinglecast() && this.version === 1;\n\t\t\tcase MultiChannelCommand.CommandEncapsulationV1:\n\t\t\t\treturn this.version === 1;\n\n\t\t\t// The specs start at version 3 but according to OZW,\n\t\t\t// these do seem to be supported in version 2\n\t\t\tcase MultiChannelCommand.EndPointGet:\n\t\t\tcase MultiChannelCommand.CapabilityGet:\n\t\t\t\treturn this.version >= 2 && this.isSinglecast();\n\t\t\tcase MultiChannelCommand.CommandEncapsulation:\n\t\t\t\treturn this.version >= 2;\n\t\t\tcase MultiChannelCommand.EndPointFind:\n\t\t\t\treturn this.version >= 3 && this.isSinglecast();\n\t\t\tcase MultiChannelCommand.AggregatedMembersGet:\n\t\t\t\treturn this.version >= 4 && this.isSinglecast();\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getEndpoints() {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.EndPointGet,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCEndPointGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCEndPointReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn {\n\t\t\t\tisDynamicEndpointCount: response.countIsDynamic,\n\t\t\t\tidenticalCapabilities: response.identicalCapabilities,\n\t\t\t\tindividualEndpointCount: response.individualCount,\n\t\t\t\taggregatedEndpointCount: response.aggregatedCount,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async getEndpointCapabilities(\n\t\tendpoint: number,\n\t): Promise<MaybeNotKnown<EndpointCapability>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.CapabilityGet,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCCapabilityGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\trequestedEndpoint: endpoint,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCCapabilityReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\tconst generic = getGenericDeviceClass(\n\t\t\t\tresponse.genericDeviceClass,\n\t\t\t);\n\t\t\tconst specific = getSpecificDeviceClass(\n\t\t\t\tresponse.genericDeviceClass,\n\t\t\t\tresponse.specificDeviceClass,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tisDynamic: response.isDynamic,\n\t\t\t\twasRemoved: response.wasRemoved,\n\t\t\t\tsupportedCCs: response.supportedCCs,\n\t\t\t\tgeneric,\n\t\t\t\tspecific,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async findEndpoints(\n\t\tgenericClass: number,\n\t\tspecificClass: number,\n\t): Promise<MaybeNotKnown<readonly number[]>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.EndPointFind,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCEndPointFind({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tgenericClass,\n\t\t\tspecificClass,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCEndPointFindReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.foundEndpoints;\n\t}\n\n\t@validateArgs()\n\tpublic async getAggregatedMembers(\n\t\tendpoint: number,\n\t): Promise<MaybeNotKnown<readonly number[]>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.AggregatedMembersGet,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCAggregatedMembersGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\trequestedEndpoint: endpoint,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCAggregatedMembersReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.members;\n\t}\n\n\t// Encapsulation is used internally and too frequently that we\n\t// want to pay the cost of validating each call\n\t// eslint-disable-next-line @zwave-js/ccapi-validate-args\n\tpublic async sendEncapsulated(\n\t\toptions: MultiChannelCCCommandEncapsulationOptions,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.CommandEncapsulation,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCCommandEncapsulation({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\t...options,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async getEndpointCountV1(\n\t\tccId: CommandClasses,\n\t): Promise<MaybeNotKnown<number>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.GetV1,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCV1Get({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\trequestedCC: ccId,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultiChannelCCV1Report\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.endpointCount;\n\t}\n\n\t// Encapsulation is used internally and too frequently that we\n\t// want to pay the cost of validating each call\n\t// eslint-disable-next-line @zwave-js/ccapi-validate-args\n\tpublic async sendEncapsulatedV1(encapsulated: CommandClass): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultiChannelCommand,\n\t\t\tMultiChannelCommand.CommandEncapsulationV1,\n\t\t);\n\n\t\tconst cc = new MultiChannelCCV1CommandEncapsulation({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tencapsulated,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n}\n\nexport interface EndpointCapability {\n\tgeneric: GenericDeviceClass;\n\tspecific: SpecificDeviceClass;\n\tsupportedCCs: CommandClasses[];\n\tisDynamic: boolean;\n\twasRemoved: boolean;\n}\n\n@commandClass(CommandClasses[\"Multi Channel\"])\n@implementedVersion(4)\n@ccValues(MultiChannelCCValues)\nexport class MultiChannelCC extends CommandClass {\n\tdeclare ccCommand: MultiChannelCommand;\n\n\t/** Tests if a command targets a specific endpoint and thus requires encapsulation */\n\tpublic static requiresEncapsulation(cc: CommandClass): boolean {\n\t\treturn (\n\t\t\tcc.endpointIndex !== 0\n\t\t\t&& !(cc instanceof MultiChannelCCCommandEncapsulation)\n\t\t\t&& !(cc instanceof MultiChannelCCV1CommandEncapsulation)\n\t\t);\n\t}\n\n\t/** Encapsulates a command that targets a specific endpoint, with version 2+ of the Multi Channel CC */\n\tpublic static encapsulate(\n\t\tcc: CommandClass,\n\t): MultiChannelCCCommandEncapsulation {\n\t\tconst ret = new MultiChannelCCCommandEncapsulation({\n\t\t\tnodeId: cc.nodeId,\n\t\t\tencapsulated: cc,\n\t\t\tdestination: cc.endpointIndex,\n\t\t});\n\n\t\t// Copy the encapsulation flags from the encapsulated command\n\t\tret.encapsulationFlags = cc.encapsulationFlags;\n\n\t\treturn ret;\n\t}\n\n\t/** Encapsulates a command that targets a specific endpoint, with version 1 of the Multi Channel CC */\n\tpublic static encapsulateV1(\n\t\tcc: CommandClass,\n\t): MultiChannelCCV1CommandEncapsulation {\n\t\tconst ret = new MultiChannelCCV1CommandEncapsulation({\n\t\t\tnodeId: cc.nodeId,\n\t\t\tencapsulated: cc,\n\t\t});\n\n\t\t// Copy the encapsulation flags from the encapsulated command\n\t\tret.encapsulationFlags = cc.encapsulationFlags;\n\n\t\treturn ret;\n\t}\n\n\tpublic skipEndpointInterview(): boolean {\n\t\t// The endpoints are discovered by querying the root device\n\t\treturn true;\n\t}\n\n\tpublic async interview(ctx: InterviewContext): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\tconst removeEndpoints = ctx.getDeviceConfig?.(node.id)?.compat\n\t\t\t?.removeEndpoints;\n\t\tif (removeEndpoints === \"*\") {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`Skipping ${this.ccName} interview b/c all endpoints are ignored by the device config file...`,\n\t\t\t\tdirection: \"none\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\t// Special interview procedure for legacy nodes\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\t\tif (ccVersion === 1) return this.interviewV1(ctx);\n\n\t\tconst endpoint = node.getEndpoint(this.endpointIndex)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multi Channel\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\t// Step 1: Retrieve general information about end points\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: \"querying device endpoint information...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst multiResponse = await api.getEndpoints();\n\t\tif (!multiResponse) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t\"Querying device endpoint information timed out, aborting interview...\",\n\t\t\t\tlevel: \"warn\",\n\t\t\t});\n\t\t\treturn this.throwMissingCriticalInterviewResponse();\n\t\t}\n\n\t\tlet logMessage = `received response for device endpoints:\nendpoint count (individual): ${multiResponse.individualEndpointCount}\ncount is dynamic: ${multiResponse.isDynamicEndpointCount}\nidentical capabilities: ${multiResponse.identicalCapabilities}`;\n\t\tif (multiResponse.aggregatedEndpointCount != undefined) {\n\t\t\tlogMessage +=\n\t\t\t\t`\\nendpoint count (aggregated): ${multiResponse.aggregatedEndpointCount}`;\n\t\t}\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: logMessage,\n\t\t\tdirection: \"inbound\",\n\t\t});\n\n\t\tlet allEndpoints: number[] = [];\n\t\tconst addSequentialEndpoints = (): void => {\n\t\t\tfor (\n\t\t\t\tlet i = 1;\n\t\t\t\ti\n\t\t\t\t\t<= multiResponse.individualEndpointCount\n\t\t\t\t\t\t+ (multiResponse.aggregatedEndpointCount ?? 0);\n\t\t\t\ti++\n\t\t\t) {\n\t\t\t\tallEndpoints.push(i);\n\t\t\t}\n\t\t};\n\t\tif (api.supportsCommand(MultiChannelCommand.EndPointFind)) {\n\t\t\t// Step 2a: Find all endpoints\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"querying all endpoints...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\n\t\t\tconst foundEndpoints = await api.findEndpoints(0xff, 0xff);\n\t\t\tif (foundEndpoints) allEndpoints.push(...foundEndpoints);\n\t\t\tif (!allEndpoints.length) {\n\t\t\t\t// Create a sequential list of endpoints\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Endpoint query returned no results, assuming that endpoints are sequential`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t\taddSequentialEndpoints();\n\t\t\t} else {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `received endpoints: ${\n\t\t\t\t\t\tallEndpoints\n\t\t\t\t\t\t\t.map(String)\n\t\t\t\t\t\t\t.join(\", \")\n\t\t\t\t\t}`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// Step 2b: Assume that the endpoints are in sequential order\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`does not support EndPointFind, assuming that endpoints are sequential`,\n\t\t\t\tdirection: \"none\",\n\t\t\t});\n\t\t\taddSequentialEndpoints();\n\t\t}\n\n\t\t// Step 2.5: remove ignored endpoints\n\t\tif (removeEndpoints?.length) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`The following endpoints are ignored through the config file: ${\n\t\t\t\t\t\tremoveEndpoints.join(\n\t\t\t\t\t\t\t\", \",\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\tdirection: \"none\",\n\t\t\t});\n\t\t\tallEndpoints = allEndpoints.filter(\n\t\t\t\t(e) => !removeEndpoints.includes(e),\n\t\t\t);\n\t\t}\n\n\t\t// Step 3: Query endpoints\n\t\tlet hasQueriedCapabilities = false;\n\t\tfor (const endpoint of allEndpoints) {\n\t\t\tif (\n\t\t\t\tendpoint > multiResponse.individualEndpointCount\n\t\t\t\t&& ccVersion >= 4\n\t\t\t) {\n\t\t\t\t// Find members of aggregated end point\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`querying members of aggregated endpoint #${endpoint}...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tconst members = await api.getAggregatedMembers(endpoint);\n\t\t\t\tif (members) {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`aggregated endpoint #${endpoint} has members ${\n\t\t\t\t\t\t\t\tmembers\n\t\t\t\t\t\t\t\t\t.map(String)\n\t\t\t\t\t\t\t\t\t.join(\", \")\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// When the device reports identical capabilities for all endpoints,\n\t\t\t// we don't need to query them all\n\t\t\tif (multiResponse.identicalCapabilities && hasQueriedCapabilities) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`all endpoints identical, skipping capability query for endpoint #${endpoint}...`,\n\t\t\t\t\tdirection: \"none\",\n\t\t\t\t});\n\n\t\t\t\t// copy the capabilities from the first endpoint\n\t\t\t\tconst devClass = valueDB.getValue(\n\t\t\t\t\tMultiChannelCCValues.endpointDeviceClass.endpoint(\n\t\t\t\t\t\tallEndpoints[0],\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tvalueDB.setValue(\n\t\t\t\t\tMultiChannelCCValues.endpointDeviceClass.endpoint(endpoint),\n\t\t\t\t\tdevClass,\n\t\t\t\t);\n\t\t\t\tconst ep1Caps = valueDB.getValue<CommandClasses[]>(\n\t\t\t\t\tMultiChannelCCValues.endpointCCs.endpoint(allEndpoints[0]),\n\t\t\t\t)!;\n\t\t\t\tvalueDB.setValue(\n\t\t\t\t\tMultiChannelCCValues.endpointCCs.endpoint(endpoint),\n\t\t\t\t\t[...ep1Caps],\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: `querying capabilities for endpoint #${endpoint}...`,\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst caps = await api.getEndpointCapabilities(endpoint);\n\t\t\tif (caps) {\n\t\t\t\thasQueriedCapabilities = true;\n\t\t\t\tlogMessage =\n\t\t\t\t\t`received response for endpoint capabilities (#${endpoint}):\ngeneric device class: ${caps.generic.label}\nspecific device class: ${caps.specific.label}\nis dynamic end point: ${caps.isDynamic}\nsupported CCs:`;\n\t\t\t\tfor (const cc of caps.supportedCCs) {\n\t\t\t\t\tlogMessage += `\\n \u00B7 ${getCCName(cc)}`;\n\t\t\t\t}\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Querying endpoint #${endpoint} capabilities timed out, aborting interview...`,\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t\treturn this.throwMissingCriticalInterviewResponse();\n\t\t\t}\n\t\t}\n\n\t\t// Now that all endpoints have been interviewed, remember which ones are there\n\t\t// But first figure out if they seem unnecessary and if they do, which ones should be preserved\n\t\tif (\n\t\t\t!multiResponse.identicalCapabilities\n\t\t\t&& areEndpointsUnnecessary(ctx, node.id, allEndpoints)\n\t\t) {\n\t\t\tconst preserve = ctx.getDeviceConfig?.(node.id)?.compat\n\t\t\t\t?.preserveEndpoints;\n\t\t\tif (!preserve) {\n\t\t\t\tallEndpoints = [];\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Endpoints seem unnecessary b/c they have different device classes, ignoring all...`,\n\t\t\t\t});\n\t\t\t} else if (preserve === \"*\") {\n\t\t\t\t// preserve all endpoints, do nothing\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Endpoints seem unnecessary, but are configured to be preserved.`,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tallEndpoints = allEndpoints.filter((ep) =>\n\t\t\t\t\tpreserve.includes(ep)\n\t\t\t\t);\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tmessage: `Endpoints seem unnecessary, but endpoints ${\n\t\t\t\t\t\tallEndpoints.join(\n\t\t\t\t\t\t\t\", \",\n\t\t\t\t\t\t)\n\t\t\t\t\t} are configured to be preserved.`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.endpointIndizes,\n\t\t\tallEndpoints,\n\t\t);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tprivate async interviewV1(ctx: InterviewContext): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multi Channel\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t);\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\t// V1 works the opposite way - we scan all CCs and remember how many\n\t\t// endpoints they have\n\t\tconst supportedCCs = [...node.getCCs()]\n\t\t\t// Don't query CCs the node only controls\n\t\t\t.filter(([, info]) => info.isSupported)\n\t\t\t.map(([cc]) => cc)\n\t\t\t// Don't query CCs that want to skip the endpoint interview\n\t\t\t.filter(\n\t\t\t\t(cc) =>\n\t\t\t\t\t!CommandClass.createInstanceUnchecked(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tcc,\n\t\t\t\t\t)?.skipEndpointInterview(),\n\t\t\t);\n\t\tconst endpointCounts = new Map<CommandClasses, number>();\n\t\tfor (const ccId of supportedCCs) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tmessage: `Querying endpoint count for CommandClass ${\n\t\t\t\t\tgetCCName(\n\t\t\t\t\t\tccId,\n\t\t\t\t\t)\n\t\t\t\t}...`,\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst endpointCount = await api.getEndpointCountV1(ccId);\n\t\t\tif (endpointCount != undefined) {\n\t\t\t\tendpointCounts.set(ccId, endpointCount);\n\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tmessage: `CommandClass ${\n\t\t\t\t\t\tgetCCName(\n\t\t\t\t\t\t\tccId,\n\t\t\t\t\t\t)\n\t\t\t\t\t} has ${endpointCount} endpoints`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Store the collected information\n\t\t// We have only individual and no dynamic and no aggregated endpoints\n\t\tconst numEndpoints = Math.max(...endpointCounts.values());\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.endpointCountIsDynamic,\n\t\t\tfalse,\n\t\t);\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.aggregatedEndpointCount,\n\t\t\t0,\n\t\t);\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.individualEndpointCount,\n\t\t\tnumEndpoints,\n\t\t);\n\t\t// Since we queried all CCs separately, we can assume that all\n\t\t// endpoints have different capabilities\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tMultiChannelCCValues.endpointsHaveIdenticalCapabilities,\n\t\t\tfalse,\n\t\t);\n\n\t\tfor (let endpoint = 1; endpoint <= numEndpoints; endpoint++) {\n\t\t\t// Check which CCs exist on this endpoint\n\t\t\tconst endpointCCs = [...endpointCounts.entries()]\n\t\t\t\t.filter(([, ccEndpoints]) => ccEndpoints >= endpoint)\n\t\t\t\t.map(([ccId]) => ccId);\n\t\t\t// And store it per endpoint\n\t\t\tvalueDB.setValue(\n\t\t\t\tMultiChannelCCValues.endpointCCs.endpoint(endpoint),\n\t\t\t\tendpointCCs,\n\t\t\t);\n\t\t}\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCEndPointReportOptions {\n\tcountIsDynamic: boolean;\n\tidenticalCapabilities: boolean;\n\tindividualCount: number;\n\taggregatedCount?: number;\n}\n\n@CCCommand(MultiChannelCommand.EndPointReport)\n@ccValueProperty(\"countIsDynamic\", MultiChannelCCValues.endpointCountIsDynamic)\n@ccValueProperty(\n\t\"identicalCapabilities\",\n\tMultiChannelCCValues.endpointsHaveIdenticalCapabilities,\n)\n@ccValueProperty(\n\t\"individualCount\",\n\tMultiChannelCCValues.individualEndpointCount,\n)\n@ccValueProperty(\n\t\"aggregatedCount\",\n\tMultiChannelCCValues.aggregatedEndpointCount,\n)\nexport class MultiChannelCCEndPointReport extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCEndPointReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.countIsDynamic = options.countIsDynamic;\n\t\tthis.identicalCapabilities = options.identicalCapabilities;\n\t\tthis.individualCount = options.individualCount;\n\t\tthis.aggregatedCount = options.aggregatedCount;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCEndPointReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst countIsDynamic = !!(raw.payload[0] & 0b10000000);\n\t\tconst identicalCapabilities = !!(raw.payload[0] & 0b01000000);\n\t\tconst individualCount = raw.payload[1] & 0b01111111;\n\t\tlet aggregatedCount: MaybeNotKnown<number>;\n\n\t\tif (raw.payload.length >= 3) {\n\t\t\taggregatedCount = raw.payload[2] & 0b01111111;\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tcountIsDynamic,\n\t\t\tidenticalCapabilities,\n\t\t\tindividualCount,\n\t\t\taggregatedCount,\n\t\t});\n\t}\n\n\tpublic countIsDynamic: boolean;\n\n\tpublic identicalCapabilities: boolean;\n\n\tpublic individualCount: number;\n\n\tpublic aggregatedCount: MaybeNotKnown<number>;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([\n\t\t\t(this.countIsDynamic ? 0b10000000 : 0)\n\t\t\t| (this.identicalCapabilities ? 0b01000000 : 0),\n\t\t\tthis.individualCount & 0b01111111,\n\t\t\tthis.aggregatedCount ?? 0,\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\t\"endpoint count (individual)\": this.individualCount,\n\t\t\t\"count is dynamic\": this.countIsDynamic,\n\t\t\t\"identical capabilities\": this.identicalCapabilities,\n\t\t};\n\t\tif (this.aggregatedCount != undefined) {\n\t\t\tmessage[\"endpoint count (aggregated)\"] = this.aggregatedCount;\n\t\t}\n\t\tconst ret = {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t\treturn ret;\n\t}\n}\n\n@CCCommand(MultiChannelCommand.EndPointGet)\n@expectedCCResponse(MultiChannelCCEndPointReport)\nexport class MultiChannelCCEndPointGet extends MultiChannelCC {}\n\n// @publicAPI\nexport interface MultiChannelCCCapabilityReportOptions {\n\tendpointIndex: number;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass: number;\n\tsupportedCCs: CommandClasses[];\n\tisDynamic: boolean;\n\twasRemoved: boolean;\n}\n\n@CCCommand(MultiChannelCommand.CapabilityReport)\nexport class MultiChannelCCCapabilityReport extends MultiChannelCC\n\timplements ApplicationNodeInformation\n{\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCCapabilityReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.endpointIndex = options.endpointIndex;\n\t\tthis.genericDeviceClass = options.genericDeviceClass;\n\t\tthis.specificDeviceClass = options.specificDeviceClass;\n\t\tthis.supportedCCs = options.supportedCCs;\n\t\tthis.isDynamic = options.isDynamic;\n\t\tthis.wasRemoved = options.wasRemoved;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCCapabilityReport {\n\t\t// Only validate the bytes we expect to see here\n\t\t// parseApplicationNodeInformation does its own validation\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst endpointIndex = raw.payload[0] & 0b01111111;\n\t\tconst isDynamic = !!(raw.payload[0] & 0b10000000);\n\t\tconst NIF = parseApplicationNodeInformation(\n\t\t\traw.payload.subarray(1),\n\t\t);\n\t\tconst genericDeviceClass = NIF.genericDeviceClass;\n\t\tconst specificDeviceClass = NIF.specificDeviceClass;\n\t\tconst supportedCCs: CommandClasses[] = NIF.supportedCCs;\n\n\t\t// Removal reports have very specific information\n\t\tconst wasRemoved: boolean = isDynamic\n\t\t\t&& genericDeviceClass === 0xff // \"Non-Interoperable\"\n\t\t\t&& specificDeviceClass === 0x00;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tendpointIndex,\n\t\t\tisDynamic,\n\t\t\tgenericDeviceClass,\n\t\t\tspecificDeviceClass,\n\t\t\tsupportedCCs,\n\t\t\twasRemoved,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tconst deviceClassValue = MultiChannelCCValues.endpointDeviceClass;\n\t\tconst ccsValue = MultiChannelCCValues.endpointCCs;\n\n\t\tif (this.wasRemoved) {\n\t\t\tthis.removeValue(ctx, deviceClassValue);\n\t\t\tthis.removeValue(ctx, ccsValue);\n\t\t} else {\n\t\t\tthis.setValue(ctx, deviceClassValue, {\n\t\t\t\tgeneric: this.genericDeviceClass,\n\t\t\t\tspecific: this.specificDeviceClass,\n\t\t\t});\n\t\t\tthis.setValue(ctx, ccsValue, this.supportedCCs);\n\t\t}\n\t\treturn true;\n\t}\n\n\t// The endpoint index must be overridden to be able to attribute the information to the correct endpoint\n\tpublic readonly genericDeviceClass: number;\n\tpublic readonly specificDeviceClass: number;\n\tpublic readonly supportedCCs: CommandClasses[];\n\tpublic readonly isDynamic: boolean;\n\tpublic readonly wasRemoved: boolean;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([\n\t\t\t\t(this.endpointIndex & 0b01111111)\n\t\t\t\t| (this.isDynamic ? 0b10000000 : 0),\n\t\t\t]),\n\t\t\tencodeApplicationNodeInformation(this),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"endpoint index\": this.endpointIndex,\n\t\t\t\t\"generic device class\": getGenericDeviceClass(\n\t\t\t\t\tthis.genericDeviceClass,\n\t\t\t\t).label,\n\t\t\t\t\"specific device class\": getSpecificDeviceClass(\n\t\t\t\t\tthis.genericDeviceClass,\n\t\t\t\t\tthis.specificDeviceClass,\n\t\t\t\t).label,\n\t\t\t\t\"is dynamic end point\": this.isDynamic,\n\t\t\t\t\"supported CCs\": this.supportedCCs\n\t\t\t\t\t.map((cc) => `\\n\u00B7 ${getCCName(cc)}`)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCCapabilityGetOptions {\n\trequestedEndpoint: number;\n}\n\nfunction testResponseForMultiChannelCapabilityGet(\n\tsent: MultiChannelCCCapabilityGet,\n\treceived: MultiChannelCCCapabilityReport,\n) {\n\treturn received.endpointIndex === sent.requestedEndpoint;\n}\n\n@CCCommand(MultiChannelCommand.CapabilityGet)\n@expectedCCResponse(\n\tMultiChannelCCCapabilityReport,\n\ttestResponseForMultiChannelCapabilityGet,\n)\nexport class MultiChannelCCCapabilityGet extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCCapabilityGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.requestedEndpoint = options.requestedEndpoint;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCCapabilityGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst requestedEndpoint = raw.payload[0] & 0b01111111;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\trequestedEndpoint,\n\t\t});\n\t}\n\n\tpublic requestedEndpoint: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.requestedEndpoint & 0b01111111]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { endpoint: this.requestedEndpoint },\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCEndPointFindReportOptions {\n\tgenericClass: number;\n\tspecificClass: number;\n\tfoundEndpoints: number[];\n\treportsToFollow: number;\n}\n\n@CCCommand(MultiChannelCommand.EndPointFindReport)\nexport class MultiChannelCCEndPointFindReport extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCEndPointFindReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.genericClass = options.genericClass;\n\t\tthis.specificClass = options.specificClass;\n\t\tthis.foundEndpoints = options.foundEndpoints;\n\t\tthis.reportsToFollow = options.reportsToFollow;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCEndPointFindReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst reportsToFollow = raw.payload[0];\n\t\tconst genericClass = raw.payload[1];\n\t\tconst specificClass = raw.payload[2];\n\n\t\t// Some devices omit the endpoint list although that is not allowed in the specs\n\t\t// therefore don't validatePayload here.\n\t\tconst foundEndpoints = [...raw.payload.subarray(3)]\n\t\t\t.map((e) => e & 0b01111111)\n\t\t\t.filter((e) => e !== 0);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\treportsToFollow,\n\t\t\tgenericClass,\n\t\t\tspecificClass,\n\t\t\tfoundEndpoints,\n\t\t});\n\t}\n\n\tpublic genericClass: number;\n\tpublic specificClass: number;\n\tpublic foundEndpoints: number[];\n\tpublic reportsToFollow: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([\n\t\t\t\tthis.reportsToFollow,\n\t\t\t\tthis.genericClass,\n\t\t\t\tthis.specificClass,\n\t\t\t]),\n\t\t\tBytes.from(this.foundEndpoints.map((e) => e & 0b01111111)),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic getPartialCCSessionId(): Record<string, any> | undefined {\n\t\t// Distinguish sessions by the requested device classes\n\t\treturn {\n\t\t\tgenericClass: this.genericClass,\n\t\t\tspecificClass: this.specificClass,\n\t\t};\n\t}\n\n\tpublic expectMoreMessages(): boolean {\n\t\treturn this.reportsToFollow > 0;\n\t}\n\n\tpublic mergePartialCCs(\n\t\tpartials: MultiChannelCCEndPointFindReport[],\n\t\t_ctx: CCParsingContext,\n\t): Promise<void> {\n\t\t// Concat the list of end points\n\t\tthis.foundEndpoints = [...partials, this]\n\t\t\t.map((report) => report.foundEndpoints)\n\t\t\t.reduce((prev, cur) => prev.concat(...cur), []);\n\t\treturn Promise.resolve();\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"generic device class\": getGenericDeviceClass(\n\t\t\t\t\tthis.genericClass,\n\t\t\t\t).label,\n\t\t\t\t\"specific device class\": getSpecificDeviceClass(\n\t\t\t\t\tthis.genericClass,\n\t\t\t\t\tthis.specificClass,\n\t\t\t\t).label,\n\t\t\t\t\"found endpoints\": this.foundEndpoints.join(\", \"),\n\t\t\t\t\"# of reports to follow\": this.reportsToFollow,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCEndPointFindOptions {\n\tgenericClass: number;\n\tspecificClass: number;\n}\n\n@CCCommand(MultiChannelCommand.EndPointFind)\n@expectedCCResponse(MultiChannelCCEndPointFindReport)\nexport class MultiChannelCCEndPointFind extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCEndPointFindOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.genericClass = options.genericClass;\n\t\tthis.specificClass = options.specificClass;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCEndPointFind {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst genericClass = raw.payload[0];\n\t\tconst specificClass = raw.payload[1];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tgenericClass,\n\t\t\tspecificClass,\n\t\t});\n\t}\n\n\tpublic genericClass: number;\n\tpublic specificClass: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.genericClass, this.specificClass]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"generic device class\":\n\t\t\t\t\tgetGenericDeviceClass(this.genericClass).label,\n\t\t\t\t\"specific device class\": getSpecificDeviceClass(\n\t\t\t\t\tthis.genericClass,\n\t\t\t\t\tthis.specificClass,\n\t\t\t\t).label,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCAggregatedMembersReportOptions {\n\taggregatedEndpointIndex: number;\n\tmembers: number[];\n}\n\n@CCCommand(MultiChannelCommand.AggregatedMembersReport)\n@ccValueProperty(\n\t\"members\",\n\tMultiChannelCCValues.aggregatedEndpointMembers,\n\t(self) => [self.aggregatedEndpointIndex],\n)\nexport class MultiChannelCCAggregatedMembersReport extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCAggregatedMembersReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\t// TODO: Check implementation:\n\t\tthis.aggregatedEndpointIndex = options.aggregatedEndpointIndex;\n\t\tthis.members = options.members;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCAggregatedMembersReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst aggregatedEndpointIndex = raw.payload[0] & 0b0111_1111;\n\t\tconst bitMaskLength = raw.payload[1];\n\t\tvalidatePayload(raw.payload.length >= 2 + bitMaskLength);\n\t\tconst bitMask = raw.payload.subarray(2, 2 + bitMaskLength);\n\t\tconst members = parseBitMask(bitMask);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\taggregatedEndpointIndex,\n\t\t\tmembers,\n\t\t});\n\t}\n\n\tpublic readonly aggregatedEndpointIndex: number;\n\n\tpublic readonly members: readonly number[];\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"aggregated endpoint\": this.aggregatedEndpointIndex,\n\t\t\t\tmembers: this.members.join(\", \"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCAggregatedMembersGetOptions {\n\trequestedEndpoint: number;\n}\n\n@CCCommand(MultiChannelCommand.AggregatedMembersGet)\n@expectedCCResponse(MultiChannelCCAggregatedMembersReport)\nexport class MultiChannelCCAggregatedMembersGet extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCAggregatedMembersGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.requestedEndpoint = options.requestedEndpoint;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): MultiChannelCCAggregatedMembersGet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new MultiChannelCCAggregatedMembersGet({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic requestedEndpoint: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.requestedEndpoint & 0b0111_1111]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { endpoint: this.requestedEndpoint },\n\t\t};\n\t}\n}\n\ntype MultiChannelCCDestination = number | (1 | 2 | 3 | 4 | 5 | 6 | 7)[];\n\n// @publicAPI\nexport interface MultiChannelCCCommandEncapsulationOptions {\n\tencapsulated: CommandClass;\n\tdestination: MultiChannelCCDestination;\n}\n\n// SDS13783: A receiving node MAY respond to a Multi Channel encapsulated command if the Destination\n// End Point field specifies a single End Point. In that case, the response MUST be Multi Channel\n// encapsulated.\n// A receiving node MUST NOT respond to a Multi Channel encapsulated command if the\n// Destination End Point field specifies multiple End Points via bit mask addressing.\n\nfunction getCCResponseForCommandEncapsulation(\n\tsent: MultiChannelCCCommandEncapsulation,\n) {\n\tif (\n\t\ttypeof sent.destination === \"number\"\n\t\t&& sent.encapsulated.expectsCCResponse()\n\t) {\n\t\t// Allow both versions of the encapsulation command\n\t\t// Our implementation check is a bit too strict, so change the return type\n\t\treturn [\n\t\t\tMultiChannelCCCommandEncapsulation,\n\t\t\tMultiChannelCCV1CommandEncapsulation,\n\t\t] as any as (typeof MultiChannelCCCommandEncapsulation)[];\n\t}\n}\n\nfunction testResponseForCommandEncapsulation(\n\tsent: MultiChannelCCCommandEncapsulation,\n\treceived:\n\t\t| MultiChannelCCCommandEncapsulation\n\t\t| MultiChannelCCV1CommandEncapsulation,\n) {\n\tif (\n\t\ttypeof sent.destination === \"number\"\n\t\t&& sent.destination === received.endpointIndex\n\t) {\n\t\treturn \"checkEncapsulated\";\n\t}\n\treturn false;\n}\n\n@CCCommand(MultiChannelCommand.CommandEncapsulation)\n@expectedCCResponse(\n\tgetCCResponseForCommandEncapsulation,\n\ttestResponseForCommandEncapsulation,\n)\nexport class MultiChannelCCCommandEncapsulation extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCCommandEncapsulationOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.encapsulated = options.encapsulated;\n\t\tthis.encapsulated.encapsulatingCC = this as any;\n\t\t// Propagate the endpoint index all the way down\n\t\tlet cur: CommandClass = this;\n\t\twhile (cur) {\n\t\t\tif (isMultiEncapsulatingCommandClass(cur)) {\n\t\t\t\tfor (const cc of cur.encapsulated) {\n\t\t\t\t\tcc.endpointIndex = this.endpointIndex;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (isEncapsulatingCommandClass(cur)) {\n\t\t\t\tcur.encapsulated.endpointIndex = this.endpointIndex;\n\t\t\t\tcur = cur.encapsulated;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.destination = options.destination;\n\t}\n\n\tpublic static async from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): Promise<MultiChannelCCCommandEncapsulation> {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\n\t\tlet endpointIndex: number;\n\t\tlet destination: MultiChannelCCDestination;\n\n\t\tif (\n\t\t\tctx.getDeviceConfig?.(ctx.sourceNodeId)\n\t\t\t\t?.compat?.treatDestinationEndpointAsSource\n\t\t) {\n\t\t\t// This device incorrectly uses the destination field to indicate the source endpoint\n\t\t\tendpointIndex = raw.payload[1] & 0b0111_1111;\n\t\t\tdestination = 0;\n\t\t} else {\n\t\t\t// Parse normally\n\t\t\tendpointIndex = raw.payload[0] & 0b0111_1111;\n\t\t\tconst isBitMask = !!(raw.payload[1] & 0b1000_0000);\n\t\t\tdestination = raw.payload[1] & 0b0111_1111;\n\t\t\tif (isBitMask) {\n\t\t\t\tdestination = parseBitMask(\n\t\t\t\t\tBytes.from([destination]),\n\t\t\t\t) as any;\n\t\t\t}\n\t\t}\n\t\t// No need to validate further, each CC does it for itself\n\t\tconst encapsulated = await CommandClass.parse(\n\t\t\traw.payload.subarray(2),\n\t\t\tctx,\n\t\t);\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tendpointIndex,\n\t\t\tdestination,\n\t\t\tencapsulated,\n\t\t});\n\t}\n\n\tpublic encapsulated: CommandClass;\n\t/** The destination end point (0-127) or an array of destination end points (1-7) */\n\tpublic destination: MultiChannelCCDestination;\n\n\tpublic async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (\n\t\t\tctx.getDeviceConfig?.(this.nodeId as number)?.compat\n\t\t\t\t?.treatDestinationEndpointAsSource\n\t\t) {\n\t\t\t// This device incorrectly responds from the endpoint we've passed as our source endpoint\n\t\t\tif (typeof this.destination === \"number\") {\n\t\t\t\tthis.endpointIndex = this.destination;\n\t\t\t}\n\t\t}\n\n\t\tconst destination = typeof this.destination === \"number\"\n\t\t\t// The destination is a single number\n\t\t\t? this.destination & 0b0111_1111\n\t\t\t// The destination is a bit mask\n\t\t\t: encodeBitMask(this.destination, 7)[0] | 0b1000_0000;\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.endpointIndex & 0b0111_1111, destination]),\n\t\t\tawait this.encapsulated.serialize(ctx),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tsource: this.endpointIndex,\n\t\t\t\tdestination: typeof this.destination === \"number\"\n\t\t\t\t\t? this.destination\n\t\t\t\t\t: this.destination.join(\", \"),\n\t\t\t},\n\t\t};\n\t}\n\n\tprotected computeEncapsulationOverhead(): number {\n\t\t// Multi Channel CC adds two bytes for the source and destination endpoint\n\t\treturn super.computeEncapsulationOverhead() + 2;\n\t}\n}\n\n// @publicAPI\nexport interface MultiChannelCCV1ReportOptions {\n\trequestedCC: CommandClasses;\n\tendpointCount: number;\n}\n\n@CCCommand(MultiChannelCommand.ReportV1)\nexport class MultiChannelCCV1Report extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCV1ReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\t// TODO: Check implementation:\n\t\tthis.requestedCC = options.requestedCC;\n\t\tthis.endpointCount = options.endpointCount;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultiChannelCCV1Report {\n\t\t// V1 won't be extended in the future, so do an exact check\n\t\tvalidatePayload(raw.payload.length === 2);\n\t\tconst requestedCC: CommandClasses = raw.payload[0];\n\t\tconst endpointCount = raw.payload[1];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\trequestedCC,\n\t\t\tendpointCount,\n\t\t});\n\t}\n\n\tpublic readonly requestedCC: CommandClasses;\n\tpublic readonly endpointCount: number;\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tCC: getCCName(this.requestedCC),\n\t\t\t\t\"# of endpoints\": this.endpointCount,\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction testResponseForMultiChannelV1Get(\n\tsent: MultiChannelCCV1Get,\n\treceived: MultiChannelCCV1Report,\n) {\n\treturn sent.requestedCC === received.requestedCC;\n}\n\n// @publicAPI\nexport interface MultiChannelCCV1GetOptions {\n\trequestedCC: CommandClasses;\n}\n\n@CCCommand(MultiChannelCommand.GetV1)\n@expectedCCResponse(MultiChannelCCV1Report, testResponseForMultiChannelV1Get)\nexport class MultiChannelCCV1Get extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCV1GetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.requestedCC = options.requestedCC;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): MultiChannelCCV1Get {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new MultiChannelCCV1Get({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic requestedCC: CommandClasses;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.requestedCC]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { CC: getCCName(this.requestedCC) },\n\t\t};\n\t}\n}\n\nfunction getResponseForV1CommandEncapsulation(\n\tsent: MultiChannelCCV1CommandEncapsulation,\n) {\n\tif (sent.encapsulated.expectsCCResponse()) {\n\t\treturn MultiChannelCCV1CommandEncapsulation;\n\t}\n}\n\nfunction testResponseForV1CommandEncapsulation(\n\tsent: MultiChannelCCV1CommandEncapsulation,\n\treceived: MultiChannelCCV1CommandEncapsulation,\n) {\n\tif (sent.endpointIndex === received.endpointIndex) {\n\t\treturn \"checkEncapsulated\";\n\t}\n\treturn false;\n}\n\n// @publicAPI\nexport interface MultiChannelCCV1CommandEncapsulationOptions {\n\tencapsulated: CommandClass;\n}\n\n@CCCommand(MultiChannelCommand.CommandEncapsulationV1)\n@expectedCCResponse(\n\tgetResponseForV1CommandEncapsulation,\n\ttestResponseForV1CommandEncapsulation,\n)\nexport class MultiChannelCCV1CommandEncapsulation extends MultiChannelCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultiChannelCCV1CommandEncapsulationOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.encapsulated = options.encapsulated;\n\t\t// No need to distinguish between source and destination in V1\n\t\tthis.endpointIndex = this.encapsulated.endpointIndex;\n\t}\n\n\tpublic static async from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): Promise<MultiChannelCCV1CommandEncapsulation> {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst endpointIndex = raw.payload[0];\n\n\t\t// Some devices send invalid reports, i.e. MultiChannelCCV1CommandEncapsulation, but with V2+ binary format\n\t\t// This would be a NoOp CC, but it makes no sense to encapsulate that.\n\t\tconst isV2withV1Header = raw.payload.length >= 2\n\t\t\t&& raw.payload[1] === 0x00;\n\n\t\t// No need to validate further, each CC does it for itself\n\t\tconst encapsulated = await CommandClass.parse(\n\t\t\traw.payload.subarray(isV2withV1Header ? 2 : 1),\n\t\t\tctx,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tendpointIndex,\n\t\t\tencapsulated,\n\t\t});\n\t}\n\n\tpublic encapsulated!: CommandClass;\n\n\tpublic async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.endpointIndex]),\n\t\t\tawait this.encapsulated.serialize(ctx),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tprotected computeEncapsulationOverhead(): number {\n\t\t// Multi Channel CC V1 adds one byte for the endpoint index\n\t\treturn super.computeEncapsulationOverhead() + 1;\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { source: this.endpointIndex },\n\t\t};\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_safe", "endpoint"]
7
7
  }
@@ -1,5 +1,5 @@
1
- import { type MaybeNotKnown, type MessageOrCCLogEntry, type WithAddress } from "@zwave-js/core/safe";
2
- import type { CCEncodingContext, CCParsingContext, GetValueDB } from "@zwave-js/host/safe";
1
+ import { type CCEncodingContext, type CCParsingContext } from "@zwave-js/cc";
2
+ import { type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, type WithAddress } from "@zwave-js/core/safe";
3
3
  import { Bytes } from "@zwave-js/shared/safe";
4
4
  import { CCAPI } from "../lib/API.js";
5
5
  import { type CCRaw, CommandClass } from "../lib/CommandClass.js";
@@ -19,13 +19,9 @@ export interface MultiCommandCCCommandEncapsulationOptions {
19
19
  }
20
20
  export declare class MultiCommandCCCommandEncapsulation extends MultiCommandCC {
21
21
  constructor(options: WithAddress<MultiCommandCCCommandEncapsulationOptions>);
22
- /** @deprecated Use {@link fromAsync} instead */
23
- static from(raw: CCRaw, ctx: CCParsingContext): MultiCommandCCCommandEncapsulation;
24
- static fromAsync(raw: CCRaw, ctx: CCParsingContext): Promise<MultiCommandCCCommandEncapsulation>;
22
+ static from(raw: CCRaw, ctx: CCParsingContext): Promise<MultiCommandCCCommandEncapsulation>;
25
23
  encapsulated: CommandClass[];
26
- /** @deprecated Use {@link serializeAsync} instead */
27
- serialize(ctx: CCEncodingContext): Bytes;
28
- serializeAsync(ctx: CCEncodingContext): Promise<Bytes>;
24
+ serialize(ctx: CCEncodingContext): Promise<Bytes>;
29
25
  toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
30
26
  }
31
27
  //# sourceMappingURL=MultiCommandCC.d.ts.map
@@ -194,8 +194,7 @@ let MultiCommandCCCommandEncapsulation = (() => {
194
194
  cc.endpointIndex = this.endpointIndex;
195
195
  }
196
196
  }
197
- /** @deprecated Use {@link fromAsync} instead */
198
- static from(raw, ctx) {
197
+ static async from(raw, ctx) {
199
198
  (0, import_safe.validatePayload)(raw.payload.length >= 1);
200
199
  const numCommands = raw.payload[0];
201
200
  const encapsulated = [];
@@ -204,27 +203,7 @@ let MultiCommandCCCommandEncapsulation = (() => {
204
203
  (0, import_safe.validatePayload)(raw.payload.length >= offset + 1);
205
204
  const cmdLength = raw.payload[offset];
206
205
  (0, import_safe.validatePayload)(raw.payload.length >= offset + 1 + cmdLength);
207
- encapsulated.push(
208
- // eslint-disable-next-line @typescript-eslint/no-deprecated
209
- import_CommandClass.CommandClass.parse(raw.payload.subarray(offset + 1, offset + 1 + cmdLength), ctx)
210
- );
211
- offset += 1 + cmdLength;
212
- }
213
- return new this({
214
- nodeId: ctx.sourceNodeId,
215
- encapsulated
216
- });
217
- }
218
- static async fromAsync(raw, ctx) {
219
- (0, import_safe.validatePayload)(raw.payload.length >= 1);
220
- const numCommands = raw.payload[0];
221
- const encapsulated = [];
222
- let offset = 1;
223
- for (let i = 0; i < numCommands; i++) {
224
- (0, import_safe.validatePayload)(raw.payload.length >= offset + 1);
225
- const cmdLength = raw.payload[offset];
226
- (0, import_safe.validatePayload)(raw.payload.length >= offset + 1 + cmdLength);
227
- encapsulated.push(await import_CommandClass.CommandClass.parseAsync(raw.payload.subarray(offset + 1, offset + 1 + cmdLength), ctx));
206
+ encapsulated.push(await import_CommandClass.CommandClass.parse(raw.payload.subarray(offset + 1, offset + 1 + cmdLength), ctx));
228
207
  offset += 1 + cmdLength;
229
208
  }
230
209
  return new this({
@@ -233,29 +212,17 @@ let MultiCommandCCCommandEncapsulation = (() => {
233
212
  });
234
213
  }
235
214
  encapsulated;
236
- /** @deprecated Use {@link serializeAsync} instead */
237
- serialize(ctx) {
215
+ async serialize(ctx) {
238
216
  const buffers = [];
239
217
  buffers.push(import_safe2.Bytes.from([this.encapsulated.length]));
240
218
  for (const cmd of this.encapsulated) {
241
- const cmdBuffer = cmd.serialize(ctx);
219
+ const cmdBuffer = await cmd.serialize(ctx);
242
220
  buffers.push(import_safe2.Bytes.from([cmdBuffer.length]));
243
221
  buffers.push(cmdBuffer);
244
222
  }
245
223
  this.payload = import_safe2.Bytes.concat(buffers);
246
224
  return super.serialize(ctx);
247
225
  }
248
- async serializeAsync(ctx) {
249
- const buffers = [];
250
- buffers.push(import_safe2.Bytes.from([this.encapsulated.length]));
251
- for (const cmd of this.encapsulated) {
252
- const cmdBuffer = await cmd.serializeAsync(ctx);
253
- buffers.push(import_safe2.Bytes.from([cmdBuffer.length]));
254
- buffers.push(cmdBuffer);
255
- }
256
- this.payload = import_safe2.Bytes.concat(buffers);
257
- return super.serializeAsync(ctx);
258
- }
259
226
  toLogEntry(ctx) {
260
227
  return {
261
228
  ...super.toLogEntry(ctx),