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.

Legacy Cluster

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.

ParameterTypeDescription
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
Mode Values Are Not Necessarily Consecutive

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
Relationship Between StartUpMode and OnMode

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"
Purpose of SemanticTag

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

Bit 0
DEPONOFF (Depends on OnOff) Depends on the OnOff Cluster — when enabled, supports the OnMode attribute so the device automatically switches to a specified mode when turning from Off to On
When to Enable DEPONOFF

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

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

  1. Read SupportedModes (0x0002) to get the mode list (Label + Mode number)
  2. Display the mode list in the UI; read CurrentMode (0x0003) to highlight the current mode
  3. When the user taps the target mode, send ChangeToMode (0x00) with NewMode set to that mode's Mode value
  4. Subscribe to CurrentMode attribute changes; update the UI once the switch is confirmed

Scenario 2: Set Power-Up Default Mode

  1. Read SupportedModes (0x0002) and let the user choose the mode to restore on power-up
  2. 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)
  3. Note: if the device also has OnMode set, OnMode will override the StartUpMode effect after power-on

Scenario 3: Auto-Switch Mode on Power-On (OnOff Interlock)

  1. Verify that the device's FeatureMap (0xFFFC) includes DEPONOFF (Bit 0 = 1)
  2. Write the OnMode (0x0005) value — e.g., an air purifier automatically enters "Auto" mode on power-on
  3. When the device transitions from Off to On via the OnOff Cluster, CurrentMode automatically changes to the OnMode value
  4. Setting OnMode to null disables the interlock — the device keeps the previous mode after power-on