气压测量 Cluster(PressureMeasurement)
Cluster ID: 0x0403 |
所在 Endpoint: 通常在 Endpoint 1+(功能端点)
PressureMeasurement 用于上报大气压/气压传感器测量到的压力值。 这个 Cluster 是纯只读的 —— 没有 Command,设备作为 Server 被动上报数据,App(Client)读取或订阅即可。 常见于气象站、温湿度气压计、HVAC 系统等设备。
MeasuredValue 的单位是 kPa(千帕),不是气象领域常用的 hPa(百帕)。
标准大气压 ≈ 101.325 kPa = 1013.25 hPa,所以设备返回的值大约在 101 左右。
如果需要展示 hPa,需要 乘以 10:101 kPa × 10 = 1010 hPa。
MeasuredValue、MinMeasuredValue、MaxMeasuredValue 都是 Nullable。
返回 null 表示传感器数据无效或尚未完成测量。App 应展示「--」而非 0。
Feature Map
PressureMeasurement 定义了一个可选 Feature,用于提供更高精度的压力数据。
| Bit | 名称 | 代码 | 说明 |
|---|---|---|---|
| 0 | Extended | EXT |
扩展精度 —— 启用 ScaledValue 等高精度属性 |
基础属性 MeasuredValue 是 int16 类型,单位 kPa,精度只到 1 kPa。
对于气象应用来说太粗 —— 天气变化引起的气压波动通常只有几个 hPa(零点几 kPa)。
启用 EXT 后,设备可以通过 ScaledValue + Scale(指数)提供任意精度的压力值。
基础属性
以下 4 个属性所有 PressureMeasurement 设备都支持。点击属性 ID 可跳转到详细说明。
| ID | 名称 | 类型 | 读写 | 说明 |
|---|---|---|---|---|
0x00 |
MeasuredValue | int16 / null | 只读 | 当前气压(单位 kPa),Nullable |
0x01 |
MinMeasuredValue | int16 / null | 只读 | 传感器可测最低气压,Nullable |
0x02 |
MaxMeasuredValue | int16 / null | 只读 | 传感器可测最高气压,Nullable |
0x03 |
Tolerance | uint16 | 只读 | 测量容差(单位 kPa) |
MeasuredValue(当前测量气压)
传感器最近一次测量到的气压值,单位 kPa。这是整个 Cluster 最核心的属性。
- 类型: int16(有符号),Nullable
- 范围: -32767 到 32767 kPa
- 换算:
hPa = MeasuredValue × 10
101 = 101 kPa ≈ 标准大气压 |
100 = 1000 hPa(低气压) |
103 = 1030 hPa(高气压) |
70 = 700 hPa(约海拔 3000m)
MinMeasuredValue(可测最低气压)
传感器能够测量的最低气压值,单位 kPa。
值为 null 时表示设备未定义下限。
MaxMeasuredValue(可测最高气压)
传感器能够测量的最高气压值,单位 kPa。
值为 null 时表示设备未定义上限。
Tolerance(测量容差)
传感器的测量精度容差,单位 kPa。例如值为 1,表示精度为 ±1 kPa(±10 hPa)。
可选属性,不是所有设备都上报。
扩展属性(EXT Feature)
以下属性仅在设备支持 EXT Feature 时存在,提供比基础 kPa 整数更高的精度。
| ID | 名称 | 类型 | 读写 | 说明 |
|---|---|---|---|---|
0x10 |
ScaledValue | int16 / null | 只读 | 高精度气压值,需配合 Scale 换算 |
0x11 |
MinScaledValue | int16 / null | 只读 | ScaledValue 的最小值,Nullable |
0x12 |
MaxScaledValue | int16 / null | 只读 | ScaledValue 的最大值,Nullable |
0x13 |
ScaledTolerance | uint16 | 只读 | ScaledValue 的测量容差 |
0x14 |
Scale | int8 | 只读 | 指数因子,实际值 = ScaledValue × 10Scale kPa |
ScaledValue(高精度气压值)
高精度的压力测量值,需要配合 Scale 属性换算:
实际压力 = ScaledValue × 10Scale kPa
ScaledValue = 10132,Scale = -1
实际压力 = 10132 × 10-1 = 1013.2 hPa = 101.32 kPa
ScaledValue = 101325... 不可能,int16 最大 32767。
所以 Scale 的选择决定了精度和量程的平衡 —— Scale = -1 时精度 0.1 kPa(1 hPa),
Scale = -2 时精度 0.01 kPa 但量程缩小到 ±327.67 kPa。
MinScaledValue / MaxScaledValue
ScaledValue 的有效范围上下限,含义与基础属性的 Min/Max 对应。
同样是 Nullable,为 null 表示未定义。换算方式与 ScaledValue 一致(乘以 10Scale)。
ScaledTolerance(扩展容差)
ScaledValue 的测量精度容差,换算方式同上。
例如 ScaledTolerance = 10,Scale = -1,则精度为 ±1 hPa。
Scale(指数因子)
int8 类型的指数值,决定 ScaledValue 系列属性的实际精度。 常见值:
0—— 与基础属性相同,单位 kPa,无额外精度-1—— 精度 0.1 kPa(= 1 hPa),最常用-2—— 精度 0.01 kPa(= 0.1 hPa),高精度气象站
命令
PressureMeasurement 是一个纯只读的 Server Cluster,没有任何命令。 设备负责采集气压数据并更新属性,App 端只需读取(Read)或订阅(Subscribe)即可获取数据。
示例数据
读取一个气象站设备的 PressureMeasurement 基础属性:
{
// --- PressureMeasurement Cluster(Endpoint 1)---
"0x0": 101, // MeasuredValue = 101 → 实际 101 kPa(≈标准大气压)
"0x1": 30, // MinMeasuredValue = 30 → 30 kPa
"0x2": 110, // MaxMeasuredValue = 110 → 110 kPa
"0x3": 1 // Tolerance = 1 → ±1 kPa
}
支持 EXT Feature 的设备还会返回扩展属性:
{
// --- 扩展精度属性(需要 EXT Feature)---
"0x10": 10132, // ScaledValue = 10132,Scale = -1 → 10132 × 10⁻¹ = 1013.2 kPa?
// 不,Scale 用于细分:10132 × 10⁻¹ = 1013.2 hPa = 101.32 kPa
"0x11": 3000, // MinScaledValue = 3000
"0x12": 11000, // MaxScaledValue = 11000
"0x13": 10, // ScaledTolerance = 10
"0x14": -1 // Scale = -1(指数)
// 实际值 = ScaledValue × 10^Scale kPa = 10132 × 0.1 = 1013.2 hPa
}
订阅气压变化 —— 实时跟踪气压趋势:
{
// 订阅气压变化(每 60 秒~10 分钟上报一次)
"subscribeRequests": [{
"attributePath": {
"endpointId": 1,
"clusterId": "0x0403",
"attributeId": "0x00" // MeasuredValue
},
"minIntervalFloor": 60, // 最少 60 秒上报一次
"maxIntervalCeiling": 600 // 最多 10 分钟上报一次
}]
}
处理设备返回值时的关键逻辑:
{`// 基础属性:MeasuredValue 单位 kPa
val rawKpa: Int? = 101 // Nullable
val hPa = rawKpa?.let { it * 10.0 } // → 1010.0 hPa
val display = hPa?.let { "%.0f hPa".format(it) } ?: "--"
// EXT 扩展属性:ScaledValue + Scale
val scaled: Int? = 10132
val scale: Int = -1
val actualKpa = scaled?.let { it * Math.pow(10.0, scale.toDouble()) } // → 1013.2 hPa
val displayExt = actualKpa?.let { "%.1f hPa".format(it) } ?: "--"`}
常见场景
场景 1:气象站 —— 气压趋势监测
- 检查设备 FeatureMap 是否包含
EXT(bit 0),有则优先使用ScaledValue获取高精度数据 - 订阅气压变化,记录历史数据绘制趋势图
- 气压持续下降(3 小时内下降 > 3 hPa)通常预示天气转差,可推送提醒
- 展示时建议使用 hPa(气象习惯),基础属性
MeasuredValue × 10即可
场景 2:海拔高度估算
- 利用气压与海拔的关系进行粗略估算(气压测高法)
- 国际标准大气近似公式:
海拔(m) ≈ 44330 × (1 - (P/P₀)^0.1903),P₀ = 101.325 kPa - 精度受温度、湿度、天气系统影响较大,仅供参考
- 建议使用 EXT 扩展属性以获得更精确的气压值,提高海拔估算准确度
场景 3:HVAC 气压监控
- 洁净室、实验室等场景需要监控室内外压差
- 订阅
MeasuredValue,设定正压/负压阈值 - 压差异常时触发报警或自动调节新风系统
- 结合 TemperatureMeasurement(0x0402)和 RelativeHumidityMeasurement(0x0405)实现环境综合监控