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.

Concentration Measurement Cluster Family — Shared Template

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.

Bit 0
MEA (Numeric Measurement) Numeric Measurement — enables MeasuredValue / Min / Max / Uncertainty / MeasurementUnit / MeasurementMedium
Bit 1
LEV (Level Indication) Level Indication — enables LevelValue (Low / Medium / High / Critical), without providing precise numeric values
Bit 2
MED (Medium Level) Medium Level — requires LEV; LevelValue may return Medium
Bit 3
CRI (Critical Level) Critical Level — requires LEV; LevelValue may return Critical
Bit 4
PEA (Peak Measurement) Peak Measurement — requires MEA; enables PeakMeasuredValue / PeakMeasuredValueWindow
Bit 5
AVG (Average Measurement) Average Measurement — requires MEA; enables AverageMeasuredValue / AverageMeasuredValueWindow
Feature Dependencies

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.

Feature Combination Examples

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 MeasurementUnit attribute (typically PPM)
  • Nullable: null indicates invalid sensor data or that the first measurement has not yet completed
  • Feature: MEA
CO2 Concentration Reference Values

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)

0
PPM Parts per million (most common for CO2 sensors)
1
PPB Parts per billion (ultra-low concentration gases)
2
PPT Parts per trillion (trace analysis)
3
MGM3 Milligrams per cubic meter (mg/m³)
4
UGM3 Micrograms per cubic meter (μg/m³, commonly used for PM2.5)
5
NGM3 Nanograms per cubic meter (ng/m³)
6
PM3 Particles per cubic meter (p/m³, particle counting)
7
BQM3 Becquerels per cubic meter (Bq/m³, radioactive radon)

MeasurementMediumEnum (Measurement Medium)

0
Air Air (CO2, PM2.5, and other gas/particulate sensors)
1
Water Water (water quality monitoring, dissolved oxygen, etc.)
2
Soil Soil (agriculture and environmental monitoring)

LevelValueEnum (Concentration Level)

0
Unknown Unknown (sensor has not yet completed assessment)
1
Low Low concentration (good air quality)
2
Medium Medium concentration (requires MED Feature)
3
High High concentration (improved ventilation recommended)
4
Critical Critical concentration (requires CRI Feature, immediate action needed)

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
  }]
}
Differences from the Temperature Measurement Cluster

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.

  1. Subscribe to MeasuredValue (0x00) with a reporting interval of 30 seconds to 2 minutes
  2. Confirm MeasurementUnit (0x08) is PPM (different units require different thresholds)
  3. Set multi-level thresholds for ventilation control:
    • < 600 ppm: Low speed or turn off fresh air
    • 600 ~ 1000 ppm: Medium speed
    • > 1000 ppm: Full speed
  4. Use Uncertainty (0x07) for debouncing — if uncertainty is ±15 ppm, add a 15 ppm hysteresis zone around thresholds to avoid frequent switching
  5. 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.

  1. Read FeatureMap (0xFFFC) to confirm device capabilities and determine UI display content
  2. With MEA: Show precise values and measurement range (Min/Max), use a gradient bar to indicate current position
  3. With LEV: Show level badges (Low/Medium/High/Critical) with color-coded visual indicators
  4. With PEA: Show a "Today's Peak" card, reading PeakMeasuredValue (0x03) and the window duration
  5. With AVG: Show an "Average" trend line — AverageMeasuredValue (0x05) is more suitable for trend display than real-time values
  6. Handle null values — 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.

  1. Subscribe to MeasuredValue (0x00) and LevelValue (0x0A) (if the device supports LEV)
  2. Push an alert notification when LevelValue changes to High (3) or Critical (4)
  3. 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"
  4. Use AverageMeasuredValue (0x05) to analyze daily CO2 patterns — e.g., concentration peaks at 2 PM after class, schedule ventilation in advance
  5. When peak values exceed the threshold for multiple consecutive days (PeakMeasuredValue > 2000), recommend inspecting the classroom ventilation system