@zwave-js/cc 14.3.10 → 15.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/build/cjs/cc/AlarmSensorCC.d.ts +139 -57
  2. package/build/cjs/cc/AlarmSensorCC.js.map +2 -2
  3. package/build/cjs/cc/AssociationCC.d.ts +178 -43
  4. package/build/cjs/cc/AssociationCC.js +0 -4
  5. package/build/cjs/cc/AssociationCC.js.map +2 -2
  6. package/build/cjs/cc/AssociationGroupInfoCC.d.ts +138 -38
  7. package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
  8. package/build/cjs/cc/BarrierOperatorCC.d.ts +275 -73
  9. package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
  10. package/build/cjs/cc/BasicCC.d.ts +316 -71
  11. package/build/cjs/cc/BasicCC.js.map +2 -2
  12. package/build/cjs/cc/BatteryCC.d.ts +759 -164
  13. package/build/cjs/cc/BatteryCC.js.map +2 -2
  14. package/build/cjs/cc/BinarySensorCC.d.ts +91 -26
  15. package/build/cjs/cc/BinarySensorCC.js.map +2 -2
  16. package/build/cjs/cc/BinarySwitchCC.d.ts +190 -38
  17. package/build/cjs/cc/BinarySwitchCC.js.map +2 -2
  18. package/build/cjs/cc/CRC16CC.d.ts +4 -8
  19. package/build/cjs/cc/CRC16CC.js +4 -27
  20. package/build/cjs/cc/CRC16CC.js.map +2 -2
  21. package/build/cjs/cc/CentralSceneCC.d.ts +272 -53
  22. package/build/cjs/cc/CentralSceneCC.js.map +2 -2
  23. package/build/cjs/cc/ClimateControlScheduleCC.d.ts +150 -37
  24. package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
  25. package/build/cjs/cc/ClockCC.d.ts +3 -3
  26. package/build/cjs/cc/ClockCC.js.map +2 -2
  27. package/build/cjs/cc/ColorSwitchCC.d.ts +423 -96
  28. package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
  29. package/build/cjs/cc/ConfigurationCC._validateArgs.js +1 -1
  30. package/build/cjs/cc/ConfigurationCC._validateArgs.js.map +1 -1
  31. package/build/cjs/cc/ConfigurationCC.d.ts +101 -37
  32. package/build/cjs/cc/ConfigurationCC.js +0 -8
  33. package/build/cjs/cc/ConfigurationCC.js.map +2 -2
  34. package/build/cjs/cc/DeviceResetLocallyCC.d.ts +1 -1
  35. package/build/cjs/cc/DeviceResetLocallyCC.js.map +2 -2
  36. package/build/cjs/cc/DoorLockCC._validateArgs.js +1 -1
  37. package/build/cjs/cc/DoorLockCC._validateArgs.js.map +1 -1
  38. package/build/cjs/cc/DoorLockCC.d.ts +1731 -419
  39. package/build/cjs/cc/DoorLockCC.js.map +2 -2
  40. package/build/cjs/cc/DoorLockLoggingCC.d.ts +64 -12
  41. package/build/cjs/cc/DoorLockLoggingCC.js.map +2 -2
  42. package/build/cjs/cc/EnergyProductionCC.d.ts +29 -14
  43. package/build/cjs/cc/EnergyProductionCC.js.map +2 -2
  44. package/build/cjs/cc/EntryControlCC.d.ts +308 -57
  45. package/build/cjs/cc/EntryControlCC.js.map +2 -2
  46. package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts +2 -0
  47. package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.js +26 -0
  48. package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.js.map +1 -1
  49. package/build/cjs/cc/FirmwareUpdateMetaDataCC.d.ts +389 -64
  50. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js +154 -8
  51. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +2 -2
  52. package/build/cjs/cc/HumidityControlModeCC.d.ts +125 -27
  53. package/build/cjs/cc/HumidityControlModeCC.js.map +2 -2
  54. package/build/cjs/cc/HumidityControlOperatingStateCC.d.ts +64 -18
  55. package/build/cjs/cc/HumidityControlOperatingStateCC.js.map +2 -2
  56. package/build/cjs/cc/HumidityControlSetpointCC.d.ts +116 -39
  57. package/build/cjs/cc/HumidityControlSetpointCC.js.map +2 -2
  58. package/build/cjs/cc/InclusionControllerCC.d.ts +4 -4
  59. package/build/cjs/cc/InclusionControllerCC.js.map +2 -2
  60. package/build/cjs/cc/IndicatorCC.d.ts +325 -83
  61. package/build/cjs/cc/IndicatorCC.js.map +2 -2
  62. package/build/cjs/cc/IrrigationCC.d.ts +2170 -683
  63. package/build/cjs/cc/IrrigationCC.js.map +2 -2
  64. package/build/cjs/cc/LanguageCC.d.ts +128 -26
  65. package/build/cjs/cc/LanguageCC.js.map +2 -2
  66. package/build/cjs/cc/LockCC.d.ts +64 -14
  67. package/build/cjs/cc/LockCC.js.map +2 -2
  68. package/build/cjs/cc/ManufacturerProprietaryCC.d.ts +2 -2
  69. package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
  70. package/build/cjs/cc/ManufacturerSpecificCC.d.ts +219 -57
  71. package/build/cjs/cc/ManufacturerSpecificCC.js.map +2 -2
  72. package/build/cjs/cc/MeterCC.d.ts +364 -89
  73. package/build/cjs/cc/MeterCC.js.map +2 -2
  74. package/build/cjs/cc/MultiChannelAssociationCC.d.ts +138 -40
  75. package/build/cjs/cc/MultiChannelAssociationCC.js +0 -5
  76. package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
  77. package/build/cjs/cc/MultiChannelCC.d.ts +469 -99
  78. package/build/cjs/cc/MultiChannelCC.js +8 -72
  79. package/build/cjs/cc/MultiChannelCC.js.map +2 -2
  80. package/build/cjs/cc/MultiCommandCC.d.ts +4 -8
  81. package/build/cjs/cc/MultiCommandCC.js +4 -37
  82. package/build/cjs/cc/MultiCommandCC.js.map +2 -2
  83. package/build/cjs/cc/MultilevelSensorCC.d.ts +118 -33
  84. package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
  85. package/build/cjs/cc/MultilevelSwitchCC.d.ts +490 -125
  86. package/build/cjs/cc/MultilevelSwitchCC.js.map +2 -2
  87. package/build/cjs/cc/NodeNamingCC.d.ts +128 -26
  88. package/build/cjs/cc/NodeNamingCC.js.map +2 -2
  89. package/build/cjs/cc/NotificationCC.d.ts +603 -161
  90. package/build/cjs/cc/NotificationCC.js +12 -1
  91. package/build/cjs/cc/NotificationCC.js.map +2 -2
  92. package/build/cjs/cc/PowerlevelCC.d.ts +6 -6
  93. package/build/cjs/cc/PowerlevelCC.js.map +2 -2
  94. package/build/cjs/cc/ProtectionCC.d.ts +496 -94
  95. package/build/cjs/cc/ProtectionCC.js.map +2 -2
  96. package/build/cjs/cc/SceneActivationCC.d.ts +127 -28
  97. package/build/cjs/cc/SceneActivationCC.js.map +2 -2
  98. package/build/cjs/cc/SceneActuatorConfigurationCC.d.ts +52 -25
  99. package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +2 -2
  100. package/build/cjs/cc/SceneControllerConfigurationCC.d.ts +53 -25
  101. package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
  102. package/build/cjs/cc/ScheduleEntryLockCC.d.ts +268 -64
  103. package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
  104. package/build/cjs/cc/Security2CC.d.ts +15 -21
  105. package/build/cjs/cc/Security2CC.js +32 -347
  106. package/build/cjs/cc/Security2CC.js.map +3 -3
  107. package/build/cjs/cc/SecurityCC.d.ts +12 -19
  108. package/build/cjs/cc/SecurityCC.js +12 -106
  109. package/build/cjs/cc/SecurityCC.js.map +2 -2
  110. package/build/cjs/cc/SoundSwitchCC.d.ts +253 -64
  111. package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
  112. package/build/cjs/cc/SupervisionCC.d.ts +28 -16
  113. package/build/cjs/cc/SupervisionCC.js +4 -29
  114. package/build/cjs/cc/SupervisionCC.js.map +2 -2
  115. package/build/cjs/cc/ThermostatFanModeCC.d.ts +187 -38
  116. package/build/cjs/cc/ThermostatFanModeCC.js.map +2 -2
  117. package/build/cjs/cc/ThermostatFanStateCC.d.ts +64 -18
  118. package/build/cjs/cc/ThermostatFanStateCC.js.map +2 -2
  119. package/build/cjs/cc/ThermostatModeCC.d.ts +189 -40
  120. package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
  121. package/build/cjs/cc/ThermostatOperatingStateCC.d.ts +65 -19
  122. package/build/cjs/cc/ThermostatOperatingStateCC.js.map +2 -2
  123. package/build/cjs/cc/ThermostatSetbackCC.d.ts +4 -4
  124. package/build/cjs/cc/ThermostatSetbackCC.js.map +2 -2
  125. package/build/cjs/cc/ThermostatSetpointCC.d.ts +116 -36
  126. package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
  127. package/build/cjs/cc/TimeCC.d.ts +6 -6
  128. package/build/cjs/cc/TimeCC.js.map +2 -2
  129. package/build/cjs/cc/TimeParametersCC.d.ts +63 -12
  130. package/build/cjs/cc/TimeParametersCC.js.map +2 -2
  131. package/build/cjs/cc/TransportServiceCC.d.ts +7 -12
  132. package/build/cjs/cc/TransportServiceCC.js +3 -20
  133. package/build/cjs/cc/TransportServiceCC.js.map +2 -2
  134. package/build/cjs/cc/UserCodeCC._validateArgs.js +1 -1
  135. package/build/cjs/cc/UserCodeCC._validateArgs.js.map +1 -1
  136. package/build/cjs/cc/UserCodeCC.d.ts +931 -176
  137. package/build/cjs/cc/UserCodeCC.js.map +2 -2
  138. package/build/cjs/cc/VersionCC.d.ts +897 -185
  139. package/build/cjs/cc/VersionCC.js.map +2 -2
  140. package/build/cjs/cc/WakeUpCC.d.ts +190 -38
  141. package/build/cjs/cc/WakeUpCC.js.map +2 -2
  142. package/build/cjs/cc/WindowCoveringCC.d.ts +193 -103
  143. package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
  144. package/build/cjs/cc/ZWavePlusCC.d.ts +311 -51
  145. package/build/cjs/cc/ZWavePlusCC.js.map +2 -2
  146. package/build/cjs/cc/ZWaveProtocolCC.d.ts +28 -28
  147. package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
  148. package/build/cjs/cc/manufacturerProprietary/FibaroCC.d.ts +4 -4
  149. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +2 -2
  150. package/build/cjs/index.d.ts +1 -0
  151. package/build/cjs/index.js.map +1 -1
  152. package/build/cjs/index_browser.d.ts +9 -0
  153. package/build/cjs/index_browser.js +41 -1
  154. package/build/cjs/index_browser.js.map +2 -2
  155. package/build/cjs/lib/API.d.ts +7 -5
  156. package/build/cjs/lib/API.js +1 -1
  157. package/build/cjs/lib/API.js.map +2 -2
  158. package/build/cjs/lib/CommandClass.d.ts +10 -21
  159. package/build/cjs/lib/CommandClass.js +51 -106
  160. package/build/cjs/lib/CommandClass.js.map +3 -3
  161. package/build/cjs/lib/CommandClassDecorators.d.ts +1 -1
  162. package/build/cjs/lib/CommandClassDecorators.js +3 -3
  163. package/build/cjs/lib/CommandClassDecorators.js.map +2 -2
  164. package/build/cjs/lib/Values.d.ts +2 -2
  165. package/build/cjs/lib/Values.js.map +2 -2
  166. package/build/cjs/lib/traits.d.ts +94 -0
  167. package/build/cjs/lib/traits.js +17 -0
  168. package/build/cjs/lib/traits.js.map +7 -0
  169. package/build/cjs/lib/utils.d.ts +2 -2
  170. package/build/cjs/lib/utils.js.map +2 -2
  171. package/build/esm/cc/AlarmSensorCC.d.ts +139 -57
  172. package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
  173. package/build/esm/cc/AlarmSensorCC.js +0 -1
  174. package/build/esm/cc/AlarmSensorCC.js.map +1 -1
  175. package/build/esm/cc/AssociationCC.d.ts +178 -43
  176. package/build/esm/cc/AssociationCC.d.ts.map +1 -1
  177. package/build/esm/cc/AssociationCC.js +0 -13
  178. package/build/esm/cc/AssociationCC.js.map +1 -1
  179. package/build/esm/cc/AssociationGroupInfoCC.d.ts +138 -38
  180. package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
  181. package/build/esm/cc/AssociationGroupInfoCC.js +0 -6
  182. package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
  183. package/build/esm/cc/BarrierOperatorCC.d.ts +275 -73
  184. package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
  185. package/build/esm/cc/BarrierOperatorCC.js +0 -3
  186. package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
  187. package/build/esm/cc/BasicCC.d.ts +316 -71
  188. package/build/esm/cc/BasicCC.d.ts.map +1 -1
  189. package/build/esm/cc/BasicCC.js +0 -2
  190. package/build/esm/cc/BasicCC.js.map +1 -1
  191. package/build/esm/cc/BatteryCC.d.ts +759 -164
  192. package/build/esm/cc/BatteryCC.d.ts.map +1 -1
  193. package/build/esm/cc/BatteryCC.js +1 -2
  194. package/build/esm/cc/BatteryCC.js.map +1 -1
  195. package/build/esm/cc/BinarySensorCC.d.ts +91 -26
  196. package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
  197. package/build/esm/cc/BinarySensorCC.js +0 -3
  198. package/build/esm/cc/BinarySensorCC.js.map +1 -1
  199. package/build/esm/cc/BinarySwitchCC.d.ts +190 -38
  200. package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -1
  201. package/build/esm/cc/BinarySwitchCC.js +0 -2
  202. package/build/esm/cc/BinarySwitchCC.js.map +1 -1
  203. package/build/esm/cc/CRC16CC.d.ts +4 -8
  204. package/build/esm/cc/CRC16CC.d.ts.map +1 -1
  205. package/build/esm/cc/CRC16CC.js +4 -34
  206. package/build/esm/cc/CRC16CC.js.map +1 -1
  207. package/build/esm/cc/CentralSceneCC.d.ts +272 -53
  208. package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
  209. package/build/esm/cc/CentralSceneCC.js +0 -1
  210. package/build/esm/cc/CentralSceneCC.js.map +1 -1
  211. package/build/esm/cc/ClimateControlScheduleCC.d.ts +150 -37
  212. package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -1
  213. package/build/esm/cc/ClimateControlScheduleCC.js +0 -3
  214. package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
  215. package/build/esm/cc/ClockCC.d.ts +3 -3
  216. package/build/esm/cc/ClockCC.d.ts.map +1 -1
  217. package/build/esm/cc/ClockCC.js +0 -1
  218. package/build/esm/cc/ClockCC.js.map +1 -1
  219. package/build/esm/cc/ColorSwitchCC.d.ts +423 -96
  220. package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
  221. package/build/esm/cc/ColorSwitchCC.js +0 -6
  222. package/build/esm/cc/ColorSwitchCC.js.map +1 -1
  223. package/build/esm/cc/ConfigurationCC._validateArgs.js +1 -1
  224. package/build/esm/cc/ConfigurationCC._validateArgs.js.map +1 -1
  225. package/build/esm/cc/ConfigurationCC.d.ts +101 -37
  226. package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
  227. package/build/esm/cc/ConfigurationCC.js +0 -25
  228. package/build/esm/cc/ConfigurationCC.js.map +1 -1
  229. package/build/esm/cc/DeviceResetLocallyCC.d.ts +1 -1
  230. package/build/esm/cc/DeviceResetLocallyCC.d.ts.map +1 -1
  231. package/build/esm/cc/DeviceResetLocallyCC.js.map +1 -1
  232. package/build/esm/cc/DoorLockCC._validateArgs.js +1 -1
  233. package/build/esm/cc/DoorLockCC._validateArgs.js.map +1 -1
  234. package/build/esm/cc/DoorLockCC.d.ts +1731 -419
  235. package/build/esm/cc/DoorLockCC.d.ts.map +1 -1
  236. package/build/esm/cc/DoorLockCC.js +0 -2
  237. package/build/esm/cc/DoorLockCC.js.map +1 -1
  238. package/build/esm/cc/DoorLockLoggingCC.d.ts +64 -12
  239. package/build/esm/cc/DoorLockLoggingCC.d.ts.map +1 -1
  240. package/build/esm/cc/DoorLockLoggingCC.js +0 -1
  241. package/build/esm/cc/DoorLockLoggingCC.js.map +1 -1
  242. package/build/esm/cc/EnergyProductionCC.d.ts +29 -14
  243. package/build/esm/cc/EnergyProductionCC.d.ts.map +1 -1
  244. package/build/esm/cc/EnergyProductionCC.js +0 -2
  245. package/build/esm/cc/EnergyProductionCC.js.map +1 -1
  246. package/build/esm/cc/EntryControlCC.d.ts +308 -57
  247. package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
  248. package/build/esm/cc/EntryControlCC.js +0 -1
  249. package/build/esm/cc/EntryControlCC.js.map +1 -1
  250. package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts +2 -0
  251. package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts.map +1 -1
  252. package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.js +20 -0
  253. package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.js.map +1 -1
  254. package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts +389 -64
  255. package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -1
  256. package/build/esm/cc/FirmwareUpdateMetaDataCC.js +158 -30
  257. package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
  258. package/build/esm/cc/HumidityControlModeCC.d.ts +125 -27
  259. package/build/esm/cc/HumidityControlModeCC.d.ts.map +1 -1
  260. package/build/esm/cc/HumidityControlModeCC.js +0 -1
  261. package/build/esm/cc/HumidityControlModeCC.js.map +1 -1
  262. package/build/esm/cc/HumidityControlOperatingStateCC.d.ts +64 -18
  263. package/build/esm/cc/HumidityControlOperatingStateCC.d.ts.map +1 -1
  264. package/build/esm/cc/HumidityControlOperatingStateCC.js.map +1 -1
  265. package/build/esm/cc/HumidityControlSetpointCC.d.ts +116 -39
  266. package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -1
  267. package/build/esm/cc/HumidityControlSetpointCC.js +0 -4
  268. package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
  269. package/build/esm/cc/InclusionControllerCC.d.ts +4 -4
  270. package/build/esm/cc/InclusionControllerCC.d.ts.map +1 -1
  271. package/build/esm/cc/InclusionControllerCC.js +0 -2
  272. package/build/esm/cc/InclusionControllerCC.js.map +1 -1
  273. package/build/esm/cc/IndicatorCC.d.ts +325 -83
  274. package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
  275. package/build/esm/cc/IndicatorCC.js +0 -7
  276. package/build/esm/cc/IndicatorCC.js.map +1 -1
  277. package/build/esm/cc/IrrigationCC.d.ts +2170 -683
  278. package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
  279. package/build/esm/cc/IrrigationCC.js +0 -9
  280. package/build/esm/cc/IrrigationCC.js.map +1 -1
  281. package/build/esm/cc/LanguageCC.d.ts +128 -26
  282. package/build/esm/cc/LanguageCC.d.ts.map +1 -1
  283. package/build/esm/cc/LanguageCC.js +0 -1
  284. package/build/esm/cc/LanguageCC.js.map +1 -1
  285. package/build/esm/cc/LockCC.d.ts +64 -14
  286. package/build/esm/cc/LockCC.d.ts.map +1 -1
  287. package/build/esm/cc/LockCC.js +0 -1
  288. package/build/esm/cc/LockCC.js.map +1 -1
  289. package/build/esm/cc/ManufacturerProprietaryCC.d.ts +2 -2
  290. package/build/esm/cc/ManufacturerProprietaryCC.d.ts.map +1 -1
  291. package/build/esm/cc/ManufacturerProprietaryCC.js +0 -1
  292. package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
  293. package/build/esm/cc/ManufacturerSpecificCC.d.ts +219 -57
  294. package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
  295. package/build/esm/cc/ManufacturerSpecificCC.js +0 -2
  296. package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
  297. package/build/esm/cc/MeterCC.d.ts +364 -89
  298. package/build/esm/cc/MeterCC.d.ts.map +1 -1
  299. package/build/esm/cc/MeterCC.js +0 -4
  300. package/build/esm/cc/MeterCC.js.map +1 -1
  301. package/build/esm/cc/MultiChannelAssociationCC.d.ts +138 -40
  302. package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
  303. package/build/esm/cc/MultiChannelAssociationCC.js +0 -16
  304. package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
  305. package/build/esm/cc/MultiChannelCC.d.ts +469 -99
  306. package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
  307. package/build/esm/cc/MultiChannelCC.js +8 -101
  308. package/build/esm/cc/MultiChannelCC.js.map +1 -1
  309. package/build/esm/cc/MultiCommandCC.d.ts +4 -8
  310. package/build/esm/cc/MultiCommandCC.d.ts.map +1 -1
  311. package/build/esm/cc/MultiCommandCC.js +4 -38
  312. package/build/esm/cc/MultiCommandCC.js.map +1 -1
  313. package/build/esm/cc/MultilevelSensorCC.d.ts +118 -33
  314. package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
  315. package/build/esm/cc/MultilevelSensorCC.js +0 -5
  316. package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
  317. package/build/esm/cc/MultilevelSwitchCC.d.ts +490 -125
  318. package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -1
  319. package/build/esm/cc/MultilevelSwitchCC.js +0 -4
  320. package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
  321. package/build/esm/cc/NodeNamingCC.d.ts +128 -26
  322. package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
  323. package/build/esm/cc/NodeNamingCC.js +0 -2
  324. package/build/esm/cc/NodeNamingCC.js.map +1 -1
  325. package/build/esm/cc/NotificationCC.d.ts +603 -161
  326. package/build/esm/cc/NotificationCC.d.ts.map +1 -1
  327. package/build/esm/cc/NotificationCC.js +18 -12
  328. package/build/esm/cc/NotificationCC.js.map +1 -1
  329. package/build/esm/cc/PowerlevelCC.d.ts +6 -6
  330. package/build/esm/cc/PowerlevelCC.d.ts.map +1 -1
  331. package/build/esm/cc/PowerlevelCC.js +0 -4
  332. package/build/esm/cc/PowerlevelCC.js.map +1 -1
  333. package/build/esm/cc/ProtectionCC.d.ts +496 -94
  334. package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
  335. package/build/esm/cc/ProtectionCC.js +0 -3
  336. package/build/esm/cc/ProtectionCC.js.map +1 -1
  337. package/build/esm/cc/SceneActivationCC.d.ts +127 -28
  338. package/build/esm/cc/SceneActivationCC.d.ts.map +1 -1
  339. package/build/esm/cc/SceneActivationCC.js +0 -1
  340. package/build/esm/cc/SceneActivationCC.js.map +1 -1
  341. package/build/esm/cc/SceneActuatorConfigurationCC.d.ts +52 -25
  342. package/build/esm/cc/SceneActuatorConfigurationCC.d.ts.map +1 -1
  343. package/build/esm/cc/SceneActuatorConfigurationCC.js +0 -2
  344. package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -1
  345. package/build/esm/cc/SceneControllerConfigurationCC.d.ts +53 -25
  346. package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
  347. package/build/esm/cc/SceneControllerConfigurationCC.js +0 -2
  348. package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
  349. package/build/esm/cc/ScheduleEntryLockCC.d.ts +268 -64
  350. package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
  351. package/build/esm/cc/ScheduleEntryLockCC.js +0 -14
  352. package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
  353. package/build/esm/cc/Security2CC.d.ts +15 -21
  354. package/build/esm/cc/Security2CC.d.ts.map +1 -1
  355. package/build/esm/cc/Security2CC.js +27 -475
  356. package/build/esm/cc/Security2CC.js.map +1 -1
  357. package/build/esm/cc/SecurityCC.d.ts +12 -19
  358. package/build/esm/cc/SecurityCC.d.ts.map +1 -1
  359. package/build/esm/cc/SecurityCC.js +13 -138
  360. package/build/esm/cc/SecurityCC.js.map +1 -1
  361. package/build/esm/cc/SoundSwitchCC.d.ts +253 -64
  362. package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
  363. package/build/esm/cc/SoundSwitchCC.js +0 -7
  364. package/build/esm/cc/SoundSwitchCC.js.map +1 -1
  365. package/build/esm/cc/SupervisionCC.d.ts +28 -16
  366. package/build/esm/cc/SupervisionCC.d.ts.map +1 -1
  367. package/build/esm/cc/SupervisionCC.js +4 -34
  368. package/build/esm/cc/SupervisionCC.js.map +1 -1
  369. package/build/esm/cc/ThermostatFanModeCC.d.ts +187 -38
  370. package/build/esm/cc/ThermostatFanModeCC.d.ts.map +1 -1
  371. package/build/esm/cc/ThermostatFanModeCC.js +0 -1
  372. package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
  373. package/build/esm/cc/ThermostatFanStateCC.d.ts +64 -18
  374. package/build/esm/cc/ThermostatFanStateCC.d.ts.map +1 -1
  375. package/build/esm/cc/ThermostatFanStateCC.js.map +1 -1
  376. package/build/esm/cc/ThermostatModeCC.d.ts +189 -40
  377. package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
  378. package/build/esm/cc/ThermostatModeCC.js +0 -3
  379. package/build/esm/cc/ThermostatModeCC.js.map +1 -1
  380. package/build/esm/cc/ThermostatOperatingStateCC.d.ts +65 -19
  381. package/build/esm/cc/ThermostatOperatingStateCC.d.ts.map +1 -1
  382. package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -1
  383. package/build/esm/cc/ThermostatSetbackCC.d.ts +4 -4
  384. package/build/esm/cc/ThermostatSetbackCC.d.ts.map +1 -1
  385. package/build/esm/cc/ThermostatSetbackCC.js +0 -2
  386. package/build/esm/cc/ThermostatSetbackCC.js.map +1 -1
  387. package/build/esm/cc/ThermostatSetpointCC.d.ts +116 -36
  388. package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
  389. package/build/esm/cc/ThermostatSetpointCC.js +0 -6
  390. package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
  391. package/build/esm/cc/TimeCC.d.ts +6 -6
  392. package/build/esm/cc/TimeCC.d.ts.map +1 -1
  393. package/build/esm/cc/TimeCC.js +0 -4
  394. package/build/esm/cc/TimeCC.js.map +1 -1
  395. package/build/esm/cc/TimeParametersCC.d.ts +63 -12
  396. package/build/esm/cc/TimeParametersCC.d.ts.map +1 -1
  397. package/build/esm/cc/TimeParametersCC.js +0 -1
  398. package/build/esm/cc/TimeParametersCC.js.map +1 -1
  399. package/build/esm/cc/TransportServiceCC.d.ts +7 -12
  400. package/build/esm/cc/TransportServiceCC.d.ts.map +1 -1
  401. package/build/esm/cc/TransportServiceCC.js +5 -38
  402. package/build/esm/cc/TransportServiceCC.js.map +1 -1
  403. package/build/esm/cc/UserCodeCC._validateArgs.js +1 -1
  404. package/build/esm/cc/UserCodeCC._validateArgs.js.map +1 -1
  405. package/build/esm/cc/UserCodeCC.d.ts +931 -176
  406. package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
  407. package/build/esm/cc/UserCodeCC.js +0 -12
  408. package/build/esm/cc/UserCodeCC.js.map +1 -1
  409. package/build/esm/cc/VersionCC.d.ts +897 -185
  410. package/build/esm/cc/VersionCC.d.ts.map +1 -1
  411. package/build/esm/cc/VersionCC.js +0 -4
  412. package/build/esm/cc/VersionCC.js.map +1 -1
  413. package/build/esm/cc/WakeUpCC.d.ts +190 -38
  414. package/build/esm/cc/WakeUpCC.d.ts.map +1 -1
  415. package/build/esm/cc/WakeUpCC.js +0 -1
  416. package/build/esm/cc/WakeUpCC.js.map +1 -1
  417. package/build/esm/cc/WindowCoveringCC.d.ts +193 -103
  418. package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
  419. package/build/esm/cc/WindowCoveringCC.js +0 -5
  420. package/build/esm/cc/WindowCoveringCC.js.map +1 -1
  421. package/build/esm/cc/ZWavePlusCC.d.ts +311 -51
  422. package/build/esm/cc/ZWavePlusCC.d.ts.map +1 -1
  423. package/build/esm/cc/ZWavePlusCC.js +0 -1
  424. package/build/esm/cc/ZWavePlusCC.js.map +1 -1
  425. package/build/esm/cc/ZWaveProtocolCC.d.ts +28 -28
  426. package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
  427. package/build/esm/cc/ZWaveProtocolCC.js +0 -27
  428. package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
  429. package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts +4 -4
  430. package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts.map +1 -1
  431. package/build/esm/cc/manufacturerProprietary/FibaroCC.js +0 -3
  432. package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
  433. package/build/esm/index.d.ts +1 -0
  434. package/build/esm/index.d.ts.map +1 -1
  435. package/build/esm/index_browser.d.ts +9 -0
  436. package/build/esm/index_browser.d.ts.map +1 -1
  437. package/build/esm/index_browser.js +8 -1
  438. package/build/esm/index_browser.js.map +1 -1
  439. package/build/esm/lib/API.d.ts +7 -5
  440. package/build/esm/lib/API.d.ts.map +1 -1
  441. package/build/esm/lib/API.js +1 -1
  442. package/build/esm/lib/API.js.map +1 -1
  443. package/build/esm/lib/CommandClass.d.ts +10 -21
  444. package/build/esm/lib/CommandClass.d.ts.map +1 -1
  445. package/build/esm/lib/CommandClass.js +8 -101
  446. package/build/esm/lib/CommandClass.js.map +1 -1
  447. package/build/esm/lib/CommandClassDecorators.d.ts +1 -1
  448. package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -1
  449. package/build/esm/lib/CommandClassDecorators.js +1 -1
  450. package/build/esm/lib/CommandClassDecorators.js.map +1 -1
  451. package/build/esm/lib/Values.d.ts +2 -2
  452. package/build/esm/lib/Values.d.ts.map +1 -1
  453. package/build/esm/lib/Values.js.map +1 -1
  454. package/build/esm/lib/traits.d.ts +94 -0
  455. package/build/esm/lib/traits.d.ts.map +1 -0
  456. package/build/esm/lib/traits.js +2 -0
  457. package/build/esm/lib/traits.js.map +1 -0
  458. package/build/esm/lib/utils.d.ts +2 -2
  459. package/build/esm/lib/utils.d.ts.map +1 -1
  460. package/build/esm/lib/utils.js.map +1 -1
  461. package/package.json +13 -13
@@ -25,14 +25,14 @@ __export(CommandClass_exports, {
25
25
  getEffectiveCCVersion: () => getEffectiveCCVersion
26
26
  });
27
27
  module.exports = __toCommonJS(CommandClass_exports);
28
- var import_core = require("@zwave-js/core");
29
- var import_shared = require("@zwave-js/shared");
28
+ var import_safe = require("@zwave-js/core/safe");
29
+ var import_safe2 = require("@zwave-js/shared/safe");
30
30
  var import_typeguards = require("alcalzone-shared/typeguards");
31
31
  var import_CommandClassDecorators = require("./CommandClassDecorators.js");
32
32
  var import_EncapsulatingCommandClass = require("./EncapsulatingCommandClass.js");
33
33
  var import_Values = require("./Values.js");
34
34
  function getEffectiveCCVersion(ctx, cc, defaultVersion) {
35
- if (typeof cc.nodeId !== "number" || cc.nodeId === import_core.NODE_ID_BROADCAST || cc.nodeId === import_core.NODE_ID_BROADCAST_LR) {
35
+ if (typeof cc.nodeId !== "number" || cc.nodeId === import_safe.NODE_ID_BROADCAST || cc.nodeId === import_safe.NODE_ID_BROADCAST_LR) {
36
36
  return (0, import_CommandClassDecorators.getImplementedVersion)(cc.ccId);
37
37
  }
38
38
  return ctx.getSupportedCCVersion(cc.ccId, cc.nodeId, cc.endpointIndex) || (defaultVersion ?? (0, import_CommandClassDecorators.getImplementedVersion)(cc.ccId));
@@ -51,21 +51,21 @@ class CCRaw {
51
51
  this.payload = payload;
52
52
  }
53
53
  static parse(data) {
54
- const { ccId, bytesRead: ccIdLength } = (0, import_core.parseCCId)(data);
55
- if (ccId === import_core.CommandClasses["No Operation"]) {
56
- return new CCRaw(ccId, void 0, new import_shared.Bytes());
54
+ const { ccId, bytesRead: ccIdLength } = (0, import_safe.parseCCId)(data);
55
+ if (ccId === import_safe.CommandClasses["No Operation"]) {
56
+ return new CCRaw(ccId, void 0, new import_safe2.Bytes());
57
57
  }
58
58
  let ccCommand = data[ccIdLength];
59
- let payload = import_shared.Bytes.view(data.subarray(ccIdLength + 1));
60
- if (ccId === import_core.CommandClasses["Transport Service"]) {
61
- payload = import_shared.Bytes.concat([
62
- import_shared.Bytes.from([ccCommand & 7]),
59
+ let payload = import_safe2.Bytes.view(data.subarray(ccIdLength + 1));
60
+ if (ccId === import_safe.CommandClasses["Transport Service"]) {
61
+ payload = import_safe2.Bytes.concat([
62
+ import_safe2.Bytes.from([ccCommand & 7]),
63
63
  payload
64
64
  ]);
65
65
  ccCommand = ccCommand & 248;
66
- } else if (ccId === import_core.CommandClasses["Manufacturer Proprietary"]) {
67
- payload = import_shared.Bytes.concat([
68
- import_shared.Bytes.from([ccCommand]),
66
+ } else if (ccId === import_safe.CommandClasses["Manufacturer Proprietary"]) {
67
+ payload = import_safe2.Bytes.concat([
68
+ import_safe2.Bytes.from([ccCommand]),
69
69
  payload
70
70
  ]);
71
71
  ccCommand = void 0;
@@ -87,26 +87,25 @@ class CommandClass {
87
87
  this.endpointIndex = endpointIndex;
88
88
  this.ccId = ccId;
89
89
  this.ccCommand = ccCommand;
90
- this.payload = import_shared.Bytes.view(payload);
90
+ this.payload = import_safe2.Bytes.view(payload);
91
91
  }
92
- /** @deprecated Use {@link parseAsync} instead */
93
- static parse(data, ctx) {
92
+ static async parse(data, ctx) {
94
93
  const raw = CCRaw.parse(data);
95
94
  const CCConstructor = (0, import_CommandClassDecorators.getCCConstructor)(raw.ccId);
96
95
  if (!CCConstructor) {
97
- return CommandClass.from(raw, ctx);
96
+ return await CommandClass.from(raw, ctx);
98
97
  }
99
98
  let CommandConstructor;
100
99
  if (raw.ccCommand != void 0) {
101
100
  CommandConstructor = (0, import_CommandClassDecorators.getCCCommandConstructor)(raw.ccId, raw.ccCommand);
102
101
  }
103
102
  try {
104
- return (CommandConstructor ?? CCConstructor).from(raw, ctx);
103
+ return await (CommandConstructor ?? CCConstructor).from(raw, ctx);
105
104
  } catch (e) {
106
- if ((0, import_core.isZWaveError)(e) && e.code === import_core.ZWaveErrorCodes.PacketFormat_InvalidPayload) {
107
- const ccName = CommandConstructor?.name ?? `${(0, import_core.getCCName)(raw.ccId)} CC`;
105
+ if ((0, import_safe.isZWaveError)(e) && e.code === import_safe.ZWaveErrorCodes.PacketFormat_InvalidPayload) {
106
+ const ccName = CommandConstructor?.name ?? `${(0, import_safe.getCCName)(raw.ccId)} CC`;
108
107
  let reason;
109
- if (typeof e.context === "string" || typeof e.context === "number" && import_core.ZWaveErrorCodes[e.context] != void 0) {
108
+ if (typeof e.context === "string" || typeof e.context === "number" && import_safe.ZWaveErrorCodes[e.context] != void 0) {
110
109
  reason = e.context;
111
110
  }
112
111
  const ret = new InvalidCC({
@@ -121,38 +120,6 @@ class CommandClass {
121
120
  throw e;
122
121
  }
123
122
  }
124
- static async parseAsync(data, ctx) {
125
- const raw = CCRaw.parse(data);
126
- const CCConstructor = (0, import_CommandClassDecorators.getCCConstructor)(raw.ccId);
127
- if (!CCConstructor) {
128
- return CommandClass.fromAsync(raw, ctx);
129
- }
130
- let CommandConstructor;
131
- if (raw.ccCommand != void 0) {
132
- CommandConstructor = (0, import_CommandClassDecorators.getCCCommandConstructor)(raw.ccId, raw.ccCommand);
133
- }
134
- try {
135
- return await (CommandConstructor ?? CCConstructor).fromAsync(raw, ctx);
136
- } catch (e) {
137
- if ((0, import_core.isZWaveError)(e) && e.code === import_core.ZWaveErrorCodes.PacketFormat_InvalidPayload) {
138
- const ccName = CommandConstructor?.name ?? `${(0, import_core.getCCName)(raw.ccId)} CC`;
139
- let reason;
140
- if (typeof e.context === "string" || typeof e.context === "number" && import_core.ZWaveErrorCodes[e.context] != void 0) {
141
- reason = e.context;
142
- }
143
- const ret = new InvalidCC({
144
- nodeId: ctx.sourceNodeId,
145
- ccId: raw.ccId,
146
- ccCommand: raw.ccCommand,
147
- ccName,
148
- reason
149
- });
150
- return ret;
151
- }
152
- throw e;
153
- }
154
- }
155
- /** @deprecated Use {@link fromAsync} instead */
156
123
  static from(raw, ctx) {
157
124
  return new this({
158
125
  nodeId: ctx.sourceNodeId,
@@ -161,15 +128,11 @@ class CommandClass {
161
128
  payload: raw.payload
162
129
  });
163
130
  }
164
- // eslint-disable-next-line @typescript-eslint/require-await
165
- static async fromAsync(raw, ctx) {
166
- return this.from(raw, ctx);
167
- }
168
131
  /** This CC's identifier */
169
132
  ccId;
170
133
  ccCommand;
171
134
  get ccName() {
172
- return (0, import_core.getCCName)(this.ccId);
135
+ return (0, import_safe.getCCName)(this.ccId);
173
136
  }
174
137
  /** The ID of the target node(s) */
175
138
  nodeId;
@@ -181,7 +144,7 @@ class CommandClass {
181
144
  *
182
145
  * Don't use this directly, this is used internally.
183
146
  */
184
- encapsulationFlags = import_core.EncapsulationFlags.None;
147
+ encapsulationFlags = import_safe.EncapsulationFlags.None;
185
148
  /** Activates or deactivates the given encapsulation flag(s) */
186
149
  toggleEncapsulationFlag(flag, active) {
187
150
  if (active) {
@@ -216,18 +179,17 @@ class CommandClass {
216
179
  }
217
180
  /**
218
181
  * Serializes this CommandClass to be embedded in a message payload or another CC
219
- * @deprecated Use {@link serializeAsync} instead
220
182
  */
221
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
222
- serialize(ctx) {
223
- if (this.ccId === import_core.CommandClasses["No Operation"]) {
224
- return import_shared.Bytes.from([this.ccId]);
183
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
184
+ async serialize(ctx) {
185
+ if (this.ccId === import_safe.CommandClasses["No Operation"]) {
186
+ return import_safe2.Bytes.from([this.ccId]);
225
187
  } else if (this.ccCommand == void 0) {
226
- throw new import_core.ZWaveError("Cannot serialize a Command Class without a command", import_core.ZWaveErrorCodes.CC_Invalid);
188
+ throw new import_safe.ZWaveError("Cannot serialize a Command Class without a command", import_safe.ZWaveErrorCodes.CC_Invalid);
227
189
  }
228
190
  const payloadLength = this.payload.length;
229
191
  const ccIdLength = this.isExtended() ? 2 : 1;
230
- const data = new import_shared.Bytes(ccIdLength + 1 + payloadLength);
192
+ const data = new import_safe2.Bytes(ccIdLength + 1 + payloadLength);
231
193
  data.writeUIntBE(this.ccId, 0, ccIdLength);
232
194
  data[ccIdLength] = this.ccCommand;
233
195
  if (payloadLength > 0) {
@@ -235,17 +197,6 @@ class CommandClass {
235
197
  }
236
198
  return data;
237
199
  }
238
- /**
239
- * Serializes this CommandClass to be embedded in a message payload or another CC
240
- */
241
- // eslint-disable-next-line @typescript-eslint/require-await
242
- async serializeAsync(ctx) {
243
- if (this.serializeAsync !== CommandClass.prototype.serializeAsync) {
244
- return CommandClass.prototype.serialize.call(this, ctx);
245
- } else {
246
- return this.serialize(ctx);
247
- }
248
- }
249
200
  prepareRetransmission() {
250
201
  }
251
202
  /**
@@ -268,13 +219,13 @@ class CommandClass {
268
219
  let tag = this.constructor.name;
269
220
  const message = {};
270
221
  if (this.constructor === CommandClass) {
271
- tag = `${(0, import_shared.getEnumMemberName)(import_core.CommandClasses, this.ccId)} CC (not implemented)`;
222
+ tag = `${(0, import_safe2.getEnumMemberName)(import_safe.CommandClasses, this.ccId)} CC (not implemented)`;
272
223
  if (this.ccCommand != void 0) {
273
- message.command = (0, import_shared.num2hex)(this.ccCommand);
224
+ message.command = (0, import_safe2.num2hex)(this.ccCommand);
274
225
  }
275
226
  }
276
227
  if (this.payload.length > 0) {
277
- message.payload = (0, import_shared.buffer2hex)(this.payload);
228
+ message.payload = (0, import_safe2.buffer2hex)(this.payload);
278
229
  }
279
230
  return {
280
231
  tags: [tag],
@@ -288,18 +239,18 @@ class CommandClass {
288
239
  toJSONInternal() {
289
240
  const ret = {
290
241
  nodeId: this.nodeId,
291
- ccId: import_core.CommandClasses[this.ccId] || (0, import_shared.num2hex)(this.ccId)
242
+ ccId: import_safe.CommandClasses[this.ccId] || (0, import_safe2.num2hex)(this.ccId)
292
243
  };
293
244
  if (this.ccCommand != void 0) {
294
- ret.ccCommand = (0, import_shared.num2hex)(this.ccCommand);
245
+ ret.ccCommand = (0, import_safe2.num2hex)(this.ccCommand);
295
246
  }
296
247
  if (this.payload.length > 0) {
297
- ret.payload = (0, import_shared.buffer2hex)(this.payload);
248
+ ret.payload = (0, import_safe2.buffer2hex)(this.payload);
298
249
  }
299
250
  return ret;
300
251
  }
301
252
  throwMissingCriticalInterviewResponse() {
302
- throw new import_core.ZWaveError(`The node did not respond to a critical interview query in time.`, import_core.ZWaveErrorCodes.Controller_NodeTimeout);
253
+ throw new import_safe.ZWaveError(`The node did not respond to a critical interview query in time.`, import_safe.ZWaveErrorCodes.Controller_NodeTimeout);
303
254
  }
304
255
  /**
305
256
  * Performs the interview procedure for this CC according to SDS14223
@@ -320,7 +271,7 @@ class CommandClass {
320
271
  }
321
272
  /** Determines which CC interviews must be performed before this CC can be interviewed */
322
273
  determineRequiredCCInterviews() {
323
- return [import_core.CommandClasses.Version];
274
+ return [import_safe.CommandClasses.Version];
324
275
  }
325
276
  /**
326
277
  * Whether the endpoint interview may be skipped by a CC. Can be overwritten by a subclass.
@@ -338,7 +289,7 @@ class CommandClass {
338
289
  isSinglecast() {
339
290
  return (
340
291
  // received
341
- this.frameType === "singlecast" || this.frameType == void 0 && typeof this.nodeId === "number" && this.nodeId !== import_core.NODE_ID_BROADCAST && this.nodeId !== import_core.NODE_ID_BROADCAST_LR
292
+ this.frameType === "singlecast" || this.frameType == void 0 && typeof this.nodeId === "number" && this.nodeId !== import_safe.NODE_ID_BROADCAST && this.nodeId !== import_safe.NODE_ID_BROADCAST_LR
342
293
  );
343
294
  }
344
295
  isMulticast() {
@@ -350,7 +301,7 @@ class CommandClass {
350
301
  isBroadcast() {
351
302
  return (
352
303
  // received
353
- this.frameType === "broadcast" || this.frameType == void 0 && (this.nodeId === import_core.NODE_ID_BROADCAST || this.nodeId === import_core.NODE_ID_BROADCAST_LR)
304
+ this.frameType === "broadcast" || this.frameType == void 0 && (this.nodeId === import_safe.NODE_ID_BROADCAST || this.nodeId === import_safe.NODE_ID_BROADCAST_LR)
354
305
  );
355
306
  }
356
307
  /**
@@ -369,7 +320,7 @@ class CommandClass {
369
320
  try {
370
321
  return this.getNode(ctx);
371
322
  } catch (e) {
372
- if ((0, import_core.isZWaveError)(e) && e.code === import_core.ZWaveErrorCodes.Driver_NotReady) {
323
+ if ((0, import_safe.isZWaveError)(e) && e.code === import_safe.ZWaveErrorCodes.Driver_NotReady) {
373
324
  return void 0;
374
325
  }
375
326
  throw e;
@@ -384,10 +335,10 @@ class CommandClass {
384
335
  try {
385
336
  return ctx.getValueDB(this.nodeId);
386
337
  } catch {
387
- throw new import_core.ZWaveError("The node for this CC does not exist or the driver is not ready yet", import_core.ZWaveErrorCodes.Driver_NotReady);
338
+ throw new import_safe.ZWaveError("The node for this CC does not exist or the driver is not ready yet", import_safe.ZWaveErrorCodes.Driver_NotReady);
388
339
  }
389
340
  }
390
- throw new import_core.ZWaveError("Cannot retrieve the value DB for non-singlecast CCs", import_core.ZWaveErrorCodes.CC_NoNodeID);
341
+ throw new import_safe.ZWaveError("Cannot retrieve the value DB for non-singlecast CCs", import_safe.ZWaveErrorCodes.CC_NoNodeID);
391
342
  }
392
343
  /**
393
344
  * Ensures that the metadata for the given CC value exists in the Value DB or creates it if it does not.
@@ -502,7 +453,7 @@ class CommandClass {
502
453
  property,
503
454
  propertyKey
504
455
  };
505
- const dbKey = (0, import_core.valueIdToString)(valueId);
456
+ const dbKey = (0, import_safe.valueIdToString)(valueId);
506
457
  if (!ret.has(dbKey))
507
458
  ret.set(dbKey, valueId);
508
459
  }, "addValueId");
@@ -511,7 +462,7 @@ class CommandClass {
511
462
  ...valueDB.getValues(this.ccId),
512
463
  ...valueDB.getAllMetadata(this.ccId)
513
464
  ];
514
- const supportedVersion = typeof this.nodeId === "number" && this.nodeId !== import_core.NODE_ID_BROADCAST && this.nodeId !== import_core.NODE_ID_BROADCAST_LR ? ctx.getSupportedCCVersion(this.ccId, this.nodeId, this.endpointIndex) : (0, import_CommandClassDecorators.getImplementedVersion)(this.ccId);
465
+ const supportedVersion = typeof this.nodeId === "number" && this.nodeId !== import_safe.NODE_ID_BROADCAST && this.nodeId !== import_safe.NODE_ID_BROADCAST_LR ? ctx.getSupportedCCVersion(this.ccId, this.nodeId, this.endpointIndex) : (0, import_CommandClassDecorators.getImplementedVersion)(this.ccId);
515
466
  for (const value of Object.values((0, import_CommandClassDecorators.getCCValues)(this) ?? {})) {
516
467
  if (!value || typeof value === "function")
517
468
  continue;
@@ -605,43 +556,37 @@ class CommandClass {
605
556
  expectMoreMessages(_session) {
606
557
  return false;
607
558
  }
608
- /**
609
- * Include previously received partial responses into a final CC
610
- * @deprecated Use {@link mergePartialCCsAsync} instead
611
- */
612
- mergePartialCCs(_partials, _ctx) {
613
- }
614
559
  /** Include previously received partial responses into a final CC */
615
- async mergePartialCCsAsync(_partials, _ctx) {
560
+ async mergePartialCCs(_partials, _ctx) {
616
561
  }
617
562
  /** Tests whether this CC expects at least one command in return */
618
563
  expectsCCResponse() {
619
564
  let expected = (0, import_CommandClassDecorators.getExpectedCCResponse)(this);
620
- if (typeof expected === "function" && !(0, import_shared.staticExtends)(expected, CommandClass)) {
565
+ if (typeof expected === "function" && !(0, import_safe2.staticExtends)(expected, CommandClass)) {
621
566
  expected = expected(this);
622
567
  }
623
568
  if (expected === void 0)
624
569
  return false;
625
570
  if ((0, import_typeguards.isArray)(expected)) {
626
- return expected.every((cc) => (0, import_shared.staticExtends)(cc, CommandClass));
571
+ return expected.every((cc) => (0, import_safe2.staticExtends)(cc, CommandClass));
627
572
  } else {
628
- return (0, import_shared.staticExtends)(expected, CommandClass);
573
+ return (0, import_safe2.staticExtends)(expected, CommandClass);
629
574
  }
630
575
  }
631
576
  isExpectedCCResponse(received) {
632
577
  if (received.nodeId !== this.nodeId)
633
578
  return false;
634
579
  let expected = (0, import_CommandClassDecorators.getExpectedCCResponse)(this);
635
- if (typeof expected === "function" && !(0, import_shared.staticExtends)(expected, CommandClass)) {
580
+ if (typeof expected === "function" && !(0, import_safe2.staticExtends)(expected, CommandClass)) {
636
581
  expected = expected(this);
637
582
  }
638
583
  if (expected == void 0) {
639
584
  return false;
640
- } else if ((0, import_typeguards.isArray)(expected) && expected.every((cc) => (0, import_shared.staticExtends)(cc, CommandClass))) {
585
+ } else if ((0, import_typeguards.isArray)(expected) && expected.every((cc) => (0, import_safe2.staticExtends)(cc, CommandClass))) {
641
586
  if (expected.every((base) => !(received instanceof base))) {
642
587
  return false;
643
588
  }
644
- } else if ((0, import_shared.staticExtends)(expected, CommandClass)) {
589
+ } else if ((0, import_safe2.staticExtends)(expected, CommandClass)) {
645
590
  if (!(received instanceof expected))
646
591
  return false;
647
592
  }
@@ -743,7 +688,7 @@ class InvalidCC extends CommandClass {
743
688
  return {
744
689
  tags: [this.ccName, "INVALID"],
745
690
  message: this.reason != void 0 ? {
746
- error: typeof this.reason === "string" ? this.reason : (0, import_shared.getEnumMemberName)(import_core.ZWaveErrorCodes, this.reason)
691
+ error: typeof this.reason === "string" ? this.reason : (0, import_safe2.getEnumMemberName)(import_safe.ZWaveErrorCodes, this.reason)
747
692
  } : void 0
748
693
  };
749
694
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/CommandClass.ts"],
4
- "sourcesContent": ["import {\n\ttype BroadcastCC,\n\ttype CCAddress,\n\ttype CCId,\n\tCommandClasses,\n\ttype ControlsCC,\n\tEncapsulationFlags,\n\ttype EndpointId,\n\ttype FrameType,\n\ttype GetAllEndpoints,\n\ttype GetCCs,\n\ttype GetEndpoint,\n\ttype ListenBehavior,\n\ttype MessageOrCCLogEntry,\n\ttype MessageRecord,\n\ttype ModifyCCs,\n\ttype MulticastCC,\n\ttype MulticastDestination,\n\tNODE_ID_BROADCAST,\n\tNODE_ID_BROADCAST_LR,\n\ttype NodeId,\n\ttype QueryNodeStatus,\n\ttype QuerySecurityClasses,\n\ttype SetSecurityClass,\n\ttype SinglecastCC,\n\ttype SupportsCC,\n\ttype ValueDB,\n\ttype ValueID,\n\ttype ValueMetadata,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tgetCCName,\n\tisZWaveError,\n\tparseCCId,\n\tvalueIdToString,\n} from \"@zwave-js/core\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetDeviceConfig,\n\tGetInterviewOptions,\n\tGetNode,\n\tGetSupportedCCVersion,\n\tGetValueDB,\n\tHostIDs,\n\tLogNode,\n\tLookupManufacturer,\n} from \"@zwave-js/host\";\nimport {\n\tBytes,\n\ttype JSONObject,\n\tbuffer2hex,\n\tgetEnumMemberName,\n\tnum2hex,\n\tstaticExtends,\n} from \"@zwave-js/shared\";\nimport { isArray } from \"alcalzone-shared/typeguards\";\nimport type { CCAPIHost, CCAPINode, ValueIDProperties } from \"./API.js\";\nimport {\n\tgetCCCommand,\n\tgetCCCommandConstructor,\n\tgetCCConstructor,\n\tgetCCResponsePredicate,\n\tgetCCValueProperties,\n\tgetCCValues,\n\tgetCommandClass,\n\tgetExpectedCCResponse,\n\tgetImplementedVersion,\n} from \"./CommandClassDecorators.js\";\nimport {\n\ttype EncapsulatingCommandClass,\n\tisEncapsulatingCommandClass,\n\tisMultiEncapsulatingCommandClass,\n} from \"./EncapsulatingCommandClass.js\";\nimport {\n\ttype CCValue,\n\ttype DynamicCCValue,\n\ttype StaticCCValue,\n\tdefaultCCValueOptions,\n} from \"./Values.js\";\n\nexport interface CommandClassOptions extends CCAddress {\n\tccId?: number; // Used to overwrite the declared CC ID\n\tccCommand?: number; // undefined = NoOp\n\tpayload?: Uint8Array;\n}\n\n// Defines the necessary traits an endpoint passed to a CC instance must have\nexport type CCEndpoint =\n\t& EndpointId\n\t& SupportsCC\n\t& ControlsCC\n\t& GetCCs\n\t& ModifyCCs;\n\n// Defines the necessary traits a node passed to a CC instance must have\nexport type CCNode =\n\t& NodeId\n\t& SupportsCC\n\t& ControlsCC\n\t& GetCCs\n\t& GetEndpoint<CCEndpoint>\n\t& GetAllEndpoints<CCEndpoint>\n\t& QuerySecurityClasses\n\t& SetSecurityClass\n\t& ListenBehavior\n\t& QueryNodeStatus;\n\nexport type InterviewContext =\n\t& CCAPIHost<\n\t\t& CCAPINode\n\t\t& GetCCs\n\t\t& SupportsCC\n\t\t& ControlsCC\n\t\t& QuerySecurityClasses\n\t\t& SetSecurityClass\n\t\t& GetEndpoint<EndpointId & GetCCs & SupportsCC & ControlsCC & ModifyCCs>\n\t\t& GetAllEndpoints<EndpointId & SupportsCC & ControlsCC>\n\t>\n\t& GetInterviewOptions\n\t& LookupManufacturer;\n\nexport type RefreshValuesContext = CCAPIHost<\n\tCCAPINode & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n>;\n\nexport type PersistValuesContext =\n\t& HostIDs\n\t& GetValueDB\n\t& GetSupportedCCVersion\n\t& GetDeviceConfig\n\t& GetNode<\n\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t>\n\t& LogNode;\n\nexport function getEffectiveCCVersion(\n\tctx: GetSupportedCCVersion,\n\tcc: CCId,\n\tdefaultVersion?: number,\n): number {\n\t// For multicast and broadcast CCs, just use the highest implemented version to serialize\n\t// Older nodes will ignore the additional fields\n\tif (\n\t\ttypeof cc.nodeId !== \"number\"\n\t\t|| cc.nodeId === NODE_ID_BROADCAST\n\t\t|| cc.nodeId === NODE_ID_BROADCAST_LR\n\t) {\n\t\treturn getImplementedVersion(cc.ccId);\n\t}\n\t// For singlecast CCs, set the CC version as high as possible\n\treturn ctx.getSupportedCCVersion(cc.ccId, cc.nodeId, cc.endpointIndex)\n\t\t|| (defaultVersion ?? getImplementedVersion(cc.ccId));\n}\n\nexport class CCRaw {\n\tpublic constructor(\n\t\tpublic ccId: CommandClasses,\n\t\tpublic ccCommand: number | undefined,\n\t\tpublic payload: Bytes,\n\t) {}\n\n\tpublic static parse(data: Uint8Array): CCRaw {\n\t\tconst { ccId, bytesRead: ccIdLength } = parseCCId(data);\n\t\t// There are so few exceptions that we can handle them here manually\n\t\tif (ccId === CommandClasses[\"No Operation\"]) {\n\t\t\treturn new CCRaw(ccId, undefined, new Bytes());\n\t\t}\n\t\tlet ccCommand: number | undefined = data[ccIdLength];\n\t\tlet payload = Bytes.view(data.subarray(ccIdLength + 1));\n\t\tif (ccId === CommandClasses[\"Transport Service\"]) {\n\t\t\t// Transport Service only uses the higher 5 bits for the command\n\t\t\t// and re-uses the lower 3 bits of the ccCommand as payload\n\t\t\tpayload = Bytes.concat([\n\t\t\t\tBytes.from([ccCommand & 0b111]),\n\t\t\t\tpayload,\n\t\t\t]);\n\t\t\tccCommand = ccCommand & 0b11111_000;\n\t\t} else if (ccId === CommandClasses[\"Manufacturer Proprietary\"]) {\n\t\t\t// ManufacturerProprietaryCC has no CC command, so the first\n\t\t\t// payload byte is stored in ccCommand.\n\t\t\tpayload = Bytes.concat([\n\t\t\t\tBytes.from([ccCommand]),\n\t\t\t\tpayload,\n\t\t\t]);\n\t\t\tccCommand = undefined;\n\t\t}\n\n\t\treturn new CCRaw(ccId, ccCommand, payload);\n\t}\n\n\tpublic withPayload(payload: Bytes): CCRaw {\n\t\treturn new CCRaw(this.ccId, this.ccCommand, payload);\n\t}\n}\n\n// @publicAPI\nexport class CommandClass implements CCId {\n\t// empty constructor to parse messages\n\tpublic constructor(options: CommandClassOptions) {\n\t\tconst {\n\t\t\tnodeId,\n\t\t\tendpointIndex = 0,\n\t\t\tccId = getCommandClass(this),\n\t\t\tccCommand = getCCCommand(this),\n\t\t\tpayload = new Uint8Array(),\n\t\t} = options;\n\n\t\tthis.nodeId = nodeId;\n\t\tthis.endpointIndex = endpointIndex;\n\t\tthis.ccId = ccId;\n\t\tthis.ccCommand = ccCommand;\n\t\tthis.payload = Bytes.view(payload);\n\t}\n\n\t/** @deprecated Use {@link parseAsync} instead */\n\tpublic static parse(\n\t\tdata: Uint8Array,\n\t\tctx: CCParsingContext,\n\t): CommandClass {\n\t\tconst raw = CCRaw.parse(data);\n\n\t\t// Find the correct subclass constructor to invoke\n\t\tconst CCConstructor = getCCConstructor(raw.ccId);\n\t\tif (!CCConstructor) {\n\t\t\t// None -> fall back to the default constructor\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\treturn CommandClass.from(raw, ctx);\n\t\t}\n\n\t\tlet CommandConstructor: CCConstructor<CommandClass> | undefined;\n\t\tif (raw.ccCommand != undefined) {\n\t\t\tCommandConstructor = getCCCommandConstructor(\n\t\t\t\traw.ccId,\n\t\t\t\traw.ccCommand,\n\t\t\t);\n\t\t}\n\t\t// Not every CC has a constructor for its commands. In that case,\n\t\t// call the CC constructor directly\n\t\ttry {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\treturn (CommandConstructor ?? CCConstructor).from(raw, ctx);\n\t\t} catch (e) {\n\t\t\t// Indicate invalid payloads with a special CC type\n\t\t\tif (\n\t\t\t\tisZWaveError(e)\n\t\t\t\t&& e.code === ZWaveErrorCodes.PacketFormat_InvalidPayload\n\t\t\t) {\n\t\t\t\tconst ccName = CommandConstructor?.name\n\t\t\t\t\t?? `${getCCName(raw.ccId)} CC`;\n\n\t\t\t\t// Preserve why the command was invalid\n\t\t\t\tlet reason: string | ZWaveErrorCodes | undefined;\n\t\t\t\tif (\n\t\t\t\t\ttypeof e.context === \"string\"\n\t\t\t\t\t|| (typeof e.context === \"number\"\n\t\t\t\t\t\t&& ZWaveErrorCodes[e.context] != undefined)\n\t\t\t\t) {\n\t\t\t\t\treason = e.context;\n\t\t\t\t}\n\n\t\t\t\tconst ret = new InvalidCC({\n\t\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\t\tccId: raw.ccId,\n\t\t\t\t\tccCommand: raw.ccCommand,\n\t\t\t\t\tccName,\n\t\t\t\t\treason,\n\t\t\t\t});\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tpublic static async parseAsync(\n\t\tdata: Uint8Array,\n\t\tctx: CCParsingContext,\n\t): Promise<CommandClass> {\n\t\tconst raw = CCRaw.parse(data);\n\n\t\t// Find the correct subclass constructor to invoke\n\t\tconst CCConstructor = getCCConstructor(raw.ccId);\n\t\tif (!CCConstructor) {\n\t\t\t// None -> fall back to the default constructor\n\t\t\treturn CommandClass.fromAsync(raw, ctx);\n\t\t}\n\n\t\tlet CommandConstructor: CCConstructor<CommandClass> | undefined;\n\t\tif (raw.ccCommand != undefined) {\n\t\t\tCommandConstructor = getCCCommandConstructor(\n\t\t\t\traw.ccId,\n\t\t\t\traw.ccCommand,\n\t\t\t);\n\t\t}\n\t\t// Not every CC has a constructor for its commands. In that case,\n\t\t// call the CC constructor directly\n\t\ttry {\n\t\t\treturn await (CommandConstructor ?? CCConstructor).fromAsync(\n\t\t\t\traw,\n\t\t\t\tctx,\n\t\t\t);\n\t\t} catch (e) {\n\t\t\t// Indicate invalid payloads with a special CC type\n\t\t\tif (\n\t\t\t\tisZWaveError(e)\n\t\t\t\t&& e.code === ZWaveErrorCodes.PacketFormat_InvalidPayload\n\t\t\t) {\n\t\t\t\tconst ccName = CommandConstructor?.name\n\t\t\t\t\t?? `${getCCName(raw.ccId)} CC`;\n\n\t\t\t\t// Preserve why the command was invalid\n\t\t\t\tlet reason: string | ZWaveErrorCodes | undefined;\n\t\t\t\tif (\n\t\t\t\t\ttypeof e.context === \"string\"\n\t\t\t\t\t|| (typeof e.context === \"number\"\n\t\t\t\t\t\t&& ZWaveErrorCodes[e.context] != undefined)\n\t\t\t\t) {\n\t\t\t\t\treason = e.context;\n\t\t\t\t}\n\n\t\t\t\tconst ret = new InvalidCC({\n\t\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\t\tccId: raw.ccId,\n\t\t\t\t\tccCommand: raw.ccCommand,\n\t\t\t\t\tccName,\n\t\t\t\t\treason,\n\t\t\t\t});\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t/** @deprecated Use {@link fromAsync} instead */\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): CommandClass {\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tccId: raw.ccId,\n\t\t\tccCommand: raw.ccCommand,\n\t\t\tpayload: raw.payload,\n\t\t});\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tpublic static async fromAsync(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): Promise<CommandClass> {\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn this.from(raw, ctx);\n\n\t\t// TODO: Plan for next major release:\n\t\t// - CommandClass ONLY exposes `public static async from` (renamed!)\n\t\t// - CommandClass internally implements `protected static fromSync` and `protected static async fromAsync`\n\t\t// - The default implementation of `fromAsync` just calls `fromSync`\n\t\t// - Sub-classes override either `fromSync` OR `fromAsync` as needed\n\t}\n\n\t/** This CC's identifier */\n\tpublic ccId!: CommandClasses;\n\tpublic ccCommand?: number;\n\tpublic get ccName(): string {\n\t\treturn getCCName(this.ccId);\n\t}\n\n\t/** The ID of the target node(s) */\n\tpublic nodeId!: number | MulticastDestination;\n\n\tpublic payload: Bytes;\n\n\t/** Which endpoint of the node this CC belongs to. 0 for the root device. */\n\tpublic endpointIndex: number;\n\n\t/**\n\t * Which encapsulation CCs this CC is/was/should be encapsulated with.\n\t *\n\t * Don't use this directly, this is used internally.\n\t */\n\tpublic encapsulationFlags: EncapsulationFlags = EncapsulationFlags.None;\n\n\t/** Activates or deactivates the given encapsulation flag(s) */\n\tpublic toggleEncapsulationFlag(\n\t\tflag: EncapsulationFlags,\n\t\tactive: boolean,\n\t): void {\n\t\tif (active) {\n\t\t\tthis.encapsulationFlags |= flag;\n\t\t} else {\n\t\t\tthis.encapsulationFlags &= ~flag;\n\t\t}\n\t}\n\n\t/** Contains a reference to the encapsulating CC if this CC is encapsulated */\n\tpublic encapsulatingCC?: EncapsulatingCommandClass;\n\n\t/** The type of Z-Wave frame this CC was sent with */\n\tpublic readonly frameType?: FrameType;\n\n\t/** Returns true if this CC is an extended CC (0xF100..0xFFFF) */\n\tpublic isExtended(): boolean {\n\t\treturn this.ccId >= 0xf100;\n\t}\n\n\t/** Whether the interview for this CC was previously completed */\n\tpublic isInterviewComplete(host: GetValueDB): boolean {\n\t\treturn !!this.getValueDB(host).getValue<boolean>({\n\t\t\tcommandClass: this.ccId,\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tproperty: \"interviewComplete\",\n\t\t});\n\t}\n\n\t/** Marks the interview for this CC as complete or not */\n\tpublic setInterviewComplete(\n\t\thost: GetValueDB,\n\t\tcomplete: boolean,\n\t): void {\n\t\tthis.getValueDB(host).setValue(\n\t\t\t{\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tproperty: \"interviewComplete\",\n\t\t\t},\n\t\t\tcomplete,\n\t\t);\n\t}\n\n\t/**\n\t * Serializes this CommandClass to be embedded in a message payload or another CC\n\t * @deprecated Use {@link serializeAsync} instead\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\t// NoOp CCs have no command and no payload\n\t\tif (this.ccId === CommandClasses[\"No Operation\"]) {\n\t\t\treturn Bytes.from([this.ccId]);\n\t\t} else if (this.ccCommand == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot serialize a Command Class without a command\",\n\t\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t\t);\n\t\t}\n\n\t\tconst payloadLength = this.payload.length;\n\t\tconst ccIdLength = this.isExtended() ? 2 : 1;\n\t\tconst data = new Bytes(ccIdLength + 1 + payloadLength);\n\t\tdata.writeUIntBE(this.ccId, 0, ccIdLength);\n\t\tdata[ccIdLength] = this.ccCommand;\n\t\tif (payloadLength > 0 /* implies payload != undefined */) {\n\t\t\tdata.set(this.payload, 1 + ccIdLength);\n\t\t}\n\t\treturn data;\n\t}\n\n\t/**\n\t * Serializes this CommandClass to be embedded in a message payload or another CC\n\t */\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tpublic async serializeAsync(ctx: CCEncodingContext): Promise<Bytes> {\n\t\t// This call is for backwards compatibility purposes. Not all\n\t\t// CC subclasses implement serializeAsync, so those need to internally\n\t\t// call serialize()\n\t\t// For those that do, we MUST not call the subclass' serialize method\n\t\t// directly, or the side effects may run twice.\n\t\tif (this.serializeAsync !== CommandClass.prototype.serializeAsync) {\n\t\t\t// Subclass implements serializeAsync, and we've reached the top\n\t\t\t// of the inheritance chain. Call CommandClass.serialize to finish.\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\treturn CommandClass.prototype.serialize.call(this, ctx);\n\t\t} else {\n\t\t\t// Subclass does not implement serializeAsync, call its\n\t\t\t// serialize method instead\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\t\treturn this.serialize(ctx);\n\t\t}\n\n\t\t// TODO: Plan for next major release:\n\t\t// - CommandClass ONLY exposes `public async serialize` (renamed!)\n\t\t// - CommandClass internally implements `protected serializeSync` and `protected async serializeAsync`\n\t\t// - The default implementation of `serializeAsync` just calls `serializeSync`\n\t\t// - Sub-classes override either `serializeSync` OR `serializeAsync` as needed\n\t}\n\n\tpublic prepareRetransmission(): void {\n\t\t// Do nothing by default\n\t}\n\n\t/**\n\t * Create an instance of the given CC without checking whether it is supported.\n\t * If the CC is implemented, this returns an instance of the given CC which is linked to the given endpoint.\n\t *\n\t * **INTERNAL:** Applications should not use this directly.\n\t */\n\tpublic static createInstanceUnchecked<T extends CommandClass>(\n\t\tendpoint: EndpointId,\n\t\tcc: CommandClasses | CCConstructor<T>,\n\t): T | undefined {\n\t\tconst Constructor = typeof cc === \"number\" ? getCCConstructor(cc) : cc;\n\t\tif (Constructor) {\n\t\t\treturn new Constructor({\n\t\t\t\tnodeId: endpoint.nodeId,\n\t\t\t\tendpointIndex: endpoint.index,\n\t\t\t}) as T;\n\t\t}\n\t}\n\n\t/** Generates a representation of this CC for the log */\n\tpublic toLogEntry(_ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tlet tag = this.constructor.name;\n\t\tconst message: MessageRecord = {};\n\t\tif (this.constructor === CommandClass) {\n\t\t\ttag = `${\n\t\t\t\tgetEnumMemberName(\n\t\t\t\t\tCommandClasses,\n\t\t\t\t\tthis.ccId,\n\t\t\t\t)\n\t\t\t} CC (not implemented)`;\n\t\t\tif (this.ccCommand != undefined) {\n\t\t\t\tmessage.command = num2hex(this.ccCommand);\n\t\t\t}\n\t\t}\n\t\tif (this.payload.length > 0) {\n\t\t\tmessage.payload = buffer2hex(this.payload);\n\t\t}\n\t\treturn {\n\t\t\ttags: [tag],\n\t\t\tmessage,\n\t\t};\n\t}\n\n\t/** Generates the JSON representation of this CC */\n\tpublic toJSON(): JSONObject {\n\t\treturn this.toJSONInternal();\n\t}\n\n\tprivate toJSONInternal(): JSONObject {\n\t\tconst ret: JSONObject = {\n\t\t\tnodeId: this.nodeId,\n\t\t\tccId: CommandClasses[this.ccId] || num2hex(this.ccId),\n\t\t};\n\t\tif (this.ccCommand != undefined) {\n\t\t\tret.ccCommand = num2hex(this.ccCommand);\n\t\t}\n\t\tif (this.payload.length > 0) {\n\t\t\tret.payload = buffer2hex(this.payload);\n\t\t}\n\t\treturn ret;\n\t}\n\n\tprotected throwMissingCriticalInterviewResponse(): never {\n\t\tthrow new ZWaveError(\n\t\t\t`The node did not respond to a critical interview query in time.`,\n\t\t\tZWaveErrorCodes.Controller_NodeTimeout,\n\t\t);\n\t}\n\n\t/**\n\t * Performs the interview procedure for this CC according to SDS14223\n\t */\n\tpublic async interview(_ctx: InterviewContext): Promise<void> {\n\t\t// This needs to be overwritten per command class. In the default implementation, don't do anything\n\t}\n\n\t/**\n\t * Refreshes all dynamic values of this CC\n\t */\n\tpublic async refreshValues(_ctx: RefreshValuesContext): Promise<void> {\n\t\t// This needs to be overwritten per command class. In the default implementation, don't do anything\n\t}\n\n\t/**\n\t * Checks if the CC values need to be manually refreshed.\n\t * This should be called regularly and when sleeping nodes wake up\n\t */\n\tpublic shouldRefreshValues(\n\t\tthis: SinglecastCC<this>,\n\t\t_ctx:\n\t\t\t& GetValueDB\n\t\t\t& GetSupportedCCVersion\n\t\t\t& GetDeviceConfig\n\t\t\t& GetNode<\n\t\t\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t\t\t>,\n\t): boolean {\n\t\t// This needs to be overwritten per command class.\n\t\t// In the default implementation, don't require a refresh\n\t\treturn false;\n\t}\n\n\t/** Determines which CC interviews must be performed before this CC can be interviewed */\n\tpublic determineRequiredCCInterviews(): readonly CommandClasses[] {\n\t\t// By default, all CCs require the VersionCC interview\n\n\t\t// There are two exceptions to this rule:\n\t\t// * ManufacturerSpecific must be interviewed first\n\t\t// * VersionCC itself must be done after that\n\t\t// These exceptions are defined in the overrides of this method of each corresponding CC\n\n\t\treturn [CommandClasses.Version];\n\t}\n\n\t/**\n\t * Whether the endpoint interview may be skipped by a CC. Can be overwritten by a subclass.\n\t */\n\tpublic skipEndpointInterview(): boolean {\n\t\t// By default no interview may be skipped\n\t\treturn false;\n\t}\n\n\t/**\n\t * Maps a BasicCC value to a more specific CC implementation. Returns true if the value was mapped, false otherwise.\n\t * @param _value The value of the received BasicCC\n\t */\n\tpublic setMappedBasicValue(\n\t\t_ctx: GetValueDB,\n\t\t_value: number,\n\t): boolean {\n\t\t// By default, don't map\n\t\treturn false;\n\t}\n\n\tpublic isSinglecast(): this is SinglecastCC<this> {\n\t\treturn (\n\t\t\t// received\n\t\t\tthis.frameType === \"singlecast\"\n\t\t\t// transmitted\n\t\t\t|| (this.frameType == undefined\n\t\t\t\t&& typeof this.nodeId === \"number\"\n\t\t\t\t&& this.nodeId !== NODE_ID_BROADCAST\n\t\t\t\t&& this.nodeId !== NODE_ID_BROADCAST_LR)\n\t\t);\n\t}\n\n\tpublic isMulticast(): this is MulticastCC<this> {\n\t\treturn (\n\t\t\t// received\n\t\t\tthis.frameType === \"multicast\"\n\t\t\t// transmitted\n\t\t\t|| (this.frameType == undefined && isArray(this.nodeId))\n\t\t);\n\t}\n\n\tpublic isBroadcast(): this is BroadcastCC<this> {\n\t\treturn (\n\t\t\t// received\n\t\t\tthis.frameType === \"broadcast\"\n\t\t\t// transmitted\n\t\t\t|| (this.frameType == undefined\n\t\t\t\t&& (this.nodeId === NODE_ID_BROADCAST\n\t\t\t\t\t|| this.nodeId === NODE_ID_BROADCAST_LR))\n\t\t);\n\t}\n\n\t/**\n\t * Returns the node this CC is linked to. Throws if the controller is not yet ready.\n\t */\n\tpublic getNode<T extends NodeId>(\n\t\tctx: GetNode<T>,\n\t): T | undefined {\n\t\tif (this.isSinglecast()) {\n\t\t\treturn ctx.getNode(this.nodeId);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Returns the node this CC is linked to (or undefined if the node doesn't exist)\n\t */\n\tpublic tryGetNode<T extends NodeId>(\n\t\tctx: GetNode<T>,\n\t): T | undefined {\n\t\ttry {\n\t\t\treturn this.getNode(ctx);\n\t\t} catch (e) {\n\t\t\t// This was expected\n\t\t\tif (isZWaveError(e) && e.code === ZWaveErrorCodes.Driver_NotReady) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\t// Something else happened\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tpublic getEndpoint<T extends EndpointId>(\n\t\tctx: GetNode<NodeId & GetEndpoint<T>>,\n\t): T | undefined {\n\t\treturn this.getNode(ctx)?.getEndpoint(this.endpointIndex);\n\t}\n\n\t/** Returns the value DB for this CC's node */\n\tprotected getValueDB(ctx: GetValueDB): ValueDB {\n\t\tif (this.isSinglecast()) {\n\t\t\ttry {\n\t\t\t\treturn ctx.getValueDB(this.nodeId);\n\t\t\t} catch {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\"The node for this CC does not exist or the driver is not ready yet\",\n\t\t\t\t\tZWaveErrorCodes.Driver_NotReady,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot retrieve the value DB for non-singlecast CCs\",\n\t\t\tZWaveErrorCodes.CC_NoNodeID,\n\t\t);\n\t}\n\n\t/**\n\t * Ensures that the metadata for the given CC value exists in the Value DB or creates it if it does not.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t * @param meta Will be used in place of the predefined metadata when given\n\t */\n\tprotected ensureMetadata(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t\tmeta?: ValueMetadata,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tif (!valueDB.hasMetadata(valueId)) {\n\t\t\tvalueDB.setMetadata(valueId, meta ?? ccValue.meta);\n\t\t}\n\t}\n\n\t/**\n\t * Removes the metadata for the given CC value from the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected removeMetadata(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tvalueDB.setMetadata(valueId, undefined);\n\t}\n\n\t/**\n\t * Writes the metadata for the given CC value into the Value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t * @param meta Will be used in place of the predefined metadata when given\n\t */\n\tprotected setMetadata(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t\tmeta?: ValueMetadata,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tvalueDB.setMetadata(valueId, meta ?? ccValue.meta);\n\t}\n\n\t/**\n\t * Reads the metadata for the given CC value from the Value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected getMetadata<T extends ValueMetadata>(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): T | undefined {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\treturn valueDB.getMetadata(valueId) as any;\n\t}\n\n\t/**\n\t * Stores the given value under the value ID for the given CC value in the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected setValue(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t\tvalue: unknown,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tvalueDB.setValue(valueId, value);\n\t}\n\n\t/**\n\t * Removes the value for the given CC value from the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected removeValue(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tvalueDB.removeValue(valueId);\n\t}\n\n\t/**\n\t * Reads the value stored for the value ID of the given CC value from the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected getValue<T>(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): T | undefined {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\treturn valueDB.getValue(valueId);\n\t}\n\n\t/**\n\t * Reads when the value stored for the value ID of the given CC value was last updated in the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected getValueTimestamp(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): number | undefined {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\treturn valueDB.getTimestamp(valueId);\n\t}\n\n\t/** Returns the CC value definition for the current CC which matches the given value ID */\n\tprotected getCCValue(\n\t\tvalueId: ValueID,\n\t): StaticCCValue | DynamicCCValue | undefined {\n\t\tconst ccValues = getCCValues(this);\n\t\tif (!ccValues) return;\n\n\t\tfor (const value of Object.values(ccValues)) {\n\t\t\tif (value?.is(valueId)) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getAllCCValues(): (StaticCCValue | DynamicCCValue)[] {\n\t\treturn Object.values(getCCValues(this) ?? {}) as (\n\t\t\t| StaticCCValue\n\t\t\t| DynamicCCValue\n\t\t)[];\n\t}\n\n\tprivate getCCValueForValueId(\n\t\tproperties: ValueIDProperties,\n\t): StaticCCValue | DynamicCCValue | undefined {\n\t\treturn this.getAllCCValues().find((value) =>\n\t\t\tvalue.is({\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\t...properties,\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate shouldAutoCreateValue(\n\t\tctx: GetValueDB & GetDeviceConfig,\n\t\tvalue: StaticCCValue,\n\t): boolean {\n\t\treturn (\n\t\t\tvalue.options.autoCreate === true\n\t\t\t|| (typeof value.options.autoCreate === \"function\"\n\t\t\t\t&& value.options.autoCreate(\n\t\t\t\t\tctx,\n\t\t\t\t\t{\n\t\t\t\t\t\tvirtual: false,\n\t\t\t\t\t\tnodeId: this.nodeId as number,\n\t\t\t\t\t\tindex: this.endpointIndex,\n\t\t\t\t\t},\n\t\t\t\t))\n\t\t);\n\t}\n\n\t/** Returns a list of all value names that are defined for this CommandClass */\n\tpublic getDefinedValueIDs(\n\t\tctx:\n\t\t\t& GetValueDB\n\t\t\t& GetSupportedCCVersion\n\t\t\t& GetDeviceConfig\n\t\t\t& GetNode<\n\t\t\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t\t\t>,\n\t\tincludeInternal: boolean = false,\n\t): ValueID[] {\n\t\t// In order to compare value ids, we need them to be strings\n\t\tconst ret = new Map<string, ValueID>();\n\n\t\tconst addValueId = (\n\t\t\tproperty: string | number,\n\t\t\tpropertyKey?: string | number,\n\t\t): void => {\n\t\t\tconst valueId: ValueID = {\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tproperty,\n\t\t\t\tpropertyKey,\n\t\t\t};\n\t\t\tconst dbKey = valueIdToString(valueId);\n\t\t\tif (!ret.has(dbKey)) ret.set(dbKey, valueId);\n\t\t};\n\n\t\t// Return all value IDs for this CC...\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\t// ...which either have metadata or a value\n\t\tconst existingValueIds: ValueID[] = [\n\t\t\t...valueDB.getValues(this.ccId),\n\t\t\t...valueDB.getAllMetadata(this.ccId),\n\t\t];\n\n\t\t// To determine which value IDs to expose, we need to know the CC version\n\t\t// that we're doing this for\n\t\tconst supportedVersion = typeof this.nodeId === \"number\"\n\t\t\t\t&& this.nodeId !== NODE_ID_BROADCAST\n\t\t\t\t&& this.nodeId !== NODE_ID_BROADCAST_LR\n\t\t\t// On singlecast CCs, use the version the node reported support for,\n\t\t\t? ctx.getSupportedCCVersion(\n\t\t\t\tthis.ccId,\n\t\t\t\tthis.nodeId,\n\t\t\t\tthis.endpointIndex,\n\t\t\t)\n\t\t\t// on multicast/broadcast, use the highest version we implement\n\t\t\t: getImplementedVersion(this.ccId);\n\n\t\t// ...or which are statically defined using @ccValues(...)\n\t\tfor (const value of Object.values(getCCValues(this) ?? {})) {\n\t\t\t// Skip dynamic CC values - they need a specific subclass instance to be evaluated\n\t\t\tif (!value || typeof value === \"function\") continue;\n\n\t\t\t// Skip those values that are only supported in higher versions of the CC\n\t\t\tif (\n\t\t\t\tvalue.options.minVersion != undefined\n\t\t\t\t&& value.options.minVersion > supportedVersion\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip internal values\n\t\t\tif (value.options.internal && !includeInternal) continue;\n\n\t\t\t// And determine if this value should be automatically \"created\"\n\t\t\tif (!this.shouldAutoCreateValue(ctx, value)) continue;\n\n\t\t\texistingValueIds.push(value.endpoint(this.endpointIndex));\n\t\t}\n\n\t\t// TODO: this is a bit awkward for the statically defined ones\n\t\tconst ccValues = this.getAllCCValues();\n\t\tfor (const valueId of existingValueIds) {\n\t\t\t// ...belonging to the current endpoint\n\t\t\tif ((valueId.endpoint ?? 0) !== this.endpointIndex) continue;\n\n\t\t\t// Hard-coded: interviewComplete is always internal\n\t\t\tif (valueId.property === \"interviewComplete\") continue;\n\n\t\t\t// ... which don't have a CC value definition\n\t\t\t// ... or one that does not mark the value ID as internal\n\t\t\tconst ccValue = ccValues.find((value) => value.is(valueId));\n\t\t\tif (!ccValue || !ccValue.options.internal || includeInternal) {\n\t\t\t\taddValueId(valueId.property, valueId.propertyKey);\n\t\t\t}\n\t\t}\n\n\t\treturn [...ret.values()];\n\t}\n\n\t/** Determines if the given value is an internal value */\n\tpublic isInternalValue(properties: ValueIDProperties): boolean {\n\t\t// Hard-coded: interviewComplete is always internal\n\t\tif (properties.property === \"interviewComplete\") return true;\n\n\t\tconst ccValue = this.getCCValueForValueId(properties);\n\t\treturn ccValue?.options.internal ?? defaultCCValueOptions.internal;\n\t}\n\n\t/** Determines if the given value is an secret value */\n\tpublic isSecretValue(properties: ValueIDProperties): boolean {\n\t\tconst ccValue = this.getCCValueForValueId(properties);\n\t\treturn ccValue?.options.secret ?? defaultCCValueOptions.secret;\n\t}\n\n\t/** Determines if the given value should be persisted or represents an event */\n\tpublic isStatefulValue(properties: ValueIDProperties): boolean {\n\t\tconst ccValue = this.getCCValueForValueId(properties);\n\t\treturn ccValue?.options.stateful ?? defaultCCValueOptions.stateful;\n\t}\n\n\t/**\n\t * Persists all values for this CC instance into the value DB which are annotated with @ccValue.\n\t * Returns `true` if the process succeeded, `false` if the value DB cannot be accessed.\n\t */\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tlet valueDB: ValueDB;\n\t\ttry {\n\t\t\tvalueDB = this.getValueDB(ctx);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\n\t\t// To determine which value IDs to expose, we need to know the CC version\n\t\t// that we're doing this for\n\t\tconst supportedVersion = ctx.getSupportedCCVersion(\n\t\t\tthis.ccId,\n\t\t\t// Values are only persisted for singlecast, so we know nodeId is a number\n\t\t\tthis.nodeId as number,\n\t\t\tthis.endpointIndex,\n\t\t\t// If the version isn't known yet, limit the created values to V1\n\t\t) || 1;\n\n\t\t// Get all properties of this CC which are annotated with a @ccValue decorator and store them.\n\t\tfor (const [prop, _value] of getCCValueProperties(this)) {\n\t\t\t// Evaluate dynamic CC values first\n\t\t\tconst value = typeof _value === \"function\" ? _value(this) : _value;\n\n\t\t\t// Skip those values that are only supported in higher versions of the CC\n\t\t\tif (\n\t\t\t\tvalue.options.minVersion != undefined\n\t\t\t\t&& value.options.minVersion > supportedVersion\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst valueId: ValueID = value.endpoint(this.endpointIndex);\n\t\t\tconst sourceValue = this[prop as keyof this];\n\n\t\t\t// Metadata gets created for non-internal values...\n\t\t\tconst createMetadata = !value.options.internal\n\t\t\t\t// ... but only if the value is included in the report we are persisting\n\t\t\t\t&& (sourceValue != undefined\n\t\t\t\t\t// ... or if we know which CC version the node supports\n\t\t\t\t\t// and the value may be automatically created\n\t\t\t\t\t|| (supportedVersion >= value.options.minVersion\n\t\t\t\t\t\t&& this.shouldAutoCreateValue(ctx, value)));\n\n\t\t\tif (createMetadata && !valueDB.hasMetadata(valueId)) {\n\t\t\t\tvalueDB.setMetadata(valueId, value.meta);\n\t\t\t}\n\n\t\t\t// The value only gets written if it is not undefined. null is a valid value!\n\t\t\tif (sourceValue === undefined) continue;\n\n\t\t\tvalueDB.setValue(valueId, sourceValue, {\n\t\t\t\tstateful: value.options.stateful,\n\t\t\t});\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * When a CC supports to be split into multiple partial CCs, this can be used to identify the\n\t * session the partial CCs belong to.\n\t * If a CC expects `mergePartialCCs` to be always called, you should return an empty object here.\n\t */\n\tpublic getPartialCCSessionId(): Record<string, any> | undefined {\n\t\treturn undefined; // Only select CCs support to be split\n\t}\n\n\t/**\n\t * When a CC supports to be split into multiple partial CCs, this indicates that the last report hasn't been received yet.\n\t * @param _session The previously received set of messages received in this partial CC session\n\t */\n\tpublic expectMoreMessages(_session: CommandClass[]): boolean {\n\t\treturn false; // By default, all CCs are monolithic\n\t}\n\n\t/**\n\t * Include previously received partial responses into a final CC\n\t * @deprecated Use {@link mergePartialCCsAsync} instead\n\t */\n\tpublic mergePartialCCs(\n\t\t_partials: CommandClass[],\n\t\t_ctx: CCParsingContext,\n\t): void {\n\t\t// This is highly CC dependent\n\t\t// Overwrite this in derived classes, by default do nothing\n\t}\n\n\t/** Include previously received partial responses into a final CC */\n\tpublic async mergePartialCCsAsync(\n\t\t_partials: CommandClass[],\n\t\t_ctx: CCParsingContext,\n\t): Promise<void> {\n\t\t// This is highly CC dependent\n\t\t// Overwrite this in derived classes, by default do nothing\n\t}\n\n\t/** Tests whether this CC expects at least one command in return */\n\tpublic expectsCCResponse(): boolean {\n\t\tlet expected:\n\t\t\t| DynamicCCResponse<this>\n\t\t\t| ReturnType<DynamicCCResponse<this>> = getExpectedCCResponse(this);\n\n\t\t// Evaluate dynamic CC responses\n\t\tif (\n\t\t\ttypeof expected === \"function\"\n\t\t\t&& !staticExtends(expected, CommandClass)\n\t\t) {\n\t\t\texpected = expected(this);\n\t\t}\n\t\tif (expected === undefined) return false;\n\t\tif (isArray(expected)) {\n\t\t\treturn expected.every((cc) => staticExtends(cc, CommandClass));\n\t\t} else {\n\t\t\treturn staticExtends(expected, CommandClass);\n\t\t}\n\t}\n\n\tpublic isExpectedCCResponse(received: CommandClass): boolean {\n\t\tif (received.nodeId !== this.nodeId) return false;\n\n\t\tlet expected:\n\t\t\t| DynamicCCResponse<this>\n\t\t\t| ReturnType<DynamicCCResponse<this>> = getExpectedCCResponse(this);\n\n\t\t// Evaluate dynamic CC responses\n\t\tif (\n\t\t\ttypeof expected === \"function\"\n\t\t\t&& !staticExtends(expected, CommandClass)\n\t\t) {\n\t\t\texpected = expected(this);\n\t\t}\n\n\t\tif (expected == undefined) {\n\t\t\t// Fallback, should not happen if the expected response is defined correctly\n\t\t\treturn false;\n\t\t} else if (\n\t\t\tisArray(expected)\n\t\t\t&& expected.every((cc) => staticExtends(cc, CommandClass))\n\t\t) {\n\t\t\t// The CC always expects a response from the given list, check if the received\n\t\t\t// message is in that list\n\t\t\tif (expected.every((base) => !(received instanceof base))) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (staticExtends(expected, CommandClass)) {\n\t\t\t// The CC always expects the same single response, check if this is the one\n\t\t\tif (!(received instanceof expected)) return false;\n\t\t}\n\n\t\t// If the CC wants to test the response, let it\n\t\tconst predicate = getCCResponsePredicate(this);\n\t\tconst ret = predicate?.(this, received) ?? true;\n\n\t\tif (ret === \"checkEncapsulated\") {\n\t\t\tif (\n\t\t\t\tisEncapsulatingCommandClass(this)\n\t\t\t\t&& isEncapsulatingCommandClass(received)\n\t\t\t) {\n\t\t\t\treturn this.encapsulated.isExpectedCCResponse(\n\t\t\t\t\treceived.encapsulated,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Fallback, should not happen if the expected response is defined correctly\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\t/**\n\t * Translates a property identifier into a speaking name for use in an external API\n\t * @param property The property identifier that should be translated\n\t * @param _propertyKey The (optional) property key the translated name may depend on\n\t */\n\tpublic translateProperty(\n\t\t_ctx: GetValueDB,\n\t\tproperty: string | number,\n\t\t_propertyKey?: string | number,\n\t): string {\n\t\t// Overwrite this in derived classes, by default just return the property key\n\t\treturn property.toString();\n\t}\n\n\t/**\n\t * Translates a property key into a speaking name for use in an external API\n\t * @param _property The property the key in question belongs to\n\t * @param propertyKey The property key for which the speaking name should be retrieved\n\t */\n\tpublic translatePropertyKey(\n\t\t_ctx: GetValueDB,\n\t\t_property: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\t// Overwrite this in derived classes, by default just return the property key\n\t\treturn propertyKey.toString();\n\t}\n\n\t/** Returns the number of bytes that are added to the payload by this CC */\n\tprotected computeEncapsulationOverhead(): number {\n\t\t// Default is ccId (+ ccCommand):\n\t\treturn (this.isExtended() ? 2 : 1) + 1;\n\t}\n\n\t/** Computes the maximum net payload size that can be transmitted inside this CC */\n\tpublic getMaxPayloadLength(baseLength: number): number {\n\t\tlet ret = baseLength;\n\t\tlet cur: CommandClass | undefined = this;\n\t\twhile (cur) {\n\t\t\tret -= cur.computeEncapsulationOverhead();\n\t\t\tcur = isEncapsulatingCommandClass(cur)\n\t\t\t\t? cur.encapsulated\n\t\t\t\t: undefined;\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/** Checks whether this CC is encapsulated with one that has the given CC id and (optionally) CC Command */\n\tpublic isEncapsulatedWith(\n\t\tccId: CommandClasses,\n\t\tccCommand?: number,\n\t): boolean {\n\t\tlet cc: CommandClass = this;\n\t\t// Check whether there was a S0 encapsulation\n\t\twhile (cc.encapsulatingCC) {\n\t\t\tcc = cc.encapsulatingCC;\n\t\t\tif (\n\t\t\t\tcc.ccId === ccId\n\t\t\t\t&& (ccCommand === undefined || cc.ccCommand === ccCommand)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/** Traverses the encapsulation stack of this CC outwards and returns the one that has the given CC id and (optionally) CC Command if that exists. */\n\tpublic getEncapsulatingCC(\n\t\tccId: CommandClasses,\n\t\tccCommand?: number,\n\t): CommandClass | undefined {\n\t\tlet cc: CommandClass = this;\n\t\twhile (cc.encapsulatingCC) {\n\t\t\tcc = cc.encapsulatingCC;\n\t\t\tif (\n\t\t\t\tcc.ccId === ccId\n\t\t\t\t&& (ccCommand === undefined || cc.ccCommand === ccCommand)\n\t\t\t) {\n\t\t\t\treturn cc;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Traverses the encapsulation stack of this CC inwards and returns the one that has the given CC id and (optionally) CC Command if that exists. */\n\tpublic getEncapsulatedCC(\n\t\tccId: CommandClasses,\n\t\tccCommand?: number,\n\t): CommandClass | undefined {\n\t\tconst predicate = (cc: CommandClass): boolean =>\n\t\t\tcc.ccId === ccId\n\t\t\t&& (ccCommand === undefined || cc.ccCommand === ccCommand);\n\n\t\tif (isEncapsulatingCommandClass(this)) {\n\t\t\tif (predicate(this.encapsulated)) return this.encapsulated;\n\t\t\treturn this.encapsulated.getEncapsulatedCC(ccId, ccCommand);\n\t\t} else if (isMultiEncapsulatingCommandClass(this)) {\n\t\t\tfor (const encapsulated of this.encapsulated) {\n\t\t\t\tif (predicate(encapsulated)) return encapsulated;\n\t\t\t\tconst ret = encapsulated.getEncapsulatedCC(ccId, ccCommand);\n\t\t\t\tif (ret) return ret;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport interface InvalidCCOptions extends CommandClassOptions {\n\tccName: string;\n\treason?: string | ZWaveErrorCodes;\n}\n\nexport class InvalidCC extends CommandClass {\n\tpublic constructor(options: InvalidCCOptions) {\n\t\tsuper(options);\n\t\tthis._ccName = options.ccName;\n\t\t// Numeric reasons are used internally to communicate problems with a CC\n\t\t// without ignoring them entirely\n\t\tthis.reason = options.reason;\n\t}\n\n\tprivate _ccName: string;\n\tpublic get ccName(): string {\n\t\treturn this._ccName;\n\t}\n\tpublic readonly reason?: string | ZWaveErrorCodes;\n\n\tpublic toLogEntry(_ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\ttags: [this.ccName, \"INVALID\"],\n\t\t\tmessage: this.reason != undefined\n\t\t\t\t? {\n\t\t\t\t\terror: typeof this.reason === \"string\"\n\t\t\t\t\t\t? this.reason\n\t\t\t\t\t\t: getEnumMemberName(\n\t\t\t\t\t\t\tZWaveErrorCodes,\n\t\t\t\t\t\t\tthis.reason,\n\t\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\t}\n}\n\nexport type CCConstructor<T extends CommandClass> = typeof CommandClass & {\n\t// I don't like the any, but we need it to support half-implemented CCs (e.g. report classes)\n\tnew (options: any): T;\n};\n\n/**\n * @publicAPI\n * May be used to define different expected CC responses depending on the sent CC\n */\nexport type DynamicCCResponse<\n\tTSent extends CommandClass,\n\tTReceived extends CommandClass = CommandClass,\n> = (\n\tsentCC: TSent,\n) => CCConstructor<TReceived> | CCConstructor<TReceived>[] | undefined;\n\n/** @publicAPI */\nexport type CCResponseRole =\n\t| boolean // The response was either expected or unexpected\n\t| \"checkEncapsulated\"; // The response role depends on the encapsulated CC\n\n/**\n * @publicAPI\n * A predicate function to test if a received CC matches the sent CC\n */\nexport type CCResponsePredicate<\n\tTSent extends CommandClass,\n\tTReceived extends CommandClass = CommandClass,\n> = (sentCommand: TSent, receivedCommand: TReceived) => CCResponseRole;\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["import { type CCEncodingContext, type CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\ttype GetDeviceConfig,\n\ttype LookupManufacturer,\n} from \"@zwave-js/config\";\nimport { type LogNode } from \"@zwave-js/core\";\nimport {\n\ttype BroadcastCC,\n\ttype CCAddress,\n\ttype CCId,\n\tCommandClasses,\n\ttype ControlsCC,\n\tEncapsulationFlags,\n\ttype EndpointId,\n\ttype FrameType,\n\ttype GetAllEndpoints,\n\ttype GetCCs,\n\ttype GetEndpoint,\n\ttype GetNode,\n\ttype GetSupportedCCVersion,\n\ttype GetValueDB,\n\ttype HostIDs,\n\ttype ListenBehavior,\n\ttype MessageOrCCLogEntry,\n\ttype MessageRecord,\n\ttype ModifyCCs,\n\ttype MulticastCC,\n\ttype MulticastDestination,\n\tNODE_ID_BROADCAST,\n\tNODE_ID_BROADCAST_LR,\n\ttype NodeId,\n\ttype QueryNodeStatus,\n\ttype QuerySecurityClasses,\n\ttype SetSecurityClass,\n\ttype SinglecastCC,\n\ttype SupportsCC,\n\ttype ValueDB,\n\ttype ValueID,\n\ttype ValueMetadata,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tgetCCName,\n\tisZWaveError,\n\tparseCCId,\n\tvalueIdToString,\n} from \"@zwave-js/core/safe\";\nimport {\n\tBytes,\n\ttype JSONObject,\n\tbuffer2hex,\n\tgetEnumMemberName,\n\tnum2hex,\n\tstaticExtends,\n} from \"@zwave-js/shared/safe\";\nimport { isArray } from \"alcalzone-shared/typeguards\";\nimport type { CCAPIHost, CCAPINode, ValueIDProperties } from \"./API.js\";\nimport {\n\tgetCCCommand,\n\tgetCCCommandConstructor,\n\tgetCCConstructor,\n\tgetCCResponsePredicate,\n\tgetCCValueProperties,\n\tgetCCValues,\n\tgetCommandClass,\n\tgetExpectedCCResponse,\n\tgetImplementedVersion,\n} from \"./CommandClassDecorators.js\";\nimport {\n\ttype EncapsulatingCommandClass,\n\tisEncapsulatingCommandClass,\n\tisMultiEncapsulatingCommandClass,\n} from \"./EncapsulatingCommandClass.js\";\nimport {\n\ttype CCValue,\n\ttype DynamicCCValue,\n\ttype StaticCCValue,\n\tdefaultCCValueOptions,\n} from \"./Values.js\";\nimport { type GetInterviewOptions } from \"./traits.js\";\n\nexport interface CommandClassOptions extends CCAddress {\n\tccId?: number; // Used to overwrite the declared CC ID\n\tccCommand?: number; // undefined = NoOp\n\tpayload?: Uint8Array;\n}\n\n// Defines the necessary traits an endpoint passed to a CC instance must have\nexport type CCEndpoint =\n\t& EndpointId\n\t& SupportsCC\n\t& ControlsCC\n\t& GetCCs\n\t& ModifyCCs;\n\n// Defines the necessary traits a node passed to a CC instance must have\nexport type CCNode =\n\t& NodeId\n\t& SupportsCC\n\t& ControlsCC\n\t& GetCCs\n\t& GetEndpoint<CCEndpoint>\n\t& GetAllEndpoints<CCEndpoint>\n\t& QuerySecurityClasses\n\t& SetSecurityClass\n\t& ListenBehavior\n\t& QueryNodeStatus;\n\nexport type InterviewContext =\n\t& CCAPIHost<\n\t\t& CCAPINode\n\t\t& GetCCs\n\t\t& SupportsCC\n\t\t& ControlsCC\n\t\t& QuerySecurityClasses\n\t\t& SetSecurityClass\n\t\t& GetEndpoint<EndpointId & GetCCs & SupportsCC & ControlsCC & ModifyCCs>\n\t\t& GetAllEndpoints<EndpointId & SupportsCC & ControlsCC>\n\t>\n\t& GetInterviewOptions\n\t& LookupManufacturer;\n\nexport type RefreshValuesContext = CCAPIHost<\n\tCCAPINode & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n>;\n\nexport type PersistValuesContext =\n\t& HostIDs\n\t& GetValueDB\n\t& GetSupportedCCVersion\n\t& GetDeviceConfig\n\t& GetNode<\n\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t>\n\t& LogNode;\n\nexport function getEffectiveCCVersion(\n\tctx: GetSupportedCCVersion,\n\tcc: CCId,\n\tdefaultVersion?: number,\n): number {\n\t// For multicast and broadcast CCs, just use the highest implemented version to serialize\n\t// Older nodes will ignore the additional fields\n\tif (\n\t\ttypeof cc.nodeId !== \"number\"\n\t\t|| cc.nodeId === NODE_ID_BROADCAST\n\t\t|| cc.nodeId === NODE_ID_BROADCAST_LR\n\t) {\n\t\treturn getImplementedVersion(cc.ccId);\n\t}\n\t// For singlecast CCs, set the CC version as high as possible\n\treturn ctx.getSupportedCCVersion(cc.ccId, cc.nodeId, cc.endpointIndex)\n\t\t|| (defaultVersion ?? getImplementedVersion(cc.ccId));\n}\n\nexport class CCRaw {\n\tpublic constructor(\n\t\tpublic ccId: CommandClasses,\n\t\tpublic ccCommand: number | undefined,\n\t\tpublic payload: Bytes,\n\t) {}\n\n\tpublic static parse(data: Uint8Array): CCRaw {\n\t\tconst { ccId, bytesRead: ccIdLength } = parseCCId(data);\n\t\t// There are so few exceptions that we can handle them here manually\n\t\tif (ccId === CommandClasses[\"No Operation\"]) {\n\t\t\treturn new CCRaw(ccId, undefined, new Bytes());\n\t\t}\n\t\tlet ccCommand: number | undefined = data[ccIdLength];\n\t\tlet payload = Bytes.view(data.subarray(ccIdLength + 1));\n\t\tif (ccId === CommandClasses[\"Transport Service\"]) {\n\t\t\t// Transport Service only uses the higher 5 bits for the command\n\t\t\t// and re-uses the lower 3 bits of the ccCommand as payload\n\t\t\tpayload = Bytes.concat([\n\t\t\t\tBytes.from([ccCommand & 0b111]),\n\t\t\t\tpayload,\n\t\t\t]);\n\t\t\tccCommand = ccCommand & 0b11111_000;\n\t\t} else if (ccId === CommandClasses[\"Manufacturer Proprietary\"]) {\n\t\t\t// ManufacturerProprietaryCC has no CC command, so the first\n\t\t\t// payload byte is stored in ccCommand.\n\t\t\tpayload = Bytes.concat([\n\t\t\t\tBytes.from([ccCommand]),\n\t\t\t\tpayload,\n\t\t\t]);\n\t\t\tccCommand = undefined;\n\t\t}\n\n\t\treturn new CCRaw(ccId, ccCommand, payload);\n\t}\n\n\tpublic withPayload(payload: Bytes): CCRaw {\n\t\treturn new CCRaw(this.ccId, this.ccCommand, payload);\n\t}\n}\n\n// @publicAPI\nexport class CommandClass implements CCId {\n\t// empty constructor to parse messages\n\tpublic constructor(options: CommandClassOptions) {\n\t\tconst {\n\t\t\tnodeId,\n\t\t\tendpointIndex = 0,\n\t\t\tccId = getCommandClass(this),\n\t\t\tccCommand = getCCCommand(this),\n\t\t\tpayload = new Uint8Array(),\n\t\t} = options;\n\n\t\tthis.nodeId = nodeId;\n\t\tthis.endpointIndex = endpointIndex;\n\t\tthis.ccId = ccId;\n\t\tthis.ccCommand = ccCommand;\n\t\tthis.payload = Bytes.view(payload);\n\t}\n\n\tpublic static async parse(\n\t\tdata: Uint8Array,\n\t\tctx: CCParsingContext,\n\t): Promise<CommandClass> {\n\t\tconst raw = CCRaw.parse(data);\n\n\t\t// Find the correct subclass constructor to invoke\n\t\tconst CCConstructor = getCCConstructor(raw.ccId);\n\t\tif (!CCConstructor) {\n\t\t\t// None -> fall back to the default constructor\n\t\t\treturn await CommandClass.from(raw, ctx);\n\t\t}\n\n\t\tlet CommandConstructor: CCConstructor<CommandClass> | undefined;\n\t\tif (raw.ccCommand != undefined) {\n\t\t\tCommandConstructor = getCCCommandConstructor(\n\t\t\t\traw.ccId,\n\t\t\t\traw.ccCommand,\n\t\t\t);\n\t\t}\n\t\t// Not every CC has a constructor for its commands. In that case,\n\t\t// call the CC constructor directly\n\t\ttry {\n\t\t\treturn await (CommandConstructor ?? CCConstructor).from(raw, ctx);\n\t\t} catch (e) {\n\t\t\t// Indicate invalid payloads with a special CC type\n\t\t\tif (\n\t\t\t\tisZWaveError(e)\n\t\t\t\t&& e.code === ZWaveErrorCodes.PacketFormat_InvalidPayload\n\t\t\t) {\n\t\t\t\tconst ccName = CommandConstructor?.name\n\t\t\t\t\t?? `${getCCName(raw.ccId)} CC`;\n\n\t\t\t\t// Preserve why the command was invalid\n\t\t\t\tlet reason: string | ZWaveErrorCodes | undefined;\n\t\t\t\tif (\n\t\t\t\t\ttypeof e.context === \"string\"\n\t\t\t\t\t|| (typeof e.context === \"number\"\n\t\t\t\t\t\t&& ZWaveErrorCodes[e.context] != undefined)\n\t\t\t\t) {\n\t\t\t\t\treason = e.context;\n\t\t\t\t}\n\n\t\t\t\tconst ret = new InvalidCC({\n\t\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\t\tccId: raw.ccId,\n\t\t\t\t\tccCommand: raw.ccCommand,\n\t\t\t\t\tccName,\n\t\t\t\t\treason,\n\t\t\t\t});\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): CommandClass | Promise<CommandClass> {\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tccId: raw.ccId,\n\t\t\tccCommand: raw.ccCommand,\n\t\t\tpayload: raw.payload,\n\t\t});\n\t}\n\n\t/** This CC's identifier */\n\tpublic ccId!: CommandClasses;\n\tpublic ccCommand?: number;\n\tpublic get ccName(): string {\n\t\treturn getCCName(this.ccId);\n\t}\n\n\t/** The ID of the target node(s) */\n\tpublic nodeId!: number | MulticastDestination;\n\n\tpublic payload: Bytes;\n\n\t/** Which endpoint of the node this CC belongs to. 0 for the root device. */\n\tpublic endpointIndex: number;\n\n\t/**\n\t * Which encapsulation CCs this CC is/was/should be encapsulated with.\n\t *\n\t * Don't use this directly, this is used internally.\n\t */\n\tpublic encapsulationFlags: EncapsulationFlags = EncapsulationFlags.None;\n\n\t/** Activates or deactivates the given encapsulation flag(s) */\n\tpublic toggleEncapsulationFlag(\n\t\tflag: EncapsulationFlags,\n\t\tactive: boolean,\n\t): void {\n\t\tif (active) {\n\t\t\tthis.encapsulationFlags |= flag;\n\t\t} else {\n\t\t\tthis.encapsulationFlags &= ~flag;\n\t\t}\n\t}\n\n\t/** Contains a reference to the encapsulating CC if this CC is encapsulated */\n\tpublic encapsulatingCC?: EncapsulatingCommandClass;\n\n\t/** The type of Z-Wave frame this CC was sent with */\n\tpublic readonly frameType?: FrameType;\n\n\t/** Returns true if this CC is an extended CC (0xF100..0xFFFF) */\n\tpublic isExtended(): boolean {\n\t\treturn this.ccId >= 0xf100;\n\t}\n\n\t/** Whether the interview for this CC was previously completed */\n\tpublic isInterviewComplete(host: GetValueDB): boolean {\n\t\treturn !!this.getValueDB(host).getValue<boolean>({\n\t\t\tcommandClass: this.ccId,\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tproperty: \"interviewComplete\",\n\t\t});\n\t}\n\n\t/** Marks the interview for this CC as complete or not */\n\tpublic setInterviewComplete(\n\t\thost: GetValueDB,\n\t\tcomplete: boolean,\n\t): void {\n\t\tthis.getValueDB(host).setValue(\n\t\t\t{\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tproperty: \"interviewComplete\",\n\t\t\t},\n\t\t\tcomplete,\n\t\t);\n\t}\n\n\t/**\n\t * Serializes this CommandClass to be embedded in a message payload or another CC\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await\n\tpublic async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\t// NoOp CCs have no command and no payload\n\t\tif (this.ccId === CommandClasses[\"No Operation\"]) {\n\t\t\treturn Bytes.from([this.ccId]);\n\t\t} else if (this.ccCommand == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot serialize a Command Class without a command\",\n\t\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t\t);\n\t\t}\n\n\t\tconst payloadLength = this.payload.length;\n\t\tconst ccIdLength = this.isExtended() ? 2 : 1;\n\t\tconst data = new Bytes(ccIdLength + 1 + payloadLength);\n\t\tdata.writeUIntBE(this.ccId, 0, ccIdLength);\n\t\tdata[ccIdLength] = this.ccCommand;\n\t\tif (payloadLength > 0 /* implies payload != undefined */) {\n\t\t\tdata.set(this.payload, 1 + ccIdLength);\n\t\t}\n\t\treturn data;\n\t}\n\n\tpublic prepareRetransmission(): void {\n\t\t// Do nothing by default\n\t}\n\n\t/**\n\t * Create an instance of the given CC without checking whether it is supported.\n\t * If the CC is implemented, this returns an instance of the given CC which is linked to the given endpoint.\n\t *\n\t * **INTERNAL:** Applications should not use this directly.\n\t */\n\tpublic static createInstanceUnchecked<T extends CommandClass>(\n\t\tendpoint: EndpointId,\n\t\tcc: CommandClasses | CCConstructor<T>,\n\t): T | undefined {\n\t\tconst Constructor = typeof cc === \"number\" ? getCCConstructor(cc) : cc;\n\t\tif (Constructor) {\n\t\t\treturn new Constructor({\n\t\t\t\tnodeId: endpoint.nodeId,\n\t\t\t\tendpointIndex: endpoint.index,\n\t\t\t}) as T;\n\t\t}\n\t}\n\n\t/** Generates a representation of this CC for the log */\n\tpublic toLogEntry(_ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tlet tag = this.constructor.name;\n\t\tconst message: MessageRecord = {};\n\t\tif (this.constructor === CommandClass) {\n\t\t\ttag = `${\n\t\t\t\tgetEnumMemberName(\n\t\t\t\t\tCommandClasses,\n\t\t\t\t\tthis.ccId,\n\t\t\t\t)\n\t\t\t} CC (not implemented)`;\n\t\t\tif (this.ccCommand != undefined) {\n\t\t\t\tmessage.command = num2hex(this.ccCommand);\n\t\t\t}\n\t\t}\n\t\tif (this.payload.length > 0) {\n\t\t\tmessage.payload = buffer2hex(this.payload);\n\t\t}\n\t\treturn {\n\t\t\ttags: [tag],\n\t\t\tmessage,\n\t\t};\n\t}\n\n\t/** Generates the JSON representation of this CC */\n\tpublic toJSON(): JSONObject {\n\t\treturn this.toJSONInternal();\n\t}\n\n\tprivate toJSONInternal(): JSONObject {\n\t\tconst ret: JSONObject = {\n\t\t\tnodeId: this.nodeId,\n\t\t\tccId: CommandClasses[this.ccId] || num2hex(this.ccId),\n\t\t};\n\t\tif (this.ccCommand != undefined) {\n\t\t\tret.ccCommand = num2hex(this.ccCommand);\n\t\t}\n\t\tif (this.payload.length > 0) {\n\t\t\tret.payload = buffer2hex(this.payload);\n\t\t}\n\t\treturn ret;\n\t}\n\n\tprotected throwMissingCriticalInterviewResponse(): never {\n\t\tthrow new ZWaveError(\n\t\t\t`The node did not respond to a critical interview query in time.`,\n\t\t\tZWaveErrorCodes.Controller_NodeTimeout,\n\t\t);\n\t}\n\n\t/**\n\t * Performs the interview procedure for this CC according to SDS14223\n\t */\n\tpublic async interview(_ctx: InterviewContext): Promise<void> {\n\t\t// This needs to be overwritten per command class. In the default implementation, don't do anything\n\t}\n\n\t/**\n\t * Refreshes all dynamic values of this CC\n\t */\n\tpublic async refreshValues(_ctx: RefreshValuesContext): Promise<void> {\n\t\t// This needs to be overwritten per command class. In the default implementation, don't do anything\n\t}\n\n\t/**\n\t * Checks if the CC values need to be manually refreshed.\n\t * This should be called regularly and when sleeping nodes wake up\n\t */\n\tpublic shouldRefreshValues(\n\t\tthis: SinglecastCC<this>,\n\t\t_ctx:\n\t\t\t& GetValueDB\n\t\t\t& GetSupportedCCVersion\n\t\t\t& GetDeviceConfig\n\t\t\t& GetNode<\n\t\t\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t\t\t>,\n\t): boolean {\n\t\t// This needs to be overwritten per command class.\n\t\t// In the default implementation, don't require a refresh\n\t\treturn false;\n\t}\n\n\t/** Determines which CC interviews must be performed before this CC can be interviewed */\n\tpublic determineRequiredCCInterviews(): readonly CommandClasses[] {\n\t\t// By default, all CCs require the VersionCC interview\n\n\t\t// There are two exceptions to this rule:\n\t\t// * ManufacturerSpecific must be interviewed first\n\t\t// * VersionCC itself must be done after that\n\t\t// These exceptions are defined in the overrides of this method of each corresponding CC\n\n\t\treturn [CommandClasses.Version];\n\t}\n\n\t/**\n\t * Whether the endpoint interview may be skipped by a CC. Can be overwritten by a subclass.\n\t */\n\tpublic skipEndpointInterview(): boolean {\n\t\t// By default no interview may be skipped\n\t\treturn false;\n\t}\n\n\t/**\n\t * Maps a BasicCC value to a more specific CC implementation. Returns true if the value was mapped, false otherwise.\n\t * @param _value The value of the received BasicCC\n\t */\n\tpublic setMappedBasicValue(\n\t\t_ctx: GetValueDB,\n\t\t_value: number,\n\t): boolean {\n\t\t// By default, don't map\n\t\treturn false;\n\t}\n\n\tpublic isSinglecast(): this is SinglecastCC<this> {\n\t\treturn (\n\t\t\t// received\n\t\t\tthis.frameType === \"singlecast\"\n\t\t\t// transmitted\n\t\t\t|| (this.frameType == undefined\n\t\t\t\t&& typeof this.nodeId === \"number\"\n\t\t\t\t&& this.nodeId !== NODE_ID_BROADCAST\n\t\t\t\t&& this.nodeId !== NODE_ID_BROADCAST_LR)\n\t\t);\n\t}\n\n\tpublic isMulticast(): this is MulticastCC<this> {\n\t\treturn (\n\t\t\t// received\n\t\t\tthis.frameType === \"multicast\"\n\t\t\t// transmitted\n\t\t\t|| (this.frameType == undefined && isArray(this.nodeId))\n\t\t);\n\t}\n\n\tpublic isBroadcast(): this is BroadcastCC<this> {\n\t\treturn (\n\t\t\t// received\n\t\t\tthis.frameType === \"broadcast\"\n\t\t\t// transmitted\n\t\t\t|| (this.frameType == undefined\n\t\t\t\t&& (this.nodeId === NODE_ID_BROADCAST\n\t\t\t\t\t|| this.nodeId === NODE_ID_BROADCAST_LR))\n\t\t);\n\t}\n\n\t/**\n\t * Returns the node this CC is linked to. Throws if the controller is not yet ready.\n\t */\n\tpublic getNode<T extends NodeId>(\n\t\tctx: GetNode<T>,\n\t): T | undefined {\n\t\tif (this.isSinglecast()) {\n\t\t\treturn ctx.getNode(this.nodeId);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Returns the node this CC is linked to (or undefined if the node doesn't exist)\n\t */\n\tpublic tryGetNode<T extends NodeId>(\n\t\tctx: GetNode<T>,\n\t): T | undefined {\n\t\ttry {\n\t\t\treturn this.getNode(ctx);\n\t\t} catch (e) {\n\t\t\t// This was expected\n\t\t\tif (isZWaveError(e) && e.code === ZWaveErrorCodes.Driver_NotReady) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\t// Something else happened\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tpublic getEndpoint<T extends EndpointId>(\n\t\tctx: GetNode<NodeId & GetEndpoint<T>>,\n\t): T | undefined {\n\t\treturn this.getNode(ctx)?.getEndpoint(this.endpointIndex);\n\t}\n\n\t/** Returns the value DB for this CC's node */\n\tprotected getValueDB(ctx: GetValueDB): ValueDB {\n\t\tif (this.isSinglecast()) {\n\t\t\ttry {\n\t\t\t\treturn ctx.getValueDB(this.nodeId);\n\t\t\t} catch {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\"The node for this CC does not exist or the driver is not ready yet\",\n\t\t\t\t\tZWaveErrorCodes.Driver_NotReady,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tthrow new ZWaveError(\n\t\t\t\"Cannot retrieve the value DB for non-singlecast CCs\",\n\t\t\tZWaveErrorCodes.CC_NoNodeID,\n\t\t);\n\t}\n\n\t/**\n\t * Ensures that the metadata for the given CC value exists in the Value DB or creates it if it does not.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t * @param meta Will be used in place of the predefined metadata when given\n\t */\n\tprotected ensureMetadata(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t\tmeta?: ValueMetadata,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tif (!valueDB.hasMetadata(valueId)) {\n\t\t\tvalueDB.setMetadata(valueId, meta ?? ccValue.meta);\n\t\t}\n\t}\n\n\t/**\n\t * Removes the metadata for the given CC value from the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected removeMetadata(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tvalueDB.setMetadata(valueId, undefined);\n\t}\n\n\t/**\n\t * Writes the metadata for the given CC value into the Value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t * @param meta Will be used in place of the predefined metadata when given\n\t */\n\tprotected setMetadata(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t\tmeta?: ValueMetadata,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tvalueDB.setMetadata(valueId, meta ?? ccValue.meta);\n\t}\n\n\t/**\n\t * Reads the metadata for the given CC value from the Value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected getMetadata<T extends ValueMetadata>(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): T | undefined {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\treturn valueDB.getMetadata(valueId) as any;\n\t}\n\n\t/**\n\t * Stores the given value under the value ID for the given CC value in the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected setValue(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t\tvalue: unknown,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tvalueDB.setValue(valueId, value);\n\t}\n\n\t/**\n\t * Removes the value for the given CC value from the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected removeValue(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): void {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\tvalueDB.removeValue(valueId);\n\t}\n\n\t/**\n\t * Reads the value stored for the value ID of the given CC value from the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected getValue<T>(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): T | undefined {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\treturn valueDB.getValue(valueId);\n\t}\n\n\t/**\n\t * Reads when the value stored for the value ID of the given CC value was last updated in the value DB.\n\t * The endpoint index of the current CC instance is automatically taken into account.\n\t */\n\tprotected getValueTimestamp(\n\t\tctx: GetValueDB,\n\t\tccValue: CCValue,\n\t): number | undefined {\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\tconst valueId = ccValue.endpoint(this.endpointIndex);\n\t\treturn valueDB.getTimestamp(valueId);\n\t}\n\n\t/** Returns the CC value definition for the current CC which matches the given value ID */\n\tprotected getCCValue(\n\t\tvalueId: ValueID,\n\t): StaticCCValue | DynamicCCValue | undefined {\n\t\tconst ccValues = getCCValues(this);\n\t\tif (!ccValues) return;\n\n\t\tfor (const value of Object.values(ccValues)) {\n\t\t\tif (value?.is(valueId)) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getAllCCValues(): (StaticCCValue | DynamicCCValue)[] {\n\t\treturn Object.values(getCCValues(this) ?? {}) as (\n\t\t\t| StaticCCValue\n\t\t\t| DynamicCCValue\n\t\t)[];\n\t}\n\n\tprivate getCCValueForValueId(\n\t\tproperties: ValueIDProperties,\n\t): StaticCCValue | DynamicCCValue | undefined {\n\t\treturn this.getAllCCValues().find((value) =>\n\t\t\tvalue.is({\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\t...properties,\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate shouldAutoCreateValue(\n\t\tctx: GetValueDB & GetDeviceConfig,\n\t\tvalue: StaticCCValue,\n\t): boolean {\n\t\treturn (\n\t\t\tvalue.options.autoCreate === true\n\t\t\t|| (typeof value.options.autoCreate === \"function\"\n\t\t\t\t&& value.options.autoCreate(\n\t\t\t\t\tctx,\n\t\t\t\t\t{\n\t\t\t\t\t\tvirtual: false,\n\t\t\t\t\t\tnodeId: this.nodeId as number,\n\t\t\t\t\t\tindex: this.endpointIndex,\n\t\t\t\t\t},\n\t\t\t\t))\n\t\t);\n\t}\n\n\t/** Returns a list of all value names that are defined for this CommandClass */\n\tpublic getDefinedValueIDs(\n\t\tctx:\n\t\t\t& GetValueDB\n\t\t\t& GetSupportedCCVersion\n\t\t\t& GetDeviceConfig\n\t\t\t& GetNode<\n\t\t\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t\t\t>,\n\t\tincludeInternal: boolean = false,\n\t): ValueID[] {\n\t\t// In order to compare value ids, we need them to be strings\n\t\tconst ret = new Map<string, ValueID>();\n\n\t\tconst addValueId = (\n\t\t\tproperty: string | number,\n\t\t\tpropertyKey?: string | number,\n\t\t): void => {\n\t\t\tconst valueId: ValueID = {\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tproperty,\n\t\t\t\tpropertyKey,\n\t\t\t};\n\t\t\tconst dbKey = valueIdToString(valueId);\n\t\t\tif (!ret.has(dbKey)) ret.set(dbKey, valueId);\n\t\t};\n\n\t\t// Return all value IDs for this CC...\n\t\tconst valueDB = this.getValueDB(ctx);\n\t\t// ...which either have metadata or a value\n\t\tconst existingValueIds: ValueID[] = [\n\t\t\t...valueDB.getValues(this.ccId),\n\t\t\t...valueDB.getAllMetadata(this.ccId),\n\t\t];\n\n\t\t// To determine which value IDs to expose, we need to know the CC version\n\t\t// that we're doing this for\n\t\tconst supportedVersion = typeof this.nodeId === \"number\"\n\t\t\t\t&& this.nodeId !== NODE_ID_BROADCAST\n\t\t\t\t&& this.nodeId !== NODE_ID_BROADCAST_LR\n\t\t\t// On singlecast CCs, use the version the node reported support for,\n\t\t\t? ctx.getSupportedCCVersion(\n\t\t\t\tthis.ccId,\n\t\t\t\tthis.nodeId,\n\t\t\t\tthis.endpointIndex,\n\t\t\t)\n\t\t\t// on multicast/broadcast, use the highest version we implement\n\t\t\t: getImplementedVersion(this.ccId);\n\n\t\t// ...or which are statically defined using @ccValues(...)\n\t\tfor (const value of Object.values(getCCValues(this) ?? {})) {\n\t\t\t// Skip dynamic CC values - they need a specific subclass instance to be evaluated\n\t\t\tif (!value || typeof value === \"function\") continue;\n\n\t\t\t// Skip those values that are only supported in higher versions of the CC\n\t\t\tif (\n\t\t\t\tvalue.options.minVersion != undefined\n\t\t\t\t&& value.options.minVersion > supportedVersion\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip internal values\n\t\t\tif (value.options.internal && !includeInternal) continue;\n\n\t\t\t// And determine if this value should be automatically \"created\"\n\t\t\tif (!this.shouldAutoCreateValue(ctx, value)) continue;\n\n\t\t\texistingValueIds.push(value.endpoint(this.endpointIndex));\n\t\t}\n\n\t\t// TODO: this is a bit awkward for the statically defined ones\n\t\tconst ccValues = this.getAllCCValues();\n\t\tfor (const valueId of existingValueIds) {\n\t\t\t// ...belonging to the current endpoint\n\t\t\tif ((valueId.endpoint ?? 0) !== this.endpointIndex) continue;\n\n\t\t\t// Hard-coded: interviewComplete is always internal\n\t\t\tif (valueId.property === \"interviewComplete\") continue;\n\n\t\t\t// ... which don't have a CC value definition\n\t\t\t// ... or one that does not mark the value ID as internal\n\t\t\tconst ccValue = ccValues.find((value) => value.is(valueId));\n\t\t\tif (!ccValue || !ccValue.options.internal || includeInternal) {\n\t\t\t\taddValueId(valueId.property, valueId.propertyKey);\n\t\t\t}\n\t\t}\n\n\t\treturn [...ret.values()];\n\t}\n\n\t/** Determines if the given value is an internal value */\n\tpublic isInternalValue(properties: ValueIDProperties): boolean {\n\t\t// Hard-coded: interviewComplete is always internal\n\t\tif (properties.property === \"interviewComplete\") return true;\n\n\t\tconst ccValue = this.getCCValueForValueId(properties);\n\t\treturn ccValue?.options.internal ?? defaultCCValueOptions.internal;\n\t}\n\n\t/** Determines if the given value is an secret value */\n\tpublic isSecretValue(properties: ValueIDProperties): boolean {\n\t\tconst ccValue = this.getCCValueForValueId(properties);\n\t\treturn ccValue?.options.secret ?? defaultCCValueOptions.secret;\n\t}\n\n\t/** Determines if the given value should be persisted or represents an event */\n\tpublic isStatefulValue(properties: ValueIDProperties): boolean {\n\t\tconst ccValue = this.getCCValueForValueId(properties);\n\t\treturn ccValue?.options.stateful ?? defaultCCValueOptions.stateful;\n\t}\n\n\t/**\n\t * Persists all values for this CC instance into the value DB which are annotated with @ccValue.\n\t * Returns `true` if the process succeeded, `false` if the value DB cannot be accessed.\n\t */\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tlet valueDB: ValueDB;\n\t\ttry {\n\t\t\tvalueDB = this.getValueDB(ctx);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\n\t\t// To determine which value IDs to expose, we need to know the CC version\n\t\t// that we're doing this for\n\t\tconst supportedVersion = ctx.getSupportedCCVersion(\n\t\t\tthis.ccId,\n\t\t\t// Values are only persisted for singlecast, so we know nodeId is a number\n\t\t\tthis.nodeId as number,\n\t\t\tthis.endpointIndex,\n\t\t\t// If the version isn't known yet, limit the created values to V1\n\t\t) || 1;\n\n\t\t// Get all properties of this CC which are annotated with a @ccValue decorator and store them.\n\t\tfor (const [prop, _value] of getCCValueProperties(this)) {\n\t\t\t// Evaluate dynamic CC values first\n\t\t\tconst value = typeof _value === \"function\" ? _value(this) : _value;\n\n\t\t\t// Skip those values that are only supported in higher versions of the CC\n\t\t\tif (\n\t\t\t\tvalue.options.minVersion != undefined\n\t\t\t\t&& value.options.minVersion > supportedVersion\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst valueId: ValueID = value.endpoint(this.endpointIndex);\n\t\t\tconst sourceValue = this[prop as keyof this];\n\n\t\t\t// Metadata gets created for non-internal values...\n\t\t\tconst createMetadata = !value.options.internal\n\t\t\t\t// ... but only if the value is included in the report we are persisting\n\t\t\t\t&& (sourceValue != undefined\n\t\t\t\t\t// ... or if we know which CC version the node supports\n\t\t\t\t\t// and the value may be automatically created\n\t\t\t\t\t|| (supportedVersion >= value.options.minVersion\n\t\t\t\t\t\t&& this.shouldAutoCreateValue(ctx, value)));\n\n\t\t\tif (createMetadata && !valueDB.hasMetadata(valueId)) {\n\t\t\t\tvalueDB.setMetadata(valueId, value.meta);\n\t\t\t}\n\n\t\t\t// The value only gets written if it is not undefined. null is a valid value!\n\t\t\tif (sourceValue === undefined) continue;\n\n\t\t\tvalueDB.setValue(valueId, sourceValue, {\n\t\t\t\tstateful: value.options.stateful,\n\t\t\t});\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * When a CC supports to be split into multiple partial CCs, this can be used to identify the\n\t * session the partial CCs belong to.\n\t * If a CC expects `mergePartialCCs` to be always called, you should return an empty object here.\n\t */\n\tpublic getPartialCCSessionId(): Record<string, any> | undefined {\n\t\treturn undefined; // Only select CCs support to be split\n\t}\n\n\t/**\n\t * When a CC supports to be split into multiple partial CCs, this indicates that the last report hasn't been received yet.\n\t * @param _session The previously received set of messages received in this partial CC session\n\t */\n\tpublic expectMoreMessages(_session: CommandClass[]): boolean {\n\t\treturn false; // By default, all CCs are monolithic\n\t}\n\n\t/** Include previously received partial responses into a final CC */\n\tpublic async mergePartialCCs(\n\t\t_partials: CommandClass[],\n\t\t_ctx: CCParsingContext,\n\t): Promise<void> {\n\t\t// This is highly CC dependent\n\t\t// Overwrite this in derived classes, by default do nothing\n\t}\n\n\t/** Tests whether this CC expects at least one command in return */\n\tpublic expectsCCResponse(): boolean {\n\t\tlet expected:\n\t\t\t| DynamicCCResponse<this>\n\t\t\t| ReturnType<DynamicCCResponse<this>> = getExpectedCCResponse(this);\n\n\t\t// Evaluate dynamic CC responses\n\t\tif (\n\t\t\ttypeof expected === \"function\"\n\t\t\t&& !staticExtends(expected, CommandClass)\n\t\t) {\n\t\t\texpected = expected(this);\n\t\t}\n\t\tif (expected === undefined) return false;\n\t\tif (isArray(expected)) {\n\t\t\treturn expected.every((cc) => staticExtends(cc, CommandClass));\n\t\t} else {\n\t\t\treturn staticExtends(expected, CommandClass);\n\t\t}\n\t}\n\n\tpublic isExpectedCCResponse(received: CommandClass): boolean {\n\t\tif (received.nodeId !== this.nodeId) return false;\n\n\t\tlet expected:\n\t\t\t| DynamicCCResponse<this>\n\t\t\t| ReturnType<DynamicCCResponse<this>> = getExpectedCCResponse(this);\n\n\t\t// Evaluate dynamic CC responses\n\t\tif (\n\t\t\ttypeof expected === \"function\"\n\t\t\t&& !staticExtends(expected, CommandClass)\n\t\t) {\n\t\t\texpected = expected(this);\n\t\t}\n\n\t\tif (expected == undefined) {\n\t\t\t// Fallback, should not happen if the expected response is defined correctly\n\t\t\treturn false;\n\t\t} else if (\n\t\t\tisArray(expected)\n\t\t\t&& expected.every((cc) => staticExtends(cc, CommandClass))\n\t\t) {\n\t\t\t// The CC always expects a response from the given list, check if the received\n\t\t\t// message is in that list\n\t\t\tif (expected.every((base) => !(received instanceof base))) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (staticExtends(expected, CommandClass)) {\n\t\t\t// The CC always expects the same single response, check if this is the one\n\t\t\tif (!(received instanceof expected)) return false;\n\t\t}\n\n\t\t// If the CC wants to test the response, let it\n\t\tconst predicate = getCCResponsePredicate(this);\n\t\tconst ret = predicate?.(this, received) ?? true;\n\n\t\tif (ret === \"checkEncapsulated\") {\n\t\t\tif (\n\t\t\t\tisEncapsulatingCommandClass(this)\n\t\t\t\t&& isEncapsulatingCommandClass(received)\n\t\t\t) {\n\t\t\t\treturn this.encapsulated.isExpectedCCResponse(\n\t\t\t\t\treceived.encapsulated,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Fallback, should not happen if the expected response is defined correctly\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\t/**\n\t * Translates a property identifier into a speaking name for use in an external API\n\t * @param property The property identifier that should be translated\n\t * @param _propertyKey The (optional) property key the translated name may depend on\n\t */\n\tpublic translateProperty(\n\t\t_ctx: GetValueDB,\n\t\tproperty: string | number,\n\t\t_propertyKey?: string | number,\n\t): string {\n\t\t// Overwrite this in derived classes, by default just return the property key\n\t\treturn property.toString();\n\t}\n\n\t/**\n\t * Translates a property key into a speaking name for use in an external API\n\t * @param _property The property the key in question belongs to\n\t * @param propertyKey The property key for which the speaking name should be retrieved\n\t */\n\tpublic translatePropertyKey(\n\t\t_ctx: GetValueDB,\n\t\t_property: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\t// Overwrite this in derived classes, by default just return the property key\n\t\treturn propertyKey.toString();\n\t}\n\n\t/** Returns the number of bytes that are added to the payload by this CC */\n\tprotected computeEncapsulationOverhead(): number {\n\t\t// Default is ccId (+ ccCommand):\n\t\treturn (this.isExtended() ? 2 : 1) + 1;\n\t}\n\n\t/** Computes the maximum net payload size that can be transmitted inside this CC */\n\tpublic getMaxPayloadLength(baseLength: number): number {\n\t\tlet ret = baseLength;\n\t\tlet cur: CommandClass | undefined = this;\n\t\twhile (cur) {\n\t\t\tret -= cur.computeEncapsulationOverhead();\n\t\t\tcur = isEncapsulatingCommandClass(cur)\n\t\t\t\t? cur.encapsulated\n\t\t\t\t: undefined;\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/** Checks whether this CC is encapsulated with one that has the given CC id and (optionally) CC Command */\n\tpublic isEncapsulatedWith(\n\t\tccId: CommandClasses,\n\t\tccCommand?: number,\n\t): boolean {\n\t\tlet cc: CommandClass = this;\n\t\t// Check whether there was a S0 encapsulation\n\t\twhile (cc.encapsulatingCC) {\n\t\t\tcc = cc.encapsulatingCC;\n\t\t\tif (\n\t\t\t\tcc.ccId === ccId\n\t\t\t\t&& (ccCommand === undefined || cc.ccCommand === ccCommand)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/** Traverses the encapsulation stack of this CC outwards and returns the one that has the given CC id and (optionally) CC Command if that exists. */\n\tpublic getEncapsulatingCC(\n\t\tccId: CommandClasses,\n\t\tccCommand?: number,\n\t): CommandClass | undefined {\n\t\tlet cc: CommandClass = this;\n\t\twhile (cc.encapsulatingCC) {\n\t\t\tcc = cc.encapsulatingCC;\n\t\t\tif (\n\t\t\t\tcc.ccId === ccId\n\t\t\t\t&& (ccCommand === undefined || cc.ccCommand === ccCommand)\n\t\t\t) {\n\t\t\t\treturn cc;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Traverses the encapsulation stack of this CC inwards and returns the one that has the given CC id and (optionally) CC Command if that exists. */\n\tpublic getEncapsulatedCC(\n\t\tccId: CommandClasses,\n\t\tccCommand?: number,\n\t): CommandClass | undefined {\n\t\tconst predicate = (cc: CommandClass): boolean =>\n\t\t\tcc.ccId === ccId\n\t\t\t&& (ccCommand === undefined || cc.ccCommand === ccCommand);\n\n\t\tif (isEncapsulatingCommandClass(this)) {\n\t\t\tif (predicate(this.encapsulated)) return this.encapsulated;\n\t\t\treturn this.encapsulated.getEncapsulatedCC(ccId, ccCommand);\n\t\t} else if (isMultiEncapsulatingCommandClass(this)) {\n\t\t\tfor (const encapsulated of this.encapsulated) {\n\t\t\t\tif (predicate(encapsulated)) return encapsulated;\n\t\t\t\tconst ret = encapsulated.getEncapsulatedCC(ccId, ccCommand);\n\t\t\t\tif (ret) return ret;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport interface InvalidCCOptions extends CommandClassOptions {\n\tccName: string;\n\treason?: string | ZWaveErrorCodes;\n}\n\nexport class InvalidCC extends CommandClass {\n\tpublic constructor(options: InvalidCCOptions) {\n\t\tsuper(options);\n\t\tthis._ccName = options.ccName;\n\t\t// Numeric reasons are used internally to communicate problems with a CC\n\t\t// without ignoring them entirely\n\t\tthis.reason = options.reason;\n\t}\n\n\tprivate _ccName: string;\n\tpublic get ccName(): string {\n\t\treturn this._ccName;\n\t}\n\tpublic readonly reason?: string | ZWaveErrorCodes;\n\n\tpublic toLogEntry(_ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\ttags: [this.ccName, \"INVALID\"],\n\t\t\tmessage: this.reason != undefined\n\t\t\t\t? {\n\t\t\t\t\terror: typeof this.reason === \"string\"\n\t\t\t\t\t\t? this.reason\n\t\t\t\t\t\t: getEnumMemberName(\n\t\t\t\t\t\t\tZWaveErrorCodes,\n\t\t\t\t\t\t\tthis.reason,\n\t\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\t}\n}\n\nexport type CCConstructor<T extends CommandClass> = typeof CommandClass & {\n\t// I don't like the any, but we need it to support half-implemented CCs (e.g. report classes)\n\tnew (options: any): T;\n};\n\n/**\n * @publicAPI\n * May be used to define different expected CC responses depending on the sent CC\n */\nexport type DynamicCCResponse<\n\tTSent extends CommandClass,\n\tTReceived extends CommandClass = CommandClass,\n> = (\n\tsentCC: TSent,\n) => CCConstructor<TReceived> | CCConstructor<TReceived>[] | undefined;\n\n/** @publicAPI */\nexport type CCResponseRole =\n\t| boolean // The response was either expected or unexpected\n\t| \"checkEncapsulated\"; // The response role depends on the encapsulated CC\n\n/**\n * @publicAPI\n * A predicate function to test if a received CC matches the sent CC\n */\nexport type CCResponsePredicate<\n\tTSent extends CommandClass,\n\tTReceived extends CommandClass = CommandClass,\n> = (sentCommand: TSent, receivedCommand: TReceived) => CCResponseRole;\n"],
5
+ "mappings": "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",
6
+ "names": ["import_safe"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import { type CommandClasses } from "@zwave-js/core";
1
+ import { type CommandClasses } from "@zwave-js/core/safe";
2
2
  import type { TypedClassDecorator } from "@zwave-js/shared";
3
3
  import type { APIConstructor, CCAPI } from "./API.js";
4
4
  import { type CCConstructor, type CCResponsePredicate, type CommandClass, type DynamicCCResponse } from "./CommandClass.js";