CarbonDioxideConcentrationMeasurement Cluster
Cluster ID: 0x040D |
Endpoint: Typically on Endpoint 1+ (application endpoint)
CarbonDioxideConcentrationMeasurement reports the CO2 (carbon dioxide) concentration in the air and is a core Cluster for indoor air quality monitoring. This is a read-only Server Cluster — it has no commands. The device passively collects data, and the App simply reads or subscribes.
All Concentration Measurement Clusters in Matter share exactly the same attribute set and Feature Map structure, differing only in Cluster ID. CO2 is the most common one, and this page's documentation applies equally to the following Clusters:
- CarbonMonoxideConcentrationMeasurement (0x040C) — Carbon Monoxide
- NitrogenDioxideConcentrationMeasurement (0x0413) — Nitrogen Dioxide
- OzoneConcentrationMeasurement (0x0415) — Ozone
- FormaldehydeConcentrationMeasurement (0x042B) — Formaldehyde
- PM1ConcentrationMeasurement (0x042C) — PM1
- PM25ConcentrationMeasurement (0x042A) — PM2.5
- PM10ConcentrationMeasurement (0x042D) — PM10
- RadonConcentrationMeasurement (0x042F) — Radon
- TotalVolatileOrganicCompoundsConcentrationMeasurement (0x042E) — TVOC
The only differences are the target substance and typical value ranges. Once you understand the CO2 structure, you can apply the same pattern to all other Concentration Clusters.
Feature Bitmap
Concentration Measurement Clusters declare their supported measurement capabilities via FeatureMap (0xFFFC).
Features directly determine which attributes are available — you must read FeatureMap first to decide what data the UI should display.
MED and CRI both depend on LEV — without LEV there are no Medium or Critical levels.
PEA and AVG both depend on MEA — peak and average values require the device to provide precise numeric measurements.
At least one of MEA or LEV must be supported; otherwise the Cluster has no reportable data.
Low-end CO2 sensor: FeatureMap = 0x01 (MEA only) — reports numeric values only, no level classification.
Mid-range air quality panel: FeatureMap = 0x07 (MEA + LEV + MED) — provides both numeric values and level classification.
High-end indoor environment monitor: FeatureMap = 0x3F (all 6 Features) — numeric values + levels + peak + average.
Attribute Overview
All attributes are read-only and divided into four groups. The Feature column indicates which Feature is required for that attribute to exist. Click an attribute ID to jump to its detailed description.
Numeric Measurement (MEA Feature)
| ID | Name | Type | Feature | Description |
|---|---|---|---|---|
0x00 |
MeasuredValue | float | MEA | Current concentration, Nullable |
0x01 |
MinMeasuredValue | float | MEA | Minimum measurable concentration, Nullable |
0x02 |
MaxMeasuredValue | float | MEA | Maximum measurable concentration, Nullable |
0x07 |
Uncertainty | float | MEA | Measurement uncertainty |
0x08 |
MeasurementUnit | enum8 | MEA | Measurement unit (PPM / PPB, etc.) |
0x09 |
MeasurementMedium | enum8 | MEA | Measurement medium (Air / Water / Soil) |
Peak and Average Measurement
| ID | Name | Type | Feature | Description |
|---|---|---|---|---|
0x03 |
PeakMeasuredValue | float | PEA | Peak concentration within the window, Nullable |
0x04 |
PeakMeasuredValueWindow | uint32 | PEA | Peak measurement window (seconds) |
0x05 |
AverageMeasuredValue | float | AVG | Average concentration within the window, Nullable |
0x06 |
AverageMeasuredValueWindow | uint32 | AVG | Average measurement window (seconds) |
Level Indication (LEV Feature)
| ID | Name | Type | Feature | Description |
|---|---|---|---|---|
0x0A |
LevelValue | enum8 | LEV | Current concentration level (Low / Medium / High / Critical) |
Attributes
MeasuredValue (Current Concentration)
The most recent CO2 concentration reading from the sensor. This is the most important attribute of the entire Cluster. Unlike the Temperature Cluster, Concentration Clusters use a float type — the value is the actual concentration and requires no conversion.
- Type: float (single-precision floating point)
- Unit: Determined by the
MeasurementUnitattribute (typically PPM) - Nullable:
nullindicates invalid sensor data or that the first measurement has not yet completed - Feature: MEA
400 ppm = Fresh outdoor air |
600~800 ppm = Well-ventilated indoor |
1000~1500 ppm = Ventilation needed |
2000+ ppm = Noticeable discomfort, must ventilate |
5000 ppm = Occupational safety limit
MinMeasuredValue (Minimum Measurable Concentration)
The lowest concentration the sensor can measure. The App can use this to set the lower bound of the display range. For CO2 sensors, this is typically 400 ppm (atmospheric background concentration).
- Type: float, Nullable
- Feature: MEA
MaxMeasuredValue (Maximum Measurable Concentration)
The highest concentration the sensor can measure. When MeasuredValue approaches this upper limit,
it may indicate the sensor is beyond its normal operating range. For CO2 sensors, common upper limits are 5000 or 10000 ppm.
- Type: float, Nullable
- Feature: MEA
PeakMeasuredValue (Peak Concentration)
The highest concentration recorded by the sensor within the time window specified by PeakMeasuredValueWindow.
Useful for tracking "the worst air quality concentration in the last 24 hours."
- Type: float, Nullable
- Feature: PEA (depends on MEA)
PeakMeasuredValueWindow (Peak Measurement Window)
The time window for PeakMeasuredValue, in seconds. For example, 86400 means the peak is the maximum value over the past 24 hours.
When the window expires, PeakMeasuredValue resets and starts tracking again.
- Type: elapsed-s (uint32, elapsed seconds)
- Feature: PEA
AverageMeasuredValue (Average Concentration)
The arithmetic average of concentration within the time window specified by AverageMeasuredValueWindow.
The average is more stable than real-time values and is suitable for trend analysis and air quality scoring.
- Type: float, Nullable
- Feature: AVG (depends on MEA)
AverageMeasuredValueWindow (Average Measurement Window)
The time window for AverageMeasuredValue, in seconds. For example, 3600 means the average is calculated over the past 1 hour.
- Type: elapsed-s (uint32, elapsed seconds)
- Feature: AVG
Uncertainty (Measurement Uncertainty)
The sensor's measurement precision, in the same unit as MeasurementUnit.
For example, a value of 15.0 with the unit PPM means the measurement accuracy is ±15 ppm.
When using concentration thresholds to trigger automation, uncertainty should be taken into account.
- Type: float
- Feature: MEA
MeasurementUnit (Measurement Unit)
Declares the unit of measurement used by numeric attributes such as MeasuredValue.
The vast majority of CO2 sensors use PPM (parts per million).
See MeasurementUnitEnum below for detailed enum values.
- Type: enum8
- Feature: MEA
MeasurementMedium (Measurement Medium)
Declares which medium the sensor measures concentration in. CO2 sensors almost always use Air,
but the Concentration Measurement Cluster family also covers water quality monitoring (Water) and soil monitoring (Soil).
See MeasurementMediumEnum below for detailed enum values.
- Type: enum8
- Feature: MEA
LevelValue (Concentration Level)
The device's own assessment of the current concentration level. Suitable for scenarios that don't require precise values — such as a simple traffic-light indicator.
Note: If the device does not have the MED Feature, LevelValue will not return Medium;
without the CRI Feature, it will not return Critical.
See LevelValueEnum below for detailed enum values.
- Type: enum8
- Feature: LEV
Commands
CarbonDioxideConcentrationMeasurement is a read-only Server Cluster with no commands. The device is responsible for collecting CO2 concentration and updating attributes; the App only needs to Read or Subscribe to obtain data.
Enum Quick Reference
MeasurementUnitEnum (Measurement Unit)
MeasurementMediumEnum (Measurement Medium)
LevelValueEnum (Concentration Level)
Example Data
Reading all attributes from an indoor CO2 sensor (typical indoor environment, approximately 800 ppm):
{
// --- CarbonDioxideConcentrationMeasurement Cluster (Endpoint 1) ---
// Numeric Measurement (MEA Feature)
"0x00": 823.5, // MeasuredValue = 823.5 ppm (current CO2 concentration)
"0x01": 400.0, // MinMeasuredValue = 400 ppm (sensor lower limit)
"0x02": 5000.0, // MaxMeasuredValue = 5000 ppm (sensor upper limit)
"0x07": 15.0, // Uncertainty = ±15 ppm
// Measurement Unit and Medium (MEA Feature)
"0x08": 0, // MeasurementUnit = PPM
"0x09": 0, // MeasurementMedium = Air
// Peak Measurement (PEA Feature)
"0x03": 1250.0, // PeakMeasuredValue = 1250 ppm (historical peak)
"0x04": 86400, // PeakMeasuredValueWindow = 86400 seconds (24-hour window)
// Average Measurement (AVG Feature)
"0x05": 680.5, // AverageMeasuredValue = 680.5 ppm (average)
"0x06": 3600, // AverageMeasuredValueWindow = 3600 seconds (1-hour window)
// Level Indication (LEV Feature)
"0x0A": 2 // LevelValue = Medium
}
Read request example — read all Cluster attributes at once:
{
// Read all CO2 Cluster attributes at once
"readRequests": [{
"attributePath": {
"endpointId": 1,
"clusterId": "0x040D"
// No attributeId specified → reads all attributes
}
}]
}
Subscribe to CO2 concentration changes — track air quality in real time:
{
// Subscribe to CO2 concentration changes (reports every 30 seconds to 5 minutes)
"subscribeRequests": [{
"attributePath": {
"endpointId": 1,
"clusterId": "0x040D",
"attributeId": "0x00" // MeasuredValue
},
"minIntervalFloor": 30,
"maxIntervalCeiling": 300
}]
}
The Temperature Cluster (0x0402) uses int16 type with values in units of 0.01°C, requiring division by 100 for conversion.
Concentration Clusters use float type, where the value is the actual concentration directly — no conversion is needed.
However, you must read MeasurementUnit to confirm whether the unit is PPM or something else.
Common Scenarios
Scenario 1: Fresh Air System Auto Ventilation Control
Automatically adjust the fresh air system's airflow based on CO2 concentration to maintain indoor air quality.
- Subscribe to
MeasuredValue (0x00)with a reporting interval of 30 seconds to 2 minutes - Confirm
MeasurementUnit (0x08)is PPM (different units require different thresholds) - Set multi-level thresholds for ventilation control:
< 600 ppm: Low speed or turn off fresh air600 ~ 1000 ppm: Medium speed> 1000 ppm: Full speed
- Use
Uncertainty (0x07)for debouncing — if uncertainty is ±15 ppm, add a 15 ppm hysteresis zone around thresholds to avoid frequent switching - Use FanControl Cluster (0x0202) to control fresh air system fan speed
Scenario 2: Air Quality Dashboard
Display a comprehensive indoor air quality panel on the App's home screen.
- Read
FeatureMap (0xFFFC)to confirm device capabilities and determine UI display content - With
MEA: Show precise values and measurement range (Min/Max), use a gradient bar to indicate current position - With
LEV: Show level badges (Low/Medium/High/Critical) with color-coded visual indicators - With
PEA: Show a "Today's Peak" card, readingPeakMeasuredValue (0x03)and the window duration - With
AVG: Show an "Average" trend line —AverageMeasuredValue (0x05)is more suitable for trend display than real-time values - Handle
nullvalues — display "--" or "Sensor Offline", never show 0
Scenario 3: Classroom CO2 Monitoring and Alerts
Deploy CO2 sensors in school classrooms and notify teachers to open windows or start ventilation when concentration is too high.
- Subscribe to
MeasuredValue (0x00)andLevelValue (0x0A)(if the device supports LEV) - Push an alert notification when LevelValue changes to
High (3)orCritical (4) - If the device only has MEA without LEV, the App determines levels on its own:
> 1500 ppm: Push "Recommend opening windows for ventilation"> 2500 ppm: Push "CO2 concentration too high, ventilate immediately"
- Use
AverageMeasuredValue (0x05)to analyze daily CO2 patterns — e.g., concentration peaks at 2 PM after class, schedule ventilation in advance - When peak values exceed the threshold for multiple consecutive days (
PeakMeasuredValue > 2000), recommend inspecting the classroom ventilation system