@zwave-js/cc 14.3.10 → 15.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/cc/AlarmSensorCC.d.ts +139 -57
- package/build/cjs/cc/AlarmSensorCC.js.map +2 -2
- package/build/cjs/cc/AssociationCC.d.ts +178 -43
- package/build/cjs/cc/AssociationCC.js +0 -4
- package/build/cjs/cc/AssociationCC.js.map +2 -2
- package/build/cjs/cc/AssociationGroupInfoCC.d.ts +138 -38
- package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
- package/build/cjs/cc/BarrierOperatorCC.d.ts +275 -73
- package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
- package/build/cjs/cc/BasicCC.d.ts +316 -71
- package/build/cjs/cc/BasicCC.js.map +2 -2
- package/build/cjs/cc/BatteryCC.d.ts +759 -164
- package/build/cjs/cc/BatteryCC.js.map +2 -2
- package/build/cjs/cc/BinarySensorCC.d.ts +91 -26
- package/build/cjs/cc/BinarySensorCC.js.map +2 -2
- package/build/cjs/cc/BinarySwitchCC.d.ts +190 -38
- package/build/cjs/cc/BinarySwitchCC.js.map +2 -2
- package/build/cjs/cc/CRC16CC.d.ts +4 -8
- package/build/cjs/cc/CRC16CC.js +4 -27
- package/build/cjs/cc/CRC16CC.js.map +2 -2
- package/build/cjs/cc/CentralSceneCC.d.ts +272 -53
- package/build/cjs/cc/CentralSceneCC.js.map +2 -2
- package/build/cjs/cc/ClimateControlScheduleCC.d.ts +150 -37
- package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
- package/build/cjs/cc/ClockCC.d.ts +3 -3
- package/build/cjs/cc/ClockCC.js.map +2 -2
- package/build/cjs/cc/ColorSwitchCC.d.ts +423 -96
- package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
- package/build/cjs/cc/ConfigurationCC._validateArgs.js +1 -1
- package/build/cjs/cc/ConfigurationCC._validateArgs.js.map +1 -1
- package/build/cjs/cc/ConfigurationCC.d.ts +101 -37
- package/build/cjs/cc/ConfigurationCC.js +0 -8
- package/build/cjs/cc/ConfigurationCC.js.map +2 -2
- package/build/cjs/cc/DeviceResetLocallyCC.d.ts +1 -1
- package/build/cjs/cc/DeviceResetLocallyCC.js.map +2 -2
- package/build/cjs/cc/DoorLockCC._validateArgs.js +1 -1
- package/build/cjs/cc/DoorLockCC._validateArgs.js.map +1 -1
- package/build/cjs/cc/DoorLockCC.d.ts +1731 -419
- package/build/cjs/cc/DoorLockCC.js.map +2 -2
- package/build/cjs/cc/DoorLockLoggingCC.d.ts +64 -12
- package/build/cjs/cc/DoorLockLoggingCC.js.map +2 -2
- package/build/cjs/cc/EnergyProductionCC.d.ts +29 -14
- package/build/cjs/cc/EnergyProductionCC.js.map +2 -2
- package/build/cjs/cc/EntryControlCC.d.ts +308 -57
- package/build/cjs/cc/EntryControlCC.js.map +2 -2
- package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts +2 -0
- package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.js +26 -0
- package/build/cjs/cc/FirmwareUpdateMetaDataCC._validateArgs.js.map +1 -1
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.d.ts +389 -64
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js +154 -8
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +2 -2
- package/build/cjs/cc/HumidityControlModeCC.d.ts +125 -27
- package/build/cjs/cc/HumidityControlModeCC.js.map +2 -2
- package/build/cjs/cc/HumidityControlOperatingStateCC.d.ts +64 -18
- package/build/cjs/cc/HumidityControlOperatingStateCC.js.map +2 -2
- package/build/cjs/cc/HumidityControlSetpointCC.d.ts +116 -39
- package/build/cjs/cc/HumidityControlSetpointCC.js.map +2 -2
- package/build/cjs/cc/InclusionControllerCC.d.ts +4 -4
- package/build/cjs/cc/InclusionControllerCC.js.map +2 -2
- package/build/cjs/cc/IndicatorCC.d.ts +325 -83
- package/build/cjs/cc/IndicatorCC.js.map +2 -2
- package/build/cjs/cc/IrrigationCC.d.ts +2170 -683
- package/build/cjs/cc/IrrigationCC.js.map +2 -2
- package/build/cjs/cc/LanguageCC.d.ts +128 -26
- package/build/cjs/cc/LanguageCC.js.map +2 -2
- package/build/cjs/cc/LockCC.d.ts +64 -14
- package/build/cjs/cc/LockCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerProprietaryCC.d.ts +2 -2
- package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerSpecificCC.d.ts +219 -57
- package/build/cjs/cc/ManufacturerSpecificCC.js.map +2 -2
- package/build/cjs/cc/MeterCC.d.ts +364 -89
- package/build/cjs/cc/MeterCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelAssociationCC.d.ts +138 -40
- package/build/cjs/cc/MultiChannelAssociationCC.js +0 -5
- package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelCC.d.ts +469 -99
- package/build/cjs/cc/MultiChannelCC.js +8 -72
- package/build/cjs/cc/MultiChannelCC.js.map +2 -2
- package/build/cjs/cc/MultiCommandCC.d.ts +4 -8
- package/build/cjs/cc/MultiCommandCC.js +4 -37
- package/build/cjs/cc/MultiCommandCC.js.map +2 -2
- package/build/cjs/cc/MultilevelSensorCC.d.ts +118 -33
- package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
- package/build/cjs/cc/MultilevelSwitchCC.d.ts +490 -125
- package/build/cjs/cc/MultilevelSwitchCC.js.map +2 -2
- package/build/cjs/cc/NodeNamingCC.d.ts +128 -26
- package/build/cjs/cc/NodeNamingCC.js.map +2 -2
- package/build/cjs/cc/NotificationCC.d.ts +603 -161
- package/build/cjs/cc/NotificationCC.js +12 -1
- package/build/cjs/cc/NotificationCC.js.map +2 -2
- package/build/cjs/cc/PowerlevelCC.d.ts +6 -6
- package/build/cjs/cc/PowerlevelCC.js.map +2 -2
- package/build/cjs/cc/ProtectionCC.d.ts +496 -94
- package/build/cjs/cc/ProtectionCC.js.map +2 -2
- package/build/cjs/cc/SceneActivationCC.d.ts +127 -28
- package/build/cjs/cc/SceneActivationCC.js.map +2 -2
- package/build/cjs/cc/SceneActuatorConfigurationCC.d.ts +52 -25
- package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +2 -2
- package/build/cjs/cc/SceneControllerConfigurationCC.d.ts +53 -25
- package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
- package/build/cjs/cc/ScheduleEntryLockCC.d.ts +268 -64
- package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
- package/build/cjs/cc/Security2CC.d.ts +15 -21
- package/build/cjs/cc/Security2CC.js +32 -347
- package/build/cjs/cc/Security2CC.js.map +3 -3
- package/build/cjs/cc/SecurityCC.d.ts +12 -19
- package/build/cjs/cc/SecurityCC.js +12 -106
- package/build/cjs/cc/SecurityCC.js.map +2 -2
- package/build/cjs/cc/SoundSwitchCC.d.ts +253 -64
- package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
- package/build/cjs/cc/SupervisionCC.d.ts +28 -16
- package/build/cjs/cc/SupervisionCC.js +4 -29
- package/build/cjs/cc/SupervisionCC.js.map +2 -2
- package/build/cjs/cc/ThermostatFanModeCC.d.ts +187 -38
- package/build/cjs/cc/ThermostatFanModeCC.js.map +2 -2
- package/build/cjs/cc/ThermostatFanStateCC.d.ts +64 -18
- package/build/cjs/cc/ThermostatFanStateCC.js.map +2 -2
- package/build/cjs/cc/ThermostatModeCC.d.ts +189 -40
- package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
- package/build/cjs/cc/ThermostatOperatingStateCC.d.ts +65 -19
- package/build/cjs/cc/ThermostatOperatingStateCC.js.map +2 -2
- package/build/cjs/cc/ThermostatSetbackCC.d.ts +4 -4
- package/build/cjs/cc/ThermostatSetbackCC.js.map +2 -2
- package/build/cjs/cc/ThermostatSetpointCC.d.ts +116 -36
- package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
- package/build/cjs/cc/TimeCC.d.ts +6 -6
- package/build/cjs/cc/TimeCC.js.map +2 -2
- package/build/cjs/cc/TimeParametersCC.d.ts +63 -12
- package/build/cjs/cc/TimeParametersCC.js.map +2 -2
- package/build/cjs/cc/TransportServiceCC.d.ts +7 -12
- package/build/cjs/cc/TransportServiceCC.js +3 -20
- package/build/cjs/cc/TransportServiceCC.js.map +2 -2
- package/build/cjs/cc/UserCodeCC._validateArgs.js +1 -1
- package/build/cjs/cc/UserCodeCC._validateArgs.js.map +1 -1
- package/build/cjs/cc/UserCodeCC.d.ts +931 -176
- package/build/cjs/cc/UserCodeCC.js.map +2 -2
- package/build/cjs/cc/VersionCC.d.ts +897 -185
- package/build/cjs/cc/VersionCC.js.map +2 -2
- package/build/cjs/cc/WakeUpCC.d.ts +190 -38
- package/build/cjs/cc/WakeUpCC.js.map +2 -2
- package/build/cjs/cc/WindowCoveringCC.d.ts +193 -103
- package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
- package/build/cjs/cc/ZWavePlusCC.d.ts +311 -51
- package/build/cjs/cc/ZWavePlusCC.js.map +2 -2
- package/build/cjs/cc/ZWaveProtocolCC.d.ts +28 -28
- package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.d.ts +4 -4
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +2 -2
- package/build/cjs/index.d.ts +1 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/index_browser.d.ts +9 -0
- package/build/cjs/index_browser.js +41 -1
- package/build/cjs/index_browser.js.map +2 -2
- package/build/cjs/lib/API.d.ts +7 -5
- package/build/cjs/lib/API.js +1 -1
- package/build/cjs/lib/API.js.map +2 -2
- package/build/cjs/lib/CommandClass.d.ts +10 -21
- package/build/cjs/lib/CommandClass.js +51 -106
- package/build/cjs/lib/CommandClass.js.map +3 -3
- package/build/cjs/lib/CommandClassDecorators.d.ts +1 -1
- package/build/cjs/lib/CommandClassDecorators.js +3 -3
- package/build/cjs/lib/CommandClassDecorators.js.map +2 -2
- package/build/cjs/lib/Values.d.ts +2 -2
- package/build/cjs/lib/Values.js.map +2 -2
- package/build/cjs/lib/traits.d.ts +94 -0
- package/build/cjs/lib/traits.js +17 -0
- package/build/cjs/lib/traits.js.map +7 -0
- package/build/cjs/lib/utils.d.ts +2 -2
- package/build/cjs/lib/utils.js.map +2 -2
- package/build/esm/cc/AlarmSensorCC.d.ts +139 -57
- package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
- package/build/esm/cc/AlarmSensorCC.js +0 -1
- package/build/esm/cc/AlarmSensorCC.js.map +1 -1
- package/build/esm/cc/AssociationCC.d.ts +178 -43
- package/build/esm/cc/AssociationCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationCC.js +0 -13
- package/build/esm/cc/AssociationCC.js.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.d.ts +138 -38
- package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.js +0 -6
- package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.d.ts +275 -73
- package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.js +0 -3
- package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
- package/build/esm/cc/BasicCC.d.ts +316 -71
- package/build/esm/cc/BasicCC.d.ts.map +1 -1
- package/build/esm/cc/BasicCC.js +0 -2
- package/build/esm/cc/BasicCC.js.map +1 -1
- package/build/esm/cc/BatteryCC.d.ts +759 -164
- package/build/esm/cc/BatteryCC.d.ts.map +1 -1
- package/build/esm/cc/BatteryCC.js +1 -2
- package/build/esm/cc/BatteryCC.js.map +1 -1
- package/build/esm/cc/BinarySensorCC.d.ts +91 -26
- package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySensorCC.js +0 -3
- package/build/esm/cc/BinarySensorCC.js.map +1 -1
- package/build/esm/cc/BinarySwitchCC.d.ts +190 -38
- package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySwitchCC.js +0 -2
- package/build/esm/cc/BinarySwitchCC.js.map +1 -1
- package/build/esm/cc/CRC16CC.d.ts +4 -8
- package/build/esm/cc/CRC16CC.d.ts.map +1 -1
- package/build/esm/cc/CRC16CC.js +4 -34
- package/build/esm/cc/CRC16CC.js.map +1 -1
- package/build/esm/cc/CentralSceneCC.d.ts +272 -53
- package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
- package/build/esm/cc/CentralSceneCC.js +0 -1
- package/build/esm/cc/CentralSceneCC.js.map +1 -1
- package/build/esm/cc/ClimateControlScheduleCC.d.ts +150 -37
- package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -1
- package/build/esm/cc/ClimateControlScheduleCC.js +0 -3
- package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
- package/build/esm/cc/ClockCC.d.ts +3 -3
- package/build/esm/cc/ClockCC.d.ts.map +1 -1
- package/build/esm/cc/ClockCC.js +0 -1
- package/build/esm/cc/ClockCC.js.map +1 -1
- package/build/esm/cc/ColorSwitchCC.d.ts +423 -96
- package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/ColorSwitchCC.js +0 -6
- package/build/esm/cc/ColorSwitchCC.js.map +1 -1
- package/build/esm/cc/ConfigurationCC._validateArgs.js +1 -1
- package/build/esm/cc/ConfigurationCC._validateArgs.js.map +1 -1
- package/build/esm/cc/ConfigurationCC.d.ts +101 -37
- package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/ConfigurationCC.js +0 -25
- package/build/esm/cc/ConfigurationCC.js.map +1 -1
- package/build/esm/cc/DeviceResetLocallyCC.d.ts +1 -1
- package/build/esm/cc/DeviceResetLocallyCC.d.ts.map +1 -1
- package/build/esm/cc/DeviceResetLocallyCC.js.map +1 -1
- package/build/esm/cc/DoorLockCC._validateArgs.js +1 -1
- package/build/esm/cc/DoorLockCC._validateArgs.js.map +1 -1
- package/build/esm/cc/DoorLockCC.d.ts +1731 -419
- package/build/esm/cc/DoorLockCC.d.ts.map +1 -1
- package/build/esm/cc/DoorLockCC.js +0 -2
- package/build/esm/cc/DoorLockCC.js.map +1 -1
- package/build/esm/cc/DoorLockLoggingCC.d.ts +64 -12
- package/build/esm/cc/DoorLockLoggingCC.d.ts.map +1 -1
- package/build/esm/cc/DoorLockLoggingCC.js +0 -1
- package/build/esm/cc/DoorLockLoggingCC.js.map +1 -1
- package/build/esm/cc/EnergyProductionCC.d.ts +29 -14
- package/build/esm/cc/EnergyProductionCC.d.ts.map +1 -1
- package/build/esm/cc/EnergyProductionCC.js +0 -2
- package/build/esm/cc/EnergyProductionCC.js.map +1 -1
- package/build/esm/cc/EntryControlCC.d.ts +308 -57
- package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
- package/build/esm/cc/EntryControlCC.js +0 -1
- package/build/esm/cc/EntryControlCC.js.map +1 -1
- package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts +2 -0
- package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.d.ts.map +1 -1
- package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.js +20 -0
- package/build/esm/cc/FirmwareUpdateMetaDataCC._validateArgs.js.map +1 -1
- package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts +389 -64
- package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -1
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js +158 -30
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
- package/build/esm/cc/HumidityControlModeCC.d.ts +125 -27
- package/build/esm/cc/HumidityControlModeCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlModeCC.js +0 -1
- package/build/esm/cc/HumidityControlModeCC.js.map +1 -1
- package/build/esm/cc/HumidityControlOperatingStateCC.d.ts +64 -18
- package/build/esm/cc/HumidityControlOperatingStateCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlOperatingStateCC.js.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.d.ts +116 -39
- package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.js +0 -4
- package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
- package/build/esm/cc/InclusionControllerCC.d.ts +4 -4
- package/build/esm/cc/InclusionControllerCC.d.ts.map +1 -1
- package/build/esm/cc/InclusionControllerCC.js +0 -2
- package/build/esm/cc/InclusionControllerCC.js.map +1 -1
- package/build/esm/cc/IndicatorCC.d.ts +325 -83
- package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
- package/build/esm/cc/IndicatorCC.js +0 -7
- package/build/esm/cc/IndicatorCC.js.map +1 -1
- package/build/esm/cc/IrrigationCC.d.ts +2170 -683
- package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
- package/build/esm/cc/IrrigationCC.js +0 -9
- package/build/esm/cc/IrrigationCC.js.map +1 -1
- package/build/esm/cc/LanguageCC.d.ts +128 -26
- package/build/esm/cc/LanguageCC.d.ts.map +1 -1
- package/build/esm/cc/LanguageCC.js +0 -1
- package/build/esm/cc/LanguageCC.js.map +1 -1
- package/build/esm/cc/LockCC.d.ts +64 -14
- package/build/esm/cc/LockCC.d.ts.map +1 -1
- package/build/esm/cc/LockCC.js +0 -1
- package/build/esm/cc/LockCC.js.map +1 -1
- package/build/esm/cc/ManufacturerProprietaryCC.d.ts +2 -2
- package/build/esm/cc/ManufacturerProprietaryCC.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerProprietaryCC.js +0 -1
- package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.d.ts +219 -57
- package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.js +0 -2
- package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
- package/build/esm/cc/MeterCC.d.ts +364 -89
- package/build/esm/cc/MeterCC.d.ts.map +1 -1
- package/build/esm/cc/MeterCC.js +0 -4
- package/build/esm/cc/MeterCC.js.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.d.ts +138 -40
- package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.js +0 -16
- package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
- package/build/esm/cc/MultiChannelCC.d.ts +469 -99
- package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelCC.js +8 -101
- package/build/esm/cc/MultiChannelCC.js.map +1 -1
- package/build/esm/cc/MultiCommandCC.d.ts +4 -8
- package/build/esm/cc/MultiCommandCC.d.ts.map +1 -1
- package/build/esm/cc/MultiCommandCC.js +4 -38
- package/build/esm/cc/MultiCommandCC.js.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.d.ts +118 -33
- package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.js +0 -5
- package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
- package/build/esm/cc/MultilevelSwitchCC.d.ts +490 -125
- package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSwitchCC.js +0 -4
- package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
- package/build/esm/cc/NodeNamingCC.d.ts +128 -26
- package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
- package/build/esm/cc/NodeNamingCC.js +0 -2
- package/build/esm/cc/NodeNamingCC.js.map +1 -1
- package/build/esm/cc/NotificationCC.d.ts +603 -161
- package/build/esm/cc/NotificationCC.d.ts.map +1 -1
- package/build/esm/cc/NotificationCC.js +18 -12
- package/build/esm/cc/NotificationCC.js.map +1 -1
- package/build/esm/cc/PowerlevelCC.d.ts +6 -6
- package/build/esm/cc/PowerlevelCC.d.ts.map +1 -1
- package/build/esm/cc/PowerlevelCC.js +0 -4
- package/build/esm/cc/PowerlevelCC.js.map +1 -1
- package/build/esm/cc/ProtectionCC.d.ts +496 -94
- package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
- package/build/esm/cc/ProtectionCC.js +0 -3
- package/build/esm/cc/ProtectionCC.js.map +1 -1
- package/build/esm/cc/SceneActivationCC.d.ts +127 -28
- package/build/esm/cc/SceneActivationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneActivationCC.js +0 -1
- package/build/esm/cc/SceneActivationCC.js.map +1 -1
- package/build/esm/cc/SceneActuatorConfigurationCC.d.ts +52 -25
- package/build/esm/cc/SceneActuatorConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneActuatorConfigurationCC.js +0 -2
- package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.d.ts +53 -25
- package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.js +0 -2
- package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.d.ts +268 -64
- package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.js +0 -14
- package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
- package/build/esm/cc/Security2CC.d.ts +15 -21
- package/build/esm/cc/Security2CC.d.ts.map +1 -1
- package/build/esm/cc/Security2CC.js +27 -475
- package/build/esm/cc/Security2CC.js.map +1 -1
- package/build/esm/cc/SecurityCC.d.ts +12 -19
- package/build/esm/cc/SecurityCC.d.ts.map +1 -1
- package/build/esm/cc/SecurityCC.js +13 -138
- package/build/esm/cc/SecurityCC.js.map +1 -1
- package/build/esm/cc/SoundSwitchCC.d.ts +253 -64
- package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/SoundSwitchCC.js +0 -7
- package/build/esm/cc/SoundSwitchCC.js.map +1 -1
- package/build/esm/cc/SupervisionCC.d.ts +28 -16
- package/build/esm/cc/SupervisionCC.d.ts.map +1 -1
- package/build/esm/cc/SupervisionCC.js +4 -34
- package/build/esm/cc/SupervisionCC.js.map +1 -1
- package/build/esm/cc/ThermostatFanModeCC.d.ts +187 -38
- package/build/esm/cc/ThermostatFanModeCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatFanModeCC.js +0 -1
- package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
- package/build/esm/cc/ThermostatFanStateCC.d.ts +64 -18
- package/build/esm/cc/ThermostatFanStateCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatFanStateCC.js.map +1 -1
- package/build/esm/cc/ThermostatModeCC.d.ts +189 -40
- package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatModeCC.js +0 -3
- package/build/esm/cc/ThermostatModeCC.js.map +1 -1
- package/build/esm/cc/ThermostatOperatingStateCC.d.ts +65 -19
- package/build/esm/cc/ThermostatOperatingStateCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetbackCC.d.ts +4 -4
- package/build/esm/cc/ThermostatSetbackCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatSetbackCC.js +0 -2
- package/build/esm/cc/ThermostatSetbackCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.d.ts +116 -36
- package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.js +0 -6
- package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
- package/build/esm/cc/TimeCC.d.ts +6 -6
- package/build/esm/cc/TimeCC.d.ts.map +1 -1
- package/build/esm/cc/TimeCC.js +0 -4
- package/build/esm/cc/TimeCC.js.map +1 -1
- package/build/esm/cc/TimeParametersCC.d.ts +63 -12
- package/build/esm/cc/TimeParametersCC.d.ts.map +1 -1
- package/build/esm/cc/TimeParametersCC.js +0 -1
- package/build/esm/cc/TimeParametersCC.js.map +1 -1
- package/build/esm/cc/TransportServiceCC.d.ts +7 -12
- package/build/esm/cc/TransportServiceCC.d.ts.map +1 -1
- package/build/esm/cc/TransportServiceCC.js +5 -38
- package/build/esm/cc/TransportServiceCC.js.map +1 -1
- package/build/esm/cc/UserCodeCC._validateArgs.js +1 -1
- package/build/esm/cc/UserCodeCC._validateArgs.js.map +1 -1
- package/build/esm/cc/UserCodeCC.d.ts +931 -176
- package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
- package/build/esm/cc/UserCodeCC.js +0 -12
- package/build/esm/cc/UserCodeCC.js.map +1 -1
- package/build/esm/cc/VersionCC.d.ts +897 -185
- package/build/esm/cc/VersionCC.d.ts.map +1 -1
- package/build/esm/cc/VersionCC.js +0 -4
- package/build/esm/cc/VersionCC.js.map +1 -1
- package/build/esm/cc/WakeUpCC.d.ts +190 -38
- package/build/esm/cc/WakeUpCC.d.ts.map +1 -1
- package/build/esm/cc/WakeUpCC.js +0 -1
- package/build/esm/cc/WakeUpCC.js.map +1 -1
- package/build/esm/cc/WindowCoveringCC.d.ts +193 -103
- package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
- package/build/esm/cc/WindowCoveringCC.js +0 -5
- package/build/esm/cc/WindowCoveringCC.js.map +1 -1
- package/build/esm/cc/ZWavePlusCC.d.ts +311 -51
- package/build/esm/cc/ZWavePlusCC.d.ts.map +1 -1
- package/build/esm/cc/ZWavePlusCC.js +0 -1
- package/build/esm/cc/ZWavePlusCC.js.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.d.ts +28 -28
- package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.js +0 -27
- package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
- package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts +4 -4
- package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts.map +1 -1
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js +0 -3
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
- package/build/esm/index.d.ts +1 -0
- package/build/esm/index.d.ts.map +1 -1
- package/build/esm/index_browser.d.ts +9 -0
- package/build/esm/index_browser.d.ts.map +1 -1
- package/build/esm/index_browser.js +8 -1
- package/build/esm/index_browser.js.map +1 -1
- package/build/esm/lib/API.d.ts +7 -5
- package/build/esm/lib/API.d.ts.map +1 -1
- package/build/esm/lib/API.js +1 -1
- package/build/esm/lib/API.js.map +1 -1
- package/build/esm/lib/CommandClass.d.ts +10 -21
- package/build/esm/lib/CommandClass.d.ts.map +1 -1
- package/build/esm/lib/CommandClass.js +8 -101
- package/build/esm/lib/CommandClass.js.map +1 -1
- package/build/esm/lib/CommandClassDecorators.d.ts +1 -1
- package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -1
- package/build/esm/lib/CommandClassDecorators.js +1 -1
- package/build/esm/lib/CommandClassDecorators.js.map +1 -1
- package/build/esm/lib/Values.d.ts +2 -2
- package/build/esm/lib/Values.d.ts.map +1 -1
- package/build/esm/lib/Values.js.map +1 -1
- package/build/esm/lib/traits.d.ts +94 -0
- package/build/esm/lib/traits.d.ts.map +1 -0
- package/build/esm/lib/traits.js +2 -0
- package/build/esm/lib/traits.js.map +1 -0
- package/build/esm/lib/utils.d.ts +2 -2
- package/build/esm/lib/utils.d.ts.map +1 -1
- package/build/esm/lib/utils.js.map +1 -1
- package/package.json +13 -13
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cc/MeterCC.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\ttype FloatParameters,\n\ttype MaybeUnknown,\n\ttype WithAddress,\n\tencodeBitMask,\n\tencodeFloatWithScale,\n\tgetFloatParameters,\n\tgetMeter,\n\tgetMeterName,\n\tgetMeterScale,\n\tgetUnknownMeterScale,\n\ttimespan,\n} from \"@zwave-js/core\";\nimport {\n\tCommandClasses,\n\ttype ControlsCC,\n\ttype EndpointId,\n\ttype GetEndpoint,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype NodeId,\n\ttype SinglecastCC,\n\ttype SupervisionResult,\n\ttype SupportsCC,\n\tUNKNOWN_STATE,\n\tValueMetadata,\n\tparseBitMask,\n\tparseFloatWithScale,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetDeviceConfig,\n\tGetNode,\n\tGetSupportedCCVersion,\n\tGetValueDB,\n} from \"@zwave-js/host/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport {\n\ttype AllOrNone,\n\tgetEnumMemberName,\n\tnum2hex,\n\tpick,\n} from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\tPhysicalCCAPI,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\tSET_VALUE_HOOKS,\n\ttype SetValueImplementation,\n\ttype SetValueImplementationHooksFactory,\n\tthrowMissingPropertyKey,\n\tthrowUnsupportedProperty,\n\tthrowUnsupportedPropertyKey,\n\tthrowWrongValueType,\n} from \"../lib/API.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\tgetCommandClass,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MeterCommand, type MeterReading, RateType } from \"../lib/_Types.js\";\n\nexport const MeterCCValues = Object.freeze({\n\t...V.defineStaticCCValues(CommandClasses.Meter, {\n\t\t...V.staticProperty(\"type\", undefined, { internal: true }),\n\t\t...V.staticProperty(\"supportsReset\", undefined, { internal: true }),\n\t\t...V.staticProperty(\"supportedScales\", undefined, { internal: true }),\n\t\t...V.staticProperty(\"supportedRateTypes\", undefined, {\n\t\t\tinternal: true,\n\t\t}),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"resetAll\",\n\t\t\t\"reset\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\tlabel: `Reset accumulated values`,\n\t\t\t\tstates: {\n\t\t\t\t\ttrue: \"Reset\",\n\t\t\t\t},\n\t\t\t} as const,\n\t\t),\n\t}),\n\n\t...V.defineDynamicCCValues(CommandClasses.Meter, {\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"resetSingle\",\n\t\t\t\"reset\",\n\t\t\ttoPropertyKey,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"reset\" && typeof propertyKey === \"number\",\n\t\t\t(meterType: number, rateType: RateType, scale: number) => ({\n\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\t// This is only a placeholder label. A config manager is needed to\n\t\t\t\t// determine the actual label.\n\t\t\t\tlabel: `Reset (${\n\t\t\t\t\trateType === RateType.Consumed\n\t\t\t\t\t\t? \"Consumption, \"\n\t\t\t\t\t\t: rateType === RateType.Produced\n\t\t\t\t\t\t? \"Production, \"\n\t\t\t\t\t\t: \"\"\n\t\t\t\t}${num2hex(scale)})`,\n\t\t\t\tstates: {\n\t\t\t\t\ttrue: \"Reset\",\n\t\t\t\t},\n\t\t\t\tccSpecific: {\n\t\t\t\t\tmeterType,\n\t\t\t\t\trateType,\n\t\t\t\t\tscale,\n\t\t\t\t},\n\t\t\t} as const),\n\t\t),\n\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"value\",\n\t\t\t\"value\",\n\t\t\ttoPropertyKey,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"value\" && typeof propertyKey === \"number\",\n\t\t\t(meterType: number, rateType: RateType, scale: number) => ({\n\t\t\t\t...ValueMetadata.ReadOnlyNumber,\n\t\t\t\t// Label and unit can only be determined with a config manager\n\t\t\t\tccSpecific: {\n\t\t\t\t\tmeterType,\n\t\t\t\t\trateType,\n\t\t\t\t\tscale,\n\t\t\t\t},\n\t\t\t} as const),\n\t\t),\n\t}),\n});\n\nfunction toPropertyKey(\n\tmeterType: number,\n\trateType: RateType,\n\tscale: number,\n): number {\n\treturn (meterType << 16) | (scale << 8) | rateType;\n}\n\nfunction splitPropertyKey(key: number): {\n\tmeterType: number;\n\trateType: RateType;\n\tscale: number;\n} {\n\treturn {\n\t\trateType: key & 0xff,\n\t\tscale: (key >>> 8) & 0xff,\n\t\tmeterType: key >>> 16,\n\t};\n}\n\nfunction getValueLabel(\n\tmeterType: number,\n\tscale: number,\n\trateType: RateType,\n\tsuffix?: string,\n): string {\n\tlet ret = getMeterName(meterType);\n\tconst scaleLabel =\n\t\t(getMeterScale(meterType, scale) ?? getUnknownMeterScale(scale)).label;\n\tswitch (rateType) {\n\t\tcase RateType.Consumed:\n\t\t\tret += ` Consumption [${scaleLabel}]`;\n\t\t\tbreak;\n\t\tcase RateType.Produced:\n\t\t\tret += ` Production [${scaleLabel}]`;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tret += ` [${scaleLabel}]`;\n\t}\n\tif (suffix) {\n\t\tret += ` (${suffix})`;\n\t}\n\treturn ret;\n}\n\nfunction parseMeterValueAndInfo(data: Uint8Array, offset: number): {\n\ttype: number;\n\trateType: RateType;\n\tscale1: number;\n\tvalue: number;\n\tbytesRead: number;\n} {\n\tvalidatePayload(data.length >= offset + 1);\n\n\tconst type = data[offset] & 0b0_00_11111;\n\tconst rateType = (data[offset] & 0b0_11_00000) >>> 5;\n\tconst scale1Bit2 = (data[offset] & 0b1_00_00000) >>> 7;\n\n\tconst {\n\t\tscale: scale1Bits10,\n\t\tvalue,\n\t\tbytesRead,\n\t} = parseFloatWithScale(data.subarray(offset + 1));\n\n\treturn {\n\t\ttype,\n\t\trateType,\n\t\t// The scale is composed of two fields\n\t\tscale1: (scale1Bit2 << 2) | scale1Bits10,\n\t\tvalue,\n\t\t// We've read one byte more than the float contains\n\t\tbytesRead: bytesRead + 1,\n\t};\n}\n\nfunction encodeMeterValueAndInfo(\n\ttype: number,\n\trateType: RateType,\n\tscale: number,\n\tvalue: number,\n): { data: Bytes; floatParams: FloatParameters; scale2: number | undefined } {\n\t// We need at least 2 bytes\n\n\tconst scale1 = scale >= 7 ? 7 : scale & 0b111;\n\tconst scale1Bits10 = scale1 & 0b11;\n\tconst scale1Bit2 = scale1 >>> 2;\n\tconst scale2 = scale >= 7 ? scale - 7 : undefined;\n\n\tconst typeByte = (type & 0b0_00_11111)\n\t\t| ((rateType & 0b11) << 5)\n\t\t| (scale1Bit2 << 7);\n\n\tconst floatParams = getFloatParameters(value);\n\tconst valueBytes = encodeFloatWithScale(\n\t\tvalue,\n\t\tscale1Bits10,\n\t\tfloatParams,\n\t);\n\n\treturn {\n\t\tdata: Bytes.concat([Bytes.from([typeByte]), valueBytes]),\n\t\tfloatParams: pick(floatParams, [\"precision\", \"size\"]),\n\t\tscale2,\n\t};\n}\n\nfunction parseScale(\n\tscale1: number,\n\tdata: Uint8Array,\n\tscale2Offset: number,\n): number {\n\tif (scale1 === 7) {\n\t\tvalidatePayload(data.length >= scale2Offset + 1);\n\t\tconst scale2 = data[scale2Offset];\n\t\treturn scale1 + scale2;\n\t} else {\n\t\treturn scale1;\n\t}\n}\n\nexport function isAccumulatedValue(\n\tmeterType: number,\n\tscale: number,\n): boolean {\n\t// FIXME: We should probably move the meter definitions into code\n\tswitch (meterType) {\n\t\tcase 0x01: // Electric\n\t\t\treturn (\n\t\t\t\t// kVarh\n\t\t\t\t// Pulse count\n\t\t\t\tscale === 0x00 // kWh\n\t\t\t\t|| scale === 0x01 // kVAh\n\t\t\t\t|| scale === 0x03\n\t\t\t\t|| scale === 0x08\n\t\t\t);\n\t\tcase 0x02: // Gas\n\t\t\treturn (\n\t\t\t\t// Pulse count\n\t\t\t\t// ft\u00B3\n\t\t\t\tscale === 0x00 // m\u00B3\n\t\t\t\t|| scale === 0x01\n\t\t\t\t|| scale === 0x03\n\t\t\t);\n\t\tcase 0x03: // Water\n\t\t\treturn (\n\t\t\t\t// Pulse count\n\t\t\t\t// US gallons\n\t\t\t\tscale === 0x00 // m\u00B3\n\t\t\t\t|| scale === 0x01 // ft\u00B3\n\t\t\t\t|| scale === 0x02\n\t\t\t\t|| scale === 0x03\n\t\t\t);\n\t\tcase 0x04: // Heating\n\t\t\treturn scale === 0x00; // kWh\n\t\tcase 0x05: // Cooling\n\t\t\treturn scale === 0x00; // kWh\n\t}\n\treturn false;\n}\n\n@API(CommandClasses.Meter)\nexport class MeterCCAPI extends PhysicalCCAPI {\n\tpublic supportsCommand(cmd: MeterCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase MeterCommand.Get:\n\t\t\tcase MeterCommand.Report:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase MeterCommand.SupportedGet:\n\t\t\tcase MeterCommand.SupportedReport:\n\t\t\t\treturn this.version >= 2;\n\t\t\tcase MeterCommand.Reset: {\n\t\t\t\tconst ret = this.tryGetValueDB()?.getValue<boolean>({\n\t\t\t\t\tcommandClass: getCommandClass(this),\n\t\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\t\tproperty: \"supportsReset\",\n\t\t\t\t});\n\t\t\t\treturn ret === true;\n\t\t\t}\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: MeterCCAPI, { property, propertyKey }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"value\":\n\t\t\t\tcase \"previousValue\":\n\t\t\t\tcase \"deltaTime\": {\n\t\t\t\t\tif (propertyKey == undefined) {\n\t\t\t\t\t\tthrowMissingPropertyKey(this.ccId, property);\n\t\t\t\t\t} else if (typeof propertyKey !== \"number\") {\n\t\t\t\t\t\tthrowUnsupportedPropertyKey(\n\t\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\tpropertyKey,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { rateType, scale } = splitPropertyKey(propertyKey);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tawait this.get({\n\t\t\t\t\t\t\trateType,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t})\n\t\t\t\t\t)?.[property];\n\t\t\t\t}\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\t@validateArgs()\n\tpublic async get(\n\t\toptions?: MeterCCGetOptions,\n\t): Promise<MeterReading | undefined> {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.Get);\n\n\t\tconst cc = new MeterCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\t\tconst response = await this.host.sendCommand<MeterCCReport>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn {\n\t\t\t\ttype: response.type,\n\t\t\t\tscale: getMeterScale(response.type, response.scale)\n\t\t\t\t\t?? getUnknownMeterScale(response.scale),\n\t\t\t\t...pick(response, [\n\t\t\t\t\t\"value\",\n\t\t\t\t\t\"previousValue\",\n\t\t\t\t\t\"rateType\",\n\t\t\t\t\t\"deltaTime\",\n\t\t\t\t]),\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async sendReport(\n\t\toptions: MeterCCReportOptions,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.Report);\n\n\t\tconst cc = new MeterCCReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async getAll(\n\t\taccumulatedOnly: boolean = false,\n\t): Promise<MeterReading[]> {\n\t\tconst valueDB = this.tryGetValueDB();\n\n\t\tif (this.version >= 2) {\n\t\t\tconst meterType = valueDB?.getValue<number>(\n\t\t\t\tMeterCCValues.type.endpoint(this.endpoint.index),\n\t\t\t);\n\t\t\tconst supportedScales = valueDB?.getValue<number[]>(\n\t\t\t\tMeterCCValues.supportedScales.endpoint(this.endpoint.index),\n\t\t\t) ?? [];\n\t\t\tconst supportedRateTypes = valueDB?.getValue<RateType[]>(\n\t\t\t\tMeterCCValues.supportedRateTypes.endpoint(\n\t\t\t\t\tthis.endpoint.index,\n\t\t\t\t),\n\t\t\t) ?? [];\n\n\t\t\tconst rateTypes = supportedRateTypes.length\n\t\t\t\t? supportedRateTypes\n\t\t\t\t: [undefined];\n\n\t\t\tconst ret = [];\n\t\t\tfor (const rateType of rateTypes) {\n\t\t\t\tfor (const scale of supportedScales) {\n\t\t\t\t\t// Skip non-accumulated values if requested\n\t\t\t\t\tif (\n\t\t\t\t\t\taccumulatedOnly\n\t\t\t\t\t\t&& meterType != undefined\n\t\t\t\t\t\t&& !isAccumulatedValue(meterType, scale)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst response = await this.get({\n\t\t\t\t\t\tscale,\n\t\t\t\t\t\trateType,\n\t\t\t\t\t});\n\t\t\t\t\tif (response) ret.push(response);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ret;\n\t\t} else {\n\t\t\tconst response = await this.get();\n\t\t\treturn response ? [response] : [];\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getSupported() {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.SupportedGet);\n\n\t\tconst cc = new MeterCCSupportedGet({\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\tMeterCCSupportedReport\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, [\n\t\t\t\t\"type\",\n\t\t\t\t\"supportsReset\",\n\t\t\t\t\"supportedScales\",\n\t\t\t\t\"supportedRateTypes\",\n\t\t\t]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async sendSupportedReport(\n\t\toptions: MeterCCSupportedReportOptions,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.SupportedReport);\n\n\t\tconst cc = new MeterCCSupportedReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async reset(\n\t\toptions?: MeterCCResetOptions,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.Reset);\n\n\t\tconst cc = new MeterCCReset({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: MeterCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t\tvalue,\n\t\t) {\n\t\t\tif (property !== \"reset\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t} else if (\n\t\t\t\tpropertyKey != undefined\n\t\t\t\t&& typeof propertyKey !== \"number\"\n\t\t\t) {\n\t\t\t\tthrowUnsupportedPropertyKey(this.ccId, property, propertyKey);\n\t\t\t} else if (value !== true) {\n\t\t\t\tthrowWrongValueType(\n\t\t\t\t\tthis.ccId,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"true\",\n\t\t\t\t\tvalue === false ? \"false\" : typeof value,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof propertyKey === \"number\") {\n\t\t\t\tconst { meterType, scale, rateType } = splitPropertyKey(\n\t\t\t\t\tpropertyKey,\n\t\t\t\t);\n\t\t\t\treturn this.reset({\n\t\t\t\t\ttype: meterType,\n\t\t\t\t\tscale,\n\t\t\t\t\trateType,\n\t\t\t\t\ttargetValue: 0,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn this.reset();\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\t}\n\n\tprotected [SET_VALUE_HOOKS]: SetValueImplementationHooksFactory = (\n\t\t{ property, propertyKey },\n\t\t_value,\n\t\t_options,\n\t) => {\n\t\tif (property !== \"reset\") return;\n\n\t\tif (typeof propertyKey === \"number\") {\n\t\t\t// Reset single\n\t\t\tconst { meterType, rateType, scale } = splitPropertyKey(\n\t\t\t\tpropertyKey,\n\t\t\t);\n\t\t\tconst readingValueId = MeterCCValues.value(\n\t\t\t\tmeterType,\n\t\t\t\trateType,\n\t\t\t\tscale,\n\t\t\t).endpoint(this.endpoint.index);\n\n\t\t\treturn {\n\t\t\t\toptimisticallyUpdateRelatedValues: (\n\t\t\t\t\tsupervisedAndSuccessful,\n\t\t\t\t) => {\n\t\t\t\t\tif (!supervisedAndSuccessful) return;\n\n\t\t\t\t\t// After resetting a single reading with supervision, store zero\n\t\t\t\t\t// in the corresponding value\n\t\t\t\t\tconst valueDB = this.tryGetValueDB();\n\t\t\t\t\tif (!valueDB) return;\n\n\t\t\t\t\tif (isAccumulatedValue(meterType, scale)) {\n\t\t\t\t\t\tvalueDB.setValue({\n\t\t\t\t\t\t\tcommandClass: this.ccId,\n\t\t\t\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\tpropertyKey,\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tverifyChanges: () => {\n\t\t\t\t\tthis.schedulePoll(\n\t\t\t\t\t\treadingValueId,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t{ transition: \"fast\" },\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\t// Reset all\n\t\t\tconst valueDB = this.tryGetValueDB();\n\t\t\tif (!valueDB) return;\n\n\t\t\tconst accumulatedValues = valueDB.findValues((vid) =>\n\t\t\t\tvid.commandClass === this.ccId\n\t\t\t\t&& vid.endpoint === this.endpoint.index\n\t\t\t\t&& MeterCCValues.value.is(vid)\n\t\t\t).filter(({ propertyKey }) => {\n\t\t\t\tif (typeof propertyKey !== \"number\") return false;\n\t\t\t\tconst { meterType, scale } = splitPropertyKey(propertyKey);\n\t\t\t\treturn isAccumulatedValue(meterType, scale);\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\toptimisticallyUpdateRelatedValues: (\n\t\t\t\t\tsupervisedAndSuccessful,\n\t\t\t\t) => {\n\t\t\t\t\tif (!supervisedAndSuccessful) return;\n\n\t\t\t\t\t// After setting the reset all value with supervision,\n\t\t\t\t\t// reset all accumulated values, since we know they are now zero.\n\t\t\t\t\tfor (const value of accumulatedValues) {\n\t\t\t\t\t\tvalueDB.setValue(value, 0);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tverifyChanges: () => {\n\t\t\t\t\t// Poll all accumulated values, unless they were updated by the device\n\t\t\t\t\tfor (const valueID of accumulatedValues) {\n\t\t\t\t\t\tthis.schedulePoll(\n\t\t\t\t\t\t\tvalueID,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t{ transition: \"fast\" },\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t};\n}\n\n@commandClass(CommandClasses.Meter)\n@implementedVersion(6)\n@ccValues(MeterCCValues)\nexport class MeterCC extends CommandClass {\n\tdeclare ccCommand: MeterCommand;\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.Meter,\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 >= 2) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"querying meter support...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\n\t\t\tconst suppResp = await api.getSupported();\n\t\t\tif (suppResp) {\n\t\t\t\tconst logMessage = `received meter support:\ntype: ${getMeterName(suppResp.type)}\nsupported scales: ${\n\t\t\t\t\tsuppResp.supportedScales\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t(getMeterScale(suppResp.type, s)\n\t\t\t\t\t\t\t\t\t?? getUnknownMeterScale(s)).label,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((label) => `\\n\u00B7 ${label}`)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t}\nsupported rate types: ${\n\t\t\t\t\tsuppResp.supportedRateTypes\n\t\t\t\t\t\t.map((rt) => getEnumMemberName(RateType, rt))\n\t\t\t\t\t\t.map((label) => `\\n\u00B7 ${label}`)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t}\nsupports reset: ${suppResp.supportsReset}`;\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"Querying meter support timed out, skipping interview...\",\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Query current meter values\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.Meter,\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tif (api.version === 1) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: `querying default meter value...`,\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tawait api.get();\n\t\t} else {\n\t\t\tconst type: number = this.getValue(ctx, MeterCCValues.type)\n\t\t\t\t?? 0;\n\n\t\t\tconst supportedScales: readonly number[] =\n\t\t\t\tthis.getValue(ctx, MeterCCValues.supportedScales) ?? [];\n\n\t\t\tconst supportedRateTypes: readonly RateType[] =\n\t\t\t\tthis.getValue(ctx, MeterCCValues.supportedRateTypes) ?? [];\n\n\t\t\tconst rateTypes = supportedRateTypes.length\n\t\t\t\t? supportedRateTypes\n\t\t\t\t: [undefined];\n\t\t\tfor (const rateType of rateTypes) {\n\t\t\t\tfor (const scale of supportedScales) {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage: `querying meter value (type = ${\n\t\t\t\t\t\t\tgetMeterName(type)\n\t\t\t\t\t\t}, scale = ${\n\t\t\t\t\t\t\t(getMeterScale(type, scale)\n\t\t\t\t\t\t\t\t?? getUnknownMeterScale(scale)).label\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\trateType != undefined\n\t\t\t\t\t\t\t\t? `, rate type = ${\n\t\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\t\tRateType,\n\t\t\t\t\t\t\t\t\t\trateType,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t})...`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\t\t\t\t\tawait api.get({ scale, rateType });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic shouldRefreshValues(\n\t\tthis: SinglecastCC<this>,\n\t\tctx:\n\t\t\t& GetValueDB\n\t\t\t& GetSupportedCCVersion\n\t\t\t& GetDeviceConfig\n\t\t\t& GetNode<\n\t\t\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t\t\t>,\n\t): boolean {\n\t\t// Poll the device when all of the supported values were last updated longer than 6 hours ago.\n\t\t// This may lead to some values not being updated, but the user may have disabled some unnecessary\n\t\t// reports to reduce traffic.\n\t\tconst valueDB = ctx.tryGetValueDB(this.nodeId);\n\t\tif (!valueDB) return true;\n\n\t\tconst values = this.getDefinedValueIDs(ctx).filter((v) =>\n\t\t\tMeterCCValues.value.is(v)\n\t\t);\n\t\treturn values.every((v) => {\n\t\t\tconst lastUpdated = valueDB.getTimestamp(v);\n\t\t\treturn (\n\t\t\t\tlastUpdated == undefined\n\t\t\t\t|| Date.now() - lastUpdated > timespan.hours(6)\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Returns which type this meter has.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getMeterTypeCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<number> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(MeterCCValues.type.endpoint(endpoint.index));\n\t}\n\n\t/**\n\t * Returns which scales are supported by this meter.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getSupportedScalesCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<number[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(MeterCCValues.supportedScales.endpoint(endpoint.index));\n\t}\n\n\t/**\n\t * Returns whether reset is supported by this meter.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static supportsResetCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<boolean> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(MeterCCValues.supportsReset.endpoint(endpoint.index));\n\t}\n\n\t/**\n\t * Returns which rate types are supported by this meter.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getSupportedRateTypesCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<RateType[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(\n\t\t\t\tMeterCCValues.supportedRateTypes.endpoint(endpoint.index),\n\t\t\t);\n\t}\n\n\tpublic translatePropertyKey(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\tif (property === \"value\" && typeof propertyKey === \"number\") {\n\t\t\tconst { meterType, rateType, scale } = splitPropertyKey(\n\t\t\t\tpropertyKey,\n\t\t\t);\n\t\t\tlet ret: string;\n\t\t\tif (meterType !== 0) {\n\t\t\t\tret = `${getMeterName(meterType)}_${\n\t\t\t\t\t(getMeterScale(meterType, scale)\n\t\t\t\t\t\t?? getUnknownMeterScale(scale)).label\n\t\t\t\t}`;\n\t\t\t} else {\n\t\t\t\tret = \"default\";\n\t\t\t}\n\t\t\tif (rateType !== RateType.Unspecified) {\n\t\t\t\tret += \"_\" + getEnumMemberName(RateType, rateType);\n\t\t\t}\n\t\t\treturn ret;\n\t\t} else if (property === \"reset\" && typeof propertyKey === \"number\") {\n\t\t\treturn getMeterName(propertyKey);\n\t\t}\n\t\treturn super.translatePropertyKey(ctx, property, propertyKey);\n\t}\n}\n\n// @publicAPI\nexport interface MeterCCReportOptions {\n\ttype: number;\n\tscale: number;\n\tvalue: number;\n\tpreviousValue?: MaybeNotKnown<number>;\n\trateType?: RateType;\n\tdeltaTime?: MaybeUnknown<number>;\n}\n\n@CCCommand(MeterCommand.Report)\nexport class MeterCCReport extends MeterCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MeterCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.scale = options.scale;\n\t\tthis.value = options.value;\n\t\tthis.previousValue = options.previousValue;\n\t\tthis.rateType = options.rateType ?? RateType.Unspecified;\n\t\tthis.deltaTime = options.deltaTime ?? UNKNOWN_STATE;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): MeterCCReport {\n\t\tconst { type, rateType, scale1, value, bytesRead } =\n\t\t\tparseMeterValueAndInfo(raw.payload, 0);\n\t\tlet offset = bytesRead;\n\t\tconst floatSize = bytesRead - 2;\n\t\tlet deltaTime: MaybeUnknown<number>;\n\t\tlet previousValue: MaybeNotKnown<number>;\n\n\t\tif (raw.payload.length >= offset + 2) {\n\t\t\tdeltaTime = raw.payload.readUInt16BE(offset);\n\t\t\toffset += 2;\n\t\t\tif (deltaTime === 0xffff) {\n\t\t\t\tdeltaTime = UNKNOWN_STATE;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// Previous value is included only if delta time is not 0\n\t\t\t\tdeltaTime !== 0\n\t\t\t\t&& raw.payload.length >= offset + floatSize\n\t\t\t) {\n\t\t\t\tconst { value: prevValue } = parseFloatWithScale(\n\t\t\t\t\t// This float is split in the payload\n\t\t\t\t\tBytes.concat([\n\t\t\t\t\t\tBytes.from([raw.payload[1]]),\n\t\t\t\t\t\traw.payload.subarray(offset),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\toffset += floatSize;\n\t\t\t\tpreviousValue = prevValue;\n\t\t\t}\n\t\t} else {\n\t\t\t// 0 means that no previous value is included\n\t\t\tdeltaTime = 0;\n\t\t}\n\t\tconst scale = parseScale(scale1, raw.payload, offset);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\trateType,\n\t\t\tvalue,\n\t\t\tdeltaTime,\n\t\t\tpreviousValue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\n\t\tconst meter = getMeter(this.type);\n\t\tconst scale = getMeterScale(this.type, this.scale)\n\t\t\t?? getUnknownMeterScale(this.scale);\n\n\t\t// Filter out unknown meter types and scales, unless the strict validation is disabled\n\t\tconst measurementValidation = !ctx.getDeviceConfig?.(\n\t\t\tthis.nodeId as number,\n\t\t)?.compat?.disableStrictMeasurementValidation;\n\n\t\tif (measurementValidation) {\n\t\t\tvalidatePayload.withReason(\n\t\t\t\t`Unknown meter type ${num2hex(this.type)} or corrupted data`,\n\t\t\t)(!!meter);\n\t\t\tvalidatePayload.withReason(\n\t\t\t\t`Unknown meter scale ${num2hex(this.scale)} or corrupted data`,\n\t\t\t)(scale.label !== getUnknownMeterScale(this.scale).label);\n\n\t\t\t// Filter out unsupported meter types, scales and rate types if possible\n\t\t\tif (ccVersion >= 2) {\n\t\t\t\tconst expectedType = this.getValue<number>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMeterCCValues.type,\n\t\t\t\t);\n\t\t\t\tif (expectedType != undefined) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t\"Unexpected meter type or corrupted data\",\n\t\t\t\t\t)(this.type === expectedType);\n\t\t\t\t}\n\n\t\t\t\tconst supportedScales = this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMeterCCValues.supportedScales,\n\t\t\t\t);\n\t\t\t\tif (supportedScales?.length) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t`Unsupported meter scale ${scale.label} or corrupted data`,\n\t\t\t\t\t)(supportedScales.includes(this.scale));\n\t\t\t\t}\n\n\t\t\t\tconst supportedRateTypes = this.getValue<RateType[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMeterCCValues.supportedRateTypes,\n\t\t\t\t);\n\t\t\t\tif (supportedRateTypes?.length) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t`Unsupported rate type ${\n\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\tRateType,\n\t\t\t\t\t\t\t\tthis.rateType,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} or corrupted data`,\n\t\t\t\t\t)(supportedRateTypes.includes(this.rateType));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst valueValue = MeterCCValues.value(\n\t\t\tthis.type,\n\t\t\tthis.rateType,\n\t\t\tthis.scale,\n\t\t);\n\t\tthis.setMetadata(ctx, valueValue, {\n\t\t\t...valueValue.meta,\n\t\t\tlabel: getValueLabel(this.type, this.scale, this.rateType),\n\t\t\tunit: scale.unit,\n\t\t\tccSpecific: {\n\t\t\t\tmeterType: this.type,\n\t\t\t\tscale: this.scale,\n\t\t\t\trateType: this.rateType,\n\t\t\t},\n\t\t});\n\t\tthis.setValue(ctx, valueValue, this.value);\n\n\t\treturn true;\n\t}\n\n\tpublic type: number;\n\tpublic scale: number;\n\tpublic value: number;\n\tpublic previousValue: MaybeNotKnown<number>;\n\tpublic rateType: RateType;\n\tpublic deltaTime: MaybeUnknown<number>;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tconst { data: typeAndValue, floatParams, scale2 } =\n\t\t\tencodeMeterValueAndInfo(\n\t\t\t\tthis.type,\n\t\t\t\tthis.rateType,\n\t\t\t\tthis.scale,\n\t\t\t\tthis.value,\n\t\t\t);\n\n\t\tconst deltaTime = this.deltaTime ?? 0xffff;\n\t\tconst deltaTimeBytes = new Bytes(2);\n\t\tdeltaTimeBytes.writeUInt16BE(deltaTime, 0);\n\n\t\tthis.payload = Bytes.concat([\n\t\t\ttypeAndValue,\n\t\t\tdeltaTimeBytes,\n\t\t]);\n\n\t\tif (this.deltaTime !== 0 && this.previousValue != undefined) {\n\t\t\t// Encode the float, but only keep the value bytes\n\t\t\tconst prevValueBytes = encodeFloatWithScale(\n\t\t\t\tthis.previousValue,\n\t\t\t\t0, // we discard the scale anyways\n\t\t\t\tfloatParams,\n\t\t\t).subarray(1);\n\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.payload,\n\t\t\t\tprevValueBytes,\n\t\t\t]);\n\t\t}\n\n\t\tif (scale2 != undefined) {\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.payload,\n\t\t\t\tBytes.from([scale2]),\n\t\t\t]);\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst scale = getMeterScale(this.type, this.scale)\n\t\t\t?? getUnknownMeterScale(this.scale);\n\n\t\tconst message: MessageRecord = {\n\t\t\t\"meter type\": getMeterName(this.type),\n\t\t\tscale: scale.label,\n\t\t\t\"rate type\": getEnumMemberName(RateType, this.rateType),\n\t\t\tvalue: this.value,\n\t\t};\n\t\tif (this.deltaTime !== UNKNOWN_STATE) {\n\t\t\tmessage[\"time delta\"] = `${this.deltaTime} seconds`;\n\t\t}\n\t\tif (this.previousValue != undefined) {\n\t\t\tmessage[\"prev. value\"] = this.previousValue;\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\nfunction testResponseForMeterGet(sent: MeterCCGet, received: MeterCCReport) {\n\t// We expect a Meter Report that matches the requested scale and rate type\n\t// (if they were requested)\n\treturn (\n\t\t(sent.scale == undefined || sent.scale === received.scale)\n\t\t&& (sent.rateType == undefined || sent.rateType == received.rateType)\n\t);\n}\n\n// @publicAPI\nexport interface MeterCCGetOptions {\n\tscale?: number;\n\trateType?: RateType;\n}\n\n@CCCommand(MeterCommand.Get)\n@expectedCCResponse(MeterCCReport, testResponseForMeterGet)\nexport class MeterCCGet extends MeterCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MeterCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.rateType = options.rateType;\n\t\tthis.scale = options.scale;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): MeterCCGet {\n\t\tlet rateType: RateType | undefined;\n\t\tlet scale: number | undefined;\n\n\t\tif (raw.payload.length >= 1) {\n\t\t\trateType = (raw.payload[0] & 0b11_000_000) >>> 6;\n\t\t\tscale = (raw.payload[0] & 0b00_111_000) >>> 3;\n\t\t\tif (scale === 7) {\n\t\t\t\tvalidatePayload(raw.payload.length >= 2);\n\t\t\t\tscale += raw.payload[1];\n\t\t\t}\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\trateType,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic rateType: RateType | undefined;\n\tpublic scale: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tlet scale1: number;\n\t\tlet scale2: number | undefined;\n\t\tlet bufferLength = 0;\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\t\tif (this.scale == undefined) {\n\t\t\tscale1 = 0;\n\t\t} else if (ccVersion >= 4 && this.scale >= 7) {\n\t\t\tscale1 = 7;\n\t\t\tscale2 = this.scale >>> 3;\n\t\t\tbufferLength = 2;\n\t\t} else if (ccVersion >= 3) {\n\t\t\tscale1 = this.scale & 0b111;\n\t\t\tbufferLength = 1;\n\t\t} else if (ccVersion >= 2) {\n\t\t\tscale1 = this.scale & 0b11;\n\t\t\tbufferLength = 1;\n\t\t} else {\n\t\t\tscale1 = 0;\n\t\t}\n\n\t\tlet rateTypeFlags = 0;\n\t\tif (ccVersion >= 4 && this.rateType != undefined) {\n\t\t\trateTypeFlags = this.rateType & 0b11;\n\t\t\tbufferLength = Math.max(bufferLength, 1);\n\t\t}\n\n\t\tthis.payload = Bytes.alloc(bufferLength, 0);\n\t\tthis.payload[0] = (rateTypeFlags << 6) | (scale1 << 3);\n\t\tif (scale2) this.payload[1] = scale2;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.rateType != undefined) {\n\t\t\tmessage[\"rate type\"] = getEnumMemberName(RateType, this.rateType);\n\t\t}\n\t\tif (this.scale != undefined) {\n\t\t\tif (ctx) {\n\t\t\t\t// Try to lookup the meter type to translate the scale\n\t\t\t\tconst type = this.getValue<number>(ctx, MeterCCValues.type);\n\t\t\t\tif (type != undefined) {\n\t\t\t\t\tmessage.scale = (getMeterScale(type, this.scale)\n\t\t\t\t\t\t?? getUnknownMeterScale(this.scale)).label;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmessage.scale = this.scale;\n\t\t\t}\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 MeterCCSupportedReportOptions {\n\ttype: number;\n\tsupportsReset: boolean;\n\tsupportedScales: readonly number[];\n\tsupportedRateTypes: readonly RateType[];\n}\n\n@CCCommand(MeterCommand.SupportedReport)\n@ccValueProperty(\"type\", MeterCCValues.type)\n@ccValueProperty(\"supportsReset\", MeterCCValues.supportsReset)\n@ccValueProperty(\"supportedScales\", MeterCCValues.supportedScales)\n@ccValueProperty(\"supportedRateTypes\", MeterCCValues.supportedRateTypes)\nexport class MeterCCSupportedReport extends MeterCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MeterCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.supportsReset = options.supportsReset;\n\t\tthis.supportedScales = options.supportedScales;\n\t\tthis.supportedRateTypes = options.supportedRateTypes;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MeterCCSupportedReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst type = raw.payload[0] & 0b0_00_11111;\n\t\tconst supportsReset = !!(raw.payload[0] & 0b1_00_00000);\n\t\tconst hasMoreScales = !!(raw.payload[1] & 0b1_0000000);\n\n\t\tlet supportedScales: number[] | undefined;\n\t\tif (hasMoreScales) {\n\t\t\t// The bitmask is spread out\n\t\t\tvalidatePayload(raw.payload.length >= 3);\n\t\t\tconst extraBytes = raw.payload[2];\n\t\t\tvalidatePayload(raw.payload.length >= 3 + extraBytes);\n\t\t\t// The bitmask is the original payload byte plus all following bytes\n\t\t\t// Since the first byte only has 7 bits, we need to reduce all following bits by 1\n\t\t\tsupportedScales = parseBitMask(\n\t\t\t\tBytes.concat([\n\t\t\t\t\tBytes.from([raw.payload[1] & 0b0_1111111]),\n\t\t\t\t\traw.payload.subarray(3, 3 + extraBytes),\n\t\t\t\t]),\n\t\t\t\t0,\n\t\t\t).map((scale) => (scale >= 8 ? scale - 1 : scale));\n\t\t} else {\n\t\t\t// only 7 bits in the bitmask. Bit 7 is 0, so no need to mask it out\n\t\t\tsupportedScales = parseBitMask(\n\t\t\t\tBytes.from([raw.payload[1]]),\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\t// This is only present in V4+\n\t\tconst supportedRateTypes: RateType[] = parseBitMask(\n\t\t\tBytes.from([(raw.payload[0] & 0b0_11_00000) >>> 5]),\n\t\t\t1,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\tsupportsReset,\n\t\t\tsupportedScales,\n\t\t\tsupportedRateTypes,\n\t\t});\n\t}\n\n\tpublic readonly type: number;\n\n\tpublic readonly supportsReset: boolean;\n\n\tpublic readonly supportedScales: readonly number[];\n\n\tpublic readonly supportedRateTypes: readonly RateType[];\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\t\tif (!this.supportsReset) return true;\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\n\t\t// Create reset values\n\t\tif (ccVersion < 6) {\n\t\t\tthis.ensureMetadata(ctx, MeterCCValues.resetAll);\n\t\t} else {\n\t\t\tfor (const scale of this.supportedScales) {\n\t\t\t\t// Only accumulated values can be reset\n\t\t\t\tif (!isAccumulatedValue(this.type, scale)) continue;\n\n\t\t\t\tfor (const rateType of this.supportedRateTypes) {\n\t\t\t\t\tconst resetSingleValue = MeterCCValues.resetSingle(\n\t\t\t\t\t\tthis.type,\n\t\t\t\t\t\trateType,\n\t\t\t\t\t\tscale,\n\t\t\t\t\t);\n\t\t\t\t\tthis.ensureMetadata(ctx, resetSingleValue, {\n\t\t\t\t\t\t...resetSingleValue.meta,\n\t\t\t\t\t\tlabel: `Reset ${\n\t\t\t\t\t\t\tgetValueLabel(\n\t\t\t\t\t\t\t\tthis.type,\n\t\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\t\trateType,\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}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tconst typeByte = (this.type & 0b0_00_11111)\n\t\t\t| (this.supportedRateTypes.includes(RateType.Consumed)\n\t\t\t\t? 0b0_01_00000\n\t\t\t\t: 0)\n\t\t\t| (this.supportedRateTypes.includes(RateType.Produced)\n\t\t\t\t? 0b0_10_00000\n\t\t\t\t: 0)\n\t\t\t| (this.supportsReset ? 0b1_00_00000 : 0);\n\t\tconst supportedScales = encodeBitMask(\n\t\t\tthis.supportedScales,\n\t\t\tundefined,\n\t\t\t// The first byte only has 7 bits for the bitmask,\n\t\t\t// so we add a fake bit for the value -1 and later shift\n\t\t\t// the first byte one to the right\n\t\t\t-1,\n\t\t);\n\t\tconst scalesByte1 = (supportedScales[0] >>> 1)\n\t\t\t| (supportedScales.length > 1 ? 0b1000_0000 : 0);\n\n\t\tthis.payload = Bytes.from([\n\t\t\ttypeByte,\n\t\t\tscalesByte1,\n\t\t]);\n\t\tif (supportedScales.length > 1) {\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.payload,\n\t\t\t\tBytes.from([supportedScales.length - 1]),\n\t\t\t\tBytes.from(supportedScales.subarray(1)),\n\t\t\t]);\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {\n\t\t\t\"meter type\": getMeterName(this.type),\n\t\t\t\"supports reset\": this.supportsReset,\n\t\t\t\"supported scales\": `${\n\t\t\t\tthis.supportedScales\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(scale) => `\n\u00B7 ${(getMeterScale(this.type, scale) ?? getUnknownMeterScale(scale)).label}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\")\n\t\t\t}`,\n\t\t\t\"supported rate types\": this.supportedRateTypes\n\t\t\t\t.map((rt) => getEnumMemberName(RateType, rt))\n\t\t\t\t.join(\", \"),\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(MeterCommand.SupportedGet)\n@expectedCCResponse(MeterCCSupportedReport)\nexport class MeterCCSupportedGet extends MeterCC {}\n\n// @publicAPI\nexport type MeterCCResetOptions = AllOrNone<{\n\ttype: number;\n\tscale: number;\n\trateType: RateType;\n\ttargetValue: number;\n}>;\n\n@CCCommand(MeterCommand.Reset)\n@useSupervision()\nexport class MeterCCReset extends MeterCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MeterCCResetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.type = options.type;\n\t\tthis.scale = options.scale;\n\t\tthis.rateType = options.rateType;\n\t\tthis.targetValue = options.targetValue;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): MeterCCReset {\n\t\tif (raw.payload.length === 0) {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t});\n\t\t}\n\n\t\tconst {\n\t\t\ttype,\n\t\t\trateType,\n\t\t\tscale1,\n\t\t\tvalue: targetValue,\n\t\t\tbytesRead: scale2Offset,\n\t\t} = parseMeterValueAndInfo(raw.payload, 0);\n\t\tconst scale = parseScale(scale1, raw.payload, scale2Offset);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\trateType,\n\t\t\ttargetValue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic type: number | undefined;\n\tpublic scale: number | undefined;\n\tpublic rateType: RateType | undefined;\n\tpublic targetValue: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tif (\n\t\t\tthis.type != undefined\n\t\t\t&& this.scale != undefined\n\t\t\t&& this.rateType != undefined\n\t\t\t&& this.targetValue != undefined\n\t\t) {\n\t\t\tconst { data: typeAndValue, scale2 } = encodeMeterValueAndInfo(\n\t\t\t\tthis.type,\n\t\t\t\tthis.rateType,\n\t\t\t\tthis.scale,\n\t\t\t\tthis.targetValue,\n\t\t\t);\n\n\t\t\tthis.payload = typeAndValue;\n\n\t\t\tif (scale2 != undefined) {\n\t\t\t\tthis.payload = Bytes.concat([\n\t\t\t\t\tthis.payload,\n\t\t\t\t\tBytes.from([scale2]),\n\t\t\t\t]);\n\t\t\t}\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.type != undefined) {\n\t\t\tmessage.type = getMeterName(this.type);\n\t\t}\n\t\tif (this.rateType != undefined) {\n\t\t\tmessage[\"rate type\"] = getEnumMemberName(RateType, this.rateType);\n\t\t}\n\t\tif (this.type != undefined && this.scale != undefined) {\n\t\t\tmessage.scale = (getMeterScale(this.type, this.scale)\n\t\t\t\t?? getUnknownMeterScale(this.scale)).label;\n\t\t}\n\t\tif (this.targetValue != undefined) {\n\t\t\tmessage[\"target value\"] = this.targetValue;\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { type CCEncodingContext, type CCParsingContext } from \"@zwave-js/cc\";\nimport { type GetDeviceConfig } from \"@zwave-js/config\";\nimport {\n\ttype FloatParameters,\n\ttype GetNode,\n\ttype GetSupportedCCVersion,\n\ttype GetValueDB,\n\ttype MaybeUnknown,\n\ttype WithAddress,\n\tencodeBitMask,\n\tencodeFloatWithScale,\n\tgetFloatParameters,\n\tgetMeter,\n\tgetMeterName,\n\tgetMeterScale,\n\tgetUnknownMeterScale,\n\ttimespan,\n} from \"@zwave-js/core\";\nimport {\n\tCommandClasses,\n\ttype ControlsCC,\n\ttype EndpointId,\n\ttype GetEndpoint,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype NodeId,\n\ttype SinglecastCC,\n\ttype SupervisionResult,\n\ttype SupportsCC,\n\tUNKNOWN_STATE,\n\tValueMetadata,\n\tparseBitMask,\n\tparseFloatWithScale,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport {\n\ttype AllOrNone,\n\tgetEnumMemberName,\n\tnum2hex,\n\tpick,\n} from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\tPhysicalCCAPI,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\tSET_VALUE_HOOKS,\n\ttype SetValueImplementation,\n\ttype SetValueImplementationHooksFactory,\n\tthrowMissingPropertyKey,\n\tthrowUnsupportedProperty,\n\tthrowUnsupportedPropertyKey,\n\tthrowWrongValueType,\n} from \"../lib/API.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\tgetCommandClass,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MeterCommand, type MeterReading, RateType } from \"../lib/_Types.js\";\n\nexport const MeterCCValues = Object.freeze({\n\t...V.defineStaticCCValues(CommandClasses.Meter, {\n\t\t...V.staticProperty(\"type\", undefined, { internal: true }),\n\t\t...V.staticProperty(\"supportsReset\", undefined, { internal: true }),\n\t\t...V.staticProperty(\"supportedScales\", undefined, { internal: true }),\n\t\t...V.staticProperty(\"supportedRateTypes\", undefined, {\n\t\t\tinternal: true,\n\t\t}),\n\n\t\t...V.staticPropertyWithName(\n\t\t\t\"resetAll\",\n\t\t\t\"reset\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\tlabel: `Reset accumulated values`,\n\t\t\t\tstates: {\n\t\t\t\t\ttrue: \"Reset\",\n\t\t\t\t},\n\t\t\t} as const,\n\t\t),\n\t}),\n\n\t...V.defineDynamicCCValues(CommandClasses.Meter, {\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"resetSingle\",\n\t\t\t\"reset\",\n\t\t\ttoPropertyKey,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"reset\" && typeof propertyKey === \"number\",\n\t\t\t(meterType: number, rateType: RateType, scale: number) => ({\n\t\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\t\t// This is only a placeholder label. A config manager is needed to\n\t\t\t\t// determine the actual label.\n\t\t\t\tlabel: `Reset (${\n\t\t\t\t\trateType === RateType.Consumed\n\t\t\t\t\t\t? \"Consumption, \"\n\t\t\t\t\t\t: rateType === RateType.Produced\n\t\t\t\t\t\t? \"Production, \"\n\t\t\t\t\t\t: \"\"\n\t\t\t\t}${num2hex(scale)})`,\n\t\t\t\tstates: {\n\t\t\t\t\ttrue: \"Reset\",\n\t\t\t\t},\n\t\t\t\tccSpecific: {\n\t\t\t\t\tmeterType,\n\t\t\t\t\trateType,\n\t\t\t\t\tscale,\n\t\t\t\t},\n\t\t\t} as const),\n\t\t),\n\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"value\",\n\t\t\t\"value\",\n\t\t\ttoPropertyKey,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"value\" && typeof propertyKey === \"number\",\n\t\t\t(meterType: number, rateType: RateType, scale: number) => ({\n\t\t\t\t...ValueMetadata.ReadOnlyNumber,\n\t\t\t\t// Label and unit can only be determined with a config manager\n\t\t\t\tccSpecific: {\n\t\t\t\t\tmeterType,\n\t\t\t\t\trateType,\n\t\t\t\t\tscale,\n\t\t\t\t},\n\t\t\t} as const),\n\t\t),\n\t}),\n});\n\nfunction toPropertyKey(\n\tmeterType: number,\n\trateType: RateType,\n\tscale: number,\n): number {\n\treturn (meterType << 16) | (scale << 8) | rateType;\n}\n\nfunction splitPropertyKey(key: number): {\n\tmeterType: number;\n\trateType: RateType;\n\tscale: number;\n} {\n\treturn {\n\t\trateType: key & 0xff,\n\t\tscale: (key >>> 8) & 0xff,\n\t\tmeterType: key >>> 16,\n\t};\n}\n\nfunction getValueLabel(\n\tmeterType: number,\n\tscale: number,\n\trateType: RateType,\n\tsuffix?: string,\n): string {\n\tlet ret = getMeterName(meterType);\n\tconst scaleLabel =\n\t\t(getMeterScale(meterType, scale) ?? getUnknownMeterScale(scale)).label;\n\tswitch (rateType) {\n\t\tcase RateType.Consumed:\n\t\t\tret += ` Consumption [${scaleLabel}]`;\n\t\t\tbreak;\n\t\tcase RateType.Produced:\n\t\t\tret += ` Production [${scaleLabel}]`;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tret += ` [${scaleLabel}]`;\n\t}\n\tif (suffix) {\n\t\tret += ` (${suffix})`;\n\t}\n\treturn ret;\n}\n\nfunction parseMeterValueAndInfo(data: Uint8Array, offset: number): {\n\ttype: number;\n\trateType: RateType;\n\tscale1: number;\n\tvalue: number;\n\tbytesRead: number;\n} {\n\tvalidatePayload(data.length >= offset + 1);\n\n\tconst type = data[offset] & 0b0_00_11111;\n\tconst rateType = (data[offset] & 0b0_11_00000) >>> 5;\n\tconst scale1Bit2 = (data[offset] & 0b1_00_00000) >>> 7;\n\n\tconst {\n\t\tscale: scale1Bits10,\n\t\tvalue,\n\t\tbytesRead,\n\t} = parseFloatWithScale(data.subarray(offset + 1));\n\n\treturn {\n\t\ttype,\n\t\trateType,\n\t\t// The scale is composed of two fields\n\t\tscale1: (scale1Bit2 << 2) | scale1Bits10,\n\t\tvalue,\n\t\t// We've read one byte more than the float contains\n\t\tbytesRead: bytesRead + 1,\n\t};\n}\n\nfunction encodeMeterValueAndInfo(\n\ttype: number,\n\trateType: RateType,\n\tscale: number,\n\tvalue: number,\n): { data: Bytes; floatParams: FloatParameters; scale2: number | undefined } {\n\t// We need at least 2 bytes\n\n\tconst scale1 = scale >= 7 ? 7 : scale & 0b111;\n\tconst scale1Bits10 = scale1 & 0b11;\n\tconst scale1Bit2 = scale1 >>> 2;\n\tconst scale2 = scale >= 7 ? scale - 7 : undefined;\n\n\tconst typeByte = (type & 0b0_00_11111)\n\t\t| ((rateType & 0b11) << 5)\n\t\t| (scale1Bit2 << 7);\n\n\tconst floatParams = getFloatParameters(value);\n\tconst valueBytes = encodeFloatWithScale(\n\t\tvalue,\n\t\tscale1Bits10,\n\t\tfloatParams,\n\t);\n\n\treturn {\n\t\tdata: Bytes.concat([Bytes.from([typeByte]), valueBytes]),\n\t\tfloatParams: pick(floatParams, [\"precision\", \"size\"]),\n\t\tscale2,\n\t};\n}\n\nfunction parseScale(\n\tscale1: number,\n\tdata: Uint8Array,\n\tscale2Offset: number,\n): number {\n\tif (scale1 === 7) {\n\t\tvalidatePayload(data.length >= scale2Offset + 1);\n\t\tconst scale2 = data[scale2Offset];\n\t\treturn scale1 + scale2;\n\t} else {\n\t\treturn scale1;\n\t}\n}\n\nexport function isAccumulatedValue(\n\tmeterType: number,\n\tscale: number,\n): boolean {\n\t// FIXME: We should probably move the meter definitions into code\n\tswitch (meterType) {\n\t\tcase 0x01: // Electric\n\t\t\treturn (\n\t\t\t\t// kVarh\n\t\t\t\t// Pulse count\n\t\t\t\tscale === 0x00 // kWh\n\t\t\t\t|| scale === 0x01 // kVAh\n\t\t\t\t|| scale === 0x03\n\t\t\t\t|| scale === 0x08\n\t\t\t);\n\t\tcase 0x02: // Gas\n\t\t\treturn (\n\t\t\t\t// Pulse count\n\t\t\t\t// ft\u00B3\n\t\t\t\tscale === 0x00 // m\u00B3\n\t\t\t\t|| scale === 0x01\n\t\t\t\t|| scale === 0x03\n\t\t\t);\n\t\tcase 0x03: // Water\n\t\t\treturn (\n\t\t\t\t// Pulse count\n\t\t\t\t// US gallons\n\t\t\t\tscale === 0x00 // m\u00B3\n\t\t\t\t|| scale === 0x01 // ft\u00B3\n\t\t\t\t|| scale === 0x02\n\t\t\t\t|| scale === 0x03\n\t\t\t);\n\t\tcase 0x04: // Heating\n\t\t\treturn scale === 0x00; // kWh\n\t\tcase 0x05: // Cooling\n\t\t\treturn scale === 0x00; // kWh\n\t}\n\treturn false;\n}\n\n@API(CommandClasses.Meter)\nexport class MeterCCAPI extends PhysicalCCAPI {\n\tpublic supportsCommand(cmd: MeterCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase MeterCommand.Get:\n\t\t\tcase MeterCommand.Report:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase MeterCommand.SupportedGet:\n\t\t\tcase MeterCommand.SupportedReport:\n\t\t\t\treturn this.version >= 2;\n\t\t\tcase MeterCommand.Reset: {\n\t\t\t\tconst ret = this.tryGetValueDB()?.getValue<boolean>({\n\t\t\t\t\tcommandClass: getCommandClass(this),\n\t\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\t\tproperty: \"supportsReset\",\n\t\t\t\t});\n\t\t\t\treturn ret === true;\n\t\t\t}\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: MeterCCAPI, { property, propertyKey }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"value\":\n\t\t\t\tcase \"previousValue\":\n\t\t\t\tcase \"deltaTime\": {\n\t\t\t\t\tif (propertyKey == undefined) {\n\t\t\t\t\t\tthrowMissingPropertyKey(this.ccId, property);\n\t\t\t\t\t} else if (typeof propertyKey !== \"number\") {\n\t\t\t\t\t\tthrowUnsupportedPropertyKey(\n\t\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\tpropertyKey,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { rateType, scale } = splitPropertyKey(propertyKey);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tawait this.get({\n\t\t\t\t\t\t\trateType,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t})\n\t\t\t\t\t)?.[property];\n\t\t\t\t}\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\t@validateArgs()\n\tpublic async get(\n\t\toptions?: MeterCCGetOptions,\n\t): Promise<MeterReading | undefined> {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.Get);\n\n\t\tconst cc = new MeterCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\t\tconst response = await this.host.sendCommand<MeterCCReport>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn {\n\t\t\t\ttype: response.type,\n\t\t\t\tscale: getMeterScale(response.type, response.scale)\n\t\t\t\t\t?? getUnknownMeterScale(response.scale),\n\t\t\t\t...pick(response, [\n\t\t\t\t\t\"value\",\n\t\t\t\t\t\"previousValue\",\n\t\t\t\t\t\"rateType\",\n\t\t\t\t\t\"deltaTime\",\n\t\t\t\t]),\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async sendReport(\n\t\toptions: MeterCCReportOptions,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.Report);\n\n\t\tconst cc = new MeterCCReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async getAll(\n\t\taccumulatedOnly: boolean = false,\n\t): Promise<MeterReading[]> {\n\t\tconst valueDB = this.tryGetValueDB();\n\n\t\tif (this.version >= 2) {\n\t\t\tconst meterType = valueDB?.getValue<number>(\n\t\t\t\tMeterCCValues.type.endpoint(this.endpoint.index),\n\t\t\t);\n\t\t\tconst supportedScales = valueDB?.getValue<number[]>(\n\t\t\t\tMeterCCValues.supportedScales.endpoint(this.endpoint.index),\n\t\t\t) ?? [];\n\t\t\tconst supportedRateTypes = valueDB?.getValue<RateType[]>(\n\t\t\t\tMeterCCValues.supportedRateTypes.endpoint(\n\t\t\t\t\tthis.endpoint.index,\n\t\t\t\t),\n\t\t\t) ?? [];\n\n\t\t\tconst rateTypes = supportedRateTypes.length\n\t\t\t\t? supportedRateTypes\n\t\t\t\t: [undefined];\n\n\t\t\tconst ret = [];\n\t\t\tfor (const rateType of rateTypes) {\n\t\t\t\tfor (const scale of supportedScales) {\n\t\t\t\t\t// Skip non-accumulated values if requested\n\t\t\t\t\tif (\n\t\t\t\t\t\taccumulatedOnly\n\t\t\t\t\t\t&& meterType != undefined\n\t\t\t\t\t\t&& !isAccumulatedValue(meterType, scale)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst response = await this.get({\n\t\t\t\t\t\tscale,\n\t\t\t\t\t\trateType,\n\t\t\t\t\t});\n\t\t\t\t\tif (response) ret.push(response);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ret;\n\t\t} else {\n\t\t\tconst response = await this.get();\n\t\t\treturn response ? [response] : [];\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getSupported() {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.SupportedGet);\n\n\t\tconst cc = new MeterCCSupportedGet({\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\tMeterCCSupportedReport\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, [\n\t\t\t\t\"type\",\n\t\t\t\t\"supportsReset\",\n\t\t\t\t\"supportedScales\",\n\t\t\t\t\"supportedRateTypes\",\n\t\t\t]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async sendSupportedReport(\n\t\toptions: MeterCCSupportedReportOptions,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.SupportedReport);\n\n\t\tconst cc = new MeterCCSupportedReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async reset(\n\t\toptions?: MeterCCResetOptions,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(MeterCommand, MeterCommand.Reset);\n\n\t\tconst cc = new MeterCCReset({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: MeterCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t\tvalue,\n\t\t) {\n\t\t\tif (property !== \"reset\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t} else if (\n\t\t\t\tpropertyKey != undefined\n\t\t\t\t&& typeof propertyKey !== \"number\"\n\t\t\t) {\n\t\t\t\tthrowUnsupportedPropertyKey(this.ccId, property, propertyKey);\n\t\t\t} else if (value !== true) {\n\t\t\t\tthrowWrongValueType(\n\t\t\t\t\tthis.ccId,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"true\",\n\t\t\t\t\tvalue === false ? \"false\" : typeof value,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof propertyKey === \"number\") {\n\t\t\t\tconst { meterType, scale, rateType } = splitPropertyKey(\n\t\t\t\t\tpropertyKey,\n\t\t\t\t);\n\t\t\t\treturn this.reset({\n\t\t\t\t\ttype: meterType,\n\t\t\t\t\tscale,\n\t\t\t\t\trateType,\n\t\t\t\t\ttargetValue: 0,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn this.reset();\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\t}\n\n\tprotected [SET_VALUE_HOOKS]: SetValueImplementationHooksFactory = (\n\t\t{ property, propertyKey },\n\t\t_value,\n\t\t_options,\n\t) => {\n\t\tif (property !== \"reset\") return;\n\n\t\tif (typeof propertyKey === \"number\") {\n\t\t\t// Reset single\n\t\t\tconst { meterType, rateType, scale } = splitPropertyKey(\n\t\t\t\tpropertyKey,\n\t\t\t);\n\t\t\tconst readingValueId = MeterCCValues.value(\n\t\t\t\tmeterType,\n\t\t\t\trateType,\n\t\t\t\tscale,\n\t\t\t).endpoint(this.endpoint.index);\n\n\t\t\treturn {\n\t\t\t\toptimisticallyUpdateRelatedValues: (\n\t\t\t\t\tsupervisedAndSuccessful,\n\t\t\t\t) => {\n\t\t\t\t\tif (!supervisedAndSuccessful) return;\n\n\t\t\t\t\t// After resetting a single reading with supervision, store zero\n\t\t\t\t\t// in the corresponding value\n\t\t\t\t\tconst valueDB = this.tryGetValueDB();\n\t\t\t\t\tif (!valueDB) return;\n\n\t\t\t\t\tif (isAccumulatedValue(meterType, scale)) {\n\t\t\t\t\t\tvalueDB.setValue({\n\t\t\t\t\t\t\tcommandClass: this.ccId,\n\t\t\t\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\tpropertyKey,\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tverifyChanges: () => {\n\t\t\t\t\tthis.schedulePoll(\n\t\t\t\t\t\treadingValueId,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t{ transition: \"fast\" },\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\t// Reset all\n\t\t\tconst valueDB = this.tryGetValueDB();\n\t\t\tif (!valueDB) return;\n\n\t\t\tconst accumulatedValues = valueDB.findValues((vid) =>\n\t\t\t\tvid.commandClass === this.ccId\n\t\t\t\t&& vid.endpoint === this.endpoint.index\n\t\t\t\t&& MeterCCValues.value.is(vid)\n\t\t\t).filter(({ propertyKey }) => {\n\t\t\t\tif (typeof propertyKey !== \"number\") return false;\n\t\t\t\tconst { meterType, scale } = splitPropertyKey(propertyKey);\n\t\t\t\treturn isAccumulatedValue(meterType, scale);\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\toptimisticallyUpdateRelatedValues: (\n\t\t\t\t\tsupervisedAndSuccessful,\n\t\t\t\t) => {\n\t\t\t\t\tif (!supervisedAndSuccessful) return;\n\n\t\t\t\t\t// After setting the reset all value with supervision,\n\t\t\t\t\t// reset all accumulated values, since we know they are now zero.\n\t\t\t\t\tfor (const value of accumulatedValues) {\n\t\t\t\t\t\tvalueDB.setValue(value, 0);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tverifyChanges: () => {\n\t\t\t\t\t// Poll all accumulated values, unless they were updated by the device\n\t\t\t\t\tfor (const valueID of accumulatedValues) {\n\t\t\t\t\t\tthis.schedulePoll(\n\t\t\t\t\t\t\tvalueID,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t{ transition: \"fast\" },\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t};\n}\n\n@commandClass(CommandClasses.Meter)\n@implementedVersion(6)\n@ccValues(MeterCCValues)\nexport class MeterCC extends CommandClass {\n\tdeclare ccCommand: MeterCommand;\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.Meter,\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 >= 2) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"querying meter support...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\n\t\t\tconst suppResp = await api.getSupported();\n\t\t\tif (suppResp) {\n\t\t\t\tconst logMessage = `received meter support:\ntype: ${getMeterName(suppResp.type)}\nsupported scales: ${\n\t\t\t\t\tsuppResp.supportedScales\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t(getMeterScale(suppResp.type, s)\n\t\t\t\t\t\t\t\t\t?? getUnknownMeterScale(s)).label,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((label) => `\\n\u00B7 ${label}`)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t}\nsupported rate types: ${\n\t\t\t\t\tsuppResp.supportedRateTypes\n\t\t\t\t\t\t.map((rt) => getEnumMemberName(RateType, rt))\n\t\t\t\t\t\t.map((label) => `\\n\u00B7 ${label}`)\n\t\t\t\t\t\t.join(\"\")\n\t\t\t\t}\nsupports reset: ${suppResp.supportsReset}`;\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"Querying meter support timed out, skipping interview...\",\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Query current meter values\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.Meter,\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tif (api.version === 1) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: `querying default meter value...`,\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tawait api.get();\n\t\t} else {\n\t\t\tconst type: number = this.getValue(ctx, MeterCCValues.type)\n\t\t\t\t?? 0;\n\n\t\t\tconst supportedScales: readonly number[] =\n\t\t\t\tthis.getValue(ctx, MeterCCValues.supportedScales) ?? [];\n\n\t\t\tconst supportedRateTypes: readonly RateType[] =\n\t\t\t\tthis.getValue(ctx, MeterCCValues.supportedRateTypes) ?? [];\n\n\t\t\tconst rateTypes = supportedRateTypes.length\n\t\t\t\t? supportedRateTypes\n\t\t\t\t: [undefined];\n\t\t\tfor (const rateType of rateTypes) {\n\t\t\t\tfor (const scale of supportedScales) {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage: `querying meter value (type = ${\n\t\t\t\t\t\t\tgetMeterName(type)\n\t\t\t\t\t\t}, scale = ${\n\t\t\t\t\t\t\t(getMeterScale(type, scale)\n\t\t\t\t\t\t\t\t?? getUnknownMeterScale(scale)).label\n\t\t\t\t\t\t}${\n\t\t\t\t\t\t\trateType != undefined\n\t\t\t\t\t\t\t\t? `, rate type = ${\n\t\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\t\tRateType,\n\t\t\t\t\t\t\t\t\t\trateType,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t})...`,\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\t\t\t\t\tawait api.get({ scale, rateType });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic shouldRefreshValues(\n\t\tthis: SinglecastCC<this>,\n\t\tctx:\n\t\t\t& GetValueDB\n\t\t\t& GetSupportedCCVersion\n\t\t\t& GetDeviceConfig\n\t\t\t& GetNode<\n\t\t\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t\t\t>,\n\t): boolean {\n\t\t// Poll the device when all of the supported values were last updated longer than 6 hours ago.\n\t\t// This may lead to some values not being updated, but the user may have disabled some unnecessary\n\t\t// reports to reduce traffic.\n\t\tconst valueDB = ctx.tryGetValueDB(this.nodeId);\n\t\tif (!valueDB) return true;\n\n\t\tconst values = this.getDefinedValueIDs(ctx).filter((v) =>\n\t\t\tMeterCCValues.value.is(v)\n\t\t);\n\t\treturn values.every((v) => {\n\t\t\tconst lastUpdated = valueDB.getTimestamp(v);\n\t\t\treturn (\n\t\t\t\tlastUpdated == undefined\n\t\t\t\t|| Date.now() - lastUpdated > timespan.hours(6)\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Returns which type this meter has.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getMeterTypeCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<number> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(MeterCCValues.type.endpoint(endpoint.index));\n\t}\n\n\t/**\n\t * Returns which scales are supported by this meter.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getSupportedScalesCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<number[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(MeterCCValues.supportedScales.endpoint(endpoint.index));\n\t}\n\n\t/**\n\t * Returns whether reset is supported by this meter.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static supportsResetCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<boolean> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(MeterCCValues.supportsReset.endpoint(endpoint.index));\n\t}\n\n\t/**\n\t * Returns which rate types are supported by this meter.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getSupportedRateTypesCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<RateType[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(\n\t\t\t\tMeterCCValues.supportedRateTypes.endpoint(endpoint.index),\n\t\t\t);\n\t}\n\n\tpublic translatePropertyKey(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\tif (property === \"value\" && typeof propertyKey === \"number\") {\n\t\t\tconst { meterType, rateType, scale } = splitPropertyKey(\n\t\t\t\tpropertyKey,\n\t\t\t);\n\t\t\tlet ret: string;\n\t\t\tif (meterType !== 0) {\n\t\t\t\tret = `${getMeterName(meterType)}_${\n\t\t\t\t\t(getMeterScale(meterType, scale)\n\t\t\t\t\t\t?? getUnknownMeterScale(scale)).label\n\t\t\t\t}`;\n\t\t\t} else {\n\t\t\t\tret = \"default\";\n\t\t\t}\n\t\t\tif (rateType !== RateType.Unspecified) {\n\t\t\t\tret += \"_\" + getEnumMemberName(RateType, rateType);\n\t\t\t}\n\t\t\treturn ret;\n\t\t} else if (property === \"reset\" && typeof propertyKey === \"number\") {\n\t\t\treturn getMeterName(propertyKey);\n\t\t}\n\t\treturn super.translatePropertyKey(ctx, property, propertyKey);\n\t}\n}\n\n// @publicAPI\nexport interface MeterCCReportOptions {\n\ttype: number;\n\tscale: number;\n\tvalue: number;\n\tpreviousValue?: MaybeNotKnown<number>;\n\trateType?: RateType;\n\tdeltaTime?: MaybeUnknown<number>;\n}\n\n@CCCommand(MeterCommand.Report)\nexport class MeterCCReport extends MeterCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MeterCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.scale = options.scale;\n\t\tthis.value = options.value;\n\t\tthis.previousValue = options.previousValue;\n\t\tthis.rateType = options.rateType ?? RateType.Unspecified;\n\t\tthis.deltaTime = options.deltaTime ?? UNKNOWN_STATE;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): MeterCCReport {\n\t\tconst { type, rateType, scale1, value, bytesRead } =\n\t\t\tparseMeterValueAndInfo(raw.payload, 0);\n\t\tlet offset = bytesRead;\n\t\tconst floatSize = bytesRead - 2;\n\t\tlet deltaTime: MaybeUnknown<number>;\n\t\tlet previousValue: MaybeNotKnown<number>;\n\n\t\tif (raw.payload.length >= offset + 2) {\n\t\t\tdeltaTime = raw.payload.readUInt16BE(offset);\n\t\t\toffset += 2;\n\t\t\tif (deltaTime === 0xffff) {\n\t\t\t\tdeltaTime = UNKNOWN_STATE;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// Previous value is included only if delta time is not 0\n\t\t\t\tdeltaTime !== 0\n\t\t\t\t&& raw.payload.length >= offset + floatSize\n\t\t\t) {\n\t\t\t\tconst { value: prevValue } = parseFloatWithScale(\n\t\t\t\t\t// This float is split in the payload\n\t\t\t\t\tBytes.concat([\n\t\t\t\t\t\tBytes.from([raw.payload[1]]),\n\t\t\t\t\t\traw.payload.subarray(offset),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\toffset += floatSize;\n\t\t\t\tpreviousValue = prevValue;\n\t\t\t}\n\t\t} else {\n\t\t\t// 0 means that no previous value is included\n\t\t\tdeltaTime = 0;\n\t\t}\n\t\tconst scale = parseScale(scale1, raw.payload, offset);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\trateType,\n\t\t\tvalue,\n\t\t\tdeltaTime,\n\t\t\tpreviousValue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\n\t\tconst meter = getMeter(this.type);\n\t\tconst scale = getMeterScale(this.type, this.scale)\n\t\t\t?? getUnknownMeterScale(this.scale);\n\n\t\t// Filter out unknown meter types and scales, unless the strict validation is disabled\n\t\tconst measurementValidation = !ctx.getDeviceConfig?.(\n\t\t\tthis.nodeId as number,\n\t\t)?.compat?.disableStrictMeasurementValidation;\n\n\t\tif (measurementValidation) {\n\t\t\tvalidatePayload.withReason(\n\t\t\t\t`Unknown meter type ${num2hex(this.type)} or corrupted data`,\n\t\t\t)(!!meter);\n\t\t\tvalidatePayload.withReason(\n\t\t\t\t`Unknown meter scale ${num2hex(this.scale)} or corrupted data`,\n\t\t\t)(scale.label !== getUnknownMeterScale(this.scale).label);\n\n\t\t\t// Filter out unsupported meter types, scales and rate types if possible\n\t\t\tif (ccVersion >= 2) {\n\t\t\t\tconst expectedType = this.getValue<number>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMeterCCValues.type,\n\t\t\t\t);\n\t\t\t\tif (expectedType != undefined) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t\"Unexpected meter type or corrupted data\",\n\t\t\t\t\t)(this.type === expectedType);\n\t\t\t\t}\n\n\t\t\t\tconst supportedScales = this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMeterCCValues.supportedScales,\n\t\t\t\t);\n\t\t\t\tif (supportedScales?.length) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t`Unsupported meter scale ${scale.label} or corrupted data`,\n\t\t\t\t\t)(supportedScales.includes(this.scale));\n\t\t\t\t}\n\n\t\t\t\tconst supportedRateTypes = this.getValue<RateType[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMeterCCValues.supportedRateTypes,\n\t\t\t\t);\n\t\t\t\tif (supportedRateTypes?.length) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t`Unsupported rate type ${\n\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\tRateType,\n\t\t\t\t\t\t\t\tthis.rateType,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} or corrupted data`,\n\t\t\t\t\t)(supportedRateTypes.includes(this.rateType));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst valueValue = MeterCCValues.value(\n\t\t\tthis.type,\n\t\t\tthis.rateType,\n\t\t\tthis.scale,\n\t\t);\n\t\tthis.setMetadata(ctx, valueValue, {\n\t\t\t...valueValue.meta,\n\t\t\tlabel: getValueLabel(this.type, this.scale, this.rateType),\n\t\t\tunit: scale.unit,\n\t\t\tccSpecific: {\n\t\t\t\tmeterType: this.type,\n\t\t\t\tscale: this.scale,\n\t\t\t\trateType: this.rateType,\n\t\t\t},\n\t\t});\n\t\tthis.setValue(ctx, valueValue, this.value);\n\n\t\treturn true;\n\t}\n\n\tpublic type: number;\n\tpublic scale: number;\n\tpublic value: number;\n\tpublic previousValue: MaybeNotKnown<number>;\n\tpublic rateType: RateType;\n\tpublic deltaTime: MaybeUnknown<number>;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst { data: typeAndValue, floatParams, scale2 } =\n\t\t\tencodeMeterValueAndInfo(\n\t\t\t\tthis.type,\n\t\t\t\tthis.rateType,\n\t\t\t\tthis.scale,\n\t\t\t\tthis.value,\n\t\t\t);\n\n\t\tconst deltaTime = this.deltaTime ?? 0xffff;\n\t\tconst deltaTimeBytes = new Bytes(2);\n\t\tdeltaTimeBytes.writeUInt16BE(deltaTime, 0);\n\n\t\tthis.payload = Bytes.concat([\n\t\t\ttypeAndValue,\n\t\t\tdeltaTimeBytes,\n\t\t]);\n\n\t\tif (this.deltaTime !== 0 && this.previousValue != undefined) {\n\t\t\t// Encode the float, but only keep the value bytes\n\t\t\tconst prevValueBytes = encodeFloatWithScale(\n\t\t\t\tthis.previousValue,\n\t\t\t\t0, // we discard the scale anyways\n\t\t\t\tfloatParams,\n\t\t\t).subarray(1);\n\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.payload,\n\t\t\t\tprevValueBytes,\n\t\t\t]);\n\t\t}\n\n\t\tif (scale2 != undefined) {\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.payload,\n\t\t\t\tBytes.from([scale2]),\n\t\t\t]);\n\t\t}\n\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst scale = getMeterScale(this.type, this.scale)\n\t\t\t?? getUnknownMeterScale(this.scale);\n\n\t\tconst message: MessageRecord = {\n\t\t\t\"meter type\": getMeterName(this.type),\n\t\t\tscale: scale.label,\n\t\t\t\"rate type\": getEnumMemberName(RateType, this.rateType),\n\t\t\tvalue: this.value,\n\t\t};\n\t\tif (this.deltaTime !== UNKNOWN_STATE) {\n\t\t\tmessage[\"time delta\"] = `${this.deltaTime} seconds`;\n\t\t}\n\t\tif (this.previousValue != undefined) {\n\t\t\tmessage[\"prev. value\"] = this.previousValue;\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\nfunction testResponseForMeterGet(sent: MeterCCGet, received: MeterCCReport) {\n\t// We expect a Meter Report that matches the requested scale and rate type\n\t// (if they were requested)\n\treturn (\n\t\t(sent.scale == undefined || sent.scale === received.scale)\n\t\t&& (sent.rateType == undefined || sent.rateType == received.rateType)\n\t);\n}\n\n// @publicAPI\nexport interface MeterCCGetOptions {\n\tscale?: number;\n\trateType?: RateType;\n}\n\n@CCCommand(MeterCommand.Get)\n@expectedCCResponse(MeterCCReport, testResponseForMeterGet)\nexport class MeterCCGet extends MeterCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MeterCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.rateType = options.rateType;\n\t\tthis.scale = options.scale;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): MeterCCGet {\n\t\tlet rateType: RateType | undefined;\n\t\tlet scale: number | undefined;\n\n\t\tif (raw.payload.length >= 1) {\n\t\t\trateType = (raw.payload[0] & 0b11_000_000) >>> 6;\n\t\t\tscale = (raw.payload[0] & 0b00_111_000) >>> 3;\n\t\t\tif (scale === 7) {\n\t\t\t\tvalidatePayload(raw.payload.length >= 2);\n\t\t\t\tscale += raw.payload[1];\n\t\t\t}\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\trateType,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic rateType: RateType | undefined;\n\tpublic scale: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tlet scale1: number;\n\t\tlet scale2: number | undefined;\n\t\tlet bufferLength = 0;\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\t\tif (this.scale == undefined) {\n\t\t\tscale1 = 0;\n\t\t} else if (ccVersion >= 4 && this.scale >= 7) {\n\t\t\tscale1 = 7;\n\t\t\tscale2 = this.scale >>> 3;\n\t\t\tbufferLength = 2;\n\t\t} else if (ccVersion >= 3) {\n\t\t\tscale1 = this.scale & 0b111;\n\t\t\tbufferLength = 1;\n\t\t} else if (ccVersion >= 2) {\n\t\t\tscale1 = this.scale & 0b11;\n\t\t\tbufferLength = 1;\n\t\t} else {\n\t\t\tscale1 = 0;\n\t\t}\n\n\t\tlet rateTypeFlags = 0;\n\t\tif (ccVersion >= 4 && this.rateType != undefined) {\n\t\t\trateTypeFlags = this.rateType & 0b11;\n\t\t\tbufferLength = Math.max(bufferLength, 1);\n\t\t}\n\n\t\tthis.payload = Bytes.alloc(bufferLength, 0);\n\t\tthis.payload[0] = (rateTypeFlags << 6) | (scale1 << 3);\n\t\tif (scale2) this.payload[1] = scale2;\n\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.rateType != undefined) {\n\t\t\tmessage[\"rate type\"] = getEnumMemberName(RateType, this.rateType);\n\t\t}\n\t\tif (this.scale != undefined) {\n\t\t\tif (ctx) {\n\t\t\t\t// Try to lookup the meter type to translate the scale\n\t\t\t\tconst type = this.getValue<number>(ctx, MeterCCValues.type);\n\t\t\t\tif (type != undefined) {\n\t\t\t\t\tmessage.scale = (getMeterScale(type, this.scale)\n\t\t\t\t\t\t?? getUnknownMeterScale(this.scale)).label;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmessage.scale = this.scale;\n\t\t\t}\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 MeterCCSupportedReportOptions {\n\ttype: number;\n\tsupportsReset: boolean;\n\tsupportedScales: readonly number[];\n\tsupportedRateTypes: readonly RateType[];\n}\n\n@CCCommand(MeterCommand.SupportedReport)\n@ccValueProperty(\"type\", MeterCCValues.type)\n@ccValueProperty(\"supportsReset\", MeterCCValues.supportsReset)\n@ccValueProperty(\"supportedScales\", MeterCCValues.supportedScales)\n@ccValueProperty(\"supportedRateTypes\", MeterCCValues.supportedRateTypes)\nexport class MeterCCSupportedReport extends MeterCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MeterCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.supportsReset = options.supportsReset;\n\t\tthis.supportedScales = options.supportedScales;\n\t\tthis.supportedRateTypes = options.supportedRateTypes;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MeterCCSupportedReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst type = raw.payload[0] & 0b0_00_11111;\n\t\tconst supportsReset = !!(raw.payload[0] & 0b1_00_00000);\n\t\tconst hasMoreScales = !!(raw.payload[1] & 0b1_0000000);\n\n\t\tlet supportedScales: number[] | undefined;\n\t\tif (hasMoreScales) {\n\t\t\t// The bitmask is spread out\n\t\t\tvalidatePayload(raw.payload.length >= 3);\n\t\t\tconst extraBytes = raw.payload[2];\n\t\t\tvalidatePayload(raw.payload.length >= 3 + extraBytes);\n\t\t\t// The bitmask is the original payload byte plus all following bytes\n\t\t\t// Since the first byte only has 7 bits, we need to reduce all following bits by 1\n\t\t\tsupportedScales = parseBitMask(\n\t\t\t\tBytes.concat([\n\t\t\t\t\tBytes.from([raw.payload[1] & 0b0_1111111]),\n\t\t\t\t\traw.payload.subarray(3, 3 + extraBytes),\n\t\t\t\t]),\n\t\t\t\t0,\n\t\t\t).map((scale) => (scale >= 8 ? scale - 1 : scale));\n\t\t} else {\n\t\t\t// only 7 bits in the bitmask. Bit 7 is 0, so no need to mask it out\n\t\t\tsupportedScales = parseBitMask(\n\t\t\t\tBytes.from([raw.payload[1]]),\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\t// This is only present in V4+\n\t\tconst supportedRateTypes: RateType[] = parseBitMask(\n\t\t\tBytes.from([(raw.payload[0] & 0b0_11_00000) >>> 5]),\n\t\t\t1,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\tsupportsReset,\n\t\t\tsupportedScales,\n\t\t\tsupportedRateTypes,\n\t\t});\n\t}\n\n\tpublic readonly type: number;\n\n\tpublic readonly supportsReset: boolean;\n\n\tpublic readonly supportedScales: readonly number[];\n\n\tpublic readonly supportedRateTypes: readonly RateType[];\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\t\tif (!this.supportsReset) return true;\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\n\t\t// Create reset values\n\t\tif (ccVersion < 6) {\n\t\t\tthis.ensureMetadata(ctx, MeterCCValues.resetAll);\n\t\t} else {\n\t\t\tfor (const scale of this.supportedScales) {\n\t\t\t\t// Only accumulated values can be reset\n\t\t\t\tif (!isAccumulatedValue(this.type, scale)) continue;\n\n\t\t\t\tfor (const rateType of this.supportedRateTypes) {\n\t\t\t\t\tconst resetSingleValue = MeterCCValues.resetSingle(\n\t\t\t\t\t\tthis.type,\n\t\t\t\t\t\trateType,\n\t\t\t\t\t\tscale,\n\t\t\t\t\t);\n\t\t\t\t\tthis.ensureMetadata(ctx, resetSingleValue, {\n\t\t\t\t\t\t...resetSingleValue.meta,\n\t\t\t\t\t\tlabel: `Reset ${\n\t\t\t\t\t\t\tgetValueLabel(\n\t\t\t\t\t\t\t\tthis.type,\n\t\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\t\trateType,\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}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst typeByte = (this.type & 0b0_00_11111)\n\t\t\t| (this.supportedRateTypes.includes(RateType.Consumed)\n\t\t\t\t? 0b0_01_00000\n\t\t\t\t: 0)\n\t\t\t| (this.supportedRateTypes.includes(RateType.Produced)\n\t\t\t\t? 0b0_10_00000\n\t\t\t\t: 0)\n\t\t\t| (this.supportsReset ? 0b1_00_00000 : 0);\n\t\tconst supportedScales = encodeBitMask(\n\t\t\tthis.supportedScales,\n\t\t\tundefined,\n\t\t\t// The first byte only has 7 bits for the bitmask,\n\t\t\t// so we add a fake bit for the value -1 and later shift\n\t\t\t// the first byte one to the right\n\t\t\t-1,\n\t\t);\n\t\tconst scalesByte1 = (supportedScales[0] >>> 1)\n\t\t\t| (supportedScales.length > 1 ? 0b1000_0000 : 0);\n\n\t\tthis.payload = Bytes.from([\n\t\t\ttypeByte,\n\t\t\tscalesByte1,\n\t\t]);\n\t\tif (supportedScales.length > 1) {\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.payload,\n\t\t\t\tBytes.from([supportedScales.length - 1]),\n\t\t\t\tBytes.from(supportedScales.subarray(1)),\n\t\t\t]);\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\"meter type\": getMeterName(this.type),\n\t\t\t\"supports reset\": this.supportsReset,\n\t\t\t\"supported scales\": `${\n\t\t\t\tthis.supportedScales\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(scale) => `\n\u00B7 ${(getMeterScale(this.type, scale) ?? getUnknownMeterScale(scale)).label}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\")\n\t\t\t}`,\n\t\t\t\"supported rate types\": this.supportedRateTypes\n\t\t\t\t.map((rt) => getEnumMemberName(RateType, rt))\n\t\t\t\t.join(\", \"),\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(MeterCommand.SupportedGet)\n@expectedCCResponse(MeterCCSupportedReport)\nexport class MeterCCSupportedGet extends MeterCC {}\n\n// @publicAPI\nexport type MeterCCResetOptions = AllOrNone<{\n\ttype: number;\n\tscale: number;\n\trateType: RateType;\n\ttargetValue: number;\n}>;\n\n@CCCommand(MeterCommand.Reset)\n@useSupervision()\nexport class MeterCCReset extends MeterCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MeterCCResetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.type = options.type;\n\t\tthis.scale = options.scale;\n\t\tthis.rateType = options.rateType;\n\t\tthis.targetValue = options.targetValue;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): MeterCCReset {\n\t\tif (raw.payload.length === 0) {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t});\n\t\t}\n\n\t\tconst {\n\t\t\ttype,\n\t\t\trateType,\n\t\t\tscale1,\n\t\t\tvalue: targetValue,\n\t\t\tbytesRead: scale2Offset,\n\t\t} = parseMeterValueAndInfo(raw.payload, 0);\n\t\tconst scale = parseScale(scale1, raw.payload, scale2Offset);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\trateType,\n\t\t\ttargetValue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic type: number | undefined;\n\tpublic scale: number | undefined;\n\tpublic rateType: RateType | undefined;\n\tpublic targetValue: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (\n\t\t\tthis.type != undefined\n\t\t\t&& this.scale != undefined\n\t\t\t&& this.rateType != undefined\n\t\t\t&& this.targetValue != undefined\n\t\t) {\n\t\t\tconst { data: typeAndValue, scale2 } = encodeMeterValueAndInfo(\n\t\t\t\tthis.type,\n\t\t\t\tthis.rateType,\n\t\t\t\tthis.scale,\n\t\t\t\tthis.targetValue,\n\t\t\t);\n\n\t\t\tthis.payload = typeAndValue;\n\n\t\t\tif (scale2 != undefined) {\n\t\t\t\tthis.payload = Bytes.concat([\n\t\t\t\t\tthis.payload,\n\t\t\t\t\tBytes.from([scale2]),\n\t\t\t\t]);\n\t\t\t}\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\tif (this.type != undefined) {\n\t\t\tmessage.type = getMeterName(this.type);\n\t\t}\n\t\tif (this.rateType != undefined) {\n\t\t\tmessage[\"rate type\"] = getEnumMemberName(RateType, this.rateType);\n\t\t}\n\t\tif (this.type != undefined && this.scale != undefined) {\n\t\t\tmessage.scale = (getMeterScale(this.type, this.scale)\n\t\t\t\t?? getUnknownMeterScale(this.scale)).label;\n\t\t}\n\t\tif (this.targetValue != undefined) {\n\t\t\tmessage[\"target value\"] = this.targetValue;\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,kBAeO;AACP,kBAkBO;AACP,IAAAA,eAAsB;AACtB,IAAAA,eAKO;AAEP,iBAaO;AACP,0BAOO;AACP,oCAUO;AACP,oBAAkB;AAClB,mBAA0D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEnD,MAAM,gBAAgB,OAAO,OAAO;EAC1C,GAAG,gBAAE,qBAAqB,2BAAe,OAAO;IAC/C,GAAG,gBAAE,eAAe,QAAQ,QAAW,EAAE,UAAU,KAAI,CAAE;IACzD,GAAG,gBAAE,eAAe,iBAAiB,QAAW,EAAE,UAAU,KAAI,CAAE;IAClE,GAAG,gBAAE,eAAe,mBAAmB,QAAW,EAAE,UAAU,KAAI,CAAE;IACpE,GAAG,gBAAE,eAAe,sBAAsB,QAAW;MACpD,UAAU;KACV;IAED,GAAG,gBAAE,uBACJ,YACA,SACA;MACC,GAAG,0BAAc;MACjB,OAAO;MACP,QAAQ;QACP,MAAM;;KAEE;GAEX;EAED,GAAG,gBAAE,sBAAsB,2BAAe,OAAO;IAChD,GAAG,gBAAE,8BACJ,eACA,SACA,eACA,CAAC,EAAE,UAAU,YAAW,MACvB,aAAa,WAAW,OAAO,gBAAgB,UAChD,CAAC,WAAmB,UAAoB,WAAmB;MAC1D,GAAG,0BAAc;;;MAGjB,OAAO,UACN,aAAa,sBAAS,WACnB,kBACA,aAAa,sBAAS,WACtB,iBACA,EACJ,OAAG,sBAAQ,KAAK,CAAC;MACjB,QAAQ;QACP,MAAM;;MAEP,YAAY;QACX;QACA;QACA;;MAES;IAGZ,GAAG,gBAAE,8BACJ,SACA,SACA,eACA,CAAC,EAAE,UAAU,YAAW,MACvB,aAAa,WAAW,OAAO,gBAAgB,UAChD,CAAC,WAAmB,UAAoB,WAAmB;MAC1D,GAAG,0BAAc;;MAEjB,YAAY;QACX;QACA;QACA;;MAES;GAEZ;CACD;AAED,SAAS,cACR,WACA,UACA,OAAa;AAEb,SAAQ,aAAa,KAAO,SAAS,IAAK;AAC3C;AANS;AAQT,SAAS,iBAAiB,KAAW;AAKpC,SAAO;IACN,UAAU,MAAM;IAChB,OAAQ,QAAQ,IAAK;IACrB,WAAW,QAAQ;;AAErB;AAVS;AAYT,SAAS,cACR,WACA,OACA,UACA,QAAe;AAEf,MAAI,UAAM,0BAAa,SAAS;AAChC,QAAM,kBACJ,2BAAc,WAAW,KAAK,SAAK,kCAAqB,KAAK,GAAG;AAClE,UAAQ,UAAU;IACjB,KAAK,sBAAS;AACb,aAAO,iBAAiB,UAAU;AAClC;IACD,KAAK,sBAAS;AACb,aAAO,gBAAgB,UAAU;AACjC;IACD;AACC,aAAO,KAAK,UAAU;EACxB;AACA,MAAI,QAAQ;AACX,WAAO,KAAK,MAAM;EACnB;AACA,SAAO;AACR;AAvBS;AAyBT,SAAS,uBAAuB,MAAkB,QAAc;AAO/D,mCAAgB,KAAK,UAAU,SAAS,CAAC;AAEzC,QAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,QAAM,YAAY,KAAK,MAAM,IAAI,QAAkB;AACnD,QAAM,cAAc,KAAK,MAAM,IAAI,SAAkB;AAErD,QAAM,EACL,OAAO,cACP,OACA,UAAS,QACN,iCAAoB,KAAK,SAAS,SAAS,CAAC,CAAC;AAEjD,SAAO;IACN;IACA;;IAEA,QAAS,cAAc,IAAK;IAC5B;;IAEA,WAAW,YAAY;;AAEzB;AA5BS;AA8BT,SAAS,wBACR,MACA,UACA,OACA,OAAa;AAIb,QAAM,SAAS,SAAS,IAAI,IAAI,QAAQ;AACxC,QAAM,eAAe,SAAS;AAC9B,QAAM,aAAa,WAAW;AAC9B,QAAM,SAAS,SAAS,IAAI,QAAQ,IAAI;AAExC,QAAM,WAAY,OAAO,MACpB,WAAW,MAAS,IACrB,cAAc;AAElB,QAAM,kBAAc,gCAAmB,KAAK;AAC5C,QAAM,iBAAa,kCAClB,OACA,cACA,WAAW;AAGZ,SAAO;IACN,MAAM,mBAAM,OAAO,CAAC,mBAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;IACvD,iBAAa,mBAAK,aAAa,CAAC,aAAa,MAAM,CAAC;IACpD;;AAEF;AA7BS;AA+BT,SAAS,WACR,QACA,MACA,cAAoB;AAEpB,MAAI,WAAW,GAAG;AACjB,qCAAgB,KAAK,UAAU,eAAe,CAAC;AAC/C,UAAM,SAAS,KAAK,YAAY;AAChC,WAAO,SAAS;EACjB,OAAO;AACN,WAAO;EACR;AACD;AAZS;AAcH,SAAU,mBACf,WACA,OAAa;AAGb,UAAQ,WAAW;IAClB,KAAK;AACJ;;;QAGC,UAAU,KACP,UAAU,KACV,UAAU,KACV,UAAU;;IAEf,KAAK;AACJ;;;QAGC,UAAU,KACP,UAAU,KACV,UAAU;;IAEf,KAAK;AACJ;;;QAGC,UAAU,KACP,UAAU,KACV,UAAU,KACV,UAAU;;IAEf,KAAK;AACJ,aAAO,UAAU;;IAClB,KAAK;AACJ,aAAO,UAAU;EACnB;AACA,SAAO;AACR;AAtCgB;IAyCH,cAAU,MAAA;8BADtB,mCAAI,2BAAe,KAAK,CAAC;;;;oBACM;;;;;;;kCAAA,YAAa;WAAA;;;;;;;;AAoD5C,mBAAA,MAAA,MAAA,iBAAA,EAAA,MAAA,UAAA,MAAA,OAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,SAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,KAAb,OAAgB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AA8BhB,mBAAA,MAAA,MAAA,wBAAA,EAAA,MAAA,UAAA,MAAA,cAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,gBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,YAAb,OAAuB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAcvB,mBAAA,MAAA,MAAA,oBAAA,EAAA,MAAA,UAAA,MAAA,UAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,YAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,QAAb,OAAmB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAyEnB,mBAAA,MAAA,MAAA,iCAAA,EAAA,MAAA,UAAA,MAAA,uBAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,yBAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,qBAAb,OAAgC,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAchC,mBAAA,MAAA,MAAA,mBAAA,EAAA,MAAA,UAAA,MAAA,SAAA,QAAA,OAAA,SAAA,OAAA,QAAA,EAAA,KAAA,gCAAA,WAAA,KAAA,QAAA,KAAA,gCAAA,IAAa,OAAb,OAAkB,GAAA,UAAA,UAAA,GAAA,MAAA,0BAAA;AAvLnB,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACL,gBAAgB,KAAiB;AACvC,cAAQ,KAAK;QACZ,KAAK,0BAAa;QAClB,KAAK,0BAAa;AACjB,iBAAO;;QACR,KAAK,0BAAa;QAClB,KAAK,0BAAa;AACjB,iBAAO,KAAK,WAAW;QACxB,KAAK,0BAAa,OAAO;AACxB,gBAAM,MAAM,KAAK,cAAa,GAAI,SAAkB;YACnD,kBAAc,+CAAgB,IAAI;YAClC,UAAU,KAAK,SAAS;YACxB,UAAU;WACV;AACD,iBAAO,QAAQ;QAChB;MACD;AACA,aAAO,MAAM,gBAAgB,GAAG;IACjC;IAEA,KAAe,qBAAU,IAAC;AACzB,aAAO,eAAiC,EAAE,UAAU,YAAW,GAAE;AAChE,gBAAQ,UAAU;UACjB,KAAK;UACL,KAAK;UACL,KAAK,aAAa;AACjB,gBAAI,eAAe,QAAW;AAC7B,sDAAwB,KAAK,MAAM,QAAQ;YAC5C,WAAW,OAAO,gBAAgB,UAAU;AAC3C,0DACC,KAAK,MACL,UACA,WAAW;YAEb;AAEA,kBAAM,EAAE,UAAU,MAAK,IAAK,iBAAiB,WAAW;AACxD,oBACC,MAAM,KAAK,IAAI;cACd;cACA;aACA,KACE,QAAQ;UACb;UACA;AACC,qDAAyB,KAAK,MAAM,QAAQ;QAC9C;MACD;IACD;IAGO,MAAM,IACZ,SAA2B;AAE3B,WAAK,sBAAsB,2BAAc,0BAAa,GAAG;AAEzD,YAAM,KAAK,IAAI,WAAW;QACzB,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B,GAAG;OACH;AACD,YAAM,WAAW,MAAM,KAAK,KAAK,YAChC,IACA,KAAK,cAAc;AAEpB,UAAI,UAAU;AACb,eAAO;UACN,MAAM,SAAS;UACf,WAAO,2BAAc,SAAS,MAAM,SAAS,KAAK,SAC9C,kCAAqB,SAAS,KAAK;UACvC,OAAG,mBAAK,UAAU;YACjB;YACA;YACA;YACA;WACA;;MAEH;IACD;IAGO,MAAM,WACZ,SAA6B;AAE7B,WAAK,sBAAsB,2BAAc,0BAAa,MAAM;AAE5D,YAAM,KAAK,IAAI,cAAc;QAC5B,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B,GAAG;OACH;AACD,aAAO,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACrD;IAGO,MAAM,OACZ,kBAA2B,OAAK;AAEhC,YAAM,UAAU,KAAK,cAAa;AAElC,UAAI,KAAK,WAAW,GAAG;AACtB,cAAM,YAAY,SAAS,SAC1B,cAAc,KAAK,SAAS,KAAK,SAAS,KAAK,CAAC;AAEjD,cAAM,kBAAkB,SAAS,SAChC,cAAc,gBAAgB,SAAS,KAAK,SAAS,KAAK,CAAC,KACvD,CAAA;AACL,cAAM,qBAAqB,SAAS,SACnC,cAAc,mBAAmB,SAChC,KAAK,SAAS,KAAK,CACnB,KACG,CAAA;AAEL,cAAM,YAAY,mBAAmB,SAClC,qBACA,CAAC,MAAS;AAEb,cAAM,MAAM,CAAA;AACZ,mBAAW,YAAY,WAAW;AACjC,qBAAW,SAAS,iBAAiB;AAEpC,gBACC,mBACG,aAAa,UACb,CAAC,mBAAmB,WAAW,KAAK,GACtC;AACD;YACD;AAEA,kBAAM,WAAW,MAAM,KAAK,IAAI;cAC/B;cACA;aACA;AACD,gBAAI;AAAU,kBAAI,KAAK,QAAQ;UAChC;QACD;AACA,eAAO;MACR,OAAO;AACN,cAAM,WAAW,MAAM,KAAK,IAAG;AAC/B,eAAO,WAAW,CAAC,QAAQ,IAAI,CAAA;MAChC;IACD;;IAGO,MAAM,eAAY;AACxB,WAAK,sBAAsB,2BAAc,0BAAa,YAAY;AAElE,YAAM,KAAK,IAAI,oBAAoB;QAClC,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;OAC7B;AACD,YAAM,WAAW,MAAM,KAAK,KAAK,YAGhC,IACA,KAAK,cAAc;AAEpB,UAAI,UAAU;AACb,mBAAO,mBAAK,UAAU;UACrB;UACA;UACA;UACA;SACA;MACF;IACD;IAGO,MAAM,oBACZ,SAAsC;AAEtC,WAAK,sBAAsB,2BAAc,0BAAa,eAAe;AAErE,YAAM,KAAK,IAAI,uBAAuB;QACrC,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B,GAAG;OACH;AACD,YAAM,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACpD;IAGO,MAAM,MACZ,SAA6B;AAE7B,WAAK,sBAAsB,2BAAc,0BAAa,KAAK;AAE3D,YAAM,KAAK,IAAI,aAAa;QAC3B,QAAQ,KAAK,SAAS;QACtB,eAAe,KAAK,SAAS;QAC7B,GAAG;OACH;AACD,aAAO,KAAK,KAAK,YAAY,IAAI,KAAK,cAAc;IACrD;IAEA,MAAuB,kBAAA,CAjJtB,4BAAA,CAAc,GAAA,yBAAA,CA8Bd,mCAAA,CAAc,GAAA,qBAAA,CAcd,+BAAA,CAAc,GAAA,kCAAA,CAyEd,4CAAA,CAAc,GAAA,oBAAA,CAcd,8BAAA,CAAc,GAcS,qBAAS,IAAC;AACjC,aAAO,eAEN,EAAE,UAAU,YAAW,GACvB,OAAK;AAEL,YAAI,aAAa,SAAS;AACzB,mDAAyB,KAAK,MAAM,QAAQ;QAC7C,WACC,eAAe,UACZ,OAAO,gBAAgB,UACzB;AACD,sDAA4B,KAAK,MAAM,UAAU,WAAW;QAC7D,WAAW,UAAU,MAAM;AAC1B,8CACC,KAAK,MACL,UACA,QACA,UAAU,QAAQ,UAAU,OAAO,KAAK;QAE1C;AAEA,YAAI,OAAO,gBAAgB,UAAU;AACpC,gBAAM,EAAE,WAAW,OAAO,SAAQ,IAAK,iBACtC,WAAW;AAEZ,iBAAO,KAAK,MAAM;YACjB,MAAM;YACN;YACA;YACA,aAAa;WACb;QACF,OAAO;AACN,iBAAO,KAAK,MAAK;QAClB;AAEA,eAAO;MACR;IACD;IAEU,CAAC,0BAAe,KA5Od,kBAAA,MAAA,0BAAA,GA4OsD,CACjE,EAAE,UAAU,YAAW,GACvB,QACA,aACG;AACH,UAAI,aAAa;AAAS;AAE1B,UAAI,OAAO,gBAAgB,UAAU;AAEpC,cAAM,EAAE,WAAW,UAAU,MAAK,IAAK,iBACtC,WAAW;AAEZ,cAAM,iBAAiB,cAAc,MACpC,WACA,UACA,KAAK,EACJ,SAAS,KAAK,SAAS,KAAK;AAE9B,eAAO;UACN,mCAAmC,wBAClC,4BACG;AACH,gBAAI,CAAC;AAAyB;AAI9B,kBAAM,UAAU,KAAK,cAAa;AAClC,gBAAI,CAAC;AAAS;AAEd,gBAAI,mBAAmB,WAAW,KAAK,GAAG;AACzC,sBAAQ,SAAS;gBAChB,cAAc,KAAK;gBACnB,UAAU,KAAK,SAAS;gBACxB;gBACA;iBACE,CAAC;YACL;UACD,GAlBmC;UAoBnC,eAAe,6BAAK;AACnB,iBAAK,aACJ,gBACA,GACA,EAAE,YAAY,OAAM,CAAE;UAExB,GANe;;MAQjB,OAAO;AAEN,cAAM,UAAU,KAAK,cAAa;AAClC,YAAI,CAAC;AAAS;AAEd,cAAM,oBAAoB,QAAQ,WAAW,CAAC,QAC7C,IAAI,iBAAiB,KAAK,QACvB,IAAI,aAAa,KAAK,SAAS,SAC/B,cAAc,MAAM,GAAG,GAAG,CAAC,EAC7B,OAAO,CAAC,EAAE,aAAAC,aAAW,MAAM;AAC5B,cAAI,OAAOA,iBAAgB;AAAU,mBAAO;AAC5C,gBAAM,EAAE,WAAW,MAAK,IAAK,iBAAiBA,YAAW;AACzD,iBAAO,mBAAmB,WAAW,KAAK;QAC3C,CAAC;AAED,eAAO;UACN,mCAAmC,wBAClC,4BACG;AACH,gBAAI,CAAC;AAAyB;AAI9B,uBAAW,SAAS,mBAAmB;AACtC,sBAAQ,SAAS,OAAO,CAAC;YAC1B;UACD,GAVmC;UAYnC,eAAe,6BAAK;AAEnB,uBAAW,WAAW,mBAAmB;AACxC,mBAAK,aACJ,SACA,GACA,EAAE,YAAY,OAAM,CAAE;YAExB;UACD,GATe;;MAWjB;IACD;;;;IAMY,WAAO,MAAA;8BAHnB,4CAAa,2BAAe,KAAK,OACjC,kDAAmB,CAAC,OACpB,wCAAS,aAAa,CAAC;;;;oBACK;+BAAA,YAAY;WAAA;;;;;;;;AAAzC,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IAGL,MAAM,UACZ,KAAqB;AAErB,YAAM,OAAO,KAAK,QAAQ,GAAG;AAC7B,YAAM,WAAW,KAAK,YAAY,GAAG;AACrC,YAAM,MAAM,iBAAM,OACjB,2BAAe,OACf,KACA,QAAQ,EACP,YAAY;QACb,UAAU,4BAAgB;OAC1B;AAED,UAAI,QAAQ,KAAK,IAAI;QACpB,UAAU,KAAK;QACf,SAAS,gBAAgB,KAAK,MAAM;QACpC,WAAW;OACX;AAED,UAAI,IAAI,WAAW,GAAG;AACrB,YAAI,QAAQ,KAAK,IAAI;UACpB,UAAU,KAAK;UACf,SAAS;UACT,WAAW;SACX;AAED,cAAM,WAAW,MAAM,IAAI,aAAY;AACvC,YAAI,UAAU;AACb,gBAAM,aAAa;4BACC,0BAAa,SAAS,IAAI,CAAC;wBAE9C,SAAS,gBACP,IACA,CAAC,WACC,2BAAc,SAAS,MAAM,CAAC,SAC3B,kCAAqB,CAAC,GAAG,KAAK,EAEnC,IAAI,CAAC,UAAU;OAAO,KAAK,EAAE,EAC7B,KAAK,EAAE,CACV;wBAEC,SAAS,mBACP,IAAI,CAAC,WAAO,gCAAkB,uBAAU,EAAE,CAAC,EAC3C,IAAI,CAAC,UAAU;OAAO,KAAK,EAAE,EAC7B,KAAK,EAAE,CACV;wBACoB,SAAS,aAAa;AAC1C,cAAI,QAAQ,KAAK,IAAI;YACpB,UAAU,KAAK;YACf,SAAS;YACT,WAAW;WACX;QACF,OAAO;AACN,cAAI,QAAQ,KAAK,IAAI;YACpB,UAAU,KAAK;YACf,SACC;YACD,OAAO;WACP;AACD;QACD;MACD;AAGA,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,OACf,KACA,QAAQ,EACP,YAAY;QACb,UAAU,4BAAgB;OAC1B;AAED,UAAI,IAAI,YAAY,GAAG;AACtB,YAAI,QAAQ,KAAK,IAAI;UACpB,UAAU,KAAK;UACf,SAAS;UACT,WAAW;SACX;AACD,cAAM,IAAI,IAAG;MACd,OAAO;AACN,cAAM,OAAe,KAAK,SAAS,KAAK,cAAc,IAAI,KACtD;AAEJ,cAAM,kBACL,KAAK,SAAS,KAAK,cAAc,eAAe,KAAK,CAAA;AAEtD,cAAM,qBACL,KAAK,SAAS,KAAK,cAAc,kBAAkB,KAAK,CAAA;AAEzD,cAAM,YAAY,mBAAmB,SAClC,qBACA,CAAC,MAAS;AACb,mBAAW,YAAY,WAAW;AACjC,qBAAW,SAAS,iBAAiB;AACpC,gBAAI,QAAQ,KAAK,IAAI;cACpB,UAAU,KAAK;cACf,SAAS,oCACR,0BAAa,IAAI,CAClB,kBACE,2BAAc,MAAM,KAAK,SACtB,kCAAqB,KAAK,GAAG,KAClC,GACC,YAAY,SACT,qBACD,gCACC,uBACA,QAAQ,CAEV,KACE,EACJ;cACA,WAAW;aACX;AACD,kBAAM,IAAI,IAAI,EAAE,OAAO,SAAQ,CAAE;UAClC;QACD;MACD;IACD;IAEO,oBAEN,KAME;AAKF,YAAM,UAAU,IAAI,cAAc,KAAK,MAAM;AAC7C,UAAI,CAAC;AAAS,eAAO;AAErB,YAAM,SAAS,KAAK,mBAAmB,GAAG,EAAE,OAAO,CAAC,MACnD,cAAc,MAAM,GAAG,CAAC,CAAC;AAE1B,aAAO,OAAO,MAAM,CAAC,MAAK;AACzB,cAAM,cAAc,QAAQ,aAAa,CAAC;AAC1C,eACC,eAAe,UACZ,KAAK,IAAG,IAAK,cAAc,qBAAS,MAAM,CAAC;MAEhD,CAAC;IACF;;;;;IAMO,OAAO,mBACb,KACA,UAAoB;AAEpB,aAAO,IACL,WAAW,SAAS,MAAM,EAC1B,SAAS,cAAc,KAAK,SAAS,SAAS,KAAK,CAAC;IACvD;;;;;IAMO,OAAO,yBACb,KACA,UAAoB;AAEpB,aAAO,IACL,WAAW,SAAS,MAAM,EAC1B,SAAS,cAAc,gBAAgB,SAAS,SAAS,KAAK,CAAC;IAClE;;;;;IAMO,OAAO,oBACb,KACA,UAAoB;AAEpB,aAAO,IACL,WAAW,SAAS,MAAM,EAC1B,SAAS,cAAc,cAAc,SAAS,SAAS,KAAK,CAAC;IAChE;;;;;IAMO,OAAO,4BACb,KACA,UAAoB;AAEpB,aAAO,IACL,WAAW,SAAS,MAAM,EAC1B,SACA,cAAc,mBAAmB,SAAS,SAAS,KAAK,CAAC;IAE5D;IAEO,qBACN,KACA,UACA,aAA4B;AAE5B,UAAI,aAAa,WAAW,OAAO,gBAAgB,UAAU;AAC5D,cAAM,EAAE,WAAW,UAAU,MAAK,IAAK,iBACtC,WAAW;AAEZ,YAAI;AACJ,YAAI,cAAc,GAAG;AACpB,gBAAM,OAAG,0BAAa,SAAS,CAAC,SAC9B,2BAAc,WAAW,KAAK,SAC3B,kCAAqB,KAAK,GAAG,KAClC;QACD,OAAO;AACN,gBAAM;QACP;AACA,YAAI,aAAa,sBAAS,aAAa;AACtC,iBAAO,UAAM,gCAAkB,uBAAU,QAAQ;QAClD;AACA,eAAO;MACR,WAAW,aAAa,WAAW,OAAO,gBAAgB,UAAU;AACnE,mBAAO,0BAAa,WAAW;MAChC;AACA,aAAO,MAAM,qBAAqB,KAAK,UAAU,WAAW;IAC7D;;;;IAcY,iBAAa,MAAA;8BADzB,yCAAU,0BAAa,MAAM,CAAC;;;;oBACI;qCAAA,YAAO;WAAA;;;;;;;;AAA1C,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,SAA0C;AAE1C,YAAM,OAAO;AAEb,WAAK,OAAO,QAAQ;AACpB,WAAK,QAAQ,QAAQ;AACrB,WAAK,QAAQ,QAAQ;AACrB,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,WAAW,QAAQ,YAAY,sBAAS;AAC7C,WAAK,YAAY,QAAQ,aAAa;IACvC;IAEO,OAAO,KAAK,KAAY,KAAqB;AACnD,YAAM,EAAE,MAAM,UAAU,QAAQ,OAAO,UAAS,IAC/C,uBAAuB,IAAI,SAAS,CAAC;AACtC,UAAI,SAAS;AACb,YAAM,YAAY,YAAY;AAC9B,UAAI;AACJ,UAAI;AAEJ,UAAI,IAAI,QAAQ,UAAU,SAAS,GAAG;AACrC,oBAAY,IAAI,QAAQ,aAAa,MAAM;AAC3C,kBAAU;AACV,YAAI,cAAc,OAAQ;AACzB,sBAAY;QACb;AAEA;;UAEC,cAAc,KACX,IAAI,QAAQ,UAAU,SAAS;UACjC;AACD,gBAAM,EAAE,OAAO,UAAS,QAAK;;YAE5B,mBAAM,OAAO;cACZ,mBAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;cAC3B,IAAI,QAAQ,SAAS,MAAM;aAC3B;UAAC;AAEH,oBAAU;AACV,0BAAgB;QACjB;MACD,OAAO;AAEN,oBAAY;MACb;AACA,YAAM,QAAQ,WAAW,QAAQ,IAAI,SAAS,MAAM;AAEpD,aAAO,IAAI,KAAK;QACf,QAAQ,IAAI;QACZ;QACA;QACA;QACA;QACA;QACA;OACA;IACF;IAEO,cAAc,KAAyB;AAC7C,UAAI,CAAC,MAAM,cAAc,GAAG;AAAG,eAAO;AAEtC,YAAM,gBAAY,2CAAsB,KAAK,IAAI;AAEjD,YAAM,YAAQ,sBAAS,KAAK,IAAI;AAChC,YAAM,YAAQ,2BAAc,KAAK,MAAM,KAAK,KAAK,SAC7C,kCAAqB,KAAK,KAAK;AAGnC,YAAM,wBAAwB,CAAC,IAAI,kBAClC,KAAK,MAAgB,GACnB,QAAQ;AAEX,UAAI,uBAAuB;AAC1B,oCAAgB,WACf,0BAAsB,sBAAQ,KAAK,IAAI,CAAC,oBAAoB,EAC3D,CAAC,CAAC,KAAK;AACT,oCAAgB,WACf,2BAAuB,sBAAQ,KAAK,KAAK,CAAC,oBAAoB,EAC7D,MAAM,cAAU,kCAAqB,KAAK,KAAK,EAAE,KAAK;AAGxD,YAAI,aAAa,GAAG;AACnB,gBAAM,eAAe,KAAK,SACzB,KACA,cAAc,IAAI;AAEnB,cAAI,gBAAgB,QAAW;AAC9B,wCAAgB,WACf,yCAAyC,EACxC,KAAK,SAAS,YAAY;UAC7B;AAEA,gBAAM,kBAAkB,KAAK,SAC5B,KACA,cAAc,eAAe;AAE9B,cAAI,iBAAiB,QAAQ;AAC5B,wCAAgB,WACf,2BAA2B,MAAM,KAAK,oBAAoB,EACzD,gBAAgB,SAAS,KAAK,KAAK,CAAC;UACvC;AAEA,gBAAM,qBAAqB,KAAK,SAC/B,KACA,cAAc,kBAAkB;AAEjC,cAAI,oBAAoB,QAAQ;AAC/B,wCAAgB,WACf,6BACC,gCACC,uBACA,KAAK,QAAQ,CAEf,oBAAoB,EACnB,mBAAmB,SAAS,KAAK,QAAQ,CAAC;UAC7C;QACD;MACD;AAEA,YAAM,aAAa,cAAc,MAChC,KAAK,MACL,KAAK,UACL,KAAK,KAAK;AAEX,WAAK,YAAY,KAAK,YAAY;QACjC,GAAG,WAAW;QACd,OAAO,cAAc,KAAK,MAAM,KAAK,OAAO,KAAK,QAAQ;QACzD,MAAM,MAAM;QACZ,YAAY;UACX,WAAW,KAAK;UAChB,OAAO,KAAK;UACZ,UAAU,KAAK;;OAEhB;AACD,WAAK,SAAS,KAAK,YAAY,KAAK,KAAK;AAEzC,aAAO;IACR;IAEO;IACA;IACA;IACA;IACA;IACA;IAEA,UAAU,KAAsB;AACtC,YAAM,EAAE,MAAM,cAAc,aAAa,OAAM,IAC9C,wBACC,KAAK,MACL,KAAK,UACL,KAAK,OACL,KAAK,KAAK;AAGZ,YAAM,YAAY,KAAK,aAAa;AACpC,YAAM,iBAAiB,IAAI,mBAAM,CAAC;AAClC,qBAAe,cAAc,WAAW,CAAC;AAEzC,WAAK,UAAU,mBAAM,OAAO;QAC3B;QACA;OACA;AAED,UAAI,KAAK,cAAc,KAAK,KAAK,iBAAiB,QAAW;AAE5D,cAAM,qBAAiB;UACtB,KAAK;UACL;;UACA;QAAW,EACV,SAAS,CAAC;AAEZ,aAAK,UAAU,mBAAM,OAAO;UAC3B,KAAK;UACL;SACA;MACF;AAEA,UAAI,UAAU,QAAW;AACxB,aAAK,UAAU,mBAAM,OAAO;UAC3B,KAAK;UACL,mBAAM,KAAK,CAAC,MAAM,CAAC;SACnB;MACF;AAEA,aAAO,MAAM,UAAU,GAAG;IAC3B;IAEO,WAAW,KAAgB;AACjC,YAAM,YAAQ,2BAAc,KAAK,MAAM,KAAK,KAAK,SAC7C,kCAAqB,KAAK,KAAK;AAEnC,YAAM,UAAyB;QAC9B,kBAAc,0BAAa,KAAK,IAAI;QACpC,OAAO,MAAM;QACb,iBAAa,gCAAkB,uBAAU,KAAK,QAAQ;QACtD,OAAO,KAAK;;AAEb,UAAI,KAAK,cAAc,2BAAe;AACrC,gBAAQ,YAAY,IAAI,GAAG,KAAK,SAAS;MAC1C;AACA,UAAI,KAAK,iBAAiB,QAAW;AACpC,gBAAQ,aAAa,IAAI,KAAK;MAC/B;AACA,aAAO;QACN,GAAG,MAAM,WAAW,GAAG;QACvB;;IAEF;;;;AAGD,SAAS,wBAAwB,MAAkB,UAAuB;AAGzE,UACE,KAAK,SAAS,UAAa,KAAK,UAAU,SAAS,WAChD,KAAK,YAAY,UAAa,KAAK,YAAY,SAAS;AAE9D;AAPS;IAiBI,cAAU,MAAA;8BAFtB,yCAAU,0BAAa,GAAG,OAC1B,kDAAmB,eAAe,uBAAuB,CAAC;;;;oBAC3B;kCAAA,YAAO;WAAA;;;;;;;;AAAvC,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,SAAuC;AAEvC,YAAM,OAAO;AACb,WAAK,WAAW,QAAQ;AACxB,WAAK,QAAQ,QAAQ;IACtB;IAEO,OAAO,KAAK,KAAY,KAAqB;AACnD,UAAI;AACJ,UAAI;AAEJ,UAAI,IAAI,QAAQ,UAAU,GAAG;AAC5B,oBAAY,IAAI,QAAQ,CAAC,IAAI,SAAkB;AAC/C,iBAAS,IAAI,QAAQ,CAAC,IAAI,QAAkB;AAC5C,YAAI,UAAU,GAAG;AAChB,2CAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,mBAAS,IAAI,QAAQ,CAAC;QACvB;MACD;AAEA,aAAO,IAAI,KAAK;QACf,QAAQ,IAAI;QACZ;QACA;OACA;IACF;IAEO;IACA;IAEA,UAAU,KAAsB;AACtC,UAAI;AACJ,UAAI;AACJ,UAAI,eAAe;AAEnB,YAAM,gBAAY,2CAAsB,KAAK,IAAI;AACjD,UAAI,KAAK,SAAS,QAAW;AAC5B,iBAAS;MACV,WAAW,aAAa,KAAK,KAAK,SAAS,GAAG;AAC7C,iBAAS;AACT,iBAAS,KAAK,UAAU;AACxB,uBAAe;MAChB,WAAW,aAAa,GAAG;AAC1B,iBAAS,KAAK,QAAQ;AACtB,uBAAe;MAChB,WAAW,aAAa,GAAG;AAC1B,iBAAS,KAAK,QAAQ;AACtB,uBAAe;MAChB,OAAO;AACN,iBAAS;MACV;AAEA,UAAI,gBAAgB;AACpB,UAAI,aAAa,KAAK,KAAK,YAAY,QAAW;AACjD,wBAAgB,KAAK,WAAW;AAChC,uBAAe,KAAK,IAAI,cAAc,CAAC;MACxC;AAEA,WAAK,UAAU,mBAAM,MAAM,cAAc,CAAC;AAC1C,WAAK,QAAQ,CAAC,IAAK,iBAAiB,IAAM,UAAU;AACpD,UAAI;AAAQ,aAAK,QAAQ,CAAC,IAAI;AAE9B,aAAO,MAAM,UAAU,GAAG;IAC3B;IAEO,WAAW,KAAgB;AACjC,YAAM,UAAyB,CAAA;AAC/B,UAAI,KAAK,YAAY,QAAW;AAC/B,gBAAQ,WAAW,QAAI,gCAAkB,uBAAU,KAAK,QAAQ;MACjE;AACA,UAAI,KAAK,SAAS,QAAW;AAC5B,YAAI,KAAK;AAER,gBAAM,OAAO,KAAK,SAAiB,KAAK,cAAc,IAAI;AAC1D,cAAI,QAAQ,QAAW;AACtB,oBAAQ,aAAS,2BAAc,MAAM,KAAK,KAAK,SAC3C,kCAAqB,KAAK,KAAK,GAAG;UACvC;QACD,OAAO;AACN,kBAAQ,QAAQ,KAAK;QACtB;MACD;AACA,aAAO;QACN,GAAG,MAAM,WAAW,GAAG;QACvB;;IAEF;;;;IAgBY,0BAAsB,MAAA;8BALlC,yCAAU,0BAAa,eAAe,OACtC,+CAAgB,QAAQ,cAAc,IAAI,OAC1C,+CAAgB,iBAAiB,cAAc,aAAa,OAC5D,+CAAgB,mBAAmB,cAAc,eAAe,OAChE,+CAAgB,sBAAsB,cAAc,kBAAkB,CAAC;;;;oBAC5B;8CAAA,YAAO;WAAA;;;;;;;;AAAnD,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,SAAmD;AAEnD,YAAM,OAAO;AAEb,WAAK,OAAO,QAAQ;AACpB,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,kBAAkB,QAAQ;AAC/B,WAAK,qBAAqB,QAAQ;IACnC;IAEO,OAAO,KACb,KACA,KAAqB;AAErB,uCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,YAAM,OAAO,IAAI,QAAQ,CAAC,IAAI;AAC9B,YAAM,gBAAgB,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI;AAC1C,YAAM,gBAAgB,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI;AAE1C,UAAI;AACJ,UAAI,eAAe;AAElB,yCAAgB,IAAI,QAAQ,UAAU,CAAC;AACvC,cAAM,aAAa,IAAI,QAAQ,CAAC;AAChC,yCAAgB,IAAI,QAAQ,UAAU,IAAI,UAAU;AAGpD,8BAAkB,0BACjB,mBAAM,OAAO;UACZ,mBAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,GAAW,CAAC;UACzC,IAAI,QAAQ,SAAS,GAAG,IAAI,UAAU;SACtC,GACD,CAAC,EACA,IAAI,CAAC,UAAW,SAAS,IAAI,QAAQ,IAAI,KAAM;MAClD,OAAO;AAEN,8BAAkB,0BACjB,mBAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAC3B,CAAC;MAEH;AAEA,YAAM,yBAAiC,0BACtC,mBAAM,KAAK,EAAE,IAAI,QAAQ,CAAC,IAAI,QAAkB,CAAC,CAAC,GAClD,CAAC;AAGF,aAAO,IAAI,KAAK;QACf,QAAQ,IAAI;QACZ;QACA;QACA;QACA;OACA;IACF;IAEgB;IAEA;IAEA;IAEA;IAET,cAAc,KAAyB;AAC7C,UAAI,CAAC,MAAM,cAAc,GAAG;AAAG,eAAO;AACtC,UAAI,CAAC,KAAK;AAAe,eAAO;AAEhC,YAAM,gBAAY,2CAAsB,KAAK,IAAI;AAGjD,UAAI,YAAY,GAAG;AAClB,aAAK,eAAe,KAAK,cAAc,QAAQ;MAChD,OAAO;AACN,mBAAW,SAAS,KAAK,iBAAiB;AAEzC,cAAI,CAAC,mBAAmB,KAAK,MAAM,KAAK;AAAG;AAE3C,qBAAW,YAAY,KAAK,oBAAoB;AAC/C,kBAAM,mBAAmB,cAAc,YACtC,KAAK,MACL,UACA,KAAK;AAEN,iBAAK,eAAe,KAAK,kBAAkB;cAC1C,GAAG,iBAAiB;cACpB,OAAO,SACN,cACC,KAAK,MACL,OACA,QAAQ,CAEV;aACA;UACF;QACD;MACD;AACA,aAAO;IACR;IAEO,UAAU,KAAsB;AACtC,YAAM,WAAY,KAAK,OAAO,MAC1B,KAAK,mBAAmB,SAAS,sBAAS,QAAQ,IAClD,KACA,MACA,KAAK,mBAAmB,SAAS,sBAAS,QAAQ,IAClD,KACA,MACA,KAAK,gBAAgB,MAAe;AACxC,YAAM,sBAAkB;QACvB,KAAK;QACL;;;;QAIA;MAAE;AAEH,YAAM,cAAe,gBAAgB,CAAC,MAAM,KACxC,gBAAgB,SAAS,IAAI,MAAc;AAE/C,WAAK,UAAU,mBAAM,KAAK;QACzB;QACA;OACA;AACD,UAAI,gBAAgB,SAAS,GAAG;AAC/B,aAAK,UAAU,mBAAM,OAAO;UAC3B,KAAK;UACL,mBAAM,KAAK,CAAC,gBAAgB,SAAS,CAAC,CAAC;UACvC,mBAAM,KAAK,gBAAgB,SAAS,CAAC,CAAC;SACtC;MACF;AAEA,aAAO,MAAM,UAAU,GAAG;IAC3B;IAEO,WAAW,KAAgB;AACjC,YAAM,UAAyB;QAC9B,kBAAc,0BAAa,KAAK,IAAI;QACpC,kBAAkB,KAAK;QACvB,oBAAoB,GACnB,KAAK,gBACH,IACA,CAAC,UAAU;YACZ,2BAAc,KAAK,MAAM,KAAK,SAAK,kCAAqB,KAAK,GAAG,KAAK,EAAE,EAEtE,KAAK,EAAE,CACV;QACA,wBAAwB,KAAK,mBAC3B,IAAI,CAAC,WAAO,gCAAkB,uBAAU,EAAE,CAAC,EAC3C,KAAK,IAAI;;AAEZ,aAAO;QACN,GAAG,MAAM,WAAW,GAAG;QACvB;;IAEF;;;;IAKY,uBAAmB,MAAA;8BAF/B,yCAAU,0BAAa,YAAY,OACnC,kDAAmB,sBAAsB,CAAC;;;;oBACF;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;;;;IAYA,gBAAY,MAAA;8BAFxB,yCAAU,0BAAa,KAAK,OAC5B,8CAAc,CAAE;;;;oBACiB;oCAAA,YAAO;WAAA;;;;;;;;AAAzC,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,SAAyC;AAEzC,YAAM,OAAO;AACb,WAAK,OAAO,QAAQ;AACpB,WAAK,QAAQ,QAAQ;AACrB,WAAK,WAAW,QAAQ;AACxB,WAAK,cAAc,QAAQ;IAC5B;IAEO,OAAO,KAAK,KAAY,KAAqB;AACnD,UAAI,IAAI,QAAQ,WAAW,GAAG;AAC7B,eAAO,IAAI,KAAK;UACf,QAAQ,IAAI;SACZ;MACF;AAEA,YAAM,EACL,MACA,UACA,QACA,OAAO,aACP,WAAW,aAAY,IACpB,uBAAuB,IAAI,SAAS,CAAC;AACzC,YAAM,QAAQ,WAAW,QAAQ,IAAI,SAAS,YAAY;AAE1D,aAAO,IAAI,KAAK;QACf,QAAQ,IAAI;QACZ;QACA;QACA;QACA;OACA;IACF;IAEO;IACA;IACA;IACA;IAEA,UAAU,KAAsB;AACtC,UACC,KAAK,QAAQ,UACV,KAAK,SAAS,UACd,KAAK,YAAY,UACjB,KAAK,eAAe,QACtB;AACD,cAAM,EAAE,MAAM,cAAc,OAAM,IAAK,wBACtC,KAAK,MACL,KAAK,UACL,KAAK,OACL,KAAK,WAAW;AAGjB,aAAK,UAAU;AAEf,YAAI,UAAU,QAAW;AACxB,eAAK,UAAU,mBAAM,OAAO;YAC3B,KAAK;YACL,mBAAM,KAAK,CAAC,MAAM,CAAC;WACnB;QACF;MACD;AACA,aAAO,MAAM,UAAU,GAAG;IAC3B;IAEO,WAAW,KAAgB;AACjC,YAAM,UAAyB,CAAA;AAC/B,UAAI,KAAK,QAAQ,QAAW;AAC3B,gBAAQ,WAAO,0BAAa,KAAK,IAAI;MACtC;AACA,UAAI,KAAK,YAAY,QAAW;AAC/B,gBAAQ,WAAW,QAAI,gCAAkB,uBAAU,KAAK,QAAQ;MACjE;AACA,UAAI,KAAK,QAAQ,UAAa,KAAK,SAAS,QAAW;AACtD,gBAAQ,aAAS,2BAAc,KAAK,MAAM,KAAK,KAAK,SAChD,kCAAqB,KAAK,KAAK,GAAG;MACvC;AACA,UAAI,KAAK,eAAe,QAAW;AAClC,gBAAQ,cAAc,IAAI,KAAK;MAChC;AACA,aAAO;QACN,GAAG,MAAM,WAAW,GAAG;QACvB;;IAEF;;;;",
|
|
6
6
|
"names": ["import_safe", "propertyKey"]
|
|
7
7
|
}
|
|
@@ -1,22 +1,38 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type CCEncodingContext, type CCParsingContext } from "@zwave-js/cc";
|
|
2
|
+
import type { EndpointId, GetValueDB, SupervisionResult, WithAddress } from "@zwave-js/core/safe";
|
|
2
3
|
import { CommandClasses, type MaybeNotKnown, type MessageOrCCLogEntry } from "@zwave-js/core/safe";
|
|
3
|
-
import type { CCEncodingContext, CCParsingContext, GetValueDB } from "@zwave-js/host/safe";
|
|
4
4
|
import { Bytes } from "@zwave-js/shared/safe";
|
|
5
5
|
import { PhysicalCCAPI } from "../lib/API.js";
|
|
6
6
|
import { type CCRaw, CommandClass, type InterviewContext, type RefreshValuesContext } from "../lib/CommandClass.js";
|
|
7
7
|
import { type AssociationAddress, type EndpointAddress, MultiChannelAssociationCommand } from "../lib/_Types.js";
|
|
8
8
|
export declare const MultiChannelAssociationCCValues: Readonly<{
|
|
9
9
|
endpoints: ((groupId: number) => {
|
|
10
|
-
readonly meta: {
|
|
10
|
+
readonly meta: Readonly<(import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
11
11
|
readonly type: "any";
|
|
12
12
|
readonly readable: true;
|
|
13
13
|
readonly writeable: true;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
15
|
+
readonly type: "any";
|
|
16
|
+
readonly readable: true;
|
|
17
|
+
readonly writeable: true;
|
|
18
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>) extends infer T ? { [K in keyof T as [undefined] extends [(import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
19
|
+
readonly type: "any";
|
|
20
|
+
readonly readable: true;
|
|
21
|
+
readonly writeable: true;
|
|
22
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
23
|
+
readonly type: "any";
|
|
24
|
+
readonly readable: true;
|
|
25
|
+
readonly writeable: true;
|
|
26
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>)[K]] ? never : K]: (import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
27
|
+
readonly type: "any";
|
|
28
|
+
readonly readable: true;
|
|
29
|
+
readonly writeable: true;
|
|
30
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
31
|
+
readonly type: "any";
|
|
32
|
+
readonly readable: true;
|
|
33
|
+
readonly writeable: true;
|
|
34
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>)[K]; } : never>;
|
|
35
|
+
readonly id: ValueIDBase;
|
|
20
36
|
readonly endpoint: (endpoint?: number | undefined) => {
|
|
21
37
|
readonly commandClass: (typeof CommandClasses)["Multi Channel Association"];
|
|
22
38
|
readonly endpoint: number;
|
|
@@ -35,16 +51,32 @@ export declare const MultiChannelAssociationCCValues: Readonly<{
|
|
|
35
51
|
};
|
|
36
52
|
};
|
|
37
53
|
nodeIds: ((groupId: number) => {
|
|
38
|
-
readonly meta: {
|
|
54
|
+
readonly meta: Readonly<(import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
39
55
|
readonly type: "any";
|
|
40
56
|
readonly readable: true;
|
|
41
57
|
readonly writeable: true;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
58
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
59
|
+
readonly type: "any";
|
|
60
|
+
readonly readable: true;
|
|
61
|
+
readonly writeable: true;
|
|
62
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>) extends infer T ? { [K in keyof T as [undefined] extends [(import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
63
|
+
readonly type: "any";
|
|
64
|
+
readonly readable: true;
|
|
65
|
+
readonly writeable: true;
|
|
66
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
67
|
+
readonly type: "any";
|
|
68
|
+
readonly readable: true;
|
|
69
|
+
readonly writeable: true;
|
|
70
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>)[K]] ? never : K]: (import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
71
|
+
readonly type: "any";
|
|
72
|
+
readonly readable: true;
|
|
73
|
+
readonly writeable: true;
|
|
74
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
75
|
+
readonly type: "any";
|
|
76
|
+
readonly readable: true;
|
|
77
|
+
readonly writeable: true;
|
|
78
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>)[K]; } : never>;
|
|
79
|
+
readonly id: ValueIDBase;
|
|
48
80
|
readonly endpoint: (endpoint?: number | undefined) => {
|
|
49
81
|
readonly commandClass: (typeof CommandClasses)["Multi Channel Association"];
|
|
50
82
|
readonly endpoint: number;
|
|
@@ -63,16 +95,32 @@ export declare const MultiChannelAssociationCCValues: Readonly<{
|
|
|
63
95
|
};
|
|
64
96
|
};
|
|
65
97
|
maxNodes: ((groupId: number) => {
|
|
66
|
-
readonly meta: {
|
|
98
|
+
readonly meta: Readonly<(import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
67
99
|
readonly type: "any";
|
|
68
100
|
readonly readable: true;
|
|
69
101
|
readonly writeable: true;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
102
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
103
|
+
readonly type: "any";
|
|
104
|
+
readonly readable: true;
|
|
105
|
+
readonly writeable: true;
|
|
106
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>) extends infer T ? { [K in keyof T as [undefined] extends [(import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
107
|
+
readonly type: "any";
|
|
108
|
+
readonly readable: true;
|
|
109
|
+
readonly writeable: true;
|
|
110
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
111
|
+
readonly type: "any";
|
|
112
|
+
readonly readable: true;
|
|
113
|
+
readonly writeable: true;
|
|
114
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>)[K]] ? never : K]: (import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
115
|
+
readonly type: "any";
|
|
116
|
+
readonly readable: true;
|
|
117
|
+
readonly writeable: true;
|
|
118
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
119
|
+
readonly type: "any";
|
|
120
|
+
readonly readable: true;
|
|
121
|
+
readonly writeable: true;
|
|
122
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>)[K]; } : never>;
|
|
123
|
+
readonly id: ValueIDBase;
|
|
76
124
|
readonly endpoint: (endpoint?: number | undefined) => {
|
|
77
125
|
readonly commandClass: (typeof CommandClasses)["Multi Channel Association"];
|
|
78
126
|
readonly endpoint: number;
|
|
@@ -91,29 +139,81 @@ export declare const MultiChannelAssociationCCValues: Readonly<{
|
|
|
91
139
|
};
|
|
92
140
|
};
|
|
93
141
|
groupCount: {
|
|
94
|
-
readonly id:
|
|
95
|
-
commandClass: (typeof CommandClasses)["Multi Channel Association"];
|
|
96
|
-
property: "groupCount";
|
|
97
|
-
};
|
|
142
|
+
readonly id: ValueIDBase;
|
|
98
143
|
readonly endpoint: (endpoint?: number | undefined) => {
|
|
99
144
|
readonly commandClass: (typeof CommandClasses)["Multi Channel Association"];
|
|
100
145
|
readonly endpoint: number;
|
|
101
146
|
readonly property: "groupCount";
|
|
102
147
|
};
|
|
103
148
|
readonly is: (valueId: import("@zwave-js/core/safe").ValueID) => boolean;
|
|
104
|
-
readonly meta: {
|
|
149
|
+
readonly meta: Readonly<(import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
105
150
|
readonly type: "any";
|
|
106
151
|
readonly readable: true;
|
|
107
152
|
readonly writeable: true;
|
|
108
|
-
}
|
|
109
|
-
|
|
153
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
154
|
+
readonly type: "any";
|
|
155
|
+
readonly readable: true;
|
|
156
|
+
readonly writeable: true;
|
|
157
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>) extends infer T ? { [K in keyof T as [undefined] extends [(import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
158
|
+
readonly type: "any";
|
|
159
|
+
readonly readable: true;
|
|
160
|
+
readonly writeable: true;
|
|
161
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
162
|
+
readonly type: "any";
|
|
163
|
+
readonly readable: true;
|
|
164
|
+
readonly writeable: true;
|
|
165
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>)[K]] ? never : K]: (import("@zwave-js/core/safe").ValueMetadata extends NonNullable<TBlueprint["meta"]> ? Readonly<{
|
|
166
|
+
readonly type: "any";
|
|
167
|
+
readonly readable: true;
|
|
168
|
+
readonly writeable: true;
|
|
169
|
+
}> : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<Readonly<{
|
|
170
|
+
readonly type: "any";
|
|
171
|
+
readonly readable: true;
|
|
172
|
+
readonly writeable: true;
|
|
173
|
+
}>, ("type" | "readable" | "writeable") & keyof NonNullable<TBlueprint["meta"]>> & TBlueprint["meta"]>)[K]; } : never>;
|
|
174
|
+
readonly options: Readonly<(import("@zwave-js/cc").CCValueOptions extends NonNullable<TBlueprint["options"]> ? {
|
|
175
|
+
readonly internal: false;
|
|
176
|
+
readonly minVersion: 1;
|
|
177
|
+
readonly secret: false;
|
|
178
|
+
readonly stateful: true;
|
|
179
|
+
readonly supportsEndpoints: true;
|
|
180
|
+
readonly autoCreate: true;
|
|
181
|
+
} : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<{
|
|
182
|
+
readonly internal: false;
|
|
183
|
+
readonly minVersion: 1;
|
|
184
|
+
readonly secret: false;
|
|
185
|
+
readonly stateful: true;
|
|
186
|
+
readonly supportsEndpoints: true;
|
|
187
|
+
readonly autoCreate: true;
|
|
188
|
+
}, ("stateful" | "secret" | "internal" | "minVersion" | "supportsEndpoints" | "autoCreate") & keyof NonNullable<TBlueprint["options"]>> & TBlueprint["options"]>) extends infer T ? { [K in keyof T as [undefined] extends [(import("@zwave-js/cc").CCValueOptions extends NonNullable<TBlueprint["options"]> ? {
|
|
189
|
+
readonly internal: false;
|
|
190
|
+
readonly minVersion: 1;
|
|
191
|
+
readonly secret: false;
|
|
192
|
+
readonly stateful: true;
|
|
193
|
+
readonly supportsEndpoints: true;
|
|
194
|
+
readonly autoCreate: true;
|
|
195
|
+
} : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<{
|
|
196
|
+
readonly internal: false;
|
|
197
|
+
readonly minVersion: 1;
|
|
198
|
+
readonly secret: false;
|
|
110
199
|
readonly stateful: true;
|
|
200
|
+
readonly supportsEndpoints: true;
|
|
201
|
+
readonly autoCreate: true;
|
|
202
|
+
}, ("stateful" | "secret" | "internal" | "minVersion" | "supportsEndpoints" | "autoCreate") & keyof NonNullable<TBlueprint["options"]>> & TBlueprint["options"]>)[K]] ? never : K]: (import("@zwave-js/cc").CCValueOptions extends NonNullable<TBlueprint["options"]> ? {
|
|
203
|
+
readonly internal: false;
|
|
204
|
+
readonly minVersion: 1;
|
|
111
205
|
readonly secret: false;
|
|
206
|
+
readonly stateful: true;
|
|
207
|
+
readonly supportsEndpoints: true;
|
|
208
|
+
readonly autoCreate: true;
|
|
209
|
+
} : import("alcalzone-shared/types").Simplify<import("alcalzone-shared/types").Omit<{
|
|
210
|
+
readonly internal: false;
|
|
112
211
|
readonly minVersion: 1;
|
|
212
|
+
readonly secret: false;
|
|
213
|
+
readonly stateful: true;
|
|
113
214
|
readonly supportsEndpoints: true;
|
|
114
215
|
readonly autoCreate: true;
|
|
115
|
-
|
|
116
|
-
};
|
|
216
|
+
}, ("stateful" | "secret" | "internal" | "minVersion" | "supportsEndpoints" | "autoCreate") & keyof NonNullable<TBlueprint["options"]>> & TBlueprint["options"]>)[K]; } : never>;
|
|
117
217
|
};
|
|
118
218
|
}>;
|
|
119
219
|
export declare class MultiChannelAssociationCCAPI extends PhysicalCCAPI {
|
|
@@ -175,7 +275,7 @@ export declare class MultiChannelAssociationCCSet extends MultiChannelAssociatio
|
|
|
175
275
|
groupId: number;
|
|
176
276
|
nodeIds: number[];
|
|
177
277
|
endpoints: EndpointAddress[];
|
|
178
|
-
serialize(ctx: CCEncodingContext): Bytes
|
|
278
|
+
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
179
279
|
toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
|
|
180
280
|
}
|
|
181
281
|
export interface MultiChannelAssociationCCRemoveOptions {
|
|
@@ -192,7 +292,7 @@ export declare class MultiChannelAssociationCCRemove extends MultiChannelAssocia
|
|
|
192
292
|
groupId?: number;
|
|
193
293
|
nodeIds?: number[];
|
|
194
294
|
endpoints?: EndpointAddress[];
|
|
195
|
-
serialize(ctx: CCEncodingContext): Bytes
|
|
295
|
+
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
196
296
|
toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
|
|
197
297
|
}
|
|
198
298
|
export interface MultiChannelAssociationCCReportOptions {
|
|
@@ -212,10 +312,8 @@ export declare class MultiChannelAssociationCCReport extends MultiChannelAssocia
|
|
|
212
312
|
reportsToFollow: number;
|
|
213
313
|
getPartialCCSessionId(): Record<string, any> | undefined;
|
|
214
314
|
expectMoreMessages(): boolean;
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
mergePartialCCsAsync(partials: MultiChannelAssociationCCReport[], _ctx: CCParsingContext): Promise<void>;
|
|
218
|
-
serialize(ctx: CCEncodingContext): Bytes;
|
|
315
|
+
mergePartialCCs(partials: MultiChannelAssociationCCReport[], _ctx: CCParsingContext): Promise<void>;
|
|
316
|
+
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
219
317
|
toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
|
|
220
318
|
}
|
|
221
319
|
export interface MultiChannelAssociationCCGetOptions {
|
|
@@ -225,7 +323,7 @@ export declare class MultiChannelAssociationCCGet extends MultiChannelAssociatio
|
|
|
225
323
|
constructor(options: WithAddress<MultiChannelAssociationCCGetOptions>);
|
|
226
324
|
static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCGet;
|
|
227
325
|
groupId: number;
|
|
228
|
-
serialize(ctx: CCEncodingContext): Bytes
|
|
326
|
+
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
229
327
|
toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
|
|
230
328
|
}
|
|
231
329
|
export interface MultiChannelAssociationCCSupportedGroupingsReportOptions {
|
|
@@ -235,7 +333,7 @@ export declare class MultiChannelAssociationCCSupportedGroupingsReport extends M
|
|
|
235
333
|
constructor(options: WithAddress<MultiChannelAssociationCCSupportedGroupingsReportOptions>);
|
|
236
334
|
static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCSupportedGroupingsReport;
|
|
237
335
|
readonly groupCount: number;
|
|
238
|
-
serialize(ctx: CCEncodingContext): Bytes
|
|
336
|
+
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
239
337
|
toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
|
|
240
338
|
}
|
|
241
339
|
export declare class MultiChannelAssociationCCSupportedGroupingsGet extends MultiChannelAssociationCC {
|
|
@@ -664,14 +664,9 @@ let MultiChannelAssociationCCReport = (() => {
|
|
|
664
664
|
expectMoreMessages() {
|
|
665
665
|
return this.reportsToFollow > 0;
|
|
666
666
|
}
|
|
667
|
-
/** @deprecated Use {@link mergePartialCCsAsync} instead */
|
|
668
667
|
mergePartialCCs(partials, _ctx) {
|
|
669
668
|
this.nodeIds = [...partials, this].map((report) => [...report.nodeIds]).reduce((prev, cur) => prev.concat(...cur), []);
|
|
670
669
|
this.endpoints = [...partials, this].map((report) => [...report.endpoints]).reduce((prev, cur) => prev.concat(...cur), []);
|
|
671
|
-
}
|
|
672
|
-
mergePartialCCsAsync(partials, _ctx) {
|
|
673
|
-
this.nodeIds = [...partials, this].map((report) => [...report.nodeIds]).reduce((prev, cur) => prev.concat(...cur), []);
|
|
674
|
-
this.endpoints = [...partials, this].map((report) => [...report.endpoints]).reduce((prev, cur) => prev.concat(...cur), []);
|
|
675
670
|
return Promise.resolve();
|
|
676
671
|
}
|
|
677
672
|
serialize(ctx) {
|