This is the default server implementation of WindowCoveringBehavior.

This implementation includes all features of WindowCovering.Cluster and implements all mandatory commands. You should use WindowCoveringServer.with to specialize the class for the features your implementation supports.

If you enable position awareness (positionAware* features), the default logic automatically syncs current positions and operational state when the currentPositionPercent100ths attributes change. You should update currentPositionPercent100ths with the actual position from your device. This updates other attributes automatically.

When targetPosition*Percent100ths attributes change, operational state updates bases on the current and target values.

If you do not override handleMovement the default implementation updates current position to the target position immediately.

In addition to Matter attributes, WindowCoveringServerLogic.State includes the following configuration properties:

  • supportsCalibration (default false): Set to true if the device supports calibration. You must implement WindowCoveringServerLogic.executeCalibration to perform actual calibration.

  • supportsMaintenanceMode (default true): Set to false if the device has no maintenance mode

When developing for specific hardware you should extend WindowCoveringServer and implement the following methods to map movement to your device. The default implementation maps Matter commands to these methods. The benefit of this structure is that basic data validations and option checks are already done and you can focus on the actual hardware interaction:

  • WindowCoveringServerLogic.handleMovement Logic to actually move the device. Via Parameters the movement type (Lift/Tilt), direction, target percentage and information if motor is configured reversed are provided. When the device moves the current Positions (if supported by the device) are updated with the movement. The operational state is automatically updated by the default implementation based on current and target values of the cluster state.

  • WindowCoveringServerLogic.handleStopMovement Logic to stop any movement of the device. You can use the super.handleStopMovement() to set the target positions to the current positions or do this yourself.

  • WindowCoveringServerLogic.executeCalibration If supported, override this method to implement the calibration process. The default implementation returns an error to indicate calibration is unsupported. If unsupported you should also add a Changing event handler to the mode attribute to ensure calibration mode is not set (needs to throw an ConstraintError).

IMPORTANT NOTE:

This default implementation could have pitfalls when the calibration process and/or movement is handled via long running promises. There could be edge cases not correctly handled by the current implementation when it comes to long running movements or calibration processes - especially when these processes are long running async JS operations.

A movement coming in while another movement is still running is assumed to be handled by the device. It is not handled here. If this causes you trouble please provide feedback and we can discuss how to improve the default implementation.

Hierarchy

  • WindowCoveringServerBase
    • WindowCoveringServerLogic

Constructors

  • Parameters

    • agent: Agent
    • backing: BehaviorBacking

    Returns WindowCoveringServerLogic

Properties

[reference]: Datasource<StateType>
agent: Agent
cluster: never

The implemented cluster.

context: ActionContext
endpoint: Endpoint<Empty>
events: EventEmitter & Omit<ClusterEvents<Of<{
    attributes: {
        configStatus: Attribute<TypeFromPartialBitSchema<{
            liftEncoderControlled: BitFlag;
            liftMovementReversed: BitFlag;
            liftPositionAware: BitFlag;
            onlineReserved: BitFlag;
            operational: BitFlag;
            tiltEncoderControlled: BitFlag;
            tiltPositionAware: BitFlag;
        }>, any>;
        endProductType: FixedAttribute<WindowCovering.EndProductType, any>;
        mode: WritableAttribute<TypeFromPartialBitSchema<{
            calibrationMode: BitFlag;
            ledFeedback: BitFlag;
            maintenanceMode: BitFlag;
            motorDirectionReversed: BitFlag;
        }>, any>;
        operationalStatus: Attribute<TypeFromPartialBitSchema<{
            global: BitFieldEnum<WindowCovering.MovementStatus>;
            lift: BitFieldEnum<WindowCovering.MovementStatus>;
            tilt: BitFieldEnum<WindowCovering.MovementStatus>;
        }>, any>;
        safetyStatus: OptionalAttribute<TypeFromPartialBitSchema<{
            failedCommunication: BitFlag;
            hardwareFailure: BitFlag;
            manualOperation: BitFlag;
            motorJammed: BitFlag;
            obstacleDetected: BitFlag;
            positionFailure: BitFlag;
            power: BitFlag;
            protection: BitFlag;
            remoteLockout: BitFlag;
            stopInput: BitFlag;
            tamperDetection: BitFlag;
            thermalProtection: BitFlag;
        }>, any>;
        type: FixedAttribute<WindowCovering.WindowCoveringType, any>;
    };
    commands: {
        downOrClose: Command<void, void, any>;
        stopMotion: Command<void, void, any>;
        upOrOpen: Command<void, void, any>;
    };
    extensions: readonly [{
        component: {
            attributes: {
                currentPositionLift: OptionalAttribute<(...) | (...), any>;
                installedClosedLimitLift: Attribute<number, any>;
                installedOpenLimitLift: Attribute<number, any>;
                physicalClosedLimitLift: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTilt: OptionalAttribute<(...) | (...), any>;
                installedClosedLimitTilt: Attribute<number, any>;
                installedOpenLimitTilt: Attribute<number, any>;
                physicalClosedLimitTilt: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsLift: OptionalAttribute<number, any>;
            };
            commands: {
                goToLiftPercentage: OptionalCommand<TypeFromFields<(...)>, void, any>;
            };
        };
        flags: {
            lift: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsTilt: OptionalAttribute<number, any>;
            };
            commands: {
                goToTiltPercentage: OptionalCommand<TypeFromFields<(...)>, void, any>;
            };
        };
        flags: {
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionLiftPercent100ths: Attribute<(...) | (...), any>;
                currentPositionLiftPercentage: OptionalAttribute<(...) | (...), any>;
                targetPositionLiftPercent100ths: Attribute<(...) | (...), any>;
            };
            commands: {
                goToLiftPercentage: Command<TypeFromFields<(...)>, void, any>;
            };
        };
        flags: {
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTiltPercent100ths: Attribute<(...) | (...), any>;
                currentPositionTiltPercentage: OptionalAttribute<(...) | (...), any>;
                targetPositionTiltPercent100ths: Attribute<(...) | (...), any>;
            };
            commands: {
                goToTiltPercentage: Command<TypeFromFields<(...)>, void, any>;
            };
        };
        flags: {
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            commands: {
                goToLiftValue: OptionalCommand<TypeFromFields<(...)>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
        };
    }, {
        component: {
            commands: {
                goToTiltValue: OptionalCommand<TypeFromFields<(...)>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            tilt: true;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            positionAwareLift: true;
        };
    }, {
        component: false;
        flags: {
            positionAwareTilt: true;
            tilt: false;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            tilt: false;
        };
    }];
    features: {
        absolutePosition: BitFlag;
        lift: BitFlag;
        positionAwareLift: BitFlag;
        positionAwareTilt: BitFlag;
        tilt: BitFlag;
    };
    id: 258;
    name: "WindowCovering";
    revision: 5;
}>, Type<Of<{
    attributes: {};
    commands: {};
    events: {};
    id: 0;
    name: "Unknown";
    revision: 0;
}>, typeof ClusterBehavior, WindowCoveringInterface>>,
    | "type$Changing"
    | "configStatus$Changing"
    | "operationalStatus$Changing"
    | "endProductType$Changing"
    | "mode$Changing"
    | "safetyStatus$Changing"
    | "type$Changed"
    | "configStatus$Changed"
    | "operationalStatus$Changed"
    | "endProductType$Changed"
    | "mode$Changed"
    | "safetyStatus$Changed"> & {
    configStatus$Changing: ClusterEvents.AttributeObservable<Attribute<TypeFromPartialBitSchema<{
        liftEncoderControlled: BitFlag;
        liftMovementReversed: BitFlag;
        liftPositionAware: BitFlag;
        onlineReserved: BitFlag;
        operational: BitFlag;
        tiltEncoderControlled: BitFlag;
        tiltPositionAware: BitFlag;
    }>, any>>;
    currentPositionLiftPercent100ths$Changing: ClusterEvents.AttributeObservable<Attribute<null | number, any>>;
    currentPositionTiltPercent100ths$Changing: ClusterEvents.AttributeObservable<Attribute<null | number, any>>;
    endProductType$Changing: ClusterEvents.AttributeObservable<FixedAttribute<WindowCovering.EndProductType, any>>;
    installedClosedLimitLift$Changing: ClusterEvents.AttributeObservable<Attribute<number, any>>;
    installedClosedLimitTilt$Changing: ClusterEvents.AttributeObservable<Attribute<number, any>>;
    installedOpenLimitLift$Changing: ClusterEvents.AttributeObservable<Attribute<number, any>>;
    installedOpenLimitTilt$Changing: ClusterEvents.AttributeObservable<Attribute<number, any>>;
    mode$Changing: ClusterEvents.AttributeObservable<WritableAttribute<TypeFromPartialBitSchema<{
        calibrationMode: BitFlag;
        ledFeedback: BitFlag;
        maintenanceMode: BitFlag;
        motorDirectionReversed: BitFlag;
    }>, any>>;
    operationalStatus$Changing: ClusterEvents.AttributeObservable<Attribute<TypeFromPartialBitSchema<{
        global: BitFieldEnum<WindowCovering.MovementStatus>;
        lift: BitFieldEnum<WindowCovering.MovementStatus>;
        tilt: BitFieldEnum<WindowCovering.MovementStatus>;
    }>, any>>;
    targetPositionLiftPercent100ths$Changing: ClusterEvents.AttributeObservable<Attribute<null | number, any>>;
    targetPositionTiltPercent100ths$Changing: ClusterEvents.AttributeObservable<Attribute<null | number, any>>;
    type$Changing: ClusterEvents.AttributeObservable<FixedAttribute<WindowCovering.WindowCoveringType, any>>;
} & {
    currentPositionLift$Changing: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<null | number, any>>;
    currentPositionLiftPercentage$Changing: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<null | number, any>>;
    currentPositionTilt$Changing: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<null | number, any>>;
    currentPositionTiltPercentage$Changing: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<null | number, any>>;
    numberOfActuationsLift$Changing: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<number, any>>;
    numberOfActuationsTilt$Changing: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<number, any>>;
    physicalClosedLimitLift$Changing: undefined | ClusterEvents.AttributeObservable<OptionalFixedAttribute<number, any>>;
    physicalClosedLimitTilt$Changing: undefined | ClusterEvents.AttributeObservable<OptionalFixedAttribute<number, any>>;
    safetyStatus$Changing: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<TypeFromPartialBitSchema<{
        failedCommunication: BitFlag;
        hardwareFailure: BitFlag;
        manualOperation: BitFlag;
        motorJammed: BitFlag;
        obstacleDetected: BitFlag;
        positionFailure: BitFlag;
        power: BitFlag;
        protection: BitFlag;
        remoteLockout: BitFlag;
        stopInput: BitFlag;
        tamperDetection: BitFlag;
        thermalProtection: BitFlag;
    }>, any>>;
} & {
    configStatus$Changed: ClusterEvents.AttributeObservable<Attribute<TypeFromPartialBitSchema<{
        liftEncoderControlled: BitFlag;
        liftMovementReversed: BitFlag;
        liftPositionAware: BitFlag;
        onlineReserved: BitFlag;
        operational: BitFlag;
        tiltEncoderControlled: BitFlag;
        tiltPositionAware: BitFlag;
    }>, any>>;
    currentPositionLiftPercent100ths$Changed: ClusterEvents.AttributeObservable<Attribute<null | number, any>>;
    currentPositionTiltPercent100ths$Changed: ClusterEvents.AttributeObservable<Attribute<null | number, any>>;
    endProductType$Changed: ClusterEvents.AttributeObservable<FixedAttribute<WindowCovering.EndProductType, any>>;
    installedClosedLimitLift$Changed: ClusterEvents.AttributeObservable<Attribute<number, any>>;
    installedClosedLimitTilt$Changed: ClusterEvents.AttributeObservable<Attribute<number, any>>;
    installedOpenLimitLift$Changed: ClusterEvents.AttributeObservable<Attribute<number, any>>;
    installedOpenLimitTilt$Changed: ClusterEvents.AttributeObservable<Attribute<number, any>>;
    mode$Changed: ClusterEvents.AttributeObservable<WritableAttribute<TypeFromPartialBitSchema<{
        calibrationMode: BitFlag;
        ledFeedback: BitFlag;
        maintenanceMode: BitFlag;
        motorDirectionReversed: BitFlag;
    }>, any>>;
    operationalStatus$Changed: ClusterEvents.AttributeObservable<Attribute<TypeFromPartialBitSchema<{
        global: BitFieldEnum<WindowCovering.MovementStatus>;
        lift: BitFieldEnum<WindowCovering.MovementStatus>;
        tilt: BitFieldEnum<WindowCovering.MovementStatus>;
    }>, any>>;
    targetPositionLiftPercent100ths$Changed: ClusterEvents.AttributeObservable<Attribute<null | number, any>>;
    targetPositionTiltPercent100ths$Changed: ClusterEvents.AttributeObservable<Attribute<null | number, any>>;
    type$Changed: ClusterEvents.AttributeObservable<FixedAttribute<WindowCovering.WindowCoveringType, any>>;
} & {
    currentPositionLift$Changed: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<null | number, any>>;
    currentPositionLiftPercentage$Changed: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<null | number, any>>;
    currentPositionTilt$Changed: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<null | number, any>>;
    currentPositionTiltPercentage$Changed: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<null | number, any>>;
    numberOfActuationsLift$Changed: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<number, any>>;
    numberOfActuationsTilt$Changed: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<number, any>>;
    physicalClosedLimitLift$Changed: undefined | ClusterEvents.AttributeObservable<OptionalFixedAttribute<number, any>>;
    physicalClosedLimitTilt$Changed: undefined | ClusterEvents.AttributeObservable<OptionalFixedAttribute<number, any>>;
    safetyStatus$Changed: undefined | ClusterEvents.AttributeObservable<OptionalAttribute<TypeFromPartialBitSchema<{
        failedCommunication: BitFlag;
        hardwareFailure: BitFlag;
        manualOperation: BitFlag;
        motorJammed: BitFlag;
        obstacleDetected: BitFlag;
        positionFailure: BitFlag;
        power: BitFlag;
        protection: BitFlag;
        remoteLockout: BitFlag;
        stopInput: BitFlag;
        tamperDetection: BitFlag;
        thermalProtection: BitFlag;
    }>, any>>;
} & {} & {}

Access the behavior's events.

features: TypeFromBitSchema<{}> & TypeFromBitSchema<{
    absolutePosition: BitFlag;
    lift: BitFlag;
    positionAwareLift: BitFlag;
    positionAwareTilt: BitFlag;
    tilt: BitFlag;
}> & TypeFromBitSchema<{
    absolutePosition: BitFlag;
    lift: BitFlag;
    positionAwareLift: BitFlag;
    positionAwareTilt: BitFlag;
    tilt: BitFlag;
}>

Supported features as a flag object.

internal: Internal
session: SecureSession
state: State

Access the behavior's state.

cluster: WithFeatures<Of<{
    attributes: {
        configStatus: Attribute<TypeFromPartialBitSchema<{
            liftEncoderControlled: BitFlag;
            liftMovementReversed: BitFlag;
            liftPositionAware: BitFlag;
            onlineReserved: BitFlag;
            operational: BitFlag;
            tiltEncoderControlled: BitFlag;
            tiltPositionAware: BitFlag;
        }>, any>;
        endProductType: FixedAttribute<WindowCovering.EndProductType, any>;
        mode: WritableAttribute<TypeFromPartialBitSchema<{
            calibrationMode: BitFlag;
            ledFeedback: BitFlag;
            maintenanceMode: BitFlag;
            motorDirectionReversed: BitFlag;
        }>, any>;
        operationalStatus: Attribute<TypeFromPartialBitSchema<{
            global: BitFieldEnum<WindowCovering.MovementStatus>;
            lift: BitFieldEnum<WindowCovering.MovementStatus>;
            tilt: BitFieldEnum<WindowCovering.MovementStatus>;
        }>, any>;
        safetyStatus: OptionalAttribute<TypeFromPartialBitSchema<{
            failedCommunication: BitFlag;
            hardwareFailure: BitFlag;
            manualOperation: BitFlag;
            motorJammed: BitFlag;
            obstacleDetected: BitFlag;
            positionFailure: BitFlag;
            power: BitFlag;
            protection: BitFlag;
            remoteLockout: BitFlag;
            stopInput: BitFlag;
            tamperDetection: BitFlag;
            thermalProtection: BitFlag;
        }>, any>;
        type: FixedAttribute<WindowCovering.WindowCoveringType, any>;
    };
    commands: {
        downOrClose: Command<void, void, any>;
        stopMotion: Command<void, void, any>;
        upOrOpen: Command<void, void, any>;
    };
    extensions: readonly [{
        component: {
            attributes: {
                currentPositionLift: OptionalAttribute<null | number, any>;
                installedClosedLimitLift: Attribute<number, any>;
                installedOpenLimitLift: Attribute<number, any>;
                physicalClosedLimitLift: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTilt: OptionalAttribute<null | number, any>;
                installedClosedLimitTilt: Attribute<number, any>;
                installedOpenLimitTilt: Attribute<number, any>;
                physicalClosedLimitTilt: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsLift: OptionalAttribute<number, any>;
            };
            commands: {
                goToLiftPercentage: OptionalCommand<TypeFromFields<{
                    liftPercent100thsValue: FieldType<(...)>;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsTilt: OptionalAttribute<number, any>;
            };
            commands: {
                goToTiltPercentage: OptionalCommand<TypeFromFields<{
                    tiltPercent100thsValue: FieldType<(...)>;
                }>, void, any>;
            };
        };
        flags: {
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionLiftPercent100ths: Attribute<null | number, any>;
                currentPositionLiftPercentage: OptionalAttribute<null | number, any>;
                targetPositionLiftPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToLiftPercentage: Command<TypeFromFields<{
                    liftPercent100thsValue: FieldType<(...)>;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTiltPercent100ths: Attribute<null | number, any>;
                currentPositionTiltPercentage: OptionalAttribute<null | number, any>;
                targetPositionTiltPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToTiltPercentage: Command<TypeFromFields<{
                    tiltPercent100thsValue: FieldType<(...)>;
                }>, void, any>;
            };
        };
        flags: {
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            commands: {
                goToLiftValue: OptionalCommand<TypeFromFields<{
                    liftValue: FieldType<(...)>;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
        };
    }, {
        component: {
            commands: {
                goToTiltValue: OptionalCommand<TypeFromFields<{
                    tiltValue: FieldType<(...)>;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            tilt: true;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            positionAwareLift: true;
        };
    }, {
        component: false;
        flags: {
            positionAwareTilt: true;
            tilt: false;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            tilt: false;
        };
    }];
    features: {
        absolutePosition: BitFlag;
        lift: BitFlag;
        positionAwareLift: BitFlag;
        positionAwareTilt: BitFlag;
        tilt: BitFlag;
    };
    id: 258;
    name: "WindowCovering";
    revision: 5;
}>, readonly [Lift, Tilt, PositionAwareLift, PositionAwareTilt, AbsolutePosition]>

Base cluster state include all attribute values but may be extended by subclasses.

defaults: ClusterState.Type<WithFeatures<Of<{
    attributes: {
        configStatus: Attribute<TypeFromPartialBitSchema<{
            liftEncoderControlled: BitFlag;
            liftMovementReversed: BitFlag;
            liftPositionAware: BitFlag;
            onlineReserved: BitFlag;
            operational: BitFlag;
            tiltEncoderControlled: BitFlag;
            tiltPositionAware: BitFlag;
        }>, any>;
        endProductType: FixedAttribute<WindowCovering.EndProductType, any>;
        mode: WritableAttribute<TypeFromPartialBitSchema<{
            calibrationMode: BitFlag;
            ledFeedback: BitFlag;
            maintenanceMode: BitFlag;
            motorDirectionReversed: BitFlag;
        }>, any>;
        operationalStatus: Attribute<TypeFromPartialBitSchema<{
            global: BitFieldEnum<WindowCovering.MovementStatus>;
            lift: BitFieldEnum<WindowCovering.MovementStatus>;
            tilt: BitFieldEnum<WindowCovering.MovementStatus>;
        }>, any>;
        safetyStatus: OptionalAttribute<TypeFromPartialBitSchema<{
            failedCommunication: BitFlag;
            hardwareFailure: BitFlag;
            manualOperation: BitFlag;
            motorJammed: BitFlag;
            obstacleDetected: BitFlag;
            positionFailure: BitFlag;
            power: BitFlag;
            protection: BitFlag;
            remoteLockout: BitFlag;
            stopInput: BitFlag;
            tamperDetection: BitFlag;
            thermalProtection: BitFlag;
        }>, any>;
        type: FixedAttribute<WindowCovering.WindowCoveringType, any>;
    };
    commands: {
        downOrClose: Command<void, void, any>;
        stopMotion: Command<void, void, any>;
        upOrOpen: Command<void, void, any>;
    };
    extensions: readonly [{
        component: {
            attributes: {
                currentPositionLift: OptionalAttribute<null | number, any>;
                installedClosedLimitLift: Attribute<number, any>;
                installedOpenLimitLift: Attribute<number, any>;
                physicalClosedLimitLift: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTilt: OptionalAttribute<null | number, any>;
                installedClosedLimitTilt: Attribute<number, any>;
                installedOpenLimitTilt: Attribute<number, any>;
                physicalClosedLimitTilt: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsLift: OptionalAttribute<number, any>;
            };
            commands: {
                goToLiftPercentage: OptionalCommand<TypeFromFields<{
                    liftPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsTilt: OptionalAttribute<number, any>;
            };
            commands: {
                goToTiltPercentage: OptionalCommand<TypeFromFields<{
                    tiltPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionLiftPercent100ths: Attribute<null | number, any>;
                currentPositionLiftPercentage: OptionalAttribute<null | number, any>;
                targetPositionLiftPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToLiftPercentage: Command<TypeFromFields<{
                    liftPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTiltPercent100ths: Attribute<null | number, any>;
                currentPositionTiltPercentage: OptionalAttribute<null | number, any>;
                targetPositionTiltPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToTiltPercentage: Command<TypeFromFields<{
                    tiltPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            commands: {
                goToLiftValue: OptionalCommand<TypeFromFields<{
                    liftValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
        };
    }, {
        component: {
            commands: {
                goToTiltValue: OptionalCommand<TypeFromFields<{
                    tiltValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            tilt: true;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            positionAwareLift: true;
        };
    }, {
        component: false;
        flags: {
            positionAwareTilt: true;
            tilt: false;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            tilt: false;
        };
    }];
    features: {
        absolutePosition: BitFlag;
        lift: BitFlag;
        positionAwareLift: BitFlag;
        positionAwareTilt: BitFlag;
        tilt: BitFlag;
    };
    id: 258;
    name: "WindowCovering";
    revision: 5;
}>, readonly [Lift, Tilt, PositionAwareLift, PositionAwareTilt, AbsolutePosition]>, Type<Of<{
    attributes: {
        configStatus: Attribute<TypeFromPartialBitSchema<{
            liftEncoderControlled: BitFlag;
            liftMovementReversed: BitFlag;
            liftPositionAware: BitFlag;
            onlineReserved: BitFlag;
            operational: BitFlag;
            tiltEncoderControlled: BitFlag;
            tiltPositionAware: BitFlag;
        }>, any>;
        endProductType: FixedAttribute<WindowCovering.EndProductType, any>;
        mode: WritableAttribute<TypeFromPartialBitSchema<{
            calibrationMode: BitFlag;
            ledFeedback: BitFlag;
            maintenanceMode: BitFlag;
            motorDirectionReversed: BitFlag;
        }>, any>;
        operationalStatus: Attribute<TypeFromPartialBitSchema<{
            global: BitFieldEnum<WindowCovering.MovementStatus>;
            lift: BitFieldEnum<WindowCovering.MovementStatus>;
            tilt: BitFieldEnum<WindowCovering.MovementStatus>;
        }>, any>;
        safetyStatus: OptionalAttribute<TypeFromPartialBitSchema<{
            failedCommunication: BitFlag;
            hardwareFailure: BitFlag;
            manualOperation: BitFlag;
            motorJammed: BitFlag;
            obstacleDetected: BitFlag;
            positionFailure: BitFlag;
            power: BitFlag;
            protection: BitFlag;
            remoteLockout: BitFlag;
            stopInput: BitFlag;
            tamperDetection: BitFlag;
            thermalProtection: BitFlag;
        }>, any>;
        type: FixedAttribute<WindowCovering.WindowCoveringType, any>;
    };
    commands: {
        downOrClose: Command<void, void, any>;
        stopMotion: Command<void, void, any>;
        upOrOpen: Command<void, void, any>;
    };
    extensions: readonly [{
        component: {
            attributes: {
                currentPositionLift: OptionalAttribute<null | number, any>;
                installedClosedLimitLift: Attribute<number, any>;
                installedOpenLimitLift: Attribute<number, any>;
                physicalClosedLimitLift: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTilt: OptionalAttribute<null | number, any>;
                installedClosedLimitTilt: Attribute<number, any>;
                installedOpenLimitTilt: Attribute<number, any>;
                physicalClosedLimitTilt: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsLift: OptionalAttribute<number, any>;
            };
            commands: {
                goToLiftPercentage: OptionalCommand<TypeFromFields<{
                    liftPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsTilt: OptionalAttribute<number, any>;
            };
            commands: {
                goToTiltPercentage: OptionalCommand<TypeFromFields<{
                    tiltPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionLiftPercent100ths: Attribute<null | number, any>;
                currentPositionLiftPercentage: OptionalAttribute<null | number, any>;
                targetPositionLiftPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToLiftPercentage: Command<TypeFromFields<{
                    liftPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTiltPercent100ths: Attribute<null | number, any>;
                currentPositionTiltPercentage: OptionalAttribute<null | number, any>;
                targetPositionTiltPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToTiltPercentage: Command<TypeFromFields<{
                    tiltPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            commands: {
                goToLiftValue: OptionalCommand<TypeFromFields<{
                    liftValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
        };
    }, {
        component: {
            commands: {
                goToTiltValue: OptionalCommand<TypeFromFields<{
                    tiltValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            tilt: true;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            positionAwareLift: true;
        };
    }, {
        component: false;
        flags: {
            positionAwareTilt: true;
            tilt: false;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            tilt: false;
        };
    }];
    features: {
        absolutePosition: BitFlag;
        lift: BitFlag;
        positionAwareLift: BitFlag;
        positionAwareTilt: BitFlag;
        tilt: BitFlag;
    };
    id: 258;
    name: "WindowCovering";
    revision: 5;
}>, Type<Of<{
    attributes: {};
    commands: {};
    events: {};
    id: 0;
    name: "Unknown";
    revision: 0;
}>, typeof ClusterBehavior, WindowCoveringInterface>, WindowCoveringInterface>>
dependencies?: Iterable<Type, any, any>
early: boolean
Events: ClusterEvents.Type<WithFeatures<Of<{
    attributes: {
        configStatus: Attribute<TypeFromPartialBitSchema<{
            liftEncoderControlled: BitFlag;
            liftMovementReversed: BitFlag;
            liftPositionAware: BitFlag;
            onlineReserved: BitFlag;
            operational: BitFlag;
            tiltEncoderControlled: BitFlag;
            tiltPositionAware: BitFlag;
        }>, any>;
        endProductType: FixedAttribute<WindowCovering.EndProductType, any>;
        mode: WritableAttribute<TypeFromPartialBitSchema<{
            calibrationMode: BitFlag;
            ledFeedback: BitFlag;
            maintenanceMode: BitFlag;
            motorDirectionReversed: BitFlag;
        }>, any>;
        operationalStatus: Attribute<TypeFromPartialBitSchema<{
            global: BitFieldEnum<WindowCovering.MovementStatus>;
            lift: BitFieldEnum<WindowCovering.MovementStatus>;
            tilt: BitFieldEnum<WindowCovering.MovementStatus>;
        }>, any>;
        safetyStatus: OptionalAttribute<TypeFromPartialBitSchema<{
            failedCommunication: BitFlag;
            hardwareFailure: BitFlag;
            manualOperation: BitFlag;
            motorJammed: BitFlag;
            obstacleDetected: BitFlag;
            positionFailure: BitFlag;
            power: BitFlag;
            protection: BitFlag;
            remoteLockout: BitFlag;
            stopInput: BitFlag;
            tamperDetection: BitFlag;
            thermalProtection: BitFlag;
        }>, any>;
        type: FixedAttribute<WindowCovering.WindowCoveringType, any>;
    };
    commands: {
        downOrClose: Command<void, void, any>;
        stopMotion: Command<void, void, any>;
        upOrOpen: Command<void, void, any>;
    };
    extensions: readonly [{
        component: {
            attributes: {
                currentPositionLift: OptionalAttribute<null | number, any>;
                installedClosedLimitLift: Attribute<number, any>;
                installedOpenLimitLift: Attribute<number, any>;
                physicalClosedLimitLift: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTilt: OptionalAttribute<null | number, any>;
                installedClosedLimitTilt: Attribute<number, any>;
                installedOpenLimitTilt: Attribute<number, any>;
                physicalClosedLimitTilt: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsLift: OptionalAttribute<number, any>;
            };
            commands: {
                goToLiftPercentage: OptionalCommand<TypeFromFields<{
                    liftPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsTilt: OptionalAttribute<number, any>;
            };
            commands: {
                goToTiltPercentage: OptionalCommand<TypeFromFields<{
                    tiltPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionLiftPercent100ths: Attribute<null | number, any>;
                currentPositionLiftPercentage: OptionalAttribute<null | number, any>;
                targetPositionLiftPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToLiftPercentage: Command<TypeFromFields<{
                    liftPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTiltPercent100ths: Attribute<null | number, any>;
                currentPositionTiltPercentage: OptionalAttribute<null | number, any>;
                targetPositionTiltPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToTiltPercentage: Command<TypeFromFields<{
                    tiltPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            commands: {
                goToLiftValue: OptionalCommand<TypeFromFields<{
                    liftValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
        };
    }, {
        component: {
            commands: {
                goToTiltValue: OptionalCommand<TypeFromFields<{
                    tiltValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            tilt: true;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            positionAwareLift: true;
        };
    }, {
        component: false;
        flags: {
            positionAwareTilt: true;
            tilt: false;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            tilt: false;
        };
    }];
    features: {
        absolutePosition: BitFlag;
        lift: BitFlag;
        positionAwareLift: BitFlag;
        positionAwareTilt: BitFlag;
        tilt: BitFlag;
    };
    id: 258;
    name: "WindowCovering";
    revision: 5;
}>, readonly [Lift, Tilt, PositionAwareLift, PositionAwareTilt, AbsolutePosition]>, Type<Of<{
    attributes: {
        configStatus: Attribute<TypeFromPartialBitSchema<{
            liftEncoderControlled: BitFlag;
            liftMovementReversed: BitFlag;
            liftPositionAware: BitFlag;
            onlineReserved: BitFlag;
            operational: BitFlag;
            tiltEncoderControlled: BitFlag;
            tiltPositionAware: BitFlag;
        }>, any>;
        endProductType: FixedAttribute<WindowCovering.EndProductType, any>;
        mode: WritableAttribute<TypeFromPartialBitSchema<{
            calibrationMode: BitFlag;
            ledFeedback: BitFlag;
            maintenanceMode: BitFlag;
            motorDirectionReversed: BitFlag;
        }>, any>;
        operationalStatus: Attribute<TypeFromPartialBitSchema<{
            global: BitFieldEnum<WindowCovering.MovementStatus>;
            lift: BitFieldEnum<WindowCovering.MovementStatus>;
            tilt: BitFieldEnum<WindowCovering.MovementStatus>;
        }>, any>;
        safetyStatus: OptionalAttribute<TypeFromPartialBitSchema<{
            failedCommunication: BitFlag;
            hardwareFailure: BitFlag;
            manualOperation: BitFlag;
            motorJammed: BitFlag;
            obstacleDetected: BitFlag;
            positionFailure: BitFlag;
            power: BitFlag;
            protection: BitFlag;
            remoteLockout: BitFlag;
            stopInput: BitFlag;
            tamperDetection: BitFlag;
            thermalProtection: BitFlag;
        }>, any>;
        type: FixedAttribute<WindowCovering.WindowCoveringType, any>;
    };
    commands: {
        downOrClose: Command<void, void, any>;
        stopMotion: Command<void, void, any>;
        upOrOpen: Command<void, void, any>;
    };
    extensions: readonly [{
        component: {
            attributes: {
                currentPositionLift: OptionalAttribute<null | number, any>;
                installedClosedLimitLift: Attribute<number, any>;
                installedOpenLimitLift: Attribute<number, any>;
                physicalClosedLimitLift: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTilt: OptionalAttribute<null | number, any>;
                installedClosedLimitTilt: Attribute<number, any>;
                installedOpenLimitTilt: Attribute<number, any>;
                physicalClosedLimitTilt: OptionalFixedAttribute<number, any>;
            };
        };
        flags: {
            absolutePosition: true;
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsLift: OptionalAttribute<number, any>;
            };
            commands: {
                goToLiftPercentage: OptionalCommand<TypeFromFields<{
                    liftPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
        };
    }, {
        component: {
            attributes: {
                numberOfActuationsTilt: OptionalAttribute<number, any>;
            };
            commands: {
                goToTiltPercentage: OptionalCommand<TypeFromFields<{
                    tiltPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            tilt: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionLiftPercent100ths: Attribute<null | number, any>;
                currentPositionLiftPercentage: OptionalAttribute<null | number, any>;
                targetPositionLiftPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToLiftPercentage: Command<TypeFromFields<{
                    liftPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            lift: true;
            positionAwareLift: true;
        };
    }, {
        component: {
            attributes: {
                currentPositionTiltPercent100ths: Attribute<null | number, any>;
                currentPositionTiltPercentage: OptionalAttribute<null | number, any>;
                targetPositionTiltPercent100ths: Attribute<null | number, any>;
            };
            commands: {
                goToTiltPercentage: Command<TypeFromFields<{
                    tiltPercent100thsValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            positionAwareTilt: true;
            tilt: true;
        };
    }, {
        component: {
            commands: {
                goToLiftValue: OptionalCommand<TypeFromFields<{
                    liftValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            lift: true;
        };
    }, {
        component: {
            commands: {
                goToTiltValue: OptionalCommand<TypeFromFields<{
                    tiltValue: ...;
                }>, void, any>;
            };
        };
        flags: {
            absolutePosition: true;
            tilt: true;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            positionAwareLift: true;
        };
    }, {
        component: false;
        flags: {
            positionAwareTilt: true;
            tilt: false;
        };
    }, {
        component: false;
        flags: {
            lift: false;
            tilt: false;
        };
    }];
    features: {
        absolutePosition: BitFlag;
        lift: BitFlag;
        positionAwareLift: BitFlag;
        positionAwareTilt: BitFlag;
        tilt: BitFlag;
    };
    id: 258;
    name: "WindowCovering";
    revision: 5;
}>, Type<Of<{
    attributes: {};
    commands: {};
    events: {};
    id: 0;
    name: "Unknown";
    revision: 0;
}>, typeof ClusterBehavior, WindowCoveringInterface>, WindowCoveringInterface>>
id

The behavior ID for ClusterBehaviors is the name of the cluster.

name: string
schema?: Schema
supervisor: RootSupervisor
supports: ((other: Type) => boolean)

Type declaration

    • (other): boolean
    • Does this behavior support functionality of a specific implementation?

      Parameters

      Returns boolean

Methods

  • Release resources. This is the public API for releasing application resources held by behaviors in internal state.

    Returns MaybePromise

  • Execute logic with elevated privileges.

    The provided function executes with privileges escalated to offline mode. This is not commonly necessary.

    Elevated logic effectively ignores ACLs so should be used with care.

    Note that interactions with the behavior will remain elevated until the synchronous completion of this call. You should only elevate privileges for synchronous logic.

    Parameters

    • fn: (() => void)

      the elevated logic

        • (): void
        • Returns void

    Returns void

  • Type Parameters

    • This extends Behavior
    • K extends string | number | symbol

    Parameters

    • this: This
    • attributeName: K

    Returns void

  • Create a generic callback function that has the same properties as a Reactor.

    Like a reactor, the callback's "this" will be bound to an active Behavior instance. Because of this: The reactor MUST be a real JS function - arrow functions will not work!

    Type Parameters

    • A extends any[]
    • R

    Parameters

    Returns ((...args: A) => undefined | R)

      • (...args): undefined | R
      • Parameters

        • Rest...args: A

        Returns undefined | R

  • Move the WindowCovering down or close. For position aware devices the target position is set to 100%. The method calls the handleMovement method to actually move the device.

    Returns void

  • Protected

    Calibrate the device. The default implementation takes no action. Override to implement calibration if necessary.

    Returns MaybePromise

  • Move the WindowCovering to a specific tilt value. The method calls the handleMovement method to actually move the device to the defined position.

    Parameters

    Returns void

  • Move the WindowCovering to a specific lift value. The default implementation calculates the % value for the target position. The method calls the handleMovement method to actually move the device to the defined position.

    Parameters

    Returns void

  • Move the WindowCovering to a specific tilt value. The method calls the handleMovement method to actually move the device to the defined position.

    Parameters

    Returns void

  • Move the WindowCovering to a specific tilt value. The default implementation calculates the % value for the target position. The method calls the handleMovement method to actually move the device to the defined position.

    Parameters

    Returns void

  • Protected

    Perform actual "movement". Override to initiate movement of your device.

    The default implementation logs and immediately updates current position to the target positions. This is probably not desirable for a real device so do not invoke super.handleMovement() from your implementation.

    Parameters

    • type: MovementType

      Which element should move, Lift or Tilt

    • reversed: boolean

      If the motor is configured reversed

    • direction: MovementDirection

      The direction of the movement (Open, Close, DefinedByPosition)

    • OptionaltargetPercent100ths: number

      Optionally the target position in percent 100ths. It depends on the used feature set of the cluster if this is provided or not.

    Returns Promise<void>

  • Protected

    Stop device movement. Sets the target position to the current position and updates operational state. Override to implement the actual stop movement logic.

    If you update the current positions you can include the default logic via "super.handleStopMovement()".

    Returns MaybePromise

  • Behaviors are ephemeral and should not perform initialization in their constructor. They can override this method instead.

    This method may be synchronous or asyncronous. If asynchronous, the behavior will not be available for external use until initialization completes.

    Returns void

  • Install a Reactor.

    Important: The reactor MUST be a real JS function - arrow functions will not work!

    Type Parameters

    Parameters

    Returns void

  • Type Parameters

    • This extends Behavior
    • K extends string | number | symbol

    Parameters

    • this: This
    • attributeName: K

    Returns Exclude<This["state"][K], undefined>

  • Stop any movement of the WindowCovering. The method calls the handleStopMovement method to actually stop the movement of the device.

    Returns MaybePromise

  • Description used in diagnostic messages.

    Returns string

  • Move the WindowCovering up or open. For position aware devices the target position is set to 0%. The method calls the handleMovement method to actually move the device.

    Returns void

  • Type Parameters

    Parameters

    Returns This