流量测量 Cluster(FlowMeasurement)
Cluster ID: 0x0404 |
所在 Endpoint: 通常在 Endpoint 1+(功能端点)
FlowMeasurement 用于测量液体或气体的流速,是一个纯只读的传感器 Cluster —— 只有 4 个属性,没有任何命令。 设备作为 Server 角色被动上报流量数据,App(Client)读取或订阅即可。 常见于水流量传感器、气体流量计、HVAC 风量检测装置等设备。
所有流量属性的值都以 0.1 m³/h(立方米每小时)为单位。设备返回 150,实际流量是 15.0 m³/h;
返回 23,实际流量是 2.3 m³/h。
展示时必须除以 10,否则用户会看到「150 立方米每小时」的离谱数值。
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)
如果传感器报告 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:家庭水流监测
- 订阅
MeasuredValue (0x00),设置合理的上报间隔(如 10 秒 ~ 2 分钟) - 收到新值后除以 10,得到实际流量:
150 → 15.0 m³/h - 处理
null值 —— 展示「--」或「传感器离线」,不要显示 0 - 设定异常流量阈值 —— 例如凌晨持续检测到流量大于 0,可能存在漏水,触发报警通知
- 可选:累计流量统计,定期读取
MeasuredValue并按时间积分估算用水量
场景 2:HVAC 风量检测
- 订阅
MeasuredValue (0x00),持续监听风管内气体流量变化 - 读取
MinMeasuredValue/MaxMeasuredValue确认传感器量程,判断当前风量是否在正常工作范围内 - 考虑
Tolerance容差 —— 如果容差为 ±1.0 m³/h,阈值设定时应留出裕量,避免在边界值频繁触发 - 配合 FanControl Cluster(0x0202)实现闭环控制:流量传感器报告实际风量,风扇控制器调整转速以维持目标风量