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.

Feature-Driven Capability Declaration

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

Bit 0
SMOKE (Smoke Alarm) Enables smoke detection capability — provides the SmokeState attribute and SmokeAlarm / InterconnectSmokeAlarm events
Bit 1
CO (Carbon Monoxide Alarm) Enables CO detection capability — provides the COState attribute and COAlarm / InterconnectCOAlarm events
Common Combinations

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.

Self-Test Considerations

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:

0
Normal Normal — no alarms active, everything is operating normally
1
SmokeAlarm Smoke alarm — smoke detected, possible fire
2
COAlarm CO alarm — carbon monoxide leak detected
3
BatteryAlert Battery alert — low battery or battery fault
4
Testing Testing — device is performing a self-test
5
HardwareFault Hardware fault — device has detected an internal fault
6
EndOfService End of service — device has reached its service life and needs replacement
7
InterconnectSmoke Interconnect smoke — another interconnected device has triggered a smoke alarm
8
InterconnectCO Interconnect CO — another interconnected device has triggered a CO alarm
ExpressedState Priority Mechanism

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:

0
Normal Normal — no anomaly detected
1
Warning Warning — minor anomaly detected, attention needed
2
Critical Critical — confirmed danger, immediate action required
Difference Between Warning and Critical

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

0
NotMuted Not muted — alarm sounds normally
1
Muted Muted — alarm sound is suppressed, but the alarm state persists
Mute Limitations

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

0
Normal Normal — device is within its service life
1
Expired Expired — device has reached its service life; sensors may no longer be accurate and the device should be replaced as soon as possible
Smoke Detector Service Life

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
Interconnect vs. Local Alarm

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

0
Normal Normal — sensor is clean
1
Low Low contamination — does not affect normal operation
2
Warning Moderate contamination — sensitivity may be reduced, cleaning recommended
3
Critical Severe contamination — sensor may not function properly, must be cleaned or replaced

SmokeSensitivityLevel Enum Values

0
High High sensitivity — triggers on light smoke, suitable for bedrooms and other critical areas
1
Standard Standard sensitivity — default setting, suitable for most scenarios
2
Low Low sensitivity — reduces false alarms, suitable for kitchens and other areas prone to smoke
Sensitivity Adjustment Recommendations

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
Relationship Between Events and Attributes

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:

  1. SmokeAlarm — sensor detects smoke, alarm begins
  2. AlarmMuted — user presses the mute button (optional)
  3. MuteEnded — mute times out, alarm resumes (if smoke has not cleared)
  4. AllClear — smoke dissipates, all alarm states return to normal
Meaning of AllClear

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

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
  1. Subscribe to the SmokeAlarm event — send an urgent push notification to the user immediately upon receipt
  2. Read SmokeState (0x0001) to confirm the alarm severity (Warning / Critical)
  3. Read ExpressedState (0x0000) to understand the overall device state
  4. Display the alarm state in the UI with a prominent color (red), and prompt the user to check the premises and call emergency services
  5. Listen for the AllClear event to confirm the alarm has been cleared, and return the UI to normal
Scenario 2: Carbon Monoxide Leak Response
  1. Subscribe to the COAlarm event — CO leaks are more dangerous than smoke (colorless and odorless), so notifications must be immediate
  2. Read COState (0x0002) to confirm the alarm severity
  3. 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
  4. Check InterconnectCOAlarm (0x0009) to determine if other areas are also alarming
Scenario 3: Device Maintenance and Health Monitoring
  1. Periodically read BatteryAlert (0x0003) — prompt the user to replace the battery when Warning appears
  2. Read ContaminationState (0x000A) — prompt the user to clean the sensor when it reaches Warning
  3. Read ExpiryDate (0x000C) — notify the user in advance to purchase a replacement device as it approaches expiry
  4. Monitor HardwareFaultAlert (0x0006) — when true, prompt the user to contact customer support
  5. Trigger a self-test monthly via the SelfTestRequest (0x00) command to ensure the device is working properly
  6. Listen for the SelfTestComplete event to obtain the self-test result