@zwave-js/cc 14.0.0-beta.4 → 14.0.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 +381 -266
- package/build/cjs/cc/AlarmSensorCC.js.map +3 -3
- package/build/cjs/cc/AssociationCC.js +669 -503
- package/build/cjs/cc/AssociationCC.js.map +3 -3
- package/build/cjs/cc/AssociationGroupInfoCC.js +633 -492
- package/build/cjs/cc/AssociationGroupInfoCC.js.map +3 -3
- package/build/cjs/cc/BarrierOperatorCC.js +595 -429
- package/build/cjs/cc/BarrierOperatorCC.js.map +3 -3
- package/build/cjs/cc/BasicCC.js +354 -260
- package/build/cjs/cc/BasicCC.js.map +3 -3
- package/build/cjs/cc/BatteryCC.js +427 -345
- package/build/cjs/cc/BatteryCC.js.map +3 -3
- package/build/cjs/cc/BinarySensorCC.js +391 -276
- package/build/cjs/cc/BinarySensorCC.js.map +3 -3
- package/build/cjs/cc/BinarySwitchCC.js +347 -253
- package/build/cjs/cc/BinarySwitchCC.js.map +3 -3
- package/build/cjs/cc/CRC16CC.js +160 -85
- package/build/cjs/cc/CRC16CC.js.map +3 -3
- package/build/cjs/cc/CentralSceneCC.js +459 -324
- package/build/cjs/cc/CentralSceneCC.js.map +3 -3
- package/build/cjs/cc/ClimateControlScheduleCC.js +459 -293
- package/build/cjs/cc/ClimateControlScheduleCC.js.map +3 -3
- package/build/cjs/cc/ClockCC.js +254 -150
- package/build/cjs/cc/ClockCC.js.map +3 -3
- package/build/cjs/cc/ColorSwitchCC.js +758 -610
- package/build/cjs/cc/ColorSwitchCC.js.map +3 -3
- package/build/cjs/cc/ConfigurationCC.js +1700 -1453
- package/build/cjs/cc/ConfigurationCC.js.map +3 -3
- package/build/cjs/cc/DeviceResetLocallyCC.js +125 -49
- package/build/cjs/cc/DeviceResetLocallyCC.js.map +3 -3
- package/build/cjs/cc/DoorLockCC.js +904 -777
- package/build/cjs/cc/DoorLockCC.js.map +3 -3
- package/build/cjs/cc/DoorLockLoggingCC.js +321 -206
- package/build/cjs/cc/DoorLockLoggingCC.js.map +3 -3
- package/build/cjs/cc/EnergyProductionCC.js +249 -160
- package/build/cjs/cc/EnergyProductionCC.js.map +3 -3
- package/build/cjs/cc/EntryControlCC.js +619 -458
- package/build/cjs/cc/EntryControlCC.js.map +3 -3
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js +898 -698
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +3 -3
- package/build/cjs/cc/HailCC.js +57 -11
- package/build/cjs/cc/HailCC.js.map +2 -2
- package/build/cjs/cc/HumidityControlModeCC.js +359 -233
- package/build/cjs/cc/HumidityControlModeCC.js.map +3 -3
- package/build/cjs/cc/HumidityControlOperatingStateCC.js +189 -103
- package/build/cjs/cc/HumidityControlOperatingStateCC.js.map +3 -3
- package/build/cjs/cc/HumidityControlSetpointCC.js +682 -495
- package/build/cjs/cc/HumidityControlSetpointCC.js.map +3 -3
- package/build/cjs/cc/InclusionControllerCC.js +205 -114
- package/build/cjs/cc/InclusionControllerCC.js.map +3 -3
- package/build/cjs/cc/IndicatorCC.js +897 -736
- package/build/cjs/cc/IndicatorCC.js.map +3 -3
- package/build/cjs/cc/IrrigationCC.js +1651 -1405
- package/build/cjs/cc/IrrigationCC.js.map +3 -3
- package/build/cjs/cc/LanguageCC.js +268 -171
- package/build/cjs/cc/LanguageCC.js.map +3 -3
- package/build/cjs/cc/LockCC.js +254 -154
- package/build/cjs/cc/LockCC.js.map +3 -3
- package/build/cjs/cc/ManufacturerProprietaryCC.js +189 -129
- package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerSpecificCC.js +319 -213
- package/build/cjs/cc/ManufacturerSpecificCC.js.map +3 -3
- package/build/cjs/cc/MeterCC.js +827 -707
- package/build/cjs/cc/MeterCC.js.map +3 -3
- package/build/cjs/cc/MultiChannelAssociationCC.js +612 -478
- package/build/cjs/cc/MultiChannelAssociationCC.js.map +3 -3
- package/build/cjs/cc/MultiChannelCC.js +1037 -819
- package/build/cjs/cc/MultiChannelCC.js.map +3 -3
- package/build/cjs/cc/MultiCommandCC.js +172 -97
- package/build/cjs/cc/MultiCommandCC.js.map +3 -3
- package/build/cjs/cc/MultilevelSensorCC.js +589 -449
- package/build/cjs/cc/MultilevelSensorCC.js.map +3 -3
- package/build/cjs/cc/MultilevelSwitchCC.js +587 -439
- package/build/cjs/cc/MultilevelSwitchCC.js.map +3 -3
- package/build/cjs/cc/NoOperationCC.js +89 -27
- package/build/cjs/cc/NoOperationCC.js.map +2 -2
- package/build/cjs/cc/NodeNamingCC.js +417 -277
- package/build/cjs/cc/NodeNamingCC.js.map +3 -3
- package/build/cjs/cc/NotificationCC.js +972 -818
- package/build/cjs/cc/NotificationCC.js.map +3 -3
- package/build/cjs/cc/PowerlevelCC.js +450 -303
- package/build/cjs/cc/PowerlevelCC.js.map +3 -3
- package/build/cjs/cc/ProtectionCC.js +686 -494
- package/build/cjs/cc/ProtectionCC.js.map +3 -3
- package/build/cjs/cc/SceneActivationCC.js +165 -97
- package/build/cjs/cc/SceneActivationCC.js.map +3 -3
- package/build/cjs/cc/SceneActuatorConfigurationCC.js +346 -243
- package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +3 -3
- package/build/cjs/cc/SceneControllerConfigurationCC.js +401 -298
- package/build/cjs/cc/SceneControllerConfigurationCC.js.map +3 -3
- package/build/cjs/cc/ScheduleEntryLockCC.js +1552 -1272
- package/build/cjs/cc/ScheduleEntryLockCC.js.map +3 -3
- package/build/cjs/cc/Security2CC.js +1483 -1219
- package/build/cjs/cc/Security2CC.js.map +3 -3
- package/build/cjs/cc/SecurityCC.js +839 -619
- package/build/cjs/cc/SecurityCC.js.map +3 -3
- package/build/cjs/cc/SoundSwitchCC.js +707 -515
- package/build/cjs/cc/SoundSwitchCC.js.map +3 -3
- package/build/cjs/cc/SupervisionCC.js +327 -237
- package/build/cjs/cc/SupervisionCC.js.map +3 -3
- package/build/cjs/cc/ThermostatFanModeCC.js +386 -263
- package/build/cjs/cc/ThermostatFanModeCC.js.map +3 -3
- package/build/cjs/cc/ThermostatFanStateCC.js +192 -106
- package/build/cjs/cc/ThermostatFanStateCC.js.map +3 -3
- package/build/cjs/cc/ThermostatModeCC.js +425 -302
- package/build/cjs/cc/ThermostatModeCC.js.map +3 -3
- package/build/cjs/cc/ThermostatOperatingStateCC.js +188 -102
- package/build/cjs/cc/ThermostatOperatingStateCC.js.map +3 -3
- package/build/cjs/cc/ThermostatSetbackCC.js +277 -173
- package/build/cjs/cc/ThermostatSetbackCC.js.map +3 -3
- package/build/cjs/cc/ThermostatSetpointCC.js +645 -491
- package/build/cjs/cc/ThermostatSetpointCC.js.map +3 -3
- package/build/cjs/cc/TimeCC.js +515 -353
- package/build/cjs/cc/TimeCC.js.map +3 -3
- package/build/cjs/cc/TimeParametersCC.js +302 -202
- package/build/cjs/cc/TimeParametersCC.js.map +3 -3
- package/build/cjs/cc/TransportServiceCC.js +433 -315
- package/build/cjs/cc/TransportServiceCC.js.map +3 -3
- package/build/cjs/cc/UserCodeCC.js +1385 -1102
- package/build/cjs/cc/UserCodeCC.js.map +3 -3
- package/build/cjs/cc/VersionCC.js +696 -562
- package/build/cjs/cc/VersionCC.js.map +3 -3
- package/build/cjs/cc/WakeUpCC.js +499 -346
- package/build/cjs/cc/WakeUpCC.js.map +3 -3
- package/build/cjs/cc/WindowCoveringCC.js +626 -478
- package/build/cjs/cc/WindowCoveringCC.js.map +3 -3
- package/build/cjs/cc/ZWaveLongRangeCC.js +57 -10
- package/build/cjs/cc/ZWaveLongRangeCC.js.map +2 -2
- package/build/cjs/cc/ZWavePlusCC.js +233 -159
- package/build/cjs/cc/ZWavePlusCC.js.map +3 -3
- package/build/cjs/cc/ZWaveProtocolCC.js +1515 -948
- package/build/cjs/cc/ZWaveProtocolCC.js.map +3 -3
- package/build/cjs/cc/manufacturerProprietary/Decorators.d.ts +4 -4
- package/build/cjs/cc/manufacturerProprietary/Decorators.js.map +1 -1
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.js +395 -274
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +3 -3
- package/build/cjs/lib/CommandClassDecorators.d.ts +11 -15
- package/build/cjs/lib/CommandClassDecorators.js +19 -20
- package/build/cjs/lib/CommandClassDecorators.js.map +2 -2
- package/build/cjs/lib/Security2/Extension.d.ts +1 -1
- package/build/cjs/lib/Security2/Extension.js +217 -126
- package/build/cjs/lib/Security2/Extension.js.map +3 -3
- package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
- package/build/esm/cc/AlarmSensorCC.js +389 -291
- 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 +678 -537
- 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 +659 -539
- 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 +634 -493
- package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
- package/build/esm/cc/BasicCC.d.ts.map +1 -1
- package/build/esm/cc/BasicCC.js +380 -302
- package/build/esm/cc/BasicCC.js.map +1 -1
- package/build/esm/cc/BatteryCC.d.ts.map +1 -1
- package/build/esm/cc/BatteryCC.js +449 -384
- 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 +395 -297
- package/build/esm/cc/BinarySensorCC.js.map +1 -1
- package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySwitchCC.js +353 -274
- package/build/esm/cc/BinarySwitchCC.js.map +1 -1
- package/build/esm/cc/CRC16CC.js +162 -98
- 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 +465 -351
- 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 +454 -313
- package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
- package/build/esm/cc/ClockCC.js +248 -159
- 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 +802 -677
- package/build/esm/cc/ColorSwitchCC.js.map +1 -1
- package/build/esm/cc/ConfigurationCC.js +1899 -1687
- package/build/esm/cc/ConfigurationCC.js.map +1 -1
- package/build/esm/cc/DeviceResetLocallyCC.js +124 -59
- 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 +951 -849
- package/build/esm/cc/DoorLockCC.js.map +1 -1
- package/build/esm/cc/DoorLockLoggingCC.d.ts.map +1 -1
- package/build/esm/cc/DoorLockLoggingCC.js +316 -218
- package/build/esm/cc/DoorLockLoggingCC.js.map +1 -1
- package/build/esm/cc/EnergyProductionCC.js +240 -164
- package/build/esm/cc/EnergyProductionCC.js.map +1 -1
- package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
- package/build/esm/cc/EntryControlCC.js +629 -493
- 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 +938 -769
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -1
- package/build/esm/cc/HailCC.js +51 -12
- package/build/esm/cc/HailCC.js.map +1 -1
- package/build/esm/cc/HumidityControlModeCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlModeCC.js +357 -250
- package/build/esm/cc/HumidityControlModeCC.js.map +1 -1
- package/build/esm/cc/HumidityControlOperatingStateCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlOperatingStateCC.js +182 -109
- package/build/esm/cc/HumidityControlOperatingStateCC.js.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.js +706 -546
- package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
- package/build/esm/cc/InclusionControllerCC.js +197 -119
- package/build/esm/cc/InclusionControllerCC.js.map +1 -1
- package/build/esm/cc/IndicatorCC.js +973 -835
- 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 +1697 -1496
- package/build/esm/cc/IrrigationCC.js.map +1 -1
- package/build/esm/cc/LanguageCC.d.ts.map +1 -1
- package/build/esm/cc/LanguageCC.js +266 -184
- package/build/esm/cc/LanguageCC.js.map +1 -1
- package/build/esm/cc/LockCC.d.ts.map +1 -1
- package/build/esm/cc/LockCC.js +247 -162
- package/build/esm/cc/LockCC.js.map +1 -1
- package/build/esm/cc/ManufacturerProprietaryCC.js +192 -141
- package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.js +312 -223
- 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 +896 -795
- 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 +631 -518
- package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
- package/build/esm/cc/MultiChannelCC.d.ts.map +1 -1
- package/build/esm/cc/MultiChannelCC.js +1106 -921
- package/build/esm/cc/MultiChannelCC.js.map +1 -1
- package/build/esm/cc/MultiCommandCC.js +166 -102
- package/build/esm/cc/MultiCommandCC.js.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.js +616 -497
- package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
- package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/MultilevelSwitchCC.js +621 -496
- package/build/esm/cc/MultilevelSwitchCC.js.map +1 -1
- package/build/esm/cc/NoOperationCC.js +82 -29
- package/build/esm/cc/NoOperationCC.js.map +1 -1
- package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
- package/build/esm/cc/NodeNamingCC.js +413 -294
- package/build/esm/cc/NodeNamingCC.js.map +1 -1
- package/build/esm/cc/NotificationCC.d.ts.map +1 -1
- package/build/esm/cc/NotificationCC.js +1097 -966
- package/build/esm/cc/NotificationCC.js.map +1 -1
- package/build/esm/cc/PowerlevelCC.js +437 -311
- package/build/esm/cc/PowerlevelCC.js.map +1 -1
- package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
- package/build/esm/cc/ProtectionCC.js +704 -543
- package/build/esm/cc/ProtectionCC.js.map +1 -1
- package/build/esm/cc/SceneActivationCC.d.ts.map +1 -1
- package/build/esm/cc/SceneActivationCC.js +157 -100
- package/build/esm/cc/SceneActivationCC.js.map +1 -1
- package/build/esm/cc/SceneActuatorConfigurationCC.js +357 -269
- package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -1
- package/build/esm/cc/SceneControllerConfigurationCC.js +434 -346
- 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 +1596 -1357
- package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
- package/build/esm/cc/Security2CC.js +1633 -1406
- package/build/esm/cc/Security2CC.js.map +1 -1
- package/build/esm/cc/SecurityCC.js +876 -687
- package/build/esm/cc/SecurityCC.js.map +1 -1
- package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/SoundSwitchCC.js +689 -526
- package/build/esm/cc/SoundSwitchCC.js.map +1 -1
- package/build/esm/cc/SupervisionCC.js +349 -272
- 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 +388 -284
- package/build/esm/cc/ThermostatFanModeCC.js.map +1 -1
- package/build/esm/cc/ThermostatFanStateCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatFanStateCC.js +184 -111
- package/build/esm/cc/ThermostatFanStateCC.js.map +1 -1
- package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatModeCC.js +435 -331
- 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 +180 -107
- package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetbackCC.js +274 -185
- package/build/esm/cc/ThermostatSetbackCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.js +674 -543
- package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
- package/build/esm/cc/TimeCC.js +499 -360
- package/build/esm/cc/TimeCC.js.map +1 -1
- package/build/esm/cc/TimeParametersCC.d.ts.map +1 -1
- package/build/esm/cc/TimeParametersCC.js +296 -211
- package/build/esm/cc/TimeParametersCC.js.map +1 -1
- package/build/esm/cc/TransportServiceCC.js +464 -363
- 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 +1443 -1205
- package/build/esm/cc/UserCodeCC.js.map +1 -1
- package/build/esm/cc/VersionCC.d.ts.map +1 -1
- package/build/esm/cc/VersionCC.js +744 -635
- package/build/esm/cc/VersionCC.js.map +1 -1
- package/build/esm/cc/WakeUpCC.d.ts.map +1 -1
- package/build/esm/cc/WakeUpCC.js +494 -364
- package/build/esm/cc/WakeUpCC.js.map +1 -1
- package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
- package/build/esm/cc/WindowCoveringCC.js +655 -530
- package/build/esm/cc/WindowCoveringCC.js.map +1 -1
- package/build/esm/cc/ZWaveLongRangeCC.js +51 -11
- package/build/esm/cc/ZWaveLongRangeCC.js.map +1 -1
- package/build/esm/cc/ZWavePlusCC.d.ts.map +1 -1
- package/build/esm/cc/ZWavePlusCC.js +223 -162
- package/build/esm/cc/ZWavePlusCC.js.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.js +1443 -953
- package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
- package/build/esm/cc/manufacturerProprietary/Decorators.d.ts +4 -4
- package/build/esm/cc/manufacturerProprietary/Decorators.d.ts.map +1 -1
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js +390 -286
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
- package/build/esm/lib/CommandClassDecorators.d.ts +11 -15
- package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -1
- package/build/esm/lib/CommandClassDecorators.js +24 -24
- package/build/esm/lib/CommandClassDecorators.js.map +1 -1
- package/build/esm/lib/Security2/Extension.d.ts +1 -1
- package/build/esm/lib/Security2/Extension.d.ts.map +1 -1
- package/build/esm/lib/Security2/Extension.js +207 -123
- package/build/esm/lib/Security2/Extension.js.map +1 -1
- package/package.json +6 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cc/MultilevelSensorCC.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\ttype WithAddress,\n\tencodeBitMask,\n\tgetSensor,\n\tgetSensorName,\n\tgetSensorScale,\n\tgetUnknownScale,\n\ttimespan,\n} from \"@zwave-js/core\";\nimport type {\n\tControlsCC,\n\tEndpointId,\n\tGetEndpoint,\n\tMessageOrCCLogEntry,\n\tMessageRecord,\n\tNodeId,\n\tScale,\n\tSinglecastCC,\n\tSupervisionResult,\n\tSupportsCC,\n\tValueID,\n} from \"@zwave-js/core/safe\";\nimport {\n\tCommandClasses,\n\ttype MaybeNotKnown,\n\tMessagePriority,\n\tValueMetadata,\n\tencodeFloatWithScale,\n\tparseBitMask,\n\tparseFloatWithScale,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetDeviceConfig,\n\tGetNode,\n\tGetSupportedCCVersion,\n\tGetUserPreferences,\n\tGetValueDB,\n\tLogNode,\n} from \"@zwave-js/host/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { type AllOrNone, num2hex } from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\tPhysicalCCAPI,\n\ttype PollValueImplementation,\n\tthrowUnsupportedProperty,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\ttype CCResponsePredicate,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n\tgetEffectiveCCVersion,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValue,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport {\n\tMultilevelSensorCommand,\n\ttype MultilevelSensorValue,\n} from \"../lib/_Types.js\";\n\nexport const MultilevelSensorCCValues = Object.freeze({\n\t...V.defineStaticCCValues(CommandClasses[\"Multilevel Sensor\"], {\n\t\t...V.staticProperty(\"supportedSensorTypes\", undefined, {\n\t\t\tinternal: true,\n\t\t}),\n\t}),\n\n\t...V.defineDynamicCCValues(CommandClasses[\"Multilevel Sensor\"], {\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"supportedScales\",\n\t\t\t\"supportedScales\",\n\t\t\t(sensorType: number) => sensorType,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"supportedScales\"\n\t\t\t\t&& typeof propertyKey === \"number\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\n\t\t...V.dynamicPropertyWithName(\n\t\t\t\"value\",\n\t\t\t// This should have been the sensor type, but it is too late to change now\n\t\t\t// Maybe we can migrate this without breaking in the future\n\t\t\t(sensorTypeName: string) => sensorTypeName,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\ttypeof property === \"string\"\n\t\t\t\t&& property !== \"supportedSensorTypes\"\n\t\t\t\t&& property !== \"supportedScales\"\n\t\t\t\t&& propertyKey == undefined,\n\t\t\t(sensorTypeName: string) => ({\n\t\t\t\t// Just the base metadata, to be extended using a config manager\n\t\t\t\t...ValueMetadata.ReadOnlyNumber,\n\t\t\t\tlabel: sensorTypeName,\n\t\t\t} as const),\n\t\t),\n\t}),\n});\n\n/**\n * Determine the scale to use to query a sensor reading. Uses the user-preferred scale if given,\n * followed by the most recently used scale, otherwile falls back to the first supported one.\n */\nfunction getPreferredSensorScale(\n\tctx: GetValueDB & GetUserPreferences & LogNode,\n\tnodeId: number,\n\tendpointIndex: number,\n\tsensorType: number,\n\tsupportedScales: readonly number[],\n): number {\n\tconst preferences = ctx.getUserPreferences();\n\tconst sensor = getSensor(sensorType);\n\t// If the sensor type is unknown, we have no default. Use the user-provided scale or 0\n\tif (!sensor) {\n\t\tconst preferred = preferences?.scales[sensorType];\n\t\t// We cannot look up strings for unknown sensor types, so this must be a number or we use the fallback\n\t\tif (typeof preferred !== \"number\") return 0;\n\t\treturn preferred;\n\t}\n\n\t// Look up the preference for the scale\n\tlet preferred: number | string | undefined;\n\t// Named scales apply to multiple sensor types. To be able to override the scale for single types\n\t// we need to look at the preferences by sensor type first\n\tpreferred = preferences?.scales[sensorType];\n\t// If the scale is named, we can then try to use the named preference\n\tconst scaleGroupName = sensor.scaleGroupName;\n\tif (preferred == undefined && scaleGroupName) {\n\t\tpreferred = preferences?.scales[scaleGroupName];\n\t}\n\t// Then attempt reading the scale from the corresponding value\n\tif (preferred == undefined) {\n\t\tconst sensorName = getSensorName(sensorType);\n\t\tconst sensorValue = MultilevelSensorCCValues.value(sensorName);\n\t\tconst metadata = ctx\n\t\t\t.tryGetValueDB(nodeId)\n\t\t\t?.getMetadata(sensorValue.endpoint(endpointIndex));\n\t\tconst scale = metadata?.ccSpecific?.scale;\n\t\tif (typeof scale === \"number\" && supportedScales.includes(scale)) {\n\t\t\tpreferred = scale;\n\t\t\tctx.logNode(nodeId, {\n\t\t\t\tendpoint: endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`No scale preference for sensor type ${sensorType}, using the last-used scale ${preferred}`,\n\t\t\t});\n\t\t}\n\t}\n\t// Then fall back to the first supported scale\n\tif (preferred == undefined) {\n\t\tpreferred = supportedScales[0] ?? 0;\n\t\tctx.logNode(nodeId, {\n\t\t\tendpoint: endpointIndex,\n\t\t\tmessage:\n\t\t\t\t`No scale preference for sensor type ${sensorType}, using the first supported scale ${preferred}`,\n\t\t});\n\t\treturn preferred;\n\t}\n\n\t// If the scale name or unit was given, try to look it up\n\tif (typeof preferred === \"string\") {\n\t\tfor (const [key, scale] of Object.entries(sensor.scales)) {\n\t\t\tif (scale.label === preferred || scale.unit === preferred) {\n\t\t\t\tpreferred = parseInt(key, 10);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof preferred === \"string\") {\n\t\t// Looking up failed\n\t\tctx.logNode(nodeId, {\n\t\t\tendpoint: endpointIndex,\n\t\t\tmessage:\n\t\t\t\t`Preferred scale \"${preferred}\" for sensor type ${sensorType} not found, using the first supported scale ${\n\t\t\t\t\tsupportedScales[0] ?? 0\n\t\t\t\t}`,\n\t\t});\n\t\treturn supportedScales[0] ?? 0;\n\t}\n\n\t// We have a numeric scale key, nothing to look up. Make sure it is supported though\n\tif (!supportedScales.length) {\n\t\t// No info about supported scales, just use the preferred one\n\t\treturn preferred;\n\t} else if (!supportedScales.includes(preferred)) {\n\t\tctx.logNode(nodeId, {\n\t\t\tendpoint: endpointIndex,\n\t\t\tmessage:\n\t\t\t\t`Preferred scale ${preferred} not supported for sensor type ${sensorType}, using the first supported scale`,\n\t\t});\n\t\treturn supportedScales[0];\n\t} else {\n\t\treturn preferred;\n\t}\n}\n\n// @noSetValueAPI This CC is read-only\n\n@API(CommandClasses[\"Multilevel Sensor\"])\nexport class MultilevelSensorCCAPI extends PhysicalCCAPI {\n\tpublic supportsCommand(\n\t\tcmd: MultilevelSensorCommand,\n\t): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase MultilevelSensorCommand.Get:\n\t\t\tcase MultilevelSensorCommand.Report:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase MultilevelSensorCommand.GetSupportedSensor:\n\t\t\tcase MultilevelSensorCommand.GetSupportedScale:\n\t\t\t\treturn this.version >= 5;\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: MultilevelSensorCCAPI, { property }) {\n\t\t\t// Look up the necessary information\n\t\t\tconst valueId: ValueID = {\n\t\t\t\tcommandClass: CommandClasses[\"Multilevel Sensor\"],\n\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\tproperty,\n\t\t\t};\n\t\t\tconst ccSpecific = this.tryGetValueDB()?.getMetadata(valueId)\n\t\t\t\t?.ccSpecific;\n\t\t\tif (!ccSpecific) {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\n\t\t\tconst { sensorType, scale } = ccSpecific;\n\t\t\treturn this.get(sensorType, scale);\n\t\t};\n\t}\n\n\t/** Query the default sensor value */\n\tpublic async get(): Promise<\n\t\tMaybeNotKnown<MultilevelSensorValue & { type: number }>\n\t>;\n\t/** Query the sensor value for the given sensor type using the preferred sensor scale */\n\tpublic async get(\n\t\tsensorType: number,\n\t): Promise<MaybeNotKnown<MultilevelSensorValue>>;\n\t/** Query the sensor value for the given sensor type using the given sensor scale */\n\tpublic async get(\n\t\tsensorType: number,\n\t\tscale: number,\n\t): Promise<MaybeNotKnown<number>>;\n\n\t@validateArgs()\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async get(sensorType?: number, scale?: number) {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSensorCommand,\n\t\t\tMultilevelSensorCommand.Get,\n\t\t);\n\n\t\t// Figure out the preferred scale if none was given\n\t\tlet preferredScale: number | undefined;\n\t\tif (sensorType != undefined && scale == undefined) {\n\t\t\tconst supportedScales: readonly number[] =\n\t\t\t\tthis.tryGetValueDB()?.getValue({\n\t\t\t\t\tcommandClass: this.ccId,\n\t\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\t\tproperty: \"supportedScales\",\n\t\t\t\t\tpropertyKey: sensorType,\n\t\t\t\t}) ?? [];\n\n\t\t\tpreferredScale = getPreferredSensorScale(\n\t\t\t\tthis.host,\n\t\t\t\tthis.endpoint.nodeId,\n\t\t\t\tthis.endpoint.index,\n\t\t\t\tsensorType,\n\t\t\t\tsupportedScales,\n\t\t\t);\n\t\t}\n\n\t\tconst cc = new MultilevelSensorCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsensorType: sensorType!,\n\t\t\tscale: (scale ?? preferredScale)!,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSensorCCReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (!response) return;\n\n\t\tconst responseScale = getSensorScale(response.type, response.scale);\n\n\t\tif (sensorType == undefined) {\n\t\t\t// Overload #1: return the full response\n\t\t\treturn {\n\t\t\t\ttype: response.type,\n\t\t\t\tvalue: response.value,\n\t\t\t\tscale: responseScale,\n\t\t\t};\n\t\t} else if (scale == undefined) {\n\t\t\t// Overload #2: return value and scale\n\t\t\treturn {\n\t\t\t\tvalue: response.value,\n\t\t\t\tscale: responseScale,\n\t\t\t};\n\t\t} else {\n\t\t\t// Overload #3: return only the value\n\t\t\treturn response.value;\n\t\t}\n\t}\n\n\tpublic async getSupportedSensorTypes(): Promise<\n\t\tMaybeNotKnown<readonly number[]>\n\t> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSensorCommand,\n\t\t\tMultilevelSensorCommand.GetSupportedSensor,\n\t\t);\n\n\t\tconst cc = new MultilevelSensorCCGetSupportedSensor({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSensorCCSupportedSensorReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.supportedSensorTypes;\n\t}\n\n\t@validateArgs()\n\tpublic async getSupportedScales(\n\t\tsensorType: number,\n\t): Promise<MaybeNotKnown<readonly number[]>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSensorCommand,\n\t\t\tMultilevelSensorCommand.GetSupportedScale,\n\t\t);\n\n\t\tconst cc = new MultilevelSensorCCGetSupportedScale({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsensorType,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSensorCCSupportedScaleReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.supportedScales;\n\t}\n\n\t@validateArgs()\n\tpublic async sendReport(\n\t\tsensorType: number,\n\t\tscale: number | Scale,\n\t\tvalue: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSensorCommand,\n\t\t\tMultilevelSensorCommand.Report,\n\t\t);\n\n\t\tconst cc = new MultilevelSensorCCReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\ttype: sensorType,\n\t\t\tscale,\n\t\t\tvalue,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n}\n\n@commandClass(CommandClasses[\"Multilevel Sensor\"])\n@implementedVersion(11)\n@ccValues(MultilevelSensorCCValues)\nexport class MultilevelSensorCC extends CommandClass {\n\tdeclare ccCommand: MultilevelSensorCommand;\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multilevel Sensor\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tif (api.version >= 5) {\n\t\t\t// Query the supported sensor types\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"retrieving supported sensor types...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst sensorTypes = await api.getSupportedSensorTypes();\n\t\t\tif (sensorTypes) {\n\t\t\t\tconst logMessage = \"received supported sensor types:\\n\"\n\t\t\t\t\t+ sensorTypes\n\t\t\t\t\t\t.map((t) => getSensorName(t))\n\t\t\t\t\t\t.map((name) => `\u00B7 ${name}`)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"Querying supported sensor types timed out, skipping interview...\",\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// As well as the supported scales for each sensor\n\n\t\t\tfor (const type of sensorTypes) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `querying supported scales for ${\n\t\t\t\t\t\tgetSensorName(type)\n\t\t\t\t\t} sensor`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tconst sensorScales = await api.getSupportedScales(type);\n\t\t\t\tif (sensorScales) {\n\t\t\t\t\tconst logMessage = \"received supported scales:\\n\"\n\t\t\t\t\t\t+ sensorScales\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t\t(getSensorScale(type, s)\n\t\t\t\t\t\t\t\t\t\t?? getUnknownScale(s)).label,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((name) => `\u00B7 ${name}`)\n\t\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"Querying supported scales timed out, skipping interview...\",\n\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multilevel Sensor\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\tif (api.version <= 4) {\n\t\t\t// Sensors up to V4 only support a single value\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"querying current sensor reading...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst mlsResponse = await api.get();\n\t\t\tif (mlsResponse) {\n\t\t\t\tconst sensorScale = getSensorScale(\n\t\t\t\t\tmlsResponse.type,\n\t\t\t\t\tmlsResponse.scale.key,\n\t\t\t\t);\n\t\t\t\tconst logMessage = `received current sensor reading:\nsensor type: ${getSensorName(mlsResponse.type)}\nvalue: ${mlsResponse.value}${\n\t\t\t\t\tsensorScale?.unit ? ` ${sensorScale.unit}` : \"\"\n\t\t\t\t}`;\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// Query all sensor values\n\t\t\tconst sensorTypes: readonly number[] = valueDB.getValue({\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tproperty: \"supportedSensorTypes\",\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t}) || [];\n\n\t\t\tfor (const type of sensorTypes) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `querying ${\n\t\t\t\t\t\tgetSensorName(type)\n\t\t\t\t\t} sensor reading...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\n\t\t\t\tconst value = await api.get(type);\n\t\t\t\tif (value) {\n\t\t\t\t\tconst logMessage = `received current ${\n\t\t\t\t\t\tgetSensorName(type)\n\t\t\t\t\t} sensor reading: ${value.value} ${value.scale.unit || \"\"}`;\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic shouldRefreshValues(\n\t\tthis: SinglecastCC<this>,\n\t\tctx:\n\t\t\t& GetValueDB\n\t\t\t& GetSupportedCCVersion\n\t\t\t& GetDeviceConfig\n\t\t\t& GetNode<\n\t\t\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t\t\t>,\n\t): boolean {\n\t\t// Poll the device when all of the supported values were last updated longer than 6 hours ago.\n\t\t// This may lead to some values not being updated, but the user may have disabled some unnecessary\n\t\t// reports to reduce traffic.\n\t\tconst valueDB = ctx.tryGetValueDB(this.nodeId);\n\t\tif (!valueDB) return true;\n\n\t\tconst values = this.getDefinedValueIDs(ctx).filter((v) =>\n\t\t\tMultilevelSensorCCValues.value.is(v)\n\t\t);\n\t\treturn values.every((v) => {\n\t\t\tconst lastUpdated = valueDB.getTimestamp(v);\n\t\t\treturn (\n\t\t\t\tlastUpdated == undefined\n\t\t\t\t|| Date.now() - lastUpdated > timespan.hours(6)\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Returns which sensor types are supported.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getSupportedSensorTypesCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<number[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(\n\t\t\t\tMultilevelSensorCCValues.supportedSensorTypes.endpoint(\n\t\t\t\t\tendpoint.index,\n\t\t\t\t),\n\t\t\t);\n\t}\n\n\t/**\n\t * Returns which scales are supported for a given sensor type.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getSupportedScalesCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t\tsensorType: number,\n\t): MaybeNotKnown<number[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(\n\t\t\t\tMultilevelSensorCCValues.supportedScales(sensorType).endpoint(\n\t\t\t\t\tendpoint.index,\n\t\t\t\t),\n\t\t\t);\n\t}\n\n\tpublic translatePropertyKey(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\t// TODO: check this\n\t\tif (property === \"values\" && typeof propertyKey === \"number\") {\n\t\t\tconst sensor = getSensor(propertyKey);\n\t\t\tif (sensor) return sensor.label;\n\t\t}\n\t\treturn super.translatePropertyKey(ctx, property, propertyKey);\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSensorCCReportOptions {\n\ttype: number;\n\tscale: number | Scale;\n\tvalue: number;\n}\n\n@CCCommand(MultilevelSensorCommand.Report)\n@useSupervision()\nexport class MultilevelSensorCCReport extends MultilevelSensorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.value = options.value;\n\t\tthis.scale = typeof options.scale === \"number\"\n\t\t\t? options.scale\n\t\t\t: options.scale.key;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst type = raw.payload[0];\n\n\t\t// parseFloatWithScale does its own validation\n\t\tconst { value, scale } = parseFloatWithScale(\n\t\t\traw.payload.subarray(1),\n\t\t);\n\n\t\treturn new MultilevelSensorCCReport({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\tvalue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tconst sensor = getSensor(this.type);\n\t\tconst scale = getSensorScale(\n\t\t\tthis.type,\n\t\t\tthis.scale,\n\t\t) ?? getUnknownScale(this.scale);\n\n\t\t// Filter out unknown sensor types and scales, unless the strict validation is disabled\n\t\tconst measurementValidation = !ctx.getDeviceConfig?.(\n\t\t\tthis.nodeId as number,\n\t\t)?.compat?.disableStrictMeasurementValidation;\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\n\t\tif (measurementValidation) {\n\t\t\t// Filter out unsupported sensor types and scales if possible\n\t\t\tif (ccVersion >= 5) {\n\t\t\t\tconst supportedSensorTypes = this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMultilevelSensorCCValues.supportedSensorTypes,\n\t\t\t\t);\n\t\t\t\tif (supportedSensorTypes?.length) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t`Unsupported sensor type ${\n\t\t\t\t\t\t\tgetSensorName(this.type)\n\t\t\t\t\t\t} or corrupted data`,\n\t\t\t\t\t)(supportedSensorTypes.includes(this.type));\n\t\t\t\t}\n\n\t\t\t\tconst supportedScales = this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMultilevelSensorCCValues.supportedScales(this.type),\n\t\t\t\t);\n\t\t\t\tif (supportedScales?.length) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t`Unsupported scale ${scale.label} or corrupted data`,\n\t\t\t\t\t)(supportedScales.includes(scale.key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We support a higher CC version than the device, so any types and scales it uses should be known to us\n\t\t\t\t// Filter out unknown ones.\n\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t`Unknown sensor type ${\n\t\t\t\t\t\tnum2hex(\n\t\t\t\t\t\t\tthis.type,\n\t\t\t\t\t\t)\n\t\t\t\t\t} or corrupted data`,\n\t\t\t\t)(!!sensor);\n\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t`Unknown scale ${num2hex(this.scale)} or corrupted data`,\n\t\t\t\t)(scale.label !== getUnknownScale(this.scale).label);\n\t\t\t}\n\t\t}\n\n\t\tconst sensorName = getSensorName(this.type);\n\t\tconst sensorValue = MultilevelSensorCCValues.value(sensorName);\n\n\t\tthis.setMetadata(ctx, sensorValue, {\n\t\t\t...sensorValue.meta,\n\t\t\tunit: scale.unit,\n\t\t\tccSpecific: {\n\t\t\t\tsensorType: this.type,\n\t\t\t\tscale: scale.key,\n\t\t\t},\n\t\t});\n\t\tthis.setValue(ctx, sensorValue, this.value);\n\n\t\treturn true;\n\t}\n\n\tpublic type: number;\n\tpublic scale: number;\n\tpublic value: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.type]),\n\t\t\tencodeFloatWithScale(this.value, this.scale),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"sensor type\": getSensorName(this.type),\n\t\t\t\tscale: (getSensorScale(this.type, this.scale)\n\t\t\t\t\t?? getUnknownScale(this.scale)).label,\n\t\t\t\tvalue: this.value,\n\t\t\t},\n\t\t};\n\t}\n}\n\nconst testResponseForMultilevelSensorGet: CCResponsePredicate<\n\tMultilevelSensorCCGet,\n\tMultilevelSensorCCReport\n> = (sent, received) => {\n\t// We expect a Multilevel Sensor Report that matches the requested sensor type (if a type was requested)\n\treturn sent.sensorType == undefined || received.type === sent.sensorType;\n};\n\n// These options are supported starting in V5\n// @publicAPI\nexport type MultilevelSensorCCGetOptions = AllOrNone<{\n\tsensorType: number;\n\tscale: number;\n}>;\n\n@CCCommand(MultilevelSensorCommand.Get)\n@expectedCCResponse(\n\tMultilevelSensorCCReport,\n\ttestResponseForMultilevelSensorGet,\n)\nexport class MultilevelSensorCCGet extends MultilevelSensorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tif (\"sensorType\" in options) {\n\t\t\tthis.sensorType = options.sensorType;\n\t\t\tthis.scale = options.scale;\n\t\t}\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCGet {\n\t\tif (raw.payload.length >= 2) {\n\t\t\tconst sensorType = raw.payload[0];\n\t\t\tconst scale = (raw.payload[1] >> 3) & 0b11;\n\t\t\treturn new MultilevelSensorCCGet({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tsensorType,\n\t\t\t\tscale,\n\t\t\t});\n\t\t} else {\n\t\t\treturn new MultilevelSensorCCGet({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic sensorType: number | undefined;\n\tpublic scale: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tif (\n\t\t\tthis.sensorType != undefined\n\t\t\t&& this.scale != undefined\n\t\t) {\n\t\t\tthis.payload = Bytes.from([\n\t\t\t\tthis.sensorType,\n\t\t\t\t(this.scale & 0b11) << 3,\n\t\t\t]);\n\t\t}\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tlet message: MessageRecord = {};\n\t\tif (\n\t\t\tthis.sensorType != undefined\n\t\t\t&& this.scale != undefined\n\t\t) {\n\t\t\tmessage = {\n\t\t\t\t\"sensor type\": getSensorName(\n\t\t\t\t\tthis.sensorType,\n\t\t\t\t),\n\t\t\t\tscale: (getSensorScale(\n\t\t\t\t\tthis.sensorType,\n\t\t\t\t\tthis.scale,\n\t\t\t\t) ?? getUnknownScale(this.scale)).label,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSensorCCSupportedSensorReportOptions {\n\tsupportedSensorTypes: readonly number[];\n}\n\n@CCCommand(MultilevelSensorCommand.SupportedSensorReport)\nexport class MultilevelSensorCCSupportedSensorReport\n\textends MultilevelSensorCC\n{\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCSupportedSensorReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.supportedSensorTypes = options.supportedSensorTypes;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCSupportedSensorReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst supportedSensorTypes = parseBitMask(raw.payload);\n\n\t\treturn new MultilevelSensorCCSupportedSensorReport({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsupportedSensorTypes,\n\t\t});\n\t}\n\n\t// TODO: Use this during interview to precreate values\n\t@ccValue(MultilevelSensorCCValues.supportedSensorTypes)\n\tpublic supportedSensorTypes: readonly number[];\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = encodeBitMask(this.supportedSensorTypes);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"supported sensor types\": this.supportedSensorTypes\n\t\t\t\t\t.map((t) => `\\n\u00B7 ${getSensorName(t)}`)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(MultilevelSensorCommand.GetSupportedSensor)\n@expectedCCResponse(MultilevelSensorCCSupportedSensorReport)\nexport class MultilevelSensorCCGetSupportedSensor extends MultilevelSensorCC {}\n\n// @publicAPI\nexport interface MultilevelSensorCCSupportedScaleReportOptions {\n\tsensorType: number;\n\tsupportedScales: readonly number[];\n}\n\n@CCCommand(MultilevelSensorCommand.SupportedScaleReport)\nexport class MultilevelSensorCCSupportedScaleReport extends MultilevelSensorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCSupportedScaleReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.sensorType = options.sensorType;\n\t\tthis.supportedScales = options.supportedScales;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCSupportedScaleReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst sensorType = raw.payload[0];\n\t\tconst supportedScales = parseBitMask(\n\t\t\tBytes.from([raw.payload[1] & 0b1111]),\n\t\t\t0,\n\t\t);\n\n\t\treturn new MultilevelSensorCCSupportedScaleReport({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsensorType,\n\t\t\tsupportedScales,\n\t\t});\n\t}\n\n\tpublic readonly sensorType: number;\n\n\t@ccValue(\n\t\tMultilevelSensorCCValues.supportedScales,\n\t\t(self: MultilevelSensorCCSupportedScaleReport) =>\n\t\t\t[self.sensorType] as const,\n\t)\n\tpublic readonly supportedScales: readonly number[];\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.sensorType]),\n\t\t\tencodeBitMask(this.supportedScales, 4, 0),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"sensor type\": getSensorName(this.sensorType),\n\t\t\t\t\"supported scales\": this.supportedScales\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t`\\n\u00B7 ${\n\t\t\t\t\t\t\t\t(getSensorScale(this.sensorType, s)\n\t\t\t\t\t\t\t\t\t?? getUnknownScale(s)).label\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSensorCCGetSupportedScaleOptions {\n\tsensorType: number;\n}\n\n@CCCommand(MultilevelSensorCommand.GetSupportedScale)\n@expectedCCResponse(MultilevelSensorCCSupportedScaleReport)\nexport class MultilevelSensorCCGetSupportedScale extends MultilevelSensorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCGetSupportedScaleOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.sensorType = options.sensorType;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCGetSupportedScale {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst sensorType = raw.payload[0];\n\n\t\treturn new MultilevelSensorCCGetSupportedScale({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsensorType,\n\t\t});\n\t}\n\n\tpublic sensorType: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([this.sensorType]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"sensor type\": getSensorName(this.sensorType),\n\t\t\t},\n\t\t};\n\t}\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_safe", "preferred"
|
|
4
|
+
"sourcesContent": ["import {\n\ttype WithAddress,\n\tencodeBitMask,\n\tgetSensor,\n\tgetSensorName,\n\tgetSensorScale,\n\tgetUnknownScale,\n\ttimespan,\n} from \"@zwave-js/core\";\nimport type {\n\tControlsCC,\n\tEndpointId,\n\tGetEndpoint,\n\tMessageOrCCLogEntry,\n\tMessageRecord,\n\tNodeId,\n\tScale,\n\tSinglecastCC,\n\tSupervisionResult,\n\tSupportsCC,\n\tValueID,\n} from \"@zwave-js/core/safe\";\nimport {\n\tCommandClasses,\n\ttype MaybeNotKnown,\n\tMessagePriority,\n\tValueMetadata,\n\tencodeFloatWithScale,\n\tparseBitMask,\n\tparseFloatWithScale,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetDeviceConfig,\n\tGetNode,\n\tGetSupportedCCVersion,\n\tGetUserPreferences,\n\tGetValueDB,\n\tLogNode,\n} from \"@zwave-js/host/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { type AllOrNone, num2hex } from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\tPhysicalCCAPI,\n\ttype PollValueImplementation,\n\tthrowUnsupportedProperty,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\ttype CCResponsePredicate,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n\tgetEffectiveCCVersion,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport {\n\tMultilevelSensorCommand,\n\ttype MultilevelSensorValue,\n} from \"../lib/_Types.js\";\n\nexport const MultilevelSensorCCValues = Object.freeze({\n\t...V.defineStaticCCValues(CommandClasses[\"Multilevel Sensor\"], {\n\t\t...V.staticProperty(\"supportedSensorTypes\", undefined, {\n\t\t\tinternal: true,\n\t\t}),\n\t}),\n\n\t...V.defineDynamicCCValues(CommandClasses[\"Multilevel Sensor\"], {\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"supportedScales\",\n\t\t\t\"supportedScales\",\n\t\t\t(sensorType: number) => sensorType,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"supportedScales\"\n\t\t\t\t&& typeof propertyKey === \"number\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\n\t\t...V.dynamicPropertyWithName(\n\t\t\t\"value\",\n\t\t\t// This should have been the sensor type, but it is too late to change now\n\t\t\t// Maybe we can migrate this without breaking in the future\n\t\t\t(sensorTypeName: string) => sensorTypeName,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\ttypeof property === \"string\"\n\t\t\t\t&& property !== \"supportedSensorTypes\"\n\t\t\t\t&& property !== \"supportedScales\"\n\t\t\t\t&& propertyKey == undefined,\n\t\t\t(sensorTypeName: string) => ({\n\t\t\t\t// Just the base metadata, to be extended using a config manager\n\t\t\t\t...ValueMetadata.ReadOnlyNumber,\n\t\t\t\tlabel: sensorTypeName,\n\t\t\t} as const),\n\t\t),\n\t}),\n});\n\n/**\n * Determine the scale to use to query a sensor reading. Uses the user-preferred scale if given,\n * followed by the most recently used scale, otherwile falls back to the first supported one.\n */\nfunction getPreferredSensorScale(\n\tctx: GetValueDB & GetUserPreferences & LogNode,\n\tnodeId: number,\n\tendpointIndex: number,\n\tsensorType: number,\n\tsupportedScales: readonly number[],\n): number {\n\tconst preferences = ctx.getUserPreferences();\n\tconst sensor = getSensor(sensorType);\n\t// If the sensor type is unknown, we have no default. Use the user-provided scale or 0\n\tif (!sensor) {\n\t\tconst preferred = preferences?.scales[sensorType];\n\t\t// We cannot look up strings for unknown sensor types, so this must be a number or we use the fallback\n\t\tif (typeof preferred !== \"number\") return 0;\n\t\treturn preferred;\n\t}\n\n\t// Look up the preference for the scale\n\tlet preferred: number | string | undefined;\n\t// Named scales apply to multiple sensor types. To be able to override the scale for single types\n\t// we need to look at the preferences by sensor type first\n\tpreferred = preferences?.scales[sensorType];\n\t// If the scale is named, we can then try to use the named preference\n\tconst scaleGroupName = sensor.scaleGroupName;\n\tif (preferred == undefined && scaleGroupName) {\n\t\tpreferred = preferences?.scales[scaleGroupName];\n\t}\n\t// Then attempt reading the scale from the corresponding value\n\tif (preferred == undefined) {\n\t\tconst sensorName = getSensorName(sensorType);\n\t\tconst sensorValue = MultilevelSensorCCValues.value(sensorName);\n\t\tconst metadata = ctx\n\t\t\t.tryGetValueDB(nodeId)\n\t\t\t?.getMetadata(sensorValue.endpoint(endpointIndex));\n\t\tconst scale = metadata?.ccSpecific?.scale;\n\t\tif (typeof scale === \"number\" && supportedScales.includes(scale)) {\n\t\t\tpreferred = scale;\n\t\t\tctx.logNode(nodeId, {\n\t\t\t\tendpoint: endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`No scale preference for sensor type ${sensorType}, using the last-used scale ${preferred}`,\n\t\t\t});\n\t\t}\n\t}\n\t// Then fall back to the first supported scale\n\tif (preferred == undefined) {\n\t\tpreferred = supportedScales[0] ?? 0;\n\t\tctx.logNode(nodeId, {\n\t\t\tendpoint: endpointIndex,\n\t\t\tmessage:\n\t\t\t\t`No scale preference for sensor type ${sensorType}, using the first supported scale ${preferred}`,\n\t\t});\n\t\treturn preferred;\n\t}\n\n\t// If the scale name or unit was given, try to look it up\n\tif (typeof preferred === \"string\") {\n\t\tfor (const [key, scale] of Object.entries(sensor.scales)) {\n\t\t\tif (scale.label === preferred || scale.unit === preferred) {\n\t\t\t\tpreferred = parseInt(key, 10);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof preferred === \"string\") {\n\t\t// Looking up failed\n\t\tctx.logNode(nodeId, {\n\t\t\tendpoint: endpointIndex,\n\t\t\tmessage:\n\t\t\t\t`Preferred scale \"${preferred}\" for sensor type ${sensorType} not found, using the first supported scale ${\n\t\t\t\t\tsupportedScales[0] ?? 0\n\t\t\t\t}`,\n\t\t});\n\t\treturn supportedScales[0] ?? 0;\n\t}\n\n\t// We have a numeric scale key, nothing to look up. Make sure it is supported though\n\tif (!supportedScales.length) {\n\t\t// No info about supported scales, just use the preferred one\n\t\treturn preferred;\n\t} else if (!supportedScales.includes(preferred)) {\n\t\tctx.logNode(nodeId, {\n\t\t\tendpoint: endpointIndex,\n\t\t\tmessage:\n\t\t\t\t`Preferred scale ${preferred} not supported for sensor type ${sensorType}, using the first supported scale`,\n\t\t});\n\t\treturn supportedScales[0];\n\t} else {\n\t\treturn preferred;\n\t}\n}\n\n// @noSetValueAPI This CC is read-only\n\n@API(CommandClasses[\"Multilevel Sensor\"])\nexport class MultilevelSensorCCAPI extends PhysicalCCAPI {\n\tpublic supportsCommand(\n\t\tcmd: MultilevelSensorCommand,\n\t): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase MultilevelSensorCommand.Get:\n\t\t\tcase MultilevelSensorCommand.Report:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase MultilevelSensorCommand.GetSupportedSensor:\n\t\t\tcase MultilevelSensorCommand.GetSupportedScale:\n\t\t\t\treturn this.version >= 5;\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: MultilevelSensorCCAPI, { property }) {\n\t\t\t// Look up the necessary information\n\t\t\tconst valueId: ValueID = {\n\t\t\t\tcommandClass: CommandClasses[\"Multilevel Sensor\"],\n\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\tproperty,\n\t\t\t};\n\t\t\tconst ccSpecific = this.tryGetValueDB()?.getMetadata(valueId)\n\t\t\t\t?.ccSpecific;\n\t\t\tif (!ccSpecific) {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\n\t\t\tconst { sensorType, scale } = ccSpecific;\n\t\t\treturn this.get(sensorType, scale);\n\t\t};\n\t}\n\n\t/** Query the default sensor value */\n\tpublic async get(): Promise<\n\t\tMaybeNotKnown<MultilevelSensorValue & { type: number }>\n\t>;\n\t/** Query the sensor value for the given sensor type using the preferred sensor scale */\n\tpublic async get(\n\t\tsensorType: number,\n\t): Promise<MaybeNotKnown<MultilevelSensorValue>>;\n\t/** Query the sensor value for the given sensor type using the given sensor scale */\n\tpublic async get(\n\t\tsensorType: number,\n\t\tscale: number,\n\t): Promise<MaybeNotKnown<number>>;\n\n\t@validateArgs()\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async get(sensorType?: number, scale?: number) {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSensorCommand,\n\t\t\tMultilevelSensorCommand.Get,\n\t\t);\n\n\t\t// Figure out the preferred scale if none was given\n\t\tlet preferredScale: number | undefined;\n\t\tif (sensorType != undefined && scale == undefined) {\n\t\t\tconst supportedScales: readonly number[] =\n\t\t\t\tthis.tryGetValueDB()?.getValue({\n\t\t\t\t\tcommandClass: this.ccId,\n\t\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\t\tproperty: \"supportedScales\",\n\t\t\t\t\tpropertyKey: sensorType,\n\t\t\t\t}) ?? [];\n\n\t\t\tpreferredScale = getPreferredSensorScale(\n\t\t\t\tthis.host,\n\t\t\t\tthis.endpoint.nodeId,\n\t\t\t\tthis.endpoint.index,\n\t\t\t\tsensorType,\n\t\t\t\tsupportedScales,\n\t\t\t);\n\t\t}\n\n\t\tconst cc = new MultilevelSensorCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsensorType: sensorType!,\n\t\t\tscale: (scale ?? preferredScale)!,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSensorCCReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (!response) return;\n\n\t\tconst responseScale = getSensorScale(response.type, response.scale);\n\n\t\tif (sensorType == undefined) {\n\t\t\t// Overload #1: return the full response\n\t\t\treturn {\n\t\t\t\ttype: response.type,\n\t\t\t\tvalue: response.value,\n\t\t\t\tscale: responseScale,\n\t\t\t};\n\t\t} else if (scale == undefined) {\n\t\t\t// Overload #2: return value and scale\n\t\t\treturn {\n\t\t\t\tvalue: response.value,\n\t\t\t\tscale: responseScale,\n\t\t\t};\n\t\t} else {\n\t\t\t// Overload #3: return only the value\n\t\t\treturn response.value;\n\t\t}\n\t}\n\n\tpublic async getSupportedSensorTypes(): Promise<\n\t\tMaybeNotKnown<readonly number[]>\n\t> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSensorCommand,\n\t\t\tMultilevelSensorCommand.GetSupportedSensor,\n\t\t);\n\n\t\tconst cc = new MultilevelSensorCCGetSupportedSensor({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSensorCCSupportedSensorReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.supportedSensorTypes;\n\t}\n\n\t@validateArgs()\n\tpublic async getSupportedScales(\n\t\tsensorType: number,\n\t): Promise<MaybeNotKnown<readonly number[]>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSensorCommand,\n\t\t\tMultilevelSensorCommand.GetSupportedScale,\n\t\t);\n\n\t\tconst cc = new MultilevelSensorCCGetSupportedScale({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsensorType,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tMultilevelSensorCCSupportedScaleReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.supportedScales;\n\t}\n\n\t@validateArgs()\n\tpublic async sendReport(\n\t\tsensorType: number,\n\t\tscale: number | Scale,\n\t\tvalue: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tMultilevelSensorCommand,\n\t\t\tMultilevelSensorCommand.Report,\n\t\t);\n\n\t\tconst cc = new MultilevelSensorCCReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\ttype: sensorType,\n\t\t\tscale,\n\t\t\tvalue,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n}\n\n@commandClass(CommandClasses[\"Multilevel Sensor\"])\n@implementedVersion(11)\n@ccValues(MultilevelSensorCCValues)\nexport class MultilevelSensorCC extends CommandClass {\n\tdeclare ccCommand: MultilevelSensorCommand;\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multilevel Sensor\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tif (api.version >= 5) {\n\t\t\t// Query the supported sensor types\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"retrieving supported sensor types...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst sensorTypes = await api.getSupportedSensorTypes();\n\t\t\tif (sensorTypes) {\n\t\t\t\tconst logMessage = \"received supported sensor types:\\n\"\n\t\t\t\t\t+ sensorTypes\n\t\t\t\t\t\t.map((t) => getSensorName(t))\n\t\t\t\t\t\t.map((name) => `\u00B7 ${name}`)\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"Querying supported sensor types timed out, skipping interview...\",\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// As well as the supported scales for each sensor\n\n\t\t\tfor (const type of sensorTypes) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `querying supported scales for ${\n\t\t\t\t\t\tgetSensorName(type)\n\t\t\t\t\t} sensor`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tconst sensorScales = await api.getSupportedScales(type);\n\t\t\t\tif (sensorScales) {\n\t\t\t\t\tconst logMessage = \"received supported scales:\\n\"\n\t\t\t\t\t\t+ sensorScales\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t\t(getSensorScale(type, s)\n\t\t\t\t\t\t\t\t\t\t?? getUnknownScale(s)).label,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((name) => `\u00B7 ${name}`)\n\t\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"Querying supported scales timed out, skipping interview...\",\n\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Multilevel Sensor\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\tif (api.version <= 4) {\n\t\t\t// Sensors up to V4 only support a single value\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"querying current sensor reading...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst mlsResponse = await api.get();\n\t\t\tif (mlsResponse) {\n\t\t\t\tconst sensorScale = getSensorScale(\n\t\t\t\t\tmlsResponse.type,\n\t\t\t\t\tmlsResponse.scale.key,\n\t\t\t\t);\n\t\t\t\tconst logMessage = `received current sensor reading:\nsensor type: ${getSensorName(mlsResponse.type)}\nvalue: ${mlsResponse.value}${\n\t\t\t\t\tsensorScale?.unit ? ` ${sensorScale.unit}` : \"\"\n\t\t\t\t}`;\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// Query all sensor values\n\t\t\tconst sensorTypes: readonly number[] = valueDB.getValue({\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tproperty: \"supportedSensorTypes\",\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t}) || [];\n\n\t\t\tfor (const type of sensorTypes) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `querying ${\n\t\t\t\t\t\tgetSensorName(type)\n\t\t\t\t\t} sensor reading...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\n\t\t\t\tconst value = await api.get(type);\n\t\t\t\tif (value) {\n\t\t\t\t\tconst logMessage = `received current ${\n\t\t\t\t\t\tgetSensorName(type)\n\t\t\t\t\t} sensor reading: ${value.value} ${value.scale.unit || \"\"}`;\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic shouldRefreshValues(\n\t\tthis: SinglecastCC<this>,\n\t\tctx:\n\t\t\t& GetValueDB\n\t\t\t& GetSupportedCCVersion\n\t\t\t& GetDeviceConfig\n\t\t\t& GetNode<\n\t\t\t\tNodeId & GetEndpoint<EndpointId & SupportsCC & ControlsCC>\n\t\t\t>,\n\t): boolean {\n\t\t// Poll the device when all of the supported values were last updated longer than 6 hours ago.\n\t\t// This may lead to some values not being updated, but the user may have disabled some unnecessary\n\t\t// reports to reduce traffic.\n\t\tconst valueDB = ctx.tryGetValueDB(this.nodeId);\n\t\tif (!valueDB) return true;\n\n\t\tconst values = this.getDefinedValueIDs(ctx).filter((v) =>\n\t\t\tMultilevelSensorCCValues.value.is(v)\n\t\t);\n\t\treturn values.every((v) => {\n\t\t\tconst lastUpdated = valueDB.getTimestamp(v);\n\t\t\treturn (\n\t\t\t\tlastUpdated == undefined\n\t\t\t\t|| Date.now() - lastUpdated > timespan.hours(6)\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Returns which sensor types are supported.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getSupportedSensorTypesCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t): MaybeNotKnown<number[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(\n\t\t\t\tMultilevelSensorCCValues.supportedSensorTypes.endpoint(\n\t\t\t\t\tendpoint.index,\n\t\t\t\t),\n\t\t\t);\n\t}\n\n\t/**\n\t * Returns which scales are supported for a given sensor type.\n\t * This only works AFTER the interview process\n\t */\n\tpublic static getSupportedScalesCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t\tsensorType: number,\n\t): MaybeNotKnown<number[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(\n\t\t\t\tMultilevelSensorCCValues.supportedScales(sensorType).endpoint(\n\t\t\t\t\tendpoint.index,\n\t\t\t\t),\n\t\t\t);\n\t}\n\n\tpublic translatePropertyKey(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\t// TODO: check this\n\t\tif (property === \"values\" && typeof propertyKey === \"number\") {\n\t\t\tconst sensor = getSensor(propertyKey);\n\t\t\tif (sensor) return sensor.label;\n\t\t}\n\t\treturn super.translatePropertyKey(ctx, property, propertyKey);\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSensorCCReportOptions {\n\ttype: number;\n\tscale: number | Scale;\n\tvalue: number;\n}\n\n@CCCommand(MultilevelSensorCommand.Report)\n@useSupervision()\nexport class MultilevelSensorCCReport extends MultilevelSensorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.value = options.value;\n\t\tthis.scale = typeof options.scale === \"number\"\n\t\t\t? options.scale\n\t\t\t: options.scale.key;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst type = raw.payload[0];\n\n\t\t// parseFloatWithScale does its own validation\n\t\tconst { value, scale } = parseFloatWithScale(\n\t\t\traw.payload.subarray(1),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\tvalue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tconst sensor = getSensor(this.type);\n\t\tconst scale = getSensorScale(\n\t\t\tthis.type,\n\t\t\tthis.scale,\n\t\t) ?? getUnknownScale(this.scale);\n\n\t\t// Filter out unknown sensor types and scales, unless the strict validation is disabled\n\t\tconst measurementValidation = !ctx.getDeviceConfig?.(\n\t\t\tthis.nodeId as number,\n\t\t)?.compat?.disableStrictMeasurementValidation;\n\n\t\tconst ccVersion = getEffectiveCCVersion(ctx, this);\n\n\t\tif (measurementValidation) {\n\t\t\t// Filter out unsupported sensor types and scales if possible\n\t\t\tif (ccVersion >= 5) {\n\t\t\t\tconst supportedSensorTypes = this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMultilevelSensorCCValues.supportedSensorTypes,\n\t\t\t\t);\n\t\t\t\tif (supportedSensorTypes?.length) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t`Unsupported sensor type ${\n\t\t\t\t\t\t\tgetSensorName(this.type)\n\t\t\t\t\t\t} or corrupted data`,\n\t\t\t\t\t)(supportedSensorTypes.includes(this.type));\n\t\t\t\t}\n\n\t\t\t\tconst supportedScales = this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tMultilevelSensorCCValues.supportedScales(this.type),\n\t\t\t\t);\n\t\t\t\tif (supportedScales?.length) {\n\t\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t\t`Unsupported scale ${scale.label} or corrupted data`,\n\t\t\t\t\t)(supportedScales.includes(scale.key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We support a higher CC version than the device, so any types and scales it uses should be known to us\n\t\t\t\t// Filter out unknown ones.\n\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t`Unknown sensor type ${\n\t\t\t\t\t\tnum2hex(\n\t\t\t\t\t\t\tthis.type,\n\t\t\t\t\t\t)\n\t\t\t\t\t} or corrupted data`,\n\t\t\t\t)(!!sensor);\n\t\t\t\tvalidatePayload.withReason(\n\t\t\t\t\t`Unknown scale ${num2hex(this.scale)} or corrupted data`,\n\t\t\t\t)(scale.label !== getUnknownScale(this.scale).label);\n\t\t\t}\n\t\t}\n\n\t\tconst sensorName = getSensorName(this.type);\n\t\tconst sensorValue = MultilevelSensorCCValues.value(sensorName);\n\n\t\tthis.setMetadata(ctx, sensorValue, {\n\t\t\t...sensorValue.meta,\n\t\t\tunit: scale.unit,\n\t\t\tccSpecific: {\n\t\t\t\tsensorType: this.type,\n\t\t\t\tscale: scale.key,\n\t\t\t},\n\t\t});\n\t\tthis.setValue(ctx, sensorValue, this.value);\n\n\t\treturn true;\n\t}\n\n\tpublic type: number;\n\tpublic scale: number;\n\tpublic value: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.type]),\n\t\t\tencodeFloatWithScale(this.value, this.scale),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"sensor type\": getSensorName(this.type),\n\t\t\t\tscale: (getSensorScale(this.type, this.scale)\n\t\t\t\t\t?? getUnknownScale(this.scale)).label,\n\t\t\t\tvalue: this.value,\n\t\t\t},\n\t\t};\n\t}\n}\n\nconst testResponseForMultilevelSensorGet: CCResponsePredicate<\n\tMultilevelSensorCCGet,\n\tMultilevelSensorCCReport\n> = (sent, received) => {\n\t// We expect a Multilevel Sensor Report that matches the requested sensor type (if a type was requested)\n\treturn sent.sensorType == undefined || received.type === sent.sensorType;\n};\n\n// These options are supported starting in V5\n// @publicAPI\nexport type MultilevelSensorCCGetOptions = AllOrNone<{\n\tsensorType: number;\n\tscale: number;\n}>;\n\n@CCCommand(MultilevelSensorCommand.Get)\n@expectedCCResponse(\n\tMultilevelSensorCCReport,\n\ttestResponseForMultilevelSensorGet,\n)\nexport class MultilevelSensorCCGet extends MultilevelSensorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tif (\"sensorType\" in options) {\n\t\t\tthis.sensorType = options.sensorType;\n\t\t\tthis.scale = options.scale;\n\t\t}\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCGet {\n\t\tif (raw.payload.length >= 2) {\n\t\t\tconst sensorType = raw.payload[0];\n\t\t\tconst scale = (raw.payload[1] >> 3) & 0b11;\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tsensorType,\n\t\t\t\tscale,\n\t\t\t});\n\t\t} else {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic sensorType: number | undefined;\n\tpublic scale: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tif (\n\t\t\tthis.sensorType != undefined\n\t\t\t&& this.scale != undefined\n\t\t) {\n\t\t\tthis.payload = Bytes.from([\n\t\t\t\tthis.sensorType,\n\t\t\t\t(this.scale & 0b11) << 3,\n\t\t\t]);\n\t\t}\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tlet message: MessageRecord = {};\n\t\tif (\n\t\t\tthis.sensorType != undefined\n\t\t\t&& this.scale != undefined\n\t\t) {\n\t\t\tmessage = {\n\t\t\t\t\"sensor type\": getSensorName(\n\t\t\t\t\tthis.sensorType,\n\t\t\t\t),\n\t\t\t\tscale: (getSensorScale(\n\t\t\t\t\tthis.sensorType,\n\t\t\t\t\tthis.scale,\n\t\t\t\t) ?? getUnknownScale(this.scale)).label,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSensorCCSupportedSensorReportOptions {\n\tsupportedSensorTypes: readonly number[];\n}\n\n@CCCommand(MultilevelSensorCommand.SupportedSensorReport)\n@ccValueProperty(\n\t\"supportedSensorTypes\",\n\tMultilevelSensorCCValues.supportedSensorTypes,\n)\nexport class MultilevelSensorCCSupportedSensorReport\n\textends MultilevelSensorCC\n{\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCSupportedSensorReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.supportedSensorTypes = options.supportedSensorTypes;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCSupportedSensorReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst supportedSensorTypes = parseBitMask(raw.payload);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsupportedSensorTypes,\n\t\t});\n\t}\n\n\t// TODO: Use this during interview to precreate values\n\n\tpublic supportedSensorTypes: readonly number[];\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = encodeBitMask(this.supportedSensorTypes);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"supported sensor types\": this.supportedSensorTypes\n\t\t\t\t\t.map((t) => `\\n\u00B7 ${getSensorName(t)}`)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(MultilevelSensorCommand.GetSupportedSensor)\n@expectedCCResponse(MultilevelSensorCCSupportedSensorReport)\nexport class MultilevelSensorCCGetSupportedSensor extends MultilevelSensorCC {}\n\n// @publicAPI\nexport interface MultilevelSensorCCSupportedScaleReportOptions {\n\tsensorType: number;\n\tsupportedScales: readonly number[];\n}\n\n@CCCommand(MultilevelSensorCommand.SupportedScaleReport)\n@ccValueProperty(\n\t\"supportedScales\",\n\tMultilevelSensorCCValues.supportedScales,\n\t(self) => [self.sensorType],\n)\nexport class MultilevelSensorCCSupportedScaleReport extends MultilevelSensorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCSupportedScaleReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.sensorType = options.sensorType;\n\t\tthis.supportedScales = options.supportedScales;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCSupportedScaleReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst sensorType = raw.payload[0];\n\t\tconst supportedScales = parseBitMask(\n\t\t\tBytes.from([raw.payload[1] & 0b1111]),\n\t\t\t0,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsensorType,\n\t\t\tsupportedScales,\n\t\t});\n\t}\n\n\tpublic readonly sensorType: number;\n\n\tpublic readonly supportedScales: readonly number[];\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.sensorType]),\n\t\t\tencodeBitMask(this.supportedScales, 4, 0),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"sensor type\": getSensorName(this.sensorType),\n\t\t\t\t\"supported scales\": this.supportedScales\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t`\\n\u00B7 ${\n\t\t\t\t\t\t\t\t(getSensorScale(this.sensorType, s)\n\t\t\t\t\t\t\t\t\t?? getUnknownScale(s)).label\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface MultilevelSensorCCGetSupportedScaleOptions {\n\tsensorType: number;\n}\n\n@CCCommand(MultilevelSensorCommand.GetSupportedScale)\n@expectedCCResponse(MultilevelSensorCCSupportedScaleReport)\nexport class MultilevelSensorCCGetSupportedScale extends MultilevelSensorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<MultilevelSensorCCGetSupportedScaleOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.sensorType = options.sensorType;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): MultilevelSensorCCGetSupportedScale {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst sensorType = raw.payload[0];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsensorType,\n\t\t});\n\t}\n\n\tpublic sensorType: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([this.sensorType]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"sensor type\": getSensorName(this.sensorType),\n\t\t\t},\n\t\t};\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_safe", "preferred"]
|
|
7
7
|
}
|