@zwave-js/cc 15.25.1 → 15.25.3

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 (314) hide show
  1. package/build/cjs/cc/AlarmSensorCC.js +15 -17
  2. package/build/cjs/cc/AlarmSensorCC.js.map +2 -2
  3. package/build/cjs/cc/AssociationCC.d.ts +1 -1
  4. package/build/cjs/cc/AssociationCC.js +5 -2
  5. package/build/cjs/cc/AssociationCC.js.map +2 -2
  6. package/build/cjs/cc/AssociationGroupInfoCC.js +23 -18
  7. package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
  8. package/build/cjs/cc/BarrierOperatorCC.js +9 -7
  9. package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
  10. package/build/cjs/cc/BasicCC.js +3 -2
  11. package/build/cjs/cc/BasicCC.js.map +2 -2
  12. package/build/cjs/cc/BatteryCC.js +3 -2
  13. package/build/cjs/cc/BatteryCC.js.map +2 -2
  14. package/build/cjs/cc/BinarySensorCC.js +8 -6
  15. package/build/cjs/cc/BinarySensorCC.js.map +2 -2
  16. package/build/cjs/cc/BinarySwitchCC.js +3 -2
  17. package/build/cjs/cc/BinarySwitchCC.js.map +2 -2
  18. package/build/cjs/cc/CentralSceneCC.js +9 -7
  19. package/build/cjs/cc/CentralSceneCC.js.map +2 -2
  20. package/build/cjs/cc/ClockCC.js +3 -2
  21. package/build/cjs/cc/ClockCC.js.map +2 -2
  22. package/build/cjs/cc/ColorSwitchCC.js +9 -6
  23. package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
  24. package/build/cjs/cc/ConfigurationCC.js +27 -27
  25. package/build/cjs/cc/ConfigurationCC.js.map +2 -2
  26. package/build/cjs/cc/DoorLockCC.js +49 -63
  27. package/build/cjs/cc/DoorLockCC.js.map +2 -2
  28. package/build/cjs/cc/DoorLockLoggingCC.js +3 -2
  29. package/build/cjs/cc/DoorLockLoggingCC.js.map +2 -2
  30. package/build/cjs/cc/EnergyProductionCC.js +3 -2
  31. package/build/cjs/cc/EnergyProductionCC.js.map +2 -2
  32. package/build/cjs/cc/EntryControlCC.js +5 -3
  33. package/build/cjs/cc/EntryControlCC.js.map +2 -2
  34. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js +2 -1
  35. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +2 -2
  36. package/build/cjs/cc/HumidityControlModeCC.js +9 -8
  37. package/build/cjs/cc/HumidityControlModeCC.js.map +2 -2
  38. package/build/cjs/cc/HumidityControlOperatingStateCC.js +3 -2
  39. package/build/cjs/cc/HumidityControlOperatingStateCC.js.map +2 -2
  40. package/build/cjs/cc/HumidityControlSetpointCC.js +19 -17
  41. package/build/cjs/cc/HumidityControlSetpointCC.js.map +2 -2
  42. package/build/cjs/cc/IndicatorCC.js +5 -2
  43. package/build/cjs/cc/IndicatorCC.js.map +2 -2
  44. package/build/cjs/cc/IrrigationCC.js +26 -27
  45. package/build/cjs/cc/IrrigationCC.js.map +2 -2
  46. package/build/cjs/cc/LanguageCC.js +3 -2
  47. package/build/cjs/cc/LanguageCC.js.map +2 -2
  48. package/build/cjs/cc/LockCC.js +3 -2
  49. package/build/cjs/cc/LockCC.js.map +2 -2
  50. package/build/cjs/cc/ManufacturerSpecificCC.js +4 -1
  51. package/build/cjs/cc/ManufacturerSpecificCC.js.map +2 -2
  52. package/build/cjs/cc/MeterCC.js +14 -13
  53. package/build/cjs/cc/MeterCC.js.map +2 -2
  54. package/build/cjs/cc/MultiChannelAssociationCC.js +5 -2
  55. package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
  56. package/build/cjs/cc/MultiChannelCC.d.ts +1 -1
  57. package/build/cjs/cc/MultiChannelCC.js +19 -22
  58. package/build/cjs/cc/MultiChannelCC.js.map +2 -2
  59. package/build/cjs/cc/MultilevelSensorCC.js +13 -8
  60. package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
  61. package/build/cjs/cc/MultilevelSwitchCC.js +5 -3
  62. package/build/cjs/cc/MultilevelSwitchCC.js.map +2 -2
  63. package/build/cjs/cc/NodeNamingCC.js +3 -2
  64. package/build/cjs/cc/NodeNamingCC.js.map +2 -2
  65. package/build/cjs/cc/NotificationCC.js +11 -11
  66. package/build/cjs/cc/NotificationCC.js.map +2 -2
  67. package/build/cjs/cc/ProtectionCC.js +16 -15
  68. package/build/cjs/cc/ProtectionCC.js.map +2 -2
  69. package/build/cjs/cc/SceneControllerConfigurationCC.js +2 -1
  70. package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
  71. package/build/cjs/cc/ScheduleEntryLockCC.js +2 -1
  72. package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
  73. package/build/cjs/cc/Security2CC.js +15 -24
  74. package/build/cjs/cc/Security2CC.js.map +2 -2
  75. package/build/cjs/cc/SecurityCC.js +10 -17
  76. package/build/cjs/cc/SecurityCC.js.map +2 -2
  77. package/build/cjs/cc/SoundSwitchCC.js +2 -1
  78. package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
  79. package/build/cjs/cc/ThermostatFanModeCC.js +9 -7
  80. package/build/cjs/cc/ThermostatFanModeCC.js.map +2 -2
  81. package/build/cjs/cc/ThermostatFanStateCC.js +3 -2
  82. package/build/cjs/cc/ThermostatFanStateCC.js.map +2 -2
  83. package/build/cjs/cc/ThermostatModeCC.js +9 -7
  84. package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
  85. package/build/cjs/cc/ThermostatOperatingStateCC.js +4 -4
  86. package/build/cjs/cc/ThermostatOperatingStateCC.js.map +2 -2
  87. package/build/cjs/cc/ThermostatSetbackCC.js +3 -2
  88. package/build/cjs/cc/ThermostatSetbackCC.js.map +2 -2
  89. package/build/cjs/cc/ThermostatSetpointCC.js +9 -5
  90. package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
  91. package/build/cjs/cc/TimeCC.js +2 -1
  92. package/build/cjs/cc/TimeCC.js.map +2 -2
  93. package/build/cjs/cc/TimeParametersCC.js +2 -1
  94. package/build/cjs/cc/TimeParametersCC.js.map +2 -2
  95. package/build/cjs/cc/UserCodeCC.js +6 -6
  96. package/build/cjs/cc/UserCodeCC.js.map +2 -2
  97. package/build/cjs/cc/UserCredentialCC.js +5 -2
  98. package/build/cjs/cc/UserCredentialCC.js.map +2 -2
  99. package/build/cjs/cc/VersionCC.js +2 -1
  100. package/build/cjs/cc/VersionCC.js.map +2 -2
  101. package/build/cjs/cc/WakeUpCC.js +2 -1
  102. package/build/cjs/cc/WakeUpCC.js.map +2 -2
  103. package/build/cjs/cc/WindowCoveringCC.js +10 -7
  104. package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
  105. package/build/cjs/cc/ZWavePlusCC.js +2 -1
  106. package/build/cjs/cc/ZWavePlusCC.js.map +2 -2
  107. package/build/cjs/cc/_CCValues.generated.d.ts +4 -4
  108. package/build/cjs/cc/_CCValues.generated.js +2 -2
  109. package/build/cjs/cc/_CCValues.generated.js.map +1 -1
  110. package/build/cjs/cc/index.d.ts +3 -3
  111. package/build/cjs/cc/index.js.map +2 -2
  112. package/build/cjs/cc/manufacturerProprietary/Decorators.d.ts +1 -1
  113. package/build/cjs/cc/manufacturerProprietary/Decorators.js.map +2 -2
  114. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js +3 -2
  115. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +2 -2
  116. package/build/cjs/lib/API.js.map +2 -2
  117. package/build/cjs/lib/CommandClass.d.ts +5 -1
  118. package/build/cjs/lib/CommandClass.js +25 -3
  119. package/build/cjs/lib/CommandClass.js.map +2 -2
  120. package/build/cjs/lib/CommandClassDecorators.d.ts +4 -4
  121. package/build/cjs/lib/CommandClassDecorators.js.map +2 -2
  122. package/build/cjs/lib/Security2/Extension.d.ts +6 -4
  123. package/build/cjs/lib/Security2/Extension.js +22 -20
  124. package/build/cjs/lib/Security2/Extension.js.map +2 -2
  125. package/build/cjs/lib/_Types.js.map +1 -1
  126. package/build/cjs/lib/utils.js +14 -8
  127. package/build/cjs/lib/utils.js.map +2 -2
  128. package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
  129. package/build/esm/cc/AlarmSensorCC.js +14 -18
  130. package/build/esm/cc/AlarmSensorCC.js.map +1 -1
  131. package/build/esm/cc/AssociationCC.d.ts +1 -1
  132. package/build/esm/cc/AssociationCC.d.ts.map +1 -1
  133. package/build/esm/cc/AssociationCC.js +3 -0
  134. package/build/esm/cc/AssociationCC.js.map +1 -1
  135. package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
  136. package/build/esm/cc/AssociationGroupInfoCC.js +24 -22
  137. package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
  138. package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
  139. package/build/esm/cc/BarrierOperatorCC.js +8 -8
  140. package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
  141. package/build/esm/cc/BasicCC.d.ts.map +1 -1
  142. package/build/esm/cc/BasicCC.js +2 -1
  143. package/build/esm/cc/BasicCC.js.map +1 -1
  144. package/build/esm/cc/BatteryCC.d.ts.map +1 -1
  145. package/build/esm/cc/BatteryCC.js +2 -1
  146. package/build/esm/cc/BatteryCC.js.map +1 -1
  147. package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
  148. package/build/esm/cc/BinarySensorCC.js +7 -7
  149. package/build/esm/cc/BinarySensorCC.js.map +1 -1
  150. package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -1
  151. package/build/esm/cc/BinarySwitchCC.js +2 -1
  152. package/build/esm/cc/BinarySwitchCC.js.map +1 -1
  153. package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
  154. package/build/esm/cc/CentralSceneCC.js +9 -8
  155. package/build/esm/cc/CentralSceneCC.js.map +1 -1
  156. package/build/esm/cc/ClockCC.d.ts.map +1 -1
  157. package/build/esm/cc/ClockCC.js +2 -1
  158. package/build/esm/cc/ClockCC.js.map +1 -1
  159. package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
  160. package/build/esm/cc/ColorSwitchCC.js +8 -7
  161. package/build/esm/cc/ColorSwitchCC.js.map +1 -1
  162. package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
  163. package/build/esm/cc/ConfigurationCC.js +32 -29
  164. package/build/esm/cc/ConfigurationCC.js.map +1 -1
  165. package/build/esm/cc/DoorLockCC.d.ts.map +1 -1
  166. package/build/esm/cc/DoorLockCC.js +73 -74
  167. package/build/esm/cc/DoorLockCC.js.map +1 -1
  168. package/build/esm/cc/DoorLockLoggingCC.d.ts.map +1 -1
  169. package/build/esm/cc/DoorLockLoggingCC.js +2 -1
  170. package/build/esm/cc/DoorLockLoggingCC.js.map +1 -1
  171. package/build/esm/cc/EnergyProductionCC.d.ts.map +1 -1
  172. package/build/esm/cc/EnergyProductionCC.js +2 -1
  173. package/build/esm/cc/EnergyProductionCC.js.map +1 -1
  174. package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
  175. package/build/esm/cc/EntryControlCC.js +3 -1
  176. package/build/esm/cc/EntryControlCC.js.map +1 -1
  177. package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -1
  178. package/build/esm/cc/FirmwareUpdateMetaDataCC.js +1 -0
  179. package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
  180. package/build/esm/cc/HumidityControlModeCC.d.ts.map +1 -1
  181. package/build/esm/cc/HumidityControlModeCC.js +8 -9
  182. package/build/esm/cc/HumidityControlModeCC.js.map +1 -1
  183. package/build/esm/cc/HumidityControlOperatingStateCC.d.ts.map +1 -1
  184. package/build/esm/cc/HumidityControlOperatingStateCC.js +2 -1
  185. package/build/esm/cc/HumidityControlOperatingStateCC.js.map +1 -1
  186. package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -1
  187. package/build/esm/cc/HumidityControlSetpointCC.js +18 -23
  188. package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
  189. package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
  190. package/build/esm/cc/IndicatorCC.js +3 -0
  191. package/build/esm/cc/IndicatorCC.js.map +1 -1
  192. package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
  193. package/build/esm/cc/IrrigationCC.js +29 -24
  194. package/build/esm/cc/IrrigationCC.js.map +1 -1
  195. package/build/esm/cc/LanguageCC.d.ts.map +1 -1
  196. package/build/esm/cc/LanguageCC.js +2 -1
  197. package/build/esm/cc/LanguageCC.js.map +1 -1
  198. package/build/esm/cc/LockCC.d.ts.map +1 -1
  199. package/build/esm/cc/LockCC.js +2 -1
  200. package/build/esm/cc/LockCC.js.map +1 -1
  201. package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
  202. package/build/esm/cc/ManufacturerSpecificCC.js +4 -1
  203. package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
  204. package/build/esm/cc/MeterCC.d.ts.map +1 -1
  205. package/build/esm/cc/MeterCC.js +15 -19
  206. package/build/esm/cc/MeterCC.js.map +1 -1
  207. package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
  208. package/build/esm/cc/MultiChannelAssociationCC.js +3 -0
  209. package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
  210. package/build/esm/cc/MultiChannelCC.d.ts +1 -1
  211. package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
  212. package/build/esm/cc/MultiChannelCC.js +19 -23
  213. package/build/esm/cc/MultiChannelCC.js.map +1 -1
  214. package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
  215. package/build/esm/cc/MultilevelSensorCC.js +14 -19
  216. package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
  217. package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -1
  218. package/build/esm/cc/MultilevelSwitchCC.js +3 -1
  219. package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
  220. package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
  221. package/build/esm/cc/NodeNamingCC.js +2 -1
  222. package/build/esm/cc/NodeNamingCC.js.map +1 -1
  223. package/build/esm/cc/NotificationCC.d.ts.map +1 -1
  224. package/build/esm/cc/NotificationCC.js +11 -14
  225. package/build/esm/cc/NotificationCC.js.map +1 -1
  226. package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
  227. package/build/esm/cc/ProtectionCC.js +15 -22
  228. package/build/esm/cc/ProtectionCC.js.map +1 -1
  229. package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
  230. package/build/esm/cc/SceneControllerConfigurationCC.js +1 -0
  231. package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
  232. package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
  233. package/build/esm/cc/ScheduleEntryLockCC.js +1 -0
  234. package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
  235. package/build/esm/cc/Security2CC.d.ts.map +1 -1
  236. package/build/esm/cc/Security2CC.js +15 -32
  237. package/build/esm/cc/Security2CC.js.map +1 -1
  238. package/build/esm/cc/SecurityCC.d.ts.map +1 -1
  239. package/build/esm/cc/SecurityCC.js +10 -21
  240. package/build/esm/cc/SecurityCC.js.map +1 -1
  241. package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
  242. package/build/esm/cc/SoundSwitchCC.js +1 -0
  243. package/build/esm/cc/SoundSwitchCC.js.map +1 -1
  244. package/build/esm/cc/ThermostatFanModeCC.d.ts.map +1 -1
  245. package/build/esm/cc/ThermostatFanModeCC.js +8 -8
  246. package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
  247. package/build/esm/cc/ThermostatFanStateCC.d.ts.map +1 -1
  248. package/build/esm/cc/ThermostatFanStateCC.js +2 -1
  249. package/build/esm/cc/ThermostatFanStateCC.js.map +1 -1
  250. package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
  251. package/build/esm/cc/ThermostatModeCC.js +8 -8
  252. package/build/esm/cc/ThermostatModeCC.js.map +1 -1
  253. package/build/esm/cc/ThermostatOperatingStateCC.d.ts.map +1 -1
  254. package/build/esm/cc/ThermostatOperatingStateCC.js +4 -5
  255. package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -1
  256. package/build/esm/cc/ThermostatSetbackCC.d.ts.map +1 -1
  257. package/build/esm/cc/ThermostatSetbackCC.js +2 -1
  258. package/build/esm/cc/ThermostatSetbackCC.js.map +1 -1
  259. package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
  260. package/build/esm/cc/ThermostatSetpointCC.js +8 -9
  261. package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
  262. package/build/esm/cc/TimeCC.d.ts.map +1 -1
  263. package/build/esm/cc/TimeCC.js +1 -0
  264. package/build/esm/cc/TimeCC.js.map +1 -1
  265. package/build/esm/cc/TimeParametersCC.d.ts.map +1 -1
  266. package/build/esm/cc/TimeParametersCC.js +1 -0
  267. package/build/esm/cc/TimeParametersCC.js.map +1 -1
  268. package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
  269. package/build/esm/cc/UserCodeCC.js +5 -7
  270. package/build/esm/cc/UserCodeCC.js.map +1 -1
  271. package/build/esm/cc/UserCredentialCC.d.ts.map +1 -1
  272. package/build/esm/cc/UserCredentialCC.js +4 -1
  273. package/build/esm/cc/UserCredentialCC.js.map +1 -1
  274. package/build/esm/cc/VersionCC.d.ts.map +1 -1
  275. package/build/esm/cc/VersionCC.js +1 -0
  276. package/build/esm/cc/VersionCC.js.map +1 -1
  277. package/build/esm/cc/WakeUpCC.d.ts.map +1 -1
  278. package/build/esm/cc/WakeUpCC.js +1 -0
  279. package/build/esm/cc/WakeUpCC.js.map +1 -1
  280. package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
  281. package/build/esm/cc/WindowCoveringCC.js +9 -9
  282. package/build/esm/cc/WindowCoveringCC.js.map +1 -1
  283. package/build/esm/cc/ZWavePlusCC.d.ts.map +1 -1
  284. package/build/esm/cc/ZWavePlusCC.js +1 -0
  285. package/build/esm/cc/ZWavePlusCC.js.map +1 -1
  286. package/build/esm/cc/_CCValues.generated.d.ts +4 -4
  287. package/build/esm/cc/_CCValues.generated.js +2 -2
  288. package/build/esm/cc/_CCValues.generated.js.map +1 -1
  289. package/build/esm/cc/index.d.ts +3 -3
  290. package/build/esm/cc/index.d.ts.map +1 -1
  291. package/build/esm/cc/index.js.map +1 -1
  292. package/build/esm/cc/manufacturerProprietary/Decorators.d.ts +1 -1
  293. package/build/esm/cc/manufacturerProprietary/Decorators.d.ts.map +1 -1
  294. package/build/esm/cc/manufacturerProprietary/Decorators.js.map +1 -1
  295. package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts.map +1 -1
  296. package/build/esm/cc/manufacturerProprietary/FibaroCC.js +2 -1
  297. package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
  298. package/build/esm/lib/API.js.map +1 -1
  299. package/build/esm/lib/CommandClass.d.ts +5 -1
  300. package/build/esm/lib/CommandClass.d.ts.map +1 -1
  301. package/build/esm/lib/CommandClass.js +30 -4
  302. package/build/esm/lib/CommandClass.js.map +1 -1
  303. package/build/esm/lib/CommandClassDecorators.d.ts +4 -4
  304. package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -1
  305. package/build/esm/lib/CommandClassDecorators.js.map +1 -1
  306. package/build/esm/lib/Security2/Extension.d.ts +6 -4
  307. package/build/esm/lib/Security2/Extension.d.ts.map +1 -1
  308. package/build/esm/lib/Security2/Extension.js +23 -21
  309. package/build/esm/lib/Security2/Extension.js.map +1 -1
  310. package/build/esm/lib/_Types.js +1 -1
  311. package/build/esm/lib/utils.d.ts.map +1 -1
  312. package/build/esm/lib/utils.js +15 -9
  313. package/build/esm/lib/utils.js.map +1 -1
  314. package/package.json +7 -7
@@ -146,7 +146,8 @@ let AlarmSensorCC = (() => {
146
146
  return;
147
147
  }
148
148
  const api = import_API.CCAPI.create(import_core.CommandClasses["Alarm Sensor"], ctx, endpoint).withOptions({
149
- priority: import_core.MessagePriority.NodeQuery
149
+ priority: import_core.MessagePriority.NodeQuery,
150
+ tag: "interview"
150
151
  });
151
152
  ctx.logNode(node.id, {
152
153
  endpoint: this.endpointIndex,
@@ -160,11 +161,11 @@ let AlarmSensorCC = (() => {
160
161
  });
161
162
  const supportedSensorTypes = await api.getSupportedSensorTypes();
162
163
  if (supportedSensorTypes) {
163
- const logMessage = `received supported sensor types: ${supportedSensorTypes.map((type) => (0, import_shared.getEnumMemberName)(import_Types.AlarmSensorType, type)).map((name) => `
164
- \xB7 ${name}`).join("")}`;
165
164
  ctx.logNode(node.id, {
166
165
  endpoint: this.endpointIndex,
167
- message: logMessage,
166
+ message: (0, import_core.logText)("received supported sensor types:", {
167
+ nested: (0, import_core.logList)(supportedSensorTypes.map((type) => (0, import_shared.getEnumMemberName)(import_Types.AlarmSensorType, type)))
168
+ }),
168
169
  direction: "inbound"
169
170
  });
170
171
  } else {
@@ -175,14 +176,15 @@ let AlarmSensorCC = (() => {
175
176
  });
176
177
  return;
177
178
  }
178
- await this.refreshValues(ctx);
179
+ await this.refreshValues(ctx, { tag: "interview" });
179
180
  this.setInterviewComplete(ctx, true);
180
181
  }
181
182
  async refreshValues(ctx, options) {
182
183
  const node = this.getNode(ctx);
183
184
  const endpoint = this.getEndpoint(ctx);
184
185
  const api = import_API.CCAPI.create(import_core.CommandClasses["Alarm Sensor"], ctx, endpoint).withOptions({
185
- priority: options?.priority ?? import_core.MessagePriority.NodeQuery
186
+ priority: options?.priority ?? import_core.MessagePriority.NodeQuery,
187
+ tag: options?.tag
186
188
  });
187
189
  const supportedSensorTypes = this.getValue(ctx, import_CCValues_generated.AlarmSensorCCValues.supportedSensorTypes) ?? [];
188
190
  for (const type of supportedSensorTypes) {
@@ -196,19 +198,15 @@ let AlarmSensorCC = (() => {
196
198
  });
197
199
  const currentValue = await api.get(type);
198
200
  if (currentValue) {
199
- let message = `received current value for ${sensorName}:
200
- state: ${currentValue.state}`;
201
- if (currentValue.severity != void 0) {
202
- message += `
203
- severity: ${currentValue.severity}`;
204
- }
205
- if (currentValue.duration != void 0) {
206
- message += `
207
- duration: ${currentValue.duration}`;
208
- }
209
201
  ctx.logNode(node.id, {
210
202
  endpoint: this.endpointIndex,
211
- message,
203
+ message: (0, import_core.logText)(`received current value for ${sensorName}:`, {
204
+ nested: (0, import_core.logDict)({
205
+ state: currentValue.state,
206
+ severity: currentValue.severity,
207
+ duration: currentValue.duration
208
+ })
209
+ }),
212
210
  direction: "inbound"
213
211
  });
214
212
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src_gen/cc/AlarmSensorCC.ts"],
4
- "sourcesContent": ["import * as __validateArgs from \"./AlarmSensorCC._validateArgs.js\";\nconst { validateArgs_AlarmSensorCCAPI_get } = __validateArgs;\nimport { CommandClasses, type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, ValueMetadata, type WithAddress, ZWaveError, ZWaveErrorCodes, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, isEnumMember, pick } from \"@zwave-js/shared\";\nimport { CCAPI, PhysicalCCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { AlarmSensorCommand, AlarmSensorType } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { AlarmSensorCCValues } from \"./_CCValues.generated.js\";\nexport { AlarmSensorCCValues };\n// @noSetValueAPI This CC is read-only\n@API(CommandClasses[\"Alarm Sensor\"])\nexport class AlarmSensorCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: AlarmSensorCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case AlarmSensorCommand.Get:\n case AlarmSensorCommand.SupportedGet:\n return true; // This is mandatory\n }\n return super.supportsCommand(cmd);\n }\n /**\n * Retrieves the current value from this sensor\n * @param sensorType The (optional) sensor type to retrieve the value for\n */\n @validateArgs_AlarmSensorCCAPI_get()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async get(sensorType?: AlarmSensorType) {\n this.assertSupportsCommand(AlarmSensorCommand, AlarmSensorCommand.Get);\n const cc = new AlarmSensorCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n sensorType,\n });\n const response = await this.host.sendCommand<AlarmSensorCCReport>(cc, this.commandOptions);\n if (response)\n return pick(response, [\"state\", \"severity\", \"duration\"]);\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getSupportedSensorTypes() {\n this.assertSupportsCommand(AlarmSensorCommand, AlarmSensorCommand.SupportedGet);\n const cc = new AlarmSensorCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<AlarmSensorCCSupportedReport>(cc, this.commandOptions);\n if (response)\n return response.supportedSensorTypes;\n }\n}\n@commandClass(CommandClasses[\"Alarm Sensor\"])\n@implementedVersion(1)\n@ccValues(AlarmSensorCCValues)\nexport class AlarmSensorCC extends CommandClass {\n declare ccCommand: AlarmSensorCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n // Skip the interview in favor of Notification CC if possible,\n // but only if the device supports Notification CC v2+. Version 1\n // doesn't provide information about supported notification types,\n // so we still need to interview Alarm Sensor CC for those devices.\n if (endpoint.supportsCC(CommandClasses.Notification)\n && endpoint.getCCVersion(CommandClasses.Notification) >= 2) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `${this.constructor.name}: skipping interview because Notification CC is supported...`,\n direction: \"none\",\n });\n this.setInterviewComplete(ctx, true);\n return;\n }\n const api = CCAPI.create(CommandClasses[\"Alarm Sensor\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Find out which sensor types this sensor supports\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying supported sensor types...\",\n direction: \"outbound\",\n });\n const supportedSensorTypes = await api.getSupportedSensorTypes();\n if (supportedSensorTypes) {\n const logMessage = `received supported sensor types: ${supportedSensorTypes\n .map((type) => getEnumMemberName(AlarmSensorType, type))\n .map((name) => `\\n\u00B7 ${name}`)\n .join(\"\")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported sensor types timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n // Query (all of) the sensor's current value(s)\n await this.refreshValues(ctx);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Alarm Sensor\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n });\n const supportedSensorTypes: readonly AlarmSensorType[] = this.getValue(ctx, AlarmSensorCCValues.supportedSensorTypes)\n ?? [];\n // Always query (all of) the sensor's current value(s)\n for (const type of supportedSensorTypes) {\n // Some devices report invalid sensor types, but the CC API checks\n // for valid values and throws otherwise.\n if (!isEnumMember(AlarmSensorType, type))\n continue;\n const sensorName = getEnumMemberName(AlarmSensorType, type);\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying current value for ${sensorName}...`,\n direction: \"outbound\",\n });\n const currentValue = await api.get(type);\n if (currentValue) {\n let message = `received current value for ${sensorName}: \nstate: ${currentValue.state}`;\n if (currentValue.severity != undefined) {\n message += `\nseverity: ${currentValue.severity}`;\n }\n if (currentValue.duration != undefined) {\n message += `\nduration: ${currentValue.duration}`;\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message,\n direction: \"inbound\",\n });\n }\n }\n }\n /**\n * Returns which sensor types are supported.\n * This only works AFTER the interview process\n */\n public static getSupportedSensorTypesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<AlarmSensorType[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(AlarmSensorCCValues.supportedSensorTypes.endpoint(endpoint.index));\n }\n protected createMetadataForSensorType(ctx: GetValueDB, sensorType: AlarmSensorType): void {\n const stateValue = AlarmSensorCCValues.state(sensorType);\n const severityValue = AlarmSensorCCValues.severity(sensorType);\n const durationValue = AlarmSensorCCValues.duration(sensorType);\n // Always create metadata if it does not exist\n this.ensureMetadata(ctx, stateValue);\n this.ensureMetadata(ctx, severityValue);\n this.ensureMetadata(ctx, durationValue);\n }\n}\n// @publicAPI\nexport interface AlarmSensorCCReportOptions {\n sensorType: AlarmSensorType;\n state: boolean;\n severity?: number;\n duration?: number;\n}\n@CCCommand(AlarmSensorCommand.Report)\nexport class AlarmSensorCCReport extends AlarmSensorCC {\n public constructor(options: WithAddress<AlarmSensorCCReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.sensorType = options.sensorType;\n this.state = options.state;\n this.severity = options.severity;\n this.duration = options.duration;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AlarmSensorCCReport {\n validatePayload(raw.payload.length >= 5, raw.payload[1] !== 0xff);\n const sourceNodeId = raw.payload[0];\n const sensorType: AlarmSensorType = raw.payload[1];\n // Any positive value gets interpreted as alarm\n const state: boolean = raw.payload[2] > 0;\n // Severity only ranges from 1 to 100\n let severity: number | undefined;\n if (raw.payload[2] > 0 && raw.payload[2] <= 0x64) {\n severity = raw.payload[2];\n }\n // ignore zero durations\n const duration = raw.payload.readUInt16BE(3) || undefined;\n return new this({\n // Alarm Sensor reports may be forwarded by a different node, in this case\n // (and only then!) the payload contains the original node ID\n nodeId: sourceNodeId || ctx.sourceNodeId,\n sensorType,\n state,\n severity,\n duration,\n });\n }\n public readonly sensorType: AlarmSensorType;\n public readonly state: boolean;\n public readonly severity: number | undefined;\n public readonly duration: number | undefined;\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"sensor type\": getEnumMemberName(AlarmSensorType, this.sensorType),\n \"alarm state\": this.state,\n };\n if (this.severity != undefined) {\n message.severity = this.severity;\n }\n if (this.duration != undefined) {\n message.duration = `${this.duration} seconds`;\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // Create metadata if it does not exist\n this.createMetadataForSensorType(ctx, this.sensorType);\n const stateValue = AlarmSensorCCValues.state(this.sensorType);\n const severityValue = AlarmSensorCCValues.severity(this.sensorType);\n const durationValue = AlarmSensorCCValues.duration(this.sensorType);\n this.setValue(ctx, stateValue, this.state);\n this.setValue(ctx, severityValue, this.severity);\n this.setValue(ctx, durationValue, this.duration);\n return true;\n }\n}\nfunction testResponseForAlarmSensorGet(sent: AlarmSensorCCGet, received: AlarmSensorCCReport) {\n // We expect a Alarm Sensor Report that matches the requested sensor type (if a type was requested)\n return (sent.sensorType === AlarmSensorType.Any\n || received.sensorType === sent.sensorType);\n}\n// @publicAPI\nexport interface AlarmSensorCCGetOptions {\n sensorType?: AlarmSensorType;\n}\n@CCCommand(AlarmSensorCommand.Get)\n@expectedCCResponse(AlarmSensorCCReport, testResponseForAlarmSensorGet)\nexport class AlarmSensorCCGet extends AlarmSensorCC {\n public constructor(options: WithAddress<AlarmSensorCCGetOptions>) {\n super(options);\n this.sensorType = options.sensorType ?? AlarmSensorType.Any;\n }\n public static from(_raw: CCRaw, _ctx: CCParsingContext): AlarmSensorCCGet {\n // TODO: Deserialize payload\n throw new ZWaveError(`${this.name}: deserialization not implemented`, ZWaveErrorCodes.Deserialization_NotImplemented);\n // return new AlarmSensorCCGet({\n // \tnodeId: ctx.sourceNodeId,\n // });\n }\n public sensorType: AlarmSensorType;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.sensorType]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"sensor type\": getEnumMemberName(AlarmSensorType, this.sensorType),\n },\n };\n }\n}\n// @publicAPI\nexport interface AlarmSensorCCSupportedReportOptions {\n supportedSensorTypes: AlarmSensorType[];\n}\n@CCCommand(AlarmSensorCommand.SupportedReport)\n@ccValueProperty(\"supportedSensorTypes\", AlarmSensorCCValues.supportedSensorTypes)\nexport class AlarmSensorCCSupportedReport extends AlarmSensorCC {\n public constructor(options: WithAddress<AlarmSensorCCSupportedReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.supportedSensorTypes = options.supportedSensorTypes;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AlarmSensorCCSupportedReport {\n validatePayload(raw.payload.length >= 1);\n const bitMaskLength = raw.payload[0];\n validatePayload(raw.payload.length >= 1 + bitMaskLength);\n const supportedSensorTypes: AlarmSensorType[] = parseBitMask(raw.payload.subarray(1, 1 + bitMaskLength), AlarmSensorType[\"General Purpose\"]);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedSensorTypes,\n });\n }\n public supportedSensorTypes: AlarmSensorType[];\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // Create metadata for each sensor type\n for (const type of this.supportedSensorTypes) {\n this.createMetadataForSensorType(ctx, type);\n }\n return true;\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported sensor types\": this.supportedSensorTypes\n .map((t) => getEnumMemberName(AlarmSensorType, t))\n .join(\", \"),\n },\n };\n }\n}\n@CCCommand(AlarmSensorCommand.SupportedGet)\n@expectedCCResponse(AlarmSensorCCSupportedReport)\nexport class AlarmSensorCCSupportedGet extends AlarmSensorCC {\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as __validateArgs from \"./AlarmSensorCC._validateArgs.js\";\nconst { validateArgs_AlarmSensorCCAPI_get } = __validateArgs;\nimport { CommandClasses, type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, ValueMetadata, type WithAddress, ZWaveError, ZWaveErrorCodes, logDict, logList, logText, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, isEnumMember, pick } from \"@zwave-js/shared\";\nimport { CCAPI, PhysicalCCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { AlarmSensorCommand, AlarmSensorType } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { AlarmSensorCCValues } from \"./_CCValues.generated.js\";\nexport { AlarmSensorCCValues };\n// @noSetValueAPI This CC is read-only\n@API(CommandClasses[\"Alarm Sensor\"])\nexport class AlarmSensorCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: AlarmSensorCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case AlarmSensorCommand.Get:\n case AlarmSensorCommand.SupportedGet:\n return true; // This is mandatory\n }\n return super.supportsCommand(cmd);\n }\n /**\n * Retrieves the current value from this sensor\n * @param sensorType The (optional) sensor type to retrieve the value for\n */\n @validateArgs_AlarmSensorCCAPI_get()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async get(sensorType?: AlarmSensorType) {\n this.assertSupportsCommand(AlarmSensorCommand, AlarmSensorCommand.Get);\n const cc = new AlarmSensorCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n sensorType,\n });\n const response = await this.host.sendCommand<AlarmSensorCCReport>(cc, this.commandOptions);\n if (response)\n return pick(response, [\"state\", \"severity\", \"duration\"]);\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getSupportedSensorTypes() {\n this.assertSupportsCommand(AlarmSensorCommand, AlarmSensorCommand.SupportedGet);\n const cc = new AlarmSensorCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<AlarmSensorCCSupportedReport>(cc, this.commandOptions);\n if (response)\n return response.supportedSensorTypes;\n }\n}\n@commandClass(CommandClasses[\"Alarm Sensor\"])\n@implementedVersion(1)\n@ccValues(AlarmSensorCCValues)\nexport class AlarmSensorCC extends CommandClass {\n declare ccCommand: AlarmSensorCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n // Skip the interview in favor of Notification CC if possible,\n // but only if the device supports Notification CC v2+. Version 1\n // doesn't provide information about supported notification types,\n // so we still need to interview Alarm Sensor CC for those devices.\n if (endpoint.supportsCC(CommandClasses.Notification)\n && endpoint.getCCVersion(CommandClasses.Notification) >= 2) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `${this.constructor.name}: skipping interview because Notification CC is supported...`,\n direction: \"none\",\n });\n this.setInterviewComplete(ctx, true);\n return;\n }\n const api = CCAPI.create(CommandClasses[\"Alarm Sensor\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Find out which sensor types this sensor supports\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying supported sensor types...\",\n direction: \"outbound\",\n });\n const supportedSensorTypes = await api.getSupportedSensorTypes();\n if (supportedSensorTypes) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received supported sensor types:\", {\n nested: logList(supportedSensorTypes.map((type) => getEnumMemberName(AlarmSensorType, type))),\n }),\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported sensor types timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n // Query (all of) the sensor's current value(s)\n await this.refreshValues(ctx, { tag: \"interview\" });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Alarm Sensor\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const supportedSensorTypes: readonly AlarmSensorType[] = this.getValue(ctx, AlarmSensorCCValues.supportedSensorTypes)\n ?? [];\n // Always query (all of) the sensor's current value(s)\n for (const type of supportedSensorTypes) {\n // Some devices report invalid sensor types, but the CC API checks\n // for valid values and throws otherwise.\n if (!isEnumMember(AlarmSensorType, type))\n continue;\n const sensorName = getEnumMemberName(AlarmSensorType, type);\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying current value for ${sensorName}...`,\n direction: \"outbound\",\n });\n const currentValue = await api.get(type);\n if (currentValue) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(`received current value for ${sensorName}:`, {\n nested: logDict({\n state: currentValue.state,\n severity: currentValue.severity,\n duration: currentValue.duration,\n }),\n }),\n direction: \"inbound\",\n });\n }\n }\n }\n /**\n * Returns which sensor types are supported.\n * This only works AFTER the interview process\n */\n public static getSupportedSensorTypesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<AlarmSensorType[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(AlarmSensorCCValues.supportedSensorTypes.endpoint(endpoint.index));\n }\n protected createMetadataForSensorType(ctx: GetValueDB, sensorType: AlarmSensorType): void {\n const stateValue = AlarmSensorCCValues.state(sensorType);\n const severityValue = AlarmSensorCCValues.severity(sensorType);\n const durationValue = AlarmSensorCCValues.duration(sensorType);\n // Always create metadata if it does not exist\n this.ensureMetadata(ctx, stateValue);\n this.ensureMetadata(ctx, severityValue);\n this.ensureMetadata(ctx, durationValue);\n }\n}\n// @publicAPI\nexport interface AlarmSensorCCReportOptions {\n sensorType: AlarmSensorType;\n state: boolean;\n severity?: number;\n duration?: number;\n}\n@CCCommand(AlarmSensorCommand.Report)\nexport class AlarmSensorCCReport extends AlarmSensorCC {\n public constructor(options: WithAddress<AlarmSensorCCReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.sensorType = options.sensorType;\n this.state = options.state;\n this.severity = options.severity;\n this.duration = options.duration;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AlarmSensorCCReport {\n validatePayload(raw.payload.length >= 5, raw.payload[1] !== 0xff);\n const sourceNodeId = raw.payload[0];\n const sensorType: AlarmSensorType = raw.payload[1];\n // Any positive value gets interpreted as alarm\n const state: boolean = raw.payload[2] > 0;\n // Severity only ranges from 1 to 100\n let severity: number | undefined;\n if (raw.payload[2] > 0 && raw.payload[2] <= 0x64) {\n severity = raw.payload[2];\n }\n // ignore zero durations\n const duration = raw.payload.readUInt16BE(3) || undefined;\n return new this({\n // Alarm Sensor reports may be forwarded by a different node, in this case\n // (and only then!) the payload contains the original node ID\n nodeId: sourceNodeId || ctx.sourceNodeId,\n sensorType,\n state,\n severity,\n duration,\n });\n }\n public readonly sensorType: AlarmSensorType;\n public readonly state: boolean;\n public readonly severity: number | undefined;\n public readonly duration: number | undefined;\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"sensor type\": getEnumMemberName(AlarmSensorType, this.sensorType),\n \"alarm state\": this.state,\n };\n if (this.severity != undefined) {\n message.severity = this.severity;\n }\n if (this.duration != undefined) {\n message.duration = `${this.duration} seconds`;\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // Create metadata if it does not exist\n this.createMetadataForSensorType(ctx, this.sensorType);\n const stateValue = AlarmSensorCCValues.state(this.sensorType);\n const severityValue = AlarmSensorCCValues.severity(this.sensorType);\n const durationValue = AlarmSensorCCValues.duration(this.sensorType);\n this.setValue(ctx, stateValue, this.state);\n this.setValue(ctx, severityValue, this.severity);\n this.setValue(ctx, durationValue, this.duration);\n return true;\n }\n}\nfunction testResponseForAlarmSensorGet(sent: AlarmSensorCCGet, received: AlarmSensorCCReport) {\n // We expect a Alarm Sensor Report that matches the requested sensor type (if a type was requested)\n return (sent.sensorType === AlarmSensorType.Any\n || received.sensorType === sent.sensorType);\n}\n// @publicAPI\nexport interface AlarmSensorCCGetOptions {\n sensorType?: AlarmSensorType;\n}\n@CCCommand(AlarmSensorCommand.Get)\n@expectedCCResponse(AlarmSensorCCReport, testResponseForAlarmSensorGet)\nexport class AlarmSensorCCGet extends AlarmSensorCC {\n public constructor(options: WithAddress<AlarmSensorCCGetOptions>) {\n super(options);\n this.sensorType = options.sensorType ?? AlarmSensorType.Any;\n }\n public static from(_raw: CCRaw, _ctx: CCParsingContext): AlarmSensorCCGet {\n // TODO: Deserialize payload\n throw new ZWaveError(`${this.name}: deserialization not implemented`, ZWaveErrorCodes.Deserialization_NotImplemented);\n // return new AlarmSensorCCGet({\n // \tnodeId: ctx.sourceNodeId,\n // });\n }\n public sensorType: AlarmSensorType;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.sensorType]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"sensor type\": getEnumMemberName(AlarmSensorType, this.sensorType),\n },\n };\n }\n}\n// @publicAPI\nexport interface AlarmSensorCCSupportedReportOptions {\n supportedSensorTypes: AlarmSensorType[];\n}\n@CCCommand(AlarmSensorCommand.SupportedReport)\n@ccValueProperty(\"supportedSensorTypes\", AlarmSensorCCValues.supportedSensorTypes)\nexport class AlarmSensorCCSupportedReport extends AlarmSensorCC {\n public constructor(options: WithAddress<AlarmSensorCCSupportedReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.supportedSensorTypes = options.supportedSensorTypes;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AlarmSensorCCSupportedReport {\n validatePayload(raw.payload.length >= 1);\n const bitMaskLength = raw.payload[0];\n validatePayload(raw.payload.length >= 1 + bitMaskLength);\n const supportedSensorTypes: AlarmSensorType[] = parseBitMask(raw.payload.subarray(1, 1 + bitMaskLength), AlarmSensorType[\"General Purpose\"]);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedSensorTypes,\n });\n }\n public supportedSensorTypes: AlarmSensorType[];\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // Create metadata for each sensor type\n for (const type of this.supportedSensorTypes) {\n this.createMetadataForSensorType(ctx, type);\n }\n return true;\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported sensor types\": this.supportedSensorTypes\n .map((t) => getEnumMemberName(AlarmSensorType, t))\n .join(\", \"),\n },\n };\n }\n}\n@CCCommand(AlarmSensorCommand.SupportedGet)\n@expectedCCResponse(AlarmSensorCCSupportedReport)\nexport class AlarmSensorCCSupportedGet extends AlarmSensorCC {\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -78,7 +78,7 @@ export declare class AssociationCCSet extends AssociationCC {
78
78
  toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
79
79
  }
80
80
  export interface AssociationCCRemoveOptions {
81
- /** The group from which to remove the nodes. If none is specified, the nodes will be removed from all nodes. */
81
+ /** The group from which to remove the nodes. If none is specified, the nodes will be removed from all groups. */
82
82
  groupId?: number;
83
83
  /** The nodes to remove. If none are specified, ALL nodes will be removed. */
84
84
  nodeIds?: number[];
@@ -305,7 +305,8 @@ let AssociationCC = (() => {
305
305
  const node = this.getNode(ctx);
306
306
  const endpoint = this.getEndpoint(ctx);
307
307
  const api = import_API.CCAPI.create(import_core.CommandClasses.Association, ctx, endpoint).withOptions({
308
- priority: import_core.MessagePriority.NodeQuery
308
+ priority: import_core.MessagePriority.NodeQuery,
309
+ tag: "interview"
309
310
  });
310
311
  ctx.logNode(node.id, {
311
312
  endpoint: this.endpointIndex,
@@ -333,6 +334,7 @@ let AssociationCC = (() => {
333
334
  return;
334
335
  }
335
336
  await this.refreshValues(ctx, {
337
+ tag: "interview",
336
338
  onProgress: /* @__PURE__ */ __name((completed, total) => node.reportInterviewProgress(completed, total), "onProgress")
337
339
  });
338
340
  if (endpoint.supportsCC(import_core.CommandClasses["Multi Channel Association"])) {
@@ -351,7 +353,8 @@ let AssociationCC = (() => {
351
353
  const node = this.getNode(ctx);
352
354
  const endpoint = this.getEndpoint(ctx);
353
355
  const api = import_API.CCAPI.create(import_core.CommandClasses.Association, ctx, endpoint).withOptions({
354
- priority: options?.priority ?? import_core.MessagePriority.NodeQuery
356
+ priority: options?.priority ?? import_core.MessagePriority.NodeQuery,
357
+ tag: options?.tag
355
358
  });
356
359
  const groupCount = AssociationCC2.getGroupCountCached(ctx, endpoint);
357
360
  for (let groupId = 1; groupId <= groupCount; groupId++) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src_gen/cc/AssociationCC.ts"],
4
- "sourcesContent": ["import * as __validateArgs from \"./AssociationCC._validateArgs.js\";\nconst { validateArgs_AssociationCCAPI_reportGroupCount, validateArgs_AssociationCCAPI_getGroup, validateArgs_AssociationCCAPI_sendReport, validateArgs_AssociationCCAPI_addNodeIds, validateArgs_AssociationCCAPI_removeNodeIds, validateArgs_AssociationCCAPI_removeNodeIdsFromAllGroups, validateArgs_AssociationCCAPI_getSpecificGroup, validateArgs_AssociationCCAPI_reportSpecificGroup } = __validateArgs;\nimport type { GetDeviceConfig } from \"@zwave-js/config\";\nimport { CommandClasses, type EndpointId, type GetValueDB, MAX_NODES, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, type WithAddress, ZWaveError, ZWaveErrorCodes, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { CCAPI, PhysicalCCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type RefreshValuesContext, type RefreshValuesOptions, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { type AssociationAddress, AssociationCommand } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport * as ccUtils from \"../lib/utils.js\";\nimport { AssociationCCValues } from \"./_CCValues.generated.js\";\nexport { AssociationCCValues };\n// @noSetValueAPI\n@API(CommandClasses.Association)\nexport class AssociationCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: AssociationCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case AssociationCommand.Get:\n case AssociationCommand.Set:\n case AssociationCommand.Report:\n case AssociationCommand.Remove:\n case AssociationCommand.SupportedGroupingsGet:\n case AssociationCommand.SupportedGroupingsReport:\n return true;\n case AssociationCommand.SpecificGroupGet:\n case AssociationCommand.SpecificGroupReport:\n return this.version >= 2;\n }\n return super.supportsCommand(cmd);\n }\n /**\n * Returns the number of association groups a node supports.\n * Association groups are consecutive, starting at 1.\n */\n public async getGroupCount(): Promise<MaybeNotKnown<number>> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.SupportedGroupingsGet);\n const cc = new AssociationCCSupportedGroupingsGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<AssociationCCSupportedGroupingsReport>(cc, this.commandOptions);\n if (response)\n return response.groupCount;\n }\n @validateArgs_AssociationCCAPI_reportGroupCount()\n public async reportGroupCount(groupCount: number): Promise<void> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.SupportedGroupingsReport);\n const cc = new AssociationCCSupportedGroupingsReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupCount,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Returns information about an association group.\n */\n @validateArgs_AssociationCCAPI_getGroup()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getGroup(groupId: number) {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Get);\n const cc = new AssociationCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupId,\n });\n const response = await this.host.sendCommand<AssociationCCReport>(cc, this.commandOptions);\n if (response) {\n return {\n maxNodes: response.maxNodes,\n nodeIds: response.nodeIds,\n };\n }\n }\n @validateArgs_AssociationCCAPI_sendReport()\n public async sendReport(options: AssociationCCReportOptions): Promise<void> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Report);\n const cc = new AssociationCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Adds new nodes to an association group\n */\n @validateArgs_AssociationCCAPI_addNodeIds()\n public async addNodeIds(groupId: number, ...nodeIds: number[]): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Set);\n const cc = new AssociationCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupId,\n nodeIds,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Removes nodes from an association group\n */\n @validateArgs_AssociationCCAPI_removeNodeIds()\n public async removeNodeIds(options: AssociationCCRemoveOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Remove);\n // Validate options\n if (!options.groupId) {\n if (this.version === 1) {\n throw new ZWaveError(`Node ${this.endpoint.nodeId} only supports AssociationCC V1 which requires the group Id to be set`, ZWaveErrorCodes.Argument_Invalid);\n }\n }\n else if (options.groupId < 0) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n const cc = new AssociationCCRemove({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Removes nodes from all association groups\n */\n @validateArgs_AssociationCCAPI_removeNodeIdsFromAllGroups()\n public async removeNodeIdsFromAllGroups(nodeIds: number[]): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Remove);\n if (this.version >= 2) {\n // The node supports bulk removal\n return this.removeNodeIds({ nodeIds, groupId: 0 });\n }\n else {\n // We have to remove the node manually from all groups\n const groupCount = this.tryGetValueDB()?.getValue<number>(AssociationCCValues.groupCount.endpoint(this.endpoint.index)) ?? 0;\n for (let groupId = 1; groupId <= groupCount; groupId++) {\n // TODO: evaluate intermediate supervision results\n await this.removeNodeIds({ nodeIds, groupId });\n }\n }\n }\n /**\n * Request the association group that represents the most recently detected button press\n */\n @validateArgs_AssociationCCAPI_getSpecificGroup()\n public async getSpecificGroup(): Promise<number | undefined> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.SpecificGroupGet);\n const cc = new AssociationCCSpecificGroupGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<AssociationCCSpecificGroupReport>(cc, this.commandOptions);\n return response?.group;\n }\n /**\n * Report the association group that represents the most recently detected button press\n */\n @validateArgs_AssociationCCAPI_reportSpecificGroup()\n public async reportSpecificGroup(group: number): Promise<void> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.SpecificGroupReport);\n const cc = new AssociationCCSpecificGroupReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n group,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n}\n@commandClass(CommandClasses.Association)\n@implementedVersion(4)\n@ccValues(AssociationCCValues)\nexport class AssociationCC extends CommandClass {\n declare ccCommand: AssociationCommand;\n public determineRequiredCCInterviews(): readonly CommandClasses[] {\n // AssociationCC must be interviewed after Z-Wave+ if that is supported\n return [\n ...super.determineRequiredCCInterviews(),\n CommandClasses[\"Z-Wave Plus Info\"],\n // We need information about endpoints to correctly configure the lifeline associations\n CommandClasses[\"Multi Channel\"],\n ];\n }\n /**\n * Returns the number of association groups reported by the node/endpoint.\n * This only works AFTER the interview process\n */\n public static getGroupCountCached(ctx: GetValueDB, endpoint: EndpointId): number {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(AssociationCCValues.groupCount.endpoint(endpoint.index)) || 0;\n }\n /**\n * Returns the number of nodes an association group supports.\n * This only works AFTER the interview process\n */\n public static getMaxNodesCached(ctx: GetValueDB & GetDeviceConfig, endpoint: EndpointId, groupId: number): number {\n return (ctx\n .getValueDB(endpoint.nodeId)\n .getValue(AssociationCCValues.maxNodes(groupId).endpoint(endpoint.index))\n // If the information is not available, fall back to the configuration file if possible\n // This can happen on some legacy devices which have \"hidden\" association groups\n ?? ctx\n .getDeviceConfig?.(endpoint.nodeId)\n ?.getAssociationConfigForEndpoint(endpoint.index, groupId)\n ?.maxNodes\n ?? 0);\n }\n /**\n * Returns all the destinations of all association groups reported by the node/endpoint.\n * This only works AFTER the interview process\n */\n public static getAllDestinationsCached(ctx: GetValueDB, endpoint: EndpointId): ReadonlyMap<number, readonly AssociationAddress[]> {\n const ret = new Map<number, AssociationAddress[]>();\n const groupCount = this.getGroupCountCached(ctx, endpoint);\n const valueDB = ctx.getValueDB(endpoint.nodeId);\n for (let i = 1; i <= groupCount; i++) {\n // Add all root destinations\n const nodes = valueDB.getValue<number[]>(AssociationCCValues.nodeIds(i).endpoint(endpoint.index)) ?? [];\n ret.set(i, \n // Filter out duplicates\n distinct(nodes).map((nodeId) => ({ nodeId })));\n }\n return ret;\n }\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses.Association, ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Even if Multi Channel Association is supported, we still need to query the number of\n // normal association groups since some devices report more association groups than\n // multi channel association groups\n // Find out how many groups are supported\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying number of association groups...\",\n direction: \"outbound\",\n });\n const groupCount = await api.getGroupCount();\n if (groupCount != undefined) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `supports ${groupCount} association groups`,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying association groups timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n // Query each association group for its members\n await this.refreshValues(ctx, {\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // Skip the remaining Association CC interview in favor of Multi Channel Association if possible\n if (endpoint.supportsCC(CommandClasses[\"Multi Channel Association\"])) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `${this.constructor.name}: delaying configuration of lifeline associations until after Multi Channel Association interview...`,\n direction: \"none\",\n });\n this.setInterviewComplete(ctx, true);\n return;\n }\n // And set up lifeline associations\n await ccUtils.configureLifelineAssociations(ctx, endpoint);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses.Association, ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n });\n const groupCount = AssociationCC.getGroupCountCached(ctx, endpoint);\n // Query each association group\n for (let groupId = 1; groupId <= groupCount; groupId++) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying association group #${groupId}...`,\n direction: \"outbound\",\n });\n const group = await api.getGroup(groupId);\n if (group != undefined) {\n const logMessage = `received information for association group #${groupId}:\nmaximum # of nodes: ${group.maxNodes}\ncurrently assigned nodes: ${group.nodeIds.map(String).join(\", \")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n options?.onProgress?.(groupId, groupCount);\n }\n }\n}\n// @publicAPI\nexport interface AssociationCCSetOptions {\n groupId: number;\n nodeIds: number[];\n}\n@CCCommand(AssociationCommand.Set)\n@useSupervision()\nexport class AssociationCCSet extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCSetOptions>) {\n super(options);\n if (options.groupId < 1) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n if (options.nodeIds.some((n) => n < 1 || n > MAX_NODES)) {\n throw new ZWaveError(`All node IDs must be between 1 and ${MAX_NODES}!`, ZWaveErrorCodes.Argument_Invalid);\n }\n this.groupId = options.groupId;\n this.nodeIds = options.nodeIds;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCSet {\n validatePayload(raw.payload.length >= 2);\n const groupId = raw.payload[0];\n const nodeIds = [...raw.payload.subarray(1)];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n nodeIds,\n });\n }\n public groupId: number;\n public nodeIds: number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupId, ...this.nodeIds]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"group id\": this.groupId || \"all groups\",\n \"node ids\": this.nodeIds.length\n ? this.nodeIds.join(\", \")\n : \"all nodes\",\n };\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface AssociationCCRemoveOptions {\n /** The group from which to remove the nodes. If none is specified, the nodes will be removed from all nodes. */\n groupId?: number;\n /** The nodes to remove. If none are specified, ALL nodes will be removed. */\n nodeIds?: number[];\n}\n@CCCommand(AssociationCommand.Remove)\n@useSupervision()\nexport class AssociationCCRemove extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCRemoveOptions>) {\n super(options);\n // When removing associations, we allow invalid node IDs.\n // See GH#3606 - it is possible that those exist.\n this.groupId = options.groupId;\n this.nodeIds = options.nodeIds;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCRemove {\n validatePayload(raw.payload.length >= 1);\n let groupId: number | undefined;\n if (raw.payload[0] !== 0) {\n groupId = raw.payload[0];\n }\n const nodeIds = [...raw.payload.subarray(1)];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n nodeIds,\n });\n }\n public groupId?: number;\n public nodeIds?: number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n this.groupId || 0,\n ...(this.nodeIds || []),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"group id\": this.groupId || \"all groups\",\n \"node ids\": this.nodeIds && this.nodeIds.length\n ? this.nodeIds.join(\", \")\n : \"all nodes\",\n };\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface AssociationCCReportOptions {\n groupId: number;\n maxNodes: number;\n nodeIds: number[];\n reportsToFollow: number;\n}\n@CCCommand(AssociationCommand.Report)\n@ccValueProperty(\"maxNodes\", AssociationCCValues.maxNodes, (self) => [self.groupId])\n@ccValueProperty(\"nodeIds\", AssociationCCValues.nodeIds, (self) => [self.groupId])\nexport class AssociationCCReport extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCReportOptions>) {\n super(options);\n this.groupId = options.groupId;\n this.maxNodes = options.maxNodes;\n this.nodeIds = options.nodeIds;\n this.reportsToFollow = options.reportsToFollow;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCReport {\n validatePayload(raw.payload.length >= 3);\n const groupId = raw.payload[0];\n const maxNodes = raw.payload[1];\n const reportsToFollow = raw.payload[2];\n const nodeIds = [...raw.payload.subarray(3)];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n maxNodes,\n reportsToFollow,\n nodeIds,\n });\n }\n public groupId: number;\n public maxNodes: number;\n public nodeIds: number[];\n public reportsToFollow: number;\n public getPartialCCSessionId(): Record<string, any> | undefined {\n // Distinguish sessions by the association group ID\n return { groupId: this.groupId };\n }\n public getRemainingSegments(): number | undefined {\n return this.reportsToFollow;\n }\n public mergePartialCCs(partials: AssociationCCReport[], _ctx: CCParsingContext): Promise<void> {\n // Concat the list of nodes\n this.nodeIds = [...partials, this]\n .map((report) => report.nodeIds)\n .reduce((prev, cur) => prev.concat(...cur), []);\n return Promise.resolve();\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n this.groupId,\n this.maxNodes,\n this.reportsToFollow,\n ...this.nodeIds,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"group id\": this.groupId,\n \"max # of nodes\": this.maxNodes,\n \"node IDs\": this.nodeIds.join(\", \"),\n \"reports to follow\": this.reportsToFollow,\n },\n };\n }\n}\n// @publicAPI\nexport interface AssociationCCGetOptions {\n groupId: number;\n}\n@CCCommand(AssociationCommand.Get)\n@expectedCCResponse(AssociationCCReport)\nexport class AssociationCCGet extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCGetOptions>) {\n super(options);\n if (options.groupId < 1) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n this.groupId = options.groupId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCGet {\n validatePayload(raw.payload.length >= 1);\n const groupId = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n });\n }\n public groupId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupId]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"group id\": this.groupId },\n };\n }\n}\n// @publicAPI\nexport interface AssociationCCSupportedGroupingsReportOptions {\n groupCount: number;\n}\n@CCCommand(AssociationCommand.SupportedGroupingsReport)\n@ccValueProperty(\"groupCount\", AssociationCCValues.groupCount)\nexport class AssociationCCSupportedGroupingsReport extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCSupportedGroupingsReportOptions>) {\n super(options);\n this.groupCount = options.groupCount;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCSupportedGroupingsReport {\n validatePayload(raw.payload.length >= 1);\n const groupCount = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupCount,\n });\n }\n public groupCount: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupCount]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"group count\": this.groupCount },\n };\n }\n}\n@CCCommand(AssociationCommand.SupportedGroupingsGet)\n@expectedCCResponse(AssociationCCSupportedGroupingsReport)\nexport class AssociationCCSupportedGroupingsGet extends AssociationCC {\n}\n// @publicAPI\nexport interface AssociationCCSpecificGroupReportOptions {\n group: number;\n}\n@CCCommand(AssociationCommand.SpecificGroupReport)\nexport class AssociationCCSpecificGroupReport extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCSpecificGroupReportOptions>) {\n super(options);\n this.group = options.group;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCSpecificGroupReport {\n validatePayload(raw.payload.length >= 1);\n const group = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n group,\n });\n }\n public group: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.group]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { group: this.group },\n };\n }\n}\n@CCCommand(AssociationCommand.SpecificGroupGet)\n@expectedCCResponse(AssociationCCSpecificGroupReport)\nexport class AssociationCCSpecificGroupGet extends AssociationCC {\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qBAAgC;AAGhC,kBAAwP;AACxP,oBAAsB;AACtB,oBAAyB;AACzB,iBAAqC;AACrC,0BAAuH;AACvH,oCAAiI;AAEjI,mBAA4D;AAE5D,cAAyB;AACzB,gCAAoC;AAZpC,MAAM,EAAE,gDAAgD,wCAAwC,0CAA0C,0CAA0C,6CAA6C,0DAA0D,gDAAgD,kDAAiD,IAAK;IAgBpX,oBAAgB,MAAA;8BAD5B,mCAAI,2BAAe,WAAW,CAAC;;;;oBACM;;;;;;;;;;wCAAA,YAAa;WAAA;;;;;;;;sCA8B9C,+CAA8C,CAAE;8BAahD,uCAAsC,CAAE;gCAiBxC,yCAAwC,CAAE;gCAa1C,yCAAwC,CAAE;mCAc1C,4CAA2C,CAAE;gDAsB7C,yDAAwD,CAAE;sCAmB1D,+CAA8C,CAAE;yCAahD,kDAAiD,CAAE;AA9GpD,qCAAA,MAAA,MAAA,8BAAA,EAAA,MAAA,UAAA,MAAA,oBAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,sBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,kBAAb,OAA6B,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAc7B,qCAAA,MAAA,MAAA,sBAAA,EAAA,MAAA,UAAA,MAAA,YAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,cAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,UAAb,OAAqB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAgBrB,qCAAA,MAAA,MAAA,wBAAA,EAAA,MAAA,UAAA,MAAA,cAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,gBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,YAAb,OAAuB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAavB,qCAAA,MAAA,MAAA,wBAAA,EAAA,MAAA,UAAA,MAAA,cAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,gBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,YAAb,OAAuB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAcvB,qCAAA,MAAA,MAAA,2BAAA,EAAA,MAAA,UAAA,MAAA,iBAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,mBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,eAAb,OAA0B,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAsB1B,qCAAA,MAAA,MAAA,wCAAA,EAAA,MAAA,UAAA,MAAA,8BAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,gCAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,4BAAb,OAAuC,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAmBvC,qCAAA,MAAA,MAAA,8BAAA,EAAA,MAAA,UAAA,MAAA,oBAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,sBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,kBAAb,OAA6B,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAa7B,qCAAA,MAAA,MAAA,iCAAA,EAAA,MAAA,UAAA,MAAA,uBAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,yBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,qBAAb,OAAgC,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AA9IpC,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACF,gBAAgB,KAAuB;AAC1C,cAAQ,KAAK;QACT,KAAK,gCAAmB;QACxB,KAAK,gCAAmB;QACxB,KAAK,gCAAmB;QACxB,KAAK,gCAAmB;QACxB,KAAK,gCAAmB;QACxB,KAAK,gCAAmB;AACpB,iBAAO;QACX,KAAK,gCAAmB;QACxB,KAAK,gCAAmB;AACpB,iBAAO,KAAK,WAAW;MAC/B;AACA,aAAO,MAAM,gBAAgB,GAAG;IACpC;;;;;IAKO,MAAM,gBAAa;AACtB,WAAK,sBAAsB,iCAAoB,gCAAmB,qBAAqB;AACvF,YAAM,KAAK,IAAI,mCAAmC;QAC9C,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;OAChC;AACD,YAAM,WAAW,MAAM,KAAK,KAAK,YAAmD,IAAI,KAAK,cAAc;AAC3G,UAAI;AACA,eAAO,SAAS;IACxB;IAEO,MAAM,iBAAiB,YAAkB;AAC5C,WAAK,sBAAsB,iCAAoB,gCAAmB,wBAAwB;AAC1F,YAAM,KAAK,IAAI,sCAAsC;QACjD,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B;OACH;AACD,YAAM,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACvD;;;;IAMO,MAAM,SAAS,SAAe;AACjC,WAAK,sBAAsB,iCAAoB,gCAAmB,GAAG;AACrE,YAAM,KAAK,IAAI,iBAAiB;QAC5B,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B;OACH;AACD,YAAM,WAAW,MAAM,KAAK,KAAK,YAAiC,IAAI,KAAK,cAAc;AACzF,UAAI,UAAU;AACV,eAAO;UACH,UAAU,SAAS;UACnB,SAAS,SAAS;;MAE1B;IACJ;IAEO,MAAM,WAAW,SAAmC;AACvD,WAAK,sBAAsB,iCAAoB,gCAAmB,MAAM;AACxE,YAAM,KAAK,IAAI,oBAAoB;QAC/B,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B,GAAG;OACN;AACD,YAAM,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACvD;;;;IAKO,MAAM,WAAW,YAAoB,SAAiB;AACzD,WAAK,sBAAsB,iCAAoB,gCAAmB,GAAG;AACrE,YAAM,KAAK,IAAI,iBAAiB;QAC5B,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B;QACA;OACH;AACD,aAAO,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACxD;;;;IAKO,MAAM,cAAc,SAAmC;AAC1D,WAAK,sBAAsB,iCAAoB,gCAAmB,MAAM;AAExE,UAAI,CAAC,QAAQ,SAAS;AAClB,YAAI,KAAK,YAAY,GAAG;AACpB,gBAAM,IAAI,uBAAW,QAAQ,KAAK,SAAS,MAAM,yEAAyE,4BAAgB,gBAAgB;QAC9J;MACJ,WACS,QAAQ,UAAU,GAAG;AAC1B,cAAM,IAAI,uBAAW,kCAAkC,4BAAgB,gBAAgB;MAC3F;AACA,YAAM,KAAK,IAAI,oBAAoB;QAC/B,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B,GAAG;OACN;AACD,aAAO,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACxD;;;;IAKO,MAAM,2BAA2B,SAAiB;AACrD,WAAK,sBAAsB,iCAAoB,gCAAmB,MAAM;AACxE,UAAI,KAAK,WAAW,GAAG;AAEnB,eAAO,KAAK,cAAc,EAAE,SAAS,SAAS,EAAC,CAAE;MACrD,OACK;AAED,cAAM,aAAa,KAAK,cAAa,GAAI,SAAiB,8CAAoB,WAAW,SAAS,KAAK,SAAS,KAAK,CAAC,KAAK;AAC3H,iBAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AAEpD,gBAAM,KAAK,cAAc,EAAE,SAAS,QAAO,CAAE;QACjD;MACJ;IACJ;;;;IAKO,MAAM,mBAAgB;AACzB,WAAK,sBAAsB,iCAAoB,gCAAmB,gBAAgB;AAClF,YAAM,KAAK,IAAI,8BAA8B;QACzC,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;OAChC;AACD,YAAM,WAAW,MAAM,KAAK,KAAK,YAA8C,IAAI,KAAK,cAAc;AACtG,aAAO,UAAU;IACrB;;;;IAKO,MAAM,oBAAoB,OAAa;AAC1C,WAAK,sBAAsB,iCAAoB,gCAAmB,mBAAmB;AACrF,YAAM,KAAK,IAAI,iCAAiC;QAC5C,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B;OACH;AACD,YAAM,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACvD;;;AAtJS,0CAAA,MAAA,0BAAA;;;;;IA2JA,iBAAa,MAAA;8BAHzB,4CAAa,2BAAe,WAAW,OACvC,kDAAmB,CAAC,OACpB,wCAAS,6CAAmB,CAAC;;;;oBACK;qCAAA,YAAY;WAAA;;;;;;;;AAA/C,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IAEF,gCAA6B;AAEhC,aAAO;QACH,GAAG,MAAM,8BAA6B;QACtC,2BAAe,kBAAkB;;QAEjC,2BAAe,eAAe;;IAEtC;;;;;IAKO,OAAO,oBAAoB,KAAiB,UAAoB;AACnE,aAAO,IACF,WAAW,SAAS,MAAM,EAC1B,SAAS,8CAAoB,WAAW,SAAS,SAAS,KAAK,CAAC,KAAK;IAC9E;;;;;IAKO,OAAO,kBAAkB,KAAmC,UAAsB,SAAe;AACpG,aAAQ,IACH,WAAW,SAAS,MAAM,EAC1B,SAAS,8CAAoB,SAAS,OAAO,EAAE,SAAS,SAAS,KAAK,CAAC,KAGrE,IACE,kBAAkB,SAAS,MAAM,GAChC,gCAAgC,SAAS,OAAO,OAAO,GACvD,YACH;IACX;;;;;IAKO,OAAO,yBAAyB,KAAiB,UAAoB;AACxE,YAAM,MAAM,oBAAI,IAAG;AACnB,YAAM,aAAa,KAAK,oBAAoB,KAAK,QAAQ;AACzD,YAAM,UAAU,IAAI,WAAW,SAAS,MAAM;AAC9C,eAAS,IAAI,GAAG,KAAK,YAAY,KAAK;AAElC,cAAM,QAAQ,QAAQ,SAAmB,8CAAoB,QAAQ,CAAC,EAAE,SAAS,SAAS,KAAK,CAAC,KAAK,CAAA;AACrG,YAAI;UAAI;;cAER,wBAAS,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,OAAM,EAAG;QAAC;MACjD;AACA,aAAO;IACX;IACO,MAAM,UAAU,KAAqB;AACxC,YAAM,OAAO,KAAK,QAAQ,GAAG;AAC7B,YAAM,WAAW,KAAK,YAAY,GAAG;AACrC,YAAM,MAAM,iBAAM,OAAO,2BAAe,aAAa,KAAK,QAAQ,EAAE,YAAY;QAC5E,UAAU,4BAAgB;OAC7B;AACD,UAAI,QAAQ,KAAK,IAAI;QACjB,UAAU,KAAK;QACf,SAAS,gBAAgB,KAAK,MAAM;QACpC,WAAW;OACd;AAKD,UAAI,QAAQ,KAAK,IAAI;QACjB,UAAU,KAAK;QACf,SAAS;QACT,WAAW;OACd;AACD,YAAM,aAAa,MAAM,IAAI,cAAa;AAC1C,UAAI,cAAc,QAAW;AACzB,YAAI,QAAQ,KAAK,IAAI;UACjB,UAAU,KAAK;UACf,SAAS,YAAY,UAAU;UAC/B,WAAW;SACd;MACL,OACK;AACD,YAAI,QAAQ,KAAK,IAAI;UACjB,UAAU,KAAK;UACf,SAAS;UACT,OAAO;SACV;AACD;MACJ;AAEA,YAAM,KAAK,cAAc,KAAK;QAC1B,YAAY,wBAAC,WAAW,UAAU,KAAK,wBAAwB,WAAW,KAAK,GAAnE;OACf;AAED,UAAI,SAAS,WAAW,2BAAe,2BAA2B,CAAC,GAAG;AAClE,YAAI,QAAQ,KAAK,IAAI;UACjB,UAAU,KAAK;UACf,SAAS,GAAG,KAAK,YAAY,IAAI;UACjC,WAAW;SACd;AACD,aAAK,qBAAqB,KAAK,IAAI;AACnC;MACJ;AAEA,YAAM,QAAQ,8BAA8B,KAAK,QAAQ;AAEzD,WAAK,qBAAqB,KAAK,IAAI;IACvC;IACO,MAAM,cAAc,KAA2B,SAA8B;AAChF,YAAM,OAAO,KAAK,QAAQ,GAAG;AAC7B,YAAM,WAAW,KAAK,YAAY,GAAG;AACrC,YAAM,MAAM,iBAAM,OAAO,2BAAe,aAAa,KAAK,QAAQ,EAAE,YAAY;QAC5E,UAAU,SAAS,YAAY,4BAAgB;OAClD;AACD,YAAM,aAAaA,eAAc,oBAAoB,KAAK,QAAQ;AAElE,eAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACpD,YAAI,QAAQ,KAAK,IAAI;UACjB,UAAU,KAAK;UACf,SAAS,+BAA+B,OAAO;UAC/C,WAAW;SACd;AACD,cAAM,QAAQ,MAAM,IAAI,SAAS,OAAO;AACxC,YAAI,SAAS,QAAW;AACpB,gBAAM,aAAa,+CAA+C,OAAO;sBACnE,MAAM,QAAQ;4BACR,MAAM,QAAQ,IAAI,MAAM,EAAE,KAAK,IAAI,CAAC;AAChD,cAAI,QAAQ,KAAK,IAAI;YACjB,UAAU,KAAK;YACf,SAAS;YACT,WAAW;WACd;QACL;AACA,iBAAS,aAAa,SAAS,UAAU;MAC7C;IACJ;;;;IASS,oBAAgB,MAAA;8BAF5B,yCAAU,gCAAmB,GAAG,OAChC,8CAAc,CAAE;;;;oBACqB;wCAAA,YAAa;WAAA;;;;;;;;AAAnD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACT,YAAmB,SAA6C;AAC5D,YAAM,OAAO;AACb,UAAI,QAAQ,UAAU,GAAG;AACrB,cAAM,IAAI,uBAAW,kCAAkC,4BAAgB,gBAAgB;MAC3F;AACA,UAAI,QAAQ,QAAQ,KAAK,CAAC,MAAM,IAAI,KAAK,IAAI,qBAAS,GAAG;AACrD,cAAM,IAAI,uBAAW,sCAAsC,qBAAS,KAAK,4BAAgB,gBAAgB;MAC7G;AACA,WAAK,UAAU,QAAQ;AACvB,WAAK,UAAU,QAAQ;IAC3B;IACO,OAAO,KAAK,KAAY,KAAqB;AAChD,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,YAAM,UAAU,IAAI,QAAQ,CAAC;AAC7B,YAAM,UAAU,CAAC,GAAG,IAAI,QAAQ,SAAS,CAAC,CAAC;AAC3C,aAAO,IAAI,KAAK;QACZ,QAAQ,IAAI;QACZ;QACA;OACH;IACL;IACO;IACA;IACA,UAAU,KAAsB;AACnC,WAAK,UAAU,oBAAM,KAAK,CAAC,KAAK,SAAS,GAAG,KAAK,OAAO,CAAC;AACzD,aAAO,MAAM,UAAU,GAAG;IAC9B;IACO,WAAW,KAAgB;AAC9B,YAAM,UAAyB;QAC3B,YAAY,KAAK,WAAW;QAC5B,YAAY,KAAK,QAAQ,SACnB,KAAK,QAAQ,KAAK,IAAI,IACtB;;AAEV,aAAO;QACH,GAAG,MAAM,WAAW,GAAG;QACvB;;IAER;;;;IAWS,uBAAmB,MAAA;8BAF/B,yCAAU,gCAAmB,MAAM,OACnC,8CAAc,CAAE;;;;oBACwB;2CAAA,YAAa;WAAA;;;;;;;;AAAtD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACT,YAAmB,SAAgD;AAC/D,YAAM,OAAO;AAGb,WAAK,UAAU,QAAQ;AACvB,WAAK,UAAU,QAAQ;IAC3B;IACO,OAAO,KAAK,KAAY,KAAqB;AAChD,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,UAAI;AACJ,UAAI,IAAI,QAAQ,CAAC,MAAM,GAAG;AACtB,kBAAU,IAAI,QAAQ,CAAC;MAC3B;AACA,YAAM,UAAU,CAAC,GAAG,IAAI,QAAQ,SAAS,CAAC,CAAC;AAC3C,aAAO,IAAI,KAAK;QACZ,QAAQ,IAAI;QACZ;QACA;OACH;IACL;IACO;IACA;IACA,UAAU,KAAsB;AACnC,WAAK,UAAU,oBAAM,KAAK;QACtB,KAAK,WAAW;QAChB,GAAI,KAAK,WAAW,CAAA;OACvB;AACD,aAAO,MAAM,UAAU,GAAG;IAC9B;IACO,WAAW,KAAgB;AAC9B,YAAM,UAAyB;QAC3B,YAAY,KAAK,WAAW;QAC5B,YAAY,KAAK,WAAW,KAAK,QAAQ,SACnC,KAAK,QAAQ,KAAK,IAAI,IACtB;;AAEV,aAAO;QACH,GAAG,MAAM,WAAW,GAAG;QACvB;;IAER;;;;IAYS,uBAAmB,MAAA;8BAH/B,yCAAU,gCAAmB,MAAM,OACnC,+CAAgB,YAAY,8CAAoB,UAAU,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,OAClF,+CAAgB,WAAW,8CAAoB,SAAS,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,CAAC;;;;oBACzC;2CAAA,YAAa;WAAA;;;;;;;;AAAtD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACT,YAAmB,SAAgD;AAC/D,YAAM,OAAO;AACb,WAAK,UAAU,QAAQ;AACvB,WAAK,WAAW,QAAQ;AACxB,WAAK,UAAU,QAAQ;AACvB,WAAK,kBAAkB,QAAQ;IACnC;IACO,OAAO,KAAK,KAAY,KAAqB;AAChD,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,YAAM,UAAU,IAAI,QAAQ,CAAC;AAC7B,YAAM,WAAW,IAAI,QAAQ,CAAC;AAC9B,YAAM,kBAAkB,IAAI,QAAQ,CAAC;AACrC,YAAM,UAAU,CAAC,GAAG,IAAI,QAAQ,SAAS,CAAC,CAAC;AAC3C,aAAO,IAAI,KAAK;QACZ,QAAQ,IAAI;QACZ;QACA;QACA;QACA;OACH;IACL;IACO;IACA;IACA;IACA;IACA,wBAAqB;AAExB,aAAO,EAAE,SAAS,KAAK,QAAO;IAClC;IACO,uBAAoB;AACvB,aAAO,KAAK;IAChB;IACO,gBAAgB,UAAiC,MAAsB;AAE1E,WAAK,UAAU,CAAC,GAAG,UAAU,IAAI,EAC5B,IAAI,CAAC,WAAW,OAAO,OAAO,EAC9B,OAAO,CAAC,MAAM,QAAQ,KAAK,OAAO,GAAG,GAAG,GAAG,CAAA,CAAE;AAClD,aAAO,QAAQ,QAAO;IAC1B;IACO,UAAU,KAAsB;AACnC,WAAK,UAAU,oBAAM,KAAK;QACtB,KAAK;QACL,KAAK;QACL,KAAK;QACL,GAAG,KAAK;OACX;AACD,aAAO,MAAM,UAAU,GAAG;IAC9B;IACO,WAAW,KAAgB;AAC9B,aAAO;QACH,GAAG,MAAM,WAAW,GAAG;QACvB,SAAS;UACL,YAAY,KAAK;UACjB,kBAAkB,KAAK;UACvB,YAAY,KAAK,QAAQ,KAAK,IAAI;UAClC,qBAAqB,KAAK;;;IAGtC;;;;IAQS,oBAAgB,MAAA;8BAF5B,yCAAU,gCAAmB,GAAG,OAChC,kDAAmB,mBAAmB,CAAC;;;;oBACF;wCAAA,YAAa;WAAA;;;;;;;;AAAnD,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACT,YAAmB,SAA6C;AAC5D,YAAM,OAAO;AACb,UAAI,QAAQ,UAAU,GAAG;AACrB,cAAM,IAAI,uBAAW,kCAAkC,4BAAgB,gBAAgB;MAC3F;AACA,WAAK,UAAU,QAAQ;IAC3B;IACO,OAAO,KAAK,KAAY,KAAqB;AAChD,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,YAAM,UAAU,IAAI,QAAQ,CAAC;AAC7B,aAAO,IAAI,KAAK;QACZ,QAAQ,IAAI;QACZ;OACH;IACL;IACO;IACA,UAAU,KAAsB;AACnC,WAAK,UAAU,oBAAM,KAAK,CAAC,KAAK,OAAO,CAAC;AACxC,aAAO,MAAM,UAAU,GAAG;IAC9B;IACO,WAAW,KAAgB;AAC9B,aAAO;QACH,GAAG,MAAM,WAAW,GAAG;QACvB,SAAS,EAAE,YAAY,KAAK,QAAO;;IAE3C;;;;IAQS,yCAAqC,MAAA;8BAFjD,yCAAU,gCAAmB,wBAAwB,OACrD,+CAAgB,cAAc,8CAAoB,UAAU,CAAC;;;;oBACH;6DAAA,YAAa;WAAA;;;;;;;;AAAxE,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACT,YAAmB,SAAkE;AACjF,YAAM,OAAO;AACb,WAAK,aAAa,QAAQ;IAC9B;IACO,OAAO,KAAK,KAAY,KAAqB;AAChD,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,YAAM,aAAa,IAAI,QAAQ,CAAC;AAChC,aAAO,IAAI,KAAK;QACZ,QAAQ,IAAI;QACZ;OACH;IACL;IACO;IACA,UAAU,KAAsB;AACnC,WAAK,UAAU,oBAAM,KAAK,CAAC,KAAK,UAAU,CAAC;AAC3C,aAAO,MAAM,UAAU,GAAG;IAC9B;IACO,WAAW,KAAgB;AAC9B,aAAO;QACH,GAAG,MAAM,WAAW,GAAG;QACvB,SAAS,EAAE,eAAe,KAAK,WAAU;;IAEjD;;;;IAIS,sCAAkC,MAAA;8BAF9C,yCAAU,gCAAmB,qBAAqB,OAClD,kDAAmB,qCAAqC,CAAC;;;;oBACF;0DAAA,YAAa;WAAA;;;;;;;;AAArE,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;;;;IAOA,oCAAgC,MAAA;8BAD5C,yCAAU,gCAAmB,mBAAmB,CAAC;;;;oBACI;wDAAA,YAAa;WAAA;;;;;;;;AAAnE,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;IACT,YAAmB,SAA6D;AAC5E,YAAM,OAAO;AACb,WAAK,QAAQ,QAAQ;IACzB;IACO,OAAO,KAAK,KAAY,KAAqB;AAChD,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,YAAM,QAAQ,IAAI,QAAQ,CAAC;AAC3B,aAAO,IAAI,KAAK;QACZ,QAAQ,IAAI;QACZ;OACH;IACL;IACO;IACA,UAAU,KAAsB;AACnC,WAAK,UAAU,oBAAM,KAAK,CAAC,KAAK,KAAK,CAAC;AACtC,aAAO,MAAM,UAAU,GAAG;IAC9B;IACO,WAAW,KAAgB;AAC9B,aAAO;QACH,GAAG,MAAM,WAAW,GAAG;QACvB,SAAS,EAAE,OAAO,KAAK,MAAK;;IAEpC;;;;IAIS,iCAA6B,MAAA;8BAFzC,yCAAU,gCAAmB,gBAAgB,OAC7C,kDAAmB,gCAAgC,CAAC;;;;oBACF;qDAAA,YAAa;WAAA;;;;;;;;AAAhE,qCAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,0CAAA,YAAA,uBAAA;;;;;",
4
+ "sourcesContent": ["import * as __validateArgs from \"./AssociationCC._validateArgs.js\";\nconst { validateArgs_AssociationCCAPI_reportGroupCount, validateArgs_AssociationCCAPI_getGroup, validateArgs_AssociationCCAPI_sendReport, validateArgs_AssociationCCAPI_addNodeIds, validateArgs_AssociationCCAPI_removeNodeIds, validateArgs_AssociationCCAPI_removeNodeIdsFromAllGroups, validateArgs_AssociationCCAPI_getSpecificGroup, validateArgs_AssociationCCAPI_reportSpecificGroup } = __validateArgs;\nimport type { GetDeviceConfig } from \"@zwave-js/config\";\nimport { CommandClasses, type EndpointId, type GetValueDB, MAX_NODES, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, type WithAddress, ZWaveError, ZWaveErrorCodes, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { distinct } from \"alcalzone-shared/arrays\";\nimport { CCAPI, PhysicalCCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type RefreshValuesContext, type RefreshValuesOptions, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { type AssociationAddress, AssociationCommand } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport * as ccUtils from \"../lib/utils.js\";\nimport { AssociationCCValues } from \"./_CCValues.generated.js\";\nexport { AssociationCCValues };\n// @noSetValueAPI\n@API(CommandClasses.Association)\nexport class AssociationCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: AssociationCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case AssociationCommand.Get:\n case AssociationCommand.Set:\n case AssociationCommand.Report:\n case AssociationCommand.Remove:\n case AssociationCommand.SupportedGroupingsGet:\n case AssociationCommand.SupportedGroupingsReport:\n return true;\n case AssociationCommand.SpecificGroupGet:\n case AssociationCommand.SpecificGroupReport:\n return this.version >= 2;\n }\n return super.supportsCommand(cmd);\n }\n /**\n * Returns the number of association groups a node supports.\n * Association groups are consecutive, starting at 1.\n */\n public async getGroupCount(): Promise<MaybeNotKnown<number>> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.SupportedGroupingsGet);\n const cc = new AssociationCCSupportedGroupingsGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<AssociationCCSupportedGroupingsReport>(cc, this.commandOptions);\n if (response)\n return response.groupCount;\n }\n @validateArgs_AssociationCCAPI_reportGroupCount()\n public async reportGroupCount(groupCount: number): Promise<void> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.SupportedGroupingsReport);\n const cc = new AssociationCCSupportedGroupingsReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupCount,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Returns information about an association group.\n */\n @validateArgs_AssociationCCAPI_getGroup()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getGroup(groupId: number) {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Get);\n const cc = new AssociationCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupId,\n });\n const response = await this.host.sendCommand<AssociationCCReport>(cc, this.commandOptions);\n if (response) {\n return {\n maxNodes: response.maxNodes,\n nodeIds: response.nodeIds,\n };\n }\n }\n @validateArgs_AssociationCCAPI_sendReport()\n public async sendReport(options: AssociationCCReportOptions): Promise<void> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Report);\n const cc = new AssociationCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Adds new nodes to an association group\n */\n @validateArgs_AssociationCCAPI_addNodeIds()\n public async addNodeIds(groupId: number, ...nodeIds: number[]): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Set);\n const cc = new AssociationCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupId,\n nodeIds,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Removes nodes from an association group\n */\n @validateArgs_AssociationCCAPI_removeNodeIds()\n public async removeNodeIds(options: AssociationCCRemoveOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Remove);\n // Validate options\n if (!options.groupId) {\n if (this.version === 1) {\n throw new ZWaveError(`Node ${this.endpoint.nodeId} only supports AssociationCC V1 which requires the group Id to be set`, ZWaveErrorCodes.Argument_Invalid);\n }\n }\n else if (options.groupId < 0) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n const cc = new AssociationCCRemove({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Removes nodes from all association groups\n */\n @validateArgs_AssociationCCAPI_removeNodeIdsFromAllGroups()\n public async removeNodeIdsFromAllGroups(nodeIds: number[]): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.Remove);\n if (this.version >= 2) {\n // The node supports bulk removal\n return this.removeNodeIds({ nodeIds, groupId: 0 });\n }\n else {\n // We have to remove the node manually from all groups\n const groupCount = this.tryGetValueDB()?.getValue<number>(AssociationCCValues.groupCount.endpoint(this.endpoint.index)) ?? 0;\n for (let groupId = 1; groupId <= groupCount; groupId++) {\n // TODO: evaluate intermediate supervision results\n await this.removeNodeIds({ nodeIds, groupId });\n }\n }\n }\n /**\n * Request the association group that represents the most recently detected button press\n */\n @validateArgs_AssociationCCAPI_getSpecificGroup()\n public async getSpecificGroup(): Promise<number | undefined> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.SpecificGroupGet);\n const cc = new AssociationCCSpecificGroupGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<AssociationCCSpecificGroupReport>(cc, this.commandOptions);\n return response?.group;\n }\n /**\n * Report the association group that represents the most recently detected button press\n */\n @validateArgs_AssociationCCAPI_reportSpecificGroup()\n public async reportSpecificGroup(group: number): Promise<void> {\n this.assertSupportsCommand(AssociationCommand, AssociationCommand.SpecificGroupReport);\n const cc = new AssociationCCSpecificGroupReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n group,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n}\n@commandClass(CommandClasses.Association)\n@implementedVersion(4)\n@ccValues(AssociationCCValues)\nexport class AssociationCC extends CommandClass {\n declare ccCommand: AssociationCommand;\n public determineRequiredCCInterviews(): readonly CommandClasses[] {\n // AssociationCC must be interviewed after Z-Wave+ if that is supported\n return [\n ...super.determineRequiredCCInterviews(),\n CommandClasses[\"Z-Wave Plus Info\"],\n // We need information about endpoints to correctly configure the lifeline associations\n CommandClasses[\"Multi Channel\"],\n ];\n }\n /**\n * Returns the number of association groups reported by the node/endpoint.\n * This only works AFTER the interview process\n */\n public static getGroupCountCached(ctx: GetValueDB, endpoint: EndpointId): number {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(AssociationCCValues.groupCount.endpoint(endpoint.index)) || 0;\n }\n /**\n * Returns the number of nodes an association group supports.\n * This only works AFTER the interview process\n */\n public static getMaxNodesCached(ctx: GetValueDB & GetDeviceConfig, endpoint: EndpointId, groupId: number): number {\n return (ctx\n .getValueDB(endpoint.nodeId)\n .getValue(AssociationCCValues.maxNodes(groupId).endpoint(endpoint.index))\n // If the information is not available, fall back to the configuration file if possible\n // This can happen on some legacy devices which have \"hidden\" association groups\n ?? ctx\n .getDeviceConfig?.(endpoint.nodeId)\n ?.getAssociationConfigForEndpoint(endpoint.index, groupId)\n ?.maxNodes\n ?? 0);\n }\n /**\n * Returns all the destinations of all association groups reported by the node/endpoint.\n * This only works AFTER the interview process\n */\n public static getAllDestinationsCached(ctx: GetValueDB, endpoint: EndpointId): ReadonlyMap<number, readonly AssociationAddress[]> {\n const ret = new Map<number, AssociationAddress[]>();\n const groupCount = this.getGroupCountCached(ctx, endpoint);\n const valueDB = ctx.getValueDB(endpoint.nodeId);\n for (let i = 1; i <= groupCount; i++) {\n // Add all root destinations\n const nodes = valueDB.getValue<number[]>(AssociationCCValues.nodeIds(i).endpoint(endpoint.index)) ?? [];\n ret.set(i, \n // Filter out duplicates\n distinct(nodes).map((nodeId) => ({ nodeId })));\n }\n return ret;\n }\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses.Association, ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Even if Multi Channel Association is supported, we still need to query the number of\n // normal association groups since some devices report more association groups than\n // multi channel association groups\n // Find out how many groups are supported\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying number of association groups...\",\n direction: \"outbound\",\n });\n const groupCount = await api.getGroupCount();\n if (groupCount != undefined) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `supports ${groupCount} association groups`,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying association groups timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n // Query each association group for its members\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // Skip the remaining Association CC interview in favor of Multi Channel Association if possible\n if (endpoint.supportsCC(CommandClasses[\"Multi Channel Association\"])) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `${this.constructor.name}: delaying configuration of lifeline associations until after Multi Channel Association interview...`,\n direction: \"none\",\n });\n this.setInterviewComplete(ctx, true);\n return;\n }\n // And set up lifeline associations\n await ccUtils.configureLifelineAssociations(ctx, endpoint);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses.Association, ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const groupCount = AssociationCC.getGroupCountCached(ctx, endpoint);\n // Query each association group\n for (let groupId = 1; groupId <= groupCount; groupId++) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying association group #${groupId}...`,\n direction: \"outbound\",\n });\n const group = await api.getGroup(groupId);\n if (group != undefined) {\n const logMessage = `received information for association group #${groupId}:\nmaximum # of nodes: ${group.maxNodes}\ncurrently assigned nodes: ${group.nodeIds.map(String).join(\", \")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n options?.onProgress?.(groupId, groupCount);\n }\n }\n}\n// @publicAPI\nexport interface AssociationCCSetOptions {\n groupId: number;\n nodeIds: number[];\n}\n@CCCommand(AssociationCommand.Set)\n@useSupervision()\nexport class AssociationCCSet extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCSetOptions>) {\n super(options);\n if (options.groupId < 1) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n if (options.nodeIds.some((n) => n < 1 || n > MAX_NODES)) {\n throw new ZWaveError(`All node IDs must be between 1 and ${MAX_NODES}!`, ZWaveErrorCodes.Argument_Invalid);\n }\n this.groupId = options.groupId;\n this.nodeIds = options.nodeIds;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCSet {\n validatePayload(raw.payload.length >= 2);\n const groupId = raw.payload[0];\n const nodeIds = [...raw.payload.subarray(1)];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n nodeIds,\n });\n }\n public groupId: number;\n public nodeIds: number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupId, ...this.nodeIds]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"group id\": this.groupId || \"all groups\",\n \"node ids\": this.nodeIds.length\n ? this.nodeIds.join(\", \")\n : \"all nodes\",\n };\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface AssociationCCRemoveOptions {\n /** The group from which to remove the nodes. If none is specified, the nodes will be removed from all groups. */\n groupId?: number;\n /** The nodes to remove. If none are specified, ALL nodes will be removed. */\n nodeIds?: number[];\n}\n@CCCommand(AssociationCommand.Remove)\n@useSupervision()\nexport class AssociationCCRemove extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCRemoveOptions>) {\n super(options);\n // When removing associations, we allow invalid node IDs.\n // See GH#3606 - it is possible that those exist.\n this.groupId = options.groupId;\n this.nodeIds = options.nodeIds;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCRemove {\n validatePayload(raw.payload.length >= 1);\n let groupId: number | undefined;\n if (raw.payload[0] !== 0) {\n groupId = raw.payload[0];\n }\n const nodeIds = [...raw.payload.subarray(1)];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n nodeIds,\n });\n }\n public groupId?: number;\n public nodeIds?: number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n this.groupId || 0,\n ...(this.nodeIds || []),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"group id\": this.groupId || \"all groups\",\n \"node ids\": this.nodeIds && this.nodeIds.length\n ? this.nodeIds.join(\", \")\n : \"all nodes\",\n };\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface AssociationCCReportOptions {\n groupId: number;\n maxNodes: number;\n nodeIds: number[];\n reportsToFollow: number;\n}\n@CCCommand(AssociationCommand.Report)\n@ccValueProperty(\"maxNodes\", AssociationCCValues.maxNodes, (self) => [self.groupId])\n@ccValueProperty(\"nodeIds\", AssociationCCValues.nodeIds, (self) => [self.groupId])\nexport class AssociationCCReport extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCReportOptions>) {\n super(options);\n this.groupId = options.groupId;\n this.maxNodes = options.maxNodes;\n this.nodeIds = options.nodeIds;\n this.reportsToFollow = options.reportsToFollow;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCReport {\n validatePayload(raw.payload.length >= 3);\n const groupId = raw.payload[0];\n const maxNodes = raw.payload[1];\n const reportsToFollow = raw.payload[2];\n const nodeIds = [...raw.payload.subarray(3)];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n maxNodes,\n reportsToFollow,\n nodeIds,\n });\n }\n public groupId: number;\n public maxNodes: number;\n public nodeIds: number[];\n public reportsToFollow: number;\n public getPartialCCSessionId(): Record<string, any> | undefined {\n // Distinguish sessions by the association group ID\n return { groupId: this.groupId };\n }\n public getRemainingSegments(): number | undefined {\n return this.reportsToFollow;\n }\n public mergePartialCCs(partials: AssociationCCReport[], _ctx: CCParsingContext): Promise<void> {\n // Concat the list of nodes\n this.nodeIds = [...partials, this]\n .map((report) => report.nodeIds)\n .reduce((prev, cur) => prev.concat(...cur), []);\n return Promise.resolve();\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([\n this.groupId,\n this.maxNodes,\n this.reportsToFollow,\n ...this.nodeIds,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"group id\": this.groupId,\n \"max # of nodes\": this.maxNodes,\n \"node IDs\": this.nodeIds.join(\", \"),\n \"reports to follow\": this.reportsToFollow,\n },\n };\n }\n}\n// @publicAPI\nexport interface AssociationCCGetOptions {\n groupId: number;\n}\n@CCCommand(AssociationCommand.Get)\n@expectedCCResponse(AssociationCCReport)\nexport class AssociationCCGet extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCGetOptions>) {\n super(options);\n if (options.groupId < 1) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n this.groupId = options.groupId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCGet {\n validatePayload(raw.payload.length >= 1);\n const groupId = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n });\n }\n public groupId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupId]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"group id\": this.groupId },\n };\n }\n}\n// @publicAPI\nexport interface AssociationCCSupportedGroupingsReportOptions {\n groupCount: number;\n}\n@CCCommand(AssociationCommand.SupportedGroupingsReport)\n@ccValueProperty(\"groupCount\", AssociationCCValues.groupCount)\nexport class AssociationCCSupportedGroupingsReport extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCSupportedGroupingsReportOptions>) {\n super(options);\n this.groupCount = options.groupCount;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCSupportedGroupingsReport {\n validatePayload(raw.payload.length >= 1);\n const groupCount = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupCount,\n });\n }\n public groupCount: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupCount]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"group count\": this.groupCount },\n };\n }\n}\n@CCCommand(AssociationCommand.SupportedGroupingsGet)\n@expectedCCResponse(AssociationCCSupportedGroupingsReport)\nexport class AssociationCCSupportedGroupingsGet extends AssociationCC {\n}\n// @publicAPI\nexport interface AssociationCCSpecificGroupReportOptions {\n group: number;\n}\n@CCCommand(AssociationCommand.SpecificGroupReport)\nexport class AssociationCCSpecificGroupReport extends AssociationCC {\n public constructor(options: WithAddress<AssociationCCSpecificGroupReportOptions>) {\n super(options);\n this.group = options.group;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): AssociationCCSpecificGroupReport {\n validatePayload(raw.payload.length >= 1);\n const group = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n group,\n });\n }\n public group: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.group]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { group: this.group },\n };\n }\n}\n@CCCommand(AssociationCommand.SpecificGroupGet)\n@expectedCCResponse(AssociationCCSpecificGroupReport)\nexport class AssociationCCSpecificGroupGet extends AssociationCC {\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["AssociationCC"]
7
7
  }
@@ -242,7 +242,10 @@ let AssociationGroupInfoCC = (() => {
242
242
  async interview(ctx) {
243
243
  const node = this.getNode(ctx);
244
244
  const endpoint = this.getEndpoint(ctx);
245
- const api = import_API.CCAPI.create(import_core.CommandClasses["Association Group Information"], ctx, endpoint).withOptions({ priority: import_core.MessagePriority.NodeQuery });
245
+ const api = import_API.CCAPI.create(import_core.CommandClasses["Association Group Information"], ctx, endpoint).withOptions({
246
+ priority: import_core.MessagePriority.NodeQuery,
247
+ tag: "interview"
248
+ });
246
249
  ctx.logNode(node.id, {
247
250
  endpoint: this.endpointIndex,
248
251
  message: `Interviewing ${this.ccName}...`,
@@ -273,6 +276,7 @@ let AssociationGroupInfoCC = (() => {
273
276
  node.reportInterviewProgress(groupId, 2 * associationGroupCount);
274
277
  }
275
278
  await this.refreshValues(ctx, {
279
+ tag: "interview",
276
280
  onProgress: /* @__PURE__ */ __name((completed) => node.reportInterviewProgress(associationGroupCount + completed, 2 * associationGroupCount), "onProgress")
277
281
  });
278
282
  this.setInterviewComplete(ctx, true);
@@ -281,7 +285,8 @@ let AssociationGroupInfoCC = (() => {
281
285
  const node = this.getNode(ctx);
282
286
  const endpoint = this.getEndpoint(ctx);
283
287
  const api = import_API.CCAPI.create(import_core.CommandClasses["Association Group Information"], ctx, endpoint).withOptions({
284
- priority: options?.priority ?? import_core.MessagePriority.NodeQuery
288
+ priority: options?.priority ?? import_core.MessagePriority.NodeQuery,
289
+ tag: options?.tag
285
290
  });
286
291
  const associationGroupCount = AssociationGroupInfoCC2.getAssociationGroupCountCached(ctx, endpoint);
287
292
  const hasDynamicInfo = this.getValue(ctx, import_CCValues_generated.AssociationGroupInfoCCValues.hasDynamicInfo);
@@ -293,12 +298,14 @@ let AssociationGroupInfoCC = (() => {
293
298
  });
294
299
  const info = await api.getGroupInfo(groupId, !!hasDynamicInfo);
295
300
  if (info) {
296
- const logMessage = `Received info for association group #${groupId}:
297
- info is dynamic: ${info.hasDynamicInfo}
298
- profile: ${(0, import_shared.getEnumMemberName)(import_Types.AssociationGroupInfoProfile, info.profile)}`;
299
301
  ctx.logNode(node.id, {
300
302
  endpoint: this.endpointIndex,
301
- message: logMessage,
303
+ message: (0, import_core.logText)(`Received info for association group #${groupId}:`, {
304
+ nested: (0, import_core.logDict)({
305
+ "info is dynamic": info.hasDynamicInfo,
306
+ profile: (0, import_shared.getEnumMemberName)(import_Types.AssociationGroupInfoProfile, info.profile)
307
+ })
308
+ }),
302
309
  direction: "inbound"
303
310
  });
304
311
  }
@@ -498,15 +505,16 @@ let AssociationGroupInfoCCInfoReport = (() => {
498
505
  toLogEntry(ctx) {
499
506
  return {
500
507
  ...super.toLogEntry(ctx),
501
- message: {
508
+ message: (0, import_core.logDict)({
502
509
  "is list mode": this.isListMode,
503
- "has dynamic info": this.hasDynamicInfo,
504
- groups: this.groups.map((g) => `
505
- \xB7 Group #${g.groupId}
506
- mode: ${g.mode}
507
- profile: ${g.profile}
508
- event code: ${g.eventCode}`).join("")
509
- }
510
+ "has dynamic info": this.hasDynamicInfo
511
+ }, this.groups.map((g) => (0, import_core.logText)(`Group #${g.groupId}`, {
512
+ nested: (0, import_core.logDict)({
513
+ mode: g.mode,
514
+ profile: g.profile,
515
+ "event code": g.eventCode
516
+ })
517
+ })))
510
518
  };
511
519
  }
512
520
  };
@@ -653,10 +661,7 @@ let AssociationGroupInfoCCCommandListReport = (() => {
653
661
  ...super.toLogEntry(ctx),
654
662
  message: {
655
663
  "group id": this.groupId,
656
- commands: [...this.commands].map(([cc, cmds]) => {
657
- return `
658
- \xB7 ${(0, import_core.getCCName)(cc)}: ${cmds.map((cmd) => (0, import_shared.num2hex)(cmd)).join(", ")}`;
659
- }).join("")
664
+ commands: (0, import_core.logList)([...this.commands].map(([cc, cmds]) => `${(0, import_core.getCCName)(cc)}: ${cmds.map((cmd) => (0, import_shared.num2hex)(cmd)).join(", ")}`))
660
665
  }
661
666
  };
662
667
  }