Thermostat Cluster
Cluster ID: 0x0201 |
Endpoint: Typically on Endpoint 1 (functional endpoint)
Thermostat is the core Cluster for Matter HVAC devices, defining all capabilities including temperature reading, cooling/heating setpoint management, system mode switching, and weekly schedule programming. All thermostat device development revolves around this Cluster.
All temperature attributes in the Thermostat Cluster use 0.01°C units. For example, LocalTemperature = 2150 means an actual temperature of 21.50°C.
Always perform unit conversion when reading/writing temperature attributes, otherwise setpoints will be off by a factor of 100.
Thermostat capabilities are determined by the Feature Map. Bit 0 = HEAT, Bit 1 = COOL, Bit 5 = AUTO, Bit 6 = LTNE (Local Temperature Not Exposed).
Many attributes are Feature-gated — for example, only devices supporting COOL have OccupiedCoolingSetpoint. Reading an unsupported attribute returns UNSUPPORTED_ATTRIBUTE.
Commands
Thermostat commands are primarily used to adjust setpoints and manage weekly schedules. Unlike door locks, thermostat commands do not require Timed Interaction and can be sent directly. Click a command ID in the table below to jump to its detailed description.
| ID | Name | Description | Feature Required |
|---|---|---|---|
0x00 |
SetpointRaiseLower | Raise or lower temperature setpoint | None |
0x01 |
SetWeeklySchedule | Set weekly temperature schedule | SCH |
0x02 |
GetWeeklySchedule | Query configured weekly schedule | SCH |
0x03 |
ClearWeeklySchedule | Clear all weekly schedules | SCH |
When the value exceeds the limit range, SetpointRaiseLower silently clamps to the nearest valid value instead of returning an error.
This differs from direct attribute writes — writing an out-of-range value to OccupiedHeatingSetpoint returns CONSTRAINT_ERROR.
This asymmetric behavior is intentional in the Matter specification.
SetpointRaiseLower — Adjust Setpoint (0x00)
Raise or lower temperature setpoints. This is the most commonly used command for thermostat devices — called when the user taps the "Temperature +" or "Temperature -" buttons in the App.
Depending on the Mode parameter, you can adjust only the heating setpoint, only the cooling setpoint, or both simultaneously.
| Parameter | Type | Required | Description |
|---|---|---|---|
| Mode | enum8 | Yes | Adjustment target: 0 = Heat, 1 = Cool, 2 = Both |
| Amount | int8 | Yes | Adjustment amount, in 0.1°C units. Positive values raise, negative values lower. For example, 10 means raise by 1.0°C |
Usage Scenarios & Parameters
When the user taps "Temperature +1°C" in the App, send SetpointRaiseLower(Mode=2, Amount=10) to raise both heating and cooling setpoints by 1°C.
If the current SystemMode is Heat, you can send just Mode=0.
Values exceeding MinHeatSetpointLimit / MaxCoolSetpointLimit are automatically clamped without returning an error.
SetWeeklySchedule — Set Weekly Schedule (0x01)
Set temperature transition schedules for specified days of the week. Multiple days and time points can be set in a single call. Requires device support for the SCH (Schedule) Feature.
| Parameter | Type | Description |
|---|---|---|
| NumberOfTransitionsForSequence | uint8 | Number of temperature transition points in this request |
| DayOfWeekForSequence | bitmap8 | Applicable days of the week (bitmap: Bit 0 = Sunday, Bit 1 = Monday ... Bit 6 = Saturday) |
| ModeForSequence | bitmap8 | Mode bitmap: Bit 0 = includes heating setpoint, Bit 1 = includes cooling setpoint |
| Transitions | list | List of transition points. Each contains TransitionTime (minutes since midnight 0:00) and corresponding setpoint temperature |
Usage Scenarios & Parameters
Set a schedule for "weekday mornings at 7:00 raise to 22°C, evenings at 22:00 lower to 18°C".
DayOfWeekForSequence = 0b0111110 (Monday through Friday), with two transition points.
Schedule capacity can be queried via NumberOfWeeklyTransitions (0x21) and NumberOfDailyTransitions (0x22).
GetWeeklySchedule — Query Weekly Schedule (0x02)
Query configured weekly schedules. Specify the desired days and mode; the device returns the corresponding transition table.
| Parameter | Type | Description |
|---|---|---|
| DaysToReturn | bitmap8 | Days to query (bitmap format same as SetWeeklySchedule) |
| ModeToReturn | bitmap8 | Mode to query (Bit 0 = Heating, Bit 1 = Cooling) |
ClearWeeklySchedule — Clear Weekly Schedule (0x03)
Clear all weekly schedules on the device. No parameters; after execution, the device returns to a no-schedule state.
Attributes
Thermostat Cluster attributes are organized into five functional groups. Click an attribute ID in the summary table below to jump to its detailed description.
| ID | Name | Type | Group | Description |
|---|---|---|---|---|
0x00 |
LocalTemperature | int16s / null | Temperature Info | Locally measured temperature |
0x01 |
OutdoorTemperature | int16s / null | Temperature Info | Outdoor temperature |
0x02 |
Occupancy | bitmap8 | Temperature Info | Occupancy status |
0x03 |
AbsMinHeatSetpointLimit | int16s | Temperature Info | Absolute minimum heating setpoint |
0x04 |
AbsMaxHeatSetpointLimit | int16s | Temperature Info | Absolute maximum heating setpoint |
0x05 |
AbsMinCoolSetpointLimit | int16s | Temperature Info | Absolute minimum cooling setpoint |
0x06 |
AbsMaxCoolSetpointLimit | int16s | Temperature Info | Absolute maximum cooling setpoint |
0x07 |
PICoolingDemand | uint8 | Temperature Info | Cooling demand percentage (0-100) |
0x08 |
PIHeatingDemand | uint8 | Temperature Info | Heating demand percentage (0-100) |
0x09 |
HVACSystemTypeConfiguration | bitmap8 | Temperature Info | HVAC system type configuration |
0x10 |
LocalTemperatureCalibration | int8 | Setpoints | Local temperature calibration offset |
0x11 |
OccupiedCoolingSetpoint | int16s | Setpoint | Occupied cooling setpoint temperature |
0x12 |
OccupiedHeatingSetpoint | int16s | Setpoint | Occupied heating setpoint temperature |
0x13 |
UnoccupiedCoolingSetpoint | int16s | Setpoint | Unoccupied cooling setpoint temperature |
0x14 |
UnoccupiedHeatingSetpoint | int16s | Setpoint | Unoccupied heating setpoint temperature |
0x15 |
MinHeatSetpointLimit | int16s | Setpoint | User-adjustable minimum heating setpoint |
0x16 |
MaxHeatSetpointLimit | int16s | Setpoint | User-adjustable maximum heating setpoint |
0x17 |
MinCoolSetpointLimit | int16s | Setpoint | User-adjustable minimum cooling setpoint |
0x18 |
MaxCoolSetpointLimit | int16s | Setpoint | User-adjustable maximum cooling setpoint |
0x19 |
MinSetpointDeadBand | int8 | Setpoint | Minimum gap between heating and cooling setpoints |
0x1A |
RemoteSensing | bitmap8 | Mode & Status | Remote sensor usage flags |
0x1B |
ControlSequenceOfOperation | enum8 | Mode & Status | Control sequence of operation |
0x1C |
SystemMode | enum8 | Mode & Status | System operating mode |
0x1E |
ThermostatRunningMode | enum8 | Mode & Status | Actual running mode |
0x20 |
StartOfWeek | enum8 | Mode & Status | Start of week |
0x21 |
NumberOfWeeklyTransitions | uint8 | Mode & Status | Maximum weekly transition points |
0x22 |
NumberOfDailyTransitions | uint8 | Mode & Status | Maximum daily transition points |
0x23 |
TemperatureSetpointHold | enum8 | Mode & Status | Setpoint hold toggle |
0x24 |
TemperatureSetpointHoldDuration | uint16 / null | Mode & Status | Setpoint hold duration (minutes) |
0x25 |
ThermostatProgrammingOperationMode | bitmap8 | Mode & Status | Programming operation mode |
0x29 |
ThermostatRunningState | bitmap16 | Mode & Status | Current running state bitmap |
0x30 |
SetpointChangeSource | enum8 | Change Tracking | Source of the last setpoint change |
0x31 |
SetpointChangeAmount | int16s / null | Change Tracking | Amount of the last setpoint change |
0x32 |
SetpointChangeSourceTimestamp | epoch-s | Change Tracking | Timestamp of the last setpoint change |
0x34 |
OccupiedSetback | uint8 / null | Change Tracking | Occupied energy-saving setback temperature |
0x35 |
OccupiedSetbackMin | uint8 / null | Change Tracking | Occupied setback minimum |
0x36 |
OccupiedSetbackMax | uint8 / null | Change Tracking | Occupied setback maximum |
0x37 |
UnoccupiedSetback | uint8 / null | Change Tracking | Unoccupied energy-saving setback temperature |
0x38 |
UnoccupiedSetbackMin | uint8 / null | Change Tracking | Unoccupied setback minimum |
0x39 |
UnoccupiedSetbackMax | uint8 / null | Change Tracking | Unoccupied setback maximum |
0x3A |
EmergencyHeatDelta | uint8 | Change Tracking | Emergency heat activation delta |
0x40 |
ACType | enum8 | AC Capabilities | AC type |
0x41 |
ACCapacity | uint16 | AC Capabilities | AC cooling/heating capacity |
0x42 |
ACRefrigerantType | enum8 | AC Capabilities | Refrigerant type |
0x43 |
ACCompressorType | enum8 | AC Capabilities | Compressor type |
0x44 |
ACErrorCode | bitmap32 | AC Capabilities | AC error code bitmap |
0x45 |
ACLouverPosition | enum8 | AC Capabilities | Louver/air deflector position |
0x46 |
ACCoilTemperature | int16s / null | AC Capabilities | Coil temperature |
0x47 |
ACCapacityFormat | enum8 | AC Capabilities | Capacity unit format |
Temperature Information (0x00-0x09)
Basic measurements, absolute limits, and system demand information for the thermostat device.
| ID | Name | Type | Description |
|---|---|---|---|
0x00 |
LocalTemperature Local Temperature |
int16s / null | Current temperature measured by the thermostat, in 0.01°C units. null indicates temperature unavailable |
0x01 |
OutdoorTemperature Outdoor Temperature |
int16s / null | Outdoor temperature, provided by external sensors or remote data sources |
0x02 |
Occupancy Occupancy Status |
bitmap8 | Bit 0 = 1 indicates the space is occupied, device uses Occupied setpoints; = 0 uses Unoccupied setpoints |
0x03 |
AbsMinHeatSetpointLimit Abs Min Heat Setpoint |
int16s | Hardware-defined absolute minimum heating setpoint, factory-fixed |
0x04 |
AbsMaxHeatSetpointLimit Abs Max Heat Setpoint |
int16s | Hardware-defined absolute maximum heating setpoint, factory-fixed |
0x05 |
AbsMinCoolSetpointLimit Abs Min Cool Setpoint |
int16s | Hardware-defined absolute minimum cooling setpoint |
0x06 |
AbsMaxCoolSetpointLimit Abs Max Cool Setpoint |
int16s | Hardware-defined absolute maximum cooling setpoint |
0x07 |
PICoolingDemand Cooling Demand |
uint8 | Current cooling demand percentage (0-100%), calculated by PI algorithm |
0x08 |
PIHeatingDemand Heating Demand |
uint8 | Current heating demand percentage (0-100%), calculated by PI algorithm |
0x09 |
HVACSystemTypeConfiguration HVAC System Type |
bitmap8 | System type bitmap — cooling system stages, heating system stages, heating type (gas/electric), heating fuel source |
LocalTemperature is a Nullable type — the value is null when the sensor is faulty or not yet ready.
If the LTNE (Local Temperature Not Exposed) Feature is enabled, this attribute also returns null.
The App must handle null values when displaying temperature.
AbsMin/MaxHeatSetpointLimit (0x03-0x06) are hardware-defined absolute ranges, read-only and immutable.
MinHeatSetpointLimit (0x15-0x18) are user-adjustable ranges that must stay within the absolute limits.
Setpoint write validation chain: AbsMin ≤ UserMin ≤ Setpoint ≤ UserMax ≤ AbsMax.
Setpoints (0x10-0x19)
Temperature setpoints are the core of thermostat control — the device determines heating/cooling actions based on the difference between setpoints and current temperature.
| ID | Name | Type | Description |
|---|---|---|---|
0x10 |
LocalTemperatureCalibration Temperature Calibration |
int8 | Calibration offset for the local temperature sensor, in 0.1°C units. For example, -5 means actual temperature is 0.5°C lower than the sensor reading |
0x11 |
OccupiedCoolingSetpoint Occupied Cooling Setpoint |
int16s | Cooling target temperature when occupied. Cooling starts when LocalTemperature exceeds this value |
0x12 |
OccupiedHeatingSetpoint Occupied Heating Setpoint |
int16s | Heating target temperature when occupied. Heating starts when LocalTemperature falls below this value |
0x13 |
UnoccupiedCoolingSetpoint Unoccupied Cooling Setpoint |
int16s | Cooling target temperature when unoccupied (typically higher than occupied, for energy saving) |
0x14 |
UnoccupiedHeatingSetpoint Unoccupied Heating Setpoint |
int16s | Heating target temperature when unoccupied (typically lower than occupied, for energy saving) |
0x15 |
MinHeatSetpointLimit Min Heat Limit |
int16s | User-configurable minimum heating temperature (writable, but cannot be lower than AbsMinHeatSetpointLimit) |
0x16 |
MaxHeatSetpointLimit Max Heat Limit |
int16s | User-configurable maximum heating temperature |
0x17 |
MinCoolSetpointLimit Min Cool Limit |
int16s | User-configurable minimum cooling temperature |
0x18 |
MaxCoolSetpointLimit Max Cool Limit |
int16s | User-configurable maximum cooling temperature |
0x19 |
MinSetpointDeadBand Deadband |
int8 | Minimum temperature gap between heating and cooling setpoints, in 0.1°C units. Prevents simultaneous heating and cooling. For example, 25 means 2.5°C |
When writing setpoints, the device validates the complete limit chain (Matter spec section 4.3.6):
AbsMin ≤ MinLimit ≤ Setpoint ≤ MaxLimit ≤ AbsMax
Additionally in Auto mode: HeatingSetpoint + MinSetpointDeadBand ≤ CoolingSetpoint.
Writing an out-of-range value directly returns CONSTRAINT_ERROR; via SetpointRaiseLower it silently clamps.
Mode & Status (0x1A-0x29)
Defines the thermostat system's operating modes, scheduling capabilities, and current running status.
| ID | Name | Type | Description |
|---|---|---|---|
0x1A |
RemoteSensing Remote Sensing Flags |
bitmap8 | Indicates which temperature/occupancy data comes from remote sensors. Bit 0 = Local temperature, Bit 1 = Outdoor temperature, Bit 2 = Occupancy |
0x1B |
ControlSequenceOfOperation Control Sequence |
enum8 | Supported operating combinations (cooling only / heating only / cooling and heating, etc.). See enum values below |
0x1C |
SystemMode System Mode |
enum8 | User-configured system operating mode. See enum values below |
0x1E |
ThermostatRunningMode Actual Running Mode |
enum8 | Current actual running mode. Available only with AUTO Feature, value is one of Off/Cool/Heat |
0x20 |
StartOfWeek Start of Week |
enum8 | First day of the weekly schedule. See enum values below |
0x21 |
NumberOfWeeklyTransitions Weekly Transitions |
uint8 | Maximum number of weekly temperature transition points supported by the device |
0x22 |
NumberOfDailyTransitions Daily Transitions |
uint8 | Maximum number of daily temperature transition points supported by the device |
0x23 |
TemperatureSetpointHold Setpoint Hold |
enum8 | Whether to temporarily lock the current setpoint, ignoring scheduled changes. See enum values below |
0x24 |
TemperatureSetpointHoldDuration Hold Duration |
uint16 / null | Duration of the setpoint hold, in minutes (0-1440). null or 0xFFFF indicates indefinite hold |
0x25 |
ThermostatProgrammingOperationMode Programming Mode |
bitmap8 | Programming mode bitmap. See definitions below |
0x29 |
ThermostatRunningState Running State Bitmap |
bitmap16 | Currently running subsystems (heating/cooling/fan stages). See bitmap below |
SystemMode Enum Values
The SystemMode enum has no value 2 (it jumps from 1=Auto directly to 3=Cool). Do not assume consecutive values when parsing; use explicit map lookups.
ControlSequenceOfOperation Enum Values
ThermostatRunningMode Enum Values
Available only with the AUTO Feature, indicates the system's current actual operating direction:
ThermostatRunningState Bitmap
TemperatureSetpointHold Enum Values
ThermostatProgrammingOperationMode Bitmap
StartOfWeek Enum Values
Three easily confused attributes:
SystemMode (0x1C) = User-configured target mode, read/write (e.g., "Auto")
ThermostatRunningMode (0x1E) = Actual direction chosen in Auto mode (read-only, one of Off/Cool/Heat)
ThermostatRunningState (0x29) = Real-time on/off status of each subsystem (heating/cooling/fan) (read-only bitmap)
Change Tracking & Energy Saving (0x30-0x3A)
Tracks setpoint change sources and history, as well as energy-saving setback configuration.
| ID | Name | Type | Description |
|---|---|---|---|
0x30 |
SetpointChangeSource Change Source |
enum8 | Source of the most recent setpoint change. See enum values below |
0x31 |
SetpointChangeAmount Change Amount |
int16s / null | Magnitude of the most recent setpoint change, in 0.01°C units. null indicates no change record |
0x32 |
SetpointChangeSourceTimestamp Change Timestamp |
epoch-s | UTC timestamp of the most recent setpoint change |
0x34 |
OccupiedSetback Occupied Setback |
uint8 / null | Energy-saving temperature setback when occupied, in 0.1°C units. Used to moderately reduce energy consumption during occupied periods |
0x35 |
OccupiedSetbackMin Occupied Setback Min |
uint8 / null | Minimum allowed value for OccupiedSetback |
0x36 |
OccupiedSetbackMax Occupied Setback Max |
uint8 / null | Maximum allowed value for OccupiedSetback |
0x37 |
UnoccupiedSetback Unoccupied Setback |
uint8 / null | Energy-saving temperature setback when unoccupied, in 0.1°C units. Typically larger than occupied setback |
0x38 |
UnoccupiedSetbackMin Unoccupied Setback Min |
uint8 / null | Minimum allowed value for UnoccupiedSetback |
0x39 |
UnoccupiedSetbackMax Unoccupied Setback Max |
uint8 / null | Maximum allowed value for UnoccupiedSetback |
0x3A |
EmergencyHeatDelta Emergency Heat Delta |
uint8 | Temperature deviation threshold for triggering emergency heat, in 0.1°C units |
SetpointChangeSource Enum Values
AC Capabilities (0x40-0x47)
Hardware capabilities and operating parameters for AC units. This group of attributes is primarily used for Mini Split AC devices.
| ID | Name | Type | Description |
|---|---|---|---|
0x40 |
ACType AC Type |
enum8 | AC type and drive method. See enum values below |
0x41 |
ACCapacity AC Capacity |
uint16 | Cooling/heating capacity, unit determined by ACCapacityFormat (typically BTU/h) |
0x42 |
ACRefrigerantType Refrigerant Type |
enum8 | Type of refrigerant used. See enum values below |
0x43 |
ACCompressorType Compressor Type |
enum8 | Compressor temperature rating. See enum values below |
0x44 |
ACErrorCode AC Error Code |
bitmap32 | AC fault status bitmap — Bit 0: Compressor fault, Bit 1: Indoor temperature sensor fault, Bit 2: Outdoor temperature sensor fault, Bit 3: Coil sensor fault, Bit 4: Fan fault |
0x45 |
ACLouverPosition Louver Position |
enum8 | Louver/air deflector open/close position. See enum values below |
0x46 |
ACCoilTemperature Coil Temperature |
int16s / null | Real-time temperature of the evaporator/condenser coil, in 0.01°C units |
0x47 |
ACCapacityFormat Capacity Format |
enum8 | Unit format for ACCapacity. 0 = BTU/h |
ACType Enum Values
ACRefrigerantType Enum Values
ACCompressorType Enum Values
ACLouverPosition Enum Values
Standard Example
Below is a typical attribute data example for a Matter thermostat (JSON format), with each field annotated:
{
// --- Temperature Info ---
"0x00": 2150, // LocalTemperature = 2150 → actual 21.50°C
"0x01": 3200, // OutdoorTemperature = 3200 → actual 32.00°C
"0x02": 1, // Occupancy = 1 (occupied)
// --- Setpoints ---
"0x11": 2400, // OccupiedCoolingSetpoint = 2400 → 24.00°C
"0x12": 2000, // OccupiedHeatingSetpoint = 2000 → 20.00°C
"0x15": 700, // MinHeatSetpointLimit = 700 → 7.00°C
"0x16": 3000, // MaxHeatSetpointLimit = 3000 → 30.00°C
"0x17": 1600, // MinCoolSetpointLimit = 1600 → 16.00°C
"0x18": 3200, // MaxCoolSetpointLimit = 3200 → 32.00°C
"0x19": 25, // MinSetpointDeadBand = 25 → 2.5°C
// --- Mode & Status ---
"0x1B": 4, // ControlSequenceOfOperation = CoolingAndHeating
"0x1C": 1, // SystemMode = Auto
"0x1E": 3, // ThermostatRunningMode = Cool
"0x29": 0x0006, // ThermostatRunningState = CoolStateOn + FanStateOn
// --- AC Capabilities ---
"0x40": 3, // ACType = CoolingAndInverter
"0x41": 12000, // ACCapacity = 12000 (BTU/h)
"0x42": 2, // ACRefrigerantType = R410a
"0x45": 4 // ACLouverPosition = HalfOpen
}
All temperature attribute values are integers in 0.01°C units. To display 2150 returned by the device to the user, divide by 100 to get 21.50°C.
ThermostatRunningState = 0x0006 means Bit 1 (CoolStateOn) and Bit 2 (FanStateOn) are both set, indicating both cooling and fan are running.
Common Scenarios
Scenario 1: Read Current Temperature and System Status
- Read
LocalTemperature (0x00)— handlenullvalues - Read
SystemMode (0x1C)to get the current mode (Off/Auto/Cool/Heat, etc.) - Read
ThermostatRunningState (0x29)to determine which subsystems are running - Perform unit conversion when displaying — divide all temperature values by 100 for actual Celsius
Scenario 2: Adjust Temperature Setpoints
- First read
MinHeatSetpointLimit (0x15)throughMaxCoolSetpointLimit (0x18)to determine the adjustable range - Use the
SetpointRaiseLowercommand for incremental adjustments, or write directly toOccupiedCoolingSetpoint (0x11)/OccupiedHeatingSetpoint (0x12) - In Auto mode, observe the
MinSetpointDeadBand (0x19)constraint — heating and cooling setpoints must maintain sufficient separation - Subscribe to setpoint attribute changes to confirm modifications take effect
Scenario 3: Switch System Mode
- Read
ControlSequenceOfOperation (0x1B)to determine which mode combinations the device supports - For cooling-only devices (value 0-1), do not show Heat options; for heating-only devices (value 2-3), do not show Cool options
- Write to
SystemMode (0x1C)to switch modes - After switching, read
ThermostatRunningMode (0x1E)(in Auto mode) to confirm actual device operating direction
Scenario 4: Set Weekly Schedule
- First confirm the device supports the SCH Feature (check Feature Map)
- Read
NumberOfWeeklyTransitions (0x21)andNumberOfDailyTransitions (0x22)to understand capacity limits - Read
StartOfWeek (0x20)to determine the start of week - Send
SetWeeklySchedule (0x01)to set the schedule - Verify by reading back with
GetWeeklySchedule (0x02)
Scenario 5: Display Thermostat Card on App Home Screen
- Subscribe to
LocalTemperature (0x00)+SystemMode (0x1C)+ThermostatRunningState (0x29) - Display current temperature and target temperature (select corresponding setpoint based on SystemMode)
- Use ThermostatRunningState bitmap for running animations — heating / cooling / fan running
- Combine with PowerSource Cluster to display battery level (for battery-powered thermostats)