@zwave-js/cc 15.27.1 → 15.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/cc/AlarmSensorCC.js.map +2 -2
- package/build/cjs/cc/AssociationCC.js +6 -5
- package/build/cjs/cc/AssociationCC.js.map +2 -2
- package/build/cjs/cc/AssociationGroupInfoCC.js +5 -5
- package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
- package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
- package/build/cjs/cc/BasicCC.d.ts +4 -1
- package/build/cjs/cc/BasicCC.js +18 -0
- package/build/cjs/cc/BasicCC.js.map +3 -3
- package/build/cjs/cc/BasicWindowCoveringCC.js.map +2 -2
- package/build/cjs/cc/BatteryCC.js +18 -4
- package/build/cjs/cc/BatteryCC.js.map +2 -2
- package/build/cjs/cc/BinarySensorCC.js +5 -1
- package/build/cjs/cc/BinarySensorCC.js.map +2 -2
- package/build/cjs/cc/BinarySwitchCC.d.ts +4 -1
- package/build/cjs/cc/BinarySwitchCC.js +18 -0
- package/build/cjs/cc/BinarySwitchCC.js.map +3 -3
- package/build/cjs/cc/CRC16CC.d.ts +3 -2
- package/build/cjs/cc/CRC16CC.js +7 -1
- package/build/cjs/cc/CRC16CC.js.map +3 -3
- package/build/cjs/cc/CentralSceneCC.js.map +2 -2
- package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
- package/build/cjs/cc/ClockCC.js.map +2 -2
- package/build/cjs/cc/ColorSwitchCC.js +1 -4
- package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
- package/build/cjs/cc/ConfigurationCC.js +16 -8
- package/build/cjs/cc/ConfigurationCC.js.map +2 -2
- package/build/cjs/cc/DeviceResetLocallyCC.js.map +2 -2
- package/build/cjs/cc/DoorLockCC.js +1 -1
- package/build/cjs/cc/DoorLockCC.js.map +2 -2
- package/build/cjs/cc/EntryControlCC.js.map +2 -2
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js +4 -16
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +2 -2
- package/build/cjs/cc/HumidityControlSetpointCC.js +10 -4
- package/build/cjs/cc/HumidityControlSetpointCC.js.map +2 -2
- package/build/cjs/cc/IndicatorCC.js +5 -8
- package/build/cjs/cc/IndicatorCC.js.map +2 -2
- package/build/cjs/cc/IrrigationCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerSpecificCC._validateArgs.d.ts +1 -0
- package/build/cjs/cc/ManufacturerSpecificCC._validateArgs.js +13 -0
- package/build/cjs/cc/ManufacturerSpecificCC._validateArgs.js.map +2 -2
- package/build/cjs/cc/ManufacturerSpecificCC.d.ts +6 -4
- package/build/cjs/cc/ManufacturerSpecificCC.js +41 -8
- package/build/cjs/cc/ManufacturerSpecificCC.js.map +2 -2
- package/build/cjs/cc/MeterCC.js +18 -29
- package/build/cjs/cc/MeterCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelAssociationCC.js +11 -7
- package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelCC.d.ts +3 -1
- package/build/cjs/cc/MultiChannelCC.js +21 -10
- package/build/cjs/cc/MultiChannelCC.js.map +3 -3
- package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
- package/build/cjs/cc/MultilevelSwitchCC.d.ts +5 -1
- package/build/cjs/cc/MultilevelSwitchCC.js +30 -0
- package/build/cjs/cc/MultilevelSwitchCC.js.map +3 -3
- package/build/cjs/cc/NotificationCC.js +29 -11
- package/build/cjs/cc/NotificationCC.js.map +2 -2
- package/build/cjs/cc/PowerlevelCC.js.map +1 -1
- package/build/cjs/cc/ProtectionCC.js +2 -0
- package/build/cjs/cc/ProtectionCC.js.map +2 -2
- package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +2 -2
- package/build/cjs/cc/SceneControllerConfigurationCC.js.map +2 -2
- package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
- package/build/cjs/cc/Security2CC.d.ts +2 -1
- package/build/cjs/cc/Security2CC.js +31 -3
- package/build/cjs/cc/Security2CC.js.map +2 -2
- package/build/cjs/cc/SecurityCC.d.ts +3 -2
- package/build/cjs/cc/SecurityCC.js +7 -6
- package/build/cjs/cc/SecurityCC.js.map +2 -2
- package/build/cjs/cc/SoundSwitchCC.js +6 -6
- package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
- package/build/cjs/cc/SupervisionCC.d.ts +2 -1
- package/build/cjs/cc/SupervisionCC.js +6 -0
- package/build/cjs/cc/SupervisionCC.js.map +3 -3
- package/build/cjs/cc/ThermostatFanModeCC.js.map +2 -2
- package/build/cjs/cc/ThermostatModeCC.js +1 -3
- package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
- package/build/cjs/cc/ThermostatOperatingStateCC.js.map +2 -2
- package/build/cjs/cc/ThermostatSetpointCC.d.ts +4 -1
- package/build/cjs/cc/ThermostatSetpointCC.js +18 -0
- package/build/cjs/cc/ThermostatSetpointCC.js.map +3 -3
- package/build/cjs/cc/TimeCC.js.map +2 -2
- package/build/cjs/cc/TransportServiceCC.js.map +2 -2
- package/build/cjs/cc/UserCodeCC.js +3 -6
- package/build/cjs/cc/UserCodeCC.js.map +2 -2
- package/build/cjs/cc/UserCredentialCC.js +8 -6
- package/build/cjs/cc/UserCredentialCC.js.map +2 -2
- package/build/cjs/cc/VersionCC.js.map +2 -2
- package/build/cjs/cc/WindowCoveringCC.js +5 -1
- package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
- package/build/cjs/cc/ZWaveProtocolCC.js +3 -11
- package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
- package/build/cjs/cc/_CCValues.generated.d.ts +4 -4
- package/build/cjs/cc/_CCValues.generated.js +1 -1
- package/build/cjs/cc/_CCValues.generated.js.map +2 -2
- package/build/cjs/cc/index.d.ts +179 -179
- package/build/cjs/cc/index.js.map +1 -1
- package/build/cjs/cc/manufacturerProprietary/Decorators.js.map +2 -2
- package/build/cjs/lib/API.d.ts +3 -2
- package/build/cjs/lib/API.js.map +2 -2
- package/build/cjs/lib/CommandClass.d.ts +23 -1
- package/build/cjs/lib/CommandClass.js +63 -15
- package/build/cjs/lib/CommandClass.js.map +3 -3
- package/build/cjs/lib/CommandClassDecorators.js.map +2 -2
- package/build/cjs/lib/EncapsulatingCommandClass.js.map +2 -2
- package/build/cjs/lib/NotificationEventPayload.js.map +2 -2
- package/build/cjs/lib/Security2/Extension.js +1 -4
- package/build/cjs/lib/Security2/Extension.js.map +2 -2
- package/build/cjs/lib/Security2/shared.js.map +2 -2
- package/build/cjs/lib/SetValueResult.js.map +1 -1
- package/build/cjs/lib/Values.d.ts +1 -1
- package/build/cjs/lib/Values.js.map +2 -2
- package/build/cjs/lib/_CCAPI.generated.js.map +1 -1
- package/build/cjs/lib/_Types.d.ts +34 -30
- package/build/cjs/lib/_Types.js +7 -0
- package/build/cjs/lib/_Types.js.map +3 -3
- package/build/cjs/lib/serializers.js +1 -4
- package/build/cjs/lib/serializers.js.map +2 -2
- package/build/cjs/lib/utils.js.map +2 -2
- package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
- package/build/esm/cc/AlarmSensorCC.js +1 -2
- package/build/esm/cc/AlarmSensorCC.js.map +1 -1
- package/build/esm/cc/AssociationCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationCC.js +8 -7
- package/build/esm/cc/AssociationCC.js.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.js +11 -12
- package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.js +10 -9
- package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
- package/build/esm/cc/BasicCC.d.ts +4 -1
- package/build/esm/cc/BasicCC.d.ts.map +1 -1
- package/build/esm/cc/BasicCC.js +30 -7
- package/build/esm/cc/BasicCC.js.map +1 -1
- package/build/esm/cc/BasicWindowCoveringCC.d.ts.map +1 -1
- package/build/esm/cc/BasicWindowCoveringCC.js +2 -5
- package/build/esm/cc/BasicWindowCoveringCC.js.map +1 -1
- package/build/esm/cc/BatteryCC.d.ts.map +1 -1
- package/build/esm/cc/BatteryCC.js +17 -14
- package/build/esm/cc/BatteryCC.js.map +1 -1
- package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySensorCC.js +12 -7
- package/build/esm/cc/BinarySensorCC.js.map +1 -1
- package/build/esm/cc/BinarySwitchCC.d.ts +4 -1
- package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySwitchCC.js +31 -6
- package/build/esm/cc/BinarySwitchCC.js.map +1 -1
- package/build/esm/cc/CRC16CC.d.ts +3 -2
- package/build/esm/cc/CRC16CC.d.ts.map +1 -1
- package/build/esm/cc/CRC16CC.js +10 -4
- package/build/esm/cc/CRC16CC.js.map +1 -1
- package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
- package/build/esm/cc/CentralSceneCC.js +2 -1
- package/build/esm/cc/CentralSceneCC.js.map +1 -1
- package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -1
- package/build/esm/cc/ClimateControlScheduleCC.js +6 -2
- package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
- package/build/esm/cc/ClockCC.d.ts.map +1 -1
- package/build/esm/cc/ClockCC.js +6 -2
- package/build/esm/cc/ClockCC.js.map +1 -1
- package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/ColorSwitchCC.js +17 -20
- package/build/esm/cc/ColorSwitchCC.js.map +1 -1
- package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/ConfigurationCC.js +37 -33
- package/build/esm/cc/ConfigurationCC.js.map +1 -1
- package/build/esm/cc/DeviceResetLocallyCC.d.ts.map +1 -1
- package/build/esm/cc/DeviceResetLocallyCC.js +1 -2
- package/build/esm/cc/DeviceResetLocallyCC.js.map +1 -1
- package/build/esm/cc/DoorLockCC.d.ts.map +1 -1
- package/build/esm/cc/DoorLockCC.js +26 -30
- package/build/esm/cc/DoorLockCC.js.map +1 -1
- package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
- package/build/esm/cc/EntryControlCC.js +10 -7
- package/build/esm/cc/EntryControlCC.js.map +1 -1
- package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -1
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js +15 -27
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.js +8 -9
- package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
- package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
- package/build/esm/cc/IndicatorCC.js +27 -42
- package/build/esm/cc/IndicatorCC.js.map +1 -1
- package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
- package/build/esm/cc/IrrigationCC.js +8 -6
- package/build/esm/cc/IrrigationCC.js.map +1 -1
- package/build/esm/cc/ManufacturerProprietaryCC.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerProprietaryCC.js +1 -2
- package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC._validateArgs.d.ts +1 -0
- package/build/esm/cc/ManufacturerSpecificCC._validateArgs.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC._validateArgs.js +10 -0
- package/build/esm/cc/ManufacturerSpecificCC._validateArgs.js.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.d.ts +6 -4
- package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.js +54 -17
- package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
- package/build/esm/cc/MeterCC.d.ts.map +1 -1
- package/build/esm/cc/MeterCC.js +28 -38
- package/build/esm/cc/MeterCC.js.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.js +15 -20
- package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
- package/build/esm/cc/MultiChannelCC.d.ts +3 -1
- package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelCC.js +28 -22
- package/build/esm/cc/MultiChannelCC.js.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.js +11 -11
- package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
- package/build/esm/cc/MultilevelSwitchCC.d.ts +5 -1
- package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSwitchCC.js +56 -16
- package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
- package/build/esm/cc/NotificationCC.d.ts.map +1 -1
- package/build/esm/cc/NotificationCC.js +66 -55
- package/build/esm/cc/NotificationCC.js.map +1 -1
- package/build/esm/cc/PowerlevelCC.d.ts.map +1 -1
- package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
- package/build/esm/cc/ProtectionCC.js +13 -9
- package/build/esm/cc/ProtectionCC.js.map +1 -1
- package/build/esm/cc/SceneActuatorConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneActuatorConfigurationCC.js +5 -8
- package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.js +10 -16
- package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.js +13 -20
- package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
- package/build/esm/cc/Security2CC.d.ts +2 -1
- package/build/esm/cc/Security2CC.d.ts.map +1 -1
- package/build/esm/cc/Security2CC.js +68 -32
- package/build/esm/cc/Security2CC.js.map +1 -1
- package/build/esm/cc/SecurityCC.d.ts +3 -2
- package/build/esm/cc/SecurityCC.d.ts.map +1 -1
- package/build/esm/cc/SecurityCC.js +16 -11
- package/build/esm/cc/SecurityCC.js.map +1 -1
- package/build/esm/cc/SoundSwitchCC.js +2 -2
- package/build/esm/cc/SoundSwitchCC.js.map +1 -1
- package/build/esm/cc/SupervisionCC.d.ts +2 -1
- package/build/esm/cc/SupervisionCC.d.ts.map +1 -1
- package/build/esm/cc/SupervisionCC.js +13 -6
- package/build/esm/cc/SupervisionCC.js.map +1 -1
- package/build/esm/cc/ThermostatFanModeCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatFanModeCC.js +1 -2
- package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
- package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatModeCC.js +1 -3
- package/build/esm/cc/ThermostatModeCC.js.map +1 -1
- package/build/esm/cc/ThermostatOperatingStateCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatOperatingStateCC.js +1 -2
- package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.d.ts +4 -1
- package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.js +31 -19
- package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
- package/build/esm/cc/TimeCC.d.ts.map +1 -1
- package/build/esm/cc/TimeCC.js +6 -2
- package/build/esm/cc/TimeCC.js.map +1 -1
- package/build/esm/cc/TransportServiceCC.d.ts.map +1 -1
- package/build/esm/cc/TransportServiceCC.js +8 -8
- package/build/esm/cc/TransportServiceCC.js.map +1 -1
- package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
- package/build/esm/cc/UserCodeCC.js +23 -30
- package/build/esm/cc/UserCodeCC.js.map +1 -1
- package/build/esm/cc/UserCredentialCC.d.ts.map +1 -1
- package/build/esm/cc/UserCredentialCC.js +49 -60
- package/build/esm/cc/UserCredentialCC.js.map +1 -1
- package/build/esm/cc/VersionCC.js +3 -3
- package/build/esm/cc/VersionCC.js.map +1 -1
- package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
- package/build/esm/cc/WindowCoveringCC.js +10 -9
- package/build/esm/cc/WindowCoveringCC.js.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.js +5 -26
- package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
- package/build/esm/cc/_CCValues.generated.d.ts +4 -4
- package/build/esm/cc/_CCValues.generated.d.ts.map +1 -1
- package/build/esm/cc/_CCValues.generated.js +638 -679
- package/build/esm/cc/_CCValues.generated.js.map +1 -1
- package/build/esm/cc/index.d.ts +179 -179
- package/build/esm/cc/index.d.ts.map +1 -1
- package/build/esm/cc/index.js +124 -124
- package/build/esm/cc/index.js.map +1 -1
- package/build/esm/cc/manufacturerProprietary/Decorators.d.ts.map +1 -1
- package/build/esm/cc/manufacturerProprietary/Decorators.js.map +1 -1
- package/build/esm/lib/API.d.ts +3 -2
- 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 +23 -1
- package/build/esm/lib/CommandClass.d.ts.map +1 -1
- package/build/esm/lib/CommandClass.js +61 -20
- package/build/esm/lib/CommandClass.js.map +1 -1
- package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -1
- package/build/esm/lib/CommandClassDecorators.js +1 -2
- package/build/esm/lib/CommandClassDecorators.js.map +1 -1
- package/build/esm/lib/EncapsulatingCommandClass.d.ts.map +1 -1
- package/build/esm/lib/EncapsulatingCommandClass.js.map +1 -1
- package/build/esm/lib/NotificationEventPayload.d.ts.map +1 -1
- package/build/esm/lib/NotificationEventPayload.js.map +1 -1
- package/build/esm/lib/Security2/Extension.d.ts.map +1 -1
- package/build/esm/lib/Security2/Extension.js +2 -6
- package/build/esm/lib/Security2/Extension.js.map +1 -1
- package/build/esm/lib/Security2/shared.d.ts.map +1 -1
- package/build/esm/lib/Security2/shared.js.map +1 -1
- package/build/esm/lib/SetValueResult.d.ts.map +1 -1
- package/build/esm/lib/Values.d.ts +1 -1
- package/build/esm/lib/Values.d.ts.map +1 -1
- package/build/esm/lib/Values.js.map +1 -1
- package/build/esm/lib/_CCAPI.generated.d.ts.map +1 -1
- package/build/esm/lib/_Types.d.ts +34 -30
- package/build/esm/lib/_Types.d.ts.map +1 -1
- package/build/esm/lib/_Types.js +5 -0
- package/build/esm/lib/_Types.js.map +1 -1
- package/build/esm/lib/serializers.d.ts.map +1 -1
- package/build/esm/lib/serializers.js +1 -4
- package/build/esm/lib/serializers.js.map +1 -1
- package/build/esm/lib/traits.d.ts.map +1 -1
- package/build/esm/lib/utils.d.ts.map +1 -1
- package/build/esm/lib/utils.js +25 -31
- package/build/esm/lib/utils.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src_gen/cc/MeterCC.ts"],
|
|
4
|
-
"sourcesContent": ["import * as __validateArgs from \"./MeterCC._validateArgs.js\";\nconst { validateArgs_MeterCCAPI_get, validateArgs_MeterCCAPI_sendReport, validateArgs_MeterCCAPI_getAll, validateArgs_MeterCCAPI_sendSupportedReport, validateArgs_MeterCCAPI_reset } = __validateArgs;\nimport type { GetDeviceConfig } from \"@zwave-js/config\";\nimport { CommandClasses, type ControlsCC, type EndpointId, type FloatParameters, type GetEndpoint, type GetNode, type GetSupportedCCVersion, type GetValueDB, type MaybeNotKnown, type MaybeUnknown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type NodeId, type SinglecastCC, type SupervisionResult, type SupportsCC, UNKNOWN_STATE, ValueMetadata, type WithAddress, encodeBitMask, encodeFloatWithScale, getFloatParameters, getMeter, getMeterName, getMeterScale, getUnknownMeterScale, logDict, logList, logText, parseBitMask, parseFloatWithScale, timespan, validatePayload, } from \"@zwave-js/core\";\nimport { type AllOrNone, Bytes, type BytesView, getEnumMemberName, num2hex, pick, } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, PhysicalCCAPI, type PollValueImplementation, SET_VALUE, SET_VALUE_HOOKS, type SetValueImplementation, type SetValueImplementationHooksFactory, throwMissingPropertyKey, throwUnsupportedProperty, throwUnsupportedPropertyKey, throwWrongValueType, } from \"../lib/API.js\";\nimport { meterTypesToPropertyKey } from \"../lib/CCValueUtils.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, getCommandClass, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MeterCommand, type MeterReading, RateType } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { MeterCCValues } from \"./_CCValues.generated.js\";\nexport { MeterCCValues };\nfunction splitPropertyKey(key: number): {\n meterType: number;\n rateType: RateType;\n scale: number;\n} {\n return {\n rateType: key & 0xff,\n scale: (key >>> 8) & 0xff,\n meterType: key >>> 16,\n };\n}\nfunction getValueLabel(meterType: number, scale: number, rateType: RateType, suffix?: string): string {\n let ret = getMeterName(meterType);\n const scaleLabel = (getMeterScale(meterType, scale) ?? getUnknownMeterScale(scale)).label;\n switch (rateType) {\n case RateType.Consumed:\n ret += ` Consumption [${scaleLabel}]`;\n break;\n case RateType.Produced:\n ret += ` Production [${scaleLabel}]`;\n break;\n default:\n ret += ` [${scaleLabel}]`;\n }\n if (suffix) {\n ret += ` (${suffix})`;\n }\n return ret;\n}\nfunction parseMeterValueAndInfo(data: BytesView, offset: number): {\n type: number;\n rateType: RateType;\n scale1: number;\n value: number;\n bytesRead: number;\n} {\n validatePayload(data.length >= offset + 1);\n const type = data[offset] & 31;\n const rateType = (data[offset] & 96) >>> 5;\n const scale1Bit2 = (data[offset] & 128) >>> 7;\n const { scale: scale1Bits10, value, bytesRead, } = parseFloatWithScale(data.subarray(offset + 1));\n return {\n type,\n rateType,\n // The scale is composed of two fields\n scale1: (scale1Bit2 << 2) | scale1Bits10,\n value,\n // We've read one byte more than the float contains\n bytesRead: bytesRead + 1,\n };\n}\nfunction encodeMeterValueAndInfo(type: number, rateType: RateType, scale: number, value: number): {\n data: Bytes;\n floatParams: FloatParameters;\n scale2: number | undefined;\n} {\n // We need at least 2 bytes\n const scale1 = scale >= 7 ? 7 : scale & 0b111;\n const scale1Bits10 = scale1 & 0b11;\n const scale1Bit2 = scale1 >>> 2;\n const scale2 = scale >= 7 ? scale - 7 : undefined;\n const typeByte = (type & 31)\n | ((rateType & 0b11) << 5)\n | (scale1Bit2 << 7);\n const floatParams = getFloatParameters(value);\n const valueBytes = encodeFloatWithScale(value, scale1Bits10, floatParams);\n return {\n data: Bytes.concat([[typeByte], valueBytes]),\n floatParams: pick(floatParams, [\"precision\", \"size\"]),\n scale2,\n };\n}\nfunction parseScale(scale1: number, data: BytesView, scale2Offset: number): number {\n if (scale1 === 7) {\n validatePayload(data.length >= scale2Offset + 1);\n const scale2 = data[scale2Offset];\n return scale1 + scale2;\n }\n else {\n return scale1;\n }\n}\nexport function isAccumulatedValue(meterType: number, scale: number): boolean {\n // FIXME: We should probably move the meter definitions into code\n switch (meterType) {\n case 0x01: // Electric\n return (\n // kVarh\n // Pulse count\n scale === 0x00 // kWh\n || scale === 0x01 // kVAh\n || scale === 0x03\n || scale === 0x08);\n case 0x02: // Gas\n return (\n // Pulse count\n // ft\u00B3\n scale === 0x00 // m\u00B3\n || scale === 0x01\n || scale === 0x03);\n case 0x03: // Water\n return (\n // Pulse count\n // US gallons\n scale === 0x00 // m\u00B3\n || scale === 0x01 // ft\u00B3\n || scale === 0x02\n || scale === 0x03);\n case 0x04: // Heating\n return scale === 0x00; // kWh\n case 0x05: // Cooling\n return scale === 0x00; // kWh\n }\n return false;\n}\n@API(CommandClasses.Meter)\nexport class MeterCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: MeterCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case MeterCommand.Get:\n case MeterCommand.Report:\n return true; // This is mandatory\n case MeterCommand.SupportedGet:\n case MeterCommand.SupportedReport:\n return this.version >= 2;\n case MeterCommand.Reset: {\n const ret = this.tryGetValueDB()?.getValue<boolean>({\n commandClass: getCommandClass(this),\n endpoint: this.endpoint.index,\n property: \"supportsReset\",\n });\n return ret === true;\n }\n }\n return super.supportsCommand(cmd);\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: MeterCCAPI, { property, propertyKey }) {\n switch (property) {\n case \"value\":\n case \"previousValue\":\n case \"deltaTime\": {\n if (propertyKey == undefined) {\n throwMissingPropertyKey(this.ccId, property);\n }\n else if (typeof propertyKey !== \"number\") {\n throwUnsupportedPropertyKey(this.ccId, property, propertyKey);\n }\n const { rateType, scale } = splitPropertyKey(propertyKey);\n return (await this.get({\n rateType,\n scale,\n }))?.[property];\n }\n default:\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n @validateArgs_MeterCCAPI_get()\n public async get(options?: MeterCCGetOptions): Promise<MeterReading | undefined> {\n this.assertSupportsCommand(MeterCommand, MeterCommand.Get);\n const cc = new MeterCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n const response = await this.host.sendCommand<MeterCCReport>(cc, this.commandOptions);\n if (response) {\n return {\n type: response.type,\n scale: getMeterScale(response.type, response.scale)\n ?? getUnknownMeterScale(response.scale),\n ...pick(response, [\n \"value\",\n \"previousValue\",\n \"rateType\",\n \"deltaTime\",\n ]),\n };\n }\n }\n @validateArgs_MeterCCAPI_sendReport()\n public async sendReport(options: MeterCCReportOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MeterCommand, MeterCommand.Report);\n const cc = new MeterCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_MeterCCAPI_getAll()\n public async getAll(accumulatedOnly: boolean = false): Promise<MeterReading[]> {\n const valueDB = this.tryGetValueDB();\n if (this.version >= 2) {\n const meterType = valueDB?.getValue<number>(MeterCCValues.type.endpoint(this.endpoint.index));\n const supportedScales = valueDB?.getValue<number[]>(MeterCCValues.supportedScales.endpoint(this.endpoint.index)) ?? [];\n const supportedRateTypes = valueDB?.getValue<RateType[]>(MeterCCValues.supportedRateTypes.endpoint(this.endpoint.index)) ?? [];\n const rateTypes = supportedRateTypes.length\n ? supportedRateTypes\n : [undefined];\n const ret = [];\n for (const rateType of rateTypes) {\n for (const scale of supportedScales) {\n // Skip non-accumulated values if requested\n if (accumulatedOnly\n && meterType != undefined\n && !isAccumulatedValue(meterType, scale)) {\n continue;\n }\n const response = await this.get({\n scale,\n rateType,\n });\n if (response)\n ret.push(response);\n }\n }\n return ret;\n }\n else {\n const response = await this.get();\n return response ? [response] : [];\n }\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getSupported() {\n this.assertSupportsCommand(MeterCommand, MeterCommand.SupportedGet);\n const cc = new MeterCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<MeterCCSupportedReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\n \"type\",\n \"supportsReset\",\n \"supportedScales\",\n \"supportedRateTypes\",\n ]);\n }\n }\n @validateArgs_MeterCCAPI_sendSupportedReport()\n public async sendSupportedReport(options: MeterCCSupportedReportOptions): Promise<void> {\n this.assertSupportsCommand(MeterCommand, MeterCommand.SupportedReport);\n const cc = new MeterCCSupportedReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_MeterCCAPI_reset()\n public async reset(options?: MeterCCResetOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MeterCommand, MeterCommand.Reset);\n const cc = new MeterCCReset({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: MeterCCAPI, { property, propertyKey }, value) {\n if (property !== \"reset\") {\n throwUnsupportedProperty(this.ccId, property);\n }\n else if (propertyKey != undefined\n && typeof propertyKey !== \"number\") {\n throwUnsupportedPropertyKey(this.ccId, property, propertyKey);\n }\n else if (value !== true) {\n throwWrongValueType(this.ccId, property, \"true\", value === false ? \"false\" : typeof value);\n }\n if (typeof propertyKey === \"number\") {\n const { meterType, scale, rateType } = splitPropertyKey(propertyKey);\n return this.reset({\n type: meterType,\n scale,\n rateType,\n targetValue: 0,\n });\n }\n else {\n return this.reset();\n }\n };\n }\n protected [SET_VALUE_HOOKS]: SetValueImplementationHooksFactory = ({ property, propertyKey }, _value, _options) => {\n if (property !== \"reset\")\n return;\n if (typeof propertyKey === \"number\") {\n // Reset single\n const { meterType, rateType, scale } = splitPropertyKey(propertyKey);\n const readingValueId = MeterCCValues.value(meterType, rateType, scale).endpoint(this.endpoint.index);\n return {\n optimisticallyUpdateRelatedValues: (supervisedAndSuccessful) => {\n if (!supervisedAndSuccessful)\n return;\n // After resetting a single reading with supervision, store zero\n // in the corresponding value\n const valueDB = this.tryGetValueDB();\n if (!valueDB)\n return;\n if (isAccumulatedValue(meterType, scale)) {\n valueDB.setValue({\n commandClass: this.ccId,\n endpoint: this.endpoint.index,\n property,\n propertyKey,\n }, 0);\n }\n },\n verifyChanges: () => {\n this.schedulePoll(readingValueId, 0, { transition: \"fast\" });\n },\n };\n }\n else {\n // Reset all\n const valueDB = this.tryGetValueDB();\n if (!valueDB)\n return;\n const accumulatedValues = valueDB.findValues((vid) => vid.commandClass === this.ccId\n && vid.endpoint === this.endpoint.index\n && MeterCCValues.value.is(vid)).filter(({ propertyKey }) => {\n if (typeof propertyKey !== \"number\")\n return false;\n const { meterType, scale } = splitPropertyKey(propertyKey);\n return isAccumulatedValue(meterType, scale);\n });\n return {\n optimisticallyUpdateRelatedValues: (supervisedAndSuccessful) => {\n if (!supervisedAndSuccessful)\n return;\n // After setting the reset all value with supervision,\n // reset all accumulated values, since we know they are now zero.\n for (const value of accumulatedValues) {\n valueDB.setValue(value, 0);\n }\n },\n verifyChanges: () => {\n // Poll all accumulated values, unless they were updated by the device\n for (const valueID of accumulatedValues) {\n this.schedulePoll(valueID, 0, { transition: \"fast\" });\n }\n },\n };\n }\n };\n}\n@commandClass(CommandClasses.Meter)\n@implementedVersion(6)\n@ccValues(MeterCCValues)\nexport class MeterCC extends CommandClass {\n declare ccCommand: MeterCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses.Meter, ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n if (api.version >= 2) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying meter support...\",\n direction: \"outbound\",\n });\n const suppResp = await api.getSupported();\n if (suppResp) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received meter support:\", {\n nested: logDict({\n type: getMeterName(suppResp.type),\n \"supported scales\": logList(suppResp.supportedScales.map((s) => (getMeterScale(suppResp.type, s)\n ?? getUnknownMeterScale(s)).label)),\n \"supported rate types\": logList(suppResp.supportedRateTypes.map((rt) => getEnumMemberName(RateType, rt))),\n \"supports reset\": suppResp.supportsReset,\n }),\n }),\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying meter support timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n }\n // Query current meter values\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses.Meter, ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n if (api.version === 1) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying default meter value...`,\n direction: \"outbound\",\n });\n await api.get();\n }\n else {\n const type: number = this.getValue(ctx, MeterCCValues.type)\n ?? 0;\n const supportedScales: readonly number[] = this.getValue(ctx, MeterCCValues.supportedScales) ?? [];\n const supportedRateTypes: readonly RateType[] = this.getValue(ctx, MeterCCValues.supportedRateTypes) ?? [];\n const rateTypes = supportedRateTypes.length\n ? supportedRateTypes\n : [undefined];\n const total = rateTypes.length * supportedScales.length;\n let completed = 0;\n for (const rateType of rateTypes) {\n for (const scale of supportedScales) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying meter value (type = ${getMeterName(type)}, scale = ${(getMeterScale(type, scale)\n ?? getUnknownMeterScale(scale)).label}${rateType != undefined\n ? `, rate type = ${getEnumMemberName(RateType, rateType)}`\n : \"\"})...`,\n direction: \"outbound\",\n });\n await api.get({ scale, rateType });\n options?.onProgress?.(++completed, total);\n }\n }\n }\n }\n public shouldRefreshValues(this: SinglecastCC<this>, ctx: GetValueDB & GetSupportedCCVersion & GetDeviceConfig & GetNode<NodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>>): boolean {\n // Poll the device when all of the supported values were last updated longer than 6 hours ago.\n // This may lead to some values not being updated, but the user may have disabled some unnecessary\n // reports to reduce traffic.\n const valueDB = ctx.tryGetValueDB(this.nodeId);\n if (!valueDB)\n return true;\n const values = this.getDefinedValueIDs(ctx).filter((v) => MeterCCValues.value.is(v));\n return values.every((v) => {\n const lastUpdated = valueDB.getTimestamp(v);\n return (lastUpdated == undefined\n || Date.now() - lastUpdated > timespan.hours(6));\n });\n }\n /**\n * Returns which type this meter has.\n * This only works AFTER the interview process\n */\n public static getMeterTypeCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<number> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MeterCCValues.type.endpoint(endpoint.index));\n }\n /**\n * Returns which scales are supported by this meter.\n * This only works AFTER the interview process\n */\n public static getSupportedScalesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<number[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MeterCCValues.supportedScales.endpoint(endpoint.index));\n }\n /**\n * Returns whether reset is supported by this meter.\n * This only works AFTER the interview process\n */\n public static supportsResetCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<boolean> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MeterCCValues.supportsReset.endpoint(endpoint.index));\n }\n /**\n * Returns which rate types are supported by this meter.\n * This only works AFTER the interview process\n */\n public static getSupportedRateTypesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<RateType[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MeterCCValues.supportedRateTypes.endpoint(endpoint.index));\n }\n public translatePropertyKey(ctx: GetValueDB, property: string | number, propertyKey: string | number): string | undefined {\n if (property === \"value\" && typeof propertyKey === \"number\") {\n const { meterType, rateType, scale } = splitPropertyKey(propertyKey);\n let ret: string;\n if (meterType !== 0) {\n ret = `${getMeterName(meterType)}_${(getMeterScale(meterType, scale)\n ?? getUnknownMeterScale(scale)).label}`;\n }\n else {\n ret = \"default\";\n }\n if (rateType !== RateType.Unspecified) {\n ret += \"_\" + getEnumMemberName(RateType, rateType);\n }\n return ret;\n }\n else if (property === \"reset\" && typeof propertyKey === \"number\") {\n return getMeterName(propertyKey);\n }\n return super.translatePropertyKey(ctx, property, propertyKey);\n }\n}\n// @publicAPI\nexport interface MeterCCReportOptions {\n type: number;\n scale: number;\n value: number;\n previousValue?: MaybeNotKnown<number>;\n rateType?: RateType;\n deltaTime?: MaybeUnknown<number>;\n}\n@CCCommand(MeterCommand.Report)\nexport class MeterCCReport extends MeterCC {\n public constructor(options: WithAddress<MeterCCReportOptions>) {\n super(options);\n this.type = options.type;\n this.scale = options.scale;\n this.value = options.value;\n this.previousValue = options.previousValue;\n this.rateType = options.rateType ?? RateType.Unspecified;\n this.deltaTime = options.deltaTime ?? UNKNOWN_STATE;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MeterCCReport {\n const { type, rateType, scale1, value, bytesRead } = parseMeterValueAndInfo(raw.payload, 0);\n let offset = bytesRead;\n const floatSize = bytesRead - 2;\n let deltaTime: MaybeUnknown<number>;\n let previousValue: MaybeNotKnown<number>;\n if (raw.payload.length >= offset + 2) {\n deltaTime = raw.payload.readUInt16BE(offset);\n offset += 2;\n if (deltaTime === 0xffff) {\n deltaTime = UNKNOWN_STATE;\n }\n if (\n // Previous value is included only if delta time is not 0\n deltaTime !== 0\n && raw.payload.length >= offset + floatSize) {\n const { value: prevValue } = parseFloatWithScale(\n // This float is split in the payload\n Bytes.concat([\n [raw.payload[1]],\n raw.payload.subarray(offset),\n ]));\n offset += floatSize;\n previousValue = prevValue;\n }\n }\n else {\n // 0 means that no previous value is included\n deltaTime = 0;\n }\n const scale = parseScale(scale1, raw.payload, offset);\n return new this({\n nodeId: ctx.sourceNodeId,\n type,\n rateType,\n value,\n deltaTime,\n previousValue,\n scale,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n const ccVersion = getEffectiveCCVersion(ctx, this);\n const meter = getMeter(this.type);\n const scale = getMeterScale(this.type, this.scale)\n ?? getUnknownMeterScale(this.scale);\n // Filter out unknown meter types and scales, unless the strict validation is disabled\n const measurementValidation = !ctx.getDeviceConfig?.(this.nodeId as number)?.compat?.disableStrictMeasurementValidation;\n if (measurementValidation) {\n validatePayload.withReason(`Unknown meter type ${num2hex(this.type)} or corrupted data`)(!!meter);\n validatePayload.withReason(`Unknown meter scale ${num2hex(this.scale)} or corrupted data`)(scale.label !== getUnknownMeterScale(this.scale).label);\n // Filter out unsupported meter types, scales and rate types if possible\n if (ccVersion >= 2) {\n const expectedType = this.getValue<number>(ctx, MeterCCValues.type);\n if (expectedType != undefined) {\n validatePayload.withReason(\"Unexpected meter type or corrupted data\")(this.type === expectedType);\n }\n const supportedScales = this.getValue<number[]>(ctx, MeterCCValues.supportedScales);\n if (supportedScales?.length) {\n validatePayload.withReason(`Unsupported meter scale ${scale.label} or corrupted data`)(supportedScales.includes(this.scale));\n }\n const supportedRateTypes = this.getValue<RateType[]>(ctx, MeterCCValues.supportedRateTypes);\n if (supportedRateTypes?.length) {\n validatePayload.withReason(`Unsupported rate type ${getEnumMemberName(RateType, this.rateType)} or corrupted data`)(supportedRateTypes.includes(this.rateType));\n }\n }\n }\n const valueValue = MeterCCValues.value(this.type, this.rateType, this.scale);\n this.setMetadata(ctx, valueValue, {\n ...valueValue.meta,\n label: getValueLabel(this.type, this.scale, this.rateType),\n unit: scale.unit,\n ccSpecific: {\n meterType: this.type,\n scale: this.scale,\n rateType: this.rateType,\n },\n });\n this.setValue(ctx, valueValue, this.value);\n return true;\n }\n public type: number;\n public scale: number;\n public value: number;\n public previousValue: MaybeNotKnown<number>;\n public rateType: RateType;\n public deltaTime: MaybeUnknown<number>;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const { data: typeAndValue, floatParams, scale2 } = encodeMeterValueAndInfo(this.type, this.rateType, this.scale, this.value);\n const deltaTime = this.deltaTime ?? 0xffff;\n const deltaTimeBytes = new Bytes(2);\n deltaTimeBytes.writeUInt16BE(deltaTime, 0);\n this.payload = Bytes.concat([\n typeAndValue,\n deltaTimeBytes,\n ]);\n if (this.deltaTime !== 0 && this.previousValue != undefined) {\n // Encode the float, but only keep the value bytes\n const prevValueBytes = encodeFloatWithScale(this.previousValue, 0, // we discard the scale anyways\n floatParams).subarray(1);\n this.payload = Bytes.concat([\n this.payload,\n prevValueBytes,\n ]);\n }\n if (scale2 != undefined) {\n this.payload = Bytes.concat([\n this.payload,\n [scale2],\n ]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const scale = getMeterScale(this.type, this.scale)\n ?? getUnknownMeterScale(this.scale);\n const message: MessageRecord = {\n \"meter type\": getMeterName(this.type),\n scale: scale.label,\n \"rate type\": getEnumMemberName(RateType, this.rateType),\n value: this.value,\n };\n if (this.deltaTime !== UNKNOWN_STATE) {\n message[\"time delta\"] = `${this.deltaTime} seconds`;\n }\n if (this.previousValue != undefined) {\n message[\"prev. value\"] = this.previousValue;\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\nfunction testResponseForMeterGet(sent: MeterCCGet, received: MeterCCReport) {\n // We expect a Meter Report that matches the requested scale and rate type\n // (if they were requested)\n return ((sent.scale == undefined || sent.scale === received.scale)\n && (sent.rateType == undefined || sent.rateType == received.rateType));\n}\n// @publicAPI\nexport interface MeterCCGetOptions {\n scale?: number;\n rateType?: RateType;\n}\n@CCCommand(MeterCommand.Get)\n@expectedCCResponse(MeterCCReport, testResponseForMeterGet)\nexport class MeterCCGet extends MeterCC {\n public constructor(options: WithAddress<MeterCCGetOptions>) {\n super(options);\n this.rateType = options.rateType;\n this.scale = options.scale;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MeterCCGet {\n let rateType: RateType | undefined;\n let scale: number | undefined;\n if (raw.payload.length >= 1) {\n rateType = (raw.payload[0] & 192) >>> 6;\n scale = (raw.payload[0] & 56) >>> 3;\n if (scale === 7) {\n validatePayload(raw.payload.length >= 2);\n scale += raw.payload[1];\n }\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n rateType,\n scale,\n });\n }\n public rateType: RateType | undefined;\n public scale: number | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n let scale1: number;\n let scale2: number | undefined;\n let bufferLength = 0;\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (this.scale == undefined) {\n scale1 = 0;\n }\n else if (ccVersion >= 4 && this.scale >= 7) {\n scale1 = 7;\n scale2 = this.scale >>> 3;\n bufferLength = 2;\n }\n else if (ccVersion >= 3) {\n scale1 = this.scale & 0b111;\n bufferLength = 1;\n }\n else if (ccVersion >= 2) {\n scale1 = this.scale & 0b11;\n bufferLength = 1;\n }\n else {\n scale1 = 0;\n }\n let rateTypeFlags = 0;\n if (ccVersion >= 4 && this.rateType != undefined) {\n rateTypeFlags = this.rateType & 0b11;\n bufferLength = Math.max(bufferLength, 1);\n }\n this.payload = Bytes.alloc(bufferLength, 0);\n this.payload[0] = (rateTypeFlags << 6) | (scale1 << 3);\n if (scale2)\n this.payload[1] = scale2;\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n if (this.rateType != undefined) {\n message[\"rate type\"] = getEnumMemberName(RateType, this.rateType);\n }\n if (this.scale != undefined) {\n if (ctx) {\n // Try to lookup the meter type to translate the scale\n const type = this.getValue<number>(ctx, MeterCCValues.type);\n if (type != undefined) {\n message.scale = (getMeterScale(type, this.scale)\n ?? getUnknownMeterScale(this.scale)).label;\n }\n }\n else {\n message.scale = this.scale;\n }\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface MeterCCSupportedReportOptions {\n type: number;\n supportsReset: boolean;\n supportedScales: readonly number[];\n supportedRateTypes: readonly RateType[];\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 public constructor(options: WithAddress<MeterCCSupportedReportOptions>) {\n super(options);\n this.type = options.type;\n this.supportsReset = options.supportsReset;\n this.supportedScales = options.supportedScales;\n this.supportedRateTypes = options.supportedRateTypes;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MeterCCSupportedReport {\n validatePayload(raw.payload.length >= 2);\n const type = raw.payload[0] & 31;\n const supportsReset = !!(raw.payload[0] & 128);\n const hasMoreScales = !!(raw.payload[1] & 128);\n let supportedScales: number[] | undefined;\n if (hasMoreScales) {\n // The bitmask is spread out\n validatePayload(raw.payload.length >= 3);\n const extraBytes = raw.payload[2];\n validatePayload(raw.payload.length >= 3 + extraBytes);\n // The bitmask is the original payload byte plus all following bytes\n // Since the first byte only has 7 bits, we need to reduce all following bits by 1\n supportedScales = parseBitMask(Bytes.concat([\n [raw.payload[1] & 127],\n raw.payload.subarray(3, 3 + extraBytes),\n ]), 0).map((scale) => (scale >= 8 ? scale - 1 : scale));\n }\n else {\n // only 7 bits in the bitmask. Bit 7 is 0, so no need to mask it out\n supportedScales = parseBitMask(Bytes.from([raw.payload[1]]), 0);\n }\n // This is only present in V4+\n const supportedRateTypes: RateType[] = parseBitMask(Bytes.from([(raw.payload[0] & 96) >>> 5]), 1);\n return new this({\n nodeId: ctx.sourceNodeId,\n type,\n supportsReset,\n supportedScales,\n supportedRateTypes,\n });\n }\n public readonly type: number;\n public readonly supportsReset: boolean;\n public readonly supportedScales: readonly number[];\n public readonly supportedRateTypes: readonly RateType[];\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n if (!this.supportsReset)\n return true;\n const ccVersion = getEffectiveCCVersion(ctx, this);\n // Create reset values\n if (ccVersion < 6) {\n this.ensureMetadata(ctx, MeterCCValues.resetAll);\n }\n else {\n for (const scale of this.supportedScales) {\n // Only accumulated values can be reset\n if (!isAccumulatedValue(this.type, scale))\n continue;\n for (const rateType of this.supportedRateTypes) {\n const resetSingleValue = MeterCCValues.resetSingle(this.type, rateType, scale);\n this.ensureMetadata(ctx, resetSingleValue, {\n ...resetSingleValue.meta,\n label: `Reset ${getValueLabel(this.type, scale, rateType)}`,\n });\n }\n }\n }\n return true;\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const typeByte = (this.type & 31)\n | (this.supportedRateTypes.includes(RateType.Consumed)\n ? 32\n : 0)\n | (this.supportedRateTypes.includes(RateType.Produced)\n ? 64\n : 0)\n | (this.supportsReset ? 128 : 0);\n const supportedScales = encodeBitMask(this.supportedScales, undefined, \n // The first byte only has 7 bits for the bitmask,\n // so we add a fake bit for the value -1 and later shift\n // the first byte one to the right\n -1);\n const scalesByte1 = (supportedScales[0] >>> 1)\n | (supportedScales.length > 1 ? 128 : 0);\n this.payload = Bytes.from([\n typeByte,\n scalesByte1,\n ]);\n if (supportedScales.length > 1) {\n this.payload = Bytes.concat([\n this.payload,\n [supportedScales.length - 1],\n Bytes.from(supportedScales.subarray(1)),\n ]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"meter type\": getMeterName(this.type),\n \"supports reset\": this.supportsReset,\n \"supported scales\": logList(this.supportedScales.map((scale) => (getMeterScale(this.type, scale)\n ?? getUnknownMeterScale(scale)).label)),\n \"supported rate types\": this.supportedRateTypes\n .map((rt) => getEnumMemberName(RateType, rt))\n .join(\", \"),\n };\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n@CCCommand(MeterCommand.SupportedGet)\n@expectedCCResponse(MeterCCSupportedReport)\nexport class MeterCCSupportedGet extends MeterCC {\n}\n// @publicAPI\nexport type MeterCCResetOptions = AllOrNone<{\n type: number;\n scale: number;\n rateType: RateType;\n targetValue: number;\n}>;\n@CCCommand(MeterCommand.Reset)\n@useSupervision()\nexport class MeterCCReset extends MeterCC {\n public constructor(options: WithAddress<MeterCCResetOptions>) {\n super(options);\n this.type = options.type;\n this.scale = options.scale;\n this.rateType = options.rateType;\n this.targetValue = options.targetValue;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MeterCCReset {\n if (raw.payload.length === 0) {\n return new this({\n nodeId: ctx.sourceNodeId,\n });\n }\n const { type, rateType, scale1, value: targetValue, bytesRead: scale2Offset, } = parseMeterValueAndInfo(raw.payload, 0);\n const scale = parseScale(scale1, raw.payload, scale2Offset);\n return new this({\n nodeId: ctx.sourceNodeId,\n type,\n rateType,\n targetValue,\n scale,\n });\n }\n public type: number | undefined;\n public scale: number | undefined;\n public rateType: RateType | undefined;\n public targetValue: number | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.type != undefined\n && this.scale != undefined\n && this.rateType != undefined\n && this.targetValue != undefined) {\n const { data: typeAndValue, scale2 } = encodeMeterValueAndInfo(this.type, this.rateType, this.scale, this.targetValue);\n this.payload = typeAndValue;\n if (scale2 != undefined) {\n this.payload = Bytes.concat([\n this.payload,\n [scale2],\n ]);\n }\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n if (this.type != undefined) {\n message.type = getMeterName(this.type);\n }\n if (this.rateType != undefined) {\n message[\"rate type\"] = getEnumMemberName(RateType, this.rateType);\n }\n if (this.type != undefined && this.scale != undefined) {\n message.scale = (getMeterScale(this.type, this.scale)\n ?? getUnknownMeterScale(this.scale)).label;\n }\n if (this.targetValue != undefined) {\n message[\"target value\"] = this.targetValue;\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import * as __validateArgs from \"./MeterCC._validateArgs.js\";\nconst { validateArgs_MeterCCAPI_get, validateArgs_MeterCCAPI_sendReport, validateArgs_MeterCCAPI_getAll, validateArgs_MeterCCAPI_sendSupportedReport, validateArgs_MeterCCAPI_reset } = __validateArgs;\nimport type { GetDeviceConfig } from \"@zwave-js/config\";\nimport { CommandClasses, type ControlsCC, type EndpointId, type FloatParameters, type GetEndpoint, type GetNode, type GetSupportedCCVersion, type GetValueDB, type MaybeNotKnown, type MaybeUnknown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type NodeId, type SinglecastCC, type SupervisionResult, type SupportsCC, UNKNOWN_STATE, ValueMetadata, type WithAddress, encodeBitMask, encodeFloatWithScale, getFloatParameters, getMeter, getMeterName, getMeterScale, getUnknownMeterScale, logDict, logList, logText, parseBitMask, parseFloatWithScale, timespan, validatePayload, } from \"@zwave-js/core\";\nimport { type AllOrNone, Bytes, type BytesView, getEnumMemberName, num2hex, pick, } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, PhysicalCCAPI, type PollValueImplementation, SET_VALUE, SET_VALUE_HOOKS, type SetValueImplementation, type SetValueImplementationHooksFactory, throwMissingPropertyKey, throwUnsupportedProperty, throwUnsupportedPropertyKey, throwWrongValueType, } from \"../lib/API.js\";\nimport { meterTypesToPropertyKey } from \"../lib/CCValueUtils.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, getCommandClass, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { MeterCommand, type MeterReading, RateType } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { MeterCCValues } from \"./_CCValues.generated.js\";\nexport { MeterCCValues };\nfunction splitPropertyKey(key: number): {\n meterType: number;\n rateType: RateType;\n scale: number;\n} {\n return {\n rateType: key & 0xff,\n scale: (key >>> 8) & 0xff,\n meterType: key >>> 16,\n };\n}\nfunction getValueLabel(meterType: number, scale: number, rateType: RateType, suffix?: string): string {\n let ret = getMeterName(meterType);\n const scaleLabel = (getMeterScale(meterType, scale) ?? getUnknownMeterScale(scale)).label;\n switch (rateType) {\n case RateType.Consumed:\n ret += ` Consumption [${scaleLabel}]`;\n break;\n case RateType.Produced:\n ret += ` Production [${scaleLabel}]`;\n break;\n default:\n ret += ` [${scaleLabel}]`;\n }\n if (suffix) {\n ret += ` (${suffix})`;\n }\n return ret;\n}\nfunction parseMeterValueAndInfo(data: BytesView, offset: number): {\n type: number;\n rateType: RateType;\n scale1: number;\n value: number;\n bytesRead: number;\n} {\n validatePayload(data.length >= offset + 1);\n const type = data[offset] & 31;\n const rateType = (data[offset] & 96) >>> 5;\n const scale1Bit2 = (data[offset] & 128) >>> 7;\n const { scale: scale1Bits10, value, bytesRead, } = parseFloatWithScale(data.subarray(offset + 1));\n return {\n type,\n rateType,\n // The scale is composed of two fields\n scale1: (scale1Bit2 << 2) | scale1Bits10,\n value,\n // We've read one byte more than the float contains\n bytesRead: bytesRead + 1,\n };\n}\nfunction encodeMeterValueAndInfo(type: number, rateType: RateType, scale: number, value: number): {\n data: Bytes;\n floatParams: FloatParameters;\n scale2: number | undefined;\n} {\n // We need at least 2 bytes\n const scale1 = scale >= 7 ? 7 : scale & 0b111;\n const scale1Bits10 = scale1 & 0b11;\n const scale1Bit2 = scale1 >>> 2;\n const scale2 = scale >= 7 ? scale - 7 : undefined;\n const typeByte = (type & 31) | ((rateType & 0b11) << 5) | (scale1Bit2 << 7);\n const floatParams = getFloatParameters(value);\n const valueBytes = encodeFloatWithScale(value, scale1Bits10, floatParams);\n return {\n data: Bytes.concat([[typeByte], valueBytes]),\n floatParams: pick(floatParams, [\"precision\", \"size\"]),\n scale2,\n };\n}\nfunction parseScale(scale1: number, data: BytesView, scale2Offset: number): number {\n if (scale1 === 7) {\n validatePayload(data.length >= scale2Offset + 1);\n const scale2 = data[scale2Offset];\n return scale1 + scale2;\n }\n else {\n return scale1;\n }\n}\nexport function isAccumulatedValue(meterType: number, scale: number): boolean {\n // FIXME: We should probably move the meter definitions into code\n switch (meterType) {\n case 0x01: // Electric\n return (\n // kVarh\n // Pulse count\n scale === 0x00 // kWh\n || scale === 0x01 // kVAh\n || scale === 0x03\n || scale === 0x08);\n case 0x02: // Gas\n return (\n // Pulse count\n // ft\u00B3\n scale === 0x00 // m\u00B3\n || scale === 0x01\n || scale === 0x03);\n case 0x03: // Water\n return (\n // Pulse count\n // US gallons\n scale === 0x00 // m\u00B3\n || scale === 0x01 // ft\u00B3\n || scale === 0x02\n || scale === 0x03);\n case 0x04: // Heating\n return scale === 0x00; // kWh\n case 0x05: // Cooling\n return scale === 0x00; // kWh\n }\n return false;\n}\n@API(CommandClasses.Meter)\nexport class MeterCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: MeterCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case MeterCommand.Get:\n case MeterCommand.Report:\n return true; // This is mandatory\n case MeterCommand.SupportedGet:\n case MeterCommand.SupportedReport:\n return this.version >= 2;\n case MeterCommand.Reset: {\n const ret = this.tryGetValueDB()?.getValue<boolean>({\n commandClass: getCommandClass(this),\n endpoint: this.endpoint.index,\n property: \"supportsReset\",\n });\n return ret === true;\n }\n }\n return super.supportsCommand(cmd);\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: MeterCCAPI, { property, propertyKey }) {\n switch (property) {\n case \"value\":\n case \"previousValue\":\n case \"deltaTime\": {\n if (propertyKey == undefined) {\n throwMissingPropertyKey(this.ccId, property);\n }\n else if (typeof propertyKey !== \"number\") {\n throwUnsupportedPropertyKey(this.ccId, property, propertyKey);\n }\n const { rateType, scale } = splitPropertyKey(propertyKey);\n return (await this.get({\n rateType,\n scale,\n }))?.[property];\n }\n default:\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n @validateArgs_MeterCCAPI_get()\n public async get(options?: MeterCCGetOptions): Promise<MeterReading | undefined> {\n this.assertSupportsCommand(MeterCommand, MeterCommand.Get);\n const cc = new MeterCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n const response = await this.host.sendCommand<MeterCCReport>(cc, this.commandOptions);\n if (response) {\n return {\n type: response.type,\n scale: getMeterScale(response.type, response.scale)\n ?? getUnknownMeterScale(response.scale),\n ...pick(response, [\n \"value\",\n \"previousValue\",\n \"rateType\",\n \"deltaTime\",\n ]),\n };\n }\n }\n @validateArgs_MeterCCAPI_sendReport()\n public async sendReport(options: MeterCCReportOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MeterCommand, MeterCommand.Report);\n const cc = new MeterCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_MeterCCAPI_getAll()\n public async getAll(accumulatedOnly: boolean = false): Promise<MeterReading[]> {\n const valueDB = this.tryGetValueDB();\n if (this.version >= 2) {\n const meterType = valueDB?.getValue<number>(MeterCCValues.type.endpoint(this.endpoint.index));\n const supportedScales = valueDB?.getValue<number[]>(MeterCCValues.supportedScales.endpoint(this.endpoint.index)) ?? [];\n const supportedRateTypes = valueDB?.getValue<RateType[]>(MeterCCValues.supportedRateTypes.endpoint(this.endpoint.index)) ?? [];\n const rateTypes = supportedRateTypes.length\n ? supportedRateTypes\n : [undefined];\n const ret = [];\n for (const rateType of rateTypes) {\n for (const scale of supportedScales) {\n // Skip non-accumulated values if requested\n if (accumulatedOnly\n && meterType != undefined\n && !isAccumulatedValue(meterType, scale)) {\n continue;\n }\n const response = await this.get({\n scale,\n rateType,\n });\n if (response)\n ret.push(response);\n }\n }\n return ret;\n }\n else {\n const response = await this.get();\n return response ? [response] : [];\n }\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getSupported() {\n this.assertSupportsCommand(MeterCommand, MeterCommand.SupportedGet);\n const cc = new MeterCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<MeterCCSupportedReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\n \"type\",\n \"supportsReset\",\n \"supportedScales\",\n \"supportedRateTypes\",\n ]);\n }\n }\n @validateArgs_MeterCCAPI_sendSupportedReport()\n public async sendSupportedReport(options: MeterCCSupportedReportOptions): Promise<void> {\n this.assertSupportsCommand(MeterCommand, MeterCommand.SupportedReport);\n const cc = new MeterCCSupportedReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_MeterCCAPI_reset()\n public async reset(options?: MeterCCResetOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MeterCommand, MeterCommand.Reset);\n const cc = new MeterCCReset({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: MeterCCAPI, { property, propertyKey }, value) {\n if (property !== \"reset\") {\n throwUnsupportedProperty(this.ccId, property);\n }\n else if (propertyKey != undefined\n && typeof propertyKey !== \"number\") {\n throwUnsupportedPropertyKey(this.ccId, property, propertyKey);\n }\n else if (value !== true) {\n throwWrongValueType(this.ccId, property, \"true\", value === false ? \"false\" : typeof value);\n }\n if (typeof propertyKey === \"number\") {\n const { meterType, scale, rateType } = splitPropertyKey(propertyKey);\n return this.reset({\n type: meterType,\n scale,\n rateType,\n targetValue: 0,\n });\n }\n else {\n return this.reset();\n }\n };\n }\n protected [SET_VALUE_HOOKS]: SetValueImplementationHooksFactory = ({ property, propertyKey }, _value, _options) => {\n if (property !== \"reset\")\n return;\n if (typeof propertyKey === \"number\") {\n // Reset single\n const { meterType, rateType, scale } = splitPropertyKey(propertyKey);\n const readingValueId = MeterCCValues.value(meterType, rateType, scale).endpoint(this.endpoint.index);\n return {\n optimisticallyUpdateRelatedValues: (supervisedAndSuccessful) => {\n if (!supervisedAndSuccessful)\n return;\n // After resetting a single reading with supervision, store zero\n // in the corresponding value\n const valueDB = this.tryGetValueDB();\n if (!valueDB)\n return;\n if (isAccumulatedValue(meterType, scale)) {\n valueDB.setValue({\n commandClass: this.ccId,\n endpoint: this.endpoint.index,\n property,\n propertyKey,\n }, 0);\n }\n },\n verifyChanges: () => {\n this.schedulePoll(readingValueId, 0, {\n transition: \"fast\",\n });\n },\n };\n }\n else {\n // Reset all\n const valueDB = this.tryGetValueDB();\n if (!valueDB)\n return;\n const accumulatedValues = valueDB\n .findValues((vid) => vid.commandClass === this.ccId\n && vid.endpoint === this.endpoint.index\n && MeterCCValues.value.is(vid))\n .filter(({ propertyKey }) => {\n if (typeof propertyKey !== \"number\")\n return false;\n const { meterType, scale } = splitPropertyKey(propertyKey);\n return isAccumulatedValue(meterType, scale);\n });\n return {\n optimisticallyUpdateRelatedValues: (supervisedAndSuccessful) => {\n if (!supervisedAndSuccessful)\n return;\n // After setting the reset all value with supervision,\n // reset all accumulated values, since we know they are now zero.\n for (const value of accumulatedValues) {\n valueDB.setValue(value, 0);\n }\n },\n verifyChanges: () => {\n // Poll all accumulated values, unless they were updated by the device\n for (const valueID of accumulatedValues) {\n this.schedulePoll(valueID, 0, { transition: \"fast\" });\n }\n },\n };\n }\n };\n}\n@commandClass(CommandClasses.Meter)\n@implementedVersion(6)\n@ccValues(MeterCCValues)\nexport class MeterCC extends CommandClass {\n declare ccCommand: MeterCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses.Meter, ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n if (api.version >= 2) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying meter support...\",\n direction: \"outbound\",\n });\n const suppResp = await api.getSupported();\n if (suppResp) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received meter support:\", {\n nested: logDict({\n type: getMeterName(suppResp.type),\n \"supported scales\": logList(suppResp.supportedScales.map((s) => (getMeterScale(suppResp.type, s)\n ?? getUnknownMeterScale(s)).label)),\n \"supported rate types\": logList(suppResp.supportedRateTypes.map((rt) => getEnumMemberName(RateType, rt))),\n \"supports reset\": suppResp.supportsReset,\n }),\n }),\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying meter support timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n }\n // Query current meter values\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses.Meter, ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n if (api.version === 1) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying default meter value...`,\n direction: \"outbound\",\n });\n await api.get();\n }\n else {\n const type: number = this.getValue(ctx, MeterCCValues.type) ?? 0;\n const supportedScales: readonly number[] = this.getValue(ctx, MeterCCValues.supportedScales) ?? [];\n const supportedRateTypes: readonly RateType[] = this.getValue(ctx, MeterCCValues.supportedRateTypes) ?? [];\n const rateTypes = supportedRateTypes.length\n ? supportedRateTypes\n : [undefined];\n const total = rateTypes.length * supportedScales.length;\n let completed = 0;\n for (const rateType of rateTypes) {\n for (const scale of supportedScales) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying meter value (type = ${getMeterName(type)}, scale = ${(getMeterScale(type, scale)\n ?? getUnknownMeterScale(scale)).label}${rateType != undefined\n ? `, rate type = ${getEnumMemberName(RateType, rateType)}`\n : \"\"})...`,\n direction: \"outbound\",\n });\n await api.get({ scale, rateType });\n options?.onProgress?.(++completed, total);\n }\n }\n }\n }\n public shouldRefreshValues(this: SinglecastCC<this>, ctx: GetValueDB & GetSupportedCCVersion & GetDeviceConfig & GetNode<NodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>>): boolean {\n // Poll the device when all of the supported values were last updated longer than 6 hours ago.\n // This may lead to some values not being updated, but the user may have disabled some unnecessary\n // reports to reduce traffic.\n const valueDB = ctx.tryGetValueDB(this.nodeId);\n if (!valueDB)\n return true;\n const values = this.getDefinedValueIDs(ctx).filter((v) => MeterCCValues.value.is(v));\n return values.every((v) => {\n const lastUpdated = valueDB.getTimestamp(v);\n return (lastUpdated == undefined\n || Date.now() - lastUpdated > timespan.hours(6));\n });\n }\n /**\n * Returns which type this meter has.\n * This only works AFTER the interview process\n */\n public static getMeterTypeCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<number> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MeterCCValues.type.endpoint(endpoint.index));\n }\n /**\n * Returns which scales are supported by this meter.\n * This only works AFTER the interview process\n */\n public static getSupportedScalesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<number[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MeterCCValues.supportedScales.endpoint(endpoint.index));\n }\n /**\n * Returns whether reset is supported by this meter.\n * This only works AFTER the interview process\n */\n public static supportsResetCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<boolean> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MeterCCValues.supportsReset.endpoint(endpoint.index));\n }\n /**\n * Returns which rate types are supported by this meter.\n * This only works AFTER the interview process\n */\n public static getSupportedRateTypesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<RateType[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MeterCCValues.supportedRateTypes.endpoint(endpoint.index));\n }\n public translatePropertyKey(ctx: GetValueDB, property: string | number, propertyKey: string | number): string | undefined {\n if (property === \"value\" && typeof propertyKey === \"number\") {\n const { meterType, rateType, scale } = splitPropertyKey(propertyKey);\n let ret: string;\n if (meterType !== 0) {\n ret = `${getMeterName(meterType)}_${(getMeterScale(meterType, scale)\n ?? getUnknownMeterScale(scale)).label}`;\n }\n else {\n ret = \"default\";\n }\n if (rateType !== RateType.Unspecified) {\n ret += \"_\" + getEnumMemberName(RateType, rateType);\n }\n return ret;\n }\n else if (property === \"reset\" && typeof propertyKey === \"number\") {\n return getMeterName(propertyKey);\n }\n return super.translatePropertyKey(ctx, property, propertyKey);\n }\n}\n// @publicAPI\nexport interface MeterCCReportOptions {\n type: number;\n scale: number;\n value: number;\n previousValue?: MaybeNotKnown<number>;\n rateType?: RateType;\n deltaTime?: MaybeUnknown<number>;\n}\n@CCCommand(MeterCommand.Report)\nexport class MeterCCReport extends MeterCC {\n public constructor(options: WithAddress<MeterCCReportOptions>) {\n super(options);\n this.type = options.type;\n this.scale = options.scale;\n this.value = options.value;\n this.previousValue = options.previousValue;\n this.rateType = options.rateType ?? RateType.Unspecified;\n this.deltaTime = options.deltaTime ?? UNKNOWN_STATE;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MeterCCReport {\n const { type, rateType, scale1, value, bytesRead } = parseMeterValueAndInfo(raw.payload, 0);\n let offset = bytesRead;\n const floatSize = bytesRead - 2;\n let deltaTime: MaybeUnknown<number>;\n let previousValue: MaybeNotKnown<number>;\n if (raw.payload.length >= offset + 2) {\n deltaTime = raw.payload.readUInt16BE(offset);\n offset += 2;\n if (deltaTime === 0xffff) {\n deltaTime = UNKNOWN_STATE;\n }\n if (\n // Previous value is included only if delta time is not 0\n deltaTime !== 0\n && raw.payload.length >= offset + floatSize) {\n const { value: prevValue } = parseFloatWithScale(\n // This float is split in the payload\n Bytes.concat([\n [raw.payload[1]],\n raw.payload.subarray(offset),\n ]));\n offset += floatSize;\n previousValue = prevValue;\n }\n }\n else {\n // 0 means that no previous value is included\n deltaTime = 0;\n }\n const scale = parseScale(scale1, raw.payload, offset);\n return new this({\n nodeId: ctx.sourceNodeId,\n type,\n rateType,\n value,\n deltaTime,\n previousValue,\n scale,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n const ccVersion = getEffectiveCCVersion(ctx, this);\n // The rate type field only exists in V2+ reports, the third scale bit in V3+ reports.\n // Ignore them if the device advertises a lower version.\n const rateType = ccVersion >= 2 ? this.rateType : RateType.Unspecified;\n const scaleNumber = ccVersion >= 3 ? this.scale : this.scale & 0b11;\n const meter = getMeter(this.type);\n const scale = getMeterScale(this.type, scaleNumber)\n ?? getUnknownMeterScale(scaleNumber);\n // Filter out unknown meter types and scales, unless the strict validation is disabled\n const measurementValidation = !ctx.getDeviceConfig?.(this.nodeId as number)?.compat?.disableStrictMeasurementValidation;\n if (measurementValidation) {\n validatePayload.withReason(`Unknown meter type ${num2hex(this.type)} or corrupted data`)(!!meter);\n validatePayload.withReason(`Unknown meter scale ${num2hex(scaleNumber)} or corrupted data`)(scale.label !== getUnknownMeterScale(scaleNumber).label);\n // Filter out unsupported meter types, scales and rate types if possible\n if (ccVersion >= 2) {\n const expectedType = this.getValue<number>(ctx, MeterCCValues.type);\n if (expectedType != undefined) {\n validatePayload.withReason(\"Unexpected meter type or corrupted data\")(this.type === expectedType);\n }\n const supportedScales = this.getValue<number[]>(ctx, MeterCCValues.supportedScales);\n if (supportedScales?.length) {\n validatePayload.withReason(`Unsupported meter scale ${scale.label} or corrupted data`)(supportedScales.includes(scaleNumber));\n }\n const supportedRateTypes = this.getValue<RateType[]>(ctx, MeterCCValues.supportedRateTypes);\n if (supportedRateTypes?.length) {\n validatePayload.withReason(`Unsupported rate type ${getEnumMemberName(RateType, rateType)} or corrupted data`)(supportedRateTypes.includes(rateType));\n }\n }\n }\n const valueValue = MeterCCValues.value(this.type, rateType, scaleNumber);\n this.setMetadata(ctx, valueValue, {\n ...valueValue.meta,\n label: getValueLabel(this.type, scaleNumber, rateType),\n unit: scale.unit,\n ccSpecific: {\n meterType: this.type,\n scale: scaleNumber,\n rateType,\n },\n });\n this.setValue(ctx, valueValue, this.value);\n return true;\n }\n public type: number;\n public scale: number;\n public value: number;\n public previousValue: MaybeNotKnown<number>;\n public rateType: RateType;\n public deltaTime: MaybeUnknown<number>;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const { data: typeAndValue, floatParams, scale2, } = encodeMeterValueAndInfo(this.type, this.rateType, this.scale, this.value);\n const deltaTime = this.deltaTime ?? 0xffff;\n const deltaTimeBytes = new Bytes(2);\n deltaTimeBytes.writeUInt16BE(deltaTime, 0);\n this.payload = Bytes.concat([typeAndValue, deltaTimeBytes]);\n if (this.deltaTime !== 0 && this.previousValue != undefined) {\n // Encode the float, but only keep the value bytes\n const prevValueBytes = encodeFloatWithScale(this.previousValue, 0, // we discard the scale anyways\n floatParams).subarray(1);\n this.payload = Bytes.concat([this.payload, prevValueBytes]);\n }\n if (scale2 != undefined) {\n this.payload = Bytes.concat([this.payload, [scale2]]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const scale = getMeterScale(this.type, this.scale)\n ?? getUnknownMeterScale(this.scale);\n const message: MessageRecord = {\n \"meter type\": getMeterName(this.type),\n scale: scale.label,\n \"rate type\": getEnumMemberName(RateType, this.rateType),\n value: this.value,\n };\n if (this.deltaTime !== UNKNOWN_STATE) {\n message[\"time delta\"] = `${this.deltaTime} seconds`;\n }\n if (this.previousValue != undefined) {\n message[\"prev. value\"] = this.previousValue;\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\nfunction testResponseForMeterGet(sent: MeterCCGet, received: MeterCCReport) {\n // We expect a Meter Report that matches the requested scale and rate type\n // (if they were requested)\n return ((sent.scale == undefined || sent.scale === received.scale)\n && (sent.rateType == undefined || sent.rateType == received.rateType));\n}\n// @publicAPI\nexport interface MeterCCGetOptions {\n scale?: number;\n rateType?: RateType;\n}\n@CCCommand(MeterCommand.Get)\n@expectedCCResponse(MeterCCReport, testResponseForMeterGet)\nexport class MeterCCGet extends MeterCC {\n public constructor(options: WithAddress<MeterCCGetOptions>) {\n super(options);\n this.rateType = options.rateType;\n this.scale = options.scale;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MeterCCGet {\n let rateType: RateType | undefined;\n let scale: number | undefined;\n if (raw.payload.length >= 1) {\n rateType = (raw.payload[0] & 192) >>> 6;\n scale = (raw.payload[0] & 56) >>> 3;\n if (scale === 7) {\n validatePayload(raw.payload.length >= 2);\n scale += raw.payload[1];\n }\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n rateType,\n scale,\n });\n }\n public rateType: RateType | undefined;\n public scale: number | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n let scale1: number;\n let scale2: number | undefined;\n let bufferLength = 0;\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (this.scale == undefined) {\n scale1 = 0;\n }\n else if (ccVersion >= 4 && this.scale >= 7) {\n scale1 = 7;\n scale2 = this.scale >>> 3;\n bufferLength = 2;\n }\n else if (ccVersion >= 3) {\n scale1 = this.scale & 0b111;\n bufferLength = 1;\n }\n else if (ccVersion >= 2) {\n scale1 = this.scale & 0b11;\n bufferLength = 1;\n }\n else {\n scale1 = 0;\n }\n let rateTypeFlags = 0;\n if (ccVersion >= 4 && this.rateType != undefined) {\n rateTypeFlags = this.rateType & 0b11;\n bufferLength = Math.max(bufferLength, 1);\n }\n this.payload = Bytes.alloc(bufferLength, 0);\n this.payload[0] = (rateTypeFlags << 6) | (scale1 << 3);\n if (scale2)\n this.payload[1] = scale2;\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n if (this.rateType != undefined) {\n message[\"rate type\"] = getEnumMemberName(RateType, this.rateType);\n }\n if (this.scale != undefined) {\n if (ctx) {\n // Try to lookup the meter type to translate the scale\n const type = this.getValue<number>(ctx, MeterCCValues.type);\n if (type != undefined) {\n message.scale = (getMeterScale(type, this.scale)\n ?? getUnknownMeterScale(this.scale)).label;\n }\n }\n else {\n message.scale = this.scale;\n }\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface MeterCCSupportedReportOptions {\n type: number;\n supportsReset: boolean;\n supportedScales: readonly number[];\n supportedRateTypes: readonly RateType[];\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 public constructor(options: WithAddress<MeterCCSupportedReportOptions>) {\n super(options);\n this.type = options.type;\n this.supportsReset = options.supportsReset;\n this.supportedScales = options.supportedScales;\n this.supportedRateTypes = options.supportedRateTypes;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MeterCCSupportedReport {\n validatePayload(raw.payload.length >= 2);\n const type = raw.payload[0] & 31;\n const supportsReset = !!(raw.payload[0] & 128);\n const hasMoreScales = !!(raw.payload[1] & 128);\n let supportedScales: number[] | undefined;\n if (hasMoreScales) {\n // The bitmask is spread out\n validatePayload(raw.payload.length >= 3);\n const extraBytes = raw.payload[2];\n validatePayload(raw.payload.length >= 3 + extraBytes);\n // The bitmask is the original payload byte plus all following bytes\n // Since the first byte only has 7 bits, we need to reduce all following bits by 1\n supportedScales = parseBitMask(Bytes.concat([\n [raw.payload[1] & 127],\n raw.payload.subarray(3, 3 + extraBytes),\n ]), 0).map((scale) => (scale >= 8 ? scale - 1 : scale));\n }\n else {\n // only 7 bits in the bitmask. Bit 7 is 0, so no need to mask it out\n supportedScales = parseBitMask(Bytes.from([raw.payload[1]]), 0);\n }\n // This is only present in V4+\n const supportedRateTypes: RateType[] = parseBitMask(Bytes.from([(raw.payload[0] & 96) >>> 5]), 1);\n return new this({\n nodeId: ctx.sourceNodeId,\n type,\n supportsReset,\n supportedScales,\n supportedRateTypes,\n });\n }\n public readonly type: number;\n public readonly supportsReset: boolean;\n public readonly supportedScales: readonly number[];\n public readonly supportedRateTypes: readonly RateType[];\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n if (!this.supportsReset)\n return true;\n const ccVersion = getEffectiveCCVersion(ctx, this);\n // Create reset values\n if (ccVersion < 6) {\n this.ensureMetadata(ctx, MeterCCValues.resetAll);\n }\n else {\n for (const scale of this.supportedScales) {\n // Only accumulated values can be reset\n if (!isAccumulatedValue(this.type, scale))\n continue;\n for (const rateType of this.supportedRateTypes) {\n const resetSingleValue = MeterCCValues.resetSingle(this.type, rateType, scale);\n this.ensureMetadata(ctx, resetSingleValue, {\n ...resetSingleValue.meta,\n label: `Reset ${getValueLabel(this.type, scale, rateType)}`,\n });\n }\n }\n }\n return true;\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const typeByte = (this.type & 31)\n | (this.supportedRateTypes.includes(RateType.Consumed)\n ? 32\n : 0)\n | (this.supportedRateTypes.includes(RateType.Produced)\n ? 64\n : 0)\n | (this.supportsReset ? 128 : 0);\n const supportedScales = encodeBitMask(this.supportedScales, undefined, \n // The first byte only has 7 bits for the bitmask,\n // so we add a fake bit for the value -1 and later shift\n // the first byte one to the right\n -1);\n const scalesByte1 = (supportedScales[0] >>> 1)\n | (supportedScales.length > 1 ? 128 : 0);\n this.payload = Bytes.from([typeByte, scalesByte1]);\n if (supportedScales.length > 1) {\n this.payload = Bytes.concat([\n this.payload,\n [supportedScales.length - 1],\n Bytes.from(supportedScales.subarray(1)),\n ]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"meter type\": getMeterName(this.type),\n \"supports reset\": this.supportsReset,\n \"supported scales\": logList(this.supportedScales.map((scale) => (getMeterScale(this.type, scale)\n ?? getUnknownMeterScale(scale)).label)),\n \"supported rate types\": this.supportedRateTypes\n .map((rt) => getEnumMemberName(RateType, rt))\n .join(\", \"),\n };\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n@CCCommand(MeterCommand.SupportedGet)\n@expectedCCResponse(MeterCCSupportedReport)\nexport class MeterCCSupportedGet extends MeterCC {\n}\n// @publicAPI\nexport type MeterCCResetOptions = AllOrNone<{\n type: number;\n scale: number;\n rateType: RateType;\n targetValue: number;\n}>;\n@CCCommand(MeterCommand.Reset)\n@useSupervision()\nexport class MeterCCReset extends MeterCC {\n public constructor(options: WithAddress<MeterCCResetOptions>) {\n super(options);\n this.type = options.type;\n this.scale = options.scale;\n this.rateType = options.rateType;\n this.targetValue = options.targetValue;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MeterCCReset {\n if (raw.payload.length === 0) {\n return new this({\n nodeId: ctx.sourceNodeId,\n });\n }\n const { type, rateType, scale1, value: targetValue, bytesRead: scale2Offset, } = parseMeterValueAndInfo(raw.payload, 0);\n const scale = parseScale(scale1, raw.payload, scale2Offset);\n return new this({\n nodeId: ctx.sourceNodeId,\n type,\n rateType,\n targetValue,\n scale,\n });\n }\n public type: number | undefined;\n public scale: number | undefined;\n public rateType: RateType | undefined;\n public targetValue: number | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.type != undefined\n && this.scale != undefined\n && this.rateType != undefined\n && this.targetValue != undefined) {\n const { data: typeAndValue, scale2 } = encodeMeterValueAndInfo(this.type, this.rateType, this.scale, this.targetValue);\n this.payload = typeAndValue;\n if (scale2 != undefined) {\n this.payload = Bytes.concat([this.payload, [scale2]]);\n }\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n if (this.type != undefined) {\n message.type = getMeterName(this.type);\n }\n if (this.rateType != undefined) {\n message[\"rate type\"] = getEnumMemberName(RateType, this.rateType);\n }\n if (this.type != undefined && this.scale != undefined) {\n message.scale = (getMeterScale(this.type, this.scale)\n ?? getUnknownMeterScale(this.scale)).label;\n }\n if (this.targetValue != undefined) {\n message[\"target value\"] = this.targetValue;\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["propertyKey"]
|
|
7
7
|
}
|
|
@@ -79,7 +79,13 @@ function serializeMultiChannelAssociationDestination(nodeIds, endpoints) {
|
|
|
79
79
|
offset += 1;
|
|
80
80
|
for (let i = 0; i < endpoints.length; i++) {
|
|
81
81
|
const endpoint = endpoints[i];
|
|
82
|
-
const destination = typeof endpoint.endpoint === "number" ?
|
|
82
|
+
const destination = typeof endpoint.endpoint === "number" ? (
|
|
83
|
+
// The destination is a single number
|
|
84
|
+
endpoint.endpoint & 127
|
|
85
|
+
) : (
|
|
86
|
+
// The destination is a bit mask
|
|
87
|
+
(0, import_core.encodeBitMask)(endpoint.endpoint, 7)[0] | 128
|
|
88
|
+
);
|
|
83
89
|
payload[offset + 2 * i] = endpoint.nodeId;
|
|
84
90
|
payload[offset + 2 * i + 1] = destination;
|
|
85
91
|
}
|
|
@@ -563,7 +569,9 @@ let MultiChannelAssociationCCRemove = (() => {
|
|
|
563
569
|
return MultiChannelAssociationCCRemove2 = _classThis;
|
|
564
570
|
})();
|
|
565
571
|
let MultiChannelAssociationCCReport = (() => {
|
|
566
|
-
let _classDecorators = [(0, import_CommandClassDecorators.CCCommand)(import_Types.MultiChannelAssociationCommand.Report), (0, import_CommandClassDecorators.ccValueProperty)("maxNodes", import_CCValues_generated.MultiChannelAssociationCCValues.maxNodes, (self) => [self.groupId]), (0, import_CommandClassDecorators.ccValueProperty)("nodeIds", import_CCValues_generated.MultiChannelAssociationCCValues.nodeIds, (self) => [
|
|
572
|
+
let _classDecorators = [(0, import_CommandClassDecorators.CCCommand)(import_Types.MultiChannelAssociationCommand.Report), (0, import_CommandClassDecorators.ccValueProperty)("maxNodes", import_CCValues_generated.MultiChannelAssociationCCValues.maxNodes, (self) => [self.groupId]), (0, import_CommandClassDecorators.ccValueProperty)("nodeIds", import_CCValues_generated.MultiChannelAssociationCCValues.nodeIds, (self) => [
|
|
573
|
+
self.groupId
|
|
574
|
+
]), (0, import_CommandClassDecorators.ccValueProperty)("endpoints", import_CCValues_generated.MultiChannelAssociationCCValues.endpoints, (self) => [self.groupId])];
|
|
567
575
|
let _classDescriptor;
|
|
568
576
|
let _classExtraInitializers = [];
|
|
569
577
|
let _classThis;
|
|
@@ -624,11 +632,7 @@ let MultiChannelAssociationCCReport = (() => {
|
|
|
624
632
|
serialize(ctx) {
|
|
625
633
|
const destinations = serializeMultiChannelAssociationDestination(this.nodeIds, this.endpoints);
|
|
626
634
|
this.payload = import_shared.Bytes.concat([
|
|
627
|
-
[
|
|
628
|
-
this.groupId,
|
|
629
|
-
this.maxNodes,
|
|
630
|
-
this.reportsToFollow
|
|
631
|
-
],
|
|
635
|
+
[this.groupId, this.maxNodes, this.reportsToFollow],
|
|
632
636
|
destinations
|
|
633
637
|
]);
|
|
634
638
|
return super.serialize(ctx);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src_gen/cc/MultiChannelAssociationCC.ts"],
|
|
4
|
-
"sourcesContent": ["import * as __validateArgs from \"./MultiChannelAssociationCC._validateArgs.js\";\nconst { validateArgs_MultiChannelAssociationCCAPI_reportGroupCount, validateArgs_MultiChannelAssociationCCAPI_getGroup, validateArgs_MultiChannelAssociationCCAPI_sendReport, validateArgs_MultiChannelAssociationCCAPI_addDestinations, validateArgs_MultiChannelAssociationCCAPI_removeDestinations } = __validateArgs;\nimport { CommandClasses, type EndpointId, type GetValueDB, MAX_NODES, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, type WithAddress, ZWaveError, ZWaveErrorCodes, encodeBitMask, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, type BytesView, pick } from \"@zwave-js/shared\";\nimport { CCAPI, PhysicalCCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type RefreshValuesContext, type RefreshValuesOptions, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { type AssociationAddress, type EndpointAddress, MultiChannelAssociationCommand, } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport * as ccUtils from \"../lib/utils.js\";\nimport { AssociationCCValues } from \"./AssociationCC.js\";\nimport { MultiChannelAssociationCCValues } from \"./_CCValues.generated.js\";\nexport { MultiChannelAssociationCCValues };\nfunction endpointAddressesToString(endpoints: readonly EndpointAddress[]): string {\n return endpoints\n .map(({ nodeId, endpoint }) => {\n if (typeof endpoint === \"number\") {\n return `${nodeId}:${endpoint}`;\n }\n else {\n return `${nodeId}:[${endpoint.map(String).join(\", \")}]`;\n }\n })\n .join(\", \");\n}\nconst MULTI_CHANNEL_ASSOCIATION_MARKER = 0x00;\nfunction serializeMultiChannelAssociationDestination(nodeIds: number[], endpoints: EndpointAddress[]): Bytes {\n const nodeAddressBytes = nodeIds.length;\n const endpointAddressBytes = endpoints.length * 2;\n const payload = new Bytes(\n // node addresses\n nodeAddressBytes\n // endpoint marker\n + (endpointAddressBytes > 0 ? 1 : 0)\n // endpoints\n + endpointAddressBytes);\n // write node addresses\n for (let i = 0; i < nodeIds.length; i++) {\n payload[i] = nodeIds[i];\n }\n // write endpoint addresses\n if (endpointAddressBytes > 0) {\n let offset = nodeIds.length;\n payload[offset] = MULTI_CHANNEL_ASSOCIATION_MARKER;\n offset += 1;\n for (let i = 0; i < endpoints.length; i++) {\n const endpoint = endpoints[i];\n const destination = typeof endpoint.endpoint === \"number\"\n // The destination is a single number\n ? endpoint.endpoint & 127\n // The destination is a bit mask\n : encodeBitMask(endpoint.endpoint, 7)[0] | 128;\n payload[offset + 2 * i] = endpoint.nodeId;\n payload[offset + 2 * i + 1] = destination;\n }\n }\n return payload;\n}\nfunction deserializeMultiChannelAssociationDestination(data: BytesView): {\n nodeIds: number[];\n endpoints: EndpointAddress[];\n} {\n const nodeIds: number[] = [];\n let endpointOffset = data.length;\n // Scan node ids until we find the marker\n for (let i = 0; i < data.length; i++) {\n if (data[i] === MULTI_CHANNEL_ASSOCIATION_MARKER) {\n endpointOffset = i + 1;\n break;\n }\n nodeIds.push(data[i]);\n }\n const endpoints: EndpointAddress[] = [];\n // Each endpoint destination is a (node id, endpoint) pair; stop when a\n // full pair is no longer available so a dangling trailing byte is ignored\n for (let i = endpointOffset; i + 1 < data.length; i += 2) {\n const nodeId = data[i];\n const isBitMask = !!(data[i + 1] & 128);\n const destination = data[i + 1] & 127;\n const endpoint = isBitMask\n ? parseBitMask(Bytes.from([destination]))\n : destination;\n endpoints.push({ nodeId, endpoint });\n }\n return { nodeIds, endpoints };\n}\n// @noSetValueAPI\n@API(CommandClasses[\"Multi Channel Association\"])\nexport class MultiChannelAssociationCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: MultiChannelAssociationCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case MultiChannelAssociationCommand.Get:\n case MultiChannelAssociationCommand.Set:\n case MultiChannelAssociationCommand.Report:\n case MultiChannelAssociationCommand.Remove:\n case MultiChannelAssociationCommand.SupportedGroupingsGet:\n case MultiChannelAssociationCommand.SupportedGroupingsReport:\n return true; // This is mandatory\n }\n return super.supportsCommand(cmd);\n }\n /**\n * Returns the number of association groups a node supports.\n * Association groups are consecutive, starting at 1.\n */\n public async getGroupCount(): Promise<MaybeNotKnown<number>> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.SupportedGroupingsGet);\n const cc = new MultiChannelAssociationCCSupportedGroupingsGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<MultiChannelAssociationCCSupportedGroupingsReport>(cc, this.commandOptions);\n return response?.groupCount;\n }\n @validateArgs_MultiChannelAssociationCCAPI_reportGroupCount()\n public async reportGroupCount(groupCount: number): Promise<void> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.SupportedGroupingsReport);\n const cc = new MultiChannelAssociationCCSupportedGroupingsReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupCount,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Returns information about an association group.\n */\n @validateArgs_MultiChannelAssociationCCAPI_getGroup()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getGroup(groupId: number) {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.Get);\n const cc = new MultiChannelAssociationCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupId,\n });\n const response = await this.host.sendCommand<MultiChannelAssociationCCReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\"maxNodes\", \"nodeIds\", \"endpoints\"]);\n }\n }\n @validateArgs_MultiChannelAssociationCCAPI_sendReport()\n public async sendReport(options: MultiChannelAssociationCCReportOptions): Promise<void> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.Report);\n const cc = new MultiChannelAssociationCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Adds new nodes or endpoints to an association group\n */\n @validateArgs_MultiChannelAssociationCCAPI_addDestinations()\n public async addDestinations(options: MultiChannelAssociationCCSetOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.Set);\n const cc = new MultiChannelAssociationCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Removes nodes or endpoints from an association group\n */\n @validateArgs_MultiChannelAssociationCCAPI_removeDestinations()\n public async removeDestinations(options: MultiChannelAssociationCCRemoveOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.Remove);\n if (!options.groupId && this.version === 1) {\n // V1 does not support omitting the group, manually remove the destination from all groups\n // We don't want to do too much work, so find out which groups the destination is in\n const currentDestinations = MultiChannelAssociationCC\n .getAllDestinationsCached(this.host, this.endpoint);\n for (const [group, destinations] of currentDestinations) {\n const cc = new MultiChannelAssociationCCRemove({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupId: group,\n nodeIds: destinations\n .filter((d) => d.endpoint != undefined)\n .map((d) => d.nodeId),\n endpoints: destinations.filter((d): d is AssociationAddress & {\n endpoint: number;\n } => d.endpoint != undefined),\n });\n // TODO: evaluate intermediate supervision results\n await this.host.sendCommand(cc, this.commandOptions);\n }\n }\n else if (options.groupId && options.groupId < 0) {\n throw new ZWaveError(\"The group id must not be negative!\", ZWaveErrorCodes.Argument_Invalid);\n }\n else {\n const cc = new MultiChannelAssociationCCRemove({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n }\n}\n@commandClass(CommandClasses[\"Multi Channel Association\"])\n@implementedVersion(5)\n@ccValues(MultiChannelAssociationCCValues)\nexport class MultiChannelAssociationCC extends CommandClass {\n declare ccCommand: MultiChannelAssociationCommand;\n public determineRequiredCCInterviews(): readonly CommandClasses[] {\n // MultiChannelAssociationCC must be interviewed after Z-Wave+ if that is supported\n return [\n ...super.determineRequiredCCInterviews(),\n CommandClasses[\"Z-Wave Plus Info\"],\n // We need information about endpoints to correctly configure the lifeline associations\n CommandClasses[\"Multi Channel\"],\n // AssociationCC will short-circuit if this CC is supported\n CommandClasses.Association,\n ];\n }\n /**\n * Returns the number of association groups reported by the node/endpoint.\n * This only works AFTER the interview process\n */\n public static getGroupCountCached(ctx: GetValueDB, endpoint: EndpointId): number {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MultiChannelAssociationCCValues.groupCount.endpoint(endpoint.index)) || 0;\n }\n /**\n * Returns the number of nodes an association group supports.\n * This only works AFTER the interview process\n */\n public static getMaxNodesCached(ctx: GetValueDB, endpoint: EndpointId, groupId: number): number {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MultiChannelAssociationCCValues.maxNodes(groupId).endpoint(endpoint.index)) ?? 0;\n }\n /**\n * Returns all the destinations of all association groups reported by the node/endpoint.\n * This only works AFTER the interview process\n */\n public static getAllDestinationsCached(ctx: GetValueDB, endpoint: EndpointId): ReadonlyMap<number, readonly AssociationAddress[]> {\n const ret = new Map<number, AssociationAddress[]>();\n const groupCount = this.getGroupCountCached(ctx, endpoint);\n const valueDB = ctx.getValueDB(endpoint.nodeId);\n for (let i = 1; i <= groupCount; i++) {\n const groupDestinations: AssociationAddress[] = [];\n // Add all node destinations\n const nodes = valueDB.getValue<number[]>(MultiChannelAssociationCCValues.nodeIds(i).endpoint(endpoint.index)) ?? [];\n groupDestinations.push(...nodes.map((nodeId) => ({ nodeId })));\n // And all endpoint destinations\n const endpoints = valueDB.getValue<EndpointAddress[]>(MultiChannelAssociationCCValues.endpoints(i).endpoint(endpoint.index)) ?? [];\n for (const ep of endpoints) {\n if (typeof ep.endpoint === \"number\") {\n groupDestinations.push({\n nodeId: ep.nodeId,\n endpoint: ep.endpoint,\n });\n }\n else {\n groupDestinations.push(...ep.endpoint.map((e) => ({\n nodeId: ep.nodeId,\n endpoint: e,\n })));\n }\n }\n ret.set(i, \n // Filter out duplicates\n groupDestinations.filter((addr, index) => index\n === groupDestinations.findIndex(({ nodeId, endpoint }) => nodeId === addr.nodeId\n && endpoint === addr.endpoint)));\n }\n return ret;\n }\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const mcAPI = CCAPI.create(CommandClasses[\"Multi Channel Association\"], ctx, endpoint);\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // First find out how many groups are supported as multi channel\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying number of multi channel association groups...\",\n direction: \"outbound\",\n });\n const mcGroupCount = await mcAPI.getGroupCount();\n if (mcGroupCount != undefined) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `supports ${mcGroupCount} multi channel association groups`,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying multi channel association groups timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n // Query each association group for its members\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // And set up lifeline associations\n await ccUtils.configureLifelineAssociations(ctx, endpoint);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const mcAPI = CCAPI.create(CommandClasses[\"Multi Channel Association\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const assocAPI = CCAPI.create(CommandClasses.Association, ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const mcGroupCount: number = this.getValue(ctx, MultiChannelAssociationCCValues.groupCount) ?? 0;\n // Some devices report more association groups than multi channel association groups, so we need this info here\n const assocGroupCount: number = this.getValue(ctx, AssociationCCValues.groupCount)\n || mcGroupCount;\n // Then query each multi channel association group\n for (let groupId = 1; groupId <= mcGroupCount; groupId++) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying multi channel association group #${groupId}...`,\n direction: \"outbound\",\n });\n const group = await mcAPI.getGroup(groupId);\n if (!group)\n continue;\n const logMessage = `received information for multi channel association group #${groupId}:\nmaximum # of nodes: ${group.maxNodes}\ncurrently assigned nodes: ${group.nodeIds.map(String).join(\", \")}\ncurrently assigned endpoints: ${group.endpoints\n .map(({ nodeId, endpoint }) => {\n if (typeof endpoint === \"number\") {\n return `${nodeId}:${endpoint}`;\n }\n else {\n return `${nodeId}:[${endpoint.map(String).join(\", \")}]`;\n }\n })\n .join(\"\")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n options?.onProgress?.(groupId, mcGroupCount);\n }\n // Check if there are more non-multi-channel association groups we haven't queried yet\n if (assocAPI.isSupported() && assocGroupCount > mcGroupCount) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying additional non-multi-channel association groups...`,\n direction: \"outbound\",\n });\n for (let groupId = mcGroupCount + 1; groupId <= assocGroupCount; groupId++) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying association group #${groupId}...`,\n direction: \"outbound\",\n });\n const group = await assocAPI.getGroup(groupId);\n if (!group)\n continue;\n const logMessage = `received information for association group #${groupId}:\nmaximum # of nodes: ${group.maxNodes}\ncurrently assigned nodes: ${group.nodeIds.map(String).join(\", \")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n }\n }\n}\n// @publicAPI\nexport type MultiChannelAssociationCCSetOptions = {\n groupId: number;\n} & ({\n nodeIds: number[];\n} | {\n endpoints: EndpointAddress[];\n} | {\n nodeIds: number[];\n endpoints: EndpointAddress[];\n});\n@CCCommand(MultiChannelAssociationCommand.Set)\n@useSupervision()\nexport class MultiChannelAssociationCCSet extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCSetOptions>) {\n super(options);\n if (options.groupId < 1) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n this.groupId = options.groupId;\n this.nodeIds = (\"nodeIds\" in options && options.nodeIds) || [];\n if (this.nodeIds.some((n) => n < 1 || n > MAX_NODES)) {\n throw new ZWaveError(`All node IDs must be between 1 and ${MAX_NODES}!`, ZWaveErrorCodes.Argument_Invalid);\n }\n this.endpoints = (\"endpoints\" in options && options.endpoints)\n || [];\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCSet {\n validatePayload(raw.payload.length >= 1);\n const groupId = raw.payload[0];\n const { nodeIds, endpoints } = deserializeMultiChannelAssociationDestination(raw.payload.subarray(1));\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n nodeIds,\n endpoints,\n });\n }\n public groupId: number;\n public nodeIds: number[];\n public endpoints: EndpointAddress[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.groupId],\n serializeMultiChannelAssociationDestination(this.nodeIds, this.endpoints),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"group id\": this.groupId,\n \"node ids\": this.nodeIds.join(\", \"),\n endpoints: endpointAddressesToString(this.endpoints),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelAssociationCCRemoveOptions {\n /** The group from which to remove the nodes. If none is specified, the nodes will be removed from all groups. */\n groupId?: number;\n /** The nodes to remove. If no nodeIds and no endpoint addresses are specified, ALL nodes will be removed. */\n nodeIds?: number[];\n /** The single endpoints to remove. If no nodeIds and no endpoint addresses are specified, ALL will be removed. */\n endpoints?: EndpointAddress[];\n}\n@CCCommand(MultiChannelAssociationCommand.Remove)\n@useSupervision()\nexport class MultiChannelAssociationCCRemove extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCRemoveOptions>) {\n super(options);\n // When removing associations, we allow invalid node IDs.\n // See GH#3606 - it is possible that those exist.\n this.groupId = options.groupId;\n this.nodeIds = options.nodeIds;\n this.endpoints = options.endpoints;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCRemove {\n validatePayload(raw.payload.length >= 1);\n const groupId: number | undefined = raw.payload[0];\n const { nodeIds, endpoints } = deserializeMultiChannelAssociationDestination(raw.payload.subarray(1));\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n nodeIds,\n endpoints,\n });\n }\n public groupId?: number;\n public nodeIds?: number[];\n public endpoints?: EndpointAddress[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.groupId || 0],\n serializeMultiChannelAssociationDestination(this.nodeIds || [], this.endpoints || []),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"group id\": this.groupId || \"(all groups)\",\n };\n if (this.nodeIds) {\n message[\"node ids\"] = this.nodeIds.join(\", \");\n }\n if (this.endpoints) {\n message.endpoints = endpointAddressesToString(this.endpoints);\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelAssociationCCReportOptions {\n groupId: number;\n maxNodes: number;\n nodeIds: number[];\n endpoints: EndpointAddress[];\n reportsToFollow: number;\n}\n@CCCommand(MultiChannelAssociationCommand.Report)\n@ccValueProperty(\"maxNodes\", MultiChannelAssociationCCValues.maxNodes, (self) => [self.groupId])\n@ccValueProperty(\"nodeIds\", MultiChannelAssociationCCValues.nodeIds, (self) => [self.groupId])\n@ccValueProperty(\"endpoints\", MultiChannelAssociationCCValues.endpoints, (self) => [self.groupId])\nexport class MultiChannelAssociationCCReport extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCReportOptions>) {\n super(options);\n this.groupId = options.groupId;\n this.maxNodes = options.maxNodes;\n this.nodeIds = options.nodeIds;\n this.endpoints = options.endpoints;\n this.reportsToFollow = options.reportsToFollow;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCReport {\n validatePayload(raw.payload.length >= 3);\n const groupId = raw.payload[0];\n const maxNodes = raw.payload[1];\n const reportsToFollow = raw.payload[2];\n const { nodeIds, endpoints } = deserializeMultiChannelAssociationDestination(raw.payload.subarray(3));\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n maxNodes,\n nodeIds,\n endpoints,\n reportsToFollow,\n });\n }\n public readonly groupId: number;\n public maxNodes: number;\n public nodeIds: number[];\n public endpoints: EndpointAddress[];\n public reportsToFollow: number;\n public getPartialCCSessionId(): Record<string, any> | undefined {\n // Distinguish sessions by the association group ID\n return { groupId: this.groupId };\n }\n public getRemainingSegments(): number | undefined {\n return this.reportsToFollow;\n }\n public mergePartialCCs(partials: MultiChannelAssociationCCReport[], _ctx: CCParsingContext): Promise<void> {\n // Concat the list of nodes\n this.nodeIds = [...partials, this]\n .map((report) => [...report.nodeIds])\n .reduce((prev, cur) => prev.concat(...cur), []);\n // Concat the list of endpoints\n this.endpoints = [...partials, this]\n .map((report) => [...report.endpoints])\n .reduce((prev, cur) => prev.concat(...cur), []);\n return Promise.resolve();\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const destinations = serializeMultiChannelAssociationDestination(this.nodeIds, this.endpoints);\n this.payload = Bytes.concat([\n [\n this.groupId,\n this.maxNodes,\n this.reportsToFollow,\n ],\n destinations,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"group id\": this.groupId,\n \"maximum # of nodes\": this.maxNodes,\n \"node ids\": this.nodeIds.join(\", \"),\n endpoints: endpointAddressesToString(this.endpoints),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelAssociationCCGetOptions {\n groupId: number;\n}\n@CCCommand(MultiChannelAssociationCommand.Get)\n@expectedCCResponse(MultiChannelAssociationCCReport)\nexport class MultiChannelAssociationCCGet extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCGetOptions>) {\n super(options);\n if (options.groupId < 1) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n this.groupId = options.groupId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCGet {\n validatePayload(raw.payload.length >= 1);\n const groupId = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n });\n }\n public groupId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupId]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"group id\": this.groupId },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelAssociationCCSupportedGroupingsReportOptions {\n groupCount: number;\n}\n@CCCommand(MultiChannelAssociationCommand.SupportedGroupingsReport)\n@ccValueProperty(\"groupCount\", MultiChannelAssociationCCValues.groupCount)\nexport class MultiChannelAssociationCCSupportedGroupingsReport extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCSupportedGroupingsReportOptions>) {\n super(options);\n this.groupCount = options.groupCount;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCSupportedGroupingsReport {\n validatePayload(raw.payload.length >= 1);\n const groupCount = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupCount,\n });\n }\n public readonly groupCount: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupCount]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"group count\": this.groupCount },\n };\n }\n}\n@CCCommand(MultiChannelAssociationCommand.SupportedGroupingsGet)\n@expectedCCResponse(MultiChannelAssociationCCSupportedGroupingsReport)\nexport class MultiChannelAssociationCCSupportedGroupingsGet extends MultiChannelAssociationCC {\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import * as __validateArgs from \"./MultiChannelAssociationCC._validateArgs.js\";\nconst { validateArgs_MultiChannelAssociationCCAPI_reportGroupCount, validateArgs_MultiChannelAssociationCCAPI_getGroup, validateArgs_MultiChannelAssociationCCAPI_sendReport, validateArgs_MultiChannelAssociationCCAPI_addDestinations, validateArgs_MultiChannelAssociationCCAPI_removeDestinations } = __validateArgs;\nimport { CommandClasses, type EndpointId, type GetValueDB, MAX_NODES, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, type WithAddress, ZWaveError, ZWaveErrorCodes, encodeBitMask, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, type BytesView, pick } from \"@zwave-js/shared\";\nimport { CCAPI, PhysicalCCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type RefreshValuesContext, type RefreshValuesOptions, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { type AssociationAddress, type EndpointAddress, MultiChannelAssociationCommand, } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport * as ccUtils from \"../lib/utils.js\";\nimport { AssociationCCValues } from \"./AssociationCC.js\";\nimport { MultiChannelAssociationCCValues } from \"./_CCValues.generated.js\";\nexport { MultiChannelAssociationCCValues };\nfunction endpointAddressesToString(endpoints: readonly EndpointAddress[]): string {\n return endpoints\n .map(({ nodeId, endpoint }) => {\n if (typeof endpoint === \"number\") {\n return `${nodeId}:${endpoint}`;\n }\n else {\n return `${nodeId}:[${endpoint.map(String).join(\", \")}]`;\n }\n })\n .join(\", \");\n}\nconst MULTI_CHANNEL_ASSOCIATION_MARKER = 0x00;\nfunction serializeMultiChannelAssociationDestination(nodeIds: number[], endpoints: EndpointAddress[]): Bytes {\n const nodeAddressBytes = nodeIds.length;\n const endpointAddressBytes = endpoints.length * 2;\n const payload = new Bytes(\n // node addresses\n nodeAddressBytes\n // endpoint marker\n + (endpointAddressBytes > 0 ? 1 : 0)\n // endpoints\n + endpointAddressBytes);\n // write node addresses\n for (let i = 0; i < nodeIds.length; i++) {\n payload[i] = nodeIds[i];\n }\n // write endpoint addresses\n if (endpointAddressBytes > 0) {\n let offset = nodeIds.length;\n payload[offset] = MULTI_CHANNEL_ASSOCIATION_MARKER;\n offset += 1;\n for (let i = 0; i < endpoints.length; i++) {\n const endpoint = endpoints[i];\n const destination = typeof endpoint.endpoint === \"number\"\n ? // The destination is a single number\n endpoint.endpoint & 127\n : // The destination is a bit mask\n encodeBitMask(endpoint.endpoint, 7)[0] | 128;\n payload[offset + 2 * i] = endpoint.nodeId;\n payload[offset + 2 * i + 1] = destination;\n }\n }\n return payload;\n}\nfunction deserializeMultiChannelAssociationDestination(data: BytesView): {\n nodeIds: number[];\n endpoints: EndpointAddress[];\n} {\n const nodeIds: number[] = [];\n let endpointOffset = data.length;\n // Scan node ids until we find the marker\n for (let i = 0; i < data.length; i++) {\n if (data[i] === MULTI_CHANNEL_ASSOCIATION_MARKER) {\n endpointOffset = i + 1;\n break;\n }\n nodeIds.push(data[i]);\n }\n const endpoints: EndpointAddress[] = [];\n // Each endpoint destination is a (node id, endpoint) pair; stop when a\n // full pair is no longer available so a dangling trailing byte is ignored\n for (let i = endpointOffset; i + 1 < data.length; i += 2) {\n const nodeId = data[i];\n const isBitMask = !!(data[i + 1] & 128);\n const destination = data[i + 1] & 127;\n const endpoint = isBitMask\n ? parseBitMask(Bytes.from([destination]))\n : destination;\n endpoints.push({ nodeId, endpoint });\n }\n return { nodeIds, endpoints };\n}\n// @noSetValueAPI\n@API(CommandClasses[\"Multi Channel Association\"])\nexport class MultiChannelAssociationCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: MultiChannelAssociationCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case MultiChannelAssociationCommand.Get:\n case MultiChannelAssociationCommand.Set:\n case MultiChannelAssociationCommand.Report:\n case MultiChannelAssociationCommand.Remove:\n case MultiChannelAssociationCommand.SupportedGroupingsGet:\n case MultiChannelAssociationCommand.SupportedGroupingsReport:\n return true; // This is mandatory\n }\n return super.supportsCommand(cmd);\n }\n /**\n * Returns the number of association groups a node supports.\n * Association groups are consecutive, starting at 1.\n */\n public async getGroupCount(): Promise<MaybeNotKnown<number>> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.SupportedGroupingsGet);\n const cc = new MultiChannelAssociationCCSupportedGroupingsGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<MultiChannelAssociationCCSupportedGroupingsReport>(cc, this.commandOptions);\n return response?.groupCount;\n }\n @validateArgs_MultiChannelAssociationCCAPI_reportGroupCount()\n public async reportGroupCount(groupCount: number): Promise<void> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.SupportedGroupingsReport);\n const cc = new MultiChannelAssociationCCSupportedGroupingsReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupCount,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Returns information about an association group.\n */\n @validateArgs_MultiChannelAssociationCCAPI_getGroup()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getGroup(groupId: number) {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.Get);\n const cc = new MultiChannelAssociationCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupId,\n });\n const response = await this.host.sendCommand<MultiChannelAssociationCCReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\"maxNodes\", \"nodeIds\", \"endpoints\"]);\n }\n }\n @validateArgs_MultiChannelAssociationCCAPI_sendReport()\n public async sendReport(options: MultiChannelAssociationCCReportOptions): Promise<void> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.Report);\n const cc = new MultiChannelAssociationCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Adds new nodes or endpoints to an association group\n */\n @validateArgs_MultiChannelAssociationCCAPI_addDestinations()\n public async addDestinations(options: MultiChannelAssociationCCSetOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.Set);\n const cc = new MultiChannelAssociationCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Removes nodes or endpoints from an association group\n */\n @validateArgs_MultiChannelAssociationCCAPI_removeDestinations()\n public async removeDestinations(options: MultiChannelAssociationCCRemoveOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(MultiChannelAssociationCommand, MultiChannelAssociationCommand.Remove);\n if (!options.groupId && this.version === 1) {\n // V1 does not support omitting the group, manually remove the destination from all groups\n // We don't want to do too much work, so find out which groups the destination is in\n const currentDestinations = MultiChannelAssociationCC.getAllDestinationsCached(this.host, this.endpoint);\n for (const [group, destinations] of currentDestinations) {\n const cc = new MultiChannelAssociationCCRemove({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n groupId: group,\n nodeIds: destinations\n .filter((d) => d.endpoint != undefined)\n .map((d) => d.nodeId),\n endpoints: destinations.filter((d): d is AssociationAddress & {\n endpoint: number;\n } => d.endpoint != undefined),\n });\n // TODO: evaluate intermediate supervision results\n await this.host.sendCommand(cc, this.commandOptions);\n }\n }\n else if (options.groupId && options.groupId < 0) {\n throw new ZWaveError(\"The group id must not be negative!\", ZWaveErrorCodes.Argument_Invalid);\n }\n else {\n const cc = new MultiChannelAssociationCCRemove({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n }\n}\n@commandClass(CommandClasses[\"Multi Channel Association\"])\n@implementedVersion(5)\n@ccValues(MultiChannelAssociationCCValues)\nexport class MultiChannelAssociationCC extends CommandClass {\n declare ccCommand: MultiChannelAssociationCommand;\n public determineRequiredCCInterviews(): readonly CommandClasses[] {\n // MultiChannelAssociationCC must be interviewed after Z-Wave+ if that is supported\n return [\n ...super.determineRequiredCCInterviews(),\n CommandClasses[\"Z-Wave Plus Info\"],\n // We need information about endpoints to correctly configure the lifeline associations\n CommandClasses[\"Multi Channel\"],\n // AssociationCC will short-circuit if this CC is supported\n CommandClasses.Association,\n ];\n }\n /**\n * Returns the number of association groups reported by the node/endpoint.\n * This only works AFTER the interview process\n */\n public static getGroupCountCached(ctx: GetValueDB, endpoint: EndpointId): number {\n return (ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MultiChannelAssociationCCValues.groupCount.endpoint(endpoint.index)) || 0);\n }\n /**\n * Returns the number of nodes an association group supports.\n * This only works AFTER the interview process\n */\n public static getMaxNodesCached(ctx: GetValueDB, endpoint: EndpointId, groupId: number): number {\n return (ctx\n .getValueDB(endpoint.nodeId)\n .getValue(MultiChannelAssociationCCValues.maxNodes(groupId).endpoint(endpoint.index)) ?? 0);\n }\n /**\n * Returns all the destinations of all association groups reported by the node/endpoint.\n * This only works AFTER the interview process\n */\n public static getAllDestinationsCached(ctx: GetValueDB, endpoint: EndpointId): ReadonlyMap<number, readonly AssociationAddress[]> {\n const ret = new Map<number, AssociationAddress[]>();\n const groupCount = this.getGroupCountCached(ctx, endpoint);\n const valueDB = ctx.getValueDB(endpoint.nodeId);\n for (let i = 1; i <= groupCount; i++) {\n const groupDestinations: AssociationAddress[] = [];\n // Add all node destinations\n const nodes = valueDB.getValue<number[]>(MultiChannelAssociationCCValues.nodeIds(i).endpoint(endpoint.index)) ?? [];\n groupDestinations.push(...nodes.map((nodeId) => ({ nodeId })));\n // And all endpoint destinations\n const endpoints = valueDB.getValue<EndpointAddress[]>(MultiChannelAssociationCCValues.endpoints(i).endpoint(endpoint.index)) ?? [];\n for (const ep of endpoints) {\n if (typeof ep.endpoint === \"number\") {\n groupDestinations.push({\n nodeId: ep.nodeId,\n endpoint: ep.endpoint,\n });\n }\n else {\n groupDestinations.push(...ep.endpoint.map((e) => ({\n nodeId: ep.nodeId,\n endpoint: e,\n })));\n }\n }\n ret.set(i, \n // Filter out duplicates\n groupDestinations.filter((addr, index) => index\n === groupDestinations.findIndex(({ nodeId, endpoint }) => nodeId === addr.nodeId\n && endpoint === addr.endpoint)));\n }\n return ret;\n }\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const mcAPI = CCAPI.create(CommandClasses[\"Multi Channel Association\"], ctx, endpoint);\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // First find out how many groups are supported as multi channel\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying number of multi channel association groups...\",\n direction: \"outbound\",\n });\n const mcGroupCount = await mcAPI.getGroupCount();\n if (mcGroupCount != undefined) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `supports ${mcGroupCount} multi channel association groups`,\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying multi channel association groups timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n // Query each association group for its members\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // And set up lifeline associations\n await ccUtils.configureLifelineAssociations(ctx, endpoint);\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const mcAPI = CCAPI.create(CommandClasses[\"Multi Channel Association\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const assocAPI = CCAPI.create(CommandClasses.Association, ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const mcGroupCount: number = this.getValue(ctx, MultiChannelAssociationCCValues.groupCount) ?? 0;\n // Some devices report more association groups than multi channel association groups, so we need this info here\n const assocGroupCount: number = this.getValue(ctx, AssociationCCValues.groupCount) || mcGroupCount;\n // Then query each multi channel association group\n for (let groupId = 1; groupId <= mcGroupCount; groupId++) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying multi channel association group #${groupId}...`,\n direction: \"outbound\",\n });\n const group = await mcAPI.getGroup(groupId);\n if (!group)\n continue;\n const logMessage = `received information for multi channel association group #${groupId}:\nmaximum # of nodes: ${group.maxNodes}\ncurrently assigned nodes: ${group.nodeIds.map(String).join(\", \")}\ncurrently assigned endpoints: ${group.endpoints\n .map(({ nodeId, endpoint }) => {\n if (typeof endpoint === \"number\") {\n return `${nodeId}:${endpoint}`;\n }\n else {\n return `${nodeId}:[${endpoint.map(String).join(\", \")}]`;\n }\n })\n .join(\"\")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n options?.onProgress?.(groupId, mcGroupCount);\n }\n // Check if there are more non-multi-channel association groups we haven't queried yet\n if (assocAPI.isSupported() && assocGroupCount > mcGroupCount) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying additional non-multi-channel association groups...`,\n direction: \"outbound\",\n });\n for (let groupId = mcGroupCount + 1; groupId <= assocGroupCount; groupId++) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying association group #${groupId}...`,\n direction: \"outbound\",\n });\n const group = await assocAPI.getGroup(groupId);\n if (!group)\n continue;\n const logMessage = `received information for association group #${groupId}:\nmaximum # of nodes: ${group.maxNodes}\ncurrently assigned nodes: ${group.nodeIds.map(String).join(\", \")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n }\n }\n }\n}\n// @publicAPI\nexport type MultiChannelAssociationCCSetOptions = {\n groupId: number;\n} & ({\n nodeIds: number[];\n} | {\n endpoints: EndpointAddress[];\n} | {\n nodeIds: number[];\n endpoints: EndpointAddress[];\n});\n@CCCommand(MultiChannelAssociationCommand.Set)\n@useSupervision()\nexport class MultiChannelAssociationCCSet extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCSetOptions>) {\n super(options);\n if (options.groupId < 1) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n this.groupId = options.groupId;\n this.nodeIds = (\"nodeIds\" in options && options.nodeIds) || [];\n if (this.nodeIds.some((n) => n < 1 || n > MAX_NODES)) {\n throw new ZWaveError(`All node IDs must be between 1 and ${MAX_NODES}!`, ZWaveErrorCodes.Argument_Invalid);\n }\n this.endpoints = (\"endpoints\" in options && options.endpoints) || [];\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCSet {\n validatePayload(raw.payload.length >= 1);\n const groupId = raw.payload[0];\n const { nodeIds, endpoints } = deserializeMultiChannelAssociationDestination(raw.payload.subarray(1));\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n nodeIds,\n endpoints,\n });\n }\n public groupId: number;\n public nodeIds: number[];\n public endpoints: EndpointAddress[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.groupId],\n serializeMultiChannelAssociationDestination(this.nodeIds, this.endpoints),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"group id\": this.groupId,\n \"node ids\": this.nodeIds.join(\", \"),\n endpoints: endpointAddressesToString(this.endpoints),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelAssociationCCRemoveOptions {\n /** The group from which to remove the nodes. If none is specified, the nodes will be removed from all groups. */\n groupId?: number;\n /** The nodes to remove. If no nodeIds and no endpoint addresses are specified, ALL nodes will be removed. */\n nodeIds?: number[];\n /** The single endpoints to remove. If no nodeIds and no endpoint addresses are specified, ALL will be removed. */\n endpoints?: EndpointAddress[];\n}\n@CCCommand(MultiChannelAssociationCommand.Remove)\n@useSupervision()\nexport class MultiChannelAssociationCCRemove extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCRemoveOptions>) {\n super(options);\n // When removing associations, we allow invalid node IDs.\n // See GH#3606 - it is possible that those exist.\n this.groupId = options.groupId;\n this.nodeIds = options.nodeIds;\n this.endpoints = options.endpoints;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCRemove {\n validatePayload(raw.payload.length >= 1);\n const groupId: number | undefined = raw.payload[0];\n const { nodeIds, endpoints } = deserializeMultiChannelAssociationDestination(raw.payload.subarray(1));\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n nodeIds,\n endpoints,\n });\n }\n public groupId?: number;\n public nodeIds?: number[];\n public endpoints?: EndpointAddress[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.concat([\n [this.groupId || 0],\n serializeMultiChannelAssociationDestination(this.nodeIds || [], this.endpoints || []),\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"group id\": this.groupId || \"(all groups)\",\n };\n if (this.nodeIds) {\n message[\"node ids\"] = this.nodeIds.join(\", \");\n }\n if (this.endpoints) {\n message.endpoints = endpointAddressesToString(this.endpoints);\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelAssociationCCReportOptions {\n groupId: number;\n maxNodes: number;\n nodeIds: number[];\n endpoints: EndpointAddress[];\n reportsToFollow: number;\n}\n@CCCommand(MultiChannelAssociationCommand.Report)\n@ccValueProperty(\"maxNodes\", MultiChannelAssociationCCValues.maxNodes, (self) => [self.groupId])\n@ccValueProperty(\"nodeIds\", MultiChannelAssociationCCValues.nodeIds, (self) => [\n self.groupId,\n])\n@ccValueProperty(\"endpoints\", MultiChannelAssociationCCValues.endpoints, (self) => [self.groupId])\nexport class MultiChannelAssociationCCReport extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCReportOptions>) {\n super(options);\n this.groupId = options.groupId;\n this.maxNodes = options.maxNodes;\n this.nodeIds = options.nodeIds;\n this.endpoints = options.endpoints;\n this.reportsToFollow = options.reportsToFollow;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCReport {\n validatePayload(raw.payload.length >= 3);\n const groupId = raw.payload[0];\n const maxNodes = raw.payload[1];\n const reportsToFollow = raw.payload[2];\n const { nodeIds, endpoints } = deserializeMultiChannelAssociationDestination(raw.payload.subarray(3));\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n maxNodes,\n nodeIds,\n endpoints,\n reportsToFollow,\n });\n }\n public readonly groupId: number;\n public maxNodes: number;\n public nodeIds: number[];\n public endpoints: EndpointAddress[];\n public reportsToFollow: number;\n public getPartialCCSessionId(): Record<string, any> | undefined {\n // Distinguish sessions by the association group ID\n return { groupId: this.groupId };\n }\n public getRemainingSegments(): number | undefined {\n return this.reportsToFollow;\n }\n public mergePartialCCs(partials: MultiChannelAssociationCCReport[], _ctx: CCParsingContext): Promise<void> {\n // Concat the list of nodes\n this.nodeIds = [...partials, this]\n .map((report) => [...report.nodeIds])\n .reduce((prev, cur) => prev.concat(...cur), []);\n // Concat the list of endpoints\n this.endpoints = [...partials, this]\n .map((report) => [...report.endpoints])\n .reduce((prev, cur) => prev.concat(...cur), []);\n return Promise.resolve();\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const destinations = serializeMultiChannelAssociationDestination(this.nodeIds, this.endpoints);\n this.payload = Bytes.concat([\n [this.groupId, this.maxNodes, this.reportsToFollow],\n destinations,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"group id\": this.groupId,\n \"maximum # of nodes\": this.maxNodes,\n \"node ids\": this.nodeIds.join(\", \"),\n endpoints: endpointAddressesToString(this.endpoints),\n },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelAssociationCCGetOptions {\n groupId: number;\n}\n@CCCommand(MultiChannelAssociationCommand.Get)\n@expectedCCResponse(MultiChannelAssociationCCReport)\nexport class MultiChannelAssociationCCGet extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCGetOptions>) {\n super(options);\n if (options.groupId < 1) {\n throw new ZWaveError(\"The group id must be positive!\", ZWaveErrorCodes.Argument_Invalid);\n }\n this.groupId = options.groupId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCGet {\n validatePayload(raw.payload.length >= 1);\n const groupId = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupId,\n });\n }\n public groupId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupId]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"group id\": this.groupId },\n };\n }\n}\n// @publicAPI\nexport interface MultiChannelAssociationCCSupportedGroupingsReportOptions {\n groupCount: number;\n}\n@CCCommand(MultiChannelAssociationCommand.SupportedGroupingsReport)\n@ccValueProperty(\"groupCount\", MultiChannelAssociationCCValues.groupCount)\nexport class MultiChannelAssociationCCSupportedGroupingsReport extends MultiChannelAssociationCC {\n public constructor(options: WithAddress<MultiChannelAssociationCCSupportedGroupingsReportOptions>) {\n super(options);\n this.groupCount = options.groupCount;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): MultiChannelAssociationCCSupportedGroupingsReport {\n validatePayload(raw.payload.length >= 1);\n const groupCount = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n groupCount,\n });\n }\n public readonly groupCount: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.groupCount]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"group count\": this.groupCount },\n };\n }\n}\n@CCCommand(MultiChannelAssociationCommand.SupportedGroupingsGet)\n@expectedCCResponse(MultiChannelAssociationCCSupportedGroupingsReport)\nexport class MultiChannelAssociationCCSupportedGroupingsGet extends MultiChannelAssociationCC {\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["endpoint"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type ApplicationNodeInformation, CommandClasses, type GenericDeviceClass, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, type SpecificDeviceClass, type WithAddress } from "@zwave-js/core";
|
|
2
2
|
import { Bytes } from "@zwave-js/shared";
|
|
3
3
|
import { CCAPI } from "../lib/API.js";
|
|
4
|
-
import { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext } from "../lib/CommandClass.js";
|
|
4
|
+
import { type CCRaw, CommandClass, CommandRelation, type InterviewContext, type PersistValuesContext } from "../lib/CommandClass.js";
|
|
5
5
|
import { MultiChannelCommand } from "../lib/_Types.js";
|
|
6
6
|
import type { CCEncodingContext, CCParsingContext } from "../lib/traits.js";
|
|
7
7
|
import { MultiChannelCCValues } from "./_CCValues.generated.js";
|
|
@@ -151,6 +151,7 @@ export declare class MultiChannelCCCommandEncapsulation extends MultiChannelCC {
|
|
|
151
151
|
encapsulated: CommandClass;
|
|
152
152
|
/** The destination end point (0-127) or an array of destination end points (1-7) */
|
|
153
153
|
destination: MultiChannelCCDestination;
|
|
154
|
+
protected determineRelation(other: CommandClass): CommandRelation;
|
|
154
155
|
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
155
156
|
toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
|
|
156
157
|
protected computeEncapsulationOverhead(): number;
|
|
@@ -184,6 +185,7 @@ export declare class MultiChannelCCV1CommandEncapsulation extends MultiChannelCC
|
|
|
184
185
|
constructor(options: WithAddress<MultiChannelCCV1CommandEncapsulationOptions>);
|
|
185
186
|
static from(raw: CCRaw, ctx: CCParsingContext): Promise<MultiChannelCCV1CommandEncapsulation>;
|
|
186
187
|
encapsulated: CommandClass;
|
|
188
|
+
protected determineRelation(other: CommandClass): CommandRelation;
|
|
187
189
|
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
188
190
|
protected computeEncapsulationOverhead(): number;
|
|
189
191
|
toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry;
|