@zwave-js/cc 15.15.3 → 15.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/build/cjs/cc/AlarmSensorCC.js +1 -1
  2. package/build/cjs/cc/AlarmSensorCC.js.map +1 -1
  3. package/build/cjs/cc/ApplicationStatusCC.d.ts +33 -0
  4. package/build/cjs/cc/ApplicationStatusCC.js +229 -0
  5. package/build/cjs/cc/ApplicationStatusCC.js.map +7 -0
  6. package/build/cjs/cc/AssociationCC.js.map +1 -1
  7. package/build/cjs/cc/AssociationGroupInfoCC.js +4 -4
  8. package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
  9. package/build/cjs/cc/BarrierOperatorCC.js +9 -2
  10. package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
  11. package/build/cjs/cc/BasicCC.js +1 -1
  12. package/build/cjs/cc/BasicCC.js.map +1 -1
  13. package/build/cjs/cc/BatteryCC.js +6 -2
  14. package/build/cjs/cc/BatteryCC.js.map +2 -2
  15. package/build/cjs/cc/BinarySwitchCC.js +1 -1
  16. package/build/cjs/cc/BinarySwitchCC.js.map +1 -1
  17. package/build/cjs/cc/CRC16CC.js +2 -2
  18. package/build/cjs/cc/CRC16CC.js.map +2 -2
  19. package/build/cjs/cc/CentralSceneCC.js +2 -2
  20. package/build/cjs/cc/CentralSceneCC.js.map +1 -1
  21. package/build/cjs/cc/ClimateControlScheduleCC.js +5 -5
  22. package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
  23. package/build/cjs/cc/ClockCC.js +1 -1
  24. package/build/cjs/cc/ClockCC.js.map +1 -1
  25. package/build/cjs/cc/ColorSwitchCC.js.map +1 -1
  26. package/build/cjs/cc/ConfigurationCC.d.ts +6 -0
  27. package/build/cjs/cc/ConfigurationCC.js +52 -4
  28. package/build/cjs/cc/ConfigurationCC.js.map +2 -2
  29. package/build/cjs/cc/DoorLockCC.js +3 -3
  30. package/build/cjs/cc/DoorLockCC.js.map +1 -1
  31. package/build/cjs/cc/EntryControlCC.d.ts +2 -2
  32. package/build/cjs/cc/EntryControlCC.js +3 -3
  33. package/build/cjs/cc/EntryControlCC.js.map +2 -2
  34. package/build/cjs/cc/FirmwareUpdateMetaDataCC.d.ts +4 -4
  35. package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +2 -2
  36. package/build/cjs/cc/IndicatorCC.js +5 -5
  37. package/build/cjs/cc/IndicatorCC.js.map +2 -2
  38. package/build/cjs/cc/IrrigationCC.js +3 -3
  39. package/build/cjs/cc/IrrigationCC.js.map +1 -1
  40. package/build/cjs/cc/LanguageCC.js +1 -1
  41. package/build/cjs/cc/LanguageCC.js.map +1 -1
  42. package/build/cjs/cc/ManufacturerProprietaryCC.d.ts +4 -4
  43. package/build/cjs/cc/ManufacturerProprietaryCC.js +1 -1
  44. package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
  45. package/build/cjs/cc/ManufacturerSpecificCC.js +1 -1
  46. package/build/cjs/cc/ManufacturerSpecificCC.js.map +1 -1
  47. package/build/cjs/cc/MeterCC.js +3 -3
  48. package/build/cjs/cc/MeterCC.js.map +2 -2
  49. package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
  50. package/build/cjs/cc/MultiChannelCC.js +8 -8
  51. package/build/cjs/cc/MultiChannelCC.js.map +2 -2
  52. package/build/cjs/cc/MultilevelSensorCC.js.map +1 -1
  53. package/build/cjs/cc/MultilevelSwitchCC.js +1 -1
  54. package/build/cjs/cc/MultilevelSwitchCC.js.map +1 -1
  55. package/build/cjs/cc/NodeNamingCC.js.map +2 -2
  56. package/build/cjs/cc/NotificationCC.d.ts +3 -3
  57. package/build/cjs/cc/NotificationCC.js +29 -23
  58. package/build/cjs/cc/NotificationCC.js.map +2 -2
  59. package/build/cjs/cc/ProtectionCC.js +10 -3
  60. package/build/cjs/cc/ProtectionCC.js.map +2 -2
  61. package/build/cjs/cc/SceneActuatorConfigurationCC.js +0 -1
  62. package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +2 -2
  63. package/build/cjs/cc/SceneControllerConfigurationCC.js +0 -1
  64. package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
  65. package/build/cjs/cc/ScheduleEntryLockCC.js +1 -1
  66. package/build/cjs/cc/ScheduleEntryLockCC.js.map +1 -1
  67. package/build/cjs/cc/Security2CC.d.ts +14 -14
  68. package/build/cjs/cc/Security2CC.js +6 -5
  69. package/build/cjs/cc/Security2CC.js.map +2 -2
  70. package/build/cjs/cc/SecurityCC.d.ts +10 -10
  71. package/build/cjs/cc/SecurityCC.js +3 -3
  72. package/build/cjs/cc/SecurityCC.js.map +2 -2
  73. package/build/cjs/cc/SoundSwitchCC.js +2 -2
  74. package/build/cjs/cc/SoundSwitchCC.js.map +1 -1
  75. package/build/cjs/cc/SupervisionCC.js +1 -1
  76. package/build/cjs/cc/SupervisionCC.js.map +2 -2
  77. package/build/cjs/cc/ThermostatFanModeCC.js +1 -1
  78. package/build/cjs/cc/ThermostatFanModeCC.js.map +1 -1
  79. package/build/cjs/cc/ThermostatFanStateCC.js +1 -1
  80. package/build/cjs/cc/ThermostatFanStateCC.js.map +1 -1
  81. package/build/cjs/cc/ThermostatModeCC.d.ts +6 -6
  82. package/build/cjs/cc/ThermostatModeCC.js +2 -2
  83. package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
  84. package/build/cjs/cc/ThermostatSetbackCC.js +1 -1
  85. package/build/cjs/cc/ThermostatSetbackCC.js.map +1 -1
  86. package/build/cjs/cc/ThermostatSetpointCC.js.map +1 -1
  87. package/build/cjs/cc/TimeCC.js +2 -2
  88. package/build/cjs/cc/TimeCC.js.map +1 -1
  89. package/build/cjs/cc/TransportServiceCC.d.ts +7 -7
  90. package/build/cjs/cc/TransportServiceCC.js +1 -1
  91. package/build/cjs/cc/TransportServiceCC.js.map +2 -2
  92. package/build/cjs/cc/UserCodeCC.d.ts +14 -6
  93. package/build/cjs/cc/UserCodeCC.js +16 -4
  94. package/build/cjs/cc/UserCodeCC.js.map +2 -2
  95. package/build/cjs/cc/VersionCC.js +3 -3
  96. package/build/cjs/cc/VersionCC.js.map +2 -2
  97. package/build/cjs/cc/WakeUpCC.js +2 -2
  98. package/build/cjs/cc/WakeUpCC.js.map +1 -1
  99. package/build/cjs/cc/WindowCoveringCC.d.ts +3 -1
  100. package/build/cjs/cc/WindowCoveringCC.js +28 -8
  101. package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
  102. package/build/cjs/cc/ZWavePlusCC.js +1 -1
  103. package/build/cjs/cc/ZWavePlusCC.js.map +1 -1
  104. package/build/cjs/cc/ZWaveProtocolCC.d.ts +3 -3
  105. package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
  106. package/build/cjs/cc/_CCValues.generated.js.map +1 -1
  107. package/build/cjs/cc/index.d.ts +3 -0
  108. package/build/cjs/cc/index.js +8 -0
  109. package/build/cjs/cc/index.js.map +2 -2
  110. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js +1 -1
  111. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
  112. package/build/cjs/lib/API.d.ts +2 -0
  113. package/build/cjs/lib/API.js +2 -2
  114. package/build/cjs/lib/API.js.map +2 -2
  115. package/build/cjs/lib/CommandClass.d.ts +7 -7
  116. package/build/cjs/lib/CommandClass.js +6 -6
  117. package/build/cjs/lib/CommandClass.js.map +2 -2
  118. package/build/cjs/lib/NotificationEventPayload.d.ts +2 -1
  119. package/build/cjs/lib/NotificationEventPayload.js.map +2 -2
  120. package/build/cjs/lib/Security2/Extension.d.ts +12 -12
  121. package/build/cjs/lib/Security2/Extension.js.map +2 -2
  122. package/build/cjs/lib/_Types.d.ts +11 -1
  123. package/build/cjs/lib/_Types.js +15 -0
  124. package/build/cjs/lib/_Types.js.map +3 -3
  125. package/build/cjs/lib/serializers.d.ts +4 -4
  126. package/build/cjs/lib/serializers.js.map +2 -2
  127. package/build/cjs/lib/traits.d.ts +5 -0
  128. package/build/cjs/lib/utils.js +1 -1
  129. package/build/cjs/lib/utils.js.map +2 -2
  130. package/build/esm/cc/AlarmSensorCC.js +1 -1
  131. package/build/esm/cc/AlarmSensorCC.js.map +1 -1
  132. package/build/esm/cc/ApplicationStatusCC.d.ts +33 -0
  133. package/build/esm/cc/ApplicationStatusCC.d.ts.map +1 -0
  134. package/build/esm/cc/ApplicationStatusCC.js +175 -0
  135. package/build/esm/cc/ApplicationStatusCC.js.map +1 -0
  136. package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
  137. package/build/esm/cc/AssociationGroupInfoCC.js +4 -4
  138. package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
  139. package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
  140. package/build/esm/cc/BarrierOperatorCC.js +13 -2
  141. package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
  142. package/build/esm/cc/BasicCC.js +1 -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 +5 -2
  146. package/build/esm/cc/BatteryCC.js.map +1 -1
  147. package/build/esm/cc/BinarySwitchCC.js +1 -1
  148. package/build/esm/cc/BinarySwitchCC.js.map +1 -1
  149. package/build/esm/cc/CRC16CC.d.ts.map +1 -1
  150. package/build/esm/cc/CRC16CC.js +2 -2
  151. package/build/esm/cc/CRC16CC.js.map +1 -1
  152. package/build/esm/cc/CentralSceneCC.js +2 -2
  153. package/build/esm/cc/CentralSceneCC.js.map +1 -1
  154. package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -1
  155. package/build/esm/cc/ClimateControlScheduleCC.js +5 -5
  156. package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
  157. package/build/esm/cc/ClockCC.js +1 -1
  158. package/build/esm/cc/ClockCC.js.map +1 -1
  159. package/build/esm/cc/ConfigurationCC.d.ts +6 -0
  160. package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
  161. package/build/esm/cc/ConfigurationCC.js +65 -5
  162. package/build/esm/cc/ConfigurationCC.js.map +1 -1
  163. package/build/esm/cc/DoorLockCC.js +3 -3
  164. package/build/esm/cc/DoorLockCC.js.map +1 -1
  165. package/build/esm/cc/EntryControlCC.d.ts +2 -2
  166. package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
  167. package/build/esm/cc/EntryControlCC.js +3 -3
  168. package/build/esm/cc/EntryControlCC.js.map +1 -1
  169. package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts +4 -4
  170. package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -1
  171. package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
  172. package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
  173. package/build/esm/cc/IndicatorCC.js +6 -6
  174. package/build/esm/cc/IndicatorCC.js.map +1 -1
  175. package/build/esm/cc/IrrigationCC.js +3 -3
  176. package/build/esm/cc/IrrigationCC.js.map +1 -1
  177. package/build/esm/cc/LanguageCC.js +1 -1
  178. package/build/esm/cc/LanguageCC.js.map +1 -1
  179. package/build/esm/cc/ManufacturerProprietaryCC.d.ts +4 -4
  180. package/build/esm/cc/ManufacturerProprietaryCC.d.ts.map +1 -1
  181. package/build/esm/cc/ManufacturerProprietaryCC.js +1 -1
  182. package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
  183. package/build/esm/cc/ManufacturerSpecificCC.js +1 -1
  184. package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
  185. package/build/esm/cc/MeterCC.d.ts.map +1 -1
  186. package/build/esm/cc/MeterCC.js +3 -3
  187. package/build/esm/cc/MeterCC.js.map +1 -1
  188. package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
  189. package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
  190. package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
  191. package/build/esm/cc/MultiChannelCC.js +8 -8
  192. package/build/esm/cc/MultiChannelCC.js.map +1 -1
  193. package/build/esm/cc/MultilevelSwitchCC.js +1 -1
  194. package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
  195. package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
  196. package/build/esm/cc/NodeNamingCC.js.map +1 -1
  197. package/build/esm/cc/NotificationCC.d.ts +3 -3
  198. package/build/esm/cc/NotificationCC.d.ts.map +1 -1
  199. package/build/esm/cc/NotificationCC.js +43 -31
  200. package/build/esm/cc/NotificationCC.js.map +1 -1
  201. package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
  202. package/build/esm/cc/ProtectionCC.js +16 -3
  203. package/build/esm/cc/ProtectionCC.js.map +1 -1
  204. package/build/esm/cc/SceneActuatorConfigurationCC.d.ts.map +1 -1
  205. package/build/esm/cc/SceneActuatorConfigurationCC.js +0 -1
  206. package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -1
  207. package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
  208. package/build/esm/cc/SceneControllerConfigurationCC.js +0 -1
  209. package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
  210. package/build/esm/cc/ScheduleEntryLockCC.js +1 -1
  211. package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
  212. package/build/esm/cc/Security2CC.d.ts +14 -14
  213. package/build/esm/cc/Security2CC.d.ts.map +1 -1
  214. package/build/esm/cc/Security2CC.js +7 -6
  215. package/build/esm/cc/Security2CC.js.map +1 -1
  216. package/build/esm/cc/SecurityCC.d.ts +10 -10
  217. package/build/esm/cc/SecurityCC.d.ts.map +1 -1
  218. package/build/esm/cc/SecurityCC.js +4 -4
  219. package/build/esm/cc/SecurityCC.js.map +1 -1
  220. package/build/esm/cc/SoundSwitchCC.js +2 -2
  221. package/build/esm/cc/SoundSwitchCC.js.map +1 -1
  222. package/build/esm/cc/SupervisionCC.js +1 -1
  223. package/build/esm/cc/SupervisionCC.js.map +1 -1
  224. package/build/esm/cc/ThermostatFanModeCC.js +1 -1
  225. package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
  226. package/build/esm/cc/ThermostatFanStateCC.js +1 -1
  227. package/build/esm/cc/ThermostatFanStateCC.js.map +1 -1
  228. package/build/esm/cc/ThermostatModeCC.d.ts +6 -6
  229. package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
  230. package/build/esm/cc/ThermostatModeCC.js +3 -3
  231. package/build/esm/cc/ThermostatModeCC.js.map +1 -1
  232. package/build/esm/cc/ThermostatSetbackCC.js +1 -1
  233. package/build/esm/cc/ThermostatSetbackCC.js.map +1 -1
  234. package/build/esm/cc/TimeCC.js +2 -2
  235. package/build/esm/cc/TimeCC.js.map +1 -1
  236. package/build/esm/cc/TransportServiceCC.d.ts +7 -7
  237. package/build/esm/cc/TransportServiceCC.d.ts.map +1 -1
  238. package/build/esm/cc/TransportServiceCC.js +2 -1
  239. package/build/esm/cc/TransportServiceCC.js.map +1 -1
  240. package/build/esm/cc/UserCodeCC.d.ts +14 -6
  241. package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
  242. package/build/esm/cc/UserCodeCC.js +20 -4
  243. package/build/esm/cc/UserCodeCC.js.map +1 -1
  244. package/build/esm/cc/VersionCC.d.ts.map +1 -1
  245. package/build/esm/cc/VersionCC.js +4 -4
  246. package/build/esm/cc/VersionCC.js.map +1 -1
  247. package/build/esm/cc/WakeUpCC.js +2 -2
  248. package/build/esm/cc/WakeUpCC.js.map +1 -1
  249. package/build/esm/cc/WindowCoveringCC.d.ts +3 -1
  250. package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
  251. package/build/esm/cc/WindowCoveringCC.js +30 -9
  252. package/build/esm/cc/WindowCoveringCC.js.map +1 -1
  253. package/build/esm/cc/ZWavePlusCC.js +1 -1
  254. package/build/esm/cc/ZWavePlusCC.js.map +1 -1
  255. package/build/esm/cc/ZWaveProtocolCC.d.ts +3 -3
  256. package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
  257. package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
  258. package/build/esm/cc/index.d.ts +3 -0
  259. package/build/esm/cc/index.d.ts.map +1 -1
  260. package/build/esm/cc/index.js +5 -0
  261. package/build/esm/cc/index.js.map +1 -1
  262. package/build/esm/cc/manufacturerProprietary/FibaroCC.js +1 -1
  263. package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
  264. package/build/esm/lib/API.d.ts +2 -0
  265. package/build/esm/lib/API.d.ts.map +1 -1
  266. package/build/esm/lib/API.js +2 -2
  267. package/build/esm/lib/API.js.map +1 -1
  268. package/build/esm/lib/CommandClass.d.ts +7 -7
  269. package/build/esm/lib/CommandClass.d.ts.map +1 -1
  270. package/build/esm/lib/CommandClass.js +6 -6
  271. package/build/esm/lib/CommandClass.js.map +1 -1
  272. package/build/esm/lib/NotificationEventPayload.d.ts +2 -1
  273. package/build/esm/lib/NotificationEventPayload.d.ts.map +1 -1
  274. package/build/esm/lib/NotificationEventPayload.js.map +1 -1
  275. package/build/esm/lib/Security2/Extension.d.ts +12 -12
  276. package/build/esm/lib/Security2/Extension.d.ts.map +1 -1
  277. package/build/esm/lib/Security2/Extension.js +1 -1
  278. package/build/esm/lib/Security2/Extension.js.map +1 -1
  279. package/build/esm/lib/_Types.d.ts +11 -1
  280. package/build/esm/lib/_Types.d.ts.map +1 -1
  281. package/build/esm/lib/_Types.js +11 -0
  282. package/build/esm/lib/_Types.js.map +1 -1
  283. package/build/esm/lib/serializers.d.ts +4 -4
  284. package/build/esm/lib/serializers.d.ts.map +1 -1
  285. package/build/esm/lib/serializers.js.map +1 -1
  286. package/build/esm/lib/traits.d.ts +5 -0
  287. package/build/esm/lib/traits.d.ts.map +1 -1
  288. package/build/esm/lib/utils.js +1 -1
  289. package/build/esm/lib/utils.js.map +1 -1
  290. package/package.json +12 -13
  291. package/build/cjs/lib/ICommandClassContainer.d.ts +0 -2
  292. package/build/cjs/lib/ICommandClassContainer.js +0 -17
  293. package/build/cjs/lib/ICommandClassContainer.js.map +0 -7
  294. package/build/esm/lib/ICommandClassContainer.d.ts +0 -2
  295. package/build/esm/lib/ICommandClassContainer.d.ts.map +0 -1
  296. package/build/esm/lib/ICommandClassContainer.js +0 -2
  297. package/build/esm/lib/ICommandClassContainer.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cc/MultilevelSwitchCC.ts"],
4
- "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\tDuration,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MaybeUnknown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\tNOT_KNOWN,\n\ttype SupervisionResult,\n\tSupervisionStatus,\n\tValueMetadata,\n\ttype WithAddress,\n\tmaybeUnknownToString,\n\tparseMaybeNumber,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, pick } from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\tSET_VALUE_HOOKS,\n\ttype SetValueImplementation,\n\ttype SetValueImplementationHooksFactory,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\tmultilevelSwitchTypeProperties,\n\tmultilevelSwitchTypeToActions,\n} from \"../lib/CCValueUtils.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n\tgetEffectiveCCVersion,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport {\n\tLevelChangeDirection,\n\tMultilevelSwitchCommand,\n\tSwitchType,\n} from \"../lib/_Types.js\";\n\nexport const MultilevelSwitchCCValues = V.defineCCValues(\n\tCommandClasses[\"Multilevel Switch\"],\n\t{\n\t\t...V.staticProperty(\n\t\t\t\"currentValue\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnlyLevel,\n\t\t\t\tlabel: \"Current value\",\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"targetValue\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.Level,\n\t\t\t\tlabel: \"Target value\",\n\t\t\t\tvalueChangeOptions: [\"transitionDuration\"],\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"duration\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnlyDuration,\n\t\t\t\tlabel: \"Remaining duration\",\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"restorePrevious\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\tlabel: \"Restore previous value\",\n\t\t\t\tstates: {\n\t\t\t\t\ttrue: \"Restore\",\n\t\t\t\t},\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticPropertyWithName(\n\t\t\t\"compatEvent\",\n\t\t\t\"event\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnlyUInt8,\n\t\t\t\tlabel: \"Event value\",\n\t\t\t} as const,\n\t\t\t{\n\t\t\t\tstateful: false,\n\t\t\t\tautoCreate: (applHost, endpoint) =>\n\t\t\t\t\t!!applHost.getDeviceConfig?.(endpoint.nodeId)?.compat\n\t\t\t\t\t\t?.treatMultilevelSwitchSetAsEvent,\n\t\t\t},\n\t\t),\n\t\t...V.staticProperty(\"switchType\", undefined, { internal: true }),\n\t\t...V.staticProperty(\"superviseStartStopLevelChange\", undefined, {\n\t\t\tinternal: true,\n\t\t\tsupportsEndpoints: false,\n\t\t}),\n\t\t...V.dynamicPropertyWithName(\n\t\t\t\"levelChangeUp\",\n\t\t\t// This is called \"up\" here, but the actual property name will depend on\n\t\t\t// the given switch type\n\t\t\t(switchType: SwitchType) => {\n\t\t\t\tconst switchTypeName = getEnumMemberName(\n\t\t\t\t\tSwitchType,\n\t\t\t\t\tswitchType,\n\t\t\t\t);\n\t\t\t\tconst [, up] = multilevelSwitchTypeToActions(switchTypeName);\n\t\t\t\treturn up;\n\t\t\t},\n\t\t\t({ property }) =>\n\t\t\t\ttypeof property === \"string\"\n\t\t\t\t&& multilevelSwitchTypeProperties.indexOf(property) % 2 === 1,\n\t\t\t(switchType: SwitchType) => {\n\t\t\t\tconst switchTypeName = getEnumMemberName(\n\t\t\t\t\tSwitchType,\n\t\t\t\t\tswitchType,\n\t\t\t\t);\n\t\t\t\tconst [, up] = multilevelSwitchTypeToActions(switchTypeName);\n\t\t\t\treturn {\n\t\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\t\tlabel: `Perform a level change (${up})`,\n\t\t\t\t\tvalueChangeOptions: [\"transitionDuration\"],\n\t\t\t\t\tstates: {\n\t\t\t\t\t\ttrue: \"Start\",\n\t\t\t\t\t\tfalse: \"Stop\",\n\t\t\t\t\t},\n\t\t\t\t\tccSpecific: { switchType },\n\t\t\t\t} as const;\n\t\t\t},\n\t\t),\n\t\t...V.dynamicPropertyWithName(\n\t\t\t\"levelChangeDown\",\n\t\t\t// This is called \"down\" here, but the actual property name will depend on\n\t\t\t// the given switch type\n\t\t\t(switchType: SwitchType) => {\n\t\t\t\tconst switchTypeName = getEnumMemberName(\n\t\t\t\t\tSwitchType,\n\t\t\t\t\tswitchType,\n\t\t\t\t);\n\t\t\t\tconst [down] = multilevelSwitchTypeToActions(switchTypeName);\n\t\t\t\treturn down;\n\t\t\t},\n\t\t\t({ property }) =>\n\t\t\t\ttypeof property === \"string\"\n\t\t\t\t&& multilevelSwitchTypeProperties.indexOf(property) % 2 === 0,\n\t\t\t(switchType: SwitchType) => {\n\t\t\t\tconst switchTypeName = getEnumMemberName(\n\t\t\t\t\tSwitchType,\n\t\t\t\t\tswitchType,\n\t\t\t\t);\n\t\t\t\tconst [down] = multilevelSwitchTypeToActions(switchTypeName);\n\t\t\t\treturn {\n\t\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\t\tlabel: `Perform a level change (${down})`,\n\t\t\t\t\tvalueChangeOptions: [\"transitionDuration\"],\n\t\t\t\t\tstates: {\n\t\t\t\t\t\ttrue: \"Start\",\n\t\t\t\t\t\tfalse: \"Stop\",\n\t\t\t\t\t},\n\t\t\t\t\tccSpecific: { switchType },\n\t\t\t\t} as const;\n\t\t\t},\n\t\t),\n\t},\n);\n\n@API(CommandClasses[\"Multilevel Switch\"])\nexport class MultilevelSwitchCCAPI extends CCAPI {\n\tpublic supportsCommand(\n\t\tcmd: MultilevelSwitchCommand,\n\t): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase MultilevelSwitchCommand.Get:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase MultilevelSwitchCommand.Set:\n\t\t\tcase MultilevelSwitchCommand.StartLevelChange:\n\t\t\tcase MultilevelSwitchCommand.StopLevelChange:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase MultilevelSwitchCommand.SupportedGet:\n\t\t\t\treturn this.version >= 3 && this.isSinglecast();\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async get() {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.Get,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSwitchCCReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"currentValue\", \"targetValue\", \"duration\"]);\n\t\t}\n\t}\n\n\t/**\n\t * Sets the switch to a new value\n\t * @param targetValue The new target value for the switch\n\t * @param duration The duration after which the target value should be reached. Can be a Duration instance or a user-friendly duration string like `\"1m17s\"`. Only supported in V2 and above.\n\t * @returns A promise indicating whether the command was completed\n\t */\n\t@validateArgs()\n\tpublic async set(\n\t\ttargetValue: number,\n\t\tduration?: Duration | string,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.Set,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\ttargetValue,\n\t\t\tduration,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async startLevelChange(\n\t\toptions: MultilevelSwitchCCStartLevelChangeOptions,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.StartLevelChange,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCStartLevelChange({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async stopLevelChange(): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.StopLevelChange,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCStopLevelChange({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async getSupported(): Promise<MaybeNotKnown<SwitchType>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.SupportedGet,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCSupportedGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSwitchCCSupportedReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.switchType;\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: MultilevelSwitchCCAPI,\n\t\t\t{ property },\n\t\t\tvalue,\n\t\t\toptions,\n\t\t) {\n\t\t\t// Enable restoring the previous non-zero value\n\t\t\tif (property === \"restorePrevious\") {\n\t\t\t\tproperty = \"targetValue\";\n\t\t\t\tvalue = 255;\n\t\t\t}\n\n\t\t\tif (property === \"targetValue\") {\n\t\t\t\tif (typeof value !== \"number\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst duration = Duration.from(options?.transitionDuration);\n\t\t\t\treturn this.set(value, duration);\n\t\t\t} else if (\n\t\t\t\tmultilevelSwitchTypeProperties.includes(property as string)\n\t\t\t) {\n\t\t\t\t// Since the switch only supports one of the switch types, we would\n\t\t\t\t// need to check if the correct one is used. But since the names are\n\t\t\t\t// purely cosmetic, we just accept all of them\n\t\t\t\tif (typeof value !== \"boolean\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (value) {\n\t\t\t\t\t// The property names are organized so that positive motions are\n\t\t\t\t\t// at odd indices and negative motions at even indices\n\t\t\t\t\tconst direction = multilevelSwitchTypeProperties.indexOf(\n\t\t\t\t\t\t\t\t\tproperty as string,\n\t\t\t\t\t\t\t\t) % 2\n\t\t\t\t\t\t\t=== 0\n\t\t\t\t\t\t? \"down\"\n\t\t\t\t\t\t: \"up\";\n\t\t\t\t\t// Singlecast only: Try to retrieve the current value to use as the start level,\n\t\t\t\t\t// even if the target node is going to ignore it. There might\n\t\t\t\t\t// be some bugged devices that ignore the ignore start level flag.\n\t\t\t\t\tconst startLevel = this.tryGetValueDB()?.getValue<\n\t\t\t\t\t\tMaybeUnknown<number>\n\t\t\t\t\t>(\n\t\t\t\t\t\tMultilevelSwitchCCValues.currentValue.endpoint(\n\t\t\t\t\t\t\tthis.endpoint.index,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\t// And perform the level change\n\t\t\t\t\tconst duration = Duration.from(options?.transitionDuration);\n\t\t\t\t\treturn this.startLevelChange({\n\t\t\t\t\t\tdirection,\n\t\t\t\t\t\tignoreStartLevel: true,\n\t\t\t\t\t\tstartLevel: typeof startLevel === \"number\"\n\t\t\t\t\t\t\t? startLevel\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tduration,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.stopLevelChange();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n\n\tprotected [SET_VALUE_HOOKS]: SetValueImplementationHooksFactory = (\n\t\t{ property },\n\t\tvalue,\n\t\toptions,\n\t) => {\n\t\t// Enable restoring the previous non-zero value\n\t\tif (property === \"restorePrevious\") {\n\t\t\tproperty = \"targetValue\";\n\t\t\tvalue = 255;\n\t\t}\n\n\t\tif (property === \"targetValue\") {\n\t\t\tconst duration = Duration.from(options?.transitionDuration);\n\t\t\tconst currentValueValueId = MultilevelSwitchCCValues.currentValue\n\t\t\t\t.endpoint(\n\t\t\t\t\tthis.endpoint.index,\n\t\t\t\t);\n\n\t\t\treturn {\n\t\t\t\t// Multilevel Switch commands may take some time to be executed.\n\t\t\t\t// Therefore we try to supervise the command execution and delay the\n\t\t\t\t// optimistic update until the final result is received.\n\t\t\t\tsupervisionDelayedUpdates: true,\n\t\t\t\tsupervisionOnSuccess: async () => {\n\t\t\t\t\t// Only update currentValue for valid target values\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof value === \"number\"\n\t\t\t\t\t\t&& value >= 0\n\t\t\t\t\t\t&& value <= 99\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.tryGetValueDB()?.setValue(\n\t\t\t\t\t\t\tcurrentValueValueId,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (value === 255) {\n\t\t\t\t\t\t// We don't know the status now, so refresh the current value\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.get();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsupervisionOnFailure: async () => {\n\t\t\t\t\t// The transition failed, so now we don't know the status - refresh the current value\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.get();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\toptimisticallyUpdateRelatedValues: (\n\t\t\t\t\t_supervisedAndSuccessful,\n\t\t\t\t) => {\n\t\t\t\t\t// Only update currentValue for valid target values\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof value === \"number\"\n\t\t\t\t\t\t&& value >= 0\n\t\t\t\t\t\t&& value <= 99\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (this.isSinglecast()) {\n\t\t\t\t\t\t\tthis.tryGetValueDB()?.setValue(\n\t\t\t\t\t\t\t\tcurrentValueValueId,\n\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (this.isMulticast()) {\n\t\t\t\t\t\t\t// Figure out which nodes were affected by this command\n\t\t\t\t\t\t\tconst affectedNodes = this.endpoint.node\n\t\t\t\t\t\t\t\t.physicalNodes.filter(\n\t\t\t\t\t\t\t\t\t(node) =>\n\t\t\t\t\t\t\t\t\t\tnode\n\t\t\t\t\t\t\t\t\t\t\t.getEndpoint(this.endpoint.index)\n\t\t\t\t\t\t\t\t\t\t\t?.supportsCC(this.ccId),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// and optimistically update the currentValue\n\t\t\t\t\t\t\tfor (const node of affectedNodes) {\n\t\t\t\t\t\t\t\tthis.host\n\t\t\t\t\t\t\t\t\t.tryGetValueDB(node.id)\n\t\t\t\t\t\t\t\t\t?.setValue(currentValueValueId, value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tforceVerifyChanges: () => {\n\t\t\t\t\t// If we don't know the actual value, we need to verify the change, regardless of the supervision result\n\t\t\t\t\treturn value === 255;\n\t\t\t\t},\n\t\t\t\tverifyChanges: async (result) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// We generally don't want to poll for multicasts because of how much traffic it can cause\n\t\t\t\t\t\t// However, when setting the value 255 (ON), we don't know the actual state\n\t\t\t\t\t\t!(this.isSinglecast()\n\t\t\t\t\t\t\t|| (this.isMulticast() && value === 255))\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (result?.status) {\n\t\t\t\t\t\tcase SupervisionStatus.Success:\n\t\t\t\t\t\tcase SupervisionStatus.Fail:\n\t\t\t\t\t\t\tawait this.pollValue!(currentValueValueId);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SupervisionStatus.Working:\n\t\t\t\t\t\tdefault: // (not supervised)\n\t\t\t\t\t\t\t(this as this).schedulePoll(\n\t\t\t\t\t\t\t\tcurrentValueValueId,\n\t\t\t\t\t\t\t\tvalue === 255 ? undefined : value,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tduration: result?.remainingDuration\n\t\t\t\t\t\t\t\t\t\t?? duration,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t};\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: MultilevelSwitchCCAPI, { property }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"currentValue\":\n\t\t\t\tcase \"targetValue\":\n\t\t\t\tcase \"duration\":\n\t\t\t\t\treturn (await this.get())?.[property];\n\t\t\t\tdefault:\n\t\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n}\n\n@commandClass(CommandClasses[\"Multilevel Switch\"])\n@implementedVersion(4)\n@ccValues(MultilevelSwitchCCValues)\nexport class MultilevelSwitchCC extends CommandClass {\n\tdeclare ccCommand: MultilevelSwitchCommand;\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multilevel Switch\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tif (api.version >= 3) {\n\t\t\t// Find out which kind of switch this is\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"requesting switch type...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst switchType = await api.getSupported();\n\t\t\tif (switchType != undefined) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `has switch type ${\n\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\tSwitchType,\n\t\t\t\t\t\t\tswitchType,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// requesting the switch type automatically creates the up/down actions\n\t\t\t// We need to do this manually for V1 and V2\n\t\t\tthis.createMetadataForLevelChangeActions(ctx);\n\t\t}\n\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multilevel Switch\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: \"requesting current switch state...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tawait api.get();\n\t}\n\n\tpublic setMappedBasicValue(\n\t\tctx: GetValueDB,\n\t\tvalue: number,\n\t): boolean {\n\t\tthis.setValue(ctx, MultilevelSwitchCCValues.currentValue, value);\n\t\treturn true;\n\t}\n\n\tprotected createMetadataForLevelChangeActions(\n\t\tctx: GetValueDB,\n\t\t// SDS13781: The Primary Switch Type SHOULD be 0x02 (Up/Down)\n\t\tswitchType: SwitchType = SwitchType[\"Down/Up\"],\n\t): void {\n\t\tthis.ensureMetadata(\n\t\t\tctx,\n\t\t\tMultilevelSwitchCCValues.levelChangeUp(switchType),\n\t\t);\n\t\tthis.ensureMetadata(\n\t\t\tctx,\n\t\t\tMultilevelSwitchCCValues.levelChangeDown(switchType),\n\t\t);\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSwitchCCSetOptions {\n\ttargetValue: number;\n\t// Version >= 2:\n\tduration?: Duration | string;\n}\n\n@CCCommand(MultilevelSwitchCommand.Set)\n@useSupervision()\nexport class MultilevelSwitchCCSet extends MultilevelSwitchCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSwitchCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.targetValue = options.targetValue;\n\t\tthis.duration = Duration.from(options.duration);\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSwitchCCSet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst targetValue = raw.payload[0];\n\t\tlet duration: Duration | undefined;\n\n\t\tif (raw.payload.length >= 2) {\n\t\t\tduration = Duration.parseReport(raw.payload[1]);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttargetValue,\n\t\t\tduration,\n\t\t});\n\t}\n\n\tpublic targetValue: number;\n\tpublic duration: Duration | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([\n\t\t\tthis.targetValue,\n\t\t\t(this.duration ?? Duration.default()).serializeSet(),\n\t\t]);\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\t\tif (\n\t\t\tccVersion < 2 && ctx.getDeviceConfig?.(\n\t\t\t\tthis.nodeId as number,\n\t\t\t)?.compat?.encodeCCsUsingTargetVersion\n\t\t) {\n\t\t\t// When forcing CC version 1, only include the target value\n\t\t\tthis.payload = this.payload.subarray(0, 1);\n\t\t}\n\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\t\"target value\": this.targetValue,\n\t\t};\n\t\tif (this.duration) {\n\t\t\tmessage.duration = this.duration.toString();\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSwitchCCReportOptions {\n\tcurrentValue?: MaybeUnknown<number>;\n\ttargetValue?: MaybeUnknown<number>;\n\tduration?: Duration | string;\n}\n\n@CCCommand(MultilevelSwitchCommand.Report)\n@ccValueProperty(\"targetValue\", MultilevelSwitchCCValues.targetValue)\n@ccValueProperty(\"duration\", MultilevelSwitchCCValues.duration)\n@ccValueProperty(\"currentValue\", MultilevelSwitchCCValues.currentValue)\nexport class MultilevelSwitchCCReport extends MultilevelSwitchCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSwitchCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.currentValue = options.currentValue;\n\t\tthis.targetValue = options.targetValue;\n\t\tthis.duration = Duration.from(options.duration);\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSwitchCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst currentValue: MaybeUnknown<number> | undefined =\n\t\t\t// 0xff is a legacy value for 100% (99)\n\t\t\traw.payload[0] === 0xff\n\t\t\t\t? 99\n\t\t\t\t: parseMaybeNumber(raw.payload[0]);\n\t\tlet targetValue: MaybeUnknown<number> | undefined;\n\t\tlet duration: Duration | undefined;\n\n\t\tif (raw.payload.length >= 3) {\n\t\t\ttargetValue = parseMaybeNumber(raw.payload[1]);\n\t\t\tduration = Duration.parseReport(raw.payload[2]);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tcurrentValue,\n\t\t\ttargetValue,\n\t\t\tduration,\n\t\t});\n\t}\n\n\tpublic targetValue: MaybeUnknown<number> | undefined;\n\n\tpublic duration: Duration | undefined;\n\n\tpublic currentValue: MaybeUnknown<number> | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([\n\t\t\tthis.currentValue ?? 0xfe,\n\t\t\tthis.targetValue ?? 0xfe,\n\t\t\t(this.duration ?? Duration.default()).serializeReport(),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\t\"current value\": maybeUnknownToString(this.currentValue),\n\t\t};\n\t\tif (this.targetValue !== NOT_KNOWN && this.duration) {\n\t\t\tmessage[\"target value\"] = maybeUnknownToString(this.targetValue);\n\t\t\tmessage.duration = this.duration.toString();\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n@CCCommand(MultilevelSwitchCommand.Get)\n@expectedCCResponse(MultilevelSwitchCCReport)\nexport class MultilevelSwitchCCGet extends MultilevelSwitchCC {}\n\n// @publicAPI\nexport type MultilevelSwitchCCStartLevelChangeOptions =\n\t& {\n\t\tdirection: keyof typeof LevelChangeDirection;\n\t}\n\t& (\n\t\t| {\n\t\t\tignoreStartLevel: true;\n\t\t\tstartLevel?: number;\n\t\t}\n\t\t| {\n\t\t\tignoreStartLevel: false;\n\t\t\tstartLevel: number;\n\t\t}\n\t)\n\t& {\n\t\t// Version >= 2:\n\t\tduration?: Duration | string;\n\t};\n\n@CCCommand(MultilevelSwitchCommand.StartLevelChange)\n@useSupervision()\nexport class MultilevelSwitchCCStartLevelChange extends MultilevelSwitchCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSwitchCCStartLevelChangeOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.duration = Duration.from(options.duration);\n\t\tthis.ignoreStartLevel = options.ignoreStartLevel;\n\t\tthis.startLevel = options.startLevel ?? 0;\n\t\tthis.direction = options.direction;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSwitchCCStartLevelChange {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst ignoreStartLevel = !!((raw.payload[0] & 0b0_0_1_00000) >>> 5);\n\t\tconst direction = ((raw.payload[0] & 0b0_1_0_00000) >>> 6)\n\t\t\t? \"down\"\n\t\t\t: \"up\";\n\t\tconst startLevel = raw.payload[1];\n\t\tlet duration: Duration | undefined;\n\t\tif (raw.payload.length >= 3) {\n\t\t\tduration = Duration.parseSet(raw.payload[2]);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tignoreStartLevel,\n\t\t\tdirection,\n\t\t\tstartLevel,\n\t\t\tduration,\n\t\t});\n\t}\n\n\tpublic duration: Duration | undefined;\n\tpublic startLevel: number;\n\tpublic ignoreStartLevel: boolean;\n\tpublic direction: keyof typeof LevelChangeDirection;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst controlByte = (LevelChangeDirection[this.direction] << 6)\n\t\t\t| (this.ignoreStartLevel ? 0b0010_0000 : 0);\n\t\tthis.payload = Bytes.from([\n\t\t\tcontrolByte,\n\t\t\tthis.startLevel,\n\t\t\t(this.duration ?? Duration.default()).serializeSet(),\n\t\t]);\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\t\tif (\n\t\t\tccVersion < 2 && ctx.getDeviceConfig?.(\n\t\t\t\tthis.nodeId as number,\n\t\t\t)?.compat?.encodeCCsUsingTargetVersion\n\t\t) {\n\t\t\t// When forcing CC version 1, omit the duration byte\n\t\t\tthis.payload = this.payload.subarray(0, -1);\n\t\t}\n\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\tstartLevel: `${this.startLevel}${\n\t\t\t\tthis.ignoreStartLevel ? \" (ignored)\" : \"\"\n\t\t\t}`,\n\t\t\tdirection: this.direction,\n\t\t};\n\t\tif (this.duration) {\n\t\t\tmessage.duration = this.duration.toString();\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n@CCCommand(MultilevelSwitchCommand.StopLevelChange)\n@useSupervision()\nexport class MultilevelSwitchCCStopLevelChange extends MultilevelSwitchCC {}\n\n// @publicAPI\nexport interface MultilevelSwitchCCSupportedReportOptions {\n\tswitchType: SwitchType;\n}\n\n@CCCommand(MultilevelSwitchCommand.SupportedReport)\n@ccValueProperty(\"switchType\", MultilevelSwitchCCValues.switchType)\nexport class MultilevelSwitchCCSupportedReport extends MultilevelSwitchCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSwitchCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.switchType = options.switchType;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSwitchCCSupportedReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst switchType: SwitchType = raw.payload[0] & 0b11111;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tswitchType,\n\t\t});\n\t}\n\n\t// This is the primary switch type. We're not supporting secondary switch types\n\n\tpublic readonly switchType: SwitchType;\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\t\tthis.createMetadataForLevelChangeActions(ctx, this.switchType);\n\t\treturn true;\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.switchType & 0b11111]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"switch type\": getEnumMemberName(SwitchType, this.switchType),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(MultilevelSwitchCommand.SupportedGet)\n@expectedCCResponse(MultilevelSwitchCCSupportedReport)\nexport class MultilevelSwitchCCSupportedGet extends MultilevelSwitchCC {}\n"],
4
+ "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\tDuration,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MaybeUnknown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\tNOT_KNOWN,\n\ttype SupervisionResult,\n\tSupervisionStatus,\n\tValueMetadata,\n\ttype WithAddress,\n\tmaybeUnknownToString,\n\tparseMaybeNumber,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, pick } from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\tSET_VALUE_HOOKS,\n\ttype SetValueImplementation,\n\ttype SetValueImplementationHooksFactory,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\tmultilevelSwitchTypeProperties,\n\tmultilevelSwitchTypeToActions,\n} from \"../lib/CCValueUtils.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n\tgetEffectiveCCVersion,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport {\n\tLevelChangeDirection,\n\tMultilevelSwitchCommand,\n\tSwitchType,\n} from \"../lib/_Types.js\";\n\nexport const MultilevelSwitchCCValues = V.defineCCValues(\n\tCommandClasses[\"Multilevel Switch\"],\n\t{\n\t\t...V.staticProperty(\n\t\t\t\"currentValue\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnlyLevel,\n\t\t\t\tlabel: \"Current value\",\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"targetValue\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.Level,\n\t\t\t\tlabel: \"Target value\",\n\t\t\t\tvalueChangeOptions: [\"transitionDuration\"],\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"duration\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnlyDuration,\n\t\t\t\tlabel: \"Remaining duration\",\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"restorePrevious\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\tlabel: \"Restore previous value\",\n\t\t\t\tstates: {\n\t\t\t\t\ttrue: \"Restore\",\n\t\t\t\t},\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticPropertyWithName(\n\t\t\t\"compatEvent\",\n\t\t\t\"event\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnlyUInt8,\n\t\t\t\tlabel: \"Event value\",\n\t\t\t} as const,\n\t\t\t{\n\t\t\t\tstateful: false,\n\t\t\t\tautoCreate: (applHost, endpoint) =>\n\t\t\t\t\t!!applHost.getDeviceConfig?.(endpoint.nodeId)?.compat\n\t\t\t\t\t\t?.treatMultilevelSwitchSetAsEvent,\n\t\t\t},\n\t\t),\n\t\t...V.staticProperty(\"switchType\", undefined, { internal: true }),\n\t\t...V.staticProperty(\"superviseStartStopLevelChange\", undefined, {\n\t\t\tinternal: true,\n\t\t\tsupportsEndpoints: false,\n\t\t}),\n\t\t...V.dynamicPropertyWithName(\n\t\t\t\"levelChangeUp\",\n\t\t\t// This is called \"up\" here, but the actual property name will depend on\n\t\t\t// the given switch type\n\t\t\t(switchType: SwitchType) => {\n\t\t\t\tconst switchTypeName = getEnumMemberName(\n\t\t\t\t\tSwitchType,\n\t\t\t\t\tswitchType,\n\t\t\t\t);\n\t\t\t\tconst [, up] = multilevelSwitchTypeToActions(switchTypeName);\n\t\t\t\treturn up;\n\t\t\t},\n\t\t\t({ property }) =>\n\t\t\t\ttypeof property === \"string\"\n\t\t\t\t&& multilevelSwitchTypeProperties.indexOf(property) % 2 === 1,\n\t\t\t(switchType: SwitchType) => {\n\t\t\t\tconst switchTypeName = getEnumMemberName(\n\t\t\t\t\tSwitchType,\n\t\t\t\t\tswitchType,\n\t\t\t\t);\n\t\t\t\tconst [, up] = multilevelSwitchTypeToActions(switchTypeName);\n\t\t\t\treturn {\n\t\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\t\tlabel: `Perform a level change (${up})`,\n\t\t\t\t\tvalueChangeOptions: [\"transitionDuration\"],\n\t\t\t\t\tstates: {\n\t\t\t\t\t\ttrue: \"Start\",\n\t\t\t\t\t\tfalse: \"Stop\",\n\t\t\t\t\t},\n\t\t\t\t\tccSpecific: { switchType },\n\t\t\t\t} as const;\n\t\t\t},\n\t\t),\n\t\t...V.dynamicPropertyWithName(\n\t\t\t\"levelChangeDown\",\n\t\t\t// This is called \"down\" here, but the actual property name will depend on\n\t\t\t// the given switch type\n\t\t\t(switchType: SwitchType) => {\n\t\t\t\tconst switchTypeName = getEnumMemberName(\n\t\t\t\t\tSwitchType,\n\t\t\t\t\tswitchType,\n\t\t\t\t);\n\t\t\t\tconst [down] = multilevelSwitchTypeToActions(switchTypeName);\n\t\t\t\treturn down;\n\t\t\t},\n\t\t\t({ property }) =>\n\t\t\t\ttypeof property === \"string\"\n\t\t\t\t&& multilevelSwitchTypeProperties.indexOf(property) % 2 === 0,\n\t\t\t(switchType: SwitchType) => {\n\t\t\t\tconst switchTypeName = getEnumMemberName(\n\t\t\t\t\tSwitchType,\n\t\t\t\t\tswitchType,\n\t\t\t\t);\n\t\t\t\tconst [down] = multilevelSwitchTypeToActions(switchTypeName);\n\t\t\t\treturn {\n\t\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\t\tlabel: `Perform a level change (${down})`,\n\t\t\t\t\tvalueChangeOptions: [\"transitionDuration\"],\n\t\t\t\t\tstates: {\n\t\t\t\t\t\ttrue: \"Start\",\n\t\t\t\t\t\tfalse: \"Stop\",\n\t\t\t\t\t},\n\t\t\t\t\tccSpecific: { switchType },\n\t\t\t\t} as const;\n\t\t\t},\n\t\t),\n\t},\n);\n\n@API(CommandClasses[\"Multilevel Switch\"])\nexport class MultilevelSwitchCCAPI extends CCAPI {\n\tpublic supportsCommand(\n\t\tcmd: MultilevelSwitchCommand,\n\t): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase MultilevelSwitchCommand.Get:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase MultilevelSwitchCommand.Set:\n\t\t\tcase MultilevelSwitchCommand.StartLevelChange:\n\t\t\tcase MultilevelSwitchCommand.StopLevelChange:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase MultilevelSwitchCommand.SupportedGet:\n\t\t\t\treturn this.version >= 3 && this.isSinglecast();\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic async get() {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.Get,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSwitchCCReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"currentValue\", \"targetValue\", \"duration\"]);\n\t\t}\n\t}\n\n\t/**\n\t * Sets the switch to a new value\n\t * @param targetValue The new target value for the switch\n\t * @param duration The duration after which the target value should be reached. Can be a Duration instance or a user-friendly duration string like `\"1m17s\"`. Only supported in V2 and above.\n\t * @returns A promise indicating whether the command was completed\n\t */\n\t@validateArgs()\n\tpublic async set(\n\t\ttargetValue: number,\n\t\tduration?: Duration | string,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.Set,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\ttargetValue,\n\t\t\tduration,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async startLevelChange(\n\t\toptions: MultilevelSwitchCCStartLevelChangeOptions,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.StartLevelChange,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCStartLevelChange({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async stopLevelChange(): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.StopLevelChange,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCStopLevelChange({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async getSupported(): Promise<MaybeNotKnown<SwitchType>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSwitchCommand,\n\t\t\tMultilevelSwitchCommand.SupportedGet,\n\t\t);\n\n\t\tconst cc = new MultilevelSwitchCCSupportedGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSwitchCCSupportedReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.switchType;\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: MultilevelSwitchCCAPI,\n\t\t\t{ property },\n\t\t\tvalue,\n\t\t\toptions,\n\t\t) {\n\t\t\t// Enable restoring the previous non-zero value\n\t\t\tif (property === \"restorePrevious\") {\n\t\t\t\tproperty = \"targetValue\";\n\t\t\t\tvalue = 255;\n\t\t\t}\n\n\t\t\tif (property === \"targetValue\") {\n\t\t\t\tif (typeof value !== \"number\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst duration = Duration.from(options?.transitionDuration);\n\t\t\t\treturn this.set(value, duration);\n\t\t\t} else if (\n\t\t\t\tmultilevelSwitchTypeProperties.includes(property as string)\n\t\t\t) {\n\t\t\t\t// Since the switch only supports one of the switch types, we would\n\t\t\t\t// need to check if the correct one is used. But since the names are\n\t\t\t\t// purely cosmetic, we just accept all of them\n\t\t\t\tif (typeof value !== \"boolean\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (value) {\n\t\t\t\t\t// The property names are organized so that positive motions are\n\t\t\t\t\t// at odd indices and negative motions at even indices\n\t\t\t\t\tconst direction = multilevelSwitchTypeProperties.indexOf(\n\t\t\t\t\t\t\t\t\tproperty as string,\n\t\t\t\t\t\t\t\t) % 2\n\t\t\t\t\t\t\t=== 0\n\t\t\t\t\t\t? \"down\"\n\t\t\t\t\t\t: \"up\";\n\t\t\t\t\t// Singlecast only: Try to retrieve the current value to use as the start level,\n\t\t\t\t\t// even if the target node is going to ignore it. There might\n\t\t\t\t\t// be some bugged devices that ignore the ignore start level flag.\n\t\t\t\t\tconst startLevel = this.tryGetValueDB()?.getValue<\n\t\t\t\t\t\tMaybeUnknown<number>\n\t\t\t\t\t>(\n\t\t\t\t\t\tMultilevelSwitchCCValues.currentValue.endpoint(\n\t\t\t\t\t\t\tthis.endpoint.index,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\t// And perform the level change\n\t\t\t\t\tconst duration = Duration.from(options?.transitionDuration);\n\t\t\t\t\treturn this.startLevelChange({\n\t\t\t\t\t\tdirection,\n\t\t\t\t\t\tignoreStartLevel: true,\n\t\t\t\t\t\tstartLevel: typeof startLevel === \"number\"\n\t\t\t\t\t\t\t? startLevel\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tduration,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.stopLevelChange();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n\n\tprotected [SET_VALUE_HOOKS]: SetValueImplementationHooksFactory = (\n\t\t{ property },\n\t\tvalue,\n\t\toptions,\n\t) => {\n\t\t// Enable restoring the previous non-zero value\n\t\tif (property === \"restorePrevious\") {\n\t\t\tproperty = \"targetValue\";\n\t\t\tvalue = 255;\n\t\t}\n\n\t\tif (property === \"targetValue\") {\n\t\t\tconst duration = Duration.from(options?.transitionDuration);\n\t\t\tconst currentValueValueId = MultilevelSwitchCCValues.currentValue\n\t\t\t\t.endpoint(\n\t\t\t\t\tthis.endpoint.index,\n\t\t\t\t);\n\n\t\t\treturn {\n\t\t\t\t// Multilevel Switch commands may take some time to be executed.\n\t\t\t\t// Therefore we try to supervise the command execution and delay the\n\t\t\t\t// optimistic update until the final result is received.\n\t\t\t\tsupervisionDelayedUpdates: true,\n\t\t\t\tsupervisionOnSuccess: async () => {\n\t\t\t\t\t// Only update currentValue for valid target values\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof value === \"number\"\n\t\t\t\t\t\t&& value >= 0\n\t\t\t\t\t\t&& value <= 99\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.tryGetValueDB()?.setValue(\n\t\t\t\t\t\t\tcurrentValueValueId,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (value === 255) {\n\t\t\t\t\t\t// We don't know the status now, so refresh the current value\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.get();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsupervisionOnFailure: async () => {\n\t\t\t\t\t// The transition failed, so now we don't know the status - refresh the current value\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.get();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\toptimisticallyUpdateRelatedValues: (\n\t\t\t\t\t_supervisedAndSuccessful,\n\t\t\t\t) => {\n\t\t\t\t\t// Only update currentValue for valid target values\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof value === \"number\"\n\t\t\t\t\t\t&& value >= 0\n\t\t\t\t\t\t&& value <= 99\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (this.isSinglecast()) {\n\t\t\t\t\t\t\tthis.tryGetValueDB()?.setValue(\n\t\t\t\t\t\t\t\tcurrentValueValueId,\n\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (this.isMulticast()) {\n\t\t\t\t\t\t\t// Figure out which nodes were affected by this command\n\t\t\t\t\t\t\tconst affectedNodes = this.endpoint.node\n\t\t\t\t\t\t\t\t.physicalNodes.filter(\n\t\t\t\t\t\t\t\t\t(node) =>\n\t\t\t\t\t\t\t\t\t\tnode\n\t\t\t\t\t\t\t\t\t\t\t.getEndpoint(this.endpoint.index)\n\t\t\t\t\t\t\t\t\t\t\t?.supportsCC(this.ccId),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// and optimistically update the currentValue\n\t\t\t\t\t\t\tfor (const node of affectedNodes) {\n\t\t\t\t\t\t\t\tthis.host\n\t\t\t\t\t\t\t\t\t.tryGetValueDB(node.id)\n\t\t\t\t\t\t\t\t\t?.setValue(currentValueValueId, value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tforceVerifyChanges: () => {\n\t\t\t\t\t// If we don't know the actual value, we need to verify the change, regardless of the supervision result\n\t\t\t\t\treturn value === 255;\n\t\t\t\t},\n\t\t\t\tverifyChanges: async (result) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// We generally don't want to poll for multicasts because of how much traffic it can cause\n\t\t\t\t\t\t// However, when setting the value 255 (ON), we don't know the actual state\n\t\t\t\t\t\t!(this.isSinglecast()\n\t\t\t\t\t\t\t|| (this.isMulticast() && value === 255))\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch (result?.status) {\n\t\t\t\t\t\tcase SupervisionStatus.Success:\n\t\t\t\t\t\tcase SupervisionStatus.Fail:\n\t\t\t\t\t\t\tawait this.pollValue!(currentValueValueId);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SupervisionStatus.Working:\n\t\t\t\t\t\tdefault: // (not supervised)\n\t\t\t\t\t\t\t(this as this).schedulePoll(\n\t\t\t\t\t\t\t\tcurrentValueValueId,\n\t\t\t\t\t\t\t\tvalue === 255 ? undefined : value,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tduration: result?.remainingDuration\n\t\t\t\t\t\t\t\t\t\t?? duration,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t};\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: MultilevelSwitchCCAPI, { property }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"currentValue\":\n\t\t\t\tcase \"targetValue\":\n\t\t\t\tcase \"duration\":\n\t\t\t\t\treturn (await this.get())?.[property];\n\t\t\t\tdefault:\n\t\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n}\n\n@commandClass(CommandClasses[\"Multilevel Switch\"])\n@implementedVersion(4)\n@ccValues(MultilevelSwitchCCValues)\nexport class MultilevelSwitchCC extends CommandClass {\n\tdeclare ccCommand: MultilevelSwitchCommand;\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multilevel Switch\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tif (api.version >= 3) {\n\t\t\t// Find out which kind of switch this is\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"requesting switch type...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst switchType = await api.getSupported();\n\t\t\tif (switchType != undefined) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `has switch type ${\n\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\tSwitchType,\n\t\t\t\t\t\t\tswitchType,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// requesting the switch type automatically creates the up/down actions\n\t\t\t// We need to do this manually for V1 and V2\n\t\t\tthis.createMetadataForLevelChangeActions(ctx);\n\t\t}\n\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multilevel Switch\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: \"requesting current switch state...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tawait api.get();\n\t}\n\n\tpublic setMappedBasicValue(\n\t\tctx: GetValueDB,\n\t\tvalue: number,\n\t): boolean {\n\t\tthis.setValue(ctx, MultilevelSwitchCCValues.currentValue, value);\n\t\treturn true;\n\t}\n\n\tprotected createMetadataForLevelChangeActions(\n\t\tctx: GetValueDB,\n\t\t// SDS13781: The Primary Switch Type SHOULD be 0x02 (Up/Down)\n\t\tswitchType: SwitchType = SwitchType[\"Down/Up\"],\n\t): void {\n\t\tthis.ensureMetadata(\n\t\t\tctx,\n\t\t\tMultilevelSwitchCCValues.levelChangeUp(switchType),\n\t\t);\n\t\tthis.ensureMetadata(\n\t\t\tctx,\n\t\t\tMultilevelSwitchCCValues.levelChangeDown(switchType),\n\t\t);\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSwitchCCSetOptions {\n\ttargetValue: number;\n\t// Version >= 2:\n\tduration?: Duration | string;\n}\n\n@CCCommand(MultilevelSwitchCommand.Set)\n@useSupervision()\nexport class MultilevelSwitchCCSet extends MultilevelSwitchCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSwitchCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.targetValue = options.targetValue;\n\t\tthis.duration = Duration.from(options.duration);\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSwitchCCSet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst targetValue = raw.payload[0];\n\t\tlet duration: Duration | undefined;\n\n\t\tif (raw.payload.length >= 2) {\n\t\t\tduration = Duration.parseReport(raw.payload[1]);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttargetValue,\n\t\t\tduration,\n\t\t});\n\t}\n\n\tpublic targetValue: number;\n\tpublic duration: Duration | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([\n\t\t\tthis.targetValue,\n\t\t\t(this.duration ?? Duration.default()).serializeSet(),\n\t\t]);\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\t\tif (\n\t\t\tccVersion < 2 && ctx.getDeviceConfig?.(\n\t\t\t\tthis.nodeId as number,\n\t\t\t)?.compat?.encodeCCsUsingTargetVersion\n\t\t) {\n\t\t\t// When forcing CC version 1, only include the target value\n\t\t\tthis.payload = this.payload.subarray(0, 1);\n\t\t}\n\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\t\"target value\": this.targetValue,\n\t\t};\n\t\tif (this.duration) {\n\t\t\tmessage.duration = this.duration.toString();\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSwitchCCReportOptions {\n\tcurrentValue?: MaybeUnknown<number>;\n\ttargetValue?: MaybeUnknown<number>;\n\tduration?: Duration | string;\n}\n\n@CCCommand(MultilevelSwitchCommand.Report)\n@ccValueProperty(\"targetValue\", MultilevelSwitchCCValues.targetValue)\n@ccValueProperty(\"duration\", MultilevelSwitchCCValues.duration)\n@ccValueProperty(\"currentValue\", MultilevelSwitchCCValues.currentValue)\nexport class MultilevelSwitchCCReport extends MultilevelSwitchCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSwitchCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.currentValue = options.currentValue;\n\t\tthis.targetValue = options.targetValue;\n\t\tthis.duration = Duration.from(options.duration);\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSwitchCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst currentValue: MaybeUnknown<number> | undefined =\n\t\t\t// 0xff is a legacy value for 100% (99)\n\t\t\traw.payload[0] === 0xff\n\t\t\t\t? 99\n\t\t\t\t: parseMaybeNumber(raw.payload[0]);\n\t\tlet targetValue: MaybeUnknown<number> | undefined;\n\t\tlet duration: Duration | undefined;\n\n\t\tif (raw.payload.length >= 3) {\n\t\t\ttargetValue = parseMaybeNumber(raw.payload[1]);\n\t\t\tduration = Duration.parseReport(raw.payload[2]);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tcurrentValue,\n\t\t\ttargetValue,\n\t\t\tduration,\n\t\t});\n\t}\n\n\tpublic targetValue: MaybeUnknown<number> | undefined;\n\n\tpublic duration: Duration | undefined;\n\n\tpublic currentValue: MaybeUnknown<number> | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([\n\t\t\tthis.currentValue ?? 0xfe,\n\t\t\tthis.targetValue ?? 0xfe,\n\t\t\t(this.duration ?? Duration.default()).serializeReport(),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\t\"current value\": maybeUnknownToString(this.currentValue),\n\t\t};\n\t\tif (this.targetValue !== NOT_KNOWN && this.duration) {\n\t\t\tmessage[\"target value\"] = maybeUnknownToString(this.targetValue);\n\t\t\tmessage.duration = this.duration.toString();\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n@CCCommand(MultilevelSwitchCommand.Get)\n@expectedCCResponse(MultilevelSwitchCCReport)\nexport class MultilevelSwitchCCGet extends MultilevelSwitchCC {}\n\n// @publicAPI\nexport type MultilevelSwitchCCStartLevelChangeOptions =\n\t& {\n\t\tdirection: keyof typeof LevelChangeDirection;\n\t}\n\t& (\n\t\t| {\n\t\t\tignoreStartLevel: true;\n\t\t\tstartLevel?: number;\n\t\t}\n\t\t| {\n\t\t\tignoreStartLevel: false;\n\t\t\tstartLevel: number;\n\t\t}\n\t)\n\t& {\n\t\t// Version >= 2:\n\t\tduration?: Duration | string;\n\t};\n\n@CCCommand(MultilevelSwitchCommand.StartLevelChange)\n@useSupervision()\nexport class MultilevelSwitchCCStartLevelChange extends MultilevelSwitchCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSwitchCCStartLevelChangeOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.duration = Duration.from(options.duration);\n\t\tthis.ignoreStartLevel = options.ignoreStartLevel;\n\t\tthis.startLevel = options.startLevel ?? 0;\n\t\tthis.direction = options.direction;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSwitchCCStartLevelChange {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst ignoreStartLevel = !!((raw.payload[0] & 0b0_0_1_00000) >>> 5);\n\t\tconst direction = ((raw.payload[0] & 0b0_1_0_00000) >>> 6)\n\t\t\t? \"down\"\n\t\t\t: \"up\";\n\t\tconst startLevel = raw.payload[1];\n\t\tlet duration: Duration | undefined;\n\t\tif (raw.payload.length >= 3) {\n\t\t\tduration = Duration.parseSet(raw.payload[2]);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tignoreStartLevel,\n\t\t\tdirection,\n\t\t\tstartLevel,\n\t\t\tduration,\n\t\t});\n\t}\n\n\tpublic duration: Duration | undefined;\n\tpublic startLevel: number;\n\tpublic ignoreStartLevel: boolean;\n\tpublic direction: keyof typeof LevelChangeDirection;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst controlByte = (LevelChangeDirection[this.direction] << 6)\n\t\t\t| (this.ignoreStartLevel ? 0b0010_0000 : 0);\n\t\tthis.payload = Bytes.from([\n\t\t\tcontrolByte,\n\t\t\tthis.startLevel,\n\t\t\t(this.duration ?? Duration.default()).serializeSet(),\n\t\t]);\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\t\tif (\n\t\t\tccVersion < 2 && ctx.getDeviceConfig?.(\n\t\t\t\tthis.nodeId as number,\n\t\t\t)?.compat?.encodeCCsUsingTargetVersion\n\t\t) {\n\t\t\t// When forcing CC version 1, omit the duration byte\n\t\t\tthis.payload = this.payload.subarray(0, -1);\n\t\t}\n\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\tstartLevel: `${this.startLevel}${\n\t\t\t\tthis.ignoreStartLevel ? \" (ignored)\" : \"\"\n\t\t\t}`,\n\t\t\tdirection: this.direction,\n\t\t};\n\t\tif (this.duration) {\n\t\t\tmessage.duration = this.duration.toString();\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n@CCCommand(MultilevelSwitchCommand.StopLevelChange)\n@useSupervision()\nexport class MultilevelSwitchCCStopLevelChange extends MultilevelSwitchCC {}\n\n// @publicAPI\nexport interface MultilevelSwitchCCSupportedReportOptions {\n\tswitchType: SwitchType;\n}\n\n@CCCommand(MultilevelSwitchCommand.SupportedReport)\n@ccValueProperty(\"switchType\", MultilevelSwitchCCValues.switchType)\nexport class MultilevelSwitchCCSupportedReport extends MultilevelSwitchCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSwitchCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.switchType = options.switchType;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSwitchCCSupportedReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst switchType: SwitchType = raw.payload[0] & 0b11111;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tswitchType,\n\t\t});\n\t}\n\n\t// This is the primary switch type. We're not supporting secondary switch types\n\n\tpublic readonly switchType: SwitchType;\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\t\tthis.createMetadataForLevelChangeActions(ctx, this.switchType);\n\t\treturn true;\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.switchType & 0b11111]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"switch type\": getEnumMemberName(SwitchType, this.switchType),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(MultilevelSwitchCommand.SupportedGet)\n@expectedCCResponse(MultilevelSwitchCCSupportedReport)\nexport class MultilevelSwitchCCSupportedGet extends MultilevelSwitchCC {}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cc/NodeNamingCC.ts"],
4
- "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype SupervisionResult,\n\tValueMetadata,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport {\n\tBytes,\n\tstringToUint8ArrayUTF16BE,\n\tuint8ArrayToStringUTF16BE,\n} from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\tPhysicalCCAPI,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype RefreshValuesContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { NodeNamingAndLocationCommand } from \"../lib/_Types.js\";\n\nexport const NodeNamingAndLocationCCValues = V.defineCCValues(\n\tCommandClasses[\"Node Naming and Location\"],\n\t{\n\t\t...V.staticProperty(\n\t\t\t\"name\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.String,\n\t\t\t\tlabel: \"Node name\",\n\t\t\t} as const,\n\t\t\t{ supportsEndpoints: false },\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"location\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.String,\n\t\t\t\tlabel: \"Node location\",\n\t\t\t} as const,\n\t\t\t{ supportsEndpoints: false },\n\t\t),\n\t},\n);\n\nfunction isASCII(str: string): boolean {\n\treturn /^[\\x00-\\x7F]*$/.test(str);\n}\n\n@API(CommandClasses[\"Node Naming and Location\"])\nexport class NodeNamingAndLocationCCAPI extends PhysicalCCAPI {\n\tpublic supportsCommand(\n\t\tcmd: NodeNamingAndLocationCommand,\n\t): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase NodeNamingAndLocationCommand.NameGet:\n\t\t\tcase NodeNamingAndLocationCommand.NameSet:\n\t\t\tcase NodeNamingAndLocationCommand.LocationGet:\n\t\t\tcase NodeNamingAndLocationCommand.LocationSet:\n\t\t\t\treturn true; // This is mandatory\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: NodeNamingAndLocationCCAPI,\n\t\t\t{ property },\n\t\t\tvalue,\n\t\t) {\n\t\t\tif (property !== \"name\" && property !== \"location\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t\tif (typeof value !== \"string\") {\n\t\t\t\tthrowWrongValueType(\n\t\t\t\t\tthis.ccId,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"string\",\n\t\t\t\t\ttypeof value,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tswitch (property) {\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.setName(value);\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.setLocation(value);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\t}\n\n\tprotected override get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: NodeNamingAndLocationCCAPI, { property }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.getName();\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.getLocation();\n\t\t\t\tdefault:\n\t\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic async getName(): Promise<MaybeNotKnown<string>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tNodeNamingAndLocationCommand,\n\t\t\tNodeNamingAndLocationCommand.NameGet,\n\t\t);\n\n\t\tconst cc = new NodeNamingAndLocationCCNameGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tNodeNamingAndLocationCCNameReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.name;\n\t}\n\n\t@validateArgs()\n\tpublic async setName(name: string): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tNodeNamingAndLocationCommand,\n\t\t\tNodeNamingAndLocationCommand.NameSet,\n\t\t);\n\n\t\tconst cc = new NodeNamingAndLocationCCNameSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tname,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async getLocation(): Promise<MaybeNotKnown<string>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tNodeNamingAndLocationCommand,\n\t\t\tNodeNamingAndLocationCommand.LocationGet,\n\t\t);\n\n\t\tconst cc = new NodeNamingAndLocationCCLocationGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tNodeNamingAndLocationCCLocationReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.location;\n\t}\n\n\t@validateArgs()\n\tpublic async setLocation(\n\t\tlocation: string,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tNodeNamingAndLocationCommand,\n\t\t\tNodeNamingAndLocationCommand.LocationSet,\n\t\t);\n\n\t\tconst cc = new NodeNamingAndLocationCCLocationSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tlocation,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n}\n\n@commandClass(CommandClasses[\"Node Naming and Location\"])\n@implementedVersion(1)\n@ccValues(NodeNamingAndLocationCCValues)\nexport class NodeNamingAndLocationCC extends CommandClass {\n\tdeclare ccCommand: NodeNamingAndLocationCommand;\n\n\tpublic skipEndpointInterview(): boolean {\n\t\t// As the name says, this is for the node, not for endpoints\n\t\treturn true;\n\t}\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Node Naming and Location\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tmessage: \"retrieving node name...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst name = await api.getName();\n\t\tif (name != undefined) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tmessage: `is named \"${name}\"`,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t}\n\n\t\tctx.logNode(node.id, {\n\t\t\tmessage: \"retrieving node location...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst location = await api.getLocation();\n\t\tif (location != undefined) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tmessage: `received location: ${location}`,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport interface NodeNamingAndLocationCCNameSetOptions {\n\tname: string;\n}\n\n@CCCommand(NodeNamingAndLocationCommand.NameSet)\n@useSupervision()\nexport class NodeNamingAndLocationCCNameSet extends NodeNamingAndLocationCC {\n\tpublic constructor(\n\t\toptions: WithAddress<NodeNamingAndLocationCCNameSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.name = options.name;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): NodeNamingAndLocationCCNameSet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new NodeNamingAndLocationCCNameSet({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic name: string;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst encoding = isASCII(this.name) ? \"ascii\" : \"utf16le\";\n\t\tthis.payload = new Bytes(\n\t\t\t1 + this.name.length * (encoding === \"ascii\" ? 1 : 2),\n\t\t);\n\t\tthis.payload[0] = encoding === \"ascii\" ? 0x0 : 0x2;\n\t\tlet nameBuffer: Uint8Array;\n\t\tif (encoding === \"utf16le\") {\n\t\t\tnameBuffer = stringToUint8ArrayUTF16BE(this.name);\n\t\t} else {\n\t\t\tnameBuffer = Bytes.from(this.name, \"ascii\");\n\t\t}\n\t\t// Copy at most 16 bytes\n\t\tthis.payload.set(\n\t\t\tnameBuffer.subarray(0, Math.min(16, nameBuffer.length)),\n\t\t\t0,\n\t\t);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { name: this.name },\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface NodeNamingAndLocationCCNameReportOptions {\n\tname: string;\n}\n\n@CCCommand(NodeNamingAndLocationCommand.NameReport)\n@ccValueProperty(\"name\", NodeNamingAndLocationCCValues.name)\nexport class NodeNamingAndLocationCCNameReport extends NodeNamingAndLocationCC {\n\tpublic constructor(\n\t\toptions: WithAddress<NodeNamingAndLocationCCNameReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.name = options.name;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): NodeNamingAndLocationCCNameReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst encoding = raw.payload[0] === 2 ? \"utf16le\" : \"ascii\";\n\t\tconst nameBuffer = raw.payload.subarray(1);\n\t\tlet name: string;\n\t\tif (encoding === \"utf16le\") {\n\t\t\tvalidatePayload(nameBuffer.length % 2 === 0);\n\t\t\tname = uint8ArrayToStringUTF16BE(nameBuffer);\n\t\t} else {\n\t\t\tname = nameBuffer.toString(\"ascii\");\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tname,\n\t\t});\n\t}\n\n\tpublic readonly name: string;\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { name: this.name },\n\t\t};\n\t}\n}\n\n@CCCommand(NodeNamingAndLocationCommand.NameGet)\n@expectedCCResponse(NodeNamingAndLocationCCNameReport)\nexport class NodeNamingAndLocationCCNameGet extends NodeNamingAndLocationCC {}\n\n// @publicAPI\nexport interface NodeNamingAndLocationCCLocationSetOptions {\n\tlocation: string;\n}\n\n@CCCommand(NodeNamingAndLocationCommand.LocationSet)\n@useSupervision()\nexport class NodeNamingAndLocationCCLocationSet\n\textends NodeNamingAndLocationCC\n{\n\tpublic constructor(\n\t\toptions: WithAddress<NodeNamingAndLocationCCLocationSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.location = options.location;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): NodeNamingAndLocationCCLocationSet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new NodeNamingAndLocationCCLocationSet({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic location: string;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst encoding = isASCII(this.location) ? \"ascii\" : \"utf16le\";\n\t\tthis.payload = new Bytes(\n\t\t\t1 + this.location.length * (encoding === \"ascii\" ? 1 : 2),\n\t\t);\n\t\tthis.payload[0] = encoding === \"ascii\" ? 0x0 : 0x2;\n\t\tlet locationBuffer: Uint8Array;\n\t\tif (encoding === \"utf16le\") {\n\t\t\tlocationBuffer = stringToUint8ArrayUTF16BE(this.location);\n\t\t} else {\n\t\t\tlocationBuffer = Bytes.from(this.location, \"ascii\");\n\t\t}\n\t\t// Copy at most 16 bytes\n\t\tthis.payload.set(\n\t\t\tlocationBuffer.subarray(0, Math.min(16, locationBuffer.length)),\n\t\t\t0,\n\t\t);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { location: this.location },\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface NodeNamingAndLocationCCLocationReportOptions {\n\tlocation: string;\n}\n\n@CCCommand(NodeNamingAndLocationCommand.LocationReport)\n@ccValueProperty(\"location\", NodeNamingAndLocationCCValues.location)\nexport class NodeNamingAndLocationCCLocationReport\n\textends NodeNamingAndLocationCC\n{\n\tpublic constructor(\n\t\toptions: WithAddress<NodeNamingAndLocationCCLocationReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.location = options.location;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): NodeNamingAndLocationCCLocationReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst encoding = raw.payload[0] === 2 ? \"utf16le\" : \"ascii\";\n\t\tconst locationBuffer = raw.payload.subarray(1);\n\t\tlet location: string;\n\t\tif (encoding === \"utf16le\") {\n\t\t\tvalidatePayload(locationBuffer.length % 2 === 0);\n\t\t\tlocation = uint8ArrayToStringUTF16BE(locationBuffer);\n\t\t} else {\n\t\t\tlocation = locationBuffer.toString(\"ascii\");\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tlocation,\n\t\t});\n\t}\n\n\tpublic readonly location: string;\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { location: this.location },\n\t\t};\n\t}\n}\n\n@CCCommand(NodeNamingAndLocationCommand.LocationGet)\n@expectedCCResponse(NodeNamingAndLocationCCLocationReport)\nexport class NodeNamingAndLocationCCLocationGet\n\textends NodeNamingAndLocationCC\n{}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,kBAYO;AACP,oBAIO;AAEP,iBASO;AACP,0BAKO;AACP,oCASO;AACP,oBAAkB;AAClB,mBAA6C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwB7C,SAAS,QAAQ,KAAW;AAC3B,SAAO,iBAAiB,KAAK,GAAG;AACjC;AAFS;IAKI,8BAA0B,MAAA;8BADtC,mCAAI,2BAAe,0BAA0B,CAAC,CAAC;;;;oBACA;;;;kDAAA,YAAa;WAAA;;;;;;;;6BA2E3D,gDAAA,CAAc;iCAkCd,oDAAA,CAAc;AAjCf,mBAAA,MAAA,MAAA,qBAAA,EAAA,MAAA,UAAA,MAAA,WAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,aAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,SAAb,OAAoB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAkCpB,mBAAA,MAAA,MAAA,yBAAA,EAAA,MAAA,UAAA,MAAA,eAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,iBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,aAAb,OAAwB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AA9GzB,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACL,gBACN,KAAiC;AAEjC,cAAQ,KAAK;QACZ,KAAK,0CAA6B;QAClC,KAAK,0CAA6B;QAClC,KAAK,0CAA6B;QAClC,KAAK,0CAA6B;AACjC,iBAAO;MACT;AACA,aAAO,MAAM,gBAAgB,GAAG;IACjC;IAEA,KAAwB,oBAAS,IAAC;AACjC,aAAO,eAEN,EAAE,SAAQ,GACV,OAAK;AAEL,YAAI,aAAa,UAAU,aAAa,YAAY;AACnD,mDAAyB,KAAK,MAAM,QAAQ;QAC7C;AACA,YAAI,OAAO,UAAU,UAAU;AAC9B,8CACC,KAAK,MACL,UACA,UACA,OAAO,KAAK;QAEd;AAEA,gBAAQ,UAAU;UACjB,KAAK;AACJ,mBAAO,KAAK,QAAQ,KAAK;UAC1B,KAAK;AACJ,mBAAO,KAAK,YAAY,KAAK;QAC/B;AAEA,eAAO;MACR;IACD;IAEA,KAAwB,qBAAU,IAAC;AAClC,aAAO,eAAiD,EAAE,SAAQ,GAAE;AACnE,gBAAQ,UAAU;UACjB,KAAK;AACJ,mBAAO,KAAK,QAAO;UACpB,KAAK;AACJ,mBAAO,KAAK,YAAW;UACxB;AACC,qDAAyB,KAAK,MAAM,QAAQ;QAC9C;MACD;IACD;IAEO,MAAM,UAAO;AACnB,WAAK,sBACJ,2CACA,0CAA6B,OAAO;AAGrC,YAAM,KAAK,IAAI,+BAA+B;QAC7C,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;OAC7B;AACD,YAAM,WAAW,MAAM,KAAK,KAAK,YAGhC,IACA,KAAK,cAAc;AAEpB,aAAO,UAAU;IAClB;IAGO,MAAM,QAAQ,MAAY;AAChC,WAAK,sBACJ,2CACA,0CAA6B,OAAO;AAGrC,YAAM,KAAK,IAAI,+BAA+B;QAC7C,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B;OACA;AACD,aAAO,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACrD;IAEO,MAAM,cAAW;AACvB,WAAK,sBACJ,2CACA,0CAA6B,WAAW;AAGzC,YAAM,KAAK,IAAI,mCAAmC;QACjD,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;OAC7B;AACD,YAAM,WAAW,MAAM,KAAK,KAAK,YAGhC,IACA,KAAK,cAAc;AAEpB,aAAO,UAAU;IAClB;IAGO,MAAM,YACZ,UAAgB;AAEhB,WAAK,sBACJ,2CACA,0CAA6B,WAAW;AAGzC,YAAM,KAAK,IAAI,mCAAmC;QACjD,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B;OACA;AACD,aAAO,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACrD;;;AA5HY,wBAAA,MAAA,0BAAA;;;;;IAkIA,2BAAuB,MAAA;8BAHnC,4CAAa,2BAAe,0BAA0B,CAAC,OACvD,kDAAmB,CAAC,OACpB,wCAAS,uDAA6B,CAAC;;;;oBACK;+CAAA,YAAY;WAAA;;;;;;;;AAAzD,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IAGL,wBAAqB;AAE3B,aAAO;IACR;IAEO,MAAM,UACZ,KAAqB;AAErB,YAAM,OAAO,KAAK,QAAQ,GAAG;AAE7B,UAAI,QAAQ,KAAK,IAAI;QACpB,UAAU,KAAK;QACf,SAAS,gBAAgB,KAAK,MAAM;QACpC,WAAW;OACX;AAED,YAAM,KAAK,cAAc,GAAG;AAG5B,WAAK,qBAAqB,KAAK,IAAI;IACpC;IAEO,MAAM,cACZ,KAAyB;AAEzB,YAAM,OAAO,KAAK,QAAQ,GAAG;AAC7B,YAAM,WAAW,KAAK,YAAY,GAAG;AACrC,YAAM,MAAM,iBAAM,OACjB,2BAAe,0BAA0B,GACzC,KACA,QAAQ,EACP,YAAY;QACb,UAAU,4BAAgB;OAC1B;AAED,UAAI,QAAQ,KAAK,IAAI;QACpB,SAAS;QACT,WAAW;OACX;AACD,YAAM,OAAO,MAAM,IAAI,QAAO;AAC9B,UAAI,QAAQ,QAAW;AACtB,YAAI,QAAQ,KAAK,IAAI;UACpB,SAAS,aAAa,IAAI;UAC1B,WAAW;SACX;MACF;AAEA,UAAI,QAAQ,KAAK,IAAI;QACpB,SAAS;QACT,WAAW;OACX;AACD,YAAM,WAAW,MAAM,IAAI,YAAW;AACtC,UAAI,YAAY,QAAW;AAC1B,YAAI,QAAQ,KAAK,IAAI;UACpB,SAAS,sBAAsB,QAAQ;UACvC,WAAW;SACX;MACF;IACD;;;;IAUY,kCAA8B,MAAA;8BAF1C,yCAAU,0CAA6B,OAAO,OAC9C,8CAAc,CAAE;;;;oBACmC;sDAAA,YAAuB;WAAA;;;;;;;;AAA3E,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACZ,YACC,SAA2D;AAE3D,YAAM,OAAO;AACb,WAAK,OAAO,QAAQ;IACrB;IAEO,OAAO,KACb,MACA,MAAsB;AAGtB,YAAM,IAAI,uBACT,GAAG,KAAK,IAAI,qCACZ,4BAAgB,8BAA8B;IAMhD;IAEO;IAEA,UAAU,KAAsB;AACtC,YAAM,WAAW,QAAQ,KAAK,IAAI,IAAI,UAAU;AAChD,WAAK,UAAU,IAAI,oBAClB,IAAI,KAAK,KAAK,UAAU,aAAa,UAAU,IAAI,EAAE;AAEtD,WAAK,QAAQ,CAAC,IAAI,aAAa,UAAU,IAAM;AAC/C,UAAI;AACJ,UAAI,aAAa,WAAW;AAC3B,yBAAa,yCAA0B,KAAK,IAAI;MACjD,OAAO;AACN,qBAAa,oBAAM,KAAK,KAAK,MAAM,OAAO;MAC3C;AAEA,WAAK,QAAQ,IACZ,WAAW,SAAS,GAAG,KAAK,IAAI,IAAI,WAAW,MAAM,CAAC,GACtD,CAAC;AAEF,aAAO,MAAM,UAAU,GAAG;IAC3B;IAEO,WAAW,KAAgB;AACjC,aAAO;QACN,GAAG,MAAM,WAAW,GAAG;QACvB,SAAS,EAAE,MAAM,KAAK,KAAI;;IAE5B;;;;IAUY,qCAAiC,MAAA;8BAF7C,yCAAU,0CAA6B,UAAU,OACjD,+CAAgB,QAAQ,wDAA8B,IAAI,CAAC;;;;oBACL;yDAAA,YAAuB;WAAA;;;;;;;;AAA9E,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACZ,YACC,SAA8D;AAE9D,YAAM,OAAO;AACb,WAAK,OAAO,QAAQ;IACrB;IAEO,OAAO,KACb,KACA,KAAqB;AAErB,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,YAAM,WAAW,IAAI,QAAQ,CAAC,MAAM,IAAI,YAAY;AACpD,YAAM,aAAa,IAAI,QAAQ,SAAS,CAAC;AACzC,UAAI;AACJ,UAAI,aAAa,WAAW;AAC3B,yCAAgB,WAAW,SAAS,MAAM,CAAC;AAC3C,mBAAO,yCAA0B,UAAU;MAC5C,OAAO;AACN,eAAO,WAAW,SAAS,OAAO;MACnC;AAEA,aAAO,IAAI,KAAK;QACf,QAAQ,IAAI;QACZ;OACA;IACF;IAEgB;IAET,WAAW,KAAgB;AACjC,aAAO;QACN,GAAG,MAAM,WAAW,GAAG;QACvB,SAAS,EAAE,MAAM,KAAK,KAAI;;IAE5B;;;;IAKY,kCAA8B,MAAA;8BAF1C,yCAAU,0CAA6B,OAAO,OAC9C,kDAAmB,iCAAiC,CAAC;;;;oBACF;sDAAA,YAAuB;WAAA;;;;;;;;AAA3E,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;;;;IASA,sCAAkC,MAAA;8BAF9C,yCAAU,0CAA6B,WAAW,OAClD,8CAAc,CAAE;;;;oBAER;0DAAA,YAAuB;WAAA;;;;;;;;AADhC,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IAGZ,YACC,SAA+D;AAE/D,YAAM,OAAO;AACb,WAAK,WAAW,QAAQ;IACzB;IAEO,OAAO,KACb,MACA,MAAsB;AAGtB,YAAM,IAAI,uBACT,GAAG,KAAK,IAAI,qCACZ,4BAAgB,8BAA8B;IAMhD;IAEO;IAEA,UAAU,KAAsB;AACtC,YAAM,WAAW,QAAQ,KAAK,QAAQ,IAAI,UAAU;AACpD,WAAK,UAAU,IAAI,oBAClB,IAAI,KAAK,SAAS,UAAU,aAAa,UAAU,IAAI,EAAE;AAE1D,WAAK,QAAQ,CAAC,IAAI,aAAa,UAAU,IAAM;AAC/C,UAAI;AACJ,UAAI,aAAa,WAAW;AAC3B,6BAAiB,yCAA0B,KAAK,QAAQ;MACzD,OAAO;AACN,yBAAiB,oBAAM,KAAK,KAAK,UAAU,OAAO;MACnD;AAEA,WAAK,QAAQ,IACZ,eAAe,SAAS,GAAG,KAAK,IAAI,IAAI,eAAe,MAAM,CAAC,GAC9D,CAAC;AAEF,aAAO,MAAM,UAAU,GAAG;IAC3B;IAEO,WAAW,KAAgB;AACjC,aAAO;QACN,GAAG,MAAM,WAAW,GAAG;QACvB,SAAS,EAAE,UAAU,KAAK,SAAQ;;IAEpC;;;;IAUY,yCAAqC,MAAA;8BAFjD,yCAAU,0CAA6B,cAAc,OACrD,+CAAgB,YAAY,wDAA8B,QAAQ,CAAC;;;;oBAE3D;6DAAA,YAAuB;WAAA;;;;;;;;AADhC,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IAGZ,YACC,SAAkE;AAElE,YAAM,OAAO;AACb,WAAK,WAAW,QAAQ;IACzB;IAEO,OAAO,KACb,KACA,KAAqB;AAErB,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,YAAM,WAAW,IAAI,QAAQ,CAAC,MAAM,IAAI,YAAY;AACpD,YAAM,iBAAiB,IAAI,QAAQ,SAAS,CAAC;AAC7C,UAAI;AACJ,UAAI,aAAa,WAAW;AAC3B,yCAAgB,eAAe,SAAS,MAAM,CAAC;AAC/C,uBAAW,yCAA0B,cAAc;MACpD,OAAO;AACN,mBAAW,eAAe,SAAS,OAAO;MAC3C;AAEA,aAAO,IAAI,KAAK;QACf,QAAQ,IAAI;QACZ;OACA;IACF;IAEgB;IAET,WAAW,KAAgB;AACjC,aAAO;QACN,GAAG,MAAM,WAAW,GAAG;QACvB,SAAS,EAAE,UAAU,KAAK,SAAQ;;IAEpC;;;;IAKY,sCAAkC,MAAA;8BAF9C,yCAAU,0CAA6B,WAAW,OAClD,kDAAmB,qCAAqC,CAAC;;;;oBAEjD;0DAAA,YAAuB;WAAA;;;;;;;;AADhC,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;;;;",
4
+ "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype SupervisionResult,\n\tValueMetadata,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport {\n\tBytes,\n\ttype BytesView,\n\tstringToUint8ArrayUTF16BE,\n\tuint8ArrayToStringUTF16BE,\n} from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\tPhysicalCCAPI,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype RefreshValuesContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { NodeNamingAndLocationCommand } from \"../lib/_Types.js\";\n\nexport const NodeNamingAndLocationCCValues = V.defineCCValues(\n\tCommandClasses[\"Node Naming and Location\"],\n\t{\n\t\t...V.staticProperty(\n\t\t\t\"name\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.String,\n\t\t\t\tlabel: \"Node name\",\n\t\t\t} as const,\n\t\t\t{ supportsEndpoints: false },\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"location\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.String,\n\t\t\t\tlabel: \"Node location\",\n\t\t\t} as const,\n\t\t\t{ supportsEndpoints: false },\n\t\t),\n\t},\n);\n\nfunction isASCII(str: string): boolean {\n\treturn /^[\\x00-\\x7F]*$/.test(str);\n}\n\n@API(CommandClasses[\"Node Naming and Location\"])\nexport class NodeNamingAndLocationCCAPI extends PhysicalCCAPI {\n\tpublic supportsCommand(\n\t\tcmd: NodeNamingAndLocationCommand,\n\t): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase NodeNamingAndLocationCommand.NameGet:\n\t\t\tcase NodeNamingAndLocationCommand.NameSet:\n\t\t\tcase NodeNamingAndLocationCommand.LocationGet:\n\t\t\tcase NodeNamingAndLocationCommand.LocationSet:\n\t\t\t\treturn true; // This is mandatory\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: NodeNamingAndLocationCCAPI,\n\t\t\t{ property },\n\t\t\tvalue,\n\t\t) {\n\t\t\tif (property !== \"name\" && property !== \"location\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t\tif (typeof value !== \"string\") {\n\t\t\t\tthrowWrongValueType(\n\t\t\t\t\tthis.ccId,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"string\",\n\t\t\t\t\ttypeof value,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tswitch (property) {\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.setName(value);\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.setLocation(value);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\t}\n\n\tprotected override get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: NodeNamingAndLocationCCAPI, { property }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"name\":\n\t\t\t\t\treturn this.getName();\n\t\t\t\tcase \"location\":\n\t\t\t\t\treturn this.getLocation();\n\t\t\t\tdefault:\n\t\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic async getName(): Promise<MaybeNotKnown<string>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tNodeNamingAndLocationCommand,\n\t\t\tNodeNamingAndLocationCommand.NameGet,\n\t\t);\n\n\t\tconst cc = new NodeNamingAndLocationCCNameGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tNodeNamingAndLocationCCNameReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.name;\n\t}\n\n\t@validateArgs()\n\tpublic async setName(name: string): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tNodeNamingAndLocationCommand,\n\t\t\tNodeNamingAndLocationCommand.NameSet,\n\t\t);\n\n\t\tconst cc = new NodeNamingAndLocationCCNameSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tname,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async getLocation(): Promise<MaybeNotKnown<string>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tNodeNamingAndLocationCommand,\n\t\t\tNodeNamingAndLocationCommand.LocationGet,\n\t\t);\n\n\t\tconst cc = new NodeNamingAndLocationCCLocationGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tNodeNamingAndLocationCCLocationReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.location;\n\t}\n\n\t@validateArgs()\n\tpublic async setLocation(\n\t\tlocation: string,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tNodeNamingAndLocationCommand,\n\t\t\tNodeNamingAndLocationCommand.LocationSet,\n\t\t);\n\n\t\tconst cc = new NodeNamingAndLocationCCLocationSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tlocation,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n}\n\n@commandClass(CommandClasses[\"Node Naming and Location\"])\n@implementedVersion(1)\n@ccValues(NodeNamingAndLocationCCValues)\nexport class NodeNamingAndLocationCC extends CommandClass {\n\tdeclare ccCommand: NodeNamingAndLocationCommand;\n\n\tpublic skipEndpointInterview(): boolean {\n\t\t// As the name says, this is for the node, not for endpoints\n\t\treturn true;\n\t}\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Node Naming and Location\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tmessage: \"retrieving node name...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst name = await api.getName();\n\t\tif (name != undefined) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tmessage: `is named \"${name}\"`,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t}\n\n\t\tctx.logNode(node.id, {\n\t\t\tmessage: \"retrieving node location...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst location = await api.getLocation();\n\t\tif (location != undefined) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tmessage: `received location: ${location}`,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport interface NodeNamingAndLocationCCNameSetOptions {\n\tname: string;\n}\n\n@CCCommand(NodeNamingAndLocationCommand.NameSet)\n@useSupervision()\nexport class NodeNamingAndLocationCCNameSet extends NodeNamingAndLocationCC {\n\tpublic constructor(\n\t\toptions: WithAddress<NodeNamingAndLocationCCNameSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.name = options.name;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): NodeNamingAndLocationCCNameSet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new NodeNamingAndLocationCCNameSet({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic name: string;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst encoding = isASCII(this.name) ? \"ascii\" : \"utf16le\";\n\t\tthis.payload = new Bytes(\n\t\t\t1 + this.name.length * (encoding === \"ascii\" ? 1 : 2),\n\t\t);\n\t\tthis.payload[0] = encoding === \"ascii\" ? 0x0 : 0x2;\n\t\tlet nameBuffer: BytesView;\n\t\tif (encoding === \"utf16le\") {\n\t\t\tnameBuffer = stringToUint8ArrayUTF16BE(this.name);\n\t\t} else {\n\t\t\tnameBuffer = Bytes.from(this.name, \"ascii\");\n\t\t}\n\t\t// Copy at most 16 bytes\n\t\tthis.payload.set(\n\t\t\tnameBuffer.subarray(0, Math.min(16, nameBuffer.length)),\n\t\t\t0,\n\t\t);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { name: this.name },\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface NodeNamingAndLocationCCNameReportOptions {\n\tname: string;\n}\n\n@CCCommand(NodeNamingAndLocationCommand.NameReport)\n@ccValueProperty(\"name\", NodeNamingAndLocationCCValues.name)\nexport class NodeNamingAndLocationCCNameReport extends NodeNamingAndLocationCC {\n\tpublic constructor(\n\t\toptions: WithAddress<NodeNamingAndLocationCCNameReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.name = options.name;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): NodeNamingAndLocationCCNameReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst encoding = raw.payload[0] === 2 ? \"utf16le\" : \"ascii\";\n\t\tconst nameBuffer = raw.payload.subarray(1);\n\t\tlet name: string;\n\t\tif (encoding === \"utf16le\") {\n\t\t\tvalidatePayload(nameBuffer.length % 2 === 0);\n\t\t\tname = uint8ArrayToStringUTF16BE(nameBuffer);\n\t\t} else {\n\t\t\tname = nameBuffer.toString(\"ascii\");\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tname,\n\t\t});\n\t}\n\n\tpublic readonly name: string;\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { name: this.name },\n\t\t};\n\t}\n}\n\n@CCCommand(NodeNamingAndLocationCommand.NameGet)\n@expectedCCResponse(NodeNamingAndLocationCCNameReport)\nexport class NodeNamingAndLocationCCNameGet extends NodeNamingAndLocationCC {}\n\n// @publicAPI\nexport interface NodeNamingAndLocationCCLocationSetOptions {\n\tlocation: string;\n}\n\n@CCCommand(NodeNamingAndLocationCommand.LocationSet)\n@useSupervision()\nexport class NodeNamingAndLocationCCLocationSet\n\textends NodeNamingAndLocationCC\n{\n\tpublic constructor(\n\t\toptions: WithAddress<NodeNamingAndLocationCCLocationSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.location = options.location;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): NodeNamingAndLocationCCLocationSet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new NodeNamingAndLocationCCLocationSet({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic location: string;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst encoding = isASCII(this.location) ? \"ascii\" : \"utf16le\";\n\t\tthis.payload = new Bytes(\n\t\t\t1 + this.location.length * (encoding === \"ascii\" ? 1 : 2),\n\t\t);\n\t\tthis.payload[0] = encoding === \"ascii\" ? 0x0 : 0x2;\n\t\tlet locationBuffer: BytesView;\n\t\tif (encoding === \"utf16le\") {\n\t\t\tlocationBuffer = stringToUint8ArrayUTF16BE(this.location);\n\t\t} else {\n\t\t\tlocationBuffer = Bytes.from(this.location, \"ascii\");\n\t\t}\n\t\t// Copy at most 16 bytes\n\t\tthis.payload.set(\n\t\t\tlocationBuffer.subarray(0, Math.min(16, locationBuffer.length)),\n\t\t\t0,\n\t\t);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { location: this.location },\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface NodeNamingAndLocationCCLocationReportOptions {\n\tlocation: string;\n}\n\n@CCCommand(NodeNamingAndLocationCommand.LocationReport)\n@ccValueProperty(\"location\", NodeNamingAndLocationCCValues.location)\nexport class NodeNamingAndLocationCCLocationReport\n\textends NodeNamingAndLocationCC\n{\n\tpublic constructor(\n\t\toptions: WithAddress<NodeNamingAndLocationCCLocationReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.location = options.location;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): NodeNamingAndLocationCCLocationReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst encoding = raw.payload[0] === 2 ? \"utf16le\" : \"ascii\";\n\t\tconst locationBuffer = raw.payload.subarray(1);\n\t\tlet location: string;\n\t\tif (encoding === \"utf16le\") {\n\t\t\tvalidatePayload(locationBuffer.length % 2 === 0);\n\t\t\tlocation = uint8ArrayToStringUTF16BE(locationBuffer);\n\t\t} else {\n\t\t\tlocation = locationBuffer.toString(\"ascii\");\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tlocation,\n\t\t});\n\t}\n\n\tpublic readonly location: string;\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: { location: this.location },\n\t\t};\n\t}\n}\n\n@CCCommand(NodeNamingAndLocationCommand.LocationGet)\n@expectedCCResponse(NodeNamingAndLocationCCLocationReport)\nexport class NodeNamingAndLocationCCLocationGet\n\textends NodeNamingAndLocationCC\n{}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import type { CCEncodingContext, CCParsingContext } from "@zwave-js/cc";
2
2
  import type { GetDeviceConfig } from "@zwave-js/config";
3
3
  import { CommandClasses, type ControlsCC, Duration, type EndpointId, type GetEndpoint, type GetNode, type GetSupportedCCVersion, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, type NodeId, type Notification, type NotificationState, type SinglecastCC, type SupervisionResult, type SupportsCC, type ValueID, type ValueMetadataNumeric, type WithAddress } from "@zwave-js/core";
4
- import { Bytes } from "@zwave-js/shared";
4
+ import { Bytes, type BytesView } from "@zwave-js/shared";
5
5
  import { POLL_VALUE, PhysicalCCAPI, type PollValueImplementation } from "../lib/API.js";
6
6
  import { CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext } from "../lib/CommandClass.js";
7
7
  import { NotificationCommand } from "../lib/_Types.js";
@@ -405,7 +405,7 @@ export type NotificationCCReportOptions = {
405
405
  notificationType?: number;
406
406
  notificationEvent?: number;
407
407
  notificationStatus?: number;
408
- eventParameters?: Uint8Array;
408
+ eventParameters?: BytesView;
409
409
  sequenceNumber?: number;
410
410
  };
411
411
  export declare class NotificationCCReport extends NotificationCC {
@@ -417,7 +417,7 @@ export declare class NotificationCCReport extends NotificationCC {
417
417
  notificationType: number | undefined;
418
418
  notificationStatus: boolean | number | undefined;
419
419
  notificationEvent: number | undefined;
420
- eventParameters: Uint8Array | Duration | Record<string, number> | number | undefined;
420
+ eventParameters: BytesView | Duration | Record<string, number> | number | undefined;
421
421
  sequenceNumber: number | undefined;
422
422
  toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
423
423
  private parseEventParameters;
@@ -56,6 +56,7 @@ var import_NotificationEventPayload = require("../lib/NotificationEventPayload.j
56
56
  var import_Values = require("../lib/Values.js");
57
57
  var import_Types = require("../lib/_Types.js");
58
58
  var ccUtils = __toESM(require("../lib/utils.js"), 1);
59
+ var import_ApplicationStatusCC = require("./ApplicationStatusCC.js");
59
60
  var import_AssociationGroupInfoCC = require("./AssociationGroupInfoCC.js");
60
61
  var import_CCValues_generated = require("./_CCValues.generated.js");
61
62
  var __runInitializers = function(thisArg, initializers, value) {
@@ -225,7 +226,7 @@ let NotificationCCAPI = (() => {
225
226
  });
226
227
  return this.host.sendCommand(cc, this.commandOptions);
227
228
  }
228
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
229
+ // oxlint-disable-next-line typescript/explicit-module-boundary-types
229
230
  async getSupported() {
230
231
  this.assertSupportsCommand(import_Types.NotificationCommand, import_Types.NotificationCommand.SupportedGet);
231
232
  const cc = new NotificationCCSupportedGet({
@@ -445,6 +446,7 @@ let NotificationCC = (() => {
445
446
  if (notificationMode === "pull") {
446
447
  await this.refreshValues(ctx);
447
448
  } else {
449
+ await this.refreshValues(ctx);
448
450
  for (let i = 0; i < supportedNotificationTypes.length; i++) {
449
451
  const type = supportedNotificationTypes[i];
450
452
  const name = supportedNotificationNames[i];
@@ -508,29 +510,27 @@ let NotificationCC = (() => {
508
510
  }
509
511
  async refreshValues(ctx) {
510
512
  const node = this.getNode(ctx);
511
- if (NotificationCC2.getNotificationMode(ctx, node) === "pull") {
512
- const endpoint = this.getEndpoint(ctx);
513
- const api = import_API.CCAPI.create(import_core.CommandClasses.Notification, ctx, endpoint).withOptions({
514
- priority: import_core.MessagePriority.NodeQuery
513
+ const endpoint = this.getEndpoint(ctx);
514
+ const api = import_API.CCAPI.create(import_core.CommandClasses.Notification, ctx, endpoint).withOptions({
515
+ priority: import_core.MessagePriority.NodeQuery
516
+ });
517
+ const supportedNotificationTypes = this.getValue(ctx, import_CCValues_generated.NotificationCCValues.supportedNotificationTypes) ?? [];
518
+ const supportedNotificationNames = supportedNotificationTypes.map(import_core.getNotificationName);
519
+ for (let i = 0; i < supportedNotificationTypes.length; i++) {
520
+ const type = supportedNotificationTypes[i];
521
+ const name = supportedNotificationNames[i];
522
+ ctx.logNode(node.id, {
523
+ endpoint: this.endpointIndex,
524
+ message: `querying notification status for ${name}...`,
525
+ direction: "outbound"
515
526
  });
516
- const supportedNotificationTypes = this.getValue(ctx, import_CCValues_generated.NotificationCCValues.supportedNotificationTypes) ?? [];
517
- const supportedNotificationNames = supportedNotificationTypes.map(import_core.getNotificationName);
518
- for (let i = 0; i < supportedNotificationTypes.length; i++) {
519
- const type = supportedNotificationTypes[i];
520
- const name = supportedNotificationNames[i];
521
- ctx.logNode(node.id, {
522
- endpoint: this.endpointIndex,
523
- message: `querying notification status for ${name}...`,
524
- direction: "outbound"
525
- });
526
- const response = await api.getInternal({
527
- notificationType: type
528
- });
529
- if (response)
530
- await node.handleCommand(response);
531
- }
532
- this.setValue(ctx, import_CCValues_generated.NotificationCCValues.lastRefresh, Date.now());
527
+ const response = await api.getInternal({
528
+ notificationType: type
529
+ });
530
+ if (response)
531
+ await node.handleCommand(response);
533
532
  }
533
+ this.setValue(ctx, import_CCValues_generated.NotificationCCValues.lastRefresh, Date.now());
534
534
  }
535
535
  shouldRefreshValues(ctx) {
536
536
  const isPullMode = NotificationCC2.getNotificationMode(ctx, this.getNode(ctx)) === "pull";
@@ -542,8 +542,14 @@ let NotificationCC = (() => {
542
542
  };
543
543
  return NotificationCC2 = _classThis;
544
544
  })();
545
+ function getCCResponseForNotificationCCSet(ctx, sent) {
546
+ if (sent.isSinglecast() && !sent.notificationStatus && !sent.isEncapsulatedWith(import_core.CommandClasses.Supervision) && ctx.getNode(sent.nodeId)?.supportsCC(import_core.CommandClasses["Application Status"])) {
547
+ return import_ApplicationStatusCC.ApplicationStatusCCRejectedRequest;
548
+ }
549
+ }
550
+ __name(getCCResponseForNotificationCCSet, "getCCResponseForNotificationCCSet");
545
551
  let NotificationCCSet = (() => {
546
- let _classDecorators = [(0, import_CommandClassDecorators.CCCommand)(import_Types.NotificationCommand.Set), (0, import_CommandClassDecorators.useSupervision)()];
552
+ let _classDecorators = [(0, import_CommandClassDecorators.CCCommand)(import_Types.NotificationCommand.Set), (0, import_CommandClassDecorators.expectedCCResponse)(getCCResponseForNotificationCCSet), (0, import_CommandClassDecorators.useSupervision)()];
547
553
  let _classDescriptor;
548
554
  let _classExtraInitializers = [];
549
555
  let _classThis;