一氧化碳浓度测量 Cluster(CarbonMonoxideConcentrationMeasurement)

Cluster ID: 0x040C  |  所在 Endpoint: 通常在 Endpoint 1(功能端点)

该 Cluster 用于报告空气中一氧化碳(CO)的浓度,属于 Matter 浓度测量(Concentration Measurement)家族。 它与 CO2、PM2.5 等浓度测量 Cluster 共享相同的属性结构、Feature 位图和枚举定义, 只是测量对象和安全阈值不同。

安全关键 — CO 是无色无味的致命气体

一氧化碳中毒是家庭意外死亡的主要原因之一。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(浓度等级)

0
Unknown 未知(传感器初始化中)
1
Low 正常 — 浓度处于安全范围
2
Medium 需关注 — 浓度偏高(需 MED Feature)
3
High 危险 — 需要立即通风
4
Critical 危急 — 立即撤离(需 CRI Feature)

MeasurementUnitEnum(测量单位)

0
PPM 百万分之一 — CO 传感器最常用单位
1
PPB 十亿分之一(高精度场景)
2
PPT 万亿分之一(极少用于 CO)
3
MGM3 毫克/立方米(mg/m³)
4
UGM3 微克/立方米(μg/m³)
5
NGM3 纳克/立方米(ng/m³)
6
PM3 颗粒/立方米(不适用于 CO)
7
BQM3 贝克勒尔/立方米(不适用于 CO)

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 监测 + 排风扇自动启停

车库是 CO 积聚的高风险区域(汽车怠速、燃油设备)。典型方案:

  1. Subscribe MeasuredValue (0x0000),间隔 10~30 秒
  2. 浓度超过 9 ppm 时,通过自动化规则启动排风扇(OnOff Cluster)
  3. 浓度超过 35 ppm 时,推送手机通知,提醒用户检查车辆是否在运行
  4. 浓度回落到 5 ppm 以下并保持 5 分钟后,关闭排风扇

回落阈值(5 ppm)低于启动阈值(9 ppm)是为了避免排风扇频繁启停 —— 这是典型的迟滞控制策略。

场景二:厨房燃气安全

厨房 CO 传感器 + 燃气阀门联动

燃气灶不完全燃烧会产生 CO。在厨房场景中:

  1. Subscribe LevelValue (0x000A),关注等级跳变
  2. LevelValue 跳到 Medium (2):推送通知「厨房 CO 偏高,请检查燃气灶」
  3. LevelValue 跳到 High (3):触发紧急自动化 —— 关闭智能燃气阀门、打开油烟机/排气扇、全屋警报
  4. 同步检查 SmokeCOAlarm 的 COState,确认本地报警是否已触发

注意:厨房烹饪时 CO 短暂升高是正常的(尤其是炒菜、烤肉), 可以结合 AverageMeasuredValue 判断是持续泄漏还是短暂波动,避免误报。

开发建议

实现要点
  1. 先读 FeatureMap — 不是所有 CO 传感器都支持 ppm 数值,便宜的设备可能只有 LEV(等级),没有 MEA(数值)
  2. Subscribe 优先于轮询 — CO 浓度变化需要及时响应,用 Subscribe 而不是定时 Read
  3. 处理 null — MeasuredValue 为 null 表示传感器读数无效(预热中、故障等),UI 应显示「传感器初始化中」而非 0
  4. 注意单位 — 虽然绝大多数 CO 传感器用 PPM,但仍应检查 MeasurementUnit,避免将 PPB 误当 PPM 显示
  5. 该 Cluster 没有命令 — 它是纯只读的传感器数据上报,不存在 Client → Server 的命令