流量测量 Cluster(FlowMeasurement)

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

FlowMeasurement 用于测量液体或气体的流速,是一个纯只读的传感器 Cluster —— 只有 4 个属性,没有任何命令。 设备作为 Server 角色被动上报流量数据,App(Client)读取或订阅即可。 常见于水流量传感器、气体流量计、HVAC 风量检测装置等设备。

流量单位陷阱:0.1 m³/h

所有流量属性的值都以 0.1 m³/h(立方米每小时)为单位。设备返回 150,实际流量是 15.0 m³/h; 返回 23,实际流量是 2.3 m³/h。 展示时必须除以 10,否则用户会看到「150 立方米每小时」的离谱数值。

null 值含义

MeasuredValue、MinMeasuredValue、MaxMeasuredValue 都是 Nullable。 返回 null 表示当前数据无效或传感器尚未完成测量。App 应展示「--」而非 0。

属性总览

FlowMeasurement 只有四个属性,其中 MeasuredValue 是最常用的。点击属性 ID 可跳转到详细说明。

ID 名称 类型 读写 说明
0x00 MeasuredValue uint16 只读 当前流量(单位 0.1 m³/h),Nullable
0x01 MinMeasuredValue uint16 只读 传感器可测最低流量,Nullable
0x02 MaxMeasuredValue uint16 只读 传感器可测最高流量,Nullable
0x03 Tolerance uint16 只读 测量精度容差(单位 0.1 m³/h)

属性详解

MeasuredValue(当前测量流量)

传感器最近一次测量到的流量值,单位 0.1 m³/h。这是整个 Cluster 最核心的属性。

  • 类型: uint16(无符号)
  • 范围: 0 到 65534
  • Nullable: 为 null 时表示传感器数据无效或尚未完成首次测量
  • 换算: 实际流量 = MeasuredValue / 10(单位 m³/h)
常见值速查

0 = 0.0 m³/h  |  50 = 5.0 m³/h  |  150 = 15.0 m³/h  |  1000 = 100.0 m³/h  |  5000 = 500.0 m³/h

MinMeasuredValue(可测最低流量)

传感器能够测量的最低流量值,单位 0.1 m³/h。App 可以用它来设置流量显示范围的下限,或判断当前读数是否已经触底。

  • 类型: uint16,Nullable
  • 范围: 0 到 MaxMeasuredValue - 1
  • Nullable: 为 null 时表示设备未定义下限

MaxMeasuredValue(可测最高流量)

传感器能够测量的最高流量值,单位 0.1 m³/h。当 MeasuredValue 接近此上限时,可能意味着流量已超出传感器正常工作范围。

  • 类型: uint16,Nullable
  • 范围: MinMeasuredValue + 1 到 65534
  • Nullable: 为 null 时表示设备未定义上限

Tolerance(测量容差)

传感器的测量精度容差,单位 0.1 m³/h。例如值为 10,表示测量精度为 ±1.0 m³/h。 这个属性是可选的,不是所有设备都上报。

  • 类型: uint16(无符号,容差不会为负)
  • 范围: 0 到 2048(即 0 到 ±204.8 m³/h)
Tolerance 的实际用途

如果传感器报告 MeasuredValue = 150(15.0 m³/h)且 Tolerance = 10(±1.0 m³/h), 那么实际流量在 14.0 m³/h ~ 16.0 m³/h 之间。做流量阈值触发自动化时,应将容差纳入考量,避免在阈值附近频繁触发报警。

命令

FlowMeasurement 是一个纯只读的 Server Cluster,没有任何命令。 设备负责采集流量数据并更新属性,App 端只需读取(Read)或订阅(Subscribe)即可获取数据。

示例数据

读取一个水流量传感器的 FlowMeasurement Cluster 属性:

{
  // --- FlowMeasurement Cluster(Endpoint 1)---
  "0x0": 150,        // MeasuredValue = 150 → 实际 15.0 m³/h
  "0x1": 0,          // MinMeasuredValue = 0 → 实际 0.0 m³/h
  "0x2": 5000,       // MaxMeasuredValue = 5000 → 实际 500.0 m³/h
  "0x3": 10          // Tolerance = 10 → 实际 ±1.0 m³/h
}

读取请求示例 —— 一次性获取 Cluster 全部属性:

{
  // 读取流量传感器的所有属性
  "readRequests": [{
    "attributePath": {
      "endpointId": 1,
      "clusterId": "0x0404"
      // 不指定 attributeId → 读取该 Cluster 全部属性
    }
  }]
}

订阅流量变化 —— 实时跟踪流量更新:

{
  // 订阅流量变化(每 10 秒~2 分钟上报一次)
  "subscribeRequests": [{
    "attributePath": {
      "endpointId": 1,
      "clusterId": "0x0404",
      "attributeId": "0x00"        // MeasuredValue
    },
    "minIntervalFloor": 10,        // 最少 10 秒上报一次
    "maxIntervalCeiling": 120      // 最多 2 分钟上报一次
  }]
}
流量转换代码参考

处理设备返回值时的关键逻辑:

{`// 设备返回 MeasuredValue = 150
val rawValue: Int? = 150    // Nullable,可能为 null
val flowRate = rawValue?.let { it / 10.0 }  // → 15.0 m³/h
val flowLiterPerMin = flowRate?.let { it * 1000.0 / 60.0 }  // → 250.0 L/min

// 显示时处理 null
val display = flowRate?.let { String.format("%.1f m³/h", it) } ?: "--"`}

常见场景

场景 1:家庭水流监测
  1. 订阅 MeasuredValue (0x00),设置合理的上报间隔(如 10 秒 ~ 2 分钟)
  2. 收到新值后除以 10,得到实际流量:150 → 15.0 m³/h
  3. 处理 null 值 —— 展示「--」或「传感器离线」,不要显示 0
  4. 设定异常流量阈值 —— 例如凌晨持续检测到流量大于 0,可能存在漏水,触发报警通知
  5. 可选:累计流量统计,定期读取 MeasuredValue 并按时间积分估算用水量
场景 2:HVAC 风量检测
  1. 订阅 MeasuredValue (0x00),持续监听风管内气体流量变化
  2. 读取 MinMeasuredValue / MaxMeasuredValue 确认传感器量程,判断当前风量是否在正常工作范围内
  3. 考虑 Tolerance 容差 —— 如果容差为 ±1.0 m³/h,阈值设定时应留出裕量,避免在边界值频繁触发
  4. 配合 FanControl Cluster(0x0202)实现闭环控制:流量传感器报告实际风量,风扇控制器调整转速以维持目标风量