WindowCovering Cluster
Cluster ID: 0x0102 |
Endpoint: Typically on Endpoint 1 (application endpoint)
WindowCovering is the core Cluster in Matter for controlling window covering devices. It applies to motorized roller shades, venetian blinds, curtain tracks, awnings, projector screens, and all devices requiring lift or tilt control. It defines motion control commands, position feedback attributes, and a complete description of device types and safety states.
WindowCovering uses percent100ths (hundredths of a percent) to represent positions, ranging from 0–10000.
0 represents fully open (covering retracted), 10000 represents fully closed (covering extended).
This may be counterintuitive — the larger the value, the more coverage. Percentage attributes (such as CurrentPositionLiftPercentage) range from 0–100 with the same meaning.
Commands
The WindowCovering Cluster has 7 commands. The basic trio (UpOrOpen / DownOrClose / StopMotion) is supported by all window covering devices. The four precise positioning commands require the device to have the corresponding Feature combinations enabled. Click a command ID in the table below to jump to its detailed description.
| ID | Name | Description | Required Feature |
|---|---|---|---|
0x00 |
UpOrOpen | Raise / open the covering | None |
0x01 |
DownOrClose | Lower / close the covering | None |
0x02 |
StopMotion | Stop all motion immediately | None |
0x04 |
GoToLiftValue | Move lift to a specified absolute value | LF + AB |
0x05 |
GoToLiftPercentage | Move lift to a specified percentage | LF + PA |
0x07 |
GoToTiltValue | Move tilt to a specified absolute value | TL + AB |
0x08 |
GoToTiltPercentage | Move tilt to a specified percentage | TL + PA |
UpOrOpen — Raise / Open (0x00)
Moves the covering toward the fully open position. For roller shades this means retracting upward; for curtain tracks, pulling apart to both sides. Requires no parameters. The device begins moving immediately upon receipt, until it reaches the fully open position or a StopMotion command is received.
Usage Scenarios
Called when the user taps the "Open covering" button in the app, when a voice assistant executes "open the curtains", or when a good-morning automation scene is triggered.
DownOrClose — Lower / Close (0x01)
Moves the covering toward the fully closed position. For roller shades this means extending downward; for curtain tracks, drawing together to the center. Requires no parameters. The device moves to the fully closed position immediately upon receipt.
Usage Scenarios
Called when the user taps the "Close covering" button, when a good-night scene automatically closes coverings, or when a light sensor detects bright light.
StopMotion — Stop Motion (0x02)
Immediately stops all axis motion (both lift and tilt). Requires no parameters.
After stopping, all motion bits in OperationalStatus are cleared to zero.
Usage Scenarios
While the covering is in motion, the user can tap the control button again to send StopMotion, stopping the covering at its current position. Also used for safety protection — emergency stop when an obstacle or anomaly is detected.
GoToLiftValue — Lift to Absolute Value (0x04)
Moves the covering lift to a specified absolute position value. This value corresponds to the device's internal physical units (such as motor steps),
with the range determined by InstalledOpenLimitLift and InstalledClosedLimitLift.
| Parameter | Type | Description |
|---|---|---|
| LiftValue | uint16 | Target lift position absolute value |
Usage Scenarios
Used when precise control to a physical scale position is needed. For most scenarios, GoToLiftPercentage is recommended (percentages are more intuitive).
GoToLiftPercentage — Lift to Percentage (0x05)
Moves the covering lift to a specified percentage position. This is the most commonly used precise control command.
The parameter uses percent100ths (hundredths of a percent, range 0–10000): 0 = fully open, 10000 = fully closed.
| Parameter | Type | Description |
|---|---|---|
| LiftPercent100thsValue | percent100ths | Target lift position. 0 = fully open, 5000 = half open, 10000 = fully closed |
Usage Scenarios & Parameters
When the slider control in the app is dragged to 30%, send GoToLiftPercentage (LiftPercent100thsValue = 3000).
A voice command like "open halfway" can send 5000. It is recommended to display the slider as "openness" in the app (0% = fully closed, 100% = fully open),
and convert when sending: 10000 - userValue * 100.
GoToTiltValue — Tilt to Absolute Value (0x07)
Tilts the blind slats to a specified absolute position value. Only supported by blind-type devices with tilt capability.
| Parameter | Type | Description |
|---|---|---|
| TiltValue | uint16 | Target tilt position absolute value |
GoToTiltPercentage — Tilt to Percentage (0x08)
Tilts the blind slats to a specified percentage position. The logic is consistent with lift percentage:
0 = slats fully open (parallel to the window), 10000 = slats fully closed (perpendicular to the window).
| Parameter | Type | Description |
|---|---|---|
| TiltPercent100thsValue | percent100ths | Target tilt position. 0 = slats fully open, 10000 = slats fully closed |
Usage Scenarios
Adjusting the slat angle on venetian blinds. For example, during afternoon direct sunlight, tilting slats to 7000 (70% closed) provides shade while maintaining ventilation.
Attributes
WindowCovering Cluster attributes are organized into four functional groups. Click an attribute ID in the summary table below to jump to its detailed description.
| ID | Name | Type | Group | Description |
|---|---|---|---|---|
0x0000 |
Type | enum8 | Type & Configuration | Covering type |
0x000D |
EndProductType | enum8 | Type & Configuration | End product type |
0x0007 |
ConfigStatus | bitmap8 | Type & Configuration | Configuration and operational status flags |
0x0017 |
Mode | bitmap8 | Type & Configuration | Operating mode flags |
0x000B |
TargetPositionLiftPercent100ths | percent100ths / null | Lift Position | Target lift position |
0x000E |
CurrentPositionLiftPercent100ths | percent100ths / null | Lift Position | Current lift position (high precision) |
0x0008 |
CurrentPositionLiftPercentage | uint8 / null | Lift Position | Current lift position (percentage) |
0x0003 |
CurrentPositionLift | uint16 / null | Lift Position | Current lift absolute value |
0x0001 |
PhysicalClosedLimitLift | uint16 | Lift Position | Physical closed limit value |
0x0010 |
InstalledOpenLimitLift | uint16 | Lift Position | Installed open limit |
0x0011 |
InstalledClosedLimitLift | uint16 | Lift Position | Installed closed limit |
0x000C |
TargetPositionTiltPercent100ths | percent100ths / null | Tilt Position | Target tilt position |
0x000F |
CurrentPositionTiltPercent100ths | percent100ths / null | Tilt Position | Current tilt position (high precision) |
0x0009 |
CurrentPositionTiltPercentage | uint8 / null | Tilt Position | Current tilt position (percentage) |
0x0004 |
CurrentPositionTilt | uint16 / null | Tilt Position | Current tilt absolute value |
0x0002 |
PhysicalClosedLimitTilt | uint16 | Tilt Position | Physical closed limit value |
0x0012 |
InstalledOpenLimitTilt | uint16 | Tilt Position | Installed open limit |
0x0013 |
InstalledClosedLimitTilt | uint16 | Tilt Position | Installed closed limit |
0x000A |
OperationalStatus | bitmap8 | Operational Status | Motion direction per axis |
0x001A |
SafetyStatus | bitmap16 | Operational Status | Safety anomaly flags |
Type & Configuration (0x0000, 0x000D, 0x0007, 0x0017)
Describes the physical type, product classification, and current configuration and operating mode of the window covering device.
| ID | Name | Type | Description |
|---|---|---|---|
0x0000 |
Type Covering Type |
enum8 | Mechanical type of the covering (see enum below), determines whether the device supports lift, tilt, or both |
0x000D |
EndProductType End Product Type |
enum8 | More granular product classification (see enum below), used by the app to display appropriate icons and controls |
0x0007 |
ConfigStatus Config Status |
bitmap8 | Device configuration and capability flags (see bitmap below) |
0x0017 |
Mode Operating Mode |
bitmap8 | Device operating mode flags (see bitmap below) |
Type Enum Values
EndProductType Enum Values
Type determines the device's mechanical capabilities (lift, tilt, or both), which affects available features and commands.
EndProductType is a more granular product classification, primarily used by the app to select appropriate icons and control interfaces.
Both are fixed at factory and cannot be modified.
ConfigStatus Bitmap
Mode Bitmap
Lift Position (0x0001–0x0011)
Describes the current position, target position, and travel limits of the covering's lift axis. All lift attributes require the device to support the LF (Lift) feature.
CurrentPositionLiftPercent100ths ranges from 0–10000 (0.01% precision),
while CurrentPositionLiftPercentage ranges from 0–100 (1% precision).
Both represent the same position; percent100ths has higher precision and should be preferred in development.
| ID | Name | Type | Description |
|---|---|---|---|
0x000B |
TargetPositionLiftPercent100ths Target Lift Position |
percent100ths / null | The target lift position the covering is moving toward. During motion this differs from the current position; they match once stopped. null means unknown.Requires LF + PA |
0x000E |
CurrentPositionLiftPercent100ths Current Lift Position (High Precision) |
percent100ths / null | Current lift position, 0 = fully open, 10000 = fully closed. Updates in real time during motion. null means position unknown (e.g., just powered on and not yet calibrated).Requires LF + PA |
0x0008 |
CurrentPositionLiftPercentage Current Lift Percentage |
uint8 / null | Coarse percentage of the current lift position (0–100). A lower-precision version of Percent100ths.Requires LF + PA |
0x0003 |
CurrentPositionLift Current Lift Absolute Value |
uint16 / null | Absolute value of the current lift position (device-internal units).Requires LF + AB |
0x0001 |
PhysicalClosedLimitLift Physical Closed Limit |
uint16 | Absolute value upper limit of the lift axis physical closed position.Requires LF + AB |
0x0010 |
InstalledOpenLimitLift Installed Open Limit |
uint16 | Absolute value of the actual fully open position reachable after installation. Requires LF + PA |
0x0011 |
InstalledClosedLimitLift Installed Closed Limit |
uint16 | Absolute value of the actual fully closed position reachable after installation. Requires LF + PA |
Tilt Position (0x0002–0x0013)
Describes the current position, target position, and travel limits of the covering's tilt axis (blind slat angle). All tilt attributes require the device to support the TL (Tilt) feature.
| ID | Name | Type | Description |
|---|---|---|---|
0x000C |
TargetPositionTiltPercent100ths Target Tilt Position |
percent100ths / null | The target tilt position the slats are moving toward. null means unknown.Requires TL + PA |
0x000F |
CurrentPositionTiltPercent100ths Current Tilt Position (High Precision) |
percent100ths / null | Current slat tilt position, 0 = slats fully open, 10000 = slats fully closed.Requires TL + PA |
0x0009 |
CurrentPositionTiltPercentage Current Tilt Percentage |
uint8 / null | Coarse percentage of the current slat tilt position (0–100).Requires TL + PA |
0x0004 |
CurrentPositionTilt Current Tilt Absolute Value |
uint16 / null | Absolute value of the current slat tilt position.Requires TL + AB |
0x0002 |
PhysicalClosedLimitTilt Physical Closed Limit |
uint16 | Absolute value upper limit of the tilt axis physical closed position.Requires TL + AB |
0x0012 |
InstalledOpenLimitTilt Installed Open Limit |
uint16 | Absolute value of the actual slat fully open position reachable after installation.Requires TL + PA |
0x0013 |
InstalledClosedLimitTilt Installed Closed Limit |
uint16 | Absolute value of the actual slat fully closed position reachable after installation.Requires TL + PA |
Operational Status(0x000A, 0x001A)
Describes the current motion direction and safety status of the covering.
| ID | Name | Type | Description |
|---|---|---|---|
0x000A |
OperationalStatus Operational Status |
bitmap8 | Current motion direction of each axis (see bitmap below). All zeros means stopped |
0x001A |
SafetyStatus Safety Status |
bitmap16 | Safety anomaly flags (see bitmap below). Any bit set to 1 indicates an anomaly |
OperationalStatus Bitmap
OperationalStatus uses 3 groups of 2-bit fields to indicate the motion direction of three axes:
00 = stopped, 01 = opening (toward 0), 10 = closing (toward 10000).
SafetyStatus Bitmap
Feature Bitmap
The WindowCovering Cluster declares supported capabilities via FeatureMap (0xFFFC). The combination of features determines which commands and attributes are available:
Motorized roller shade: typically LF + PA (supports lift and percentage positioning), FeatureMap = 0x05.
Venetian blind: typically LF + TL + PA (lift + tilt + position aware), FeatureMap = 0x07.
Tilt-only blind: typically TL + PA (tilt only), FeatureMap = 0x06.
After reading the FeatureMap, the app should decide whether to display lift controls, tilt controls, or both.
Example Data
Read result from a WindowCovering Cluster of a motorized roller shade with lift + position awareness at the 30% position (near fully open):
{
// --- Type & Configuration ---
"0x0000": 0, // Type = Rollershade (roller shade)
"0x000D": 0, // EndProductType = RollerShade
"0x0007": 0x09, // ConfigStatus = Operational + LiftPositionAware
"0x0017": 0x00, // Mode = normal operation (all bits 0)
// --- Lift Position ---
"0x000E": 3000, // CurrentPositionLiftPercent100ths = 30.00%
"0x0008": 30, // CurrentPositionLiftPercentage = 30%
"0x000B": 3000, // TargetPositionLiftPercent100ths = 30.00% (target matches current, stopped)
"0x0010": 0, // InstalledOpenLimitLift = 0 (fully open position)
"0x0011": 10000, // InstalledClosedLimitLift = 10000 (fully closed position)
// --- Operational Status ---
"0x000A": 0x00, // OperationalStatus = all axes stopped
"0x001A": 0x0000 // SafetyStatus = no anomalies
}
For simple coverings that only support UpOrOpen / DownOrClose (no position awareness), percentage attributes may not exist.
Check FeatureMap (0xFFFC) first to determine supported capabilities, then decide which attributes to read and which controls to display.
Devices that do not support tilt will not report tilt-related attributes.
Common Scenarios
Scenario 1: Basic Open/Close Control
- Send
UpOrOpen (0x00)to open the covering, orDownOrClose (0x01)to close it - Subscribe to
OperationalStatus (0x000A)to monitor motion status - During motion, the user can send
StopMotion (0x02)to stop the covering at the current position - Subscribe to
CurrentPositionLiftPercent100ths (0x000E)to update the position display in the app in real time
Scenario 2: Precise Position Control via Slider
- Read
FeatureMap (0xFFFC)to confirm the device supports LF + PA features - Display a 0%–100% slider in the app, where 0% = fully closed and 100% = fully open
- The user drags the slider to 70% (meaning 70% open), then send
GoToLiftPercentage (0x05)with LiftPercent100thsValue =3000(since 0 = fully open, 100% - 70% = 30% = 3000) - Subscribe to
CurrentPositionLiftPercent100thsandTargetPositionLiftPercent100ths; the former tracks actual position, the latter can be used to display a target indicator
Scenario 3: Blind Lift + Slat Tilt
- Read
FeatureMapto confirm the device supports both LF + TL (lift and tilt) - Display two controls in the app: a lift slider and a tilt slider
- Use
GoToLiftPercentage (0x05)to control the covering height - Use
GoToTiltPercentage (0x08)to adjust the slat angle - User scenario: "Lower the blind to half height, tilt slats 45 degrees to let light in while blocking the view" — send 5000 for lift and 5000 for tilt
Scenario 4: Automation — Sunrise/Sunset Linkage
- At sunrise in the morning, an automation rule triggers
UpOrOpen (0x00)to open all coverings - When afternoon sun is strong, trigger
GoToLiftPercentage (0x05)to close to 70% (LiftPercent100thsValue = 7000) - After sunset in the evening, trigger
DownOrClose (0x01)to fully close - Combined with a light sensor (IlluminanceMeasurement Cluster), smarter adaptive lighting control can be achieved
Scenario 5: Error Handling
- Subscribe to
SafetyStatus (0x001A)to monitor safety anomalies - If
ObstacleDetected(Bit 5) is 1, it indicates an obstruction in the covering's path; the app should prompt the user to check - If
MotorJammed(Bit 8) is 1, the motor is jammed and may need service - If
ThermalProtection(Bit 4) is 1, the motor is in thermal protection mode and will automatically recover after cooling - Check CalibrationMode (Bit 1) in
Mode (0x0017); if it is 1, the device is calibrating and will not accept position commands