ModeSelect Cluster
Cluster ID: 0x0050 |
Endpoint: Typically on Endpoint 1 (application endpoint)
ModeSelect is a general-purpose mode selection Cluster that lets a device declare which operating modes it supports, allowing controllers to query and switch between them. It applies to any device with a "multi-mode" concept: washing machine wash cycles, dryer programs, coffee maker brew methods, and so on.
ModeSelect was the general-purpose mode selection mechanism defined in early Matter revisions.
In newer versions of the Matter specification, it has been superseded by device-type-specific Mode Clusters
(e.g., LaundryWasherMode, DishwasherMode, RefrigeratorAndTemperatureControlledCabinetMode).
New device development should prefer the device-specific Mode Cluster; ModeSelect is retained for legacy device compatibility and generic scenarios.
Commands
ModeSelect Cluster has only one command — simply specify the target mode number to perform the switch.
| ID | Name | Description | Required Feature |
|---|---|---|---|
0x00 |
ChangeToMode | Switch to a specified mode | None |
ChangeToMode — Switch Mode (0x00)
Switches the device to the specified operating mode. The NewMode value must match the Mode field
of a ModeOptionStruct in the SupportedModes list; otherwise the device returns an INVALID_COMMAND error.
On success, the CurrentMode attribute is updated to the NewMode value.
| Parameter | Type | Description |
|---|---|---|
| NewMode | uint8 | Target mode number; must exist in the SupportedModes list |
Usage Scenarios
The user selects the "Quick Wash" mode on the app. The app reads SupportedModes to get the mode list and corresponding numbers,
then sends the ChangeToMode command with NewMode set to that number.
The device switches modes upon receiving the command and CurrentMode updates accordingly.
Attributes
ModeSelect Cluster has 6 attributes. Click an attribute ID in the summary table below to jump to its detailed description.
| ID | Name | Type | Group | Description |
|---|---|---|---|---|
0x0000 |
Description | string | Basic Info | Human-readable description of cluster purpose |
0x0001 |
StandardNamespace | uint16 / null | Basic Info | Mode namespace identifier |
0x0002 |
SupportedModes | list<ModeOptionStruct> | Mode List | All modes supported by the device |
0x0003 |
CurrentMode | uint8 | Mode List | Current operating mode number |
0x0004 |
StartUpMode | uint8 / null | Startup & Interlock | Mode restored on power-up |
0x0005 |
OnMode | uint8 / null | Startup & Interlock | Mode automatically applied when device turns on |
Basic Information (0x0000, 0x0001)
Describes the purpose of this ModeSelect Cluster instance and its mode namespace.
| ID | Name | Type | Description |
|---|---|---|---|
0x0000 |
Description | string | A human-readable string describing the purpose of this ModeSelect Cluster instance. For example, "Dry Mode" or "Wash Program". A single device may have multiple ModeSelect instances (on different Endpoints), each distinguished by its Description |
0x0001 |
StandardNamespace | uint16 / null | Identifies the source of meaning for SemanticTag values. null indicates a manufacturer-specific namespace (MfgSpecific); standard values are defined by the Matter specification. With a namespace, different manufacturers' "Eco" modes can use the same SemanticTag value without per-manufacturer adaptation by controllers |
Mode List (0x0002, 0x0003)
All operating modes supported by the device and the current mode.
| ID | Name | Type | Description |
|---|---|---|---|
0x0002 |
SupportedModes | list<ModeOptionStruct> | All available modes declared by the device, each element being a ModeOptionStruct. The list must contain at least 2 entries; each Mode value and each Label must be unique. List contents typically remain constant throughout the device lifecycle |
0x0003 |
CurrentMode | uint8 | The mode number currently active on the device. This value always points to a ModeOptionStruct.Mode in SupportedModes. Changed via the ChangeToMode command, and can also be set automatically by OnMode or StartUpMode |
The Mode values in SupportedModes are arbitrary uint8 values — they do not need to start at 0 or be consecutive.
Controllers should always read SupportedModes first to obtain the list of valid Mode values before sending ChangeToMode.
Startup & Interlock (0x0004, 0x0005)
Controls the mode behavior when the device powers up and turns on.
| ID | Name | Type | Description |
|---|---|---|---|
0x0004 |
StartUpMode | uint8 / null | The mode the device automatically switches to on power-up (hardware restart). The value must exist in SupportedModes. null means the device retains the mode it was in before power loss. Nullable and optional |
0x0005 |
OnMode | uint8 / null | The mode the device automatically switches to when transitioning from Off to On (interlinked with the OnOff Cluster). The value must exist in SupportedModes. null means turning on does not change the mode. Requires the DEPONOFF feature |
StartUpMode takes effect on hardware power-up (similar to OnOff's StartUpOnOff),
while OnMode takes effect at the software level when turning on (triggered when OnOff transitions from Off to On).
If OnMode is non-null, it takes priority over StartUpMode —
after power-up, StartUpMode is applied first, then OnOff triggers OnMode, and the final mode is determined by OnMode.
Struct Definitions
ModeSelect Cluster uses two structs to describe mode information.
ModeOptionStruct
Describes an available mode option, including its display label, mode number, and semantic tag list.
| Field | Type | Description |
|---|---|---|
| Label | string | Human-readable mode name, such as "Standard", "Eco", or "Quick". Must be unique within the same SupportedModes list |
| Mode | uint8 | Mode number, unique within the same SupportedModes list. This value is used as the NewMode parameter in the ChangeToMode command |
| SemanticTags | list<SemanticTagStruct> | List of semantic tags that let controllers understand the mode meaning without parsing Label text. May be an empty list |
SemanticTagStruct
Attaches machine-readable semantic information to a mode. Through standardized tag values, "Eco" and "Quick" modes from different manufacturers can be identified uniformly.
| Field | Type | Description |
|---|---|---|
| MfgCode | vendor-id(uint16) | Manufacturer identifier. 0x0000 indicates a Matter standard-defined tag value; a non-zero value indicates a manufacturer-specific tag value. Used together with StandardNamespace |
| Value | uint16 | Tag value; its specific meaning depends on MfgCode and StandardNamespace. For example, in the standard namespace, specific values may represent semantics like "Eco" or "Quick" |
With only a Label (e.g., "ECO"), a controller would need natural language processing to understand the mode meaning.
With SemanticTag, the controller can determine the meaning directly by numeric value — for example, a voice assistant can identify which mode is "Eco"
without parsing label text in various languages.
Feature Bitmap
ModeSelect Cluster declares optional device capabilities via FeatureMap (0xFFFC):
If the device also has an OnOff Cluster (i.e., it can be turned on/off) and you want a specific mode applied automatically each time the device turns on (e.g., an air purifier defaulting to "Auto" mode on power-on), then DEPONOFF should be enabled. For pure mode selection without on/off interlock, this feature is not needed.
Example Data
Read result from a dryer's ModeSelect Cluster — currently running in "Eco" mode:
{
// --- Basic Information ---
"0x0000": "Dry Mode", // Description = "Dry Mode" (cluster purpose description)
"0x0001": 0, // StandardNamespace = 0 (MfgSpecific namespace)
"0x0003": 1, // CurrentMode = 1 (currently running in "Eco" mode)
// --- Supported Modes List ---
"0x0002": [ // SupportedModes
{
"Label": "Standard", // Mode 0: Standard dry
"Mode": 0,
"SemanticTags": []
},
{
"Label": "Eco", // Mode 1: Eco dry
"Mode": 1,
"SemanticTags": [
{ "MfgCode": 0, "Value": 16384 }
]
},
{
"Label": "Quick", // Mode 2: Quick dry
"Mode": 2,
"SemanticTags": []
}
],
// --- Startup & Interlock ---
"0x0004": null, // StartUpMode = null (restore pre-power-loss mode)
"0x0005": 0 // OnMode = 0 (switch to "Standard" mode on power-on)
}
When displaying a mode selection UI, the controller should first read SupportedModes (0x0002) to get the full mode list,
then read CurrentMode (0x0003) to highlight the current mode.
There is no need to read CurrentMode before switching — just send ChangeToMode directly; the device validates the NewMode value.
Common Scenarios
Scenario 1: App Switches Device Operating Mode
- Read
SupportedModes (0x0002)to get the mode list (Label + Mode number) - Display the mode list in the UI; read
CurrentMode (0x0003)to highlight the current mode - When the user taps the target mode, send
ChangeToMode (0x00)withNewModeset to that mode's Mode value - Subscribe to
CurrentModeattribute changes; update the UI once the switch is confirmed
Scenario 2: Set Power-Up Default Mode
- Read
SupportedModes (0x0002)and let the user choose the mode to restore on power-up - Write the
StartUpMode (0x0004)value:- A specific mode number — always switch to that mode on power-up (e.g., an AC unit always starts in "Cool" mode)
null— restore the pre-power-loss mode (recommended; the user continues with whatever they last selected)
- Note: if the device also has
OnModeset, OnMode will override the StartUpMode effect after power-on
Scenario 3: Auto-Switch Mode on Power-On (OnOff Interlock)
- Verify that the device's
FeatureMap (0xFFFC)includesDEPONOFF(Bit 0 = 1) - Write the
OnMode (0x0005)value — e.g., an air purifier automatically enters "Auto" mode on power-on - When the device transitions from Off to On via the OnOff Cluster,
CurrentModeautomatically changes to the OnMode value - Setting
OnModetonulldisables the interlock — the device keeps the previous mode after power-on