SmokeCOAlarm Cluster
Cluster ID: 0x005C |
Endpoint: Typically on Endpoint 1 (application endpoint)
SmokeCOAlarm is the core Cluster for fire safety devices in Matter, responsible for smoke detection, carbon monoxide (CO) detection, battery status monitoring, device self-testing, and interconnect alarms. Standalone smoke detectors, combination smoke/CO detectors, and interconnected alarm systems commonly found in residential settings all rely on this Cluster.
The two Features of SmokeCOAlarm (SMOKE and CO) determine which alarm types the device supports.
A smoke-only device enables only SMOKE, a CO-only detector enables only CO, and a combination device enables both.
The Feature combination directly affects which attributes and events are available — always check FeatureMap (0xFFFC) before reading.
Feature Bitmap
SmokeCOAlarm declares its supported alarm capabilities via FeatureMap (0xFFFC):
FeatureMap = 0x01 (Bit 0): Smoke-only device.
FeatureMap = 0x02 (Bit 1): CO-only detector.
FeatureMap = 0x03 (Bit 0 + Bit 1): Combination smoke/CO device (the most common residential device).
Commands
The SmokeCOAlarm Cluster has only one command — trigger a device self-test. The core actions of an alarm device (alarming, muting, etc.) are triggered autonomously by the device and do not require external command control.
| ID | Name | Description | Required Feature |
|---|---|---|---|
0x00 |
SelfTestRequest | Trigger a device self-test | None |
SelfTestRequest — Trigger Self-Test (0x00)
Requests the device to perform a self-test procedure. The device checks whether its sensors, buzzer, battery, and other components are functioning properly.
During the self-test, the TestInProgress attribute becomes true, and the SelfTestComplete event is emitted upon completion.
No parameters are required.
A self-test causes the device to briefly emit an alarm sound (to test the buzzer), so users should be informed in advance.
If the device is currently in an alarm state (ExpressedState ≠ Normal), the self-test request will be rejected.
Usage Scenarios
Invoke this when the user taps the "Device Self-Test" button in the app. A monthly self-test is recommended to ensure the device is working properly.
After sending the command, subscribe to the TestInProgress (0x0005) attribute changes to track self-test progress,
and listen for the SelfTestComplete event to obtain the self-test result.
Attributes
The SmokeCOAlarm Cluster attributes are organized into four groups. Click an attribute ID in the summary table below to jump to its detailed description.
| ID | Name | Type | Group | Description |
|---|---|---|---|---|
0x0000 |
ExpressedState | enum8 | Alarm State | Current highest-priority device state |
0x0001 |
SmokeState | enum8 | Alarm State | Smoke detection state (requires SMOKE feature) |
0x0002 |
COState | enum8 | Alarm State | Carbon monoxide detection state (requires CO feature) |
0x0003 |
BatteryAlert | enum8 | Alarm State | Battery level alert severity |
0x0004 |
DeviceMuted | enum8 | Device Control | Whether the alarm is muted |
0x0005 |
TestInProgress | bool | Device Control | Whether a self-test is in progress |
0x0006 |
HardwareFaultAlert | bool | Device Control | Whether a hardware fault is present |
0x0007 |
EndOfServiceAlert | enum8 | Device Control | Whether the device has reached end of service life |
0x0008 |
InterconnectSmokeAlarm | enum8 | Interconnect Alarm | Interconnect smoke alarm state (requires SMOKE feature) |
0x0009 |
InterconnectCOAlarm | enum8 | Interconnect Alarm | Interconnect CO alarm state (requires CO feature) |
0x000A |
ContaminationState | enum8 | Sensor & Lifetime | Sensor contamination level |
0x000B |
SmokeSensitivityLevel | enum8 | Sensor & Lifetime | Smoke sensitivity setting |
0x000C |
ExpiryDate | epoch_s | Sensor & Lifetime | Device expiry date |
Alarm State (0x0000 - 0x0003)
Describes the device's current alarm states. ExpressedState is the overall prioritized result of all states; the other three are individual states.
| ID | Name | Type | Description |
|---|---|---|---|
0x0000 |
ExpressedState Overall State |
enum8 | The highest-priority alarm state of the device. When multiple alarms are active simultaneously, the device selects the one with the highest priority as the ExpressedState (see enum below). This is the most critical attribute of SmokeCOAlarm |
0x0001 |
SmokeState Smoke State |
enum8 | The alarm level currently detected by the smoke sensor. Requires SMOKE feature |
0x0002 |
COState CO State |
enum8 | The alarm level currently detected by the carbon monoxide sensor. Requires CO feature |
0x0003 |
BatteryAlert Battery Alert |
enum8 | The alarm level for battery charge status. Battery-powered alarm devices must support this attribute |
ExpressedState Enum Values
ExpressedState reflects the state that currently requires the most attention. Priority is listed from highest to lowest:
When multiple alarms are active simultaneously, the device reflects only the highest-priority one in ExpressedState.
For example, if both a smoke alarm and low battery are present, ExpressedState will show SmokeAlarm (1).
To obtain all individual states, you need to read the SmokeState, COState, BatteryAlert, and other attributes separately.
SmokeState / COState / BatteryAlert / InterconnectSmokeAlarm / InterconnectCOAlarm Enum Values
The five attributes above share the same three-level alarm enum:
Warning indicates that the sensor has detected an anomaly but has not yet confirmed it as an emergency (e.g., light smoke, slightly low battery). This is typically a pre-alert level, and the device may emit intermittent beeps. Critical indicates a confirmed emergency (e.g., persistent heavy smoke, CO concentration exceeding safe limits, critically low battery). The device will emit a continuous high-volume alarm.
Device Control (0x0004 - 0x0007)
Describes the device's mute state, self-test progress, hardware health, and service lifetime.
| ID | Name | Type | Description |
|---|---|---|---|
0x0004 |
DeviceMuted Mute State |
enum8 | Whether the alarm has been muted by the user. When muted, the device stops sounding, but the alarm state persists (see enum below) |
0x0005 |
TestInProgress Self-Test In Progress |
bool | Whether the device is currently performing a self-test. true = self-test in progress; no new SelfTestRequest will be accepted during this time |
0x0006 |
HardwareFaultAlert Hardware Fault |
bool | Whether the device has detected an internal hardware fault. true indicates the device may not function properly and needs repair or replacement |
0x0007 |
EndOfServiceAlert End of Service |
enum8 | Whether the device has reached its service life (see enum below) |
DeviceMuted Enum Values
Muting is triggered by a physical button on the device and cannot be controlled via remote commands. Muting only lasts for a limited duration (typically a few minutes), after which the alarm automatically resumes. If the danger persists, the device may refuse to mute or shorten the mute duration.
EndOfServiceAlert Enum Values
The sensors in smoke/CO detectors degrade over time. Most devices have a designed service life of 7 to 10 years.
When EndOfServiceAlert changes to Expired, the app should prompt the user to replace the device,
even if the device appears to still be functioning. Combined with ExpiryDate (0x000C), you can provide advance notice of the expiry date.
Interconnect Alarm (0x0008 - 0x0009)
When multiple alarm devices are interconnected, if one device triggers an alarm, the others reflect that state through interconnect attributes. Interconnect alarms ensure the alarm can be heard throughout the entire home, even if the fire source is not in the same room as the current device.
| ID | Name | Type | Description |
|---|---|---|---|
0x0008 |
InterconnectSmokeAlarm Interconnect Smoke Alarm |
enum8 | Smoke alarm state triggered by other interconnected devices. Uses the same enum values as SmokeState (Normal / Warning / Critical). Requires SMOKE feature |
0x0009 |
InterconnectCOAlarm Interconnect CO Alarm |
enum8 | CO alarm state triggered by other interconnected devices. Uses the same enum values as COState (Normal / Warning / Critical). Requires CO feature |
SmokeState is the detection result from the local sensor, while InterconnectSmokeAlarm is an alarm relayed from other interconnected devices.
In the ExpressedState priority order, a local alarm (SmokeAlarm = 1) ranks higher than an interconnect alarm (InterconnectSmoke = 7),
because locally detected smoke means the danger is nearby.
Sensor & Lifetime (0x000A - 0x000C)
Information related to sensor health and device service lifetime.
| ID | Name | Type | Description |
|---|---|---|---|
0x000A |
ContaminationState Contamination State |
enum8 | The contamination level of the smoke sensor. Dust, cooking fumes, etc. can affect sensor sensitivity (see enum below) |
0x000B |
SmokeSensitivityLevel Smoke Sensitivity |
enum8 | The sensitivity setting for smoke detection. Read/Write (see enum below) |
0x000C |
ExpiryDate Expiry Date |
epoch_s | The device's expiry time expressed as a Unix timestamp (seconds). The device should be replaced after this date |
ContaminationState Enum Values
SmokeSensitivityLevel Enum Values
SmokeSensitivityLevel is a writable attribute, and the app can provide a settings entry for users to adjust it.
If a device installed near a kitchen triggers frequent false alarms, you may suggest the user lower the sensitivity.
However, note that lower sensitivity may delay detection of an actual fire, so the risk must be clearly communicated.
Events
SmokeCOAlarm is one of the most event-rich Clusters in Matter. Events record the complete lifecycle of an alarm device from trigger to clearance, and are the primary data source for app push notifications and alarm history. All events have a priority of Critical.
| ID | Event Name | Description | Required Feature |
|---|---|---|---|
0x00 |
SmokeAlarm | Local smoke alarm triggered | SMOKE |
0x01 |
COAlarm | Local CO alarm triggered | CO |
0x02 |
LowBattery | Low battery | None |
0x03 |
HardwareFault | Hardware fault | None |
0x04 |
EndOfService | Device has reached end of service life | None |
0x05 |
SelfTestComplete | Self-test completed | None |
0x06 |
AlarmMuted | Alarm has been muted | None |
0x07 |
MuteEnded | Mute ended, alarm resumed | None |
0x08 |
InterconnectSmokeAlarm | Interconnect smoke alarm triggered | SMOKE |
0x09 |
InterconnectCOAlarm | Interconnect CO alarm triggered | CO |
0x0A |
AllClear | All alarms cleared, returned to normal | None |
Events represent "what happened" (a one-time record), while attributes represent "what is the current state" (a persistent state).
For example, the SmokeAlarm event is generated once when the smoke alarm triggers,
while the SmokeState attribute remains at Warning or Critical until the smoke dissipates.
The app should subscribe to both events (for push notifications) and attributes (for real-time UI display).
Typical Event Sequence
A complete smoke alarm lifecycle produces the following event sequence:
SmokeAlarm— sensor detects smoke, alarm beginsAlarmMuted— user presses the mute button (optional)MuteEnded— mute times out, alarm resumes (if smoke has not cleared)AllClear— smoke dissipates, all alarm states return to normal
The AllClear event is only triggered when all alarms have been cleared.
If the smoke alarm clears but a CO alarm is still active, AllClear will not be triggered.
Upon receiving AllClear, ExpressedState is guaranteed to be Normal (0).
Example Data
A SmokeCOAlarm Cluster read result from a device supporting both smoke and CO alarms in a normal state:
{
// --- Overall Alarm State ---
"0x0000": 0, // ExpressedState = Normal (no active alarms)
"0x0001": 0, // SmokeState = Normal
"0x0002": 0, // COState = Normal
"0x0003": 0, // BatteryAlert = Normal
"0x0004": 0, // DeviceMuted = NotMuted (not muted)
"0x0005": false, // TestInProgress = false (not self-testing)
"0x0006": false, // HardwareFaultAlert = false
"0x0007": 0, // EndOfServiceAlert = Normal
// --- Interconnect Alarm ---
"0x0008": 0, // InterconnectSmokeAlarm = Normal
"0x0009": 0, // InterconnectCOAlarm = Normal
// --- Sensor & Lifetime ---
"0x000A": 0, // ContaminationState = Normal
"0x000B": 1, // SmokeSensitivityLevel = Standard
"0x000C": 1893456000 // ExpiryDate = 2029-12-31 (epoch_s)
}
When reading data, it is recommended to first check FeatureMap (0xFFFC) to determine which features the device supports.
A smoke-only device will not report COState (0x0002) or InterconnectCOAlarm (0x0009),
and a CO-only detector will not report SmokeState (0x0001) or InterconnectSmokeAlarm (0x0008).
The value of ExpiryDate (0x000C) is a Unix timestamp (seconds) that needs to be converted to a human-readable date before displaying to the user.
Common Scenarios
Scenario 1: Fire Detection and Notification
- Subscribe to the
SmokeAlarmevent — send an urgent push notification to the user immediately upon receipt - Read
SmokeState (0x0001)to confirm the alarm severity (Warning / Critical) - Read
ExpressedState (0x0000)to understand the overall device state - Display the alarm state in the UI with a prominent color (red), and prompt the user to check the premises and call emergency services
- Listen for the
AllClearevent to confirm the alarm has been cleared, and return the UI to normal
Scenario 2: Carbon Monoxide Leak Response
- Subscribe to the
COAlarmevent — CO leaks are more dangerous than smoke (colorless and odorless), so notifications must be immediate - Read
COState (0x0002)to confirm the alarm severity -
Provide safety instructions in the notification:
- Immediately open windows for ventilation
- Shut off gas appliances
- Evacuate to a safe outdoor area
- Call emergency services or the gas company
- Check
InterconnectCOAlarm (0x0009)to determine if other areas are also alarming
Scenario 3: Device Maintenance and Health Monitoring
- Periodically read
BatteryAlert (0x0003)— prompt the user to replace the battery when Warning appears - Read
ContaminationState (0x000A)— prompt the user to clean the sensor when it reaches Warning - Read
ExpiryDate (0x000C)— notify the user in advance to purchase a replacement device as it approaches expiry - Monitor
HardwareFaultAlert (0x0006)— whentrue, prompt the user to contact customer support - Trigger a self-test monthly via the
SelfTestRequest (0x00)command to ensure the device is working properly - Listen for the
SelfTestCompleteevent to obtain the self-test result