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.

Position Value Convention: 0 = Fully Open, 10000 = Fully Closed

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.

ParameterTypeDescription
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.

ParameterTypeDescription
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.

ParameterTypeDescription
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).

ParameterTypeDescription
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.

IDNameTypeDescription
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

0
Rollershade Roller shade
1
Rollershade - 2 Motor Dual-motor roller shade
2
Rollershade - Exterior Exterior roller shade
3
Rollershade - Exterior - 2 Motor Exterior dual-motor roller shade
4
Drapery Drapery (side-opening curtain)
5
Awning Awning
6
Shutter Shutter / roller shutter
7
TiltBlindTiltOnly Tilt blind (tilt only)
8
TiltBlindLiftAndTilt Tilt blind (lift + tilt)
9
ProjectorScreen Projector screen
255
Unknown Unknown type

EndProductType Enum Values

0
RollerShade Roller shade
1
RomanShade Roman shade
2
BalloonShade Balloon shade
3
WovenWood Woven wood shade
4
PleatedShade Pleated shade / cellular shade
5
RollerShutter Roller shutter
6
ExteriorVenetianBlind Exterior venetian blind
7
LateralLeftCurtain Lateral left curtain
8
LateralRightCurtain Lateral right curtain
9
CentralCurtain Central (split-draw) curtain
10
RollerCurtain Roller curtain
11
ExteriorVerticalScreen Exterior vertical screen
12
AwningTerracePatio Terrace/patio awning
13
AwningVerticalScreen Vertical awning screen
14
TiltOnlyInteriorBlind Interior blind (tilt only)
15
InteriorBlind Interior blind
16
VerticalBlindStripCurtain Vertical blind / strip curtain
17
InteriorVenetianBlind Interior venetian blind
18
ExteriorVenetianBlind Exterior venetian blind
19
LateralLeftVerticalBlind Lateral left vertical blind
20
LateralRightVerticalBlind Lateral right vertical blind
21
CentralVerticalBlind Central (split-draw) vertical blind
22
RollerShutterTerrace Terrace roller shutter
23
ProjectorScreen Projector screen
255
Unknown Unknown product type
Type vs EndProductType

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

Bit 0
Operational Device operational (1 = ready, 0 = not ready)
Bit 1
OnlineReserved Online (reserved bit, currently always 1)
Bit 2
LiftMovementReversed Lift movement reversed (1 = motor runs in reverse)
Bit 3
LiftPositionAware Lift position aware (1 = can report precise position)
Bit 4
TiltPositionAware Tilt position aware (1 = can report precise tilt angle)
Bit 5
LiftEncoderControlled Lift encoder controlled (1 = uses encoder for position feedback)
Bit 6
TiltEncoderControlled Tilt encoder controlled (1 = uses encoder for angle feedback)

Mode Bitmap

Bit 0
MotorDirectionReversed Motor direction reversed
Bit 1
CalibrationMode Calibration mode (device is calibrating travel limits)
Bit 2
MaintenanceMode Maintenance mode (device has suspended normal operation)
Bit 3
LEDFeedback LED feedback (1 = LED indicates during motion)

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.

Difference Between percent100ths and percentage

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.

IDNameTypeDescription
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.

IDNameTypeDescription
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.

IDNameTypeDescription
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

Encoding

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).

Bit 0–1
Global Global motion direction (combined lift and tilt overall status)
Bit 2–3
Lift Lift axis motion direction
Bit 4–5
Tilt Tilt axis motion direction

SafetyStatus Bitmap

Bit 0
RemoteLockout Remote lockout (device rejects remote operations)
Bit 1
TamperDetection Tamper detection (device detected abnormal interference)
Bit 2
FailedCommunication Communication failure (failed to communicate with motor controller)
Bit 3
PositionFailure Position failure (position sensor malfunction)
Bit 4
ThermalProtection Thermal protection (motor overheated, operation suspended)
Bit 5
ObstacleDetected Obstacle detected (obstruction in motion path)
Bit 6
Power Power anomaly (insufficient or interrupted power supply)
Bit 7
StopInput External stop signal (hardware stop input received)
Bit 8
MotorJammed Motor jammed
Bit 9
HardwareFailure Hardware failure
Bit 10
ManualOperation Manual operation in progress (user is manually moving the covering)

Feature Bitmap

The WindowCovering Cluster declares supported capabilities via FeatureMap (0xFFFC). The combination of features determines which commands and attributes are available:

Bit 0
LF(Lift) Supports lift movement — the covering can move up and down
Bit 1
TL(Tilt) Supports tilt adjustment — blind slats can rotate
Bit 2
PA(Position Aware Lift) Position aware — can report and move to precise percentage positions
Bit 3
AB(Absolute Position) Absolute position — supports positioning in device-internal units
Feature Combinations and Device Types

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
}
Developer Tip

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
  1. Send UpOrOpen (0x00) to open the covering, or DownOrClose (0x01) to close it
  2. Subscribe to OperationalStatus (0x000A) to monitor motion status
  3. During motion, the user can send StopMotion (0x02) to stop the covering at the current position
  4. Subscribe to CurrentPositionLiftPercent100ths (0x000E) to update the position display in the app in real time
Scenario 2: Precise Position Control via Slider
  1. Read FeatureMap (0xFFFC) to confirm the device supports LF + PA features
  2. Display a 0%–100% slider in the app, where 0% = fully closed and 100% = fully open
  3. 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)
  4. Subscribe to CurrentPositionLiftPercent100ths and TargetPositionLiftPercent100ths; the former tracks actual position, the latter can be used to display a target indicator
Scenario 3: Blind Lift + Slat Tilt
  1. Read FeatureMap to confirm the device supports both LF + TL (lift and tilt)
  2. Display two controls in the app: a lift slider and a tilt slider
  3. Use GoToLiftPercentage (0x05) to control the covering height
  4. Use GoToTiltPercentage (0x08) to adjust the slat angle
  5. 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
  1. At sunrise in the morning, an automation rule triggers UpOrOpen (0x00) to open all coverings
  2. When afternoon sun is strong, trigger GoToLiftPercentage (0x05) to close to 70% (LiftPercent100thsValue = 7000)
  3. After sunset in the evening, trigger DownOrClose (0x01) to fully close
  4. Combined with a light sensor (IlluminanceMeasurement Cluster), smarter adaptive lighting control can be achieved
Scenario 5: Error Handling
  1. Subscribe to SafetyStatus (0x001A) to monitor safety anomalies
  2. If ObstacleDetected (Bit 5) is 1, it indicates an obstruction in the covering's path; the app should prompt the user to check
  3. If MotorJammed (Bit 8) is 1, the motor is jammed and may need service
  4. If ThermalProtection (Bit 4) is 1, the motor is in thermal protection mode and will automatically recover after cooling
  5. Check CalibrationMode (Bit 1) in Mode (0x0017); if it is 1, the device is calibrating and will not accept position commands