@zwave-js/cc 15.28.0 → 15.29.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 (312) hide show
  1. package/build/cjs/cc/AlarmSensorCC.js.map +2 -2
  2. package/build/cjs/cc/AssociationCC.js +6 -5
  3. package/build/cjs/cc/AssociationCC.js.map +2 -2
  4. package/build/cjs/cc/AssociationGroupInfoCC.js +4 -5
  5. package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
  6. package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
  7. package/build/cjs/cc/BasicCC.d.ts +4 -1
  8. package/build/cjs/cc/BasicCC.js +18 -0
  9. package/build/cjs/cc/BasicCC.js.map +3 -3
  10. package/build/cjs/cc/BasicWindowCoveringCC.js.map +2 -2
  11. package/build/cjs/cc/BatteryCC.js +16 -3
  12. package/build/cjs/cc/BatteryCC.js.map +2 -2
  13. package/build/cjs/cc/BinarySensorCC.js.map +2 -2
  14. package/build/cjs/cc/BinarySwitchCC.d.ts +4 -1
  15. package/build/cjs/cc/BinarySwitchCC.js +18 -0
  16. package/build/cjs/cc/BinarySwitchCC.js.map +3 -3
  17. package/build/cjs/cc/CRC16CC.d.ts +3 -2
  18. package/build/cjs/cc/CRC16CC.js +7 -1
  19. package/build/cjs/cc/CRC16CC.js.map +3 -3
  20. package/build/cjs/cc/CentralSceneCC.js.map +2 -2
  21. package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
  22. package/build/cjs/cc/ClockCC.js.map +2 -2
  23. package/build/cjs/cc/ColorSwitchCC.js +1 -4
  24. package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
  25. package/build/cjs/cc/ConfigurationCC.js +1 -4
  26. package/build/cjs/cc/ConfigurationCC.js.map +2 -2
  27. package/build/cjs/cc/DeviceResetLocallyCC.js.map +2 -2
  28. package/build/cjs/cc/DoorLockCC.js.map +2 -2
  29. package/build/cjs/cc/EntryControlCC.js.map +2 -2
  30. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js +4 -16
  31. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +2 -2
  32. package/build/cjs/cc/HumidityControlSetpointCC.js +10 -4
  33. package/build/cjs/cc/HumidityControlSetpointCC.js.map +2 -2
  34. package/build/cjs/cc/IndicatorCC.js +1 -5
  35. package/build/cjs/cc/IndicatorCC.js.map +2 -2
  36. package/build/cjs/cc/IrrigationCC.js.map +2 -2
  37. package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
  38. package/build/cjs/cc/ManufacturerSpecificCC.js +4 -5
  39. package/build/cjs/cc/ManufacturerSpecificCC.js.map +2 -2
  40. package/build/cjs/cc/MeterCC.js +8 -21
  41. package/build/cjs/cc/MeterCC.js.map +2 -2
  42. package/build/cjs/cc/MultiChannelAssociationCC.js +11 -7
  43. package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
  44. package/build/cjs/cc/MultiChannelCC.d.ts +3 -1
  45. package/build/cjs/cc/MultiChannelCC.js +21 -10
  46. package/build/cjs/cc/MultiChannelCC.js.map +3 -3
  47. package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
  48. package/build/cjs/cc/MultilevelSwitchCC.d.ts +5 -1
  49. package/build/cjs/cc/MultilevelSwitchCC.js +30 -0
  50. package/build/cjs/cc/MultilevelSwitchCC.js.map +3 -3
  51. package/build/cjs/cc/NotificationCC.js +29 -11
  52. package/build/cjs/cc/NotificationCC.js.map +2 -2
  53. package/build/cjs/cc/PowerlevelCC.js.map +1 -1
  54. package/build/cjs/cc/ProtectionCC.js.map +2 -2
  55. package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +2 -2
  56. package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
  57. package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
  58. package/build/cjs/cc/Security2CC.d.ts +2 -1
  59. package/build/cjs/cc/Security2CC.js +31 -3
  60. package/build/cjs/cc/Security2CC.js.map +2 -2
  61. package/build/cjs/cc/SecurityCC.d.ts +2 -1
  62. package/build/cjs/cc/SecurityCC.js +7 -6
  63. package/build/cjs/cc/SecurityCC.js.map +2 -2
  64. package/build/cjs/cc/SoundSwitchCC.js +6 -6
  65. package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
  66. package/build/cjs/cc/SupervisionCC.d.ts +2 -1
  67. package/build/cjs/cc/SupervisionCC.js +6 -0
  68. package/build/cjs/cc/SupervisionCC.js.map +3 -3
  69. package/build/cjs/cc/ThermostatFanModeCC.js.map +2 -2
  70. package/build/cjs/cc/ThermostatModeCC.js +1 -3
  71. package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
  72. package/build/cjs/cc/ThermostatOperatingStateCC.js.map +2 -2
  73. package/build/cjs/cc/ThermostatSetpointCC.d.ts +4 -1
  74. package/build/cjs/cc/ThermostatSetpointCC.js +18 -0
  75. package/build/cjs/cc/ThermostatSetpointCC.js.map +3 -3
  76. package/build/cjs/cc/TimeCC.js.map +2 -2
  77. package/build/cjs/cc/TransportServiceCC.js.map +2 -2
  78. package/build/cjs/cc/UserCodeCC.js +1 -6
  79. package/build/cjs/cc/UserCodeCC.js.map +2 -2
  80. package/build/cjs/cc/UserCredentialCC.js +4 -6
  81. package/build/cjs/cc/UserCredentialCC.js.map +2 -2
  82. package/build/cjs/cc/VersionCC.js.map +2 -2
  83. package/build/cjs/cc/WindowCoveringCC.js +5 -1
  84. package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
  85. package/build/cjs/cc/ZWaveProtocolCC.js +3 -11
  86. package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
  87. package/build/cjs/cc/_CCValues.generated.d.ts +2 -2
  88. package/build/cjs/cc/_CCValues.generated.js.map +2 -2
  89. package/build/cjs/cc/index.d.ts +179 -179
  90. package/build/cjs/cc/index.js.map +1 -1
  91. package/build/cjs/cc/manufacturerProprietary/Decorators.js.map +2 -2
  92. package/build/cjs/lib/API.d.ts +3 -2
  93. package/build/cjs/lib/API.js.map +2 -2
  94. package/build/cjs/lib/CommandClass.d.ts +20 -0
  95. package/build/cjs/lib/CommandClass.js +52 -11
  96. package/build/cjs/lib/CommandClass.js.map +3 -3
  97. package/build/cjs/lib/CommandClassDecorators.js.map +2 -2
  98. package/build/cjs/lib/EncapsulatingCommandClass.js.map +2 -2
  99. package/build/cjs/lib/NotificationEventPayload.js.map +2 -2
  100. package/build/cjs/lib/Security2/Extension.js +1 -4
  101. package/build/cjs/lib/Security2/Extension.js.map +2 -2
  102. package/build/cjs/lib/Security2/shared.js.map +2 -2
  103. package/build/cjs/lib/SetValueResult.js.map +1 -1
  104. package/build/cjs/lib/Values.d.ts +1 -1
  105. package/build/cjs/lib/Values.js.map +2 -2
  106. package/build/cjs/lib/_CCAPI.generated.js.map +1 -1
  107. package/build/cjs/lib/_Types.d.ts +30 -30
  108. package/build/cjs/lib/_Types.js.map +2 -2
  109. package/build/cjs/lib/serializers.js +1 -4
  110. package/build/cjs/lib/serializers.js.map +2 -2
  111. package/build/cjs/lib/utils.js.map +2 -2
  112. package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
  113. package/build/esm/cc/AlarmSensorCC.js +1 -2
  114. package/build/esm/cc/AlarmSensorCC.js.map +1 -1
  115. package/build/esm/cc/AssociationCC.d.ts.map +1 -1
  116. package/build/esm/cc/AssociationCC.js +8 -7
  117. package/build/esm/cc/AssociationCC.js.map +1 -1
  118. package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
  119. package/build/esm/cc/AssociationGroupInfoCC.js +10 -12
  120. package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
  121. package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
  122. package/build/esm/cc/BarrierOperatorCC.js +10 -9
  123. package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
  124. package/build/esm/cc/BasicCC.d.ts +4 -1
  125. package/build/esm/cc/BasicCC.d.ts.map +1 -1
  126. package/build/esm/cc/BasicCC.js +30 -7
  127. package/build/esm/cc/BasicCC.js.map +1 -1
  128. package/build/esm/cc/BasicWindowCoveringCC.d.ts.map +1 -1
  129. package/build/esm/cc/BasicWindowCoveringCC.js +2 -5
  130. package/build/esm/cc/BasicWindowCoveringCC.js.map +1 -1
  131. package/build/esm/cc/BatteryCC.d.ts.map +1 -1
  132. package/build/esm/cc/BatteryCC.js +12 -12
  133. package/build/esm/cc/BatteryCC.js.map +1 -1
  134. package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
  135. package/build/esm/cc/BinarySensorCC.js +4 -5
  136. package/build/esm/cc/BinarySensorCC.js.map +1 -1
  137. package/build/esm/cc/BinarySwitchCC.d.ts +4 -1
  138. package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -1
  139. package/build/esm/cc/BinarySwitchCC.js +31 -6
  140. package/build/esm/cc/BinarySwitchCC.js.map +1 -1
  141. package/build/esm/cc/CRC16CC.d.ts +3 -2
  142. package/build/esm/cc/CRC16CC.d.ts.map +1 -1
  143. package/build/esm/cc/CRC16CC.js +10 -4
  144. package/build/esm/cc/CRC16CC.js.map +1 -1
  145. package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
  146. package/build/esm/cc/CentralSceneCC.js +2 -1
  147. package/build/esm/cc/CentralSceneCC.js.map +1 -1
  148. package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -1
  149. package/build/esm/cc/ClimateControlScheduleCC.js +6 -2
  150. package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
  151. package/build/esm/cc/ClockCC.d.ts.map +1 -1
  152. package/build/esm/cc/ClockCC.js +6 -2
  153. package/build/esm/cc/ClockCC.js.map +1 -1
  154. package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
  155. package/build/esm/cc/ColorSwitchCC.js +17 -20
  156. package/build/esm/cc/ColorSwitchCC.js.map +1 -1
  157. package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
  158. package/build/esm/cc/ConfigurationCC.js +20 -29
  159. package/build/esm/cc/ConfigurationCC.js.map +1 -1
  160. package/build/esm/cc/DeviceResetLocallyCC.d.ts.map +1 -1
  161. package/build/esm/cc/DeviceResetLocallyCC.js +1 -2
  162. package/build/esm/cc/DeviceResetLocallyCC.js.map +1 -1
  163. package/build/esm/cc/DoorLockCC.d.ts.map +1 -1
  164. package/build/esm/cc/DoorLockCC.js +25 -29
  165. package/build/esm/cc/DoorLockCC.js.map +1 -1
  166. package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
  167. package/build/esm/cc/EntryControlCC.js +10 -7
  168. package/build/esm/cc/EntryControlCC.js.map +1 -1
  169. package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -1
  170. package/build/esm/cc/FirmwareUpdateMetaDataCC.js +15 -27
  171. package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
  172. package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -1
  173. package/build/esm/cc/HumidityControlSetpointCC.js +8 -9
  174. package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
  175. package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
  176. package/build/esm/cc/IndicatorCC.js +19 -38
  177. package/build/esm/cc/IndicatorCC.js.map +1 -1
  178. package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
  179. package/build/esm/cc/IrrigationCC.js +8 -6
  180. package/build/esm/cc/IrrigationCC.js.map +1 -1
  181. package/build/esm/cc/ManufacturerProprietaryCC.d.ts.map +1 -1
  182. package/build/esm/cc/ManufacturerProprietaryCC.js +1 -2
  183. package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
  184. package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
  185. package/build/esm/cc/ManufacturerSpecificCC.js +5 -8
  186. package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
  187. package/build/esm/cc/MeterCC.d.ts.map +1 -1
  188. package/build/esm/cc/MeterCC.js +15 -29
  189. package/build/esm/cc/MeterCC.js.map +1 -1
  190. package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
  191. package/build/esm/cc/MultiChannelAssociationCC.js +15 -20
  192. package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
  193. package/build/esm/cc/MultiChannelCC.d.ts +3 -1
  194. package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
  195. package/build/esm/cc/MultiChannelCC.js +28 -22
  196. package/build/esm/cc/MultiChannelCC.js.map +1 -1
  197. package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
  198. package/build/esm/cc/MultilevelSensorCC.js +11 -11
  199. package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
  200. package/build/esm/cc/MultilevelSwitchCC.d.ts +5 -1
  201. package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -1
  202. package/build/esm/cc/MultilevelSwitchCC.js +56 -16
  203. package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
  204. package/build/esm/cc/NotificationCC.d.ts.map +1 -1
  205. package/build/esm/cc/NotificationCC.js +66 -55
  206. package/build/esm/cc/NotificationCC.js.map +1 -1
  207. package/build/esm/cc/PowerlevelCC.d.ts.map +1 -1
  208. package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
  209. package/build/esm/cc/ProtectionCC.js +10 -9
  210. package/build/esm/cc/ProtectionCC.js.map +1 -1
  211. package/build/esm/cc/SceneActuatorConfigurationCC.d.ts.map +1 -1
  212. package/build/esm/cc/SceneActuatorConfigurationCC.js +5 -8
  213. package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -1
  214. package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
  215. package/build/esm/cc/SceneControllerConfigurationCC.js +10 -16
  216. package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
  217. package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
  218. package/build/esm/cc/ScheduleEntryLockCC.js +13 -20
  219. package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
  220. package/build/esm/cc/Security2CC.d.ts +2 -1
  221. package/build/esm/cc/Security2CC.d.ts.map +1 -1
  222. package/build/esm/cc/Security2CC.js +68 -32
  223. package/build/esm/cc/Security2CC.js.map +1 -1
  224. package/build/esm/cc/SecurityCC.d.ts +2 -1
  225. package/build/esm/cc/SecurityCC.d.ts.map +1 -1
  226. package/build/esm/cc/SecurityCC.js +16 -11
  227. package/build/esm/cc/SecurityCC.js.map +1 -1
  228. package/build/esm/cc/SoundSwitchCC.js +2 -2
  229. package/build/esm/cc/SoundSwitchCC.js.map +1 -1
  230. package/build/esm/cc/SupervisionCC.d.ts +2 -1
  231. package/build/esm/cc/SupervisionCC.d.ts.map +1 -1
  232. package/build/esm/cc/SupervisionCC.js +13 -6
  233. package/build/esm/cc/SupervisionCC.js.map +1 -1
  234. package/build/esm/cc/ThermostatFanModeCC.d.ts.map +1 -1
  235. package/build/esm/cc/ThermostatFanModeCC.js +1 -2
  236. package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
  237. package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
  238. package/build/esm/cc/ThermostatModeCC.js +1 -3
  239. package/build/esm/cc/ThermostatModeCC.js.map +1 -1
  240. package/build/esm/cc/ThermostatOperatingStateCC.d.ts.map +1 -1
  241. package/build/esm/cc/ThermostatOperatingStateCC.js +1 -2
  242. package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -1
  243. package/build/esm/cc/ThermostatSetpointCC.d.ts +4 -1
  244. package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
  245. package/build/esm/cc/ThermostatSetpointCC.js +31 -19
  246. package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
  247. package/build/esm/cc/TimeCC.d.ts.map +1 -1
  248. package/build/esm/cc/TimeCC.js +6 -2
  249. package/build/esm/cc/TimeCC.js.map +1 -1
  250. package/build/esm/cc/TransportServiceCC.d.ts.map +1 -1
  251. package/build/esm/cc/TransportServiceCC.js +8 -8
  252. package/build/esm/cc/TransportServiceCC.js.map +1 -1
  253. package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
  254. package/build/esm/cc/UserCodeCC.js +20 -30
  255. package/build/esm/cc/UserCodeCC.js.map +1 -1
  256. package/build/esm/cc/UserCredentialCC.d.ts.map +1 -1
  257. package/build/esm/cc/UserCredentialCC.js +42 -59
  258. package/build/esm/cc/UserCredentialCC.js.map +1 -1
  259. package/build/esm/cc/VersionCC.js +3 -3
  260. package/build/esm/cc/VersionCC.js.map +1 -1
  261. package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
  262. package/build/esm/cc/WindowCoveringCC.js +10 -9
  263. package/build/esm/cc/WindowCoveringCC.js.map +1 -1
  264. package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
  265. package/build/esm/cc/ZWaveProtocolCC.js +5 -26
  266. package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
  267. package/build/esm/cc/_CCValues.generated.d.ts +2 -2
  268. package/build/esm/cc/_CCValues.generated.d.ts.map +1 -1
  269. package/build/esm/cc/_CCValues.generated.js +637 -678
  270. package/build/esm/cc/_CCValues.generated.js.map +1 -1
  271. package/build/esm/cc/index.d.ts +179 -179
  272. package/build/esm/cc/index.d.ts.map +1 -1
  273. package/build/esm/cc/index.js +124 -124
  274. package/build/esm/cc/index.js.map +1 -1
  275. package/build/esm/cc/manufacturerProprietary/Decorators.d.ts.map +1 -1
  276. package/build/esm/cc/manufacturerProprietary/Decorators.js.map +1 -1
  277. package/build/esm/lib/API.d.ts +3 -2
  278. package/build/esm/lib/API.d.ts.map +1 -1
  279. package/build/esm/lib/API.js +1 -1
  280. package/build/esm/lib/API.js.map +1 -1
  281. package/build/esm/lib/CommandClass.d.ts +20 -0
  282. package/build/esm/lib/CommandClass.d.ts.map +1 -1
  283. package/build/esm/lib/CommandClass.js +50 -16
  284. package/build/esm/lib/CommandClass.js.map +1 -1
  285. package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -1
  286. package/build/esm/lib/CommandClassDecorators.js +1 -2
  287. package/build/esm/lib/CommandClassDecorators.js.map +1 -1
  288. package/build/esm/lib/EncapsulatingCommandClass.d.ts.map +1 -1
  289. package/build/esm/lib/EncapsulatingCommandClass.js.map +1 -1
  290. package/build/esm/lib/NotificationEventPayload.d.ts.map +1 -1
  291. package/build/esm/lib/NotificationEventPayload.js.map +1 -1
  292. package/build/esm/lib/Security2/Extension.d.ts.map +1 -1
  293. package/build/esm/lib/Security2/Extension.js +2 -6
  294. package/build/esm/lib/Security2/Extension.js.map +1 -1
  295. package/build/esm/lib/Security2/shared.d.ts.map +1 -1
  296. package/build/esm/lib/Security2/shared.js.map +1 -1
  297. package/build/esm/lib/SetValueResult.d.ts.map +1 -1
  298. package/build/esm/lib/Values.d.ts +1 -1
  299. package/build/esm/lib/Values.d.ts.map +1 -1
  300. package/build/esm/lib/Values.js.map +1 -1
  301. package/build/esm/lib/_CCAPI.generated.d.ts.map +1 -1
  302. package/build/esm/lib/_Types.d.ts +30 -30
  303. package/build/esm/lib/_Types.d.ts.map +1 -1
  304. package/build/esm/lib/_Types.js.map +1 -1
  305. package/build/esm/lib/serializers.d.ts.map +1 -1
  306. package/build/esm/lib/serializers.js +1 -4
  307. package/build/esm/lib/serializers.js.map +1 -1
  308. package/build/esm/lib/traits.d.ts.map +1 -1
  309. package/build/esm/lib/utils.d.ts.map +1 -1
  310. package/build/esm/lib/utils.js +25 -31
  311. package/build/esm/lib/utils.js.map +1 -1
  312. package/package.json +7 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src_gen/cc/MultiChannelCC.ts"],
4
- "sourcesContent": ["import * as __validateArgs from \"./MultiChannelCC._validateArgs.js\";\nconst { validateArgs_MultiChannelCCAPI_getEndpointCapabilities, validateArgs_MultiChannelCCAPI_findEndpoints, validateArgs_MultiChannelCCAPI_getAggregatedMembers, validateArgs_MultiChannelCCAPI_getEndpointCountV1 } = __validateArgs;\nimport { type ApplicationNodeInformation, CommandClasses, type GenericDeviceClass, type GetNode, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type NodeId, type SpecificDeviceClass, type SupportsCC, type WithAddress, ZWaveError, ZWaveErrorCodes, encodeApplicationNodeInformation, encodeBitMask, getCCName, getGenericDeviceClass, getSpecificDeviceClass, logDict, logList, logText, parseApplicationNodeInformation, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { CCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, } from \"../lib/CommandClassDecorators.js\";\nimport { isEncapsulatingCommandClass, isMultiEncapsulatingCommandClass, } from \"../lib/EncapsulatingCommandClass.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MultiChannelCommand } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { MultiChannelCCValues } from \"./_CCValues.generated.js\";\nexport { MultiChannelCCValues };\n// @noSetValueAPI\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(ctx: GetValueDB, nodeId: number, endpointIndizes: number[]): boolean {\n // Gather all device classes\n const deviceClasses = new Map<number, {\n generic: number;\n specific: number;\n }>();\n for (const endpoint of endpointIndizes) {\n const devClassValueId = MultiChannelCCValues.endpointDeviceClass\n .endpoint(endpoint);\n const deviceClass = ctx.getValueDB(nodeId).getValue<{\n generic: number;\n specific: number;\n }>(devClassValueId);\n if (deviceClass) {\n deviceClasses.set(endpoint, {\n generic: deviceClass.generic,\n specific: deviceClass.specific,\n });\n }\n }\n // Endpoints may be useless if all of them have different device classes\n const distinctDeviceClasses = distinct([...deviceClasses.values()].map(({ generic, specific }) => generic * 256 + specific));\n if (distinctDeviceClasses.length !== endpointIndizes.length) {\n // There are endpoints with the same device class, so they are not unnecessary\n return false;\n }\n // Endpoints are necessary if more than 1 of them has a switch-type device class\n const switchTypeDeviceClasses = new Set([\n 0x10, // Binary Switch\n 0x11, // Multilevel Switch\n 0x12, // Remote Switch\n 0x13, // Toggle Switch\n ]);\n const numSwitchEndpoints = [...deviceClasses.values()].filter(({ generic }) => switchTypeDeviceClasses.has(generic)).length;\n if (numSwitchEndpoints > 1)\n return false;\n return true;\n}\n@API(CommandClasses[\"Multi Channel\"])\nexport class MultiChannelCCAPI extends CCAPI {\n public supportsCommand(cmd: MultiChannelCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n // Legacy commands:\n case MultiChannelCommand.GetV1:\n return this.isSinglecast() && this.version === 1;\n case MultiChannelCommand.CommandEncapsulationV1:\n return this.version === 1;\n // The specs start at version 3 but according to OZW,\n // these do seem to be supported in version 2\n case MultiChannelCommand.EndPointGet:\n case MultiChannelCommand.CapabilityGet:\n return this.version >= 2 && this.isSinglecast();\n case MultiChannelCommand.CommandEncapsulation:\n return this.version >= 2;\n case MultiChannelCommand.EndPointFind:\n return this.version >= 3 && this.isSinglecast();\n case MultiChannelCommand.AggregatedMembersGet:\n return this.version >= 4 && this.isSinglecast();\n }\n return super.supportsCommand(cmd);\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getEndpoints() {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.EndPointGet);\n const cc = new MultiChannelCCEndPointGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<MultiChannelCCEndPointReport>(cc, this.commandOptions);\n if (response) {\n return {\n isDynamicEndpointCount: response.countIsDynamic,\n identicalCapabilities: response.identicalCapabilities,\n individualEndpointCount: response.individualCount,\n aggregatedEndpointCount: response.aggregatedCount,\n };\n }\n }\n @validateArgs_MultiChannelCCAPI_getEndpointCapabilities()\n public async getEndpointCapabilities(endpoint: number): Promise<MaybeNotKnown<EndpointCapability>> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CapabilityGet);\n const cc = new MultiChannelCCCapabilityGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n requestedEndpoint: endpoint,\n });\n const response = await this.host.sendCommand<MultiChannelCCCapabilityReport>(cc, this.commandOptions);\n if (response) {\n const generic = getGenericDeviceClass(response.genericDeviceClass);\n const specific = getSpecificDeviceClass(response.genericDeviceClass, response.specificDeviceClass);\n return {\n isDynamic: response.isDynamic,\n wasRemoved: response.wasRemoved,\n supportedCCs: response.supportedCCs,\n generic,\n specific,\n };\n }\n }\n @validateArgs_MultiChannelCCAPI_findEndpoints()\n public async findEndpoints(genericClass: number, specificClass: number): Promise<MaybeNotKnown<readonly number[]>> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.EndPointFind);\n const cc = new MultiChannelCCEndPointFind({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n genericClass,\n specificClass,\n });\n const response = await this.host.sendCommand<MultiChannelCCEndPointFindReport>(cc, this.commandOptions);\n return response?.foundEndpoints;\n }\n @validateArgs_MultiChannelCCAPI_getAggregatedMembers()\n public async getAggregatedMembers(endpoint: number): Promise<MaybeNotKnown<readonly number[]>> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.AggregatedMembersGet);\n const cc = new MultiChannelCCAggregatedMembersGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n requestedEndpoint: endpoint,\n });\n const response = await this.host.sendCommand<MultiChannelCCAggregatedMembersReport>(cc, this.commandOptions);\n return response?.members;\n }\n // Encapsulation is used internally and too frequently that we\n // want to pay the cost of validating each call\n // eslint-disable-next-line @zwave-js/ccapi-validate-args\n public async sendEncapsulated(options: MultiChannelCCCommandEncapsulationOptions): Promise<void> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CommandEncapsulation);\n const cc = new MultiChannelCCCommandEncapsulation({\n nodeId: this.endpoint.nodeId,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_MultiChannelCCAPI_getEndpointCountV1()\n public async getEndpointCountV1(ccId: CommandClasses): Promise<MaybeNotKnown<number>> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.GetV1);\n const cc = new MultiChannelCCV1Get({\n nodeId: this.endpoint.nodeId,\n requestedCC: ccId,\n });\n const response = await this.host.sendCommand<MultiChannelCCV1Report>(cc, this.commandOptions);\n return response?.endpointCount;\n }\n // Encapsulation is used internally and too frequently that we\n // want to pay the cost of validating each call\n // eslint-disable-next-line @zwave-js/ccapi-validate-args\n public async sendEncapsulatedV1(encapsulated: CommandClass): Promise<void> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CommandEncapsulationV1);\n const cc = new MultiChannelCCV1CommandEncapsulation({\n nodeId: this.endpoint.nodeId,\n encapsulated,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n}\n// @publicAPI\nexport interface EndpointCapability {\n generic: GenericDeviceClass;\n specific: SpecificDeviceClass;\n supportedCCs: CommandClasses[];\n isDynamic: boolean;\n wasRemoved: boolean;\n}\n@commandClass(CommandClasses[\"Multi Channel\"])\n@implementedVersion(4)\n@ccValues(MultiChannelCCValues)\nexport class MultiChannelCC extends CommandClass {\n declare ccCommand: MultiChannelCommand;\n /** Tests if a command targets a specific endpoint and thus requires encapsulation */\n public static requiresEncapsulation(cc: CommandClass): boolean {\n return (cc.endpointIndex !== 0\n && !(cc instanceof MultiChannelCCCommandEncapsulation)\n && !(cc instanceof MultiChannelCCV1CommandEncapsulation));\n }\n /** Encapsulates a command that targets a specific endpoint, with version 2+ of the Multi Channel CC */\n public static encapsulate(cc: CommandClass): MultiChannelCCCommandEncapsulation {\n const ret = new MultiChannelCCCommandEncapsulation({\n nodeId: cc.nodeId,\n encapsulated: cc,\n destination: cc.endpointIndex,\n });\n // Copy the encapsulation flags from the encapsulated command\n ret.encapsulationFlags = cc.encapsulationFlags;\n return ret;\n }\n /** Encapsulates a command that targets a specific endpoint, with version 1 of the Multi Channel CC */\n public static encapsulateV1(cc: CommandClass): MultiChannelCCV1CommandEncapsulation {\n const ret = new MultiChannelCCV1CommandEncapsulation({\n nodeId: cc.nodeId,\n endpointIndex: cc.endpointIndex,\n encapsulated: cc,\n });\n // Copy the encapsulation flags from the encapsulated command\n ret.encapsulationFlags = cc.encapsulationFlags;\n return ret;\n }\n public skipEndpointInterview(): boolean {\n // The endpoints are discovered by querying the root device\n return true;\n }\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const removeEndpoints = ctx.getDeviceConfig?.(node.id)?.compat\n ?.removeEndpoints;\n if (removeEndpoints === \"*\") {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Skipping ${this.ccName} interview b/c all endpoints are ignored by the device config file...`,\n direction: \"none\",\n });\n return;\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Special interview procedure for legacy nodes\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (ccVersion === 1)\n return this.interviewV1(ctx);\n const endpoint = node.getEndpoint(this.endpointIndex)!;\n const api = CCAPI.create(CommandClasses[\"Multi Channel\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n const valueDB = this.getValueDB(ctx);\n // Step 1: Retrieve general information about end points\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying device endpoint information...\",\n direction: \"outbound\",\n });\n const multiResponse = await api.getEndpoints();\n if (!multiResponse) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying device endpoint information timed out, aborting interview...\",\n level: \"warn\",\n });\n return this.throwMissingCriticalInterviewResponse();\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received response for device endpoints:\", {\n nested: logDict({\n \"endpoint count (individual)\": multiResponse.individualEndpointCount,\n \"count is dynamic\": multiResponse.isDynamicEndpointCount,\n \"identical capabilities\": multiResponse.identicalCapabilities,\n \"endpoint count (aggregated)\": multiResponse.aggregatedEndpointCount,\n }),\n }),\n direction: \"inbound\",\n });\n let allEndpoints: number[] = [];\n const addSequentialEndpoints = (): void => {\n for (let i = 1; i\n <= multiResponse.individualEndpointCount\n + (multiResponse.aggregatedEndpointCount ?? 0); i++) {\n allEndpoints.push(i);\n }\n };\n if (api.supportsCommand(MultiChannelCommand.EndPointFind)) {\n // Step 2a: Find all endpoints\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying all endpoints...\",\n direction: \"outbound\",\n });\n const foundEndpoints = await api.findEndpoints(0xff, 0xff);\n if (foundEndpoints)\n allEndpoints.push(...foundEndpoints);\n if (!allEndpoints.length) {\n // Create a sequential list of endpoints\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Endpoint query returned no results, assuming that endpoints are sequential`,\n direction: \"inbound\",\n });\n addSequentialEndpoints();\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received endpoints: ${allEndpoints\n .map(String)\n .join(\", \")}`,\n direction: \"inbound\",\n });\n }\n }\n else {\n // Step 2b: Assume that the endpoints are in sequential order\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `does not support EndPointFind, assuming that endpoints are sequential`,\n direction: \"none\",\n });\n addSequentialEndpoints();\n }\n // Step 2.5: remove ignored endpoints\n if (removeEndpoints?.length) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `The following endpoints are ignored through the config file: ${removeEndpoints.join(\", \")}`,\n direction: \"none\",\n });\n allEndpoints = allEndpoints.filter((e) => !removeEndpoints.includes(e));\n }\n // Step 3: Query endpoints\n let hasQueriedCapabilities = false;\n let completedEndpoints = 0;\n for (const endpoint of allEndpoints) {\n node.reportInterviewProgress(++completedEndpoints, allEndpoints.length);\n if (endpoint > multiResponse.individualEndpointCount\n && ccVersion >= 4) {\n // Find members of aggregated end point\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying members of aggregated endpoint #${endpoint}...`,\n direction: \"outbound\",\n });\n const members = await api.getAggregatedMembers(endpoint);\n if (members) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `aggregated endpoint #${endpoint} has members ${members\n .map(String)\n .join(\", \")}`,\n direction: \"inbound\",\n });\n }\n }\n // When the device reports identical capabilities for all endpoints,\n // we don't need to query them all\n if (multiResponse.identicalCapabilities && hasQueriedCapabilities) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `all endpoints identical, skipping capability query for endpoint #${endpoint}...`,\n direction: \"none\",\n });\n // copy the capabilities from the first endpoint\n const devClass = valueDB.getValue(MultiChannelCCValues.endpointDeviceClass.endpoint(allEndpoints[0]));\n valueDB.setValue(MultiChannelCCValues.endpointDeviceClass.endpoint(endpoint), devClass);\n const ep1Caps = valueDB.getValue<CommandClasses[]>(MultiChannelCCValues.endpointCCs.endpoint(allEndpoints[0]))!;\n valueDB.setValue(MultiChannelCCValues.endpointCCs.endpoint(endpoint), [...ep1Caps]);\n continue;\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying capabilities for endpoint #${endpoint}...`,\n direction: \"outbound\",\n });\n const caps = await api.getEndpointCapabilities(endpoint);\n if (caps) {\n hasQueriedCapabilities = true;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(`received response for endpoint capabilities (#${endpoint}):`, {\n nested: logDict({\n \"generic device class\": caps.generic.label,\n \"specific device class\": caps.specific.label,\n \"is dynamic end point\": caps.isDynamic,\n \"supported CCs\": logList(caps.supportedCCs.map((cc) => getCCName(cc))),\n }),\n }),\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Querying endpoint #${endpoint} capabilities timed out, aborting interview...`,\n level: \"warn\",\n });\n return this.throwMissingCriticalInterviewResponse();\n }\n }\n // Now that all endpoints have been interviewed, remember which ones are there\n // But first figure out if they seem unnecessary and if they do, which ones should be preserved\n if (!multiResponse.identicalCapabilities\n && areEndpointsUnnecessary(ctx, node.id, allEndpoints)) {\n const preserve = ctx.getDeviceConfig?.(node.id)?.compat\n ?.preserveEndpoints;\n if (!preserve) {\n allEndpoints = [];\n ctx.logNode(node.id, {\n message: `Endpoints seem unnecessary b/c they have different device classes, ignoring all...`,\n });\n }\n else if (preserve === \"*\") {\n // preserve all endpoints, do nothing\n ctx.logNode(node.id, {\n message: `Endpoints seem unnecessary, but are configured to be preserved.`,\n });\n }\n else {\n allEndpoints = allEndpoints.filter((ep) => preserve.includes(ep));\n ctx.logNode(node.id, {\n message: `Endpoints seem unnecessary, but endpoints ${allEndpoints.join(\", \")} are configured to be preserved.`,\n });\n }\n }\n this.setValue(ctx, MultiChannelCCValues.endpointIndizes, allEndpoints);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n private async interviewV1(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const removeEndpoints = ctx.getDeviceConfig?.(node.id)?.compat\n ?.removeEndpoints;\n if (removeEndpoints === \"*\") {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Skipping ${this.ccName} interview b/c all endpoints are ignored by the device config file...`,\n direction: \"none\",\n });\n return;\n }\n const api = CCAPI.create(CommandClasses[\"Multi Channel\"], ctx, endpoint);\n const valueDB = this.getValueDB(ctx);\n // V1 works the opposite way - we scan all CCs and remember how many\n // endpoints they have\n const supportedCCs = [...node.getCCs()]\n // Don't query CCs the node only controls\n .filter(([, info]) => info.isSupported)\n .map(([cc]) => cc)\n // Don't query CCs that want to skip the endpoint interview\n .filter((cc) => !CommandClass.createInstanceUnchecked(node, cc)?.skipEndpointInterview());\n const endpointCounts = new Map<CommandClasses, number>();\n for (const ccId of supportedCCs) {\n ctx.logNode(node.id, {\n message: `Querying endpoint count for CommandClass ${getCCName(ccId)}...`,\n direction: \"outbound\",\n });\n const endpointCount = await api.getEndpointCountV1(ccId);\n if (endpointCount != undefined) {\n endpointCounts.set(ccId, endpointCount);\n ctx.logNode(node.id, {\n message: `CommandClass ${getCCName(ccId)} has ${endpointCount} endpoints`,\n direction: \"inbound\",\n });\n }\n }\n // Store the collected information\n // We have only individual and no dynamic and no aggregated endpoints\n const numEndpoints = Math.max(...endpointCounts.values());\n this.setValue(ctx, MultiChannelCCValues.endpointCountIsDynamic, false);\n this.setValue(ctx, MultiChannelCCValues.aggregatedEndpointCount, 0);\n this.setValue(ctx, MultiChannelCCValues.individualEndpointCount, numEndpoints);\n // Since we queried all CCs separately, we can assume that all\n // endpoints have different capabilities\n this.setValue(ctx, MultiChannelCCValues.endpointsHaveIdenticalCapabilities, false);\n if (removeEndpoints?.length) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `The following endpoints are ignored through the config file: ${removeEndpoints.join(\", \")}`,\n direction: \"none\",\n });\n }\n const allEndpoints: number[] = [];\n for (let endpoint = 1; endpoint <= numEndpoints; endpoint++) {\n // Skip this endpoint if flagged for removal\n if (!removeEndpoints?.includes(endpoint)) {\n // Check which CCs exist on this endpoint\n const endpointCCs = [...endpointCounts.entries()]\n .filter(([, ccEndpoints]) => ccEndpoints >= endpoint)\n .map(([ccId]) => ccId);\n // And store it per endpoint\n valueDB.setValue(MultiChannelCCValues.endpointCCs.endpoint(endpoint), endpointCCs);\n allEndpoints.push(endpoint);\n }\n }\n this.setValue(ctx, MultiChannelCCValues.endpointIndizes, allEndpoints);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n}\n// @publicAPI\nexport interface MultiChannelCCEndPointReportOptions {\n countIsDynamic: boolean;\n identicalCapabilities: boolean;\n individualCount: number;\n aggregatedCount?: number;\n}\n@CCCommand(MultiChannelCommand.EndPointReport)\n@ccValueProperty(\"countIsDynamic\", MultiChannelCCValues.endpointCountIsDynamic)\n@ccValueProperty(\"identicalCapabilities\", MultiChannelCCValues.endpointsHaveIdenticalCapabilities)\n@ccValueProperty(\"individualCount\", MultiChannelCCValues.individualEndpointCount)\n@ccValueProperty(\"aggregatedCount\", MultiChannelCCValues.aggregatedEndpointCount)\nexport class MultiChannelCCEndPointReport extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCEndPointReportOptions>) {\n super(options);\n this.countIsDynamic = options.countIsDynamic;\n this.identicalCapabilities = options.identicalCapabilities;\n this.individualCount = options.individualCount;\n this.aggregatedCount = options.aggregatedCount;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCEndPointReport {\n validatePayload(raw.payload.length >= 2);\n const countIsDynamic = !!(raw.payload[0] & 0b10000000);\n const identicalCapabilities = !!(raw.payload[0] & 0b01000000);\n const individualCount = raw.payload[1] & 0b01111111;\n let aggregatedCount: MaybeNotKnown<number>;\n if (raw.payload.length >= 3) {\n aggregatedCount = raw.payload[2] & 0b01111111;\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n countIsDynamic,\n identicalCapabilities,\n individualCount,\n aggregatedCount,\n });\n }\n public countIsDynamic: boolean;\n public identicalCapabilities: boolean;\n public individualCount: number;\n public aggregatedCount: MaybeNotKnown<number>;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n (this.countIsDynamic ? 0b10000000 : 0)\n | (this.identicalCapabilities ? 0b01000000 : 0),\n this.individualCount & 0b01111111,\n this.aggregatedCount ?? 0,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"endpoint count (individual)\": this.individualCount,\n \"count is dynamic\": this.countIsDynamic,\n \"identical capabilities\": this.identicalCapabilities,\n };\n if (this.aggregatedCount != undefined) {\n message[\"endpoint count (aggregated)\"] = this.aggregatedCount;\n }\n const ret = {\n ...super.toLogEntry(ctx),\n message,\n };\n return ret;\n }\n}\n@CCCommand(MultiChannelCommand.EndPointGet)\n@expectedCCResponse(MultiChannelCCEndPointReport)\nexport class MultiChannelCCEndPointGet extends MultiChannelCC {\n}\n// @publicAPI\nexport interface MultiChannelCCCapabilityReportOptions {\n endpointIndex: number;\n genericDeviceClass: number;\n specificDeviceClass: number;\n supportedCCs: CommandClasses[];\n isDynamic: boolean;\n wasRemoved: boolean;\n}\n@CCCommand(MultiChannelCommand.CapabilityReport)\nexport class MultiChannelCCCapabilityReport extends MultiChannelCC implements ApplicationNodeInformation {\n public constructor(options: WithAddress<MultiChannelCCCapabilityReportOptions>) {\n super(options);\n this.endpointIndex = options.endpointIndex;\n this.genericDeviceClass = options.genericDeviceClass;\n this.specificDeviceClass = options.specificDeviceClass;\n this.supportedCCs = options.supportedCCs;\n this.isDynamic = options.isDynamic;\n this.wasRemoved = options.wasRemoved;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCCapabilityReport {\n // Only validate the bytes we expect to see here\n // parseApplicationNodeInformation does its own validation\n validatePayload(raw.payload.length >= 1);\n const endpointIndex = raw.payload[0] & 0b01111111;\n const isDynamic = !!(raw.payload[0] & 0b10000000);\n const NIF = parseApplicationNodeInformation(raw.payload.subarray(1));\n const genericDeviceClass = NIF.genericDeviceClass;\n const specificDeviceClass = NIF.specificDeviceClass;\n const supportedCCs: CommandClasses[] = NIF.supportedCCs;\n // Removal reports have very specific information\n const wasRemoved: boolean = isDynamic\n && genericDeviceClass === 0xff // \"Non-Interoperable\"\n && specificDeviceClass === 0x00;\n return new this({\n nodeId: ctx.sourceNodeId,\n endpointIndex,\n isDynamic,\n genericDeviceClass,\n specificDeviceClass,\n supportedCCs,\n wasRemoved,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n const deviceClassValue = MultiChannelCCValues.endpointDeviceClass;\n const ccsValue = MultiChannelCCValues.endpointCCs;\n if (this.wasRemoved) {\n this.removeValue(ctx, deviceClassValue);\n this.removeValue(ctx, ccsValue);\n }\n else {\n this.setValue(ctx, deviceClassValue, {\n generic: this.genericDeviceClass,\n specific: this.specificDeviceClass,\n });\n this.setValue(ctx, ccsValue, this.supportedCCs);\n }\n return true;\n }\n // The endpoint index must be overridden to be able to attribute the information to the correct endpoint\n public readonly genericDeviceClass: number;\n public readonly specificDeviceClass: number;\n public readonly supportedCCs: CommandClasses[];\n public readonly isDynamic: boolean;\n public readonly wasRemoved: boolean;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [\n (this.endpointIndex & 0b01111111)\n | (this.isDynamic ? 0b10000000 : 0),\n ],\n encodeApplicationNodeInformation(this),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"endpoint index\": this.endpointIndex,\n \"generic device class\": getGenericDeviceClass(this.genericDeviceClass).label,\n \"specific device class\": getSpecificDeviceClass(this.genericDeviceClass, this.specificDeviceClass).label,\n \"is dynamic end point\": this.isDynamic,\n \"supported CCs\": logList(this.supportedCCs.map((cc) => getCCName(cc))),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCCapabilityGetOptions {\n requestedEndpoint: number;\n}\nfunction testResponseForMultiChannelCapabilityGet(sent: MultiChannelCCCapabilityGet, received: MultiChannelCCCapabilityReport) {\n return received.endpointIndex === sent.requestedEndpoint;\n}\n@CCCommand(MultiChannelCommand.CapabilityGet)\n@expectedCCResponse(MultiChannelCCCapabilityReport, testResponseForMultiChannelCapabilityGet)\nexport class MultiChannelCCCapabilityGet extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCCapabilityGetOptions>) {\n super(options);\n this.requestedEndpoint = options.requestedEndpoint;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCCapabilityGet {\n validatePayload(raw.payload.length >= 1);\n const requestedEndpoint = raw.payload[0] & 0b01111111;\n return new this({\n nodeId: ctx.sourceNodeId,\n requestedEndpoint,\n });\n }\n public requestedEndpoint: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.requestedEndpoint & 0b01111111]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { endpoint: this.requestedEndpoint },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCEndPointFindReportOptions {\n genericClass: number;\n specificClass: number;\n foundEndpoints: number[];\n reportsToFollow: number;\n}\n@CCCommand(MultiChannelCommand.EndPointFindReport)\nexport class MultiChannelCCEndPointFindReport extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCEndPointFindReportOptions>) {\n super(options);\n this.genericClass = options.genericClass;\n this.specificClass = options.specificClass;\n this.foundEndpoints = options.foundEndpoints;\n this.reportsToFollow = options.reportsToFollow;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCEndPointFindReport {\n validatePayload(raw.payload.length >= 3);\n const reportsToFollow = raw.payload[0];\n const genericClass = raw.payload[1];\n const specificClass = raw.payload[2];\n // Some devices omit the endpoint list although that is not allowed in the specs\n // therefore don't validatePayload here.\n const foundEndpoints = [...raw.payload.subarray(3)]\n .map((e) => e & 0b01111111)\n .filter((e) => e !== 0);\n return new this({\n nodeId: ctx.sourceNodeId,\n reportsToFollow,\n genericClass,\n specificClass,\n foundEndpoints,\n });\n }\n public genericClass: number;\n public specificClass: number;\n public foundEndpoints: number[];\n public reportsToFollow: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [\n this.reportsToFollow,\n this.genericClass,\n this.specificClass,\n ],\n Bytes.from(this.foundEndpoints.map((e) => e & 0b01111111)),\n ]);\n return super.serialize(ctx);\n }\n public getPartialCCSessionId(): Record<string, any> | undefined {\n // Distinguish sessions by the requested device classes\n return {\n genericClass: this.genericClass,\n specificClass: this.specificClass,\n };\n }\n public getRemainingSegments(): number | undefined {\n return this.reportsToFollow;\n }\n public mergePartialCCs(partials: MultiChannelCCEndPointFindReport[], _ctx: CCParsingContext): Promise<void> {\n // Concat the list of end points\n this.foundEndpoints = [...partials, this]\n .map((report) => report.foundEndpoints)\n .reduce((prev, cur) => prev.concat(...cur), []);\n return Promise.resolve();\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"generic device class\": getGenericDeviceClass(this.genericClass).label,\n \"specific device class\": getSpecificDeviceClass(this.genericClass, this.specificClass).label,\n \"found endpoints\": this.foundEndpoints.join(\", \"),\n \"# of reports to follow\": this.reportsToFollow,\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCEndPointFindOptions {\n genericClass: number;\n specificClass: number;\n}\n@CCCommand(MultiChannelCommand.EndPointFind)\n@expectedCCResponse(MultiChannelCCEndPointFindReport)\nexport class MultiChannelCCEndPointFind extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCEndPointFindOptions>) {\n super(options);\n this.genericClass = options.genericClass;\n this.specificClass = options.specificClass;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCEndPointFind {\n validatePayload(raw.payload.length >= 2);\n const genericClass = raw.payload[0];\n const specificClass = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n genericClass,\n specificClass,\n });\n }\n public genericClass: number;\n public specificClass: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.genericClass, this.specificClass]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"generic device class\": getGenericDeviceClass(this.genericClass).label,\n \"specific device class\": getSpecificDeviceClass(this.genericClass, this.specificClass).label,\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCAggregatedMembersReportOptions {\n aggregatedEndpointIndex: number;\n members: number[];\n}\n@CCCommand(MultiChannelCommand.AggregatedMembersReport)\n@ccValueProperty(\"members\", MultiChannelCCValues.aggregatedEndpointMembers, (self) => [self.aggregatedEndpointIndex])\nexport class MultiChannelCCAggregatedMembersReport extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCAggregatedMembersReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.aggregatedEndpointIndex = options.aggregatedEndpointIndex;\n this.members = options.members;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCAggregatedMembersReport {\n validatePayload(raw.payload.length >= 2);\n const aggregatedEndpointIndex = raw.payload[0] & 127;\n const bitMaskLength = raw.payload[1];\n validatePayload(raw.payload.length >= 2 + bitMaskLength);\n const bitMask = raw.payload.subarray(2, 2 + bitMaskLength);\n const members = parseBitMask(bitMask);\n return new this({\n nodeId: ctx.sourceNodeId,\n aggregatedEndpointIndex,\n members,\n });\n }\n public readonly aggregatedEndpointIndex: number;\n public readonly members: readonly number[];\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"aggregated endpoint\": this.aggregatedEndpointIndex,\n members: this.members.join(\", \"),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCAggregatedMembersGetOptions {\n requestedEndpoint: number;\n}\n@CCCommand(MultiChannelCommand.AggregatedMembersGet)\n@expectedCCResponse(MultiChannelCCAggregatedMembersReport)\nexport class MultiChannelCCAggregatedMembersGet extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCAggregatedMembersGetOptions>) {\n super(options);\n this.requestedEndpoint = options.requestedEndpoint;\n }\n public static from(_raw: CCRaw, _ctx: CCParsingContext): MultiChannelCCAggregatedMembersGet {\n // TODO: Deserialize payload\n throw new ZWaveError(`${this.name}: deserialization not implemented`, ZWaveErrorCodes.Deserialization_NotImplemented);\n // return new MultiChannelCCAggregatedMembersGet({\n // \tnodeId: ctx.sourceNodeId,\n // });\n }\n public requestedEndpoint: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.requestedEndpoint & 127]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { endpoint: this.requestedEndpoint },\n };\n }\n}\n// @publicAPI\nexport type MultiChannelCCDestination = number | (1 | 2 | 3 | 4 | 5 | 6 | 7)[];\n// @publicAPI\nexport interface MultiChannelCCCommandEncapsulationOptions {\n encapsulated: CommandClass;\n destination: MultiChannelCCDestination;\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.\nfunction getCCResponseForCommandEncapsulation(ctx: GetNode<NodeId & SupportsCC>, sent: MultiChannelCCCommandEncapsulation) {\n if (typeof sent.destination === \"number\"\n && sent.encapsulated.expectsCCResponse(ctx)) {\n // Allow both versions of the encapsulation command\n // Our implementation check is a bit too strict, so change the return type\n return [\n MultiChannelCCCommandEncapsulation,\n MultiChannelCCV1CommandEncapsulation,\n ] as any as (typeof MultiChannelCCCommandEncapsulation)[];\n }\n}\nfunction testResponseForCommandEncapsulation(sent: MultiChannelCCCommandEncapsulation, received: MultiChannelCCCommandEncapsulation | MultiChannelCCV1CommandEncapsulation) {\n if (typeof sent.destination === \"number\"\n && sent.destination === received.endpointIndex) {\n return \"checkEncapsulated\";\n }\n return false;\n}\n@CCCommand(MultiChannelCommand.CommandEncapsulation)\n@expectedCCResponse(getCCResponseForCommandEncapsulation, testResponseForCommandEncapsulation)\nexport class MultiChannelCCCommandEncapsulation extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCCommandEncapsulationOptions>) {\n super(options);\n this.encapsulated = options.encapsulated;\n this.encapsulated.encapsulatingCC = this as any;\n // Propagate the endpoint index all the way down\n let cur: CommandClass = this;\n while (cur) {\n if (isMultiEncapsulatingCommandClass(cur)) {\n for (const cc of cur.encapsulated) {\n cc.endpointIndex = this.endpointIndex;\n }\n break;\n }\n else if (isEncapsulatingCommandClass(cur)) {\n cur.encapsulated.endpointIndex = this.endpointIndex;\n cur = cur.encapsulated;\n }\n else {\n break;\n }\n }\n this.destination = options.destination;\n }\n public static async from(raw: CCRaw, ctx: CCParsingContext): Promise<MultiChannelCCCommandEncapsulation> {\n validatePayload(raw.payload.length >= 2);\n let endpointIndex: number;\n let destination: MultiChannelCCDestination;\n if (ctx.getDeviceConfig?.(ctx.sourceNodeId)\n ?.compat?.treatDestinationEndpointAsSource) {\n // This device incorrectly uses the destination field to indicate the source endpoint\n endpointIndex = raw.payload[1] & 127;\n destination = 0;\n }\n else {\n // Parse normally\n endpointIndex = raw.payload[0] & 127;\n const isBitMask = !!(raw.payload[1] & 128);\n destination = raw.payload[1] & 127;\n if (isBitMask) {\n destination = parseBitMask(Bytes.from([destination])) as any;\n }\n }\n // No need to validate further, each CC does it for itself\n const encapsulated = await CommandClass.parse(raw.payload.subarray(2), ctx);\n return new this({\n nodeId: ctx.sourceNodeId,\n endpointIndex,\n destination,\n encapsulated,\n });\n }\n public encapsulated: CommandClass;\n /** The destination end point (0-127) or an array of destination end points (1-7) */\n public destination: MultiChannelCCDestination;\n public async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (ctx.getDeviceConfig?.(this.nodeId as number)?.compat\n ?.treatDestinationEndpointAsSource) {\n // This device incorrectly responds from the endpoint we've passed as our source endpoint\n if (typeof this.destination === \"number\") {\n this.endpointIndex = this.destination;\n }\n }\n const destination = typeof this.destination === \"number\"\n // The destination is a single number\n ? this.destination & 127\n // The destination is a bit mask\n : encodeBitMask(this.destination, 7)[0] | 128;\n this.payload = Bytes.concat([\n [this.endpointIndex & 127, destination],\n await this.encapsulated.serialize(ctx),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n source: this.endpointIndex,\n destination: typeof this.destination === \"number\"\n ? this.destination\n : this.destination.join(\", \"),\n },\n };\n }\n protected computeEncapsulationOverhead(): number {\n // Multi Channel CC adds two bytes for the source and destination endpoint\n return super.computeEncapsulationOverhead() + 2;\n }\n}\n// @publicAPI\nexport interface MultiChannelCCV1ReportOptions {\n requestedCC: CommandClasses;\n endpointCount: number;\n}\n@CCCommand(MultiChannelCommand.ReportV1)\nexport class MultiChannelCCV1Report extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCV1ReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.requestedCC = options.requestedCC;\n this.endpointCount = options.endpointCount;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCV1Report {\n // V1 won't be extended in the future, so do an exact check\n validatePayload(raw.payload.length === 2);\n const requestedCC: CommandClasses = raw.payload[0];\n const endpointCount = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n requestedCC,\n endpointCount,\n });\n }\n public readonly requestedCC: CommandClasses;\n public readonly endpointCount: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n this.requestedCC,\n this.endpointCount,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n CC: getCCName(this.requestedCC),\n \"# of endpoints\": this.endpointCount,\n },\n };\n }\n}\nfunction testResponseForMultiChannelV1Get(sent: MultiChannelCCV1Get, received: MultiChannelCCV1Report) {\n return sent.requestedCC === received.requestedCC;\n}\n// @publicAPI\nexport interface MultiChannelCCV1GetOptions {\n requestedCC: CommandClasses;\n}\n@CCCommand(MultiChannelCommand.GetV1)\n@expectedCCResponse(MultiChannelCCV1Report, testResponseForMultiChannelV1Get)\nexport class MultiChannelCCV1Get extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCV1GetOptions>) {\n super(options);\n this.requestedCC = options.requestedCC;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCV1Get {\n // V1 won't be extended in the future, so do an exact check\n validatePayload(raw.payload.length === 1);\n const requestedCC: CommandClasses = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n requestedCC,\n });\n }\n public requestedCC: CommandClasses;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.requestedCC]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { CC: getCCName(this.requestedCC) },\n };\n }\n}\nfunction getResponseForV1CommandEncapsulation(ctx: GetNode<NodeId & SupportsCC>, sent: MultiChannelCCV1CommandEncapsulation) {\n if (sent.encapsulated.expectsCCResponse(ctx)) {\n return MultiChannelCCV1CommandEncapsulation;\n }\n}\nfunction testResponseForV1CommandEncapsulation(sent: MultiChannelCCV1CommandEncapsulation, received: MultiChannelCCV1CommandEncapsulation) {\n if (sent.endpointIndex === received.endpointIndex) {\n return \"checkEncapsulated\";\n }\n return false;\n}\n// @publicAPI\nexport interface MultiChannelCCV1CommandEncapsulationOptions {\n encapsulated: CommandClass;\n}\n@CCCommand(MultiChannelCommand.CommandEncapsulationV1)\n@expectedCCResponse(getResponseForV1CommandEncapsulation, testResponseForV1CommandEncapsulation)\nexport class MultiChannelCCV1CommandEncapsulation extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCV1CommandEncapsulationOptions>) {\n super(options);\n this.encapsulated = options.encapsulated;\n this.encapsulated.encapsulatingCC = this as any;\n // Propagate the endpoint index all the way down\n let cur: CommandClass = this;\n while (cur) {\n if (isMultiEncapsulatingCommandClass(cur)) {\n for (const cc of cur.encapsulated) {\n cc.endpointIndex = this.endpointIndex;\n }\n break;\n }\n else if (isEncapsulatingCommandClass(cur)) {\n cur.encapsulated.endpointIndex = this.endpointIndex;\n cur = cur.encapsulated;\n }\n else {\n break;\n }\n }\n }\n public static async from(raw: CCRaw, ctx: CCParsingContext): Promise<MultiChannelCCV1CommandEncapsulation> {\n validatePayload(raw.payload.length >= 1);\n const endpointIndex = raw.payload[0];\n // Some devices send invalid reports, i.e. MultiChannelCCV1CommandEncapsulation, but with V2+ binary format\n // This would be a NoOp CC, but it makes no sense to encapsulate that.\n const isV2withV1Header = raw.payload.length >= 2\n && raw.payload[1] === 0x00;\n // No need to validate further, each CC does it for itself\n const encapsulated = await CommandClass.parse(raw.payload.subarray(isV2withV1Header ? 2 : 1), ctx);\n return new this({\n nodeId: ctx.sourceNodeId,\n endpointIndex,\n encapsulated,\n });\n }\n public encapsulated!: CommandClass;\n public async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.endpointIndex],\n await this.encapsulated.serialize(ctx),\n ]);\n return super.serialize(ctx);\n }\n protected computeEncapsulationOverhead(): number {\n // Multi Channel CC V1 adds one byte for the endpoint index\n return super.computeEncapsulationOverhead() + 1;\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { source: this.endpointIndex },\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["endpoint"]
4
+ "sourcesContent": ["import * as __validateArgs from \"./MultiChannelCC._validateArgs.js\";\nconst { validateArgs_MultiChannelCCAPI_getEndpointCapabilities, validateArgs_MultiChannelCCAPI_findEndpoints, validateArgs_MultiChannelCCAPI_getAggregatedMembers, validateArgs_MultiChannelCCAPI_getEndpointCountV1 } = __validateArgs;\nimport { type ApplicationNodeInformation, CommandClasses, type GenericDeviceClass, type GetNode, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type NodeId, type SpecificDeviceClass, type SupportsCC, type WithAddress, ZWaveError, ZWaveErrorCodes, encodeApplicationNodeInformation, encodeBitMask, getCCName, getGenericDeviceClass, getSpecificDeviceClass, logDict, logList, logText, parseApplicationNodeInformation, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { CCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, CommandRelation, type InterviewContext, type PersistValuesContext, getEffectiveCCVersion, haveSameDestination, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, } from \"../lib/CommandClassDecorators.js\";\nimport { isEncapsulatingCommandClass, isMultiEncapsulatingCommandClass, } from \"../lib/EncapsulatingCommandClass.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MultiChannelCommand } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { MultiChannelCCValues } from \"./_CCValues.generated.js\";\nexport { MultiChannelCCValues };\n// @noSetValueAPI\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(ctx: GetValueDB, nodeId: number, endpointIndizes: number[]): boolean {\n // Gather all device classes\n const deviceClasses = new Map<number, {\n generic: number;\n specific: number;\n }>();\n for (const endpoint of endpointIndizes) {\n const devClassValueId = MultiChannelCCValues.endpointDeviceClass.endpoint(endpoint);\n const deviceClass = ctx.getValueDB(nodeId).getValue<{\n generic: number;\n specific: number;\n }>(devClassValueId);\n if (deviceClass) {\n deviceClasses.set(endpoint, {\n generic: deviceClass.generic,\n specific: deviceClass.specific,\n });\n }\n }\n // Endpoints may be useless if all of them have different device classes\n const distinctDeviceClasses = distinct([...deviceClasses.values()].map(({ generic, specific }) => generic * 256 + specific));\n if (distinctDeviceClasses.length !== endpointIndizes.length) {\n // There are endpoints with the same device class, so they are not unnecessary\n return false;\n }\n // Endpoints are necessary if more than 1 of them has a switch-type device class\n const switchTypeDeviceClasses = new Set([\n 0x10, // Binary Switch\n 0x11, // Multilevel Switch\n 0x12, // Remote Switch\n 0x13, // Toggle Switch\n ]);\n const numSwitchEndpoints = [...deviceClasses.values()].filter(({ generic }) => switchTypeDeviceClasses.has(generic)).length;\n if (numSwitchEndpoints > 1)\n return false;\n return true;\n}\n@API(CommandClasses[\"Multi Channel\"])\nexport class MultiChannelCCAPI extends CCAPI {\n public supportsCommand(cmd: MultiChannelCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n // Legacy commands:\n case MultiChannelCommand.GetV1:\n return this.isSinglecast() && this.version === 1;\n case MultiChannelCommand.CommandEncapsulationV1:\n return this.version === 1;\n // The specs start at version 3 but according to OZW,\n // these do seem to be supported in version 2\n case MultiChannelCommand.EndPointGet:\n case MultiChannelCommand.CapabilityGet:\n return this.version >= 2 && this.isSinglecast();\n case MultiChannelCommand.CommandEncapsulation:\n return this.version >= 2;\n case MultiChannelCommand.EndPointFind:\n return this.version >= 3 && this.isSinglecast();\n case MultiChannelCommand.AggregatedMembersGet:\n return this.version >= 4 && this.isSinglecast();\n }\n return super.supportsCommand(cmd);\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getEndpoints() {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.EndPointGet);\n const cc = new MultiChannelCCEndPointGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<MultiChannelCCEndPointReport>(cc, this.commandOptions);\n if (response) {\n return {\n isDynamicEndpointCount: response.countIsDynamic,\n identicalCapabilities: response.identicalCapabilities,\n individualEndpointCount: response.individualCount,\n aggregatedEndpointCount: response.aggregatedCount,\n };\n }\n }\n @validateArgs_MultiChannelCCAPI_getEndpointCapabilities()\n public async getEndpointCapabilities(endpoint: number): Promise<MaybeNotKnown<EndpointCapability>> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CapabilityGet);\n const cc = new MultiChannelCCCapabilityGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n requestedEndpoint: endpoint,\n });\n const response = await this.host.sendCommand<MultiChannelCCCapabilityReport>(cc, this.commandOptions);\n if (response) {\n const generic = getGenericDeviceClass(response.genericDeviceClass);\n const specific = getSpecificDeviceClass(response.genericDeviceClass, response.specificDeviceClass);\n return {\n isDynamic: response.isDynamic,\n wasRemoved: response.wasRemoved,\n supportedCCs: response.supportedCCs,\n generic,\n specific,\n };\n }\n }\n @validateArgs_MultiChannelCCAPI_findEndpoints()\n public async findEndpoints(genericClass: number, specificClass: number): Promise<MaybeNotKnown<readonly number[]>> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.EndPointFind);\n const cc = new MultiChannelCCEndPointFind({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n genericClass,\n specificClass,\n });\n const response = await this.host.sendCommand<MultiChannelCCEndPointFindReport>(cc, this.commandOptions);\n return response?.foundEndpoints;\n }\n @validateArgs_MultiChannelCCAPI_getAggregatedMembers()\n public async getAggregatedMembers(endpoint: number): Promise<MaybeNotKnown<readonly number[]>> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.AggregatedMembersGet);\n const cc = new MultiChannelCCAggregatedMembersGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n requestedEndpoint: endpoint,\n });\n const response = await this.host.sendCommand<MultiChannelCCAggregatedMembersReport>(cc, this.commandOptions);\n return response?.members;\n }\n // Encapsulation is used internally and too frequently that we\n // want to pay the cost of validating each call\n // eslint-disable-next-line @zwave-js/ccapi-validate-args\n public async sendEncapsulated(options: MultiChannelCCCommandEncapsulationOptions): Promise<void> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CommandEncapsulation);\n const cc = new MultiChannelCCCommandEncapsulation({\n nodeId: this.endpoint.nodeId,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_MultiChannelCCAPI_getEndpointCountV1()\n public async getEndpointCountV1(ccId: CommandClasses): Promise<MaybeNotKnown<number>> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.GetV1);\n const cc = new MultiChannelCCV1Get({\n nodeId: this.endpoint.nodeId,\n requestedCC: ccId,\n });\n const response = await this.host.sendCommand<MultiChannelCCV1Report>(cc, this.commandOptions);\n return response?.endpointCount;\n }\n // Encapsulation is used internally and too frequently that we\n // want to pay the cost of validating each call\n // eslint-disable-next-line @zwave-js/ccapi-validate-args\n public async sendEncapsulatedV1(encapsulated: CommandClass): Promise<void> {\n this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CommandEncapsulationV1);\n const cc = new MultiChannelCCV1CommandEncapsulation({\n nodeId: this.endpoint.nodeId,\n encapsulated,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n}\n// @publicAPI\nexport interface EndpointCapability {\n generic: GenericDeviceClass;\n specific: SpecificDeviceClass;\n supportedCCs: CommandClasses[];\n isDynamic: boolean;\n wasRemoved: boolean;\n}\n@commandClass(CommandClasses[\"Multi Channel\"])\n@implementedVersion(4)\n@ccValues(MultiChannelCCValues)\nexport class MultiChannelCC extends CommandClass {\n declare ccCommand: MultiChannelCommand;\n /** Tests if a command targets a specific endpoint and thus requires encapsulation */\n public static requiresEncapsulation(cc: CommandClass): boolean {\n return (cc.endpointIndex !== 0\n && !(cc instanceof MultiChannelCCCommandEncapsulation)\n && !(cc instanceof MultiChannelCCV1CommandEncapsulation));\n }\n /** Encapsulates a command that targets a specific endpoint, with version 2+ of the Multi Channel CC */\n public static encapsulate(cc: CommandClass): MultiChannelCCCommandEncapsulation {\n const ret = new MultiChannelCCCommandEncapsulation({\n nodeId: cc.nodeId,\n encapsulated: cc,\n destination: cc.endpointIndex,\n });\n // Copy the encapsulation flags from the encapsulated command\n ret.encapsulationFlags = cc.encapsulationFlags;\n return ret;\n }\n /** Encapsulates a command that targets a specific endpoint, with version 1 of the Multi Channel CC */\n public static encapsulateV1(cc: CommandClass): MultiChannelCCV1CommandEncapsulation {\n const ret = new MultiChannelCCV1CommandEncapsulation({\n nodeId: cc.nodeId,\n endpointIndex: cc.endpointIndex,\n encapsulated: cc,\n });\n // Copy the encapsulation flags from the encapsulated command\n ret.encapsulationFlags = cc.encapsulationFlags;\n return ret;\n }\n public skipEndpointInterview(): boolean {\n // The endpoints are discovered by querying the root device\n return true;\n }\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const removeEndpoints = ctx.getDeviceConfig?.(node.id)?.compat\n ?.removeEndpoints;\n if (removeEndpoints === \"*\") {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Skipping ${this.ccName} interview b/c all endpoints are ignored by the device config file...`,\n direction: \"none\",\n });\n return;\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Special interview procedure for legacy nodes\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (ccVersion === 1)\n return this.interviewV1(ctx);\n const endpoint = node.getEndpoint(this.endpointIndex)!;\n const api = CCAPI.create(CommandClasses[\"Multi Channel\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n const valueDB = this.getValueDB(ctx);\n // Step 1: Retrieve general information about end points\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying device endpoint information...\",\n direction: \"outbound\",\n });\n const multiResponse = await api.getEndpoints();\n if (!multiResponse) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying device endpoint information timed out, aborting interview...\",\n level: \"warn\",\n });\n return this.throwMissingCriticalInterviewResponse();\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received response for device endpoints:\", {\n nested: logDict({\n \"endpoint count (individual)\": multiResponse.individualEndpointCount,\n \"count is dynamic\": multiResponse.isDynamicEndpointCount,\n \"identical capabilities\": multiResponse.identicalCapabilities,\n \"endpoint count (aggregated)\": multiResponse.aggregatedEndpointCount,\n }),\n }),\n direction: \"inbound\",\n });\n let allEndpoints: number[] = [];\n const addSequentialEndpoints = (): void => {\n for (let i = 1; i\n <= multiResponse.individualEndpointCount\n + (multiResponse.aggregatedEndpointCount ?? 0); i++) {\n allEndpoints.push(i);\n }\n };\n if (api.supportsCommand(MultiChannelCommand.EndPointFind)) {\n // Step 2a: Find all endpoints\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying all endpoints...\",\n direction: \"outbound\",\n });\n const foundEndpoints = await api.findEndpoints(0xff, 0xff);\n if (foundEndpoints)\n allEndpoints.push(...foundEndpoints);\n if (!allEndpoints.length) {\n // Create a sequential list of endpoints\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Endpoint query returned no results, assuming that endpoints are sequential`,\n direction: \"inbound\",\n });\n addSequentialEndpoints();\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received endpoints: ${allEndpoints\n .map(String)\n .join(\", \")}`,\n direction: \"inbound\",\n });\n }\n }\n else {\n // Step 2b: Assume that the endpoints are in sequential order\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `does not support EndPointFind, assuming that endpoints are sequential`,\n direction: \"none\",\n });\n addSequentialEndpoints();\n }\n // Step 2.5: remove ignored endpoints\n if (removeEndpoints?.length) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `The following endpoints are ignored through the config file: ${removeEndpoints.join(\", \")}`,\n direction: \"none\",\n });\n allEndpoints = allEndpoints.filter((e) => !removeEndpoints.includes(e));\n }\n // Step 3: Query endpoints\n let hasQueriedCapabilities = false;\n let completedEndpoints = 0;\n for (const endpoint of allEndpoints) {\n node.reportInterviewProgress(++completedEndpoints, allEndpoints.length);\n if (endpoint > multiResponse.individualEndpointCount\n && ccVersion >= 4) {\n // Find members of aggregated end point\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying members of aggregated endpoint #${endpoint}...`,\n direction: \"outbound\",\n });\n const members = await api.getAggregatedMembers(endpoint);\n if (members) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `aggregated endpoint #${endpoint} has members ${members\n .map(String)\n .join(\", \")}`,\n direction: \"inbound\",\n });\n }\n }\n // When the device reports identical capabilities for all endpoints,\n // we don't need to query them all\n if (multiResponse.identicalCapabilities && hasQueriedCapabilities) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `all endpoints identical, skipping capability query for endpoint #${endpoint}...`,\n direction: \"none\",\n });\n // copy the capabilities from the first endpoint\n const devClass = valueDB.getValue(MultiChannelCCValues.endpointDeviceClass.endpoint(allEndpoints[0]));\n valueDB.setValue(MultiChannelCCValues.endpointDeviceClass.endpoint(endpoint), devClass);\n const ep1Caps = valueDB.getValue<CommandClasses[]>(MultiChannelCCValues.endpointCCs.endpoint(allEndpoints[0]))!;\n valueDB.setValue(MultiChannelCCValues.endpointCCs.endpoint(endpoint), [...ep1Caps]);\n continue;\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying capabilities for endpoint #${endpoint}...`,\n direction: \"outbound\",\n });\n const caps = await api.getEndpointCapabilities(endpoint);\n if (caps) {\n hasQueriedCapabilities = true;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(`received response for endpoint capabilities (#${endpoint}):`, {\n nested: logDict({\n \"generic device class\": caps.generic.label,\n \"specific device class\": caps.specific.label,\n \"is dynamic end point\": caps.isDynamic,\n \"supported CCs\": logList(caps.supportedCCs.map((cc) => getCCName(cc))),\n }),\n }),\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Querying endpoint #${endpoint} capabilities timed out, aborting interview...`,\n level: \"warn\",\n });\n return this.throwMissingCriticalInterviewResponse();\n }\n }\n // Now that all endpoints have been interviewed, remember which ones are there\n // But first figure out if they seem unnecessary and if they do, which ones should be preserved\n if (!multiResponse.identicalCapabilities\n && areEndpointsUnnecessary(ctx, node.id, allEndpoints)) {\n const preserve = ctx.getDeviceConfig?.(node.id)?.compat\n ?.preserveEndpoints;\n if (!preserve) {\n allEndpoints = [];\n ctx.logNode(node.id, {\n message: `Endpoints seem unnecessary b/c they have different device classes, ignoring all...`,\n });\n }\n else if (preserve === \"*\") {\n // preserve all endpoints, do nothing\n ctx.logNode(node.id, {\n message: `Endpoints seem unnecessary, but are configured to be preserved.`,\n });\n }\n else {\n allEndpoints = allEndpoints.filter((ep) => preserve.includes(ep));\n ctx.logNode(node.id, {\n message: `Endpoints seem unnecessary, but endpoints ${allEndpoints.join(\", \")} are configured to be preserved.`,\n });\n }\n }\n this.setValue(ctx, MultiChannelCCValues.endpointIndizes, allEndpoints);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n private async interviewV1(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const removeEndpoints = ctx.getDeviceConfig?.(node.id)?.compat\n ?.removeEndpoints;\n if (removeEndpoints === \"*\") {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Skipping ${this.ccName} interview b/c all endpoints are ignored by the device config file...`,\n direction: \"none\",\n });\n return;\n }\n const api = CCAPI.create(CommandClasses[\"Multi Channel\"], ctx, endpoint);\n const valueDB = this.getValueDB(ctx);\n // V1 works the opposite way - we scan all CCs and remember how many\n // endpoints they have\n const supportedCCs = [...node.getCCs()]\n // Don't query CCs the node only controls\n .filter(([, info]) => info.isSupported)\n .map(([cc]) => cc)\n // Don't query CCs that want to skip the endpoint interview\n .filter((cc) => !CommandClass.createInstanceUnchecked(node, cc)?.skipEndpointInterview());\n const endpointCounts = new Map<CommandClasses, number>();\n for (const ccId of supportedCCs) {\n ctx.logNode(node.id, {\n message: `Querying endpoint count for CommandClass ${getCCName(ccId)}...`,\n direction: \"outbound\",\n });\n const endpointCount = await api.getEndpointCountV1(ccId);\n if (endpointCount != undefined) {\n endpointCounts.set(ccId, endpointCount);\n ctx.logNode(node.id, {\n message: `CommandClass ${getCCName(ccId)} has ${endpointCount} endpoints`,\n direction: \"inbound\",\n });\n }\n }\n // Store the collected information\n // We have only individual and no dynamic and no aggregated endpoints\n const numEndpoints = Math.max(...endpointCounts.values());\n this.setValue(ctx, MultiChannelCCValues.endpointCountIsDynamic, false);\n this.setValue(ctx, MultiChannelCCValues.aggregatedEndpointCount, 0);\n this.setValue(ctx, MultiChannelCCValues.individualEndpointCount, numEndpoints);\n // Since we queried all CCs separately, we can assume that all\n // endpoints have different capabilities\n this.setValue(ctx, MultiChannelCCValues.endpointsHaveIdenticalCapabilities, false);\n if (removeEndpoints?.length) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `The following endpoints are ignored through the config file: ${removeEndpoints.join(\", \")}`,\n direction: \"none\",\n });\n }\n const allEndpoints: number[] = [];\n for (let endpoint = 1; endpoint <= numEndpoints; endpoint++) {\n // Skip this endpoint if flagged for removal\n if (!removeEndpoints?.includes(endpoint)) {\n // Check which CCs exist on this endpoint\n const endpointCCs = [...endpointCounts.entries()]\n .filter(([, ccEndpoints]) => ccEndpoints >= endpoint)\n .map(([ccId]) => ccId);\n // And store it per endpoint\n valueDB.setValue(MultiChannelCCValues.endpointCCs.endpoint(endpoint), endpointCCs);\n allEndpoints.push(endpoint);\n }\n }\n this.setValue(ctx, MultiChannelCCValues.endpointIndizes, allEndpoints);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n}\n// @publicAPI\nexport interface MultiChannelCCEndPointReportOptions {\n countIsDynamic: boolean;\n identicalCapabilities: boolean;\n individualCount: number;\n aggregatedCount?: number;\n}\n@CCCommand(MultiChannelCommand.EndPointReport)\n@ccValueProperty(\"countIsDynamic\", MultiChannelCCValues.endpointCountIsDynamic)\n@ccValueProperty(\"identicalCapabilities\", MultiChannelCCValues.endpointsHaveIdenticalCapabilities)\n@ccValueProperty(\"individualCount\", MultiChannelCCValues.individualEndpointCount)\n@ccValueProperty(\"aggregatedCount\", MultiChannelCCValues.aggregatedEndpointCount)\nexport class MultiChannelCCEndPointReport extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCEndPointReportOptions>) {\n super(options);\n this.countIsDynamic = options.countIsDynamic;\n this.identicalCapabilities = options.identicalCapabilities;\n this.individualCount = options.individualCount;\n this.aggregatedCount = options.aggregatedCount;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCEndPointReport {\n validatePayload(raw.payload.length >= 2);\n const countIsDynamic = !!(raw.payload[0] & 0b10000000);\n const identicalCapabilities = !!(raw.payload[0] & 0b01000000);\n const individualCount = raw.payload[1] & 0b01111111;\n let aggregatedCount: MaybeNotKnown<number>;\n if (raw.payload.length >= 3) {\n aggregatedCount = raw.payload[2] & 0b01111111;\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n countIsDynamic,\n identicalCapabilities,\n individualCount,\n aggregatedCount,\n });\n }\n public countIsDynamic: boolean;\n public identicalCapabilities: boolean;\n public individualCount: number;\n public aggregatedCount: MaybeNotKnown<number>;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n (this.countIsDynamic ? 0b10000000 : 0)\n | (this.identicalCapabilities ? 0b01000000 : 0),\n this.individualCount & 0b01111111,\n this.aggregatedCount ?? 0,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"endpoint count (individual)\": this.individualCount,\n \"count is dynamic\": this.countIsDynamic,\n \"identical capabilities\": this.identicalCapabilities,\n };\n if (this.aggregatedCount != undefined) {\n message[\"endpoint count (aggregated)\"] = this.aggregatedCount;\n }\n const ret = {\n ...super.toLogEntry(ctx),\n message,\n };\n return ret;\n }\n}\n@CCCommand(MultiChannelCommand.EndPointGet)\n@expectedCCResponse(MultiChannelCCEndPointReport)\nexport class MultiChannelCCEndPointGet extends MultiChannelCC {\n}\n// @publicAPI\nexport interface MultiChannelCCCapabilityReportOptions {\n endpointIndex: number;\n genericDeviceClass: number;\n specificDeviceClass: number;\n supportedCCs: CommandClasses[];\n isDynamic: boolean;\n wasRemoved: boolean;\n}\n@CCCommand(MultiChannelCommand.CapabilityReport)\nexport class MultiChannelCCCapabilityReport extends MultiChannelCC implements ApplicationNodeInformation {\n public constructor(options: WithAddress<MultiChannelCCCapabilityReportOptions>) {\n super(options);\n this.endpointIndex = options.endpointIndex;\n this.genericDeviceClass = options.genericDeviceClass;\n this.specificDeviceClass = options.specificDeviceClass;\n this.supportedCCs = options.supportedCCs;\n this.isDynamic = options.isDynamic;\n this.wasRemoved = options.wasRemoved;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCCapabilityReport {\n // Only validate the bytes we expect to see here\n // parseApplicationNodeInformation does its own validation\n validatePayload(raw.payload.length >= 1);\n const endpointIndex = raw.payload[0] & 0b01111111;\n const isDynamic = !!(raw.payload[0] & 0b10000000);\n const NIF = parseApplicationNodeInformation(raw.payload.subarray(1));\n const genericDeviceClass = NIF.genericDeviceClass;\n const specificDeviceClass = NIF.specificDeviceClass;\n const supportedCCs: CommandClasses[] = NIF.supportedCCs;\n // Removal reports have very specific information\n const wasRemoved: boolean = isDynamic\n && genericDeviceClass === 0xff // \"Non-Interoperable\"\n && specificDeviceClass === 0x00;\n return new this({\n nodeId: ctx.sourceNodeId,\n endpointIndex,\n isDynamic,\n genericDeviceClass,\n specificDeviceClass,\n supportedCCs,\n wasRemoved,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n const deviceClassValue = MultiChannelCCValues.endpointDeviceClass;\n const ccsValue = MultiChannelCCValues.endpointCCs;\n if (this.wasRemoved) {\n this.removeValue(ctx, deviceClassValue);\n this.removeValue(ctx, ccsValue);\n }\n else {\n this.setValue(ctx, deviceClassValue, {\n generic: this.genericDeviceClass,\n specific: this.specificDeviceClass,\n });\n this.setValue(ctx, ccsValue, this.supportedCCs);\n }\n return true;\n }\n // The endpoint index must be overridden to be able to attribute the information to the correct endpoint\n public readonly genericDeviceClass: number;\n public readonly specificDeviceClass: number;\n public readonly supportedCCs: CommandClasses[];\n public readonly isDynamic: boolean;\n public readonly wasRemoved: boolean;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [\n (this.endpointIndex & 0b01111111)\n | (this.isDynamic ? 0b10000000 : 0),\n ],\n encodeApplicationNodeInformation(this),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"endpoint index\": this.endpointIndex,\n \"generic device class\": getGenericDeviceClass(this.genericDeviceClass).label,\n \"specific device class\": getSpecificDeviceClass(this.genericDeviceClass, this.specificDeviceClass).label,\n \"is dynamic end point\": this.isDynamic,\n \"supported CCs\": logList(this.supportedCCs.map((cc) => getCCName(cc))),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCCapabilityGetOptions {\n requestedEndpoint: number;\n}\nfunction testResponseForMultiChannelCapabilityGet(sent: MultiChannelCCCapabilityGet, received: MultiChannelCCCapabilityReport) {\n return received.endpointIndex === sent.requestedEndpoint;\n}\n@CCCommand(MultiChannelCommand.CapabilityGet)\n@expectedCCResponse(MultiChannelCCCapabilityReport, testResponseForMultiChannelCapabilityGet)\nexport class MultiChannelCCCapabilityGet extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCCapabilityGetOptions>) {\n super(options);\n this.requestedEndpoint = options.requestedEndpoint;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCCapabilityGet {\n validatePayload(raw.payload.length >= 1);\n const requestedEndpoint = raw.payload[0] & 0b01111111;\n return new this({\n nodeId: ctx.sourceNodeId,\n requestedEndpoint,\n });\n }\n public requestedEndpoint: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.requestedEndpoint & 0b01111111]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { endpoint: this.requestedEndpoint },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCEndPointFindReportOptions {\n genericClass: number;\n specificClass: number;\n foundEndpoints: number[];\n reportsToFollow: number;\n}\n@CCCommand(MultiChannelCommand.EndPointFindReport)\nexport class MultiChannelCCEndPointFindReport extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCEndPointFindReportOptions>) {\n super(options);\n this.genericClass = options.genericClass;\n this.specificClass = options.specificClass;\n this.foundEndpoints = options.foundEndpoints;\n this.reportsToFollow = options.reportsToFollow;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCEndPointFindReport {\n validatePayload(raw.payload.length >= 3);\n const reportsToFollow = raw.payload[0];\n const genericClass = raw.payload[1];\n const specificClass = raw.payload[2];\n // Some devices omit the endpoint list although that is not allowed in the specs\n // therefore don't validatePayload here.\n const foundEndpoints = [...raw.payload.subarray(3)]\n .map((e) => e & 0b01111111)\n .filter((e) => e !== 0);\n return new this({\n nodeId: ctx.sourceNodeId,\n reportsToFollow,\n genericClass,\n specificClass,\n foundEndpoints,\n });\n }\n public genericClass: number;\n public specificClass: number;\n public foundEndpoints: number[];\n public reportsToFollow: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.reportsToFollow, this.genericClass, this.specificClass],\n Bytes.from(this.foundEndpoints.map((e) => e & 0b01111111)),\n ]);\n return super.serialize(ctx);\n }\n public getPartialCCSessionId(): Record<string, any> | undefined {\n // Distinguish sessions by the requested device classes\n return {\n genericClass: this.genericClass,\n specificClass: this.specificClass,\n };\n }\n public getRemainingSegments(): number | undefined {\n return this.reportsToFollow;\n }\n public mergePartialCCs(partials: MultiChannelCCEndPointFindReport[], _ctx: CCParsingContext): Promise<void> {\n // Concat the list of end points\n this.foundEndpoints = [...partials, this]\n .map((report) => report.foundEndpoints)\n .reduce((prev, cur) => prev.concat(...cur), []);\n return Promise.resolve();\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"generic device class\": getGenericDeviceClass(this.genericClass)\n .label,\n \"specific device class\": getSpecificDeviceClass(this.genericClass, this.specificClass).label,\n \"found endpoints\": this.foundEndpoints.join(\", \"),\n \"# of reports to follow\": this.reportsToFollow,\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCEndPointFindOptions {\n genericClass: number;\n specificClass: number;\n}\n@CCCommand(MultiChannelCommand.EndPointFind)\n@expectedCCResponse(MultiChannelCCEndPointFindReport)\nexport class MultiChannelCCEndPointFind extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCEndPointFindOptions>) {\n super(options);\n this.genericClass = options.genericClass;\n this.specificClass = options.specificClass;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCEndPointFind {\n validatePayload(raw.payload.length >= 2);\n const genericClass = raw.payload[0];\n const specificClass = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n genericClass,\n specificClass,\n });\n }\n public genericClass: number;\n public specificClass: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.genericClass, this.specificClass]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"generic device class\": getGenericDeviceClass(this.genericClass)\n .label,\n \"specific device class\": getSpecificDeviceClass(this.genericClass, this.specificClass).label,\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCAggregatedMembersReportOptions {\n aggregatedEndpointIndex: number;\n members: number[];\n}\n@CCCommand(MultiChannelCommand.AggregatedMembersReport)\n@ccValueProperty(\"members\", MultiChannelCCValues.aggregatedEndpointMembers, (self) => [self.aggregatedEndpointIndex])\nexport class MultiChannelCCAggregatedMembersReport extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCAggregatedMembersReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.aggregatedEndpointIndex = options.aggregatedEndpointIndex;\n this.members = options.members;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCAggregatedMembersReport {\n validatePayload(raw.payload.length >= 2);\n const aggregatedEndpointIndex = raw.payload[0] & 127;\n const bitMaskLength = raw.payload[1];\n validatePayload(raw.payload.length >= 2 + bitMaskLength);\n const bitMask = raw.payload.subarray(2, 2 + bitMaskLength);\n const members = parseBitMask(bitMask);\n return new this({\n nodeId: ctx.sourceNodeId,\n aggregatedEndpointIndex,\n members,\n });\n }\n public readonly aggregatedEndpointIndex: number;\n public readonly members: readonly number[];\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"aggregated endpoint\": this.aggregatedEndpointIndex,\n members: this.members.join(\", \"),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelCCAggregatedMembersGetOptions {\n requestedEndpoint: number;\n}\n@CCCommand(MultiChannelCommand.AggregatedMembersGet)\n@expectedCCResponse(MultiChannelCCAggregatedMembersReport)\nexport class MultiChannelCCAggregatedMembersGet extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCAggregatedMembersGetOptions>) {\n super(options);\n this.requestedEndpoint = options.requestedEndpoint;\n }\n public static from(_raw: CCRaw, _ctx: CCParsingContext): MultiChannelCCAggregatedMembersGet {\n // TODO: Deserialize payload\n throw new ZWaveError(`${this.name}: deserialization not implemented`, ZWaveErrorCodes.Deserialization_NotImplemented);\n // return new MultiChannelCCAggregatedMembersGet({\n // \tnodeId: ctx.sourceNodeId,\n // });\n }\n public requestedEndpoint: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.requestedEndpoint & 127]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { endpoint: this.requestedEndpoint },\n };\n }\n}\n// @publicAPI\nexport type MultiChannelCCDestination = number | (1 | 2 | 3 | 4 | 5 | 6 | 7)[];\n// @publicAPI\nexport interface MultiChannelCCCommandEncapsulationOptions {\n encapsulated: CommandClass;\n destination: MultiChannelCCDestination;\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.\nfunction getCCResponseForCommandEncapsulation(ctx: GetNode<NodeId & SupportsCC>, sent: MultiChannelCCCommandEncapsulation) {\n if (typeof sent.destination === \"number\"\n && sent.encapsulated.expectsCCResponse(ctx)) {\n // Allow both versions of the encapsulation command\n // Our implementation check is a bit too strict, so change the return type\n return [\n MultiChannelCCCommandEncapsulation,\n MultiChannelCCV1CommandEncapsulation,\n ] as any as (typeof MultiChannelCCCommandEncapsulation)[];\n }\n}\nfunction testResponseForCommandEncapsulation(sent: MultiChannelCCCommandEncapsulation, received: MultiChannelCCCommandEncapsulation | MultiChannelCCV1CommandEncapsulation) {\n if (typeof sent.destination === \"number\"\n && sent.destination === received.endpointIndex) {\n return \"checkEncapsulated\";\n }\n return false;\n}\n@CCCommand(MultiChannelCommand.CommandEncapsulation)\n@expectedCCResponse(getCCResponseForCommandEncapsulation, testResponseForCommandEncapsulation)\nexport class MultiChannelCCCommandEncapsulation extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCCommandEncapsulationOptions>) {\n super(options);\n this.encapsulated = options.encapsulated;\n this.encapsulated.encapsulatingCC = this as any;\n // Propagate the endpoint index all the way down\n let cur: CommandClass = this;\n while (cur) {\n if (isMultiEncapsulatingCommandClass(cur)) {\n for (const cc of cur.encapsulated) {\n cc.endpointIndex = this.endpointIndex;\n }\n break;\n }\n else if (isEncapsulatingCommandClass(cur)) {\n cur.encapsulated.endpointIndex = this.endpointIndex;\n cur = cur.encapsulated;\n }\n else {\n break;\n }\n }\n this.destination = options.destination;\n }\n public static async from(raw: CCRaw, ctx: CCParsingContext): Promise<MultiChannelCCCommandEncapsulation> {\n validatePayload(raw.payload.length >= 2);\n let endpointIndex: number;\n let destination: MultiChannelCCDestination;\n if (ctx.getDeviceConfig?.(ctx.sourceNodeId)?.compat\n ?.treatDestinationEndpointAsSource) {\n // This device incorrectly uses the destination field to indicate the source endpoint\n endpointIndex = raw.payload[1] & 127;\n destination = 0;\n }\n else {\n // Parse normally\n endpointIndex = raw.payload[0] & 127;\n const isBitMask = !!(raw.payload[1] & 128);\n destination = raw.payload[1] & 127;\n if (isBitMask) {\n destination = parseBitMask(Bytes.from([destination])) as any;\n }\n }\n // No need to validate further, each CC does it for itself\n const encapsulated = await CommandClass.parse(raw.payload.subarray(2), ctx);\n return new this({\n nodeId: ctx.sourceNodeId,\n endpointIndex,\n destination,\n encapsulated,\n });\n }\n public encapsulated: CommandClass;\n /** The destination end point (0-127) or an array of destination end points (1-7) */\n public destination: MultiChannelCCDestination;\n protected override determineRelation(other: CommandClass): CommandRelation {\n if (other instanceof MultiChannelCCCommandEncapsulation\n && haveSameDestination(this.destination, other.destination)) {\n return this.encapsulated.getRelationTo(other.encapsulated);\n }\n return CommandRelation.Unrelated;\n }\n public async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (ctx.getDeviceConfig?.(this.nodeId as number)?.compat\n ?.treatDestinationEndpointAsSource) {\n // This device incorrectly responds from the endpoint we've passed as our source endpoint\n if (typeof this.destination === \"number\") {\n this.endpointIndex = this.destination;\n }\n }\n const destination = typeof this.destination === \"number\"\n ? // The destination is a single number\n this.destination & 127\n : // The destination is a bit mask\n encodeBitMask(this.destination, 7)[0] | 128;\n this.payload = Bytes.concat([\n [this.endpointIndex & 127, destination],\n await this.encapsulated.serialize(ctx),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n source: this.endpointIndex,\n destination: typeof this.destination === \"number\"\n ? this.destination\n : this.destination.join(\", \"),\n },\n };\n }\n protected computeEncapsulationOverhead(): number {\n // Multi Channel CC adds two bytes for the source and destination endpoint\n return super.computeEncapsulationOverhead() + 2;\n }\n}\n// @publicAPI\nexport interface MultiChannelCCV1ReportOptions {\n requestedCC: CommandClasses;\n endpointCount: number;\n}\n@CCCommand(MultiChannelCommand.ReportV1)\nexport class MultiChannelCCV1Report extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCV1ReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.requestedCC = options.requestedCC;\n this.endpointCount = options.endpointCount;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCV1Report {\n // V1 won't be extended in the future, so do an exact check\n validatePayload(raw.payload.length === 2);\n const requestedCC: CommandClasses = raw.payload[0];\n const endpointCount = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n requestedCC,\n endpointCount,\n });\n }\n public readonly requestedCC: CommandClasses;\n public readonly endpointCount: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.requestedCC, this.endpointCount]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n CC: getCCName(this.requestedCC),\n \"# of endpoints\": this.endpointCount,\n },\n };\n }\n}\nfunction testResponseForMultiChannelV1Get(sent: MultiChannelCCV1Get, received: MultiChannelCCV1Report) {\n return sent.requestedCC === received.requestedCC;\n}\n// @publicAPI\nexport interface MultiChannelCCV1GetOptions {\n requestedCC: CommandClasses;\n}\n@CCCommand(MultiChannelCommand.GetV1)\n@expectedCCResponse(MultiChannelCCV1Report, testResponseForMultiChannelV1Get)\nexport class MultiChannelCCV1Get extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCV1GetOptions>) {\n super(options);\n this.requestedCC = options.requestedCC;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelCCV1Get {\n // V1 won't be extended in the future, so do an exact check\n validatePayload(raw.payload.length === 1);\n const requestedCC: CommandClasses = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n requestedCC,\n });\n }\n public requestedCC: CommandClasses;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.requestedCC]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { CC: getCCName(this.requestedCC) },\n };\n }\n}\nfunction getResponseForV1CommandEncapsulation(ctx: GetNode<NodeId & SupportsCC>, sent: MultiChannelCCV1CommandEncapsulation) {\n if (sent.encapsulated.expectsCCResponse(ctx)) {\n return MultiChannelCCV1CommandEncapsulation;\n }\n}\nfunction testResponseForV1CommandEncapsulation(sent: MultiChannelCCV1CommandEncapsulation, received: MultiChannelCCV1CommandEncapsulation) {\n if (sent.endpointIndex === received.endpointIndex) {\n return \"checkEncapsulated\";\n }\n return false;\n}\n// @publicAPI\nexport interface MultiChannelCCV1CommandEncapsulationOptions {\n encapsulated: CommandClass;\n}\n@CCCommand(MultiChannelCommand.CommandEncapsulationV1)\n@expectedCCResponse(getResponseForV1CommandEncapsulation, testResponseForV1CommandEncapsulation)\nexport class MultiChannelCCV1CommandEncapsulation extends MultiChannelCC {\n public constructor(options: WithAddress<MultiChannelCCV1CommandEncapsulationOptions>) {\n super(options);\n this.encapsulated = options.encapsulated;\n this.encapsulated.encapsulatingCC = this as any;\n // Propagate the endpoint index all the way down\n let cur: CommandClass = this;\n while (cur) {\n if (isMultiEncapsulatingCommandClass(cur)) {\n for (const cc of cur.encapsulated) {\n cc.endpointIndex = this.endpointIndex;\n }\n break;\n }\n else if (isEncapsulatingCommandClass(cur)) {\n cur.encapsulated.endpointIndex = this.endpointIndex;\n cur = cur.encapsulated;\n }\n else {\n break;\n }\n }\n }\n public static async from(raw: CCRaw, ctx: CCParsingContext): Promise<MultiChannelCCV1CommandEncapsulation> {\n validatePayload(raw.payload.length >= 1);\n const endpointIndex = raw.payload[0];\n // Some devices send invalid reports, i.e. MultiChannelCCV1CommandEncapsulation, but with V2+ binary format\n // This would be a NoOp CC, but it makes no sense to encapsulate that.\n const isV2withV1Header = raw.payload.length >= 2 && raw.payload[1] === 0x00;\n // No need to validate further, each CC does it for itself\n const encapsulated = await CommandClass.parse(raw.payload.subarray(isV2withV1Header ? 2 : 1), ctx);\n return new this({\n nodeId: ctx.sourceNodeId,\n endpointIndex,\n encapsulated,\n });\n }\n public encapsulated!: CommandClass;\n protected override determineRelation(other: CommandClass): CommandRelation {\n if (other instanceof MultiChannelCCV1CommandEncapsulation) {\n return this.encapsulated.getRelationTo(other.encapsulated);\n }\n return CommandRelation.Unrelated;\n }\n public async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.endpointIndex],\n await this.encapsulated.serialize(ctx),\n ]);\n return super.serialize(ctx);\n }\n protected computeEncapsulationOverhead(): number {\n // Multi Channel CC V1 adds one byte for the endpoint index\n return super.computeEncapsulationOverhead() + 1;\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { source: this.endpointIndex },\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["endpoint", "MultiChannelCCCommandEncapsulation", "MultiChannelCCV1CommandEncapsulation"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src_gen/cc/MultilevelSensorCC.ts"],
4
- "sourcesContent": ["import * as __validateArgs from \"./MultilevelSensorCC._validateArgs.js\";\nconst { validateArgs_MultilevelSensorCCAPI_get, validateArgs_MultilevelSensorCCAPI_getSupportedScales, validateArgs_MultilevelSensorCCAPI_sendReport } = __validateArgs;\nimport type { GetDeviceConfig } from \"@zwave-js/config\";\nimport { CommandClasses, type ControlsCC, type EndpointId, type GetEndpoint, type GetNode, type GetSupportedCCVersion, type GetValueDB, type LogNode, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type NodeId, type Scale, type SinglecastCC, type SupervisionResult, type SupportsCC, type ValueID, ValueMetadata, type WithAddress, encodeBitMask, encodeFloatWithScale, getSensor, getSensorName, getSensorScale, getUnknownScale, logList, logText, parseBitMask, parseFloatWithScale, timespan, validatePayload, } from \"@zwave-js/core\";\nimport { type AllOrNone, Bytes, num2hex } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, PhysicalCCAPI, type PollValueImplementation, throwUnsupportedProperty, } from \"../lib/API.js\";\nimport { type CCRaw, type CCResponsePredicate, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MultilevelSensorCommand, type MultilevelSensorValue, } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport type { GetUserPreferences } from \"../lib/traits.js\";\nimport { MultilevelSensorCCValues } from \"./_CCValues.generated.js\";\nexport { MultilevelSensorCCValues };\n/**\n * Determine the scale to use to query a sensor reading. Uses the user-preferred scale if given,\n * followed by the most recently used scale, otherwile falls back to the first supported one.\n */\nfunction getPreferredSensorScale(ctx: GetValueDB & GetUserPreferences & LogNode, nodeId: number, endpointIndex: number, sensorType: number, supportedScales: readonly number[]): number {\n const preferences = ctx.getUserPreferences();\n const sensor = getSensor(sensorType);\n // If the sensor type is unknown, we have no default. Use the user-provided scale or 0\n if (!sensor) {\n const preferred = preferences?.scales[sensorType];\n // We cannot look up strings for unknown sensor types, so this must be a number or we use the fallback\n if (typeof preferred !== \"number\")\n return 0;\n return preferred;\n }\n // Look up the preference for the scale\n let preferred: number | string | undefined;\n // Named scales apply to multiple sensor types. To be able to override the scale for single types\n // we need to look at the preferences by sensor type first\n preferred = preferences?.scales[sensorType];\n // If the scale is named, we can then try to use the named preference\n const scaleGroupName = sensor.scaleGroupName;\n if (preferred == undefined && scaleGroupName) {\n preferred = preferences?.scales[scaleGroupName];\n }\n // Then attempt reading the scale from the corresponding value\n if (preferred == undefined) {\n const sensorName = getSensorName(sensorType);\n const sensorValue = MultilevelSensorCCValues.value(sensorName);\n const metadata = ctx\n .tryGetValueDB(nodeId)\n ?.getMetadata(sensorValue.endpoint(endpointIndex));\n const scale = metadata?.ccSpecific?.scale;\n if (typeof scale === \"number\" && supportedScales.includes(scale)) {\n preferred = scale;\n ctx.logNode(nodeId, {\n endpoint: endpointIndex,\n message: `No scale preference for sensor type ${sensorType}, using the last-used scale ${preferred}`,\n });\n }\n }\n // Then fall back to the first supported scale\n if (preferred == undefined) {\n preferred = supportedScales[0] ?? 0;\n ctx.logNode(nodeId, {\n endpoint: endpointIndex,\n message: `No scale preference for sensor type ${sensorType}, using the first supported scale ${preferred}`,\n });\n return preferred;\n }\n // If the scale name or unit was given, try to look it up\n if (typeof preferred === \"string\") {\n for (const [key, scale] of Object.entries(sensor.scales)) {\n if (scale.label === preferred || scale.unit === preferred) {\n preferred = parseInt(key, 10);\n break;\n }\n }\n }\n if (typeof preferred === \"string\") {\n // Looking up failed\n ctx.logNode(nodeId, {\n endpoint: endpointIndex,\n message: `Preferred scale \"${preferred}\" for sensor type ${sensorType} not found, using the first supported scale ${supportedScales[0] ?? 0}`,\n });\n return supportedScales[0] ?? 0;\n }\n // We have a numeric scale key, nothing to look up. Make sure it is supported though\n if (!supportedScales.length) {\n // No info about supported scales, just use the preferred one\n return preferred;\n }\n else if (!supportedScales.includes(preferred)) {\n ctx.logNode(nodeId, {\n endpoint: endpointIndex,\n message: `Preferred scale ${preferred} not supported for sensor type ${sensorType}, using the first supported scale`,\n });\n return supportedScales[0];\n }\n else {\n return preferred;\n }\n}\n// @noSetValueAPI This CC is read-only\n@API(CommandClasses[\"Multilevel Sensor\"])\nexport class MultilevelSensorCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: MultilevelSensorCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case MultilevelSensorCommand.Get:\n case MultilevelSensorCommand.Report:\n return true; // This is mandatory\n case MultilevelSensorCommand.GetSupportedSensor:\n case MultilevelSensorCommand.GetSupportedScale:\n return this.version >= 5;\n }\n return super.supportsCommand(cmd);\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: MultilevelSensorCCAPI, { property }) {\n // Look up the necessary information\n const valueId: ValueID = {\n commandClass: CommandClasses[\"Multilevel Sensor\"],\n endpoint: this.endpoint.index,\n property,\n };\n const ccSpecific = this.tryGetValueDB()?.getMetadata(valueId)\n ?.ccSpecific;\n if (!ccSpecific) {\n throwUnsupportedProperty(this.ccId, property);\n }\n const { sensorType, scale } = ccSpecific;\n return this.get(sensorType, scale);\n };\n }\n /** Query the default sensor value */\n public async get(): Promise<MaybeNotKnown<MultilevelSensorValue & {\n type: number;\n }>>;\n /** Query the sensor value for the given sensor type using the preferred sensor scale */\n public async get(sensorType: number): Promise<MaybeNotKnown<MultilevelSensorValue>>;\n /** Query the sensor value for the given sensor type using the given sensor scale */\n public async get(sensorType: number, scale: number): Promise<MaybeNotKnown<number>>;\n @validateArgs_MultilevelSensorCCAPI_get()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async get(sensorType?: number, scale?: number) {\n this.assertSupportsCommand(MultilevelSensorCommand, MultilevelSensorCommand.Get);\n // Figure out the preferred scale if none was given\n let preferredScale: number | undefined;\n if (sensorType != undefined && scale == undefined) {\n const supportedScales: readonly number[] = this.tryGetValueDB()?.getValue({\n commandClass: this.ccId,\n endpoint: this.endpoint.index,\n property: \"supportedScales\",\n propertyKey: sensorType,\n }) ?? [];\n preferredScale = getPreferredSensorScale(this.host, this.endpoint.nodeId, this.endpoint.index, sensorType, supportedScales);\n }\n const cc = new MultilevelSensorCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n sensorType: sensorType!,\n scale: (scale ?? preferredScale)!,\n });\n const response = await this.host.sendCommand<MultilevelSensorCCReport>(cc, this.commandOptions);\n if (!response)\n return;\n const responseScale = getSensorScale(response.type, response.scale);\n if (sensorType == undefined) {\n // Overload #1: return the full response\n return {\n type: response.type,\n value: response.value,\n scale: responseScale,\n };\n }\n else if (scale == undefined) {\n // Overload #2: return value and scale\n return {\n value: response.value,\n scale: responseScale,\n };\n }\n else {\n // Overload #3: return only the value\n return response.value;\n }\n }\n public async getSupportedSensorTypes(): Promise<MaybeNotKnown<readonly number[]>> {\n this.assertSupportsCommand(MultilevelSensorCommand, MultilevelSensorCommand.GetSupportedSensor);\n const cc = new MultilevelSensorCCGetSupportedSensor({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<MultilevelSensorCCSupportedSensorReport>(cc, this.commandOptions);\n return response?.supportedSensorTypes;\n }\n @validateArgs_MultilevelSensorCCAPI_getSupportedScales()\n public async getSupportedScales(sensorType: number): Promise<MaybeNotKnown<readonly number[]>> {\n this.assertSupportsCommand(MultilevelSensorCommand, MultilevelSensorCommand.GetSupportedScale);\n const cc = new MultilevelSensorCCGetSupportedScale({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n sensorType,\n });\n const response = await this.host.sendCommand<MultilevelSensorCCSupportedScaleReport>(cc, this.commandOptions);\n return response?.supportedScales;\n }\n @validateArgs_MultilevelSensorCCAPI_sendReport()\n public async sendReport(sensorType: number, scale: number | Scale, value: number): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MultilevelSensorCommand, MultilevelSensorCommand.Report);\n const cc = new MultilevelSensorCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n type: sensorType,\n scale,\n value,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n}\n@commandClass(CommandClasses[\"Multilevel Sensor\"])\n@implementedVersion(11)\n@ccValues(MultilevelSensorCCValues)\nexport class MultilevelSensorCC extends CommandClass {\n declare ccCommand: MultilevelSensorCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Multilevel Sensor\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n if (api.version >= 5) {\n // Query the supported sensor types\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"retrieving supported sensor types...\",\n direction: \"outbound\",\n });\n const sensorTypes = await api.getSupportedSensorTypes();\n if (sensorTypes) {\n const logMessage = logText(\"received supported sensor types:\", {\n nested: logList(sensorTypes.map((t) => getSensorName(t))),\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported sensor types timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n // As well as the supported scales for each sensor\n for (const [i, type] of sensorTypes.entries()) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying supported scales for ${getSensorName(type)} sensor`,\n direction: \"outbound\",\n });\n const sensorScales = await api.getSupportedScales(type);\n if (sensorScales) {\n const logMessage = logText(\"received supported scales:\", {\n nested: logList(sensorScales.map((s) => (getSensorScale(type, s)\n ?? getUnknownScale(s)).label)),\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported scales timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n node.reportInterviewProgress(i + 1, sensorTypes.length);\n }\n }\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Multilevel Sensor\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const valueDB = this.getValueDB(ctx);\n if (api.version <= 4) {\n // Sensors up to V4 only support a single value\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying current sensor reading...\",\n direction: \"outbound\",\n });\n const mlsResponse = await api.get();\n if (mlsResponse) {\n const sensorScale = getSensorScale(mlsResponse.type, mlsResponse.scale.key);\n const logMessage = `received current sensor reading:\nsensor type: ${getSensorName(mlsResponse.type)}\nvalue: ${mlsResponse.value}${sensorScale?.unit ? ` ${sensorScale.unit}` : \"\"}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n }\n else {\n // Query all sensor values\n const sensorTypes: readonly number[] = valueDB.getValue({\n commandClass: this.ccId,\n property: \"supportedSensorTypes\",\n endpoint: this.endpointIndex,\n }) || [];\n for (const [i, type] of sensorTypes.entries()) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying ${getSensorName(type)} sensor reading...`,\n direction: \"outbound\",\n });\n const value = await api.get(type);\n if (value) {\n const logMessage = `received current ${getSensorName(type)} sensor reading: ${value.value} ${value.scale.unit || \"\"}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n options?.onProgress?.(i + 1, sensorTypes.length);\n }\n }\n }\n public shouldRefreshValues(this: SinglecastCC<this>, ctx: GetValueDB & GetSupportedCCVersion & GetDeviceConfig & GetNode<NodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>>): boolean {\n // Poll the device when all of the supported values were last updated longer than 6 hours ago.\n // This may lead to some values not being updated, but the user may have disabled some unnecessary\n // reports to reduce traffic.\n const valueDB = ctx.tryGetValueDB(this.nodeId);\n if (!valueDB)\n return true;\n const values = this.getDefinedValueIDs(ctx).filter((v) => MultilevelSensorCCValues.value.is(v));\n return values.every((v) => {\n const lastUpdated = valueDB.getTimestamp(v);\n return (lastUpdated == undefined\n || Date.now() - lastUpdated > timespan.hours(6));\n });\n }\n /**\n * Returns which sensor types are supported.\n * This only works AFTER the interview process\n */\n public static getSupportedSensorTypesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<number[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MultilevelSensorCCValues.supportedSensorTypes.endpoint(endpoint.index));\n }\n /**\n * Returns which scales are supported for a given sensor type.\n * This only works AFTER the interview process\n */\n public static getSupportedScalesCached(ctx: GetValueDB, endpoint: EndpointId, sensorType: number): MaybeNotKnown<number[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MultilevelSensorCCValues.supportedScales(sensorType).endpoint(endpoint.index));\n }\n public translatePropertyKey(ctx: GetValueDB, property: string | number, propertyKey: string | number): string | undefined {\n // TODO: check this\n if (property === \"values\" && typeof propertyKey === \"number\") {\n const sensor = getSensor(propertyKey);\n if (sensor)\n return sensor.label;\n }\n return super.translatePropertyKey(ctx, property, propertyKey);\n }\n}\n// @publicAPI\nexport interface MultilevelSensorCCReportOptions {\n type: number;\n scale: number | Scale;\n value: number;\n}\n@CCCommand(MultilevelSensorCommand.Report)\n@useSupervision()\nexport class MultilevelSensorCCReport extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCReportOptions>) {\n super(options);\n this.type = options.type;\n this.value = options.value;\n this.scale = typeof options.scale === \"number\"\n ? options.scale\n : options.scale.key;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCReport {\n validatePayload(raw.payload.length >= 1);\n const type = raw.payload[0];\n // parseFloatWithScale does its own validation\n const { value, scale } = parseFloatWithScale(raw.payload.subarray(1));\n return new this({\n nodeId: ctx.sourceNodeId,\n type,\n value,\n scale,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n const sensor = getSensor(this.type);\n const scale = getSensorScale(this.type, this.scale) ?? getUnknownScale(this.scale);\n // Filter out unknown sensor types and scales, unless the strict validation is disabled\n const measurementValidation = !ctx.getDeviceConfig?.(this.nodeId as number)?.compat?.disableStrictMeasurementValidation;\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (measurementValidation) {\n // Filter out unsupported sensor types and scales if possible\n if (ccVersion >= 5) {\n const supportedSensorTypes = this.getValue<number[]>(ctx, MultilevelSensorCCValues.supportedSensorTypes);\n if (supportedSensorTypes?.length) {\n validatePayload.withReason(`Unsupported sensor type ${getSensorName(this.type)} or corrupted data`)(supportedSensorTypes.includes(this.type));\n }\n const supportedScales = this.getValue<number[]>(ctx, MultilevelSensorCCValues.supportedScales(this.type));\n if (supportedScales?.length) {\n validatePayload.withReason(`Unsupported scale ${scale.label} or corrupted data`)(supportedScales.includes(scale.key));\n }\n }\n else {\n // We support a higher CC version than the device, so any types and scales it uses should be known to us\n // Filter out unknown ones.\n validatePayload.withReason(`Unknown sensor type ${num2hex(this.type)} or corrupted data`)(!!sensor);\n validatePayload.withReason(`Unknown scale ${num2hex(this.scale)} or corrupted data`)(scale.label !== getUnknownScale(this.scale).label);\n }\n }\n const sensorName = getSensorName(this.type);\n const sensorValue = MultilevelSensorCCValues.value(sensorName);\n this.setMetadata(ctx, sensorValue, {\n ...sensorValue.meta,\n unit: scale.unit,\n ccSpecific: {\n sensorType: this.type,\n scale: scale.key,\n },\n });\n this.setValue(ctx, sensorValue, this.value);\n return true;\n }\n public type: number;\n public scale: number;\n public value: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.type],\n encodeFloatWithScale(this.value, this.scale),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"sensor type\": getSensorName(this.type),\n scale: (getSensorScale(this.type, this.scale)\n ?? getUnknownScale(this.scale)).label,\n value: this.value,\n },\n };\n }\n}\nconst testResponseForMultilevelSensorGet: CCResponsePredicate<MultilevelSensorCCGet, MultilevelSensorCCReport> = (sent, received) => {\n // We expect a Multilevel Sensor Report that matches the requested sensor type (if a type was requested)\n return sent.sensorType == undefined || received.type === sent.sensorType;\n};\n// These options are supported starting in V5\n// @publicAPI\nexport type MultilevelSensorCCGetOptions = AllOrNone<{\n sensorType: number;\n scale: number;\n}>;\n@CCCommand(MultilevelSensorCommand.Get)\n@expectedCCResponse(MultilevelSensorCCReport, testResponseForMultilevelSensorGet)\nexport class MultilevelSensorCCGet extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCGetOptions>) {\n super(options);\n if (\"sensorType\" in options) {\n this.sensorType = options.sensorType;\n this.scale = options.scale;\n }\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCGet {\n if (raw.payload.length >= 2) {\n const sensorType = raw.payload[0];\n const scale = (raw.payload[1] >> 3) & 0b11;\n return new this({\n nodeId: ctx.sourceNodeId,\n sensorType,\n scale,\n });\n }\n else {\n return new this({\n nodeId: ctx.sourceNodeId,\n });\n }\n }\n public sensorType: number | undefined;\n public scale: number | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.sensorType != undefined\n && this.scale != undefined) {\n this.payload = Bytes.from([\n this.sensorType,\n (this.scale & 0b11) << 3,\n ]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n let message: MessageRecord = {};\n if (this.sensorType != undefined\n && this.scale != undefined) {\n message = {\n \"sensor type\": getSensorName(this.sensorType),\n scale: (getSensorScale(this.sensorType, this.scale) ?? getUnknownScale(this.scale)).label,\n };\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface MultilevelSensorCCSupportedSensorReportOptions {\n supportedSensorTypes: readonly number[];\n}\n@CCCommand(MultilevelSensorCommand.SupportedSensorReport)\n@ccValueProperty(\"supportedSensorTypes\", MultilevelSensorCCValues.supportedSensorTypes)\nexport class MultilevelSensorCCSupportedSensorReport extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCSupportedSensorReportOptions>) {\n super(options);\n this.supportedSensorTypes = options.supportedSensorTypes;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCSupportedSensorReport {\n validatePayload(raw.payload.length >= 1);\n const supportedSensorTypes = parseBitMask(raw.payload);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedSensorTypes,\n });\n }\n // TODO: Use this during interview to precreate values\n public supportedSensorTypes: readonly number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = encodeBitMask(this.supportedSensorTypes);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported sensor types\": logList(this.supportedSensorTypes.map((t) => getSensorName(t))),\n },\n };\n }\n}\n@CCCommand(MultilevelSensorCommand.GetSupportedSensor)\n@expectedCCResponse(MultilevelSensorCCSupportedSensorReport)\nexport class MultilevelSensorCCGetSupportedSensor extends MultilevelSensorCC {\n}\n// @publicAPI\nexport interface MultilevelSensorCCSupportedScaleReportOptions {\n sensorType: number;\n supportedScales: readonly number[];\n}\n@CCCommand(MultilevelSensorCommand.SupportedScaleReport)\n@ccValueProperty(\"supportedScales\", MultilevelSensorCCValues.supportedScales, (self) => [self.sensorType])\nexport class MultilevelSensorCCSupportedScaleReport extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCSupportedScaleReportOptions>) {\n super(options);\n this.sensorType = options.sensorType;\n this.supportedScales = options.supportedScales;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCSupportedScaleReport {\n validatePayload(raw.payload.length >= 2);\n const sensorType = raw.payload[0];\n const supportedScales = parseBitMask(Bytes.from([raw.payload[1] & 0b1111]), 0);\n return new this({\n nodeId: ctx.sourceNodeId,\n sensorType,\n supportedScales,\n });\n }\n public readonly sensorType: number;\n public readonly supportedScales: readonly number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.sensorType],\n encodeBitMask(this.supportedScales, 4, 0),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"sensor type\": getSensorName(this.sensorType),\n \"supported scales\": logList(this.supportedScales.map((s) => (getSensorScale(this.sensorType, s)\n ?? getUnknownScale(s)).label)),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultilevelSensorCCGetSupportedScaleOptions {\n sensorType: number;\n}\n@CCCommand(MultilevelSensorCommand.GetSupportedScale)\n@expectedCCResponse(MultilevelSensorCCSupportedScaleReport)\nexport class MultilevelSensorCCGetSupportedScale extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCGetSupportedScaleOptions>) {\n super(options);\n this.sensorType = options.sensorType;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCGetSupportedScale {\n validatePayload(raw.payload.length >= 1);\n const sensorType = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n sensorType,\n });\n }\n public sensorType: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.sensorType]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"sensor type\": getSensorName(this.sensorType),\n },\n };\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as __validateArgs from \"./MultilevelSensorCC._validateArgs.js\";\nconst { validateArgs_MultilevelSensorCCAPI_get, validateArgs_MultilevelSensorCCAPI_getSupportedScales, validateArgs_MultilevelSensorCCAPI_sendReport } = __validateArgs;\nimport type { GetDeviceConfig } from \"@zwave-js/config\";\nimport { CommandClasses, type ControlsCC, type EndpointId, type GetEndpoint, type GetNode, type GetSupportedCCVersion, type GetValueDB, type LogNode, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type NodeId, type Scale, type SinglecastCC, type SupervisionResult, type SupportsCC, type ValueID, ValueMetadata, type WithAddress, encodeBitMask, encodeFloatWithScale, getSensor, getSensorName, getSensorScale, getUnknownScale, logList, logText, parseBitMask, parseFloatWithScale, timespan, validatePayload, } from \"@zwave-js/core\";\nimport { type AllOrNone, Bytes, num2hex } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, PhysicalCCAPI, type PollValueImplementation, throwUnsupportedProperty, } from \"../lib/API.js\";\nimport { type CCRaw, type CCResponsePredicate, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MultilevelSensorCommand, type MultilevelSensorValue, } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport type { GetUserPreferences } from \"../lib/traits.js\";\nimport { MultilevelSensorCCValues } from \"./_CCValues.generated.js\";\nexport { MultilevelSensorCCValues };\n/**\n * Determine the scale to use to query a sensor reading. Uses the user-preferred scale if given,\n * followed by the most recently used scale, otherwile falls back to the first supported one.\n */\nfunction getPreferredSensorScale(ctx: GetValueDB & GetUserPreferences & LogNode, nodeId: number, endpointIndex: number, sensorType: number, supportedScales: readonly number[]): number {\n const preferences = ctx.getUserPreferences();\n const sensor = getSensor(sensorType);\n // If the sensor type is unknown, we have no default. Use the user-provided scale or 0\n if (!sensor) {\n const preferred = preferences?.scales[sensorType];\n // We cannot look up strings for unknown sensor types, so this must be a number or we use the fallback\n if (typeof preferred !== \"number\")\n return 0;\n return preferred;\n }\n // Look up the preference for the scale\n let preferred: number | string | undefined;\n // Named scales apply to multiple sensor types. To be able to override the scale for single types\n // we need to look at the preferences by sensor type first\n preferred = preferences?.scales[sensorType];\n // If the scale is named, we can then try to use the named preference\n const scaleGroupName = sensor.scaleGroupName;\n if (preferred == undefined && scaleGroupName) {\n preferred = preferences?.scales[scaleGroupName];\n }\n // Then attempt reading the scale from the corresponding value\n if (preferred == undefined) {\n const sensorName = getSensorName(sensorType);\n const sensorValue = MultilevelSensorCCValues.value(sensorName);\n const metadata = ctx\n .tryGetValueDB(nodeId)\n ?.getMetadata(sensorValue.endpoint(endpointIndex));\n const scale = metadata?.ccSpecific?.scale;\n if (typeof scale === \"number\" && supportedScales.includes(scale)) {\n preferred = scale;\n ctx.logNode(nodeId, {\n endpoint: endpointIndex,\n message: `No scale preference for sensor type ${sensorType}, using the last-used scale ${preferred}`,\n });\n }\n }\n // Then fall back to the first supported scale\n if (preferred == undefined) {\n preferred = supportedScales[0] ?? 0;\n ctx.logNode(nodeId, {\n endpoint: endpointIndex,\n message: `No scale preference for sensor type ${sensorType}, using the first supported scale ${preferred}`,\n });\n return preferred;\n }\n // If the scale name or unit was given, try to look it up\n if (typeof preferred === \"string\") {\n for (const [key, scale] of Object.entries(sensor.scales)) {\n if (scale.label === preferred || scale.unit === preferred) {\n preferred = parseInt(key, 10);\n break;\n }\n }\n }\n if (typeof preferred === \"string\") {\n // Looking up failed\n ctx.logNode(nodeId, {\n endpoint: endpointIndex,\n message: `Preferred scale \"${preferred}\" for sensor type ${sensorType} not found, using the first supported scale ${supportedScales[0] ?? 0}`,\n });\n return supportedScales[0] ?? 0;\n }\n // We have a numeric scale key, nothing to look up. Make sure it is supported though\n if (!supportedScales.length) {\n // No info about supported scales, just use the preferred one\n return preferred;\n }\n else if (!supportedScales.includes(preferred)) {\n ctx.logNode(nodeId, {\n endpoint: endpointIndex,\n message: `Preferred scale ${preferred} not supported for sensor type ${sensorType}, using the first supported scale`,\n });\n return supportedScales[0];\n }\n else {\n return preferred;\n }\n}\n// @noSetValueAPI This CC is read-only\n@API(CommandClasses[\"Multilevel Sensor\"])\nexport class MultilevelSensorCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: MultilevelSensorCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case MultilevelSensorCommand.Get:\n case MultilevelSensorCommand.Report:\n return true; // This is mandatory\n case MultilevelSensorCommand.GetSupportedSensor:\n case MultilevelSensorCommand.GetSupportedScale:\n return this.version >= 5;\n }\n return super.supportsCommand(cmd);\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: MultilevelSensorCCAPI, { property }) {\n // Look up the necessary information\n const valueId: ValueID = {\n commandClass: CommandClasses[\"Multilevel Sensor\"],\n endpoint: this.endpoint.index,\n property,\n };\n const ccSpecific = this.tryGetValueDB()?.getMetadata(valueId)?.ccSpecific;\n if (!ccSpecific) {\n throwUnsupportedProperty(this.ccId, property);\n }\n const { sensorType, scale } = ccSpecific;\n return this.get(sensorType, scale);\n };\n }\n /** Query the default sensor value */\n public async get(): Promise<MaybeNotKnown<MultilevelSensorValue & {\n type: number;\n }>>;\n /** Query the sensor value for the given sensor type using the preferred sensor scale */\n public async get(sensorType: number): Promise<MaybeNotKnown<MultilevelSensorValue>>;\n /** Query the sensor value for the given sensor type using the given sensor scale */\n public async get(sensorType: number, scale: number): Promise<MaybeNotKnown<number>>;\n @validateArgs_MultilevelSensorCCAPI_get()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async get(sensorType?: number, scale?: number) {\n this.assertSupportsCommand(MultilevelSensorCommand, MultilevelSensorCommand.Get);\n // Figure out the preferred scale if none was given\n let preferredScale: number | undefined;\n if (sensorType != undefined && scale == undefined) {\n const supportedScales: readonly number[] = this.tryGetValueDB()?.getValue({\n commandClass: this.ccId,\n endpoint: this.endpoint.index,\n property: \"supportedScales\",\n propertyKey: sensorType,\n }) ?? [];\n preferredScale = getPreferredSensorScale(this.host, this.endpoint.nodeId, this.endpoint.index, sensorType, supportedScales);\n }\n const cc = new MultilevelSensorCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n sensorType: sensorType!,\n scale: (scale ?? preferredScale)!,\n });\n const response = await this.host.sendCommand<MultilevelSensorCCReport>(cc, this.commandOptions);\n if (!response)\n return;\n const responseScale = getSensorScale(response.type, response.scale);\n if (sensorType == undefined) {\n // Overload #1: return the full response\n return {\n type: response.type,\n value: response.value,\n scale: responseScale,\n };\n }\n else if (scale == undefined) {\n // Overload #2: return value and scale\n return {\n value: response.value,\n scale: responseScale,\n };\n }\n else {\n // Overload #3: return only the value\n return response.value;\n }\n }\n public async getSupportedSensorTypes(): Promise<MaybeNotKnown<readonly number[]>> {\n this.assertSupportsCommand(MultilevelSensorCommand, MultilevelSensorCommand.GetSupportedSensor);\n const cc = new MultilevelSensorCCGetSupportedSensor({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<MultilevelSensorCCSupportedSensorReport>(cc, this.commandOptions);\n return response?.supportedSensorTypes;\n }\n @validateArgs_MultilevelSensorCCAPI_getSupportedScales()\n public async getSupportedScales(sensorType: number): Promise<MaybeNotKnown<readonly number[]>> {\n this.assertSupportsCommand(MultilevelSensorCommand, MultilevelSensorCommand.GetSupportedScale);\n const cc = new MultilevelSensorCCGetSupportedScale({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n sensorType,\n });\n const response = await this.host.sendCommand<MultilevelSensorCCSupportedScaleReport>(cc, this.commandOptions);\n return response?.supportedScales;\n }\n @validateArgs_MultilevelSensorCCAPI_sendReport()\n public async sendReport(sensorType: number, scale: number | Scale, value: number): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MultilevelSensorCommand, MultilevelSensorCommand.Report);\n const cc = new MultilevelSensorCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n type: sensorType,\n scale,\n value,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n}\n@commandClass(CommandClasses[\"Multilevel Sensor\"])\n@implementedVersion(11)\n@ccValues(MultilevelSensorCCValues)\nexport class MultilevelSensorCC extends CommandClass {\n declare ccCommand: MultilevelSensorCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Multilevel Sensor\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n if (api.version >= 5) {\n // Query the supported sensor types\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"retrieving supported sensor types...\",\n direction: \"outbound\",\n });\n const sensorTypes = await api.getSupportedSensorTypes();\n if (sensorTypes) {\n const logMessage = logText(\"received supported sensor types:\", {\n nested: logList(sensorTypes.map((t) => getSensorName(t))),\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported sensor types timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n // As well as the supported scales for each sensor\n for (const [i, type] of sensorTypes.entries()) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying supported scales for ${getSensorName(type)} sensor`,\n direction: \"outbound\",\n });\n const sensorScales = await api.getSupportedScales(type);\n if (sensorScales) {\n const logMessage = logText(\"received supported scales:\", {\n nested: logList(sensorScales.map((s) => (getSensorScale(type, s)\n ?? getUnknownScale(s)).label)),\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported scales timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n node.reportInterviewProgress(i + 1, sensorTypes.length);\n }\n }\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Multilevel Sensor\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const valueDB = this.getValueDB(ctx);\n if (api.version <= 4) {\n // Sensors up to V4 only support a single value\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying current sensor reading...\",\n direction: \"outbound\",\n });\n const mlsResponse = await api.get();\n if (mlsResponse) {\n const sensorScale = getSensorScale(mlsResponse.type, mlsResponse.scale.key);\n const logMessage = `received current sensor reading:\nsensor type: ${getSensorName(mlsResponse.type)}\nvalue: ${mlsResponse.value}${sensorScale?.unit ? ` ${sensorScale.unit}` : \"\"}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n }\n else {\n // Query all sensor values\n const sensorTypes: readonly number[] = valueDB.getValue({\n commandClass: this.ccId,\n property: \"supportedSensorTypes\",\n endpoint: this.endpointIndex,\n }) || [];\n for (const [i, type] of sensorTypes.entries()) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying ${getSensorName(type)} sensor reading...`,\n direction: \"outbound\",\n });\n const value = await api.get(type);\n if (value) {\n const logMessage = `received current ${getSensorName(type)} sensor reading: ${value.value} ${value.scale.unit || \"\"}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n options?.onProgress?.(i + 1, sensorTypes.length);\n }\n }\n }\n public shouldRefreshValues(this: SinglecastCC<this>, ctx: GetValueDB & GetSupportedCCVersion & GetDeviceConfig & GetNode<NodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>>): boolean {\n // Poll the device when all of the supported values were last updated longer than 6 hours ago.\n // This may lead to some values not being updated, but the user may have disabled some unnecessary\n // reports to reduce traffic.\n const valueDB = ctx.tryGetValueDB(this.nodeId);\n if (!valueDB)\n return true;\n const values = this.getDefinedValueIDs(ctx).filter((v) => MultilevelSensorCCValues.value.is(v));\n return values.every((v) => {\n const lastUpdated = valueDB.getTimestamp(v);\n return (lastUpdated == undefined\n || Date.now() - lastUpdated > timespan.hours(6));\n });\n }\n /**\n * Returns which sensor types are supported.\n * This only works AFTER the interview process\n */\n public static getSupportedSensorTypesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<number[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MultilevelSensorCCValues.supportedSensorTypes.endpoint(endpoint.index));\n }\n /**\n * Returns which scales are supported for a given sensor type.\n * This only works AFTER the interview process\n */\n public static getSupportedScalesCached(ctx: GetValueDB, endpoint: EndpointId, sensorType: number): MaybeNotKnown<number[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MultilevelSensorCCValues.supportedScales(sensorType).endpoint(endpoint.index));\n }\n public translatePropertyKey(ctx: GetValueDB, property: string | number, propertyKey: string | number): string | undefined {\n // TODO: check this\n if (property === \"values\" && typeof propertyKey === \"number\") {\n const sensor = getSensor(propertyKey);\n if (sensor)\n return sensor.label;\n }\n return super.translatePropertyKey(ctx, property, propertyKey);\n }\n}\n// @publicAPI\nexport interface MultilevelSensorCCReportOptions {\n type: number;\n scale: number | Scale;\n value: number;\n}\n@CCCommand(MultilevelSensorCommand.Report)\n@useSupervision()\nexport class MultilevelSensorCCReport extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCReportOptions>) {\n super(options);\n this.type = options.type;\n this.value = options.value;\n this.scale =\n typeof options.scale === \"number\"\n ? options.scale\n : options.scale.key;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCReport {\n validatePayload(raw.payload.length >= 1);\n const type = raw.payload[0];\n // parseFloatWithScale does its own validation\n const { value, scale } = parseFloatWithScale(raw.payload.subarray(1));\n return new this({\n nodeId: ctx.sourceNodeId,\n type,\n value,\n scale,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n const sensor = getSensor(this.type);\n const scale = getSensorScale(this.type, this.scale)\n ?? getUnknownScale(this.scale);\n // Filter out unknown sensor types and scales, unless the strict validation is disabled\n const measurementValidation = !ctx.getDeviceConfig?.(this.nodeId as number)?.compat?.disableStrictMeasurementValidation;\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (measurementValidation) {\n // Filter out unsupported sensor types and scales if possible\n if (ccVersion >= 5) {\n const supportedSensorTypes = this.getValue<number[]>(ctx, MultilevelSensorCCValues.supportedSensorTypes);\n if (supportedSensorTypes?.length) {\n validatePayload.withReason(`Unsupported sensor type ${getSensorName(this.type)} or corrupted data`)(supportedSensorTypes.includes(this.type));\n }\n const supportedScales = this.getValue<number[]>(ctx, MultilevelSensorCCValues.supportedScales(this.type));\n if (supportedScales?.length) {\n validatePayload.withReason(`Unsupported scale ${scale.label} or corrupted data`)(supportedScales.includes(scale.key));\n }\n }\n else {\n // We support a higher CC version than the device, so any types and scales it uses should be known to us\n // Filter out unknown ones.\n validatePayload.withReason(`Unknown sensor type ${num2hex(this.type)} or corrupted data`)(!!sensor);\n validatePayload.withReason(`Unknown scale ${num2hex(this.scale)} or corrupted data`)(scale.label !== getUnknownScale(this.scale).label);\n }\n }\n const sensorName = getSensorName(this.type);\n const sensorValue = MultilevelSensorCCValues.value(sensorName);\n this.setMetadata(ctx, sensorValue, {\n ...sensorValue.meta,\n unit: scale.unit,\n ccSpecific: {\n sensorType: this.type,\n scale: scale.key,\n },\n });\n this.setValue(ctx, sensorValue, this.value);\n return true;\n }\n public type: number;\n public scale: number;\n public value: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.type],\n encodeFloatWithScale(this.value, this.scale),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"sensor type\": getSensorName(this.type),\n scale: (getSensorScale(this.type, this.scale)\n ?? getUnknownScale(this.scale)).label,\n value: this.value,\n },\n };\n }\n}\nconst testResponseForMultilevelSensorGet: CCResponsePredicate<MultilevelSensorCCGet, MultilevelSensorCCReport> = (sent, received) => {\n // We expect a Multilevel Sensor Report that matches the requested sensor type (if a type was requested)\n return sent.sensorType == undefined || received.type === sent.sensorType;\n};\n// These options are supported starting in V5\n// @publicAPI\nexport type MultilevelSensorCCGetOptions = AllOrNone<{\n sensorType: number;\n scale: number;\n}>;\n@CCCommand(MultilevelSensorCommand.Get)\n@expectedCCResponse(MultilevelSensorCCReport, testResponseForMultilevelSensorGet)\nexport class MultilevelSensorCCGet extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCGetOptions>) {\n super(options);\n if (\"sensorType\" in options) {\n this.sensorType = options.sensorType;\n this.scale = options.scale;\n }\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCGet {\n if (raw.payload.length >= 2) {\n const sensorType = raw.payload[0];\n const scale = (raw.payload[1] >> 3) & 0b11;\n return new this({\n nodeId: ctx.sourceNodeId,\n sensorType,\n scale,\n });\n }\n else {\n return new this({\n nodeId: ctx.sourceNodeId,\n });\n }\n }\n public sensorType: number | undefined;\n public scale: number | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.sensorType != undefined && this.scale != undefined) {\n this.payload = Bytes.from([\n this.sensorType,\n (this.scale & 0b11) << 3,\n ]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n let message: MessageRecord = {};\n if (this.sensorType != undefined && this.scale != undefined) {\n message = {\n \"sensor type\": getSensorName(this.sensorType),\n scale: (getSensorScale(this.sensorType, this.scale)\n ?? getUnknownScale(this.scale)).label,\n };\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface MultilevelSensorCCSupportedSensorReportOptions {\n supportedSensorTypes: readonly number[];\n}\n@CCCommand(MultilevelSensorCommand.SupportedSensorReport)\n@ccValueProperty(\"supportedSensorTypes\", MultilevelSensorCCValues.supportedSensorTypes)\nexport class MultilevelSensorCCSupportedSensorReport extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCSupportedSensorReportOptions>) {\n super(options);\n this.supportedSensorTypes = options.supportedSensorTypes;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCSupportedSensorReport {\n validatePayload(raw.payload.length >= 1);\n const supportedSensorTypes = parseBitMask(raw.payload);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedSensorTypes,\n });\n }\n // TODO: Use this during interview to precreate values\n public supportedSensorTypes: readonly number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = encodeBitMask(this.supportedSensorTypes);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported sensor types\": logList(this.supportedSensorTypes.map((t) => getSensorName(t))),\n },\n };\n }\n}\n@CCCommand(MultilevelSensorCommand.GetSupportedSensor)\n@expectedCCResponse(MultilevelSensorCCSupportedSensorReport)\nexport class MultilevelSensorCCGetSupportedSensor extends MultilevelSensorCC {\n}\n// @publicAPI\nexport interface MultilevelSensorCCSupportedScaleReportOptions {\n sensorType: number;\n supportedScales: readonly number[];\n}\n@CCCommand(MultilevelSensorCommand.SupportedScaleReport)\n@ccValueProperty(\"supportedScales\", MultilevelSensorCCValues.supportedScales, (self) => [self.sensorType])\nexport class MultilevelSensorCCSupportedScaleReport extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCSupportedScaleReportOptions>) {\n super(options);\n this.sensorType = options.sensorType;\n this.supportedScales = options.supportedScales;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCSupportedScaleReport {\n validatePayload(raw.payload.length >= 2);\n const sensorType = raw.payload[0];\n const supportedScales = parseBitMask(Bytes.from([raw.payload[1] & 0b1111]), 0);\n return new this({\n nodeId: ctx.sourceNodeId,\n sensorType,\n supportedScales,\n });\n }\n public readonly sensorType: number;\n public readonly supportedScales: readonly number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.sensorType],\n encodeBitMask(this.supportedScales, 4, 0),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"sensor type\": getSensorName(this.sensorType),\n \"supported scales\": logList(this.supportedScales.map((s) => (getSensorScale(this.sensorType, s)\n ?? getUnknownScale(s)).label)),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultilevelSensorCCGetSupportedScaleOptions {\n sensorType: number;\n}\n@CCCommand(MultilevelSensorCommand.GetSupportedScale)\n@expectedCCResponse(MultilevelSensorCCSupportedScaleReport)\nexport class MultilevelSensorCCGetSupportedScale extends MultilevelSensorCC {\n public constructor(options: WithAddress<MultilevelSensorCCGetSupportedScaleOptions>) {\n super(options);\n this.sensorType = options.sensorType;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultilevelSensorCCGetSupportedScale {\n validatePayload(raw.payload.length >= 1);\n const sensorType = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n sensorType,\n });\n }\n public sensorType: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.sensorType]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"sensor type\": getSensorName(this.sensorType),\n },\n };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["preferred"]
7
7
  }