@zwave-js/cc 14.0.0-beta.1 → 14.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/cc/AlarmSensorCC.d.ts +194 -0
- package/build/cjs/cc/AlarmSensorCC.js +395 -0
- package/build/cjs/cc/AlarmSensorCC.js.map +7 -0
- package/build/cjs/cc/AssociationCC.d.ts +253 -0
- package/build/cjs/cc/AssociationCC.js +711 -0
- package/build/cjs/cc/AssociationCC.js.map +7 -0
- package/build/cjs/cc/AssociationGroupInfoCC.d.ts +230 -0
- package/build/cjs/cc/AssociationGroupInfoCC.js +746 -0
- package/build/cjs/cc/AssociationGroupInfoCC.js.map +7 -0
- package/build/cjs/cc/BarrierOperatorCC.d.ts +243 -0
- package/build/cjs/cc/BarrierOperatorCC.js +582 -0
- package/build/cjs/cc/BarrierOperatorCC.js.map +7 -0
- package/build/cjs/cc/BasicCC.d.ts +191 -0
- package/build/cjs/cc/BasicCC.js +384 -0
- package/build/cjs/cc/BasicCC.js.map +7 -0
- package/build/cjs/cc/BatteryCC.d.ts +406 -0
- package/build/cjs/cc/BatteryCC.js +508 -0
- package/build/cjs/cc/BatteryCC.js.map +7 -0
- package/build/cjs/cc/BinarySensorCC.d.ts +122 -0
- package/build/cjs/cc/BinarySensorCC.js +431 -0
- package/build/cjs/cc/BinarySensorCC.js.map +7 -0
- package/build/cjs/cc/BinarySwitchCC.d.ts +139 -0
- package/build/cjs/cc/BinarySwitchCC.js +378 -0
- package/build/cjs/cc/BinarySwitchCC.js.map +7 -0
- package/build/cjs/cc/CRC16CC.d.ts +29 -0
- package/build/cjs/cc/CRC16CC.js +133 -0
- package/build/cjs/cc/CRC16CC.js.map +7 -0
- package/build/cjs/cc/CentralSceneCC.d.ts +210 -0
- package/build/cjs/cc/CentralSceneCC.js +449 -0
- package/build/cjs/cc/CentralSceneCC.js.map +7 -0
- package/build/cjs/cc/ClimateControlScheduleCC.d.ts +177 -0
- package/build/cjs/cc/ClimateControlScheduleCC.js +480 -0
- package/build/cjs/cc/ClimateControlScheduleCC.js.map +7 -0
- package/build/cjs/cc/ClockCC.d.ts +47 -0
- package/build/cjs/cc/ClockCC.js +226 -0
- package/build/cjs/cc/ClockCC.js.map +7 -0
- package/build/cjs/cc/ColorSwitchCC.d.ts +339 -0
- package/build/cjs/cc/ColorSwitchCC.js +1117 -0
- package/build/cjs/cc/ColorSwitchCC.js.map +7 -0
- package/build/cjs/cc/ConfigurationCC.d.ts +396 -0
- package/build/cjs/cc/ConfigurationCC.js +2230 -0
- package/build/cjs/cc/ConfigurationCC.js.map +7 -0
- package/build/cjs/cc/DeviceResetLocallyCC.d.ts +17 -0
- package/build/cjs/cc/DeviceResetLocallyCC.js +92 -0
- package/build/cjs/cc/DeviceResetLocallyCC.js.map +7 -0
- package/build/cjs/cc/DoorLockCC.d.ts +837 -0
- package/build/cjs/cc/DoorLockCC.js +1239 -0
- package/build/cjs/cc/DoorLockCC.js.map +7 -0
- package/build/cjs/cc/DoorLockLoggingCC.d.ts +77 -0
- package/build/cjs/cc/DoorLockLoggingCC.js +343 -0
- package/build/cjs/cc/DoorLockLoggingCC.js.map +7 -0
- package/build/cjs/cc/EnergyProductionCC.d.ts +77 -0
- package/build/cjs/cc/EnergyProductionCC.js +240 -0
- package/build/cjs/cc/EnergyProductionCC.js.map +7 -0
- package/build/cjs/cc/EntryControlCC.d.ts +231 -0
- package/build/cjs/cc/EntryControlCC.js +593 -0
- package/build/cjs/cc/EntryControlCC.js.map +7 -0
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.d.ts +359 -0
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js +1122 -0
- package/build/cjs/cc/FirmwareUpdateMetaDataCC.js.map +7 -0
- package/build/cjs/cc/HailCC.d.ts +6 -0
- package/build/cjs/cc/HailCC.js +45 -0
- package/build/cjs/cc/HailCC.js.map +7 -0
- package/build/cjs/cc/HumidityControlModeCC.d.ts +111 -0
- package/build/cjs/cc/HumidityControlModeCC.js +323 -0
- package/build/cjs/cc/HumidityControlModeCC.js.map +7 -0
- package/build/cjs/cc/HumidityControlOperatingStateCC.d.ts +60 -0
- package/build/cjs/cc/HumidityControlOperatingStateCC.js +164 -0
- package/build/cjs/cc/HumidityControlOperatingStateCC.js.map +7 -0
- package/build/cjs/cc/HumidityControlSetpointCC.d.ts +209 -0
- package/build/cjs/cc/HumidityControlSetpointCC.js +634 -0
- package/build/cjs/cc/HumidityControlSetpointCC.js.map +7 -0
- package/build/cjs/cc/InclusionControllerCC.d.ts +42 -0
- package/build/cjs/cc/InclusionControllerCC.js +160 -0
- package/build/cjs/cc/InclusionControllerCC.js.map +7 -0
- package/build/cjs/cc/IndicatorCC.d.ts +338 -0
- package/build/cjs/cc/IndicatorCC.js +1234 -0
- package/build/cjs/cc/IndicatorCC.js.map +7 -0
- package/build/cjs/cc/IrrigationCC.d.ts +1496 -0
- package/build/cjs/cc/IrrigationCC.js +1978 -0
- package/build/cjs/cc/IrrigationCC.js.map +7 -0
- package/build/cjs/cc/LanguageCC.d.ts +101 -0
- package/build/cjs/cc/LanguageCC.js +267 -0
- package/build/cjs/cc/LanguageCC.js.map +7 -0
- package/build/cjs/cc/LockCC.d.ts +73 -0
- package/build/cjs/cc/LockCC.js +222 -0
- package/build/cjs/cc/LockCC.js.map +7 -0
- package/build/cjs/cc/ManufacturerProprietaryCC.d.ts +32 -0
- package/build/cjs/cc/ManufacturerProprietaryCC.js +209 -0
- package/build/cjs/cc/ManufacturerProprietaryCC.js.map +7 -0
- package/build/cjs/cc/ManufacturerSpecificCC.d.ts +171 -0
- package/build/cjs/cc/ManufacturerSpecificCC.js +334 -0
- package/build/cjs/cc/ManufacturerSpecificCC.js.map +7 -0
- package/build/cjs/cc/MeterCC.d.ts +318 -0
- package/build/cjs/cc/MeterCC.js +1235 -0
- package/build/cjs/cc/MeterCC.js.map +7 -0
- package/build/cjs/cc/MultiChannelAssociationCC.d.ts +241 -0
- package/build/cjs/cc/MultiChannelAssociationCC.js +956 -0
- package/build/cjs/cc/MultiChannelAssociationCC.js.map +7 -0
- package/build/cjs/cc/MultiChannelCC.d.ts +394 -0
- package/build/cjs/cc/MultiChannelCC.js +1050 -0
- package/build/cjs/cc/MultiChannelCC.js.map +7 -0
- package/build/cjs/cc/MultiCommandCC.d.ts +27 -0
- package/build/cjs/cc/MultiCommandCC.js +159 -0
- package/build/cjs/cc/MultiCommandCC.js.map +7 -0
- package/build/cjs/cc/MultilevelSensorCC.d.ts +185 -0
- package/build/cjs/cc/MultilevelSensorCC.js +716 -0
- package/build/cjs/cc/MultilevelSensorCC.js.map +7 -0
- package/build/cjs/cc/MultilevelSwitchCC.d.ts +357 -0
- package/build/cjs/cc/MultilevelSwitchCC.js +780 -0
- package/build/cjs/cc/MultilevelSwitchCC.js.map +7 -0
- package/build/cjs/cc/NoOperationCC.d.ts +9 -0
- package/build/cjs/cc/NoOperationCC.js +64 -0
- package/build/cjs/cc/NoOperationCC.js.map +7 -0
- package/build/cjs/cc/NodeNamingCC.d.ts +118 -0
- package/build/cjs/cc/NodeNamingCC.js +364 -0
- package/build/cjs/cc/NodeNamingCC.js.map +7 -0
- package/build/cjs/cc/NotificationCC.d.ts +479 -0
- package/build/cjs/cc/NotificationCC.js +1245 -0
- package/build/cjs/cc/NotificationCC.js.map +7 -0
- package/build/cjs/cc/PowerlevelCC.d.ts +82 -0
- package/build/cjs/cc/PowerlevelCC.js +510 -0
- package/build/cjs/cc/PowerlevelCC.js.map +7 -0
- package/build/cjs/cc/ProtectionCC.d.ts +325 -0
- package/build/cjs/cc/ProtectionCC.js +667 -0
- package/build/cjs/cc/ProtectionCC.js.map +7 -0
- package/build/cjs/cc/SceneActivationCC.d.ts +89 -0
- package/build/cjs/cc/SceneActivationCC.js +193 -0
- package/build/cjs/cc/SceneActivationCC.js.map +7 -0
- package/build/cjs/cc/SceneActuatorConfigurationCC.d.ts +120 -0
- package/build/cjs/cc/SceneActuatorConfigurationCC.js +370 -0
- package/build/cjs/cc/SceneActuatorConfigurationCC.js.map +7 -0
- package/build/cjs/cc/SceneControllerConfigurationCC.d.ts +129 -0
- package/build/cjs/cc/SceneControllerConfigurationCC.js +423 -0
- package/build/cjs/cc/SceneControllerConfigurationCC.js.map +7 -0
- package/build/cjs/cc/ScheduleEntryLockCC.d.ts +434 -0
- package/build/cjs/cc/ScheduleEntryLockCC.js +1763 -0
- package/build/cjs/cc/ScheduleEntryLockCC.js.map +7 -0
- package/build/cjs/cc/Security2CC.d.ts +251 -0
- package/build/cjs/cc/Security2CC.js +1589 -0
- package/build/cjs/cc/Security2CC.js.map +7 -0
- package/build/cjs/cc/SecurityCC.d.ts +128 -0
- package/build/cjs/cc/SecurityCC.js +757 -0
- package/build/cjs/cc/SecurityCC.js.map +7 -0
- package/build/cjs/cc/SoundSwitchCC.d.ts +232 -0
- package/build/cjs/cc/SoundSwitchCC.js +661 -0
- package/build/cjs/cc/SoundSwitchCC.js.map +7 -0
- package/build/cjs/cc/SupervisionCC.d.ts +104 -0
- package/build/cjs/cc/SupervisionCC.js +308 -0
- package/build/cjs/cc/SupervisionCC.js.map +7 -0
- package/build/cjs/cc/ThermostatFanModeCC.d.ts +141 -0
- package/build/cjs/cc/ThermostatFanModeCC.js +372 -0
- package/build/cjs/cc/ThermostatFanModeCC.js.map +7 -0
- package/build/cjs/cc/ThermostatFanStateCC.d.ts +60 -0
- package/build/cjs/cc/ThermostatFanStateCC.js +166 -0
- package/build/cjs/cc/ThermostatFanStateCC.js.map +7 -0
- package/build/cjs/cc/ThermostatModeCC.d.ts +150 -0
- package/build/cjs/cc/ThermostatModeCC.js +436 -0
- package/build/cjs/cc/ThermostatModeCC.js.map +7 -0
- package/build/cjs/cc/ThermostatOperatingStateCC.d.ts +61 -0
- package/build/cjs/cc/ThermostatOperatingStateCC.js +162 -0
- package/build/cjs/cc/ThermostatOperatingStateCC.js.map +7 -0
- package/build/cjs/cc/ThermostatSetbackCC.d.ts +46 -0
- package/build/cjs/cc/ThermostatSetbackCC.js +262 -0
- package/build/cjs/cc/ThermostatSetbackCC.js.map +7 -0
- package/build/cjs/cc/ThermostatSetpointCC.d.ts +197 -0
- package/build/cjs/cc/ThermostatSetpointCC.js +638 -0
- package/build/cjs/cc/ThermostatSetpointCC.js.map +7 -0
- package/build/cjs/cc/TimeCC.d.ts +88 -0
- package/build/cjs/cc/TimeCC.js +473 -0
- package/build/cjs/cc/TimeCC.js.map +7 -0
- package/build/cjs/cc/TimeParametersCC.d.ts +72 -0
- package/build/cjs/cc/TimeParametersCC.js +313 -0
- package/build/cjs/cc/TimeParametersCC.js.map +7 -0
- package/build/cjs/cc/TransportServiceCC.d.ts +107 -0
- package/build/cjs/cc/TransportServiceCC.js +404 -0
- package/build/cjs/cc/TransportServiceCC.js.map +7 -0
- package/build/cjs/cc/UserCodeCC.d.ts +683 -0
- package/build/cjs/cc/UserCodeCC.js +1620 -0
- package/build/cjs/cc/UserCodeCC.js.map +7 -0
- package/build/cjs/cc/VersionCC.d.ts +469 -0
- package/build/cjs/cc/VersionCC.js +828 -0
- package/build/cjs/cc/VersionCC.js.map +7 -0
- package/build/cjs/cc/WakeUpCC.d.ts +150 -0
- package/build/cjs/cc/WakeUpCC.js +456 -0
- package/build/cjs/cc/WakeUpCC.js.map +7 -0
- package/build/cjs/cc/WindowCoveringCC.d.ts +315 -0
- package/build/cjs/cc/WindowCoveringCC.js +776 -0
- package/build/cjs/cc/WindowCoveringCC.js.map +7 -0
- package/build/cjs/cc/ZWaveLongRangeCC.d.ts +4 -0
- package/build/cjs/cc/ZWaveLongRangeCC.js +43 -0
- package/build/cjs/cc/ZWaveLongRangeCC.js.map +7 -0
- package/build/cjs/cc/ZWavePlusCC.d.ts +163 -0
- package/build/cjs/cc/ZWavePlusCC.js +288 -0
- package/build/cjs/cc/ZWavePlusCC.js.map +7 -0
- package/build/cjs/cc/ZWaveProtocolCC.d.ts +344 -0
- package/build/cjs/cc/ZWaveProtocolCC.js +1071 -0
- package/build/cjs/cc/ZWaveProtocolCC.js.map +7 -0
- package/build/cjs/cc/index.d.ts +132 -0
- package/build/cjs/cc/index.js +1180 -0
- package/build/cjs/cc/index.js.map +7 -0
- package/build/cjs/cc/manufacturerProprietary/Decorators.d.ts +64 -0
- package/build/cjs/cc/manufacturerProprietary/Decorators.js +76 -0
- package/build/cjs/cc/manufacturerProprietary/Decorators.js.map +7 -0
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.d.ts +79 -0
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.js +412 -0
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +7 -0
- package/build/cjs/index.d.ts +15 -0
- package/build/cjs/index.js +77 -0
- package/build/cjs/index.js.map +7 -0
- package/build/cjs/index_safe.d.ts +3 -0
- package/build/cjs/index_safe.js +25 -0
- package/build/cjs/index_safe.js.map +7 -0
- package/build/cjs/lib/API.d.ts +271 -0
- package/build/cjs/lib/API.js +413 -0
- package/build/cjs/lib/API.js.map +7 -0
- package/build/cjs/lib/CommandClass.d.ts +234 -0
- package/build/cjs/lib/CommandClass.js +692 -0
- package/build/cjs/lib/CommandClass.js.map +7 -0
- package/build/cjs/lib/CommandClassDecorators.d.ts +112 -0
- package/build/cjs/lib/CommandClassDecorators.js +182 -0
- package/build/cjs/lib/CommandClassDecorators.js.map +7 -0
- package/build/cjs/lib/EncapsulatingCommandClass.d.ts +22 -0
- package/build/cjs/lib/EncapsulatingCommandClass.js +71 -0
- package/build/cjs/lib/EncapsulatingCommandClass.js.map +7 -0
- package/build/cjs/lib/ICommandClassContainer.js +17 -0
- package/build/cjs/lib/ICommandClassContainer.js.map +7 -0
- package/build/cjs/lib/NotificationEventPayload.d.ts +10 -0
- package/build/cjs/lib/NotificationEventPayload.js +31 -0
- package/build/cjs/lib/NotificationEventPayload.js.map +7 -0
- package/build/cjs/lib/Security2/Extension.js +333 -0
- package/build/cjs/lib/Security2/Extension.js.map +7 -0
- package/build/cjs/lib/Security2/shared.js +69 -0
- package/build/cjs/lib/Security2/shared.js.map +7 -0
- package/build/cjs/lib/SetValueResult.js +65 -0
- package/build/cjs/lib/SetValueResult.js.map +7 -0
- package/build/cjs/lib/Values.d.ts +223 -0
- package/build/cjs/lib/Values.js +191 -0
- package/build/cjs/lib/Values.js.map +7 -0
- package/build/cjs/lib/_Types.js +1676 -0
- package/build/cjs/lib/_Types.js.map +7 -0
- package/build/cjs/lib/serializers.d.ts +34 -0
- package/build/cjs/lib/serializers.js +110 -0
- package/build/cjs/lib/serializers.js.map +7 -0
- package/build/cjs/lib/utils.d.ts +17 -0
- package/build/cjs/lib/utils.js +678 -0
- package/build/cjs/lib/utils.js.map +7 -0
- package/build/cjs/package.json +3 -0
- package/build/esm/cc/AlarmSensorCC.d.ts +194 -0
- package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -0
- package/build/esm/cc/AlarmSensorCC.js +392 -0
- package/build/esm/cc/AlarmSensorCC.js.map +1 -0
- package/build/esm/cc/AssociationCC.d.ts +253 -0
- package/build/esm/cc/AssociationCC.d.ts.map +1 -0
- package/build/esm/cc/AssociationCC.js +706 -0
- package/build/esm/cc/AssociationCC.js.map +1 -0
- package/build/esm/cc/AssociationGroupInfoCC.d.ts +230 -0
- package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -0
- package/build/esm/cc/AssociationGroupInfoCC.js +769 -0
- package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -0
- package/build/esm/cc/BarrierOperatorCC.d.ts +243 -0
- package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -0
- package/build/esm/cc/BarrierOperatorCC.js +610 -0
- package/build/esm/cc/BarrierOperatorCC.js.map +1 -0
- package/build/esm/cc/BasicCC.d.ts +191 -0
- package/build/esm/cc/BasicCC.d.ts.map +1 -0
- package/build/esm/cc/BasicCC.js +390 -0
- package/build/esm/cc/BasicCC.js.map +1 -0
- package/build/esm/cc/BatteryCC.d.ts +406 -0
- package/build/esm/cc/BatteryCC.d.ts.map +1 -0
- package/build/esm/cc/BatteryCC.js +513 -0
- package/build/esm/cc/BatteryCC.js.map +1 -0
- package/build/esm/cc/BinarySensorCC.d.ts +122 -0
- package/build/esm/cc/BinarySensorCC.d.ts.map +1 -0
- package/build/esm/cc/BinarySensorCC.js +417 -0
- package/build/esm/cc/BinarySensorCC.js.map +1 -0
- package/build/esm/cc/BinarySwitchCC.d.ts +139 -0
- package/build/esm/cc/BinarySwitchCC.d.ts.map +1 -0
- package/build/esm/cc/BinarySwitchCC.js +362 -0
- package/build/esm/cc/BinarySwitchCC.js.map +1 -0
- package/build/esm/cc/CRC16CC.d.ts +29 -0
- package/build/esm/cc/CRC16CC.d.ts.map +1 -0
- package/build/esm/cc/CRC16CC.js +123 -0
- package/build/esm/cc/CRC16CC.js.map +1 -0
- package/build/esm/cc/CentralSceneCC.d.ts +210 -0
- package/build/esm/cc/CentralSceneCC.d.ts.map +1 -0
- package/build/esm/cc/CentralSceneCC.js +427 -0
- package/build/esm/cc/CentralSceneCC.js.map +1 -0
- package/build/esm/cc/ClimateControlScheduleCC.d.ts +177 -0
- package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -0
- package/build/esm/cc/ClimateControlScheduleCC.js +466 -0
- package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -0
- package/build/esm/cc/ClockCC.d.ts +47 -0
- package/build/esm/cc/ClockCC.d.ts.map +1 -0
- package/build/esm/cc/ClockCC.js +205 -0
- package/build/esm/cc/ClockCC.js.map +1 -0
- package/build/esm/cc/ColorSwitchCC.d.ts +339 -0
- package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -0
- package/build/esm/cc/ColorSwitchCC.js +1149 -0
- package/build/esm/cc/ColorSwitchCC.js.map +1 -0
- package/build/esm/cc/ConfigurationCC.d.ts +396 -0
- package/build/esm/cc/ConfigurationCC.d.ts.map +1 -0
- package/build/esm/cc/ConfigurationCC.js +2454 -0
- package/build/esm/cc/ConfigurationCC.js.map +1 -0
- package/build/esm/cc/DeviceResetLocallyCC.d.ts +17 -0
- package/build/esm/cc/DeviceResetLocallyCC.d.ts.map +1 -0
- package/build/esm/cc/DeviceResetLocallyCC.js +73 -0
- package/build/esm/cc/DeviceResetLocallyCC.js.map +1 -0
- package/build/esm/cc/DoorLockCC.d.ts +837 -0
- package/build/esm/cc/DoorLockCC.d.ts.map +1 -0
- package/build/esm/cc/DoorLockCC.js +1270 -0
- package/build/esm/cc/DoorLockCC.js.map +1 -0
- package/build/esm/cc/DoorLockLoggingCC.d.ts +77 -0
- package/build/esm/cc/DoorLockLoggingCC.d.ts.map +1 -0
- package/build/esm/cc/DoorLockLoggingCC.js +316 -0
- package/build/esm/cc/DoorLockLoggingCC.js.map +1 -0
- package/build/esm/cc/EnergyProductionCC.d.ts +77 -0
- package/build/esm/cc/EnergyProductionCC.d.ts.map +1 -0
- package/build/esm/cc/EnergyProductionCC.js +213 -0
- package/build/esm/cc/EnergyProductionCC.js.map +1 -0
- package/build/esm/cc/EntryControlCC.d.ts +231 -0
- package/build/esm/cc/EntryControlCC.d.ts.map +1 -0
- package/build/esm/cc/EntryControlCC.js +581 -0
- package/build/esm/cc/EntryControlCC.js.map +1 -0
- package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts +359 -0
- package/build/esm/cc/FirmwareUpdateMetaDataCC.d.ts.map +1 -0
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js +1142 -0
- package/build/esm/cc/FirmwareUpdateMetaDataCC.js.map +1 -0
- package/build/esm/cc/HailCC.d.ts +6 -0
- package/build/esm/cc/HailCC.d.ts.map +1 -0
- package/build/esm/cc/HailCC.js +21 -0
- package/build/esm/cc/HailCC.js.map +1 -0
- package/build/esm/cc/HumidityControlModeCC.d.ts +111 -0
- package/build/esm/cc/HumidityControlModeCC.d.ts.map +1 -0
- package/build/esm/cc/HumidityControlModeCC.js +305 -0
- package/build/esm/cc/HumidityControlModeCC.js.map +1 -0
- package/build/esm/cc/HumidityControlOperatingStateCC.d.ts +60 -0
- package/build/esm/cc/HumidityControlOperatingStateCC.d.ts.map +1 -0
- package/build/esm/cc/HumidityControlOperatingStateCC.js +137 -0
- package/build/esm/cc/HumidityControlOperatingStateCC.js.map +1 -0
- package/build/esm/cc/HumidityControlSetpointCC.d.ts +209 -0
- package/build/esm/cc/HumidityControlSetpointCC.d.ts.map +1 -0
- package/build/esm/cc/HumidityControlSetpointCC.js +645 -0
- package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -0
- package/build/esm/cc/InclusionControllerCC.d.ts +42 -0
- package/build/esm/cc/InclusionControllerCC.d.ts.map +1 -0
- package/build/esm/cc/InclusionControllerCC.js +133 -0
- package/build/esm/cc/InclusionControllerCC.js.map +1 -0
- package/build/esm/cc/IndicatorCC.d.ts +338 -0
- package/build/esm/cc/IndicatorCC.d.ts.map +1 -0
- package/build/esm/cc/IndicatorCC.js +1317 -0
- package/build/esm/cc/IndicatorCC.js.map +1 -0
- package/build/esm/cc/IrrigationCC.d.ts +1496 -0
- package/build/esm/cc/IrrigationCC.d.ts.map +1 -0
- package/build/esm/cc/IrrigationCC.js +2038 -0
- package/build/esm/cc/IrrigationCC.js.map +1 -0
- package/build/esm/cc/LanguageCC.d.ts +101 -0
- package/build/esm/cc/LanguageCC.d.ts.map +1 -0
- package/build/esm/cc/LanguageCC.js +243 -0
- package/build/esm/cc/LanguageCC.js.map +1 -0
- package/build/esm/cc/LockCC.d.ts +73 -0
- package/build/esm/cc/LockCC.d.ts.map +1 -0
- package/build/esm/cc/LockCC.js +197 -0
- package/build/esm/cc/LockCC.js.map +1 -0
- package/build/esm/cc/ManufacturerProprietaryCC.d.ts +32 -0
- package/build/esm/cc/ManufacturerProprietaryCC.d.ts.map +1 -0
- package/build/esm/cc/ManufacturerProprietaryCC.js +201 -0
- package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -0
- package/build/esm/cc/ManufacturerSpecificCC.d.ts +171 -0
- package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -0
- package/build/esm/cc/ManufacturerSpecificCC.js +315 -0
- package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -0
- package/build/esm/cc/MeterCC.d.ts +318 -0
- package/build/esm/cc/MeterCC.d.ts.map +1 -0
- package/build/esm/cc/MeterCC.js +1308 -0
- package/build/esm/cc/MeterCC.js.map +1 -0
- package/build/esm/cc/MultiChannelAssociationCC.d.ts +241 -0
- package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -0
- package/build/esm/cc/MultiChannelAssociationCC.js +981 -0
- package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -0
- package/build/esm/cc/MultiChannelCC.d.ts +394 -0
- package/build/esm/cc/MultiChannelCC.d.ts.map +1 -0
- package/build/esm/cc/MultiChannelCC.js +1127 -0
- package/build/esm/cc/MultiChannelCC.js.map +1 -0
- package/build/esm/cc/MultiCommandCC.d.ts +27 -0
- package/build/esm/cc/MultiCommandCC.d.ts.map +1 -0
- package/build/esm/cc/MultiCommandCC.js +142 -0
- package/build/esm/cc/MultiCommandCC.js.map +1 -0
- package/build/esm/cc/MultilevelSensorCC.d.ts +185 -0
- package/build/esm/cc/MultilevelSensorCC.d.ts.map +1 -0
- package/build/esm/cc/MultilevelSensorCC.js +753 -0
- package/build/esm/cc/MultilevelSensorCC.js.map +1 -0
- package/build/esm/cc/MultilevelSwitchCC.d.ts +357 -0
- package/build/esm/cc/MultilevelSwitchCC.d.ts.map +1 -0
- package/build/esm/cc/MultilevelSwitchCC.js +810 -0
- package/build/esm/cc/MultilevelSwitchCC.js.map +1 -0
- package/build/esm/cc/NoOperationCC.d.ts +9 -0
- package/build/esm/cc/NoOperationCC.d.ts.map +1 -0
- package/build/esm/cc/NoOperationCC.js +39 -0
- package/build/esm/cc/NoOperationCC.js.map +1 -0
- package/build/esm/cc/NodeNamingCC.d.ts +118 -0
- package/build/esm/cc/NodeNamingCC.d.ts.map +1 -0
- package/build/esm/cc/NodeNamingCC.js +345 -0
- package/build/esm/cc/NodeNamingCC.js.map +1 -0
- package/build/esm/cc/NotificationCC.d.ts +479 -0
- package/build/esm/cc/NotificationCC.d.ts.map +1 -0
- package/build/esm/cc/NotificationCC.js +1350 -0
- package/build/esm/cc/NotificationCC.js.map +1 -0
- package/build/esm/cc/PowerlevelCC.d.ts +82 -0
- package/build/esm/cc/PowerlevelCC.d.ts.map +1 -0
- package/build/esm/cc/PowerlevelCC.js +485 -0
- package/build/esm/cc/PowerlevelCC.js.map +1 -0
- package/build/esm/cc/ProtectionCC.d.ts +325 -0
- package/build/esm/cc/ProtectionCC.d.ts.map +1 -0
- package/build/esm/cc/ProtectionCC.js +669 -0
- package/build/esm/cc/ProtectionCC.js.map +1 -0
- package/build/esm/cc/SceneActivationCC.d.ts +89 -0
- package/build/esm/cc/SceneActivationCC.d.ts.map +1 -0
- package/build/esm/cc/SceneActivationCC.js +166 -0
- package/build/esm/cc/SceneActivationCC.js.map +1 -0
- package/build/esm/cc/SceneActuatorConfigurationCC.d.ts +120 -0
- package/build/esm/cc/SceneActuatorConfigurationCC.d.ts.map +1 -0
- package/build/esm/cc/SceneActuatorConfigurationCC.js +374 -0
- package/build/esm/cc/SceneActuatorConfigurationCC.js.map +1 -0
- package/build/esm/cc/SceneControllerConfigurationCC.d.ts +129 -0
- package/build/esm/cc/SceneControllerConfigurationCC.d.ts.map +1 -0
- package/build/esm/cc/SceneControllerConfigurationCC.js +446 -0
- package/build/esm/cc/SceneControllerConfigurationCC.js.map +1 -0
- package/build/esm/cc/ScheduleEntryLockCC.d.ts +434 -0
- package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -0
- package/build/esm/cc/ScheduleEntryLockCC.js +1826 -0
- package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -0
- package/build/esm/cc/Security2CC.d.ts +251 -0
- package/build/esm/cc/Security2CC.d.ts.map +1 -0
- package/build/esm/cc/Security2CC.js +1814 -0
- package/build/esm/cc/Security2CC.js.map +1 -0
- package/build/esm/cc/SecurityCC.d.ts +128 -0
- package/build/esm/cc/SecurityCC.d.ts.map +1 -0
- package/build/esm/cc/SecurityCC.js +800 -0
- package/build/esm/cc/SecurityCC.js.map +1 -0
- package/build/esm/cc/SoundSwitchCC.d.ts +232 -0
- package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -0
- package/build/esm/cc/SoundSwitchCC.js +633 -0
- package/build/esm/cc/SoundSwitchCC.js.map +1 -0
- package/build/esm/cc/SupervisionCC.d.ts +104 -0
- package/build/esm/cc/SupervisionCC.d.ts.map +1 -0
- package/build/esm/cc/SupervisionCC.js +319 -0
- package/build/esm/cc/SupervisionCC.js.map +1 -0
- package/build/esm/cc/ThermostatFanModeCC.d.ts +141 -0
- package/build/esm/cc/ThermostatFanModeCC.d.ts.map +1 -0
- package/build/esm/cc/ThermostatFanModeCC.js +359 -0
- package/build/esm/cc/ThermostatFanModeCC.js.map +1 -0
- package/build/esm/cc/ThermostatFanStateCC.d.ts +60 -0
- package/build/esm/cc/ThermostatFanStateCC.d.ts.map +1 -0
- package/build/esm/cc/ThermostatFanStateCC.js +139 -0
- package/build/esm/cc/ThermostatFanStateCC.js.map +1 -0
- package/build/esm/cc/ThermostatModeCC.d.ts +150 -0
- package/build/esm/cc/ThermostatModeCC.d.ts.map +1 -0
- package/build/esm/cc/ThermostatModeCC.js +426 -0
- package/build/esm/cc/ThermostatModeCC.js.map +1 -0
- package/build/esm/cc/ThermostatOperatingStateCC.d.ts +61 -0
- package/build/esm/cc/ThermostatOperatingStateCC.d.ts.map +1 -0
- package/build/esm/cc/ThermostatOperatingStateCC.js +135 -0
- package/build/esm/cc/ThermostatOperatingStateCC.js.map +1 -0
- package/build/esm/cc/ThermostatSetbackCC.d.ts +46 -0
- package/build/esm/cc/ThermostatSetbackCC.d.ts.map +1 -0
- package/build/esm/cc/ThermostatSetbackCC.js +244 -0
- package/build/esm/cc/ThermostatSetbackCC.js.map +1 -0
- package/build/esm/cc/ThermostatSetpointCC.d.ts +197 -0
- package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -0
- package/build/esm/cc/ThermostatSetpointCC.js +655 -0
- package/build/esm/cc/ThermostatSetpointCC.js.map +1 -0
- package/build/esm/cc/TimeCC.d.ts +88 -0
- package/build/esm/cc/TimeCC.d.ts.map +1 -0
- package/build/esm/cc/TimeCC.js +451 -0
- package/build/esm/cc/TimeCC.js.map +1 -0
- package/build/esm/cc/TimeParametersCC.d.ts +72 -0
- package/build/esm/cc/TimeParametersCC.d.ts.map +1 -0
- package/build/esm/cc/TimeParametersCC.js +300 -0
- package/build/esm/cc/TimeParametersCC.js.map +1 -0
- package/build/esm/cc/TransportServiceCC.d.ts +107 -0
- package/build/esm/cc/TransportServiceCC.d.ts.map +1 -0
- package/build/esm/cc/TransportServiceCC.js +422 -0
- package/build/esm/cc/TransportServiceCC.js.map +1 -0
- package/build/esm/cc/UserCodeCC.d.ts +683 -0
- package/build/esm/cc/UserCodeCC.d.ts.map +1 -0
- package/build/esm/cc/UserCodeCC.js +1695 -0
- package/build/esm/cc/UserCodeCC.js.map +1 -0
- package/build/esm/cc/VersionCC.d.ts +469 -0
- package/build/esm/cc/VersionCC.d.ts.map +1 -0
- package/build/esm/cc/VersionCC.js +862 -0
- package/build/esm/cc/VersionCC.js.map +1 -0
- package/build/esm/cc/WakeUpCC.d.ts +150 -0
- package/build/esm/cc/WakeUpCC.d.ts.map +1 -0
- package/build/esm/cc/WakeUpCC.js +438 -0
- package/build/esm/cc/WakeUpCC.js.map +1 -0
- package/build/esm/cc/WindowCoveringCC.d.ts +315 -0
- package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -0
- package/build/esm/cc/WindowCoveringCC.js +780 -0
- package/build/esm/cc/WindowCoveringCC.js.map +1 -0
- package/build/esm/cc/ZWaveLongRangeCC.d.ts +4 -0
- package/build/esm/cc/ZWaveLongRangeCC.d.ts.map +1 -0
- package/build/esm/cc/ZWaveLongRangeCC.js +17 -0
- package/build/esm/cc/ZWaveLongRangeCC.js.map +1 -0
- package/build/esm/cc/ZWavePlusCC.d.ts +163 -0
- package/build/esm/cc/ZWavePlusCC.d.ts.map +1 -0
- package/build/esm/cc/ZWavePlusCC.js +267 -0
- package/build/esm/cc/ZWavePlusCC.js.map +1 -0
- package/build/esm/cc/ZWaveProtocolCC.d.ts +344 -0
- package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -0
- package/build/esm/cc/ZWaveProtocolCC.js +1030 -0
- package/build/esm/cc/ZWaveProtocolCC.js.map +1 -0
- package/build/esm/cc/index.d.ts +132 -0
- package/build/esm/cc/index.d.ts.map +1 -0
- package/build/esm/cc/index.js +71 -0
- package/build/esm/cc/index.js.map +1 -0
- package/build/esm/cc/manufacturerProprietary/Decorators.d.ts +64 -0
- package/build/esm/cc/manufacturerProprietary/Decorators.d.ts.map +1 -0
- package/build/esm/cc/manufacturerProprietary/Decorators.js +79 -0
- package/build/esm/cc/manufacturerProprietary/Decorators.js.map +1 -0
- package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts +79 -0
- package/build/esm/cc/manufacturerProprietary/FibaroCC.d.ts.map +1 -0
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js +385 -0
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -0
- package/build/esm/index.d.ts +15 -0
- package/build/esm/index.d.ts.map +1 -0
- package/build/esm/index.js +14 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/index_safe.d.ts +3 -0
- package/build/esm/index_safe.d.ts.map +1 -0
- package/build/esm/index_safe.js +4 -0
- package/build/esm/index_safe.js.map +1 -0
- package/build/esm/lib/API.d.ts +271 -0
- package/build/esm/lib/API.d.ts.map +1 -0
- package/build/esm/lib/API.js +448 -0
- package/build/esm/lib/API.js.map +1 -0
- package/build/esm/lib/CommandClass.d.ts +234 -0
- package/build/esm/lib/CommandClass.d.ts.map +1 -0
- package/build/esm/lib/CommandClass.js +781 -0
- package/build/esm/lib/CommandClass.js.map +1 -0
- package/build/esm/lib/CommandClassDecorators.d.ts +112 -0
- package/build/esm/lib/CommandClassDecorators.d.ts.map +1 -0
- package/build/esm/lib/CommandClassDecorators.js +229 -0
- package/build/esm/lib/CommandClassDecorators.js.map +1 -0
- package/build/esm/lib/EncapsulatingCommandClass.d.ts +22 -0
- package/build/esm/lib/EncapsulatingCommandClass.d.ts.map +1 -0
- package/build/esm/lib/EncapsulatingCommandClass.js +56 -0
- package/build/esm/lib/EncapsulatingCommandClass.js.map +1 -0
- package/build/esm/lib/ICommandClassContainer.d.ts +2 -0
- package/build/esm/lib/ICommandClassContainer.d.ts.map +1 -0
- package/build/esm/lib/ICommandClassContainer.js +2 -0
- package/build/esm/lib/ICommandClassContainer.js.map +1 -0
- package/build/esm/lib/NotificationEventPayload.d.ts +10 -0
- package/build/esm/lib/NotificationEventPayload.d.ts.map +1 -0
- package/build/esm/lib/NotificationEventPayload.js +7 -0
- package/build/esm/lib/NotificationEventPayload.js.map +1 -0
- package/build/esm/lib/Security2/Extension.d.ts +106 -0
- package/build/esm/lib/Security2/Extension.d.ts.map +1 -0
- package/build/esm/lib/Security2/Extension.js +296 -0
- package/build/esm/lib/Security2/Extension.js.map +1 -0
- package/build/esm/lib/Security2/shared.d.ts +37 -0
- package/build/esm/lib/Security2/shared.d.ts.map +1 -0
- package/build/esm/lib/Security2/shared.js +40 -0
- package/build/esm/lib/Security2/shared.js.map +1 -0
- package/build/esm/lib/SetValueResult.d.ts +55 -0
- package/build/esm/lib/SetValueResult.d.ts.map +1 -0
- package/build/esm/lib/SetValueResult.js +53 -0
- package/build/esm/lib/SetValueResult.js.map +1 -0
- package/build/esm/lib/Values.d.ts +223 -0
- package/build/esm/lib/Values.d.ts.map +1 -0
- package/build/esm/lib/Values.js +169 -0
- package/build/esm/lib/Values.js.map +1 -0
- package/build/esm/lib/_Types.d.ts +1461 -0
- package/build/esm/lib/_Types.d.ts.map +1 -0
- package/build/esm/lib/_Types.js +1432 -0
- package/build/esm/lib/_Types.js.map +1 -0
- package/build/esm/lib/serializers.d.ts +34 -0
- package/build/esm/lib/serializers.d.ts.map +1 -0
- package/build/esm/lib/serializers.js +98 -0
- package/build/esm/lib/serializers.js.map +1 -0
- package/build/esm/lib/utils.d.ts +17 -0
- package/build/esm/lib/utils.d.ts.map +1 -0
- package/build/esm/lib/utils.js +847 -0
- package/build/esm/lib/utils.js.map +1 -0
- package/build/esm/package.json +3 -0
- package/package.json +28 -23
- package/build/cc/AlarmSensorCC.d.ts +0 -194
- package/build/cc/AlarmSensorCC.d.ts.map +0 -1
- package/build/cc/AlarmSensorCC.js +0 -395
- package/build/cc/AlarmSensorCC.js.map +0 -1
- package/build/cc/AssociationCC.d.ts +0 -253
- package/build/cc/AssociationCC.d.ts.map +0 -1
- package/build/cc/AssociationCC.js +0 -732
- package/build/cc/AssociationCC.js.map +0 -1
- package/build/cc/AssociationGroupInfoCC.d.ts +0 -230
- package/build/cc/AssociationGroupInfoCC.d.ts.map +0 -1
- package/build/cc/AssociationGroupInfoCC.js +0 -772
- package/build/cc/AssociationGroupInfoCC.js.map +0 -1
- package/build/cc/BarrierOperatorCC.d.ts +0 -243
- package/build/cc/BarrierOperatorCC.d.ts.map +0 -1
- package/build/cc/BarrierOperatorCC.js +0 -613
- package/build/cc/BarrierOperatorCC.js.map +0 -1
- package/build/cc/BasicCC.d.ts +0 -191
- package/build/cc/BasicCC.d.ts.map +0 -1
- package/build/cc/BasicCC.js +0 -393
- package/build/cc/BasicCC.js.map +0 -1
- package/build/cc/BatteryCC.d.ts +0 -406
- package/build/cc/BatteryCC.d.ts.map +0 -1
- package/build/cc/BatteryCC.js +0 -516
- package/build/cc/BatteryCC.js.map +0 -1
- package/build/cc/BinarySensorCC.d.ts +0 -122
- package/build/cc/BinarySensorCC.d.ts.map +0 -1
- package/build/cc/BinarySensorCC.js +0 -420
- package/build/cc/BinarySensorCC.js.map +0 -1
- package/build/cc/BinarySwitchCC.d.ts +0 -139
- package/build/cc/BinarySwitchCC.d.ts.map +0 -1
- package/build/cc/BinarySwitchCC.js +0 -365
- package/build/cc/BinarySwitchCC.js.map +0 -1
- package/build/cc/CRC16CC.d.ts +0 -29
- package/build/cc/CRC16CC.d.ts.map +0 -1
- package/build/cc/CRC16CC.js +0 -126
- package/build/cc/CRC16CC.js.map +0 -1
- package/build/cc/CentralSceneCC.d.ts +0 -210
- package/build/cc/CentralSceneCC.d.ts.map +0 -1
- package/build/cc/CentralSceneCC.js +0 -453
- package/build/cc/CentralSceneCC.js.map +0 -1
- package/build/cc/ClimateControlScheduleCC.d.ts +0 -177
- package/build/cc/ClimateControlScheduleCC.d.ts.map +0 -1
- package/build/cc/ClimateControlScheduleCC.js +0 -469
- package/build/cc/ClimateControlScheduleCC.js.map +0 -1
- package/build/cc/ClockCC.d.ts +0 -47
- package/build/cc/ClockCC.d.ts.map +0 -1
- package/build/cc/ClockCC.js +0 -208
- package/build/cc/ClockCC.js.map +0 -1
- package/build/cc/ColorSwitchCC.d.ts +0 -339
- package/build/cc/ColorSwitchCC.d.ts.map +0 -1
- package/build/cc/ColorSwitchCC.js +0 -1152
- package/build/cc/ColorSwitchCC.js.map +0 -1
- package/build/cc/ConfigurationCC.d.ts +0 -396
- package/build/cc/ConfigurationCC.d.ts.map +0 -1
- package/build/cc/ConfigurationCC.js +0 -2458
- package/build/cc/ConfigurationCC.js.map +0 -1
- package/build/cc/DeviceResetLocallyCC.d.ts +0 -17
- package/build/cc/DeviceResetLocallyCC.d.ts.map +0 -1
- package/build/cc/DeviceResetLocallyCC.js +0 -76
- package/build/cc/DeviceResetLocallyCC.js.map +0 -1
- package/build/cc/DoorLockCC.d.ts +0 -837
- package/build/cc/DoorLockCC.d.ts.map +0 -1
- package/build/cc/DoorLockCC.js +0 -1273
- package/build/cc/DoorLockCC.js.map +0 -1
- package/build/cc/DoorLockLoggingCC.d.ts +0 -77
- package/build/cc/DoorLockLoggingCC.d.ts.map +0 -1
- package/build/cc/DoorLockLoggingCC.js +0 -319
- package/build/cc/DoorLockLoggingCC.js.map +0 -1
- package/build/cc/EnergyProductionCC.d.ts +0 -77
- package/build/cc/EnergyProductionCC.d.ts.map +0 -1
- package/build/cc/EnergyProductionCC.js +0 -216
- package/build/cc/EnergyProductionCC.js.map +0 -1
- package/build/cc/EntryControlCC.d.ts +0 -231
- package/build/cc/EntryControlCC.d.ts.map +0 -1
- package/build/cc/EntryControlCC.js +0 -607
- package/build/cc/EntryControlCC.js.map +0 -1
- package/build/cc/FirmwareUpdateMetaDataCC.d.ts +0 -359
- package/build/cc/FirmwareUpdateMetaDataCC.d.ts.map +0 -1
- package/build/cc/FirmwareUpdateMetaDataCC.js +0 -1145
- package/build/cc/FirmwareUpdateMetaDataCC.js.map +0 -1
- package/build/cc/HailCC.d.ts +0 -6
- package/build/cc/HailCC.d.ts.map +0 -1
- package/build/cc/HailCC.js +0 -24
- package/build/cc/HailCC.js.map +0 -1
- package/build/cc/HumidityControlModeCC.d.ts +0 -111
- package/build/cc/HumidityControlModeCC.d.ts.map +0 -1
- package/build/cc/HumidityControlModeCC.js +0 -308
- package/build/cc/HumidityControlModeCC.js.map +0 -1
- package/build/cc/HumidityControlOperatingStateCC.d.ts +0 -60
- package/build/cc/HumidityControlOperatingStateCC.d.ts.map +0 -1
- package/build/cc/HumidityControlOperatingStateCC.js +0 -140
- package/build/cc/HumidityControlOperatingStateCC.js.map +0 -1
- package/build/cc/HumidityControlSetpointCC.d.ts +0 -209
- package/build/cc/HumidityControlSetpointCC.d.ts.map +0 -1
- package/build/cc/HumidityControlSetpointCC.js +0 -648
- package/build/cc/HumidityControlSetpointCC.js.map +0 -1
- package/build/cc/InclusionControllerCC.d.ts +0 -42
- package/build/cc/InclusionControllerCC.d.ts.map +0 -1
- package/build/cc/InclusionControllerCC.js +0 -136
- package/build/cc/InclusionControllerCC.js.map +0 -1
- package/build/cc/IndicatorCC.d.ts +0 -338
- package/build/cc/IndicatorCC.d.ts.map +0 -1
- package/build/cc/IndicatorCC.js +0 -1320
- package/build/cc/IndicatorCC.js.map +0 -1
- package/build/cc/IrrigationCC.d.ts +0 -1496
- package/build/cc/IrrigationCC.d.ts.map +0 -1
- package/build/cc/IrrigationCC.js +0 -2041
- package/build/cc/IrrigationCC.js.map +0 -1
- package/build/cc/LanguageCC.d.ts +0 -101
- package/build/cc/LanguageCC.d.ts.map +0 -1
- package/build/cc/LanguageCC.js +0 -246
- package/build/cc/LanguageCC.js.map +0 -1
- package/build/cc/LockCC.d.ts +0 -73
- package/build/cc/LockCC.d.ts.map +0 -1
- package/build/cc/LockCC.js +0 -200
- package/build/cc/LockCC.js.map +0 -1
- package/build/cc/ManufacturerProprietaryCC.d.ts +0 -32
- package/build/cc/ManufacturerProprietaryCC.d.ts.map +0 -1
- package/build/cc/ManufacturerProprietaryCC.js +0 -204
- package/build/cc/ManufacturerProprietaryCC.js.map +0 -1
- package/build/cc/ManufacturerSpecificCC.d.ts +0 -171
- package/build/cc/ManufacturerSpecificCC.d.ts.map +0 -1
- package/build/cc/ManufacturerSpecificCC.js +0 -318
- package/build/cc/ManufacturerSpecificCC.js.map +0 -1
- package/build/cc/MeterCC.d.ts +0 -318
- package/build/cc/MeterCC.d.ts.map +0 -1
- package/build/cc/MeterCC.js +0 -1312
- package/build/cc/MeterCC.js.map +0 -1
- package/build/cc/MultiChannelAssociationCC.d.ts +0 -241
- package/build/cc/MultiChannelAssociationCC.d.ts.map +0 -1
- package/build/cc/MultiChannelAssociationCC.js +0 -1007
- package/build/cc/MultiChannelAssociationCC.js.map +0 -1
- package/build/cc/MultiChannelCC.d.ts +0 -394
- package/build/cc/MultiChannelCC.d.ts.map +0 -1
- package/build/cc/MultiChannelCC.js +0 -1130
- package/build/cc/MultiChannelCC.js.map +0 -1
- package/build/cc/MultiCommandCC.d.ts +0 -27
- package/build/cc/MultiCommandCC.d.ts.map +0 -1
- package/build/cc/MultiCommandCC.js +0 -145
- package/build/cc/MultiCommandCC.js.map +0 -1
- package/build/cc/MultilevelSensorCC.d.ts +0 -185
- package/build/cc/MultilevelSensorCC.d.ts.map +0 -1
- package/build/cc/MultilevelSensorCC.js +0 -756
- package/build/cc/MultilevelSensorCC.js.map +0 -1
- package/build/cc/MultilevelSwitchCC.d.ts +0 -357
- package/build/cc/MultilevelSwitchCC.d.ts.map +0 -1
- package/build/cc/MultilevelSwitchCC.js +0 -813
- package/build/cc/MultilevelSwitchCC.js.map +0 -1
- package/build/cc/NoOperationCC.d.ts +0 -9
- package/build/cc/NoOperationCC.d.ts.map +0 -1
- package/build/cc/NoOperationCC.js +0 -42
- package/build/cc/NoOperationCC.js.map +0 -1
- package/build/cc/NodeNamingCC.d.ts +0 -118
- package/build/cc/NodeNamingCC.d.ts.map +0 -1
- package/build/cc/NodeNamingCC.js +0 -348
- package/build/cc/NodeNamingCC.js.map +0 -1
- package/build/cc/NotificationCC.d.ts +0 -479
- package/build/cc/NotificationCC.d.ts.map +0 -1
- package/build/cc/NotificationCC.js +0 -1379
- package/build/cc/NotificationCC.js.map +0 -1
- package/build/cc/PowerlevelCC.d.ts +0 -82
- package/build/cc/PowerlevelCC.d.ts.map +0 -1
- package/build/cc/PowerlevelCC.js +0 -488
- package/build/cc/PowerlevelCC.js.map +0 -1
- package/build/cc/ProtectionCC.d.ts +0 -325
- package/build/cc/ProtectionCC.d.ts.map +0 -1
- package/build/cc/ProtectionCC.js +0 -672
- package/build/cc/ProtectionCC.js.map +0 -1
- package/build/cc/SceneActivationCC.d.ts +0 -89
- package/build/cc/SceneActivationCC.d.ts.map +0 -1
- package/build/cc/SceneActivationCC.js +0 -169
- package/build/cc/SceneActivationCC.js.map +0 -1
- package/build/cc/SceneActuatorConfigurationCC.d.ts +0 -120
- package/build/cc/SceneActuatorConfigurationCC.d.ts.map +0 -1
- package/build/cc/SceneActuatorConfigurationCC.js +0 -377
- package/build/cc/SceneActuatorConfigurationCC.js.map +0 -1
- package/build/cc/SceneControllerConfigurationCC.d.ts +0 -129
- package/build/cc/SceneControllerConfigurationCC.d.ts.map +0 -1
- package/build/cc/SceneControllerConfigurationCC.js +0 -449
- package/build/cc/SceneControllerConfigurationCC.js.map +0 -1
- package/build/cc/ScheduleEntryLockCC.d.ts +0 -434
- package/build/cc/ScheduleEntryLockCC.d.ts.map +0 -1
- package/build/cc/ScheduleEntryLockCC.js +0 -1829
- package/build/cc/ScheduleEntryLockCC.js.map +0 -1
- package/build/cc/Security2CC.d.ts +0 -251
- package/build/cc/Security2CC.d.ts.map +0 -1
- package/build/cc/Security2CC.js +0 -1817
- package/build/cc/Security2CC.js.map +0 -1
- package/build/cc/SecurityCC.d.ts +0 -128
- package/build/cc/SecurityCC.d.ts.map +0 -1
- package/build/cc/SecurityCC.js +0 -803
- package/build/cc/SecurityCC.js.map +0 -1
- package/build/cc/SoundSwitchCC.d.ts +0 -232
- package/build/cc/SoundSwitchCC.d.ts.map +0 -1
- package/build/cc/SoundSwitchCC.js +0 -636
- package/build/cc/SoundSwitchCC.js.map +0 -1
- package/build/cc/SupervisionCC.d.ts +0 -104
- package/build/cc/SupervisionCC.d.ts.map +0 -1
- package/build/cc/SupervisionCC.js +0 -322
- package/build/cc/SupervisionCC.js.map +0 -1
- package/build/cc/ThermostatFanModeCC.d.ts +0 -141
- package/build/cc/ThermostatFanModeCC.d.ts.map +0 -1
- package/build/cc/ThermostatFanModeCC.js +0 -362
- package/build/cc/ThermostatFanModeCC.js.map +0 -1
- package/build/cc/ThermostatFanStateCC.d.ts +0 -60
- package/build/cc/ThermostatFanStateCC.d.ts.map +0 -1
- package/build/cc/ThermostatFanStateCC.js +0 -142
- package/build/cc/ThermostatFanStateCC.js.map +0 -1
- package/build/cc/ThermostatModeCC.d.ts +0 -150
- package/build/cc/ThermostatModeCC.d.ts.map +0 -1
- package/build/cc/ThermostatModeCC.js +0 -429
- package/build/cc/ThermostatModeCC.js.map +0 -1
- package/build/cc/ThermostatOperatingStateCC.d.ts +0 -61
- package/build/cc/ThermostatOperatingStateCC.d.ts.map +0 -1
- package/build/cc/ThermostatOperatingStateCC.js +0 -138
- package/build/cc/ThermostatOperatingStateCC.js.map +0 -1
- package/build/cc/ThermostatSetbackCC.d.ts +0 -46
- package/build/cc/ThermostatSetbackCC.d.ts.map +0 -1
- package/build/cc/ThermostatSetbackCC.js +0 -247
- package/build/cc/ThermostatSetbackCC.js.map +0 -1
- package/build/cc/ThermostatSetpointCC.d.ts +0 -197
- package/build/cc/ThermostatSetpointCC.d.ts.map +0 -1
- package/build/cc/ThermostatSetpointCC.js +0 -658
- package/build/cc/ThermostatSetpointCC.js.map +0 -1
- package/build/cc/TimeCC.d.ts +0 -88
- package/build/cc/TimeCC.d.ts.map +0 -1
- package/build/cc/TimeCC.js +0 -454
- package/build/cc/TimeCC.js.map +0 -1
- package/build/cc/TimeParametersCC.d.ts +0 -72
- package/build/cc/TimeParametersCC.d.ts.map +0 -1
- package/build/cc/TimeParametersCC.js +0 -303
- package/build/cc/TimeParametersCC.js.map +0 -1
- package/build/cc/TransportServiceCC.d.ts +0 -107
- package/build/cc/TransportServiceCC.d.ts.map +0 -1
- package/build/cc/TransportServiceCC.js +0 -426
- package/build/cc/TransportServiceCC.js.map +0 -1
- package/build/cc/UserCodeCC.d.ts +0 -683
- package/build/cc/UserCodeCC.d.ts.map +0 -1
- package/build/cc/UserCodeCC.js +0 -1699
- package/build/cc/UserCodeCC.js.map +0 -1
- package/build/cc/VersionCC.d.ts +0 -469
- package/build/cc/VersionCC.d.ts.map +0 -1
- package/build/cc/VersionCC.js +0 -865
- package/build/cc/VersionCC.js.map +0 -1
- package/build/cc/WakeUpCC.d.ts +0 -150
- package/build/cc/WakeUpCC.d.ts.map +0 -1
- package/build/cc/WakeUpCC.js +0 -441
- package/build/cc/WakeUpCC.js.map +0 -1
- package/build/cc/WindowCoveringCC.d.ts +0 -315
- package/build/cc/WindowCoveringCC.d.ts.map +0 -1
- package/build/cc/WindowCoveringCC.js +0 -783
- package/build/cc/WindowCoveringCC.js.map +0 -1
- package/build/cc/ZWaveLongRangeCC.d.ts +0 -4
- package/build/cc/ZWaveLongRangeCC.d.ts.map +0 -1
- package/build/cc/ZWaveLongRangeCC.js +0 -20
- package/build/cc/ZWaveLongRangeCC.js.map +0 -1
- package/build/cc/ZWavePlusCC.d.ts +0 -163
- package/build/cc/ZWavePlusCC.d.ts.map +0 -1
- package/build/cc/ZWavePlusCC.js +0 -270
- package/build/cc/ZWavePlusCC.js.map +0 -1
- package/build/cc/ZWaveProtocolCC.d.ts +0 -344
- package/build/cc/ZWaveProtocolCC.d.ts.map +0 -1
- package/build/cc/ZWaveProtocolCC.js +0 -1033
- package/build/cc/ZWaveProtocolCC.js.map +0 -1
- package/build/cc/index.d.ts +0 -132
- package/build/cc/index.d.ts.map +0 -1
- package/build/cc/index.js +0 -627
- package/build/cc/index.js.map +0 -1
- package/build/cc/manufacturerProprietary/Decorators.d.ts +0 -64
- package/build/cc/manufacturerProprietary/Decorators.d.ts.map +0 -1
- package/build/cc/manufacturerProprietary/Decorators.js +0 -83
- package/build/cc/manufacturerProprietary/Decorators.js.map +0 -1
- package/build/cc/manufacturerProprietary/FibaroCC.d.ts +0 -79
- package/build/cc/manufacturerProprietary/FibaroCC.d.ts.map +0 -1
- package/build/cc/manufacturerProprietary/FibaroCC.js +0 -392
- package/build/cc/manufacturerProprietary/FibaroCC.js.map +0 -1
- package/build/index.d.ts +0 -15
- package/build/index.d.ts.map +0 -1
- package/build/index.js +0 -52
- package/build/index.js.map +0 -1
- package/build/index_safe.d.ts +0 -3
- package/build/index_safe.d.ts.map +0 -1
- package/build/index_safe.js +0 -20
- package/build/index_safe.js.map +0 -1
- package/build/lib/API.d.ts +0 -271
- package/build/lib/API.d.ts.map +0 -1
- package/build/lib/API.js +0 -458
- package/build/lib/API.js.map +0 -1
- package/build/lib/CommandClass.d.ts +0 -234
- package/build/lib/CommandClass.d.ts.map +0 -1
- package/build/lib/CommandClass.js +0 -788
- package/build/lib/CommandClass.js.map +0 -1
- package/build/lib/CommandClassDecorators.d.ts +0 -112
- package/build/lib/CommandClassDecorators.d.ts.map +0 -1
- package/build/lib/CommandClassDecorators.js +0 -243
- package/build/lib/CommandClassDecorators.js.map +0 -1
- package/build/lib/EncapsulatingCommandClass.d.ts +0 -22
- package/build/lib/EncapsulatingCommandClass.d.ts.map +0 -1
- package/build/lib/EncapsulatingCommandClass.js +0 -61
- package/build/lib/EncapsulatingCommandClass.js.map +0 -1
- package/build/lib/ICommandClassContainer.d.ts.map +0 -1
- package/build/lib/ICommandClassContainer.js +0 -3
- package/build/lib/ICommandClassContainer.js.map +0 -1
- package/build/lib/NotificationEventPayload.d.ts +0 -10
- package/build/lib/NotificationEventPayload.d.ts.map +0 -1
- package/build/lib/NotificationEventPayload.js +0 -10
- package/build/lib/NotificationEventPayload.js.map +0 -1
- package/build/lib/Security2/Extension.d.ts.map +0 -1
- package/build/lib/Security2/Extension.js +0 -303
- package/build/lib/Security2/Extension.js.map +0 -1
- package/build/lib/Security2/shared.d.ts.map +0 -1
- package/build/lib/Security2/shared.js +0 -43
- package/build/lib/Security2/shared.js.map +0 -1
- package/build/lib/SetValueResult.d.ts.map +0 -1
- package/build/lib/SetValueResult.js +0 -60
- package/build/lib/SetValueResult.js.map +0 -1
- package/build/lib/Values.d.ts +0 -223
- package/build/lib/Values.d.ts.map +0 -1
- package/build/lib/Values.js +0 -172
- package/build/lib/Values.js.map +0 -1
- package/build/lib/_Types.d.ts.map +0 -1
- package/build/lib/_Types.js +0 -1443
- package/build/lib/_Types.js.map +0 -1
- package/build/lib/serializers.d.ts +0 -34
- package/build/lib/serializers.d.ts.map +0 -1
- package/build/lib/serializers.js +0 -107
- package/build/lib/serializers.js.map +0 -1
- package/build/lib/utils.d.ts +0 -17
- package/build/lib/utils.d.ts.map +0 -1
- package/build/lib/utils.js +0 -860
- package/build/lib/utils.js.map +0 -1
- /package/build/{lib → cjs/lib}/ICommandClassContainer.d.ts +0 -0
- /package/build/{lib → cjs/lib}/Security2/Extension.d.ts +0 -0
- /package/build/{lib → cjs/lib}/Security2/shared.d.ts +0 -0
- /package/build/{lib → cjs/lib}/SetValueResult.d.ts +0 -0
- /package/build/{lib → cjs/lib}/_Types.d.ts +0 -0
|
@@ -0,0 +1,847 @@
|
|
|
1
|
+
import { CommandClasses, NOT_KNOWN, SecurityClass, ZWaveError, ZWaveErrorCodes, actuatorCCs, getCCName, isActuatorCC, isLongRangeNodeId, isSensorCC, } from "@zwave-js/core/safe";
|
|
2
|
+
import { ObjectKeyMap, getEnumMemberName, } from "@zwave-js/shared/safe";
|
|
3
|
+
import { distinct } from "alcalzone-shared/arrays/index.js";
|
|
4
|
+
import { AssociationCC, AssociationCCValues } from "../cc/AssociationCC.js";
|
|
5
|
+
import { AssociationGroupInfoCC } from "../cc/AssociationGroupInfoCC.js";
|
|
6
|
+
import { MultiChannelAssociationCC } from "../cc/MultiChannelAssociationCC.js";
|
|
7
|
+
import { CCAPI } from "./API.js";
|
|
8
|
+
import { AssociationCheckResult, AssociationGroupInfoProfile, } from "./_Types.js";
|
|
9
|
+
export function getAssociations(ctx, endpoint) {
|
|
10
|
+
const ret = new Map();
|
|
11
|
+
if (endpoint.supportsCC(CommandClasses.Association)) {
|
|
12
|
+
const destinations = AssociationCC.getAllDestinationsCached(ctx, endpoint);
|
|
13
|
+
for (const [groupId, assocs] of destinations) {
|
|
14
|
+
ret.set(groupId, assocs);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
throw new ZWaveError(`Node ${endpoint.nodeId}${endpoint.index > 0 ? `, endpoint ${endpoint.index}` : ""} does not support associations!`, ZWaveErrorCodes.CC_NotSupported);
|
|
19
|
+
}
|
|
20
|
+
// Merge the "normal" destinations with multi channel destinations
|
|
21
|
+
if (endpoint.supportsCC(CommandClasses["Multi Channel Association"])) {
|
|
22
|
+
const destinations = MultiChannelAssociationCC.getAllDestinationsCached(ctx, endpoint);
|
|
23
|
+
for (const [groupId, assocs] of destinations) {
|
|
24
|
+
if (ret.has(groupId)) {
|
|
25
|
+
const normalAssociations = ret.get(groupId);
|
|
26
|
+
ret.set(groupId, [
|
|
27
|
+
...normalAssociations,
|
|
28
|
+
// Eliminate potential duplicates
|
|
29
|
+
...assocs.filter((a1) => !normalAssociations.some((a2) => a1.nodeId === a2.nodeId
|
|
30
|
+
&& a1.endpoint === a2.endpoint)),
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
ret.set(groupId, assocs);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return ret;
|
|
39
|
+
}
|
|
40
|
+
export function getAllAssociations(ctx, node) {
|
|
41
|
+
const ret = new ObjectKeyMap();
|
|
42
|
+
for (const endpoint of node.getAllEndpoints()) {
|
|
43
|
+
const address = {
|
|
44
|
+
nodeId: node.id,
|
|
45
|
+
endpoint: endpoint.index,
|
|
46
|
+
};
|
|
47
|
+
if (endpoint.supportsCC(CommandClasses.Association)) {
|
|
48
|
+
ret.set(address, getAssociations(ctx, endpoint));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return ret;
|
|
52
|
+
}
|
|
53
|
+
export function checkAssociation(ctx, endpoint, group, destination) {
|
|
54
|
+
// Check that the target endpoint exists except when adding an association to the controller
|
|
55
|
+
const targetNode = ctx.getNodeOrThrow(destination.nodeId);
|
|
56
|
+
const targetEndpoint = destination.nodeId === ctx.ownNodeId
|
|
57
|
+
? targetNode
|
|
58
|
+
: targetNode.getEndpointOrThrow(destination.endpoint ?? 0);
|
|
59
|
+
if (!endpoint.supportsCC(CommandClasses.Association)
|
|
60
|
+
&& !endpoint.supportsCC(CommandClasses["Multi Channel Association"])) {
|
|
61
|
+
throw new ZWaveError(`Node ${endpoint.nodeId}${endpoint.index > 0 ? `, endpoint ${endpoint.index}` : ""} does not support associations!`, ZWaveErrorCodes.CC_NotSupported);
|
|
62
|
+
}
|
|
63
|
+
// Associations to and from ZWLR devices are not allowed
|
|
64
|
+
if (isLongRangeNodeId(destination.nodeId)) {
|
|
65
|
+
return AssociationCheckResult.Forbidden_DestinationIsLongRange;
|
|
66
|
+
}
|
|
67
|
+
else if (isLongRangeNodeId(endpoint.nodeId)) {
|
|
68
|
+
// Except the lifeline back to the host
|
|
69
|
+
if (group !== 1 || destination.nodeId !== ctx.ownNodeId) {
|
|
70
|
+
return AssociationCheckResult.Forbidden_SourceIsLongRange;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// The following checks don't apply to Lifeline associations
|
|
74
|
+
if (destination.nodeId === ctx.ownNodeId) {
|
|
75
|
+
return AssociationCheckResult.OK;
|
|
76
|
+
}
|
|
77
|
+
// Disallow self-associations
|
|
78
|
+
if (destination.nodeId === endpoint.nodeId) {
|
|
79
|
+
return AssociationCheckResult.Forbidden_SelfAssociation;
|
|
80
|
+
}
|
|
81
|
+
// For Association version 1 and version 2 / MCA version 1-3:
|
|
82
|
+
// A controlling node MUST NOT associate Node A to a Node B destination
|
|
83
|
+
// if Node A and Node B’s highest Security Class are not identical.
|
|
84
|
+
// For Association version 3 / MCA version 4:
|
|
85
|
+
// A controlling node MUST NOT associate Node A to a Node B destination
|
|
86
|
+
// if Node A was not granted Node B’s highest Security Class.
|
|
87
|
+
const sourceNode = ctx.getNode(endpoint.nodeId);
|
|
88
|
+
let securityClassMustMatch;
|
|
89
|
+
if (destination.endpoint == undefined) {
|
|
90
|
+
// "normal" association
|
|
91
|
+
const sourceNodeCCVersion = endpoint.getCCVersion(CommandClasses.Association);
|
|
92
|
+
securityClassMustMatch = sourceNodeCCVersion < 3;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// multi channel association
|
|
96
|
+
const sourceNodeCCVersion = endpoint.getCCVersion(CommandClasses["Multi Channel Association"]);
|
|
97
|
+
securityClassMustMatch = sourceNodeCCVersion < 4;
|
|
98
|
+
}
|
|
99
|
+
const sourceSecurityClass = sourceNode.getHighestSecurityClass();
|
|
100
|
+
const targetSecurityClass = targetNode.getHighestSecurityClass();
|
|
101
|
+
// If the security classes are unknown, all bets are off
|
|
102
|
+
if (sourceSecurityClass != undefined && targetSecurityClass != undefined) {
|
|
103
|
+
if (securityClassMustMatch
|
|
104
|
+
&& sourceSecurityClass !== targetSecurityClass) {
|
|
105
|
+
return AssociationCheckResult.Forbidden_SecurityClassMismatch;
|
|
106
|
+
}
|
|
107
|
+
else if (
|
|
108
|
+
// Commands to insecure nodes are allowed
|
|
109
|
+
targetSecurityClass !== SecurityClass.None
|
|
110
|
+
// Otherwise, the sender must know the target's highest key
|
|
111
|
+
&& !securityClassMustMatch
|
|
112
|
+
&& !sourceNode.hasSecurityClass(targetSecurityClass)) {
|
|
113
|
+
return AssociationCheckResult
|
|
114
|
+
.Forbidden_DestinationSecurityClassNotGranted;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// SDS14223:
|
|
118
|
+
// A controlling node MUST NOT associate Node A to a Node B destination that does not support
|
|
119
|
+
// the Command Class that the Node A will be controlling
|
|
120
|
+
//
|
|
121
|
+
// To determine this, the node must support the AGI CC or we have no way of knowing which
|
|
122
|
+
// CCs the node will control
|
|
123
|
+
if (!endpoint.supportsCC(CommandClasses["Association Group Information"])) {
|
|
124
|
+
return AssociationCheckResult.OK;
|
|
125
|
+
}
|
|
126
|
+
const groupCommandList = AssociationGroupInfoCC.getIssuedCommandsCached(ctx, endpoint, group);
|
|
127
|
+
if (!groupCommandList || !groupCommandList.size) {
|
|
128
|
+
// We don't know which CCs this group controls, just allow it
|
|
129
|
+
return AssociationCheckResult.OK;
|
|
130
|
+
}
|
|
131
|
+
const groupCCs = [...groupCommandList.keys()];
|
|
132
|
+
// A controlling node MAY create an association to a destination supporting an
|
|
133
|
+
// actuator Command Class if the actual association group sends Basic Control Command Class.
|
|
134
|
+
if (groupCCs.includes(CommandClasses.Basic)
|
|
135
|
+
&& actuatorCCs.some((cc) => targetEndpoint?.supportsCC(cc))) {
|
|
136
|
+
return AssociationCheckResult.OK;
|
|
137
|
+
}
|
|
138
|
+
// Enforce that at least one issued CC is supported
|
|
139
|
+
if (groupCCs.some((cc) => targetEndpoint?.supportsCC(cc))) {
|
|
140
|
+
return AssociationCheckResult.OK;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
return AssociationCheckResult.Forbidden_NoSupportedCCs;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export function getAssociationGroups(ctx, endpoint) {
|
|
147
|
+
// Check whether we have multi channel support or not
|
|
148
|
+
let assocInstance;
|
|
149
|
+
let mcInstance;
|
|
150
|
+
if (endpoint.supportsCC(CommandClasses.Association)) {
|
|
151
|
+
assocInstance = AssociationCC;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
throw new ZWaveError(`Node ${endpoint.nodeId}${endpoint.index > 0 ? `, endpoint ${endpoint.index}` : ""} does not support associations!`, ZWaveErrorCodes.CC_NotSupported);
|
|
155
|
+
}
|
|
156
|
+
if (endpoint.supportsCC(CommandClasses["Multi Channel Association"])) {
|
|
157
|
+
mcInstance = MultiChannelAssociationCC;
|
|
158
|
+
}
|
|
159
|
+
const assocGroupCount = assocInstance.getGroupCountCached(ctx, endpoint)
|
|
160
|
+
?? 0;
|
|
161
|
+
const mcGroupCount = mcInstance?.getGroupCountCached(ctx, endpoint)
|
|
162
|
+
?? 0;
|
|
163
|
+
const groupCount = Math.max(assocGroupCount, mcGroupCount);
|
|
164
|
+
const deviceConfig = ctx.getDeviceConfig?.(endpoint.nodeId);
|
|
165
|
+
const ret = new Map();
|
|
166
|
+
if (endpoint.supportsCC(CommandClasses["Association Group Information"])) {
|
|
167
|
+
// We can read all information we need from the AGI CC
|
|
168
|
+
const agiInstance = AssociationGroupInfoCC;
|
|
169
|
+
for (let group = 1; group <= groupCount; group++) {
|
|
170
|
+
const assocConfig = deviceConfig?.getAssociationConfigForEndpoint(endpoint.index, group);
|
|
171
|
+
const multiChannel = !!mcInstance && group <= mcGroupCount;
|
|
172
|
+
ret.set(group, {
|
|
173
|
+
maxNodes: (multiChannel
|
|
174
|
+
? mcInstance
|
|
175
|
+
: assocInstance).getMaxNodesCached(ctx, endpoint, group) || 1,
|
|
176
|
+
// AGI implies Z-Wave+ where group 1 is the lifeline
|
|
177
|
+
isLifeline: group === 1,
|
|
178
|
+
label:
|
|
179
|
+
// prefer the configured label if we have one
|
|
180
|
+
assocConfig?.label
|
|
181
|
+
// the ones reported by AGI are sometimes pretty bad
|
|
182
|
+
?? agiInstance.getGroupNameCached(ctx, endpoint, group)
|
|
183
|
+
// but still better than "unnamed"
|
|
184
|
+
?? `Unnamed group ${group}`,
|
|
185
|
+
multiChannel,
|
|
186
|
+
profile: agiInstance.getGroupProfileCached(ctx, endpoint, group),
|
|
187
|
+
issuedCommands: agiInstance.getIssuedCommandsCached(ctx, endpoint, group),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// we need to consult the device config
|
|
193
|
+
for (let group = 1; group <= groupCount; group++) {
|
|
194
|
+
const assocConfig = deviceConfig?.getAssociationConfigForEndpoint(endpoint.index, group);
|
|
195
|
+
const multiChannel = !!mcInstance && group <= mcGroupCount;
|
|
196
|
+
ret.set(group, {
|
|
197
|
+
maxNodes: (multiChannel
|
|
198
|
+
? mcInstance
|
|
199
|
+
: assocInstance).getMaxNodesCached(ctx, endpoint, group)
|
|
200
|
+
|| assocConfig?.maxNodes
|
|
201
|
+
|| 1,
|
|
202
|
+
isLifeline: assocConfig?.isLifeline ?? group === 1,
|
|
203
|
+
label: assocConfig?.label ?? `Unnamed group ${group}`,
|
|
204
|
+
multiChannel,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return ret;
|
|
209
|
+
}
|
|
210
|
+
export function getAllAssociationGroups(ctx, node) {
|
|
211
|
+
const ret = new Map();
|
|
212
|
+
for (const endpoint of node.getAllEndpoints()) {
|
|
213
|
+
if (endpoint.supportsCC(CommandClasses.Association)) {
|
|
214
|
+
ret.set(endpoint.index, getAssociationGroups(ctx, endpoint));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return ret;
|
|
218
|
+
}
|
|
219
|
+
export async function addAssociations(ctx, endpoint, group, destinations) {
|
|
220
|
+
const nodeAndEndpointString = `${endpoint.nodeId}${endpoint.index > 0 ? `, endpoint ${endpoint.index}` : ""}`;
|
|
221
|
+
// Check whether we should add any associations the device does not have support for
|
|
222
|
+
let assocInstance;
|
|
223
|
+
let mcInstance;
|
|
224
|
+
// Split associations into conventional and endpoint associations
|
|
225
|
+
const nodeAssociations = distinct(destinations
|
|
226
|
+
.filter((a) => a.endpoint == undefined)
|
|
227
|
+
.map((a) => a.nodeId));
|
|
228
|
+
const endpointAssociations = destinations.filter((a) => a.endpoint != undefined);
|
|
229
|
+
if (endpoint.supportsCC(CommandClasses.Association)) {
|
|
230
|
+
assocInstance = AssociationCC;
|
|
231
|
+
}
|
|
232
|
+
else if (nodeAssociations.length > 0) {
|
|
233
|
+
throw new ZWaveError(`Node ${nodeAndEndpointString} does not support associations!`, ZWaveErrorCodes.CC_NotSupported);
|
|
234
|
+
}
|
|
235
|
+
if (endpoint.supportsCC(CommandClasses["Multi Channel Association"])) {
|
|
236
|
+
mcInstance = MultiChannelAssociationCC;
|
|
237
|
+
}
|
|
238
|
+
else if (endpointAssociations.length > 0) {
|
|
239
|
+
throw new ZWaveError(`Node ${nodeAndEndpointString} does not support multi channel associations!`, ZWaveErrorCodes.CC_NotSupported);
|
|
240
|
+
}
|
|
241
|
+
// Disallow associating a node with itself. This is technically checked as part of
|
|
242
|
+
// checkAssociations, but here we provide a better error message.
|
|
243
|
+
const selfAssociations = destinations.filter((d) => d.nodeId === endpoint.nodeId);
|
|
244
|
+
if (selfAssociations.length > 0) {
|
|
245
|
+
throw new ZWaveError(`Associating a node with itself is not allowed!`, ZWaveErrorCodes.AssociationCC_NotAllowed, selfAssociations.map((a) => ({
|
|
246
|
+
...a,
|
|
247
|
+
checkResult: AssociationCheckResult.Forbidden_SelfAssociation,
|
|
248
|
+
})));
|
|
249
|
+
}
|
|
250
|
+
const assocGroupCount = assocInstance?.getGroupCountCached(ctx, endpoint)
|
|
251
|
+
?? 0;
|
|
252
|
+
const mcGroupCount = mcInstance?.getGroupCountCached(ctx, endpoint)
|
|
253
|
+
?? 0;
|
|
254
|
+
const groupCount = Math.max(assocGroupCount, mcGroupCount);
|
|
255
|
+
if (group > groupCount) {
|
|
256
|
+
throw new ZWaveError(`Group ${group} does not exist on node ${nodeAndEndpointString}`, ZWaveErrorCodes.AssociationCC_InvalidGroup);
|
|
257
|
+
}
|
|
258
|
+
const deviceConfig = ctx.getDeviceConfig?.(endpoint.nodeId);
|
|
259
|
+
const groupIsMultiChannel = !!mcInstance
|
|
260
|
+
&& group <= mcGroupCount
|
|
261
|
+
&& deviceConfig?.associations?.get(group)?.multiChannel !== false;
|
|
262
|
+
if (groupIsMultiChannel) {
|
|
263
|
+
// Check that all associations are allowed
|
|
264
|
+
const disallowedAssociations = destinations.map((a) => ({
|
|
265
|
+
...a,
|
|
266
|
+
checkResult: checkAssociation(ctx, endpoint, group, a),
|
|
267
|
+
})).filter(({ checkResult }) => checkResult !== AssociationCheckResult.OK);
|
|
268
|
+
if (disallowedAssociations.length) {
|
|
269
|
+
let message = `The following associations are not allowed:`;
|
|
270
|
+
message += disallowedAssociations
|
|
271
|
+
.map((a) => `\n· Node ${a.nodeId}${a.endpoint ? `, endpoint ${a.endpoint}` : ""}: ${getEnumMemberName(AssociationCheckResult, a.checkResult).replace("Forbidden_", "")}`)
|
|
272
|
+
.join("");
|
|
273
|
+
throw new ZWaveError(message, ZWaveErrorCodes.AssociationCC_NotAllowed, disallowedAssociations);
|
|
274
|
+
}
|
|
275
|
+
// And add them
|
|
276
|
+
const api = CCAPI.create(CommandClasses["Multi Channel Association"], ctx, endpoint);
|
|
277
|
+
await api.addDestinations({
|
|
278
|
+
groupId: group,
|
|
279
|
+
nodeIds: nodeAssociations,
|
|
280
|
+
endpoints: endpointAssociations,
|
|
281
|
+
});
|
|
282
|
+
// Refresh the association list
|
|
283
|
+
await api.getGroup(group);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// Although the node supports multi channel associations, this group only supports "normal" associations
|
|
287
|
+
if (destinations.some((a) => a.endpoint != undefined)) {
|
|
288
|
+
throw new ZWaveError(`Node ${nodeAndEndpointString}, group ${group} does not support multi channel associations!`, ZWaveErrorCodes.CC_NotSupported);
|
|
289
|
+
}
|
|
290
|
+
// Check that all associations are allowed
|
|
291
|
+
const disallowedAssociations = destinations.map((a) => ({
|
|
292
|
+
...a,
|
|
293
|
+
checkResult: checkAssociation(ctx, endpoint, group, a),
|
|
294
|
+
})).filter(({ checkResult }) => checkResult !== AssociationCheckResult.OK);
|
|
295
|
+
if (disallowedAssociations.length) {
|
|
296
|
+
let message = `The associations to the following nodes are not allowed`;
|
|
297
|
+
message += disallowedAssociations
|
|
298
|
+
.map((a) => `\n· Node ${a.nodeId}: ${getEnumMemberName(AssociationCheckResult, a.checkResult).replace("Forbidden_", "")}`)
|
|
299
|
+
.join("");
|
|
300
|
+
throw new ZWaveError(message, ZWaveErrorCodes.AssociationCC_NotAllowed, disallowedAssociations);
|
|
301
|
+
}
|
|
302
|
+
const api = CCAPI.create(CommandClasses.Association, ctx, endpoint);
|
|
303
|
+
await api.addNodeIds(group, ...destinations.map((a) => a.nodeId));
|
|
304
|
+
// Refresh the association list
|
|
305
|
+
await api.getGroup(group);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
export async function removeAssociations(ctx, endpoint, group, destinations) {
|
|
309
|
+
const nodeAndEndpointString = `${endpoint.nodeId}${endpoint.index > 0 ? `, endpoint ${endpoint.index}` : ""}`;
|
|
310
|
+
// Split associations into conventional and endpoint associations
|
|
311
|
+
const nodeAssociations = distinct(destinations
|
|
312
|
+
.filter((a) => a.endpoint == undefined)
|
|
313
|
+
.map((a) => a.nodeId));
|
|
314
|
+
const endpointAssociations = destinations.filter((a) => a.endpoint != undefined);
|
|
315
|
+
// Removing associations is not either/or - we could have a device with duplicated associations between
|
|
316
|
+
// Association CC and Multi Channel Association CC
|
|
317
|
+
// Figure out what we need to use to remove the associations
|
|
318
|
+
let groupExistsAsMultiChannel = false;
|
|
319
|
+
let groupExistsAsNodeAssociation = false;
|
|
320
|
+
let mcInstance;
|
|
321
|
+
let assocInstance;
|
|
322
|
+
// To remove a multi channel association, we need to make sure that the group exists
|
|
323
|
+
// and the node supports multi channel associations
|
|
324
|
+
if (endpoint.supportsCC(CommandClasses["Multi Channel Association"])) {
|
|
325
|
+
mcInstance = MultiChannelAssociationCC;
|
|
326
|
+
if (group <= mcInstance.getGroupCountCached(ctx, endpoint)) {
|
|
327
|
+
groupExistsAsMultiChannel = true;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else if (endpointAssociations.length > 0) {
|
|
331
|
+
throw new ZWaveError(`Node ${nodeAndEndpointString} does not support multi channel associations!`, ZWaveErrorCodes.CC_NotSupported);
|
|
332
|
+
}
|
|
333
|
+
// To remove a normal association, we need to make sure that the group exists either as a normal association
|
|
334
|
+
// or as a multi channel association
|
|
335
|
+
if (endpoint.supportsCC(CommandClasses.Association)) {
|
|
336
|
+
assocInstance = AssociationCC;
|
|
337
|
+
if (group <= assocInstance.getGroupCountCached(ctx, endpoint)) {
|
|
338
|
+
groupExistsAsNodeAssociation = true;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (!mcInstance && !assocInstance) {
|
|
342
|
+
throw new ZWaveError(`Node ${nodeAndEndpointString} does not support associations!`, ZWaveErrorCodes.CC_NotSupported);
|
|
343
|
+
}
|
|
344
|
+
// Ensure the group exists and can be used
|
|
345
|
+
if (!groupExistsAsMultiChannel && !groupExistsAsNodeAssociation) {
|
|
346
|
+
throw new ZWaveError(` Association group ${group} does not exist for node ${nodeAndEndpointString}`, ZWaveErrorCodes.AssociationCC_InvalidGroup);
|
|
347
|
+
}
|
|
348
|
+
if (endpointAssociations.length > 0 && !groupExistsAsMultiChannel) {
|
|
349
|
+
throw new ZWaveError(`Node ${nodeAndEndpointString}, association group ${group} does not support multi channel associations!`, ZWaveErrorCodes.AssociationCC_InvalidGroup);
|
|
350
|
+
}
|
|
351
|
+
// Even if we only remove node associations, we use both CCs since it has been found that some
|
|
352
|
+
// devices do not correctly share the node list between the two commands
|
|
353
|
+
if (assocInstance
|
|
354
|
+
&& nodeAssociations.length > 0
|
|
355
|
+
&& groupExistsAsNodeAssociation) {
|
|
356
|
+
const api = CCAPI.create(CommandClasses.Association, ctx, endpoint);
|
|
357
|
+
await api.removeNodeIds({
|
|
358
|
+
groupId: group,
|
|
359
|
+
nodeIds: nodeAssociations,
|
|
360
|
+
});
|
|
361
|
+
// Refresh the association list
|
|
362
|
+
await api.getGroup(group);
|
|
363
|
+
}
|
|
364
|
+
if (mcInstance && groupExistsAsMultiChannel) {
|
|
365
|
+
const api = CCAPI.create(CommandClasses["Multi Channel Association"], ctx, endpoint);
|
|
366
|
+
await api.removeDestinations({
|
|
367
|
+
groupId: group,
|
|
368
|
+
nodeIds: nodeAssociations,
|
|
369
|
+
endpoints: endpointAssociations,
|
|
370
|
+
});
|
|
371
|
+
// Refresh the multi channel association list
|
|
372
|
+
await api.getGroup(group);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
export function getLifelineGroupIds(ctx, endpoint) {
|
|
376
|
+
// For now only support this for the root endpoint - i.e. node
|
|
377
|
+
if (endpoint.index > 0)
|
|
378
|
+
return [];
|
|
379
|
+
// Some nodes define multiple lifeline groups, so we need to assign us to
|
|
380
|
+
// all of them
|
|
381
|
+
const lifelineGroups = [];
|
|
382
|
+
// If the target node supports Z-Wave+ info that means the lifeline MUST be group #1
|
|
383
|
+
if (endpoint.supportsCC(CommandClasses["Z-Wave Plus Info"])) {
|
|
384
|
+
lifelineGroups.push(1);
|
|
385
|
+
}
|
|
386
|
+
// We have a device config file that tells us which (additional) association to assign
|
|
387
|
+
let associations;
|
|
388
|
+
const deviceConfig = ctx.getDeviceConfig?.(endpoint.nodeId);
|
|
389
|
+
if (endpoint.index === 0) {
|
|
390
|
+
// The root endpoint's associations may be configured separately or as part of "endpoints"
|
|
391
|
+
associations = deviceConfig?.associations
|
|
392
|
+
?? deviceConfig?.endpoints?.get(0)?.associations;
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// The other endpoints can only have a configuration as part of "endpoints"
|
|
396
|
+
associations = deviceConfig?.endpoints?.get(endpoint.index)?.associations;
|
|
397
|
+
}
|
|
398
|
+
if (associations?.size) {
|
|
399
|
+
lifelineGroups.push(...[...associations.values()]
|
|
400
|
+
.filter((a) => a.isLifeline)
|
|
401
|
+
.map((a) => a.groupId));
|
|
402
|
+
}
|
|
403
|
+
return distinct(lifelineGroups).sort();
|
|
404
|
+
}
|
|
405
|
+
export async function configureLifelineAssociations(ctx, endpoint) {
|
|
406
|
+
// Assign the controller to all lifeline groups
|
|
407
|
+
const ownNodeId = ctx.ownNodeId;
|
|
408
|
+
const node = ctx.getNodeOrThrow(endpoint.nodeId);
|
|
409
|
+
const valueDB = ctx.getValueDB(node.id);
|
|
410
|
+
const deviceConfig = ctx.getDeviceConfig?.(node.id);
|
|
411
|
+
// We check if a node supports Multi Channel CC before creating Multi Channel Lifeline Associations (#1109)
|
|
412
|
+
const nodeSupportsMultiChannel = node.supportsCC(CommandClasses["Multi Channel"]);
|
|
413
|
+
let assocInstance;
|
|
414
|
+
const assocAPI = CCAPI.create(CommandClasses.Association, ctx, endpoint);
|
|
415
|
+
if (endpoint.supportsCC(CommandClasses.Association)) {
|
|
416
|
+
assocInstance = AssociationCC;
|
|
417
|
+
}
|
|
418
|
+
let mcInstance;
|
|
419
|
+
let mcGroupCount = 0;
|
|
420
|
+
const mcAPI = CCAPI.create(CommandClasses["Multi Channel Association"], ctx, endpoint);
|
|
421
|
+
if (endpoint.supportsCC(CommandClasses["Multi Channel Association"])) {
|
|
422
|
+
mcInstance = MultiChannelAssociationCC;
|
|
423
|
+
mcGroupCount = mcInstance.getGroupCountCached(ctx, endpoint) ?? 0;
|
|
424
|
+
}
|
|
425
|
+
const lifelineGroups = getLifelineGroupIds(ctx, node);
|
|
426
|
+
if (lifelineGroups.length === 0) {
|
|
427
|
+
// We can look for the General Lifeline AGI profile as a last resort
|
|
428
|
+
if (endpoint.supportsCC(CommandClasses["Association Group Information"])) {
|
|
429
|
+
const agiAPI = CCAPI.create(CommandClasses["Association Group Information"], ctx, endpoint);
|
|
430
|
+
// The lifeline MUST be group 1
|
|
431
|
+
const lifeline = await agiAPI
|
|
432
|
+
.getGroupInfo(1, true)
|
|
433
|
+
.catch(() => undefined);
|
|
434
|
+
if (lifeline?.profile
|
|
435
|
+
=== AssociationGroupInfoProfile["General: Lifeline"]) {
|
|
436
|
+
lifelineGroups.push(1);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
if (lifelineGroups.length === 0) {
|
|
441
|
+
ctx.logNode(node.id, {
|
|
442
|
+
endpoint: endpoint.index,
|
|
443
|
+
message: "No information about Lifeline associations, cannot assign ourselves!",
|
|
444
|
+
level: "warn",
|
|
445
|
+
});
|
|
446
|
+
// Remember that we have NO lifeline association
|
|
447
|
+
valueDB.setValue(AssociationCCValues.hasLifeline.endpoint(endpoint.index), false);
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
ctx.logNode(node.id, {
|
|
451
|
+
endpoint: endpoint.index,
|
|
452
|
+
message: `Checking/assigning lifeline groups: ${lifelineGroups.join(", ")}
|
|
453
|
+
supports classic associations: ${!!assocInstance}
|
|
454
|
+
supports multi channel associations: ${!!mcInstance}`,
|
|
455
|
+
});
|
|
456
|
+
for (const group of lifelineGroups) {
|
|
457
|
+
const groupSupportsMultiChannelAssociation = group <= mcGroupCount;
|
|
458
|
+
const assocConfig = deviceConfig?.getAssociationConfigForEndpoint(endpoint.index, group);
|
|
459
|
+
const mustUseNodeAssociation = !groupSupportsMultiChannelAssociation
|
|
460
|
+
|| !nodeSupportsMultiChannel
|
|
461
|
+
|| assocConfig?.multiChannel === false;
|
|
462
|
+
let mustUseMultiChannelAssociation = false;
|
|
463
|
+
if (groupSupportsMultiChannelAssociation && nodeSupportsMultiChannel) {
|
|
464
|
+
if (assocConfig?.multiChannel === true) {
|
|
465
|
+
mustUseMultiChannelAssociation = true;
|
|
466
|
+
}
|
|
467
|
+
else if (endpoint.index === 0) {
|
|
468
|
+
// If the node has multiple endpoints but none of the extra ones support associations,
|
|
469
|
+
// the root endpoints needs a Multi Channel Association
|
|
470
|
+
const allEndpoints = node.getAllEndpoints();
|
|
471
|
+
if (allEndpoints.length > 1
|
|
472
|
+
&& allEndpoints
|
|
473
|
+
.filter((e) => e.index !== endpoint.index)
|
|
474
|
+
.every((e) => !e.supportsCC(CommandClasses.Association)
|
|
475
|
+
&& !e.supportsCC(CommandClasses["Multi Channel Association"]))) {
|
|
476
|
+
mustUseMultiChannelAssociation = true;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
ctx.logNode(node.id, {
|
|
481
|
+
endpoint: endpoint.index,
|
|
482
|
+
message: `Configuring lifeline group #${group}:
|
|
483
|
+
group supports multi channel: ${groupSupportsMultiChannelAssociation}
|
|
484
|
+
configured strategy: ${assocConfig?.multiChannel ?? "auto"}
|
|
485
|
+
must use node association: ${mustUseNodeAssociation}
|
|
486
|
+
must use endpoint association: ${mustUseMultiChannelAssociation}`,
|
|
487
|
+
});
|
|
488
|
+
// Figure out which associations exist and may need to be removed
|
|
489
|
+
const isAssignedAsNodeAssociation = (endpoint) => {
|
|
490
|
+
if (groupSupportsMultiChannelAssociation && mcInstance) {
|
|
491
|
+
if (
|
|
492
|
+
// Only consider a group if it doesn't share its associations with the root endpoint
|
|
493
|
+
mcInstance.getMaxNodesCached(ctx, endpoint, group)
|
|
494
|
+
> 0
|
|
495
|
+
&& !!mcInstance
|
|
496
|
+
.getAllDestinationsCached(ctx, endpoint)
|
|
497
|
+
.get(group)
|
|
498
|
+
?.some((addr) => addr.nodeId === ownNodeId
|
|
499
|
+
&& addr.endpoint == undefined)) {
|
|
500
|
+
return true;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
if (assocInstance) {
|
|
504
|
+
if (
|
|
505
|
+
// Only consider a group if it doesn't share its associations with the root endpoint
|
|
506
|
+
assocInstance.getMaxNodesCached(ctx, endpoint, group)
|
|
507
|
+
> 0
|
|
508
|
+
&& !!assocInstance
|
|
509
|
+
.getAllDestinationsCached(ctx, endpoint)
|
|
510
|
+
.get(group)
|
|
511
|
+
?.some((addr) => addr.nodeId === ownNodeId)) {
|
|
512
|
+
return true;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
return false;
|
|
516
|
+
};
|
|
517
|
+
const isAssignedAsEndpointAssociation = (endpoint) => {
|
|
518
|
+
if (mcInstance) {
|
|
519
|
+
if (
|
|
520
|
+
// Only consider a group if it doesn't share its associations with the root endpoint
|
|
521
|
+
mcInstance.getMaxNodesCached(ctx, endpoint, group)
|
|
522
|
+
> 0
|
|
523
|
+
&& mcInstance
|
|
524
|
+
.getAllDestinationsCached(ctx, endpoint)
|
|
525
|
+
.get(group)
|
|
526
|
+
?.some((addr) => addr.nodeId === ownNodeId
|
|
527
|
+
&& addr.endpoint === 0)) {
|
|
528
|
+
return true;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return false;
|
|
532
|
+
};
|
|
533
|
+
// If the node was used with other controller software, there might be
|
|
534
|
+
// invalid lifeline associations which cause reporting problems
|
|
535
|
+
const invalidEndpointAssociations = mcInstance
|
|
536
|
+
?.getAllDestinationsCached(ctx, endpoint)
|
|
537
|
+
.get(group)
|
|
538
|
+
?.filter((addr) => addr.nodeId === ownNodeId
|
|
539
|
+
&& addr.endpoint != undefined
|
|
540
|
+
&& addr.endpoint !== 0) ?? [];
|
|
541
|
+
// Clean them up first
|
|
542
|
+
if (invalidEndpointAssociations.length > 0
|
|
543
|
+
&& mcAPI.isSupported()
|
|
544
|
+
&& groupSupportsMultiChannelAssociation) {
|
|
545
|
+
ctx.logNode(node.id, {
|
|
546
|
+
endpoint: endpoint.index,
|
|
547
|
+
message: `Found invalid lifeline associations in group #${group}, removing them...`,
|
|
548
|
+
direction: "outbound",
|
|
549
|
+
});
|
|
550
|
+
await mcAPI.removeDestinations({
|
|
551
|
+
groupId: group,
|
|
552
|
+
endpoints: invalidEndpointAssociations,
|
|
553
|
+
});
|
|
554
|
+
// refresh the associations - don't trust that it worked
|
|
555
|
+
await mcAPI.getGroup(group);
|
|
556
|
+
}
|
|
557
|
+
// Assigning the correct lifelines depends on the association kind, source endpoint and the desired strategy:
|
|
558
|
+
//
|
|
559
|
+
// When `mustUseMultiChannelAssociation` is `true` - Use a multi channel association (if possible), no fallback
|
|
560
|
+
// When `mustUseNodeAssociation` is `true` - Use a node association (if possible), no fallback
|
|
561
|
+
// Otherwise:
|
|
562
|
+
// 1. Try a node association on the current endpoint/root
|
|
563
|
+
// 2. If Association CC is not supported, try assigning a node association with the Multi Channel Association CC
|
|
564
|
+
// 3. If that did not work, fall back to a multi channel association (target endpoint 0)
|
|
565
|
+
// 4. If that did not work either, the endpoint index is >0 and the node is Z-Wave+:
|
|
566
|
+
// Fall back to a multi channel association (target endpoint 0) on the root, if it doesn't have one yet.
|
|
567
|
+
let hasLifeline = false;
|
|
568
|
+
// First try: node association
|
|
569
|
+
if (!mustUseMultiChannelAssociation) {
|
|
570
|
+
if (isAssignedAsNodeAssociation(endpoint)) {
|
|
571
|
+
// We already have the correct association
|
|
572
|
+
hasLifeline = true;
|
|
573
|
+
ctx.logNode(node.id, {
|
|
574
|
+
endpoint: endpoint.index,
|
|
575
|
+
message: `Lifeline group #${group} is already assigned with a node association`,
|
|
576
|
+
direction: "none",
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
else if (assocAPI.isSupported()
|
|
580
|
+
// Some endpoint groups don't support having any destinations because they are shared with the root
|
|
581
|
+
&& assocInstance.getMaxNodesCached(ctx, endpoint, group)
|
|
582
|
+
> 0) {
|
|
583
|
+
// We can use a node association, but first remove any possible endpoint associations
|
|
584
|
+
ctx.logNode(node.id, {
|
|
585
|
+
endpoint: endpoint.index,
|
|
586
|
+
message: `Assigning lifeline group #${group} with a node association via Association CC...`,
|
|
587
|
+
direction: "outbound",
|
|
588
|
+
});
|
|
589
|
+
if (isAssignedAsEndpointAssociation(endpoint)
|
|
590
|
+
&& mcAPI.isSupported()) {
|
|
591
|
+
await mcAPI.removeDestinations({
|
|
592
|
+
groupId: group,
|
|
593
|
+
endpoints: [{ nodeId: ownNodeId, endpoint: 0 }],
|
|
594
|
+
});
|
|
595
|
+
// refresh the associations - don't trust that it worked
|
|
596
|
+
await mcAPI.getGroup(group);
|
|
597
|
+
}
|
|
598
|
+
await assocAPI.addNodeIds(group, ownNodeId);
|
|
599
|
+
// refresh the associations - don't trust that it worked
|
|
600
|
+
const groupReport = await assocAPI.getGroup(group);
|
|
601
|
+
hasLifeline = !!groupReport?.nodeIds.includes(ownNodeId);
|
|
602
|
+
if (hasLifeline) {
|
|
603
|
+
ctx.logNode(node.id, {
|
|
604
|
+
endpoint: endpoint.index,
|
|
605
|
+
message: `Lifeline group #${group} was assigned with a node association via Association CC`,
|
|
606
|
+
direction: "none",
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
ctx.logNode(node.id, {
|
|
611
|
+
endpoint: endpoint.index,
|
|
612
|
+
message: `Assigning lifeline group #${group} with a node association via Association CC did not work`,
|
|
613
|
+
direction: "none",
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
// Second try: Node association using the Multi Channel Association CC
|
|
618
|
+
if (!hasLifeline
|
|
619
|
+
&& mcAPI.isSupported()
|
|
620
|
+
&& mcInstance.getMaxNodesCached(ctx, endpoint, group) > 0) {
|
|
621
|
+
// We can use a node association, but first remove any possible endpoint associations
|
|
622
|
+
ctx.logNode(node.id, {
|
|
623
|
+
endpoint: endpoint.index,
|
|
624
|
+
message: `Assigning lifeline group #${group} with a node association via Multi Channel Association CC...`,
|
|
625
|
+
direction: "outbound",
|
|
626
|
+
});
|
|
627
|
+
if (isAssignedAsEndpointAssociation(endpoint)) {
|
|
628
|
+
await mcAPI.removeDestinations({
|
|
629
|
+
groupId: group,
|
|
630
|
+
endpoints: [{ nodeId: ownNodeId, endpoint: 0 }],
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
await mcAPI.addDestinations({
|
|
634
|
+
groupId: group,
|
|
635
|
+
nodeIds: [ownNodeId],
|
|
636
|
+
});
|
|
637
|
+
// refresh the associations - don't trust that it worked
|
|
638
|
+
const groupReport = await mcAPI.getGroup(group);
|
|
639
|
+
hasLifeline = !!groupReport?.nodeIds.includes(ownNodeId);
|
|
640
|
+
if (hasLifeline) {
|
|
641
|
+
ctx.logNode(node.id, {
|
|
642
|
+
endpoint: endpoint.index,
|
|
643
|
+
message: `Lifeline group #${group} was assigned with a node association via Multi Channel Association CC`,
|
|
644
|
+
direction: "none",
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
else {
|
|
648
|
+
ctx.logNode(node.id, {
|
|
649
|
+
endpoint: endpoint.index,
|
|
650
|
+
message: `Assigning lifeline group #${group} with a node association via Multi Channel Association CC did not work`,
|
|
651
|
+
direction: "none",
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
// Third try: Use an endpoint association (target endpoint 0)
|
|
657
|
+
// This is only supported starting in Multi Channel Association CC V3
|
|
658
|
+
if (!hasLifeline && !mustUseNodeAssociation) {
|
|
659
|
+
if (isAssignedAsEndpointAssociation(endpoint)) {
|
|
660
|
+
// We already have the correct association
|
|
661
|
+
hasLifeline = true;
|
|
662
|
+
ctx.logNode(node.id, {
|
|
663
|
+
endpoint: endpoint.index,
|
|
664
|
+
message: `Lifeline group #${group} is already assigned with an endpoint association`,
|
|
665
|
+
direction: "none",
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
else if (mcAPI.isSupported()
|
|
669
|
+
&& mcAPI.version >= 3
|
|
670
|
+
&& mcInstance.getMaxNodesCached(ctx, endpoint, group) > 0) {
|
|
671
|
+
// We can use a multi channel association, but first remove any possible node associations
|
|
672
|
+
ctx.logNode(node.id, {
|
|
673
|
+
endpoint: endpoint.index,
|
|
674
|
+
message: `Assigning lifeline group #${group} with a multi channel association...`,
|
|
675
|
+
direction: "outbound",
|
|
676
|
+
});
|
|
677
|
+
if (isAssignedAsNodeAssociation(endpoint)) {
|
|
678
|
+
// It has been found that some devices don't correctly share the node associations between
|
|
679
|
+
// Association CC and Multi Channel Association CC, so we remove the nodes from both lists
|
|
680
|
+
await mcAPI.removeDestinations({
|
|
681
|
+
groupId: group,
|
|
682
|
+
nodeIds: [ownNodeId],
|
|
683
|
+
});
|
|
684
|
+
if (assocAPI.isSupported()) {
|
|
685
|
+
await assocAPI.removeNodeIds({
|
|
686
|
+
groupId: group,
|
|
687
|
+
nodeIds: [ownNodeId],
|
|
688
|
+
});
|
|
689
|
+
// refresh the associations - don't trust that it worked
|
|
690
|
+
await assocAPI.getGroup(group);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
await mcAPI.addDestinations({
|
|
694
|
+
groupId: group,
|
|
695
|
+
endpoints: [{ nodeId: ownNodeId, endpoint: 0 }],
|
|
696
|
+
});
|
|
697
|
+
// refresh the associations - don't trust that it worked
|
|
698
|
+
const groupReport = await mcAPI.getGroup(group);
|
|
699
|
+
hasLifeline = !!groupReport?.endpoints.some((a) => a.nodeId === ownNodeId && a.endpoint === 0);
|
|
700
|
+
if (hasLifeline) {
|
|
701
|
+
ctx.logNode(node.id, {
|
|
702
|
+
endpoint: endpoint.index,
|
|
703
|
+
message: `Lifeline group #${group} was assigned with a multi channel association`,
|
|
704
|
+
direction: "none",
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
else {
|
|
708
|
+
ctx.logNode(node.id, {
|
|
709
|
+
endpoint: endpoint.index,
|
|
710
|
+
message: `Assigning lifeline group #${group} with a multi channel association did not work`,
|
|
711
|
+
direction: "none",
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
// Last attempt (actual Z-Wave+ Lifelines only): Try a multi channel association on the root.
|
|
717
|
+
// Endpoint interviews happen AFTER the root interview, so this enables us to overwrite what
|
|
718
|
+
// we previously configured on the root.
|
|
719
|
+
if (!hasLifeline
|
|
720
|
+
&& group === 1
|
|
721
|
+
&& node.supportsCC(CommandClasses["Z-Wave Plus Info"])
|
|
722
|
+
&& endpoint.index > 0) {
|
|
723
|
+
// But first check if the root may have a multi channel association
|
|
724
|
+
const rootAssocConfig = deviceConfig
|
|
725
|
+
?.getAssociationConfigForEndpoint(0, group);
|
|
726
|
+
const rootMustUseNodeAssociation = !nodeSupportsMultiChannel
|
|
727
|
+
|| rootAssocConfig?.multiChannel === false;
|
|
728
|
+
ctx.logNode(node.id, {
|
|
729
|
+
endpoint: endpoint.index,
|
|
730
|
+
message: `Checking root device for fallback assignment of lifeline group #${group}:
|
|
731
|
+
root supports multi channel: ${nodeSupportsMultiChannel}
|
|
732
|
+
configured strategy: ${rootAssocConfig?.multiChannel ?? "auto"}
|
|
733
|
+
must use node association: ${rootMustUseNodeAssociation}`,
|
|
734
|
+
});
|
|
735
|
+
if (!rootMustUseNodeAssociation) {
|
|
736
|
+
if (isAssignedAsEndpointAssociation(node)) {
|
|
737
|
+
// We already have the correct association
|
|
738
|
+
hasLifeline = true;
|
|
739
|
+
ctx.logNode(node.id, {
|
|
740
|
+
endpoint: endpoint.index,
|
|
741
|
+
message: `Lifeline group #${group} is already assigned with a multi channel association on the root device`,
|
|
742
|
+
direction: "none",
|
|
743
|
+
});
|
|
744
|
+
}
|
|
745
|
+
else {
|
|
746
|
+
const rootMCAPI = CCAPI.create(CommandClasses["Multi Channel Association"], ctx, node);
|
|
747
|
+
const rootAssocAPI = CCAPI.create(CommandClasses.Association, ctx, node);
|
|
748
|
+
if (rootMCAPI.isSupported()) {
|
|
749
|
+
ctx.logNode(node.id, {
|
|
750
|
+
endpoint: endpoint.index,
|
|
751
|
+
message: `Assigning lifeline group #${group} with a multi channel association on the root device...`,
|
|
752
|
+
direction: "outbound",
|
|
753
|
+
});
|
|
754
|
+
// Clean up node associations because they might prevent us from adding the endpoint association
|
|
755
|
+
if (isAssignedAsNodeAssociation(node)) {
|
|
756
|
+
// It has been found that some devices don't correctly share the node associations between
|
|
757
|
+
// Association CC and Multi Channel Association CC, so we remove the nodes from both lists
|
|
758
|
+
await rootMCAPI.removeDestinations({
|
|
759
|
+
groupId: group,
|
|
760
|
+
nodeIds: [ownNodeId],
|
|
761
|
+
});
|
|
762
|
+
if (rootAssocAPI.isSupported()) {
|
|
763
|
+
await rootAssocAPI.removeNodeIds({
|
|
764
|
+
groupId: group,
|
|
765
|
+
nodeIds: [ownNodeId],
|
|
766
|
+
});
|
|
767
|
+
// refresh the associations - don't trust that it worked
|
|
768
|
+
await rootAssocAPI.getGroup(group);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
await rootMCAPI.addDestinations({
|
|
772
|
+
groupId: group,
|
|
773
|
+
endpoints: [{ nodeId: ownNodeId, endpoint: 0 }],
|
|
774
|
+
});
|
|
775
|
+
// refresh the associations - don't trust that it worked
|
|
776
|
+
const groupReport = await rootMCAPI.getGroup(group);
|
|
777
|
+
hasLifeline = !!groupReport?.endpoints.some((a) => a.nodeId === ownNodeId && a.endpoint === 0);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
if (!hasLifeline) {
|
|
783
|
+
ctx.logNode(node.id, {
|
|
784
|
+
endpoint: endpoint.index,
|
|
785
|
+
message: `All attempts to assign lifeline group #${group} failed, skipping...`,
|
|
786
|
+
direction: "none",
|
|
787
|
+
level: "warn",
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
// Remember that we did the association assignment
|
|
792
|
+
valueDB.setValue(AssociationCCValues.hasLifeline.endpoint(endpoint.index), true);
|
|
793
|
+
}
|
|
794
|
+
export async function assignLifelineIssueingCommand(ctx, endpoint, ccId, ccCommand) {
|
|
795
|
+
const node = ctx.getNodeOrThrow(endpoint.nodeId);
|
|
796
|
+
if (node.supportsCC(CommandClasses["Association Group Information"])
|
|
797
|
+
&& (node.supportsCC(CommandClasses.Association)
|
|
798
|
+
|| node.supportsCC(CommandClasses["Multi Channel Association"]))) {
|
|
799
|
+
const groupsIssueingNotifications = AssociationGroupInfoCC
|
|
800
|
+
.findGroupsForIssuedCommand(ctx, node, ccId, ccCommand);
|
|
801
|
+
if (groupsIssueingNotifications.length > 0) {
|
|
802
|
+
// We always grab the first group - usually it should be the lifeline
|
|
803
|
+
const groupId = groupsIssueingNotifications[0];
|
|
804
|
+
const existingAssociations = getAssociations(ctx, node).get(groupId)
|
|
805
|
+
?? [];
|
|
806
|
+
if (!existingAssociations.some((a) => a.nodeId === ctx.ownNodeId)) {
|
|
807
|
+
ctx.logNode(node.id, {
|
|
808
|
+
endpoint: endpoint.index,
|
|
809
|
+
message: `Configuring associations to receive ${getCCName(ccId)} commands...`,
|
|
810
|
+
direction: "outbound",
|
|
811
|
+
});
|
|
812
|
+
await addAssociations(ctx, node, groupId, [
|
|
813
|
+
{ nodeId: ctx.ownNodeId },
|
|
814
|
+
]);
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
export function doesAnyLifelineSendActuatorOrSensorReports(ctx, node) {
|
|
820
|
+
// No association support means no unsolicited reports
|
|
821
|
+
if (!node.supportsCC(CommandClasses.Association)
|
|
822
|
+
&& !node.supportsCC(CommandClasses["Multi Channel Association"])) {
|
|
823
|
+
return false;
|
|
824
|
+
}
|
|
825
|
+
// No AGI support means we cannot know
|
|
826
|
+
if (!node.supportsCC(CommandClasses["Association Group Information"])) {
|
|
827
|
+
return NOT_KNOWN;
|
|
828
|
+
}
|
|
829
|
+
// Lifeline group IDs include the ones we added via a config file, so they may not be considered true lifelines
|
|
830
|
+
const lifelineGroupIds = getLifelineGroupIds(ctx, node);
|
|
831
|
+
// If any potential lifeline group has the "General: Lifeline" profile, the node MUST send unsolicited reports that way
|
|
832
|
+
if (lifelineGroupIds.some((id) => AssociationGroupInfoCC.getGroupProfileCached(ctx, node, id) === AssociationGroupInfoProfile["General: Lifeline"])) {
|
|
833
|
+
return true;
|
|
834
|
+
}
|
|
835
|
+
// Otherwise check if any of the groups sends any actuator or sensor commands. We'll assume that those are reports
|
|
836
|
+
for (const groupId of lifelineGroupIds) {
|
|
837
|
+
const issuedCommands = AssociationGroupInfoCC.getIssuedCommandsCached(ctx, node, groupId);
|
|
838
|
+
if (!issuedCommands)
|
|
839
|
+
continue;
|
|
840
|
+
const commands = [...issuedCommands.keys()];
|
|
841
|
+
if (commands.some((c) => isActuatorCC(c) || isSensorCC(c))) {
|
|
842
|
+
return true;
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
return false;
|
|
846
|
+
}
|
|
847
|
+
//# sourceMappingURL=utils.js.map
|