CO2 浓度测量 Cluster(CarbonDioxideConcentrationMeasurement)
Cluster ID: 0x040D |
所在 Endpoint: 通常在 Endpoint 1+(功能端点)
CarbonDioxideConcentrationMeasurement 用于报告空气中 CO2(二氧化碳)浓度,是室内空气质量监测的核心 Cluster。 这是一个纯只读的 Server Cluster —— 没有任何命令,设备被动采集数据,App 端读取或订阅即可。
Matter 中所有浓度测量 Cluster 共享完全相同的属性集和 Feature Map 结构,仅 Cluster ID 不同。 CO2 是其中最常见的一个,本页文档同样适用于以下 Cluster:
- CarbonMonoxideConcentrationMeasurement(0x040C)—— 一氧化碳
- NitrogenDioxideConcentrationMeasurement(0x0413)—— 二氧化氮
- OzoneConcentrationMeasurement(0x0415)—— 臭氧
- FormaldehydeConcentrationMeasurement(0x042B)—— 甲醛
- PM1ConcentrationMeasurement(0x042C)—— PM1
- PM25ConcentrationMeasurement(0x042A)—— PM2.5
- PM10ConcentrationMeasurement(0x042D)—— PM10
- RadonConcentrationMeasurement(0x042F)—— 氡
- TotalVolatileOrganicCompoundsConcentrationMeasurement(0x042E)—— TVOC
区别只在于被测物质和典型数值范围。理解了 CO2 的结构,其他浓度 Cluster 可以直接套用。
Feature 位图
浓度测量 Cluster 通过 FeatureMap(0xFFFC)声明设备支持哪些测量能力。
Feature 直接决定了哪些属性可用 —— 必须先读取 FeatureMap,再决定 UI 展示哪些数据。
MED 和 CRI 都依赖 LEV —— 没有 LEV 就不会有 Medium 或 Critical 等级。
PEA 和 AVG 都依赖 MEA —— 峰值和均值的前提是设备能提供精确数值。
MEA 和 LEV 至少要支持一个,否则这个 Cluster 什么数据都报不出来。
低端 CO2 传感器:FeatureMap = 0x01(仅 MEA),只报数值,没有等级判定。
中端空气质量面板:FeatureMap = 0x07(MEA + LEV + MED),有数值也有等级。
高端室内环境监测:FeatureMap = 0x3F(全部 6 个 Feature),数值 + 等级 + 峰值 + 均值。
属性总览
所有属性都是只读的,分为四组。Feature 列标注了该属性需要哪个 Feature 才会存在。 点击属性 ID 可跳转到详细说明。
数值测量(MEA Feature)
| ID | 名称 | 类型 | Feature | 说明 |
|---|---|---|---|---|
0x00 |
MeasuredValue | float | MEA | 当前浓度,Nullable |
0x01 |
MinMeasuredValue | float | MEA | 传感器可测最低浓度,Nullable |
0x02 |
MaxMeasuredValue | float | MEA | 传感器可测最高浓度,Nullable |
0x07 |
Uncertainty | float | MEA | 测量不确定度 |
0x08 |
MeasurementUnit | enum8 | MEA | 测量单位(PPM / PPB 等) |
0x09 |
MeasurementMedium | enum8 | MEA | 测量介质(空气 / 水 / 土壤) |
峰值与均值测量
| ID | 名称 | 类型 | Feature | 说明 |
|---|---|---|---|---|
0x03 |
PeakMeasuredValue | float | PEA | 窗口期内的峰值浓度,Nullable |
0x04 |
PeakMeasuredValueWindow | uint32 | PEA | 峰值统计窗口(秒) |
0x05 |
AverageMeasuredValue | float | AVG | 窗口期内的平均浓度,Nullable |
0x06 |
AverageMeasuredValueWindow | uint32 | AVG | 均值统计窗口(秒) |
等级指示(LEV Feature)
| ID | 名称 | 类型 | Feature | 说明 |
|---|---|---|---|---|
0x0A |
LevelValue | enum8 | LEV | 当前浓度等级(Low / Medium / High / Critical) |
属性详解
MeasuredValue(当前浓度)
传感器最近一次测量到的 CO2 浓度值。这是整个 Cluster 最核心的属性。 与温度 Cluster 不同,浓度 Cluster 使用 float 类型,值就是实际浓度,不需要换算。
- 类型: float(单精度浮点数)
- 单位: 由
MeasurementUnit属性决定(通常是 PPM) - Nullable: 为
null时表示传感器数据无效或尚未完成首次测量 - Feature: MEA
400 ppm = 室外新鲜空气 |
600~800 ppm = 通风良好的室内 |
1000~1500 ppm = 需要开窗通风 |
2000+ ppm = 明显不适,必须换气 |
5000 ppm = 职业安全上限
MinMeasuredValue(可测最低浓度)
传感器能够测量的最低浓度值。App 可以用它来设置显示范围的下限。 对于 CO2 传感器,通常是 400 ppm(大气本底浓度)。
- 类型: float,Nullable
- Feature: MEA
MaxMeasuredValue(可测最高浓度)
传感器能够测量的最高浓度值。当 MeasuredValue 接近此上限时,
可能意味着传感器已超出正常工作范围。对于 CO2 传感器,常见上限是 5000 或 10000 ppm。
- 类型: float,Nullable
- Feature: MEA
PeakMeasuredValue(峰值浓度)
在 PeakMeasuredValueWindow 指定的时间窗口内,传感器记录到的最高浓度值。
用于追踪「最近 24 小时内最差的空气质量发生在什么浓度」。
- 类型: float,Nullable
- Feature: PEA(依赖 MEA)
PeakMeasuredValueWindow(峰值统计窗口)
PeakMeasuredValue 的统计时间窗口,单位秒。例如 86400 表示峰值是过去 24 小时内的最大值。
窗口到期后,PeakMeasuredValue 会重置并重新统计。
- 类型: elapsed-s(uint32,经过的秒数)
- Feature: PEA
AverageMeasuredValue(平均浓度)
在 AverageMeasuredValueWindow 指定的时间窗口内,浓度的算术平均值。
均值比实时值更稳定,适合用于趋势分析和空气质量评分。
- 类型: float,Nullable
- Feature: AVG(依赖 MEA)
AverageMeasuredValueWindow(均值统计窗口)
AverageMeasuredValue 的统计时间窗口,单位秒。例如 3600 表示平均值是过去 1 小时的均值。
- 类型: elapsed-s(uint32,经过的秒数)
- Feature: AVG
Uncertainty(测量不确定度)
传感器的测量精度,单位与 MeasurementUnit 一致。
例如值为 15.0 且单位是 PPM,表示测量精度为 ±15 ppm。
做浓度阈值触发自动化时,应将不确定度纳入考量。
- 类型: float
- Feature: MEA
MeasurementUnit(测量单位)
声明 MeasuredValue 等数值属性使用的计量单位。
对于 CO2 传感器,绝大多数使用 PPM(百万分之一)。
详细枚举值见下方 MeasurementUnitEnum。
- 类型: enum8
- Feature: MEA
MeasurementMedium(测量介质)
声明传感器测量的是哪种介质中的浓度。CO2 传感器几乎都是 Air(空气),
但浓度测量 Cluster 家族还涵盖水质监测(Water)和土壤监测(Soil)等场景。
详细枚举值见下方 MeasurementMediumEnum。
- 类型: enum8
- Feature: MEA
LevelValue(浓度等级)
设备自行判定的当前浓度等级。适用于不需要精确数值的场景 —— 比如简单的红绿灯指示。
注意:如果设备没有 MED Feature,LevelValue 不会返回 Medium;
没有 CRI Feature,不会返回 Critical。
详细枚举值见下方 LevelValueEnum。
- 类型: enum8
- Feature: LEV
命令
CarbonDioxideConcentrationMeasurement 是一个纯只读的 Server Cluster,没有任何命令。 设备负责采集 CO2 浓度并更新属性,App 端只需读取(Read)或订阅(Subscribe)即可获取数据。
枚举值速查
MeasurementUnitEnum(测量单位)
MeasurementMediumEnum(测量介质)
LevelValueEnum(浓度等级)
示例数据
读取一个室内 CO2 传感器的全部属性(典型室内环境,约 800 ppm):
{
// --- CarbonDioxideConcentrationMeasurement Cluster(Endpoint 1)---
// 数值测量(MEA Feature)
"0x00": 823.5, // MeasuredValue = 823.5 ppm(当前 CO2 浓度)
"0x01": 400.0, // MinMeasuredValue = 400 ppm(传感器下限)
"0x02": 5000.0, // MaxMeasuredValue = 5000 ppm(传感器上限)
"0x07": 15.0, // Uncertainty = ±15 ppm
// 测量单位与介质(MEA Feature)
"0x08": 0, // MeasurementUnit = PPM
"0x09": 0, // MeasurementMedium = Air(空气)
// 峰值测量(PEA Feature)
"0x03": 1250.0, // PeakMeasuredValue = 1250 ppm(历史峰值)
"0x04": 86400, // PeakMeasuredValueWindow = 86400 秒(24 小时窗口)
// 均值测量(AVG Feature)
"0x05": 680.5, // AverageMeasuredValue = 680.5 ppm(平均值)
"0x06": 3600, // AverageMeasuredValueWindow = 3600 秒(1 小时窗口)
// 等级指示(LEV Feature)
"0x0A": 2 // LevelValue = Medium(中等)
}
读取请求示例 —— 一次性获取 Cluster 全部属性:
{
// 一次性读取 CO2 Cluster 全部属性
"readRequests": [{
"attributePath": {
"endpointId": 1,
"clusterId": "0x040D"
// 不指定 attributeId → 读取全部属性
}
}]
}
订阅 CO2 浓度变化 —— 实时跟踪空气质量:
{
// 订阅 CO2 浓度变化(每 30 秒~5 分钟上报一次)
"subscribeRequests": [{
"attributePath": {
"endpointId": 1,
"clusterId": "0x040D",
"attributeId": "0x00" // MeasuredValue
},
"minIntervalFloor": 30,
"maxIntervalCeiling": 300
}]
}
温度 Cluster(0x0402)使用 int16 类型,值以 0.01°C 为单位,需要除以 100 转换。
浓度 Cluster 使用 float 类型,值直接就是实际浓度,不需要任何换算。
但必须读取 MeasurementUnit 确认单位是 PPM 还是其他。
常见场景
场景 1:新风系统自动通风控制
根据 CO2 浓度自动调节新风系统的风量,维持室内空气质量。
- 订阅
MeasuredValue (0x00),设置 30 秒 ~ 2 分钟的上报间隔 - 确认
MeasurementUnit (0x08)为 PPM(不同单位需要不同的阈值) - 设定多级阈值触发通风策略:
< 600 ppm:低速或关闭新风600 ~ 1000 ppm:中速运行> 1000 ppm:全速运行
- 考虑
Uncertainty (0x07)做防抖 —— 如果不确定度是 ±15 ppm,阈值附近加 15 ppm 的滞回区,避免频繁切换 - 配合 FanControl Cluster(0x0202)控制新风系统风速
场景 2:空气质量仪表盘
在 App 首页展示室内空气质量综合面板。
- 读取
FeatureMap (0xFFFC)确认设备能力,决定 UI 展示内容 - 有
MEA:显示精确数值和量程范围(Min/Max),用渐变色条表示当前位置 - 有
LEV:显示等级徽章(Low/Medium/High/Critical),颜色编码直观提示 - 有
PEA:显示「今日峰值」卡片,读取PeakMeasuredValue (0x03)和窗口时长 - 有
AVG:显示「平均值」趋势线,AverageMeasuredValue (0x05)比实时值更适合做趋势展示 - 处理
null值 —— 展示「--」或「传感器离线」,不要显示 0
场景 3:教室 CO2 监测与告警
学校教室部署 CO2 传感器,浓度过高时通知教师开窗或启动排风。
- 订阅
MeasuredValue (0x00)和LevelValue (0x0A)(如果设备支持 LEV) - LevelValue 变为
High (3)或Critical (4)时推送告警通知 - 如果设备只有 MEA 没有 LEV,App 自行判定:
> 1500 ppm:推送「建议开窗通风」> 2500 ppm:推送「CO2 浓度过高,请立即通风」
- 利用
AverageMeasuredValue (0x05)分析每日 CO2 规律 —— 例如下午 2 点课后浓度最高,提前安排通风 - 连续多天峰值超标(
PeakMeasuredValue > 2000)时,建议检查教室通风系统