@zwave-js/cc 14.0.0-beta.4 → 14.0.0-beta.5
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,10 +1,37 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
6
34
|
};
|
|
7
|
-
var MultiChannelCCEndPointReport_1, MultiChannelCCCapabilityReport_1, MultiChannelCCCapabilityGet_1, MultiChannelCCEndPointFindReport_1, MultiChannelCCEndPointFind_1, MultiChannelCCAggregatedMembersReport_1, MultiChannelCCCommandEncapsulation_1, MultiChannelCCV1Report_1, MultiChannelCCV1CommandEncapsulation_1;
|
|
8
35
|
function __assertType(argName, typeName, boundHasError) {
|
|
9
36
|
const { ZWaveError, ZWaveErrorCodes } = require("@zwave-js/core");
|
|
10
37
|
if (boundHasError()) {
|
|
@@ -22,7 +49,7 @@ import { Bytes } from "@zwave-js/shared/safe";
|
|
|
22
49
|
import { distinct } from "alcalzone-shared/arrays/index.js";
|
|
23
50
|
import { CCAPI } from "../lib/API.js";
|
|
24
51
|
import { CommandClass, getEffectiveCCVersion, } from "../lib/CommandClass.js";
|
|
25
|
-
import { API, CCCommand,
|
|
52
|
+
import { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, } from "../lib/CommandClassDecorators.js";
|
|
26
53
|
import { isEncapsulatingCommandClass, isMultiEncapsulatingCommandClass, } from "../lib/EncapsulatingCommandClass.js";
|
|
27
54
|
import { V } from "../lib/Values.js";
|
|
28
55
|
import { MultiChannelCommand } from "../lib/_Types.js";
|
|
@@ -93,795 +120,904 @@ function areEndpointsUnnecessary(ctx, nodeId, endpointIndizes) {
|
|
|
93
120
|
return false;
|
|
94
121
|
return true;
|
|
95
122
|
}
|
|
96
|
-
let MultiChannelCCAPI =
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return this.version >= 2;
|
|
111
|
-
case MultiChannelCommand.EndPointFind:
|
|
112
|
-
return this.version >= 3 && this.isSinglecast();
|
|
113
|
-
case MultiChannelCommand.AggregatedMembersGet:
|
|
114
|
-
return this.version >= 4 && this.isSinglecast();
|
|
115
|
-
}
|
|
116
|
-
return super.supportsCommand(cmd);
|
|
117
|
-
}
|
|
118
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
119
|
-
async getEndpoints() {
|
|
120
|
-
this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.EndPointGet);
|
|
121
|
-
const cc = new MultiChannelCCEndPointGet({
|
|
122
|
-
nodeId: this.endpoint.nodeId,
|
|
123
|
-
endpointIndex: this.endpoint.index,
|
|
124
|
-
});
|
|
125
|
-
const response = await this.host.sendCommand(cc, this.commandOptions);
|
|
126
|
-
if (response) {
|
|
127
|
-
return {
|
|
128
|
-
isDynamicEndpointCount: response.countIsDynamic,
|
|
129
|
-
identicalCapabilities: response.identicalCapabilities,
|
|
130
|
-
individualEndpointCount: response.individualCount,
|
|
131
|
-
aggregatedEndpointCount: response.aggregatedCount,
|
|
132
|
-
};
|
|
123
|
+
let MultiChannelCCAPI = (() => {
|
|
124
|
+
let _classDecorators = [API(CommandClasses["Multi Channel"])];
|
|
125
|
+
let _classDescriptor;
|
|
126
|
+
let _classExtraInitializers = [];
|
|
127
|
+
let _classThis;
|
|
128
|
+
let _classSuper = CCAPI;
|
|
129
|
+
var MultiChannelCCAPI = class extends _classSuper {
|
|
130
|
+
static { _classThis = this; }
|
|
131
|
+
static {
|
|
132
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
133
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
134
|
+
MultiChannelCCAPI = _classThis = _classDescriptor.value;
|
|
135
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
136
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
133
137
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
138
|
+
supportsCommand(cmd) {
|
|
139
|
+
switch (cmd) {
|
|
140
|
+
// Legacy commands:
|
|
141
|
+
case MultiChannelCommand.GetV1:
|
|
142
|
+
return this.isSinglecast() && this.version === 1;
|
|
143
|
+
case MultiChannelCommand.CommandEncapsulationV1:
|
|
144
|
+
return this.version === 1;
|
|
145
|
+
// The specs start at version 3 but according to OZW,
|
|
146
|
+
// these do seem to be supported in version 2
|
|
147
|
+
case MultiChannelCommand.EndPointGet:
|
|
148
|
+
case MultiChannelCommand.CapabilityGet:
|
|
149
|
+
return this.version >= 2 && this.isSinglecast();
|
|
150
|
+
case MultiChannelCommand.CommandEncapsulation:
|
|
151
|
+
return this.version >= 2;
|
|
152
|
+
case MultiChannelCommand.EndPointFind:
|
|
153
|
+
return this.version >= 3 && this.isSinglecast();
|
|
154
|
+
case MultiChannelCommand.AggregatedMembersGet:
|
|
155
|
+
return this.version >= 4 && this.isSinglecast();
|
|
156
|
+
}
|
|
157
|
+
return super.supportsCommand(cmd);
|
|
154
158
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
160
|
+
async getEndpoints() {
|
|
161
|
+
this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.EndPointGet);
|
|
162
|
+
const cc = new MultiChannelCCEndPointGet({
|
|
163
|
+
nodeId: this.endpoint.nodeId,
|
|
164
|
+
endpointIndex: this.endpoint.index,
|
|
165
|
+
});
|
|
166
|
+
const response = await this.host.sendCommand(cc, this.commandOptions);
|
|
167
|
+
if (response) {
|
|
168
|
+
return {
|
|
169
|
+
isDynamicEndpointCount: response.countIsDynamic,
|
|
170
|
+
identicalCapabilities: response.identicalCapabilities,
|
|
171
|
+
individualEndpointCount: response.individualCount,
|
|
172
|
+
aggregatedEndpointCount: response.aggregatedCount,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async getEndpointCapabilities(endpoint) {
|
|
177
|
+
__assertType("endpoint", "number", __assertType__number.bind(void 0, endpoint));
|
|
178
|
+
this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CapabilityGet);
|
|
179
|
+
const cc = new MultiChannelCCCapabilityGet({
|
|
180
|
+
nodeId: this.endpoint.nodeId,
|
|
181
|
+
endpointIndex: this.endpoint.index,
|
|
182
|
+
requestedEndpoint: endpoint,
|
|
183
|
+
});
|
|
184
|
+
const response = await this.host.sendCommand(cc, this.commandOptions);
|
|
185
|
+
if (response) {
|
|
186
|
+
const generic = getGenericDeviceClass(response.genericDeviceClass);
|
|
187
|
+
const specific = getSpecificDeviceClass(response.genericDeviceClass, response.specificDeviceClass);
|
|
188
|
+
return {
|
|
189
|
+
isDynamic: response.isDynamic,
|
|
190
|
+
wasRemoved: response.wasRemoved,
|
|
191
|
+
supportedCCs: response.supportedCCs,
|
|
192
|
+
generic,
|
|
193
|
+
specific,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async findEndpoints(genericClass, specificClass) {
|
|
198
|
+
__assertType("genericClass", "number", __assertType__number.bind(void 0, genericClass));
|
|
199
|
+
__assertType("specificClass", "number", __assertType__number.bind(void 0, specificClass));
|
|
200
|
+
this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.EndPointFind);
|
|
201
|
+
const cc = new MultiChannelCCEndPointFind({
|
|
202
|
+
nodeId: this.endpoint.nodeId,
|
|
203
|
+
endpointIndex: this.endpoint.index,
|
|
204
|
+
genericClass,
|
|
205
|
+
specificClass,
|
|
206
|
+
});
|
|
207
|
+
const response = await this.host.sendCommand(cc, this.commandOptions);
|
|
208
|
+
return response?.foundEndpoints;
|
|
209
|
+
}
|
|
210
|
+
async getAggregatedMembers(endpoint) {
|
|
211
|
+
__assertType("endpoint", "number", __assertType__number.bind(void 0, endpoint));
|
|
212
|
+
this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.AggregatedMembersGet);
|
|
213
|
+
const cc = new MultiChannelCCAggregatedMembersGet({
|
|
214
|
+
nodeId: this.endpoint.nodeId,
|
|
215
|
+
endpointIndex: this.endpoint.index,
|
|
216
|
+
requestedEndpoint: endpoint,
|
|
217
|
+
});
|
|
218
|
+
const response = await this.host.sendCommand(cc, this.commandOptions);
|
|
219
|
+
return response?.members;
|
|
220
|
+
}
|
|
221
|
+
// Encapsulation is used internally and too frequently that we
|
|
222
|
+
// want to pay the cost of validating each call
|
|
223
|
+
// eslint-disable-next-line @zwave-js/ccapi-validate-args
|
|
224
|
+
async sendEncapsulated(options) {
|
|
225
|
+
this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CommandEncapsulation);
|
|
226
|
+
const cc = new MultiChannelCCCommandEncapsulation({
|
|
227
|
+
nodeId: this.endpoint.nodeId,
|
|
228
|
+
...options,
|
|
229
|
+
});
|
|
230
|
+
await this.host.sendCommand(cc, this.commandOptions);
|
|
231
|
+
}
|
|
232
|
+
async getEndpointCountV1(ccId) {
|
|
233
|
+
__assertType("ccId", "CommandClasses", __assertType__number.bind(void 0, ccId));
|
|
234
|
+
this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.GetV1);
|
|
235
|
+
const cc = new MultiChannelCCV1Get({
|
|
236
|
+
nodeId: this.endpoint.nodeId,
|
|
237
|
+
requestedCC: ccId,
|
|
238
|
+
});
|
|
239
|
+
const response = await this.host.sendCommand(cc, this.commandOptions);
|
|
240
|
+
return response?.endpointCount;
|
|
241
|
+
}
|
|
242
|
+
// Encapsulation is used internally and too frequently that we
|
|
243
|
+
// want to pay the cost of validating each call
|
|
244
|
+
// eslint-disable-next-line @zwave-js/ccapi-validate-args
|
|
245
|
+
async sendEncapsulatedV1(encapsulated) {
|
|
246
|
+
this.assertSupportsCommand(MultiChannelCommand, MultiChannelCommand.CommandEncapsulationV1);
|
|
247
|
+
const cc = new MultiChannelCCV1CommandEncapsulation({
|
|
248
|
+
nodeId: this.endpoint.nodeId,
|
|
249
|
+
encapsulated,
|
|
250
|
+
});
|
|
251
|
+
await this.host.sendCommand(cc, this.commandOptions);
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
return MultiChannelCCAPI = _classThis;
|
|
255
|
+
})();
|
|
216
256
|
export { MultiChannelCCAPI };
|
|
217
|
-
let MultiChannelCC =
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
257
|
+
let MultiChannelCC = (() => {
|
|
258
|
+
let _classDecorators = [commandClass(CommandClasses["Multi Channel"]), implementedVersion(4), ccValues(MultiChannelCCValues)];
|
|
259
|
+
let _classDescriptor;
|
|
260
|
+
let _classExtraInitializers = [];
|
|
261
|
+
let _classThis;
|
|
262
|
+
let _classSuper = CommandClass;
|
|
263
|
+
var MultiChannelCC = class extends _classSuper {
|
|
264
|
+
static { _classThis = this; }
|
|
265
|
+
static {
|
|
266
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
267
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
268
|
+
MultiChannelCC = _classThis = _classDescriptor.value;
|
|
269
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
270
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
271
|
+
}
|
|
272
|
+
/** Tests if a command targets a specific endpoint and thus requires encapsulation */
|
|
273
|
+
static requiresEncapsulation(cc) {
|
|
274
|
+
return (cc.endpointIndex !== 0
|
|
275
|
+
&& !(cc instanceof MultiChannelCCCommandEncapsulation)
|
|
276
|
+
&& !(cc instanceof MultiChannelCCV1CommandEncapsulation));
|
|
277
|
+
}
|
|
278
|
+
/** Encapsulates a command that targets a specific endpoint, with version 2+ of the Multi Channel CC */
|
|
279
|
+
static encapsulate(cc) {
|
|
280
|
+
const ret = new MultiChannelCCCommandEncapsulation({
|
|
281
|
+
nodeId: cc.nodeId,
|
|
282
|
+
encapsulated: cc,
|
|
283
|
+
destination: cc.endpointIndex,
|
|
284
|
+
});
|
|
285
|
+
// Copy the encapsulation flags from the encapsulated command
|
|
286
|
+
ret.encapsulationFlags = cc.encapsulationFlags;
|
|
287
|
+
return ret;
|
|
288
|
+
}
|
|
289
|
+
/** Encapsulates a command that targets a specific endpoint, with version 1 of the Multi Channel CC */
|
|
290
|
+
static encapsulateV1(cc) {
|
|
291
|
+
const ret = new MultiChannelCCV1CommandEncapsulation({
|
|
292
|
+
nodeId: cc.nodeId,
|
|
293
|
+
encapsulated: cc,
|
|
294
|
+
});
|
|
295
|
+
// Copy the encapsulation flags from the encapsulated command
|
|
296
|
+
ret.encapsulationFlags = cc.encapsulationFlags;
|
|
297
|
+
return ret;
|
|
298
|
+
}
|
|
299
|
+
skipEndpointInterview() {
|
|
300
|
+
// The endpoints are discovered by querying the root device
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
async interview(ctx) {
|
|
304
|
+
const node = this.getNode(ctx);
|
|
305
|
+
const removeEndpoints = ctx.getDeviceConfig?.(node.id)?.compat
|
|
306
|
+
?.removeEndpoints;
|
|
307
|
+
if (removeEndpoints === "*") {
|
|
308
|
+
ctx.logNode(node.id, {
|
|
309
|
+
endpoint: this.endpointIndex,
|
|
310
|
+
message: `Skipping ${this.ccName} interview b/c all endpoints are ignored by the device config file...`,
|
|
311
|
+
direction: "none",
|
|
312
|
+
});
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
254
315
|
ctx.logNode(node.id, {
|
|
255
316
|
endpoint: this.endpointIndex,
|
|
256
|
-
message: `
|
|
317
|
+
message: `Interviewing ${this.ccName}...`,
|
|
257
318
|
direction: "none",
|
|
258
319
|
});
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
// Special interview procedure for legacy nodes
|
|
267
|
-
const ccVersion = getEffectiveCCVersion(ctx, this);
|
|
268
|
-
if (ccVersion === 1)
|
|
269
|
-
return this.interviewV1(ctx);
|
|
270
|
-
const endpoint = node.getEndpoint(this.endpointIndex);
|
|
271
|
-
const api = CCAPI.create(CommandClasses["Multi Channel"], ctx, endpoint).withOptions({
|
|
272
|
-
priority: MessagePriority.NodeQuery,
|
|
273
|
-
});
|
|
274
|
-
const valueDB = this.getValueDB(ctx);
|
|
275
|
-
// Step 1: Retrieve general information about end points
|
|
276
|
-
ctx.logNode(node.id, {
|
|
277
|
-
endpoint: this.endpointIndex,
|
|
278
|
-
message: "querying device endpoint information...",
|
|
279
|
-
direction: "outbound",
|
|
280
|
-
});
|
|
281
|
-
const multiResponse = await api.getEndpoints();
|
|
282
|
-
if (!multiResponse) {
|
|
283
|
-
ctx.logNode(node.id, {
|
|
284
|
-
endpoint: this.endpointIndex,
|
|
285
|
-
message: "Querying device endpoint information timed out, aborting interview...",
|
|
286
|
-
level: "warn",
|
|
320
|
+
// Special interview procedure for legacy nodes
|
|
321
|
+
const ccVersion = getEffectiveCCVersion(ctx, this);
|
|
322
|
+
if (ccVersion === 1)
|
|
323
|
+
return this.interviewV1(ctx);
|
|
324
|
+
const endpoint = node.getEndpoint(this.endpointIndex);
|
|
325
|
+
const api = CCAPI.create(CommandClasses["Multi Channel"], ctx, endpoint).withOptions({
|
|
326
|
+
priority: MessagePriority.NodeQuery,
|
|
287
327
|
});
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
let logMessage = `received response for device endpoints:
|
|
291
|
-
endpoint count (individual): ${multiResponse.individualEndpointCount}
|
|
292
|
-
count is dynamic: ${multiResponse.isDynamicEndpointCount}
|
|
293
|
-
identical capabilities: ${multiResponse.identicalCapabilities}`;
|
|
294
|
-
if (multiResponse.aggregatedEndpointCount != undefined) {
|
|
295
|
-
logMessage +=
|
|
296
|
-
`\nendpoint count (aggregated): ${multiResponse.aggregatedEndpointCount}`;
|
|
297
|
-
}
|
|
298
|
-
ctx.logNode(node.id, {
|
|
299
|
-
endpoint: this.endpointIndex,
|
|
300
|
-
message: logMessage,
|
|
301
|
-
direction: "inbound",
|
|
302
|
-
});
|
|
303
|
-
let allEndpoints = [];
|
|
304
|
-
const addSequentialEndpoints = () => {
|
|
305
|
-
for (let i = 1; i
|
|
306
|
-
<= multiResponse.individualEndpointCount
|
|
307
|
-
+ (multiResponse.aggregatedEndpointCount ?? 0); i++) {
|
|
308
|
-
allEndpoints.push(i);
|
|
309
|
-
}
|
|
310
|
-
};
|
|
311
|
-
if (api.supportsCommand(MultiChannelCommand.EndPointFind)) {
|
|
312
|
-
// Step 2a: Find all endpoints
|
|
328
|
+
const valueDB = this.getValueDB(ctx);
|
|
329
|
+
// Step 1: Retrieve general information about end points
|
|
313
330
|
ctx.logNode(node.id, {
|
|
314
331
|
endpoint: this.endpointIndex,
|
|
315
|
-
message: "querying
|
|
332
|
+
message: "querying device endpoint information...",
|
|
316
333
|
direction: "outbound",
|
|
317
334
|
});
|
|
318
|
-
const
|
|
319
|
-
if (
|
|
320
|
-
allEndpoints.push(...foundEndpoints);
|
|
321
|
-
if (!allEndpoints.length) {
|
|
322
|
-
// Create a sequential list of endpoints
|
|
335
|
+
const multiResponse = await api.getEndpoints();
|
|
336
|
+
if (!multiResponse) {
|
|
323
337
|
ctx.logNode(node.id, {
|
|
324
338
|
endpoint: this.endpointIndex,
|
|
325
|
-
message:
|
|
326
|
-
|
|
339
|
+
message: "Querying device endpoint information timed out, aborting interview...",
|
|
340
|
+
level: "warn",
|
|
327
341
|
});
|
|
328
|
-
|
|
342
|
+
return this.throwMissingCriticalInterviewResponse();
|
|
329
343
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
});
|
|
344
|
+
let logMessage = `received response for device endpoints:
|
|
345
|
+
endpoint count (individual): ${multiResponse.individualEndpointCount}
|
|
346
|
+
count is dynamic: ${multiResponse.isDynamicEndpointCount}
|
|
347
|
+
identical capabilities: ${multiResponse.identicalCapabilities}`;
|
|
348
|
+
if (multiResponse.aggregatedEndpointCount != undefined) {
|
|
349
|
+
logMessage +=
|
|
350
|
+
`\nendpoint count (aggregated): ${multiResponse.aggregatedEndpointCount}`;
|
|
338
351
|
}
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
// Step 2b: Assume that the endpoints are in sequential order
|
|
342
352
|
ctx.logNode(node.id, {
|
|
343
353
|
endpoint: this.endpointIndex,
|
|
344
|
-
message:
|
|
345
|
-
direction: "
|
|
354
|
+
message: logMessage,
|
|
355
|
+
direction: "inbound",
|
|
346
356
|
});
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
}
|
|
358
|
-
// Step 3: Query endpoints
|
|
359
|
-
let hasQueriedCapabilities = false;
|
|
360
|
-
for (const endpoint of allEndpoints) {
|
|
361
|
-
if (endpoint > multiResponse.individualEndpointCount
|
|
362
|
-
&& ccVersion >= 4) {
|
|
363
|
-
// Find members of aggregated end point
|
|
357
|
+
let allEndpoints = [];
|
|
358
|
+
const addSequentialEndpoints = () => {
|
|
359
|
+
for (let i = 1; i
|
|
360
|
+
<= multiResponse.individualEndpointCount
|
|
361
|
+
+ (multiResponse.aggregatedEndpointCount ?? 0); i++) {
|
|
362
|
+
allEndpoints.push(i);
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
if (api.supportsCommand(MultiChannelCommand.EndPointFind)) {
|
|
366
|
+
// Step 2a: Find all endpoints
|
|
364
367
|
ctx.logNode(node.id, {
|
|
365
368
|
endpoint: this.endpointIndex,
|
|
366
|
-
message:
|
|
369
|
+
message: "querying all endpoints...",
|
|
367
370
|
direction: "outbound",
|
|
368
371
|
});
|
|
369
|
-
const
|
|
370
|
-
if (
|
|
372
|
+
const foundEndpoints = await api.findEndpoints(0xff, 0xff);
|
|
373
|
+
if (foundEndpoints)
|
|
374
|
+
allEndpoints.push(...foundEndpoints);
|
|
375
|
+
if (!allEndpoints.length) {
|
|
376
|
+
// Create a sequential list of endpoints
|
|
371
377
|
ctx.logNode(node.id, {
|
|
372
378
|
endpoint: this.endpointIndex,
|
|
373
|
-
message: `
|
|
379
|
+
message: `Endpoint query returned no results, assuming that endpoints are sequential`,
|
|
380
|
+
direction: "inbound",
|
|
381
|
+
});
|
|
382
|
+
addSequentialEndpoints();
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
ctx.logNode(node.id, {
|
|
386
|
+
endpoint: this.endpointIndex,
|
|
387
|
+
message: `received endpoints: ${allEndpoints
|
|
374
388
|
.map(String)
|
|
375
389
|
.join(", ")}`,
|
|
376
390
|
direction: "inbound",
|
|
377
391
|
});
|
|
378
392
|
}
|
|
379
393
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
if (multiResponse.identicalCapabilities && hasQueriedCapabilities) {
|
|
394
|
+
else {
|
|
395
|
+
// Step 2b: Assume that the endpoints are in sequential order
|
|
383
396
|
ctx.logNode(node.id, {
|
|
384
397
|
endpoint: this.endpointIndex,
|
|
385
|
-
message: `
|
|
398
|
+
message: `does not support EndPointFind, assuming that endpoints are sequential`,
|
|
386
399
|
direction: "none",
|
|
387
400
|
});
|
|
388
|
-
|
|
389
|
-
const devClass = valueDB.getValue(MultiChannelCCValues.endpointDeviceClass.endpoint(allEndpoints[0]));
|
|
390
|
-
valueDB.setValue(MultiChannelCCValues.endpointDeviceClass.endpoint(endpoint), devClass);
|
|
391
|
-
const ep1Caps = valueDB.getValue(MultiChannelCCValues.endpointCCs.endpoint(allEndpoints[0]));
|
|
392
|
-
valueDB.setValue(MultiChannelCCValues.endpointCCs.endpoint(endpoint), [...ep1Caps]);
|
|
393
|
-
continue;
|
|
401
|
+
addSequentialEndpoints();
|
|
394
402
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
message: `querying capabilities for endpoint #${endpoint}...`,
|
|
398
|
-
direction: "outbound",
|
|
399
|
-
});
|
|
400
|
-
const caps = await api.getEndpointCapabilities(endpoint);
|
|
401
|
-
if (caps) {
|
|
402
|
-
hasQueriedCapabilities = true;
|
|
403
|
-
logMessage =
|
|
404
|
-
`received response for endpoint capabilities (#${endpoint}):
|
|
405
|
-
generic device class: ${caps.generic.label}
|
|
406
|
-
specific device class: ${caps.specific.label}
|
|
407
|
-
is dynamic end point: ${caps.isDynamic}
|
|
408
|
-
supported CCs:`;
|
|
409
|
-
for (const cc of caps.supportedCCs) {
|
|
410
|
-
logMessage += `\n · ${getCCName(cc)}`;
|
|
411
|
-
}
|
|
403
|
+
// Step 2.5: remove ignored endpoints
|
|
404
|
+
if (removeEndpoints?.length) {
|
|
412
405
|
ctx.logNode(node.id, {
|
|
413
406
|
endpoint: this.endpointIndex,
|
|
414
|
-
message:
|
|
415
|
-
direction: "
|
|
407
|
+
message: `The following endpoints are ignored through the config file: ${removeEndpoints.join(", ")}`,
|
|
408
|
+
direction: "none",
|
|
416
409
|
});
|
|
410
|
+
allEndpoints = allEndpoints.filter((e) => !removeEndpoints.includes(e));
|
|
417
411
|
}
|
|
418
|
-
|
|
412
|
+
// Step 3: Query endpoints
|
|
413
|
+
let hasQueriedCapabilities = false;
|
|
414
|
+
for (const endpoint of allEndpoints) {
|
|
415
|
+
if (endpoint > multiResponse.individualEndpointCount
|
|
416
|
+
&& ccVersion >= 4) {
|
|
417
|
+
// Find members of aggregated end point
|
|
418
|
+
ctx.logNode(node.id, {
|
|
419
|
+
endpoint: this.endpointIndex,
|
|
420
|
+
message: `querying members of aggregated endpoint #${endpoint}...`,
|
|
421
|
+
direction: "outbound",
|
|
422
|
+
});
|
|
423
|
+
const members = await api.getAggregatedMembers(endpoint);
|
|
424
|
+
if (members) {
|
|
425
|
+
ctx.logNode(node.id, {
|
|
426
|
+
endpoint: this.endpointIndex,
|
|
427
|
+
message: `aggregated endpoint #${endpoint} has members ${members
|
|
428
|
+
.map(String)
|
|
429
|
+
.join(", ")}`,
|
|
430
|
+
direction: "inbound",
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// When the device reports identical capabilities for all endpoints,
|
|
435
|
+
// we don't need to query them all
|
|
436
|
+
if (multiResponse.identicalCapabilities && hasQueriedCapabilities) {
|
|
437
|
+
ctx.logNode(node.id, {
|
|
438
|
+
endpoint: this.endpointIndex,
|
|
439
|
+
message: `all endpoints identical, skipping capability query for endpoint #${endpoint}...`,
|
|
440
|
+
direction: "none",
|
|
441
|
+
});
|
|
442
|
+
// copy the capabilities from the first endpoint
|
|
443
|
+
const devClass = valueDB.getValue(MultiChannelCCValues.endpointDeviceClass.endpoint(allEndpoints[0]));
|
|
444
|
+
valueDB.setValue(MultiChannelCCValues.endpointDeviceClass.endpoint(endpoint), devClass);
|
|
445
|
+
const ep1Caps = valueDB.getValue(MultiChannelCCValues.endpointCCs.endpoint(allEndpoints[0]));
|
|
446
|
+
valueDB.setValue(MultiChannelCCValues.endpointCCs.endpoint(endpoint), [...ep1Caps]);
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
419
449
|
ctx.logNode(node.id, {
|
|
420
450
|
endpoint: this.endpointIndex,
|
|
421
|
-
message: `
|
|
422
|
-
|
|
451
|
+
message: `querying capabilities for endpoint #${endpoint}...`,
|
|
452
|
+
direction: "outbound",
|
|
423
453
|
});
|
|
424
|
-
|
|
454
|
+
const caps = await api.getEndpointCapabilities(endpoint);
|
|
455
|
+
if (caps) {
|
|
456
|
+
hasQueriedCapabilities = true;
|
|
457
|
+
logMessage =
|
|
458
|
+
`received response for endpoint capabilities (#${endpoint}):
|
|
459
|
+
generic device class: ${caps.generic.label}
|
|
460
|
+
specific device class: ${caps.specific.label}
|
|
461
|
+
is dynamic end point: ${caps.isDynamic}
|
|
462
|
+
supported CCs:`;
|
|
463
|
+
for (const cc of caps.supportedCCs) {
|
|
464
|
+
logMessage += `\n · ${getCCName(cc)}`;
|
|
465
|
+
}
|
|
466
|
+
ctx.logNode(node.id, {
|
|
467
|
+
endpoint: this.endpointIndex,
|
|
468
|
+
message: logMessage,
|
|
469
|
+
direction: "inbound",
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
ctx.logNode(node.id, {
|
|
474
|
+
endpoint: this.endpointIndex,
|
|
475
|
+
message: `Querying endpoint #${endpoint} capabilities timed out, aborting interview...`,
|
|
476
|
+
level: "warn",
|
|
477
|
+
});
|
|
478
|
+
return this.throwMissingCriticalInterviewResponse();
|
|
479
|
+
}
|
|
425
480
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
}
|
|
481
|
+
// Now that all endpoints have been interviewed, remember which ones are there
|
|
482
|
+
// But first figure out if they seem unnecessary and if they do, which ones should be preserved
|
|
483
|
+
if (!multiResponse.identicalCapabilities
|
|
484
|
+
&& areEndpointsUnnecessary(ctx, node.id, allEndpoints)) {
|
|
485
|
+
const preserve = ctx.getDeviceConfig?.(node.id)?.compat
|
|
486
|
+
?.preserveEndpoints;
|
|
487
|
+
if (!preserve) {
|
|
488
|
+
allEndpoints = [];
|
|
489
|
+
ctx.logNode(node.id, {
|
|
490
|
+
message: `Endpoints seem unnecessary b/c they have different device classes, ignoring all...`,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
else if (preserve === "*") {
|
|
494
|
+
// preserve all endpoints, do nothing
|
|
495
|
+
ctx.logNode(node.id, {
|
|
496
|
+
message: `Endpoints seem unnecessary, but are configured to be preserved.`,
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
allEndpoints = allEndpoints.filter((ep) => preserve.includes(ep));
|
|
501
|
+
ctx.logNode(node.id, {
|
|
502
|
+
message: `Endpoints seem unnecessary, but endpoints ${allEndpoints.join(", ")} are configured to be preserved.`,
|
|
503
|
+
});
|
|
504
|
+
}
|
|
438
505
|
}
|
|
439
|
-
|
|
440
|
-
|
|
506
|
+
this.setValue(ctx, MultiChannelCCValues.endpointIndizes, allEndpoints);
|
|
507
|
+
// Remember that the interview is complete
|
|
508
|
+
this.setInterviewComplete(ctx, true);
|
|
509
|
+
}
|
|
510
|
+
async interviewV1(ctx) {
|
|
511
|
+
const node = this.getNode(ctx);
|
|
512
|
+
const endpoint = this.getEndpoint(ctx);
|
|
513
|
+
const api = CCAPI.create(CommandClasses["Multi Channel"], ctx, endpoint);
|
|
514
|
+
const valueDB = this.getValueDB(ctx);
|
|
515
|
+
// V1 works the opposite way - we scan all CCs and remember how many
|
|
516
|
+
// endpoints they have
|
|
517
|
+
const supportedCCs = [...node.getCCs()]
|
|
518
|
+
// Don't query CCs the node only controls
|
|
519
|
+
.filter(([, info]) => info.isSupported)
|
|
520
|
+
.map(([cc]) => cc)
|
|
521
|
+
// Don't query CCs that want to skip the endpoint interview
|
|
522
|
+
.filter((cc) => !CommandClass.createInstanceUnchecked(node, cc)?.skipEndpointInterview());
|
|
523
|
+
const endpointCounts = new Map();
|
|
524
|
+
for (const ccId of supportedCCs) {
|
|
441
525
|
ctx.logNode(node.id, {
|
|
442
|
-
message: `
|
|
526
|
+
message: `Querying endpoint count for CommandClass ${getCCName(ccId)}...`,
|
|
527
|
+
direction: "outbound",
|
|
443
528
|
});
|
|
529
|
+
const endpointCount = await api.getEndpointCountV1(ccId);
|
|
530
|
+
if (endpointCount != undefined) {
|
|
531
|
+
endpointCounts.set(ccId, endpointCount);
|
|
532
|
+
ctx.logNode(node.id, {
|
|
533
|
+
message: `CommandClass ${getCCName(ccId)} has ${endpointCount} endpoints`,
|
|
534
|
+
direction: "inbound",
|
|
535
|
+
});
|
|
536
|
+
}
|
|
444
537
|
}
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
538
|
+
// Store the collected information
|
|
539
|
+
// We have only individual and no dynamic and no aggregated endpoints
|
|
540
|
+
const numEndpoints = Math.max(...endpointCounts.values());
|
|
541
|
+
this.setValue(ctx, MultiChannelCCValues.endpointCountIsDynamic, false);
|
|
542
|
+
this.setValue(ctx, MultiChannelCCValues.aggregatedEndpointCount, 0);
|
|
543
|
+
this.setValue(ctx, MultiChannelCCValues.individualEndpointCount, numEndpoints);
|
|
544
|
+
// Since we queried all CCs separately, we can assume that all
|
|
545
|
+
// endpoints have different capabilities
|
|
546
|
+
this.setValue(ctx, MultiChannelCCValues.endpointsHaveIdenticalCapabilities, false);
|
|
547
|
+
for (let endpoint = 1; endpoint <= numEndpoints; endpoint++) {
|
|
548
|
+
// Check which CCs exist on this endpoint
|
|
549
|
+
const endpointCCs = [...endpointCounts.entries()]
|
|
550
|
+
.filter(([, ccEndpoints]) => ccEndpoints >= endpoint)
|
|
551
|
+
.map(([ccId]) => ccId);
|
|
552
|
+
// And store it per endpoint
|
|
553
|
+
valueDB.setValue(MultiChannelCCValues.endpointCCs.endpoint(endpoint), endpointCCs);
|
|
450
554
|
}
|
|
555
|
+
// Remember that the interview is complete
|
|
556
|
+
this.setInterviewComplete(ctx, true);
|
|
451
557
|
}
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
.
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
558
|
+
};
|
|
559
|
+
return MultiChannelCC = _classThis;
|
|
560
|
+
})();
|
|
561
|
+
export { MultiChannelCC };
|
|
562
|
+
let MultiChannelCCEndPointReport = (() => {
|
|
563
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.EndPointReport), ccValueProperty("countIsDynamic", MultiChannelCCValues.endpointCountIsDynamic), ccValueProperty("identicalCapabilities", MultiChannelCCValues.endpointsHaveIdenticalCapabilities), ccValueProperty("individualCount", MultiChannelCCValues.individualEndpointCount), ccValueProperty("aggregatedCount", MultiChannelCCValues.aggregatedEndpointCount)];
|
|
564
|
+
let _classDescriptor;
|
|
565
|
+
let _classExtraInitializers = [];
|
|
566
|
+
let _classThis;
|
|
567
|
+
let _classSuper = MultiChannelCC;
|
|
568
|
+
var MultiChannelCCEndPointReport = class extends _classSuper {
|
|
569
|
+
static { _classThis = this; }
|
|
570
|
+
static {
|
|
571
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
572
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
573
|
+
MultiChannelCCEndPointReport = _classThis = _classDescriptor.value;
|
|
574
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
575
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
576
|
+
}
|
|
577
|
+
constructor(options) {
|
|
578
|
+
super(options);
|
|
579
|
+
this.countIsDynamic = options.countIsDynamic;
|
|
580
|
+
this.identicalCapabilities = options.identicalCapabilities;
|
|
581
|
+
this.individualCount = options.individualCount;
|
|
582
|
+
this.aggregatedCount = options.aggregatedCount;
|
|
583
|
+
}
|
|
584
|
+
static from(raw, ctx) {
|
|
585
|
+
validatePayload(raw.payload.length >= 2);
|
|
586
|
+
const countIsDynamic = !!(raw.payload[0] & 0b10000000);
|
|
587
|
+
const identicalCapabilities = !!(raw.payload[0] & 0b01000000);
|
|
588
|
+
const individualCount = raw.payload[1] & 0b01111111;
|
|
589
|
+
let aggregatedCount;
|
|
590
|
+
if (raw.payload.length >= 3) {
|
|
591
|
+
aggregatedCount = raw.payload[2] & 0b01111111;
|
|
592
|
+
}
|
|
593
|
+
return new this({
|
|
594
|
+
nodeId: ctx.sourceNodeId,
|
|
595
|
+
countIsDynamic,
|
|
596
|
+
identicalCapabilities,
|
|
597
|
+
individualCount,
|
|
598
|
+
aggregatedCount,
|
|
474
599
|
});
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
600
|
+
}
|
|
601
|
+
countIsDynamic;
|
|
602
|
+
identicalCapabilities;
|
|
603
|
+
individualCount;
|
|
604
|
+
aggregatedCount;
|
|
605
|
+
serialize(ctx) {
|
|
606
|
+
this.payload = Bytes.from([
|
|
607
|
+
(this.countIsDynamic ? 0b10000000 : 0)
|
|
608
|
+
| (this.identicalCapabilities ? 0b01000000 : 0),
|
|
609
|
+
this.individualCount & 0b01111111,
|
|
610
|
+
this.aggregatedCount ?? 0,
|
|
611
|
+
]);
|
|
612
|
+
return super.serialize(ctx);
|
|
613
|
+
}
|
|
614
|
+
toLogEntry(ctx) {
|
|
615
|
+
const message = {
|
|
616
|
+
"endpoint count (individual)": this.individualCount,
|
|
617
|
+
"count is dynamic": this.countIsDynamic,
|
|
618
|
+
"identical capabilities": this.identicalCapabilities,
|
|
619
|
+
};
|
|
620
|
+
if (this.aggregatedCount != undefined) {
|
|
621
|
+
message["endpoint count (aggregated)"] = this.aggregatedCount;
|
|
482
622
|
}
|
|
623
|
+
const ret = {
|
|
624
|
+
...super.toLogEntry(ctx),
|
|
625
|
+
message,
|
|
626
|
+
};
|
|
627
|
+
return ret;
|
|
483
628
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
this.setValue(ctx, MultiChannelCCValues.endpointCountIsDynamic, false);
|
|
488
|
-
this.setValue(ctx, MultiChannelCCValues.aggregatedEndpointCount, 0);
|
|
489
|
-
this.setValue(ctx, MultiChannelCCValues.individualEndpointCount, numEndpoints);
|
|
490
|
-
// Since we queried all CCs separately, we can assume that all
|
|
491
|
-
// endpoints have different capabilities
|
|
492
|
-
this.setValue(ctx, MultiChannelCCValues.endpointsHaveIdenticalCapabilities, false);
|
|
493
|
-
for (let endpoint = 1; endpoint <= numEndpoints; endpoint++) {
|
|
494
|
-
// Check which CCs exist on this endpoint
|
|
495
|
-
const endpointCCs = [...endpointCounts.entries()]
|
|
496
|
-
.filter(([, ccEndpoints]) => ccEndpoints >= endpoint)
|
|
497
|
-
.map(([ccId]) => ccId);
|
|
498
|
-
// And store it per endpoint
|
|
499
|
-
valueDB.setValue(MultiChannelCCValues.endpointCCs.endpoint(endpoint), endpointCCs);
|
|
500
|
-
}
|
|
501
|
-
// Remember that the interview is complete
|
|
502
|
-
this.setInterviewComplete(ctx, true);
|
|
503
|
-
}
|
|
504
|
-
};
|
|
505
|
-
MultiChannelCC = __decorate([
|
|
506
|
-
commandClass(CommandClasses["Multi Channel"]),
|
|
507
|
-
implementedVersion(4),
|
|
508
|
-
ccValues(MultiChannelCCValues)
|
|
509
|
-
], MultiChannelCC);
|
|
510
|
-
export { MultiChannelCC };
|
|
511
|
-
let MultiChannelCCEndPointReport = MultiChannelCCEndPointReport_1 = class MultiChannelCCEndPointReport extends MultiChannelCC {
|
|
512
|
-
constructor(options) {
|
|
513
|
-
super(options);
|
|
514
|
-
this.countIsDynamic = options.countIsDynamic;
|
|
515
|
-
this.identicalCapabilities = options.identicalCapabilities;
|
|
516
|
-
this.individualCount = options.individualCount;
|
|
517
|
-
this.aggregatedCount = options.aggregatedCount;
|
|
518
|
-
}
|
|
519
|
-
static from(raw, ctx) {
|
|
520
|
-
validatePayload(raw.payload.length >= 2);
|
|
521
|
-
const countIsDynamic = !!(raw.payload[0] & 0b10000000);
|
|
522
|
-
const identicalCapabilities = !!(raw.payload[0] & 0b01000000);
|
|
523
|
-
const individualCount = raw.payload[1] & 0b01111111;
|
|
524
|
-
let aggregatedCount;
|
|
525
|
-
if (raw.payload.length >= 3) {
|
|
526
|
-
aggregatedCount = raw.payload[2] & 0b01111111;
|
|
527
|
-
}
|
|
528
|
-
return new MultiChannelCCEndPointReport_1({
|
|
529
|
-
nodeId: ctx.sourceNodeId,
|
|
530
|
-
countIsDynamic,
|
|
531
|
-
identicalCapabilities,
|
|
532
|
-
individualCount,
|
|
533
|
-
aggregatedCount,
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
countIsDynamic;
|
|
537
|
-
identicalCapabilities;
|
|
538
|
-
individualCount;
|
|
539
|
-
aggregatedCount;
|
|
540
|
-
serialize(ctx) {
|
|
541
|
-
this.payload = Bytes.from([
|
|
542
|
-
(this.countIsDynamic ? 0b10000000 : 0)
|
|
543
|
-
| (this.identicalCapabilities ? 0b01000000 : 0),
|
|
544
|
-
this.individualCount & 0b01111111,
|
|
545
|
-
this.aggregatedCount ?? 0,
|
|
546
|
-
]);
|
|
547
|
-
return super.serialize(ctx);
|
|
548
|
-
}
|
|
549
|
-
toLogEntry(ctx) {
|
|
550
|
-
const message = {
|
|
551
|
-
"endpoint count (individual)": this.individualCount,
|
|
552
|
-
"count is dynamic": this.countIsDynamic,
|
|
553
|
-
"identical capabilities": this.identicalCapabilities,
|
|
554
|
-
};
|
|
555
|
-
if (this.aggregatedCount != undefined) {
|
|
556
|
-
message["endpoint count (aggregated)"] = this.aggregatedCount;
|
|
557
|
-
}
|
|
558
|
-
const ret = {
|
|
559
|
-
...super.toLogEntry(ctx),
|
|
560
|
-
message,
|
|
561
|
-
};
|
|
562
|
-
return ret;
|
|
563
|
-
}
|
|
564
|
-
};
|
|
565
|
-
__decorate([
|
|
566
|
-
ccValue(MultiChannelCCValues.endpointCountIsDynamic)
|
|
567
|
-
], MultiChannelCCEndPointReport.prototype, "countIsDynamic", void 0);
|
|
568
|
-
__decorate([
|
|
569
|
-
ccValue(MultiChannelCCValues.endpointsHaveIdenticalCapabilities)
|
|
570
|
-
], MultiChannelCCEndPointReport.prototype, "identicalCapabilities", void 0);
|
|
571
|
-
__decorate([
|
|
572
|
-
ccValue(MultiChannelCCValues.individualEndpointCount)
|
|
573
|
-
], MultiChannelCCEndPointReport.prototype, "individualCount", void 0);
|
|
574
|
-
__decorate([
|
|
575
|
-
ccValue(MultiChannelCCValues.aggregatedEndpointCount)
|
|
576
|
-
], MultiChannelCCEndPointReport.prototype, "aggregatedCount", void 0);
|
|
577
|
-
MultiChannelCCEndPointReport = MultiChannelCCEndPointReport_1 = __decorate([
|
|
578
|
-
CCCommand(MultiChannelCommand.EndPointReport)
|
|
579
|
-
], MultiChannelCCEndPointReport);
|
|
629
|
+
};
|
|
630
|
+
return MultiChannelCCEndPointReport = _classThis;
|
|
631
|
+
})();
|
|
580
632
|
export { MultiChannelCCEndPointReport };
|
|
581
|
-
let MultiChannelCCEndPointGet =
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
633
|
+
let MultiChannelCCEndPointGet = (() => {
|
|
634
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.EndPointGet), expectedCCResponse(MultiChannelCCEndPointReport)];
|
|
635
|
+
let _classDescriptor;
|
|
636
|
+
let _classExtraInitializers = [];
|
|
637
|
+
let _classThis;
|
|
638
|
+
let _classSuper = MultiChannelCC;
|
|
639
|
+
var MultiChannelCCEndPointGet = class extends _classSuper {
|
|
640
|
+
static { _classThis = this; }
|
|
641
|
+
static {
|
|
642
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
643
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
644
|
+
MultiChannelCCEndPointGet = _classThis = _classDescriptor.value;
|
|
645
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
646
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
647
|
+
}
|
|
648
|
+
};
|
|
649
|
+
return MultiChannelCCEndPointGet = _classThis;
|
|
650
|
+
})();
|
|
587
651
|
export { MultiChannelCCEndPointGet };
|
|
588
|
-
let MultiChannelCCCapabilityReport =
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
specific: this.specificDeviceClass,
|
|
652
|
+
let MultiChannelCCCapabilityReport = (() => {
|
|
653
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.CapabilityReport)];
|
|
654
|
+
let _classDescriptor;
|
|
655
|
+
let _classExtraInitializers = [];
|
|
656
|
+
let _classThis;
|
|
657
|
+
let _classSuper = MultiChannelCC;
|
|
658
|
+
var MultiChannelCCCapabilityReport = class extends _classSuper {
|
|
659
|
+
static { _classThis = this; }
|
|
660
|
+
static {
|
|
661
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
662
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
663
|
+
MultiChannelCCCapabilityReport = _classThis = _classDescriptor.value;
|
|
664
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
665
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
666
|
+
}
|
|
667
|
+
constructor(options) {
|
|
668
|
+
super(options);
|
|
669
|
+
this.endpointIndex = options.endpointIndex;
|
|
670
|
+
this.genericDeviceClass = options.genericDeviceClass;
|
|
671
|
+
this.specificDeviceClass = options.specificDeviceClass;
|
|
672
|
+
this.supportedCCs = options.supportedCCs;
|
|
673
|
+
this.isDynamic = options.isDynamic;
|
|
674
|
+
this.wasRemoved = options.wasRemoved;
|
|
675
|
+
}
|
|
676
|
+
static from(raw, ctx) {
|
|
677
|
+
// Only validate the bytes we expect to see here
|
|
678
|
+
// parseApplicationNodeInformation does its own validation
|
|
679
|
+
validatePayload(raw.payload.length >= 1);
|
|
680
|
+
const endpointIndex = raw.payload[0] & 0b01111111;
|
|
681
|
+
const isDynamic = !!(raw.payload[0] & 0b10000000);
|
|
682
|
+
const NIF = parseApplicationNodeInformation(raw.payload.subarray(1));
|
|
683
|
+
const genericDeviceClass = NIF.genericDeviceClass;
|
|
684
|
+
const specificDeviceClass = NIF.specificDeviceClass;
|
|
685
|
+
const supportedCCs = NIF.supportedCCs;
|
|
686
|
+
// Removal reports have very specific information
|
|
687
|
+
const wasRemoved = isDynamic
|
|
688
|
+
&& genericDeviceClass === 0xff // "Non-Interoperable"
|
|
689
|
+
&& specificDeviceClass === 0x00;
|
|
690
|
+
return new this({
|
|
691
|
+
nodeId: ctx.sourceNodeId,
|
|
692
|
+
endpointIndex,
|
|
693
|
+
isDynamic,
|
|
694
|
+
genericDeviceClass,
|
|
695
|
+
specificDeviceClass,
|
|
696
|
+
supportedCCs,
|
|
697
|
+
wasRemoved,
|
|
635
698
|
});
|
|
636
|
-
this.setValue(ctx, ccsValue, this.supportedCCs);
|
|
637
699
|
}
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
.
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
700
|
+
persistValues(ctx) {
|
|
701
|
+
if (!super.persistValues(ctx))
|
|
702
|
+
return false;
|
|
703
|
+
const deviceClassValue = MultiChannelCCValues.endpointDeviceClass;
|
|
704
|
+
const ccsValue = MultiChannelCCValues.endpointCCs;
|
|
705
|
+
if (this.wasRemoved) {
|
|
706
|
+
this.removeValue(ctx, deviceClassValue);
|
|
707
|
+
this.removeValue(ctx, ccsValue);
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
this.setValue(ctx, deviceClassValue, {
|
|
711
|
+
generic: this.genericDeviceClass,
|
|
712
|
+
specific: this.specificDeviceClass,
|
|
713
|
+
});
|
|
714
|
+
this.setValue(ctx, ccsValue, this.supportedCCs);
|
|
715
|
+
}
|
|
716
|
+
return true;
|
|
717
|
+
}
|
|
718
|
+
// The endpoint index must be overridden to be able to attribute the information to the correct endpoint
|
|
719
|
+
genericDeviceClass;
|
|
720
|
+
specificDeviceClass;
|
|
721
|
+
supportedCCs;
|
|
722
|
+
isDynamic;
|
|
723
|
+
wasRemoved;
|
|
724
|
+
serialize(ctx) {
|
|
725
|
+
this.payload = Bytes.concat([
|
|
726
|
+
Bytes.from([
|
|
727
|
+
(this.endpointIndex & 0b01111111)
|
|
728
|
+
| (this.isDynamic ? 0b10000000 : 0),
|
|
729
|
+
]),
|
|
730
|
+
encodeApplicationNodeInformation(this),
|
|
731
|
+
]);
|
|
732
|
+
return super.serialize(ctx);
|
|
733
|
+
}
|
|
734
|
+
toLogEntry(ctx) {
|
|
735
|
+
return {
|
|
736
|
+
...super.toLogEntry(ctx),
|
|
737
|
+
message: {
|
|
738
|
+
"endpoint index": this.endpointIndex,
|
|
739
|
+
"generic device class": getGenericDeviceClass(this.genericDeviceClass).label,
|
|
740
|
+
"specific device class": getSpecificDeviceClass(this.genericDeviceClass, this.specificDeviceClass).label,
|
|
741
|
+
"is dynamic end point": this.isDynamic,
|
|
742
|
+
"supported CCs": this.supportedCCs
|
|
743
|
+
.map((cc) => `\n· ${getCCName(cc)}`)
|
|
744
|
+
.join(""),
|
|
745
|
+
},
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
};
|
|
749
|
+
return MultiChannelCCCapabilityReport = _classThis;
|
|
750
|
+
})();
|
|
674
751
|
export { MultiChannelCCCapabilityReport };
|
|
675
752
|
function testResponseForMultiChannelCapabilityGet(sent, received) {
|
|
676
753
|
return received.endpointIndex === sent.requestedEndpoint;
|
|
677
754
|
}
|
|
678
|
-
let MultiChannelCCCapabilityGet =
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
755
|
+
let MultiChannelCCCapabilityGet = (() => {
|
|
756
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.CapabilityGet), expectedCCResponse(MultiChannelCCCapabilityReport, testResponseForMultiChannelCapabilityGet)];
|
|
757
|
+
let _classDescriptor;
|
|
758
|
+
let _classExtraInitializers = [];
|
|
759
|
+
let _classThis;
|
|
760
|
+
let _classSuper = MultiChannelCC;
|
|
761
|
+
var MultiChannelCCCapabilityGet = class extends _classSuper {
|
|
762
|
+
static { _classThis = this; }
|
|
763
|
+
static {
|
|
764
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
765
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
766
|
+
MultiChannelCCCapabilityGet = _classThis = _classDescriptor.value;
|
|
767
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
768
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
769
|
+
}
|
|
770
|
+
constructor(options) {
|
|
771
|
+
super(options);
|
|
772
|
+
this.requestedEndpoint = options.requestedEndpoint;
|
|
773
|
+
}
|
|
774
|
+
static from(raw, ctx) {
|
|
775
|
+
validatePayload(raw.payload.length >= 1);
|
|
776
|
+
const requestedEndpoint = raw.payload[0] & 0b01111111;
|
|
777
|
+
return new this({
|
|
778
|
+
nodeId: ctx.sourceNodeId,
|
|
779
|
+
requestedEndpoint,
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
requestedEndpoint;
|
|
783
|
+
serialize(ctx) {
|
|
784
|
+
this.payload = Bytes.from([this.requestedEndpoint & 0b01111111]);
|
|
785
|
+
return super.serialize(ctx);
|
|
786
|
+
}
|
|
787
|
+
toLogEntry(ctx) {
|
|
788
|
+
return {
|
|
789
|
+
...super.toLogEntry(ctx),
|
|
790
|
+
message: { endpoint: this.requestedEndpoint },
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
};
|
|
794
|
+
return MultiChannelCCCapabilityGet = _classThis;
|
|
795
|
+
})();
|
|
707
796
|
export { MultiChannelCCCapabilityGet };
|
|
708
|
-
let MultiChannelCCEndPointFindReport =
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
.
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
reportsToFollow
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
797
|
+
let MultiChannelCCEndPointFindReport = (() => {
|
|
798
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.EndPointFindReport)];
|
|
799
|
+
let _classDescriptor;
|
|
800
|
+
let _classExtraInitializers = [];
|
|
801
|
+
let _classThis;
|
|
802
|
+
let _classSuper = MultiChannelCC;
|
|
803
|
+
var MultiChannelCCEndPointFindReport = class extends _classSuper {
|
|
804
|
+
static { _classThis = this; }
|
|
805
|
+
static {
|
|
806
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
807
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
808
|
+
MultiChannelCCEndPointFindReport = _classThis = _classDescriptor.value;
|
|
809
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
810
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
811
|
+
}
|
|
812
|
+
constructor(options) {
|
|
813
|
+
super(options);
|
|
814
|
+
this.genericClass = options.genericClass;
|
|
815
|
+
this.specificClass = options.specificClass;
|
|
816
|
+
this.foundEndpoints = options.foundEndpoints;
|
|
817
|
+
this.reportsToFollow = options.reportsToFollow;
|
|
818
|
+
}
|
|
819
|
+
static from(raw, ctx) {
|
|
820
|
+
validatePayload(raw.payload.length >= 3);
|
|
821
|
+
const reportsToFollow = raw.payload[0];
|
|
822
|
+
const genericClass = raw.payload[1];
|
|
823
|
+
const specificClass = raw.payload[2];
|
|
824
|
+
// Some devices omit the endpoint list although that is not allowed in the specs
|
|
825
|
+
// therefore don't validatePayload here.
|
|
826
|
+
const foundEndpoints = [...raw.payload.subarray(3)]
|
|
827
|
+
.map((e) => e & 0b01111111)
|
|
828
|
+
.filter((e) => e !== 0);
|
|
829
|
+
return new this({
|
|
830
|
+
nodeId: ctx.sourceNodeId,
|
|
831
|
+
reportsToFollow,
|
|
832
|
+
genericClass,
|
|
833
|
+
specificClass,
|
|
834
|
+
foundEndpoints,
|
|
835
|
+
});
|
|
836
|
+
}
|
|
837
|
+
genericClass;
|
|
838
|
+
specificClass;
|
|
839
|
+
foundEndpoints;
|
|
840
|
+
reportsToFollow;
|
|
841
|
+
serialize(ctx) {
|
|
842
|
+
this.payload = Bytes.concat([
|
|
843
|
+
Bytes.from([
|
|
844
|
+
this.reportsToFollow,
|
|
845
|
+
this.genericClass,
|
|
846
|
+
this.specificClass,
|
|
847
|
+
]),
|
|
848
|
+
Bytes.from(this.foundEndpoints.map((e) => e & 0b01111111)),
|
|
849
|
+
]);
|
|
850
|
+
return super.serialize(ctx);
|
|
851
|
+
}
|
|
852
|
+
getPartialCCSessionId() {
|
|
853
|
+
// Distinguish sessions by the requested device classes
|
|
854
|
+
return {
|
|
855
|
+
genericClass: this.genericClass,
|
|
856
|
+
specificClass: this.specificClass,
|
|
857
|
+
};
|
|
858
|
+
}
|
|
859
|
+
expectMoreMessages() {
|
|
860
|
+
return this.reportsToFollow > 0;
|
|
861
|
+
}
|
|
862
|
+
mergePartialCCs(partials, _ctx) {
|
|
863
|
+
// Concat the list of end points
|
|
864
|
+
this.foundEndpoints = [...partials, this]
|
|
865
|
+
.map((report) => report.foundEndpoints)
|
|
866
|
+
.reduce((prev, cur) => prev.concat(...cur), []);
|
|
867
|
+
}
|
|
868
|
+
toLogEntry(ctx) {
|
|
869
|
+
return {
|
|
870
|
+
...super.toLogEntry(ctx),
|
|
871
|
+
message: {
|
|
872
|
+
"generic device class": getGenericDeviceClass(this.genericClass).label,
|
|
873
|
+
"specific device class": getSpecificDeviceClass(this.genericClass, this.specificClass).label,
|
|
874
|
+
"found endpoints": this.foundEndpoints.join(", "),
|
|
875
|
+
"# of reports to follow": this.reportsToFollow,
|
|
876
|
+
},
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
};
|
|
880
|
+
return MultiChannelCCEndPointFindReport = _classThis;
|
|
881
|
+
})();
|
|
780
882
|
export { MultiChannelCCEndPointFindReport };
|
|
781
|
-
let MultiChannelCCEndPointFind =
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
883
|
+
let MultiChannelCCEndPointFind = (() => {
|
|
884
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.EndPointFind), expectedCCResponse(MultiChannelCCEndPointFindReport)];
|
|
885
|
+
let _classDescriptor;
|
|
886
|
+
let _classExtraInitializers = [];
|
|
887
|
+
let _classThis;
|
|
888
|
+
let _classSuper = MultiChannelCC;
|
|
889
|
+
var MultiChannelCCEndPointFind = class extends _classSuper {
|
|
890
|
+
static { _classThis = this; }
|
|
891
|
+
static {
|
|
892
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
893
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
894
|
+
MultiChannelCCEndPointFind = _classThis = _classDescriptor.value;
|
|
895
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
896
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
897
|
+
}
|
|
898
|
+
constructor(options) {
|
|
899
|
+
super(options);
|
|
900
|
+
this.genericClass = options.genericClass;
|
|
901
|
+
this.specificClass = options.specificClass;
|
|
902
|
+
}
|
|
903
|
+
static from(raw, ctx) {
|
|
904
|
+
validatePayload(raw.payload.length >= 2);
|
|
905
|
+
const genericClass = raw.payload[0];
|
|
906
|
+
const specificClass = raw.payload[1];
|
|
907
|
+
return new this({
|
|
908
|
+
nodeId: ctx.sourceNodeId,
|
|
909
|
+
genericClass,
|
|
910
|
+
specificClass,
|
|
911
|
+
});
|
|
912
|
+
}
|
|
913
|
+
genericClass;
|
|
914
|
+
specificClass;
|
|
915
|
+
serialize(ctx) {
|
|
916
|
+
this.payload = Bytes.from([this.genericClass, this.specificClass]);
|
|
917
|
+
return super.serialize(ctx);
|
|
918
|
+
}
|
|
919
|
+
toLogEntry(ctx) {
|
|
920
|
+
return {
|
|
921
|
+
...super.toLogEntry(ctx),
|
|
922
|
+
message: {
|
|
923
|
+
"generic device class": getGenericDeviceClass(this.genericClass).label,
|
|
924
|
+
"specific device class": getSpecificDeviceClass(this.genericClass, this.specificClass).label,
|
|
925
|
+
},
|
|
926
|
+
};
|
|
927
|
+
}
|
|
928
|
+
};
|
|
929
|
+
return MultiChannelCCEndPointFind = _classThis;
|
|
930
|
+
})();
|
|
817
931
|
export { MultiChannelCCEndPointFind };
|
|
818
|
-
let MultiChannelCCAggregatedMembersReport =
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
932
|
+
let MultiChannelCCAggregatedMembersReport = (() => {
|
|
933
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.AggregatedMembersReport), ccValueProperty("members", MultiChannelCCValues.aggregatedEndpointMembers, (self) => [self.aggregatedEndpointIndex])];
|
|
934
|
+
let _classDescriptor;
|
|
935
|
+
let _classExtraInitializers = [];
|
|
936
|
+
let _classThis;
|
|
937
|
+
let _classSuper = MultiChannelCC;
|
|
938
|
+
var MultiChannelCCAggregatedMembersReport = class extends _classSuper {
|
|
939
|
+
static { _classThis = this; }
|
|
940
|
+
static {
|
|
941
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
942
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
943
|
+
MultiChannelCCAggregatedMembersReport = _classThis = _classDescriptor.value;
|
|
944
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
945
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
946
|
+
}
|
|
947
|
+
constructor(options) {
|
|
948
|
+
super(options);
|
|
949
|
+
// TODO: Check implementation:
|
|
950
|
+
this.aggregatedEndpointIndex = options.aggregatedEndpointIndex;
|
|
951
|
+
this.members = options.members;
|
|
952
|
+
}
|
|
953
|
+
static from(raw, ctx) {
|
|
954
|
+
validatePayload(raw.payload.length >= 2);
|
|
955
|
+
const aggregatedEndpointIndex = raw.payload[0] & 0b0111_1111;
|
|
956
|
+
const bitMaskLength = raw.payload[1];
|
|
957
|
+
validatePayload(raw.payload.length >= 2 + bitMaskLength);
|
|
958
|
+
const bitMask = raw.payload.subarray(2, 2 + bitMaskLength);
|
|
959
|
+
const members = parseBitMask(bitMask);
|
|
960
|
+
return new this({
|
|
961
|
+
nodeId: ctx.sourceNodeId,
|
|
962
|
+
aggregatedEndpointIndex,
|
|
963
|
+
members,
|
|
964
|
+
});
|
|
965
|
+
}
|
|
966
|
+
aggregatedEndpointIndex;
|
|
967
|
+
members;
|
|
968
|
+
toLogEntry(ctx) {
|
|
969
|
+
return {
|
|
970
|
+
...super.toLogEntry(ctx),
|
|
971
|
+
message: {
|
|
972
|
+
"aggregated endpoint": this.aggregatedEndpointIndex,
|
|
973
|
+
members: this.members.join(", "),
|
|
974
|
+
},
|
|
975
|
+
};
|
|
976
|
+
}
|
|
977
|
+
};
|
|
978
|
+
return MultiChannelCCAggregatedMembersReport = _classThis;
|
|
979
|
+
})();
|
|
856
980
|
export { MultiChannelCCAggregatedMembersReport };
|
|
857
|
-
let MultiChannelCCAggregatedMembersGet =
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
981
|
+
let MultiChannelCCAggregatedMembersGet = (() => {
|
|
982
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.AggregatedMembersGet), expectedCCResponse(MultiChannelCCAggregatedMembersReport)];
|
|
983
|
+
let _classDescriptor;
|
|
984
|
+
let _classExtraInitializers = [];
|
|
985
|
+
let _classThis;
|
|
986
|
+
let _classSuper = MultiChannelCC;
|
|
987
|
+
var MultiChannelCCAggregatedMembersGet = class extends _classSuper {
|
|
988
|
+
static { _classThis = this; }
|
|
989
|
+
static {
|
|
990
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
991
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
992
|
+
MultiChannelCCAggregatedMembersGet = _classThis = _classDescriptor.value;
|
|
993
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
994
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
995
|
+
}
|
|
996
|
+
constructor(options) {
|
|
997
|
+
super(options);
|
|
998
|
+
this.requestedEndpoint = options.requestedEndpoint;
|
|
999
|
+
}
|
|
1000
|
+
static from(_raw, _ctx) {
|
|
1001
|
+
// TODO: Deserialize payload
|
|
1002
|
+
throw new ZWaveError(`${this.name}: deserialization not implemented`, ZWaveErrorCodes.Deserialization_NotImplemented);
|
|
1003
|
+
// return new MultiChannelCCAggregatedMembersGet({
|
|
1004
|
+
// nodeId: ctx.sourceNodeId,
|
|
1005
|
+
// });
|
|
1006
|
+
}
|
|
1007
|
+
requestedEndpoint;
|
|
1008
|
+
serialize(ctx) {
|
|
1009
|
+
this.payload = Bytes.from([this.requestedEndpoint & 0b0111_1111]);
|
|
1010
|
+
return super.serialize(ctx);
|
|
1011
|
+
}
|
|
1012
|
+
toLogEntry(ctx) {
|
|
1013
|
+
return {
|
|
1014
|
+
...super.toLogEntry(ctx),
|
|
1015
|
+
message: { endpoint: this.requestedEndpoint },
|
|
1016
|
+
};
|
|
1017
|
+
}
|
|
1018
|
+
};
|
|
1019
|
+
return MultiChannelCCAggregatedMembersGet = _classThis;
|
|
1020
|
+
})();
|
|
885
1021
|
export { MultiChannelCCAggregatedMembersGet };
|
|
886
1022
|
// SDS13783: A receiving node MAY respond to a Multi Channel encapsulated command if the Destination
|
|
887
1023
|
// End Point field specifies a single End Point. In that case, the response MUST be Multi Channel
|
|
@@ -906,166 +1042,203 @@ function testResponseForCommandEncapsulation(sent, received) {
|
|
|
906
1042
|
}
|
|
907
1043
|
return false;
|
|
908
1044
|
}
|
|
909
|
-
let MultiChannelCCCommandEncapsulation =
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
1045
|
+
let MultiChannelCCCommandEncapsulation = (() => {
|
|
1046
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.CommandEncapsulation), expectedCCResponse(getCCResponseForCommandEncapsulation, testResponseForCommandEncapsulation)];
|
|
1047
|
+
let _classDescriptor;
|
|
1048
|
+
let _classExtraInitializers = [];
|
|
1049
|
+
let _classThis;
|
|
1050
|
+
let _classSuper = MultiChannelCC;
|
|
1051
|
+
var MultiChannelCCCommandEncapsulation = class extends _classSuper {
|
|
1052
|
+
static { _classThis = this; }
|
|
1053
|
+
static {
|
|
1054
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
1055
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
1056
|
+
MultiChannelCCCommandEncapsulation = _classThis = _classDescriptor.value;
|
|
1057
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
1058
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
1059
|
+
}
|
|
1060
|
+
constructor(options) {
|
|
1061
|
+
super(options);
|
|
1062
|
+
this.encapsulated = options.encapsulated;
|
|
1063
|
+
this.encapsulated.encapsulatingCC = this;
|
|
1064
|
+
// Propagate the endpoint index all the way down
|
|
1065
|
+
let cur = this;
|
|
1066
|
+
while (cur) {
|
|
1067
|
+
if (isMultiEncapsulatingCommandClass(cur)) {
|
|
1068
|
+
for (const cc of cur.encapsulated) {
|
|
1069
|
+
cc.endpointIndex = this.endpointIndex;
|
|
1070
|
+
}
|
|
1071
|
+
break;
|
|
1072
|
+
}
|
|
1073
|
+
else if (isEncapsulatingCommandClass(cur)) {
|
|
1074
|
+
cur.encapsulated.endpointIndex = this.endpointIndex;
|
|
1075
|
+
cur = cur.encapsulated;
|
|
1076
|
+
}
|
|
1077
|
+
else {
|
|
1078
|
+
break;
|
|
920
1079
|
}
|
|
921
|
-
break;
|
|
922
1080
|
}
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
1081
|
+
this.destination = options.destination;
|
|
1082
|
+
}
|
|
1083
|
+
static from(raw, ctx) {
|
|
1084
|
+
validatePayload(raw.payload.length >= 2);
|
|
1085
|
+
let endpointIndex;
|
|
1086
|
+
let destination;
|
|
1087
|
+
if (ctx.getDeviceConfig?.(ctx.sourceNodeId)
|
|
1088
|
+
?.compat?.treatDestinationEndpointAsSource) {
|
|
1089
|
+
// This device incorrectly uses the destination field to indicate the source endpoint
|
|
1090
|
+
endpointIndex = raw.payload[1] & 0b0111_1111;
|
|
1091
|
+
destination = 0;
|
|
926
1092
|
}
|
|
927
1093
|
else {
|
|
928
|
-
|
|
1094
|
+
// Parse normally
|
|
1095
|
+
endpointIndex = raw.payload[0] & 0b0111_1111;
|
|
1096
|
+
const isBitMask = !!(raw.payload[1] & 0b1000_0000);
|
|
1097
|
+
destination = raw.payload[1] & 0b0111_1111;
|
|
1098
|
+
if (isBitMask) {
|
|
1099
|
+
destination = parseBitMask(Bytes.from([destination]));
|
|
1100
|
+
}
|
|
929
1101
|
}
|
|
1102
|
+
// No need to validate further, each CC does it for itself
|
|
1103
|
+
const encapsulated = CommandClass.parse(raw.payload.subarray(2), ctx);
|
|
1104
|
+
return new this({
|
|
1105
|
+
nodeId: ctx.sourceNodeId,
|
|
1106
|
+
endpointIndex,
|
|
1107
|
+
destination,
|
|
1108
|
+
encapsulated,
|
|
1109
|
+
});
|
|
930
1110
|
}
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
destination = 0;
|
|
942
|
-
}
|
|
943
|
-
else {
|
|
944
|
-
// Parse normally
|
|
945
|
-
endpointIndex = raw.payload[0] & 0b0111_1111;
|
|
946
|
-
const isBitMask = !!(raw.payload[1] & 0b1000_0000);
|
|
947
|
-
destination = raw.payload[1] & 0b0111_1111;
|
|
948
|
-
if (isBitMask) {
|
|
949
|
-
destination = parseBitMask(Bytes.from([destination]));
|
|
1111
|
+
encapsulated;
|
|
1112
|
+
/** The destination end point (0-127) or an array of destination end points (1-7) */
|
|
1113
|
+
destination;
|
|
1114
|
+
serialize(ctx) {
|
|
1115
|
+
if (ctx.getDeviceConfig?.(this.nodeId)?.compat
|
|
1116
|
+
?.treatDestinationEndpointAsSource) {
|
|
1117
|
+
// This device incorrectly responds from the endpoint we've passed as our source endpoint
|
|
1118
|
+
if (typeof this.destination === "number") {
|
|
1119
|
+
this.endpointIndex = this.destination;
|
|
1120
|
+
}
|
|
950
1121
|
}
|
|
1122
|
+
const destination = typeof this.destination === "number"
|
|
1123
|
+
// The destination is a single number
|
|
1124
|
+
? this.destination & 0b0111_1111
|
|
1125
|
+
// The destination is a bit mask
|
|
1126
|
+
: encodeBitMask(this.destination, 7)[0] | 0b1000_0000;
|
|
1127
|
+
this.payload = Bytes.concat([
|
|
1128
|
+
Bytes.from([this.endpointIndex & 0b0111_1111, destination]),
|
|
1129
|
+
this.encapsulated.serialize(ctx),
|
|
1130
|
+
]);
|
|
1131
|
+
return super.serialize(ctx);
|
|
951
1132
|
}
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
/** The destination end point (0-127) or an array of destination end points (1-7) */
|
|
963
|
-
destination;
|
|
964
|
-
serialize(ctx) {
|
|
965
|
-
if (ctx.getDeviceConfig?.(this.nodeId)?.compat
|
|
966
|
-
?.treatDestinationEndpointAsSource) {
|
|
967
|
-
// This device incorrectly responds from the endpoint we've passed as our source endpoint
|
|
968
|
-
if (typeof this.destination === "number") {
|
|
969
|
-
this.endpointIndex = this.destination;
|
|
970
|
-
}
|
|
1133
|
+
toLogEntry(ctx) {
|
|
1134
|
+
return {
|
|
1135
|
+
...super.toLogEntry(ctx),
|
|
1136
|
+
message: {
|
|
1137
|
+
source: this.endpointIndex,
|
|
1138
|
+
destination: typeof this.destination === "number"
|
|
1139
|
+
? this.destination
|
|
1140
|
+
: this.destination.join(", "),
|
|
1141
|
+
},
|
|
1142
|
+
};
|
|
971
1143
|
}
|
|
972
|
-
|
|
973
|
-
//
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
this.encapsulated.serialize(ctx),
|
|
980
|
-
]);
|
|
981
|
-
return super.serialize(ctx);
|
|
982
|
-
}
|
|
983
|
-
toLogEntry(ctx) {
|
|
984
|
-
return {
|
|
985
|
-
...super.toLogEntry(ctx),
|
|
986
|
-
message: {
|
|
987
|
-
source: this.endpointIndex,
|
|
988
|
-
destination: typeof this.destination === "number"
|
|
989
|
-
? this.destination
|
|
990
|
-
: this.destination.join(", "),
|
|
991
|
-
},
|
|
992
|
-
};
|
|
993
|
-
}
|
|
994
|
-
computeEncapsulationOverhead() {
|
|
995
|
-
// Multi Channel CC adds two bytes for the source and destination endpoint
|
|
996
|
-
return super.computeEncapsulationOverhead() + 2;
|
|
997
|
-
}
|
|
998
|
-
};
|
|
999
|
-
MultiChannelCCCommandEncapsulation = MultiChannelCCCommandEncapsulation_1 = __decorate([
|
|
1000
|
-
CCCommand(MultiChannelCommand.CommandEncapsulation),
|
|
1001
|
-
expectedCCResponse(getCCResponseForCommandEncapsulation, testResponseForCommandEncapsulation)
|
|
1002
|
-
], MultiChannelCCCommandEncapsulation);
|
|
1144
|
+
computeEncapsulationOverhead() {
|
|
1145
|
+
// Multi Channel CC adds two bytes for the source and destination endpoint
|
|
1146
|
+
return super.computeEncapsulationOverhead() + 2;
|
|
1147
|
+
}
|
|
1148
|
+
};
|
|
1149
|
+
return MultiChannelCCCommandEncapsulation = _classThis;
|
|
1150
|
+
})();
|
|
1003
1151
|
export { MultiChannelCCCommandEncapsulation };
|
|
1004
|
-
let MultiChannelCCV1Report =
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1152
|
+
let MultiChannelCCV1Report = (() => {
|
|
1153
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.ReportV1)];
|
|
1154
|
+
let _classDescriptor;
|
|
1155
|
+
let _classExtraInitializers = [];
|
|
1156
|
+
let _classThis;
|
|
1157
|
+
let _classSuper = MultiChannelCC;
|
|
1158
|
+
var MultiChannelCCV1Report = class extends _classSuper {
|
|
1159
|
+
static { _classThis = this; }
|
|
1160
|
+
static {
|
|
1161
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
1162
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
1163
|
+
MultiChannelCCV1Report = _classThis = _classDescriptor.value;
|
|
1164
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
1165
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
1166
|
+
}
|
|
1167
|
+
constructor(options) {
|
|
1168
|
+
super(options);
|
|
1169
|
+
// TODO: Check implementation:
|
|
1170
|
+
this.requestedCC = options.requestedCC;
|
|
1171
|
+
this.endpointCount = options.endpointCount;
|
|
1172
|
+
}
|
|
1173
|
+
static from(raw, ctx) {
|
|
1174
|
+
// V1 won't be extended in the future, so do an exact check
|
|
1175
|
+
validatePayload(raw.payload.length === 2);
|
|
1176
|
+
const requestedCC = raw.payload[0];
|
|
1177
|
+
const endpointCount = raw.payload[1];
|
|
1178
|
+
return new this({
|
|
1179
|
+
nodeId: ctx.sourceNodeId,
|
|
1180
|
+
requestedCC,
|
|
1181
|
+
endpointCount,
|
|
1182
|
+
});
|
|
1183
|
+
}
|
|
1184
|
+
requestedCC;
|
|
1185
|
+
endpointCount;
|
|
1186
|
+
toLogEntry(ctx) {
|
|
1187
|
+
return {
|
|
1188
|
+
...super.toLogEntry(ctx),
|
|
1189
|
+
message: {
|
|
1190
|
+
CC: getCCName(this.requestedCC),
|
|
1191
|
+
"# of endpoints": this.endpointCount,
|
|
1192
|
+
},
|
|
1193
|
+
};
|
|
1194
|
+
}
|
|
1195
|
+
};
|
|
1196
|
+
return MultiChannelCCV1Report = _classThis;
|
|
1197
|
+
})();
|
|
1037
1198
|
export { MultiChannelCCV1Report };
|
|
1038
1199
|
function testResponseForMultiChannelV1Get(sent, received) {
|
|
1039
1200
|
return sent.requestedCC === received.requestedCC;
|
|
1040
1201
|
}
|
|
1041
|
-
let MultiChannelCCV1Get =
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1202
|
+
let MultiChannelCCV1Get = (() => {
|
|
1203
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.GetV1), expectedCCResponse(MultiChannelCCV1Report, testResponseForMultiChannelV1Get)];
|
|
1204
|
+
let _classDescriptor;
|
|
1205
|
+
let _classExtraInitializers = [];
|
|
1206
|
+
let _classThis;
|
|
1207
|
+
let _classSuper = MultiChannelCC;
|
|
1208
|
+
var MultiChannelCCV1Get = class extends _classSuper {
|
|
1209
|
+
static { _classThis = this; }
|
|
1210
|
+
static {
|
|
1211
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
1212
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
1213
|
+
MultiChannelCCV1Get = _classThis = _classDescriptor.value;
|
|
1214
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
1215
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
1216
|
+
}
|
|
1217
|
+
constructor(options) {
|
|
1218
|
+
super(options);
|
|
1219
|
+
this.requestedCC = options.requestedCC;
|
|
1220
|
+
}
|
|
1221
|
+
static from(_raw, _ctx) {
|
|
1222
|
+
// TODO: Deserialize payload
|
|
1223
|
+
throw new ZWaveError(`${this.name}: deserialization not implemented`, ZWaveErrorCodes.Deserialization_NotImplemented);
|
|
1224
|
+
// return new MultiChannelCCV1Get({
|
|
1225
|
+
// nodeId: ctx.sourceNodeId,
|
|
1226
|
+
// });
|
|
1227
|
+
}
|
|
1228
|
+
requestedCC;
|
|
1229
|
+
serialize(ctx) {
|
|
1230
|
+
this.payload = Bytes.from([this.requestedCC]);
|
|
1231
|
+
return super.serialize(ctx);
|
|
1232
|
+
}
|
|
1233
|
+
toLogEntry(ctx) {
|
|
1234
|
+
return {
|
|
1235
|
+
...super.toLogEntry(ctx),
|
|
1236
|
+
message: { CC: getCCName(this.requestedCC) },
|
|
1237
|
+
};
|
|
1238
|
+
}
|
|
1239
|
+
};
|
|
1240
|
+
return MultiChannelCCV1Get = _classThis;
|
|
1241
|
+
})();
|
|
1069
1242
|
export { MultiChannelCCV1Get };
|
|
1070
1243
|
function getResponseForV1CommandEncapsulation(sent) {
|
|
1071
1244
|
if (sent.encapsulated.expectsCCResponse()) {
|
|
@@ -1078,50 +1251,62 @@ function testResponseForV1CommandEncapsulation(sent, received) {
|
|
|
1078
1251
|
}
|
|
1079
1252
|
return false;
|
|
1080
1253
|
}
|
|
1081
|
-
let MultiChannelCCV1CommandEncapsulation =
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
encapsulated
|
|
1101
|
-
}
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1254
|
+
let MultiChannelCCV1CommandEncapsulation = (() => {
|
|
1255
|
+
let _classDecorators = [CCCommand(MultiChannelCommand.CommandEncapsulationV1), expectedCCResponse(getResponseForV1CommandEncapsulation, testResponseForV1CommandEncapsulation)];
|
|
1256
|
+
let _classDescriptor;
|
|
1257
|
+
let _classExtraInitializers = [];
|
|
1258
|
+
let _classThis;
|
|
1259
|
+
let _classSuper = MultiChannelCC;
|
|
1260
|
+
var MultiChannelCCV1CommandEncapsulation = class extends _classSuper {
|
|
1261
|
+
static { _classThis = this; }
|
|
1262
|
+
static {
|
|
1263
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
1264
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
1265
|
+
MultiChannelCCV1CommandEncapsulation = _classThis = _classDescriptor.value;
|
|
1266
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
1267
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
1268
|
+
}
|
|
1269
|
+
constructor(options) {
|
|
1270
|
+
super(options);
|
|
1271
|
+
this.encapsulated = options.encapsulated;
|
|
1272
|
+
// No need to distinguish between source and destination in V1
|
|
1273
|
+
this.endpointIndex = this.encapsulated.endpointIndex;
|
|
1274
|
+
}
|
|
1275
|
+
static from(raw, ctx) {
|
|
1276
|
+
validatePayload(raw.payload.length >= 1);
|
|
1277
|
+
const endpointIndex = raw.payload[0];
|
|
1278
|
+
// Some devices send invalid reports, i.e. MultiChannelCCV1CommandEncapsulation, but with V2+ binary format
|
|
1279
|
+
// This would be a NoOp CC, but it makes no sense to encapsulate that.
|
|
1280
|
+
const isV2withV1Header = raw.payload.length >= 2
|
|
1281
|
+
&& raw.payload[1] === 0x00;
|
|
1282
|
+
// No need to validate further, each CC does it for itself
|
|
1283
|
+
const encapsulated = CommandClass.parse(raw.payload.subarray(isV2withV1Header ? 2 : 1), ctx);
|
|
1284
|
+
return new this({
|
|
1285
|
+
nodeId: ctx.sourceNodeId,
|
|
1286
|
+
endpointIndex,
|
|
1287
|
+
encapsulated,
|
|
1288
|
+
});
|
|
1289
|
+
}
|
|
1290
|
+
encapsulated;
|
|
1291
|
+
serialize(ctx) {
|
|
1292
|
+
this.payload = Bytes.concat([
|
|
1293
|
+
Bytes.from([this.endpointIndex]),
|
|
1294
|
+
this.encapsulated.serialize(ctx),
|
|
1295
|
+
]);
|
|
1296
|
+
return super.serialize(ctx);
|
|
1297
|
+
}
|
|
1298
|
+
computeEncapsulationOverhead() {
|
|
1299
|
+
// Multi Channel CC V1 adds one byte for the endpoint index
|
|
1300
|
+
return super.computeEncapsulationOverhead() + 1;
|
|
1301
|
+
}
|
|
1302
|
+
toLogEntry(ctx) {
|
|
1303
|
+
return {
|
|
1304
|
+
...super.toLogEntry(ctx),
|
|
1305
|
+
message: { source: this.endpointIndex },
|
|
1306
|
+
};
|
|
1307
|
+
}
|
|
1308
|
+
};
|
|
1309
|
+
return MultiChannelCCV1CommandEncapsulation = _classThis;
|
|
1310
|
+
})();
|
|
1126
1311
|
export { MultiChannelCCV1CommandEncapsulation };
|
|
1127
1312
|
//# sourceMappingURL=MultiChannelCC.js.map
|