一氧化碳浓度测量 Cluster(CarbonMonoxideConcentrationMeasurement)
Cluster ID: 0x040C |
所在 Endpoint: 通常在 Endpoint 1(功能端点)
该 Cluster 用于报告空气中一氧化碳(CO)的浓度,属于 Matter 浓度测量(Concentration Measurement)家族。 它与 CO2、PM2.5 等浓度测量 Cluster 共享相同的属性结构、Feature 位图和枚举定义, 只是测量对象和安全阈值不同。
一氧化碳中毒是家庭意外死亡的主要原因之一。CO 传感器数据必须可靠传输、及时报警, App 对 CO 读数的处理需要格外谨慎:
- 不要对 CO 读数做过度的平滑或延迟,避免掩盖突发峰值
- LevelValue 跳到
Warning或以上时,应立即推送通知 - 该 Cluster 通常与 SmokeCOAlarm(0x005C) 配合使用 —— SmokeCOAlarm 负责本地声光报警,本 Cluster 提供精确的 ppm 数值供远程监控和趋势分析
Feature 位图
浓度测量 Cluster 共享同一套 Feature 定义,设备通过 FeatureMap (0xFFFC) 声明支持哪些能力。
Feature 决定了哪些属性可用 —— 读取前务必先检查。
| Bit | 缩写 | 名称 | 说明 |
|---|---|---|---|
| 0 | MEA | NumericMeasurement | 支持精确数值测量(MeasuredValue / Min / Max) |
| 1 | LEV | LevelIndication | 支持等级判定(LevelValue: Low / Medium / High / Critical) |
| 2 | MED | MediumLevel | LEV 的扩展 — LevelValue 可报告 Medium 等级 |
| 3 | CRI | CriticalLevel | LEV 的扩展 — LevelValue 可报告 Critical 等级 |
| 4 | PEA | PeakMeasurement | MEA 的扩展 — 记录峰值(PeakMeasuredValue) |
| 5 | AVG | AverageMeasurement | MEA 的扩展 — 记录时间窗口内均值 |
大多数 CO 传感器至少支持 MEA + LEV(数值 + 等级)。
安全等级较高的设备会加上 CRI(区分危急等级)和 PEA(记录峰值,用于事后分析)。
属性总览
所有属性均为只读,App 端通过 Read / Subscribe 获取数据。
| ID | 名称 | 类型 | 依赖 Feature | 说明 |
|---|---|---|---|---|
0x0000 |
MeasuredValue | float (nullable) | MEA | 当前 CO 浓度(单位见 MeasurementUnit),null 表示无效 |
0x0001 |
MinMeasuredValue | float (nullable) | MEA | 传感器可测最小值 |
0x0002 |
MaxMeasuredValue | float (nullable) | MEA | 传感器可测最大值(量程上限) |
0x0003 |
PeakMeasuredValue | float (nullable) | PEA | 时间窗口内的峰值 |
0x0004 |
PeakMeasuredValueWindow | uint32 | PEA | 峰值统计的时间窗口(秒) |
0x0005 |
AverageMeasuredValue | float (nullable) | AVG | 时间窗口内的均值 |
0x0006 |
AverageMeasuredValueWindow | uint32 | AVG | 均值统计的时间窗口(秒) |
0x0007 |
Uncertainty | float | MEA | 测量不确定度(±范围) |
0x0008 |
MeasurementUnit | enum8 | MEA | 测量单位(PPM / PPB / ...) |
0x0009 |
MeasurementMedium | enum8 | — | 测量介质(Air / Water / Soil) |
0x000A |
LevelValue | enum8 | LEV | 当前浓度等级(Low / Medium / High / Critical) |
关键枚举
以下枚举与所有浓度测量 Cluster 共享,此处仅列出 CO 场景下最常用的两个。
LevelValueEnum(浓度等级)
MeasurementUnitEnum(测量单位)
CO 安全阈值参考
以下阈值来自 WHO 和 UL 2034 标准,供 App 设计报警策略时参考。 实际设备的 LevelValue 等级划分由制造商设定,可能与此表不完全一致。
| 浓度范围 | 等级 | 含义 | 建议响应 |
|---|---|---|---|
< 9 ppm |
正常 | 室内空气质量良好 | 无需操作 |
9 ~ 35 ppm |
需关注 | 轻度升高,可能有燃气泄漏或通风不良 | 开窗通风,检查燃气设备 |
36 ~ 70 ppm |
警告 | 持续暴露可能引起头痛、头晕 | 立即通风,关闭可能的 CO 源 |
71 ~ 150 ppm |
危险 | 短时间内即可出现中毒症状 | 撤离房间,拨打急救电话 |
> 150 ppm |
致命 | 数分钟内可致意识丧失甚至死亡 | 立即撤离建筑,拨打 119/120 |
不同人群(老人、儿童、孕妇、心肺疾病患者)对 CO 的敏感度差异极大。
App 不应仅依赖 MeasuredValue 做安全判断 —— 应以设备报告的 LevelValue 为准,
并优先响应 SmokeCOAlarm Cluster 的报警状态。
与 SmokeCOAlarm 的配合
在实际产品中,CO 传感器设备通常同时实现两个 Cluster:
- SmokeCOAlarm(0x005C) — 负责本地声光报警和设备联动,提供
COState(Normal / Warning / Critical)等布尔式状态 - CarbonMonoxideConcentrationMeasurement(0x040C) — 提供精确的 ppm 数值,支持趋势分析和远程监控
两者的分工是:SmokeCOAlarm 管「报不报警」,本 Cluster 管「具体多少 ppm」。 App 的报警逻辑应以 SmokeCOAlarm 的状态为主,本 Cluster 的数值作为辅助信息展示。
示例数据
读取一个 CO 传感器设备的全部属性(FeatureMap = MEA + LEV + AVG):
{
// --- 浓度测量值 ---
"0x0000": 3.2, // MeasuredValue = 3.2 ppm(当前 CO 浓度)
"0x0001": 0.0, // MinMeasuredValue = 0 ppm
"0x0002": 1000.0, // MaxMeasuredValue = 1000 ppm(传感器量程上限)
"0x0003": null, // PeakMeasuredValue = null(未启用 PEA Feature)
"0x0004": null, // PeakMeasuredValueWindow(未启用)
"0x0005": 2.8, // AverageMeasuredValue = 2.8 ppm
"0x0006": 3600, // AverageMeasuredValueWindow = 3600 秒(1 小时均值)
// --- 不确定度 ---
"0x0007": 1.5, // Uncertainty = ±1.5 ppm
// --- 单位与介质 ---
"0x0008": 0, // MeasurementUnit = PPM
"0x0009": 0, // MeasurementMedium = Air(空气)
// --- 等级判定 ---
"0x000A": 0 // LevelValue = Low(正常)
}
订阅 CO 浓度和等级变化(推荐的最小间隔 10 秒,最大间隔 60 秒):
{
"subscribeRequests": [{
"attributePath": {
"endpointId": 1,
"clusterId": "0x040C",
"attributeId": "0x0000" // MeasuredValue
},
"minInterval": 10,
"maxInterval": 60
}, {
"attributePath": {
"endpointId": 1,
"clusterId": "0x040C",
"attributeId": "0x000A" // LevelValue
},
"minInterval": 10,
"maxInterval": 60
}]
}
应用场景
场景一:车库通风联动
车库是 CO 积聚的高风险区域(汽车怠速、燃油设备)。典型方案:
- Subscribe
MeasuredValue (0x0000),间隔 10~30 秒 - 浓度超过 9 ppm 时,通过自动化规则启动排风扇(OnOff Cluster)
- 浓度超过 35 ppm 时,推送手机通知,提醒用户检查车辆是否在运行
- 浓度回落到 5 ppm 以下并保持 5 分钟后,关闭排风扇
回落阈值(5 ppm)低于启动阈值(9 ppm)是为了避免排风扇频繁启停 —— 这是典型的迟滞控制策略。
场景二:厨房燃气安全
燃气灶不完全燃烧会产生 CO。在厨房场景中:
- Subscribe
LevelValue (0x000A),关注等级跳变 - LevelValue 跳到
Medium (2):推送通知「厨房 CO 偏高,请检查燃气灶」 - LevelValue 跳到
High (3):触发紧急自动化 —— 关闭智能燃气阀门、打开油烟机/排气扇、全屋警报 - 同步检查 SmokeCOAlarm 的
COState,确认本地报警是否已触发
注意:厨房烹饪时 CO 短暂升高是正常的(尤其是炒菜、烤肉),
可以结合 AverageMeasuredValue 判断是持续泄漏还是短暂波动,避免误报。
开发建议
- 先读 FeatureMap — 不是所有 CO 传感器都支持 ppm 数值,便宜的设备可能只有 LEV(等级),没有 MEA(数值)
- Subscribe 优先于轮询 — CO 浓度变化需要及时响应,用 Subscribe 而不是定时 Read
- 处理 null — MeasuredValue 为 null 表示传感器读数无效(预热中、故障等),UI 应显示「传感器初始化中」而非 0
- 注意单位 — 虽然绝大多数 CO 传感器用 PPM,但仍应检查 MeasurementUnit,避免将 PPB 误当 PPM 显示
- 该 Cluster 没有命令 — 它是纯只读的传感器数据上报,不存在 Client → Server 的命令