气压测量 Cluster(PressureMeasurement)

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

PressureMeasurement 用于上报大气压/气压传感器测量到的压力值。 这个 Cluster 是纯只读的 —— 没有 Command,设备作为 Server 被动上报数据,App(Client)读取或订阅即可。 常见于气象站、温湿度气压计、HVAC 系统等设备。

单位是 kPa,不是 hPa!

MeasuredValue 的单位是 kPa(千帕),不是气象领域常用的 hPa(百帕)。 标准大气压 ≈ 101.325 kPa = 1013.25 hPa,所以设备返回的值大约在 101 左右。 如果需要展示 hPa,需要 乘以 10:101 kPa × 10 = 1010 hPa。

null 值含义

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

Feature Map

PressureMeasurement 定义了一个可选 Feature,用于提供更高精度的压力数据。

Bit 名称 代码 说明
0 Extended EXT 扩展精度 —— 启用 ScaledValue 等高精度属性
EXT 有什么用?

基础属性 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:气象站 —— 气压趋势监测
  1. 检查设备 FeatureMap 是否包含 EXT(bit 0),有则优先使用 ScaledValue 获取高精度数据
  2. 订阅气压变化,记录历史数据绘制趋势图
  3. 气压持续下降(3 小时内下降 > 3 hPa)通常预示天气转差,可推送提醒
  4. 展示时建议使用 hPa(气象习惯),基础属性 MeasuredValue × 10 即可
场景 2:海拔高度估算
  1. 利用气压与海拔的关系进行粗略估算(气压测高法)
  2. 国际标准大气近似公式:海拔(m) ≈ 44330 × (1 - (P/P₀)^0.1903),P₀ = 101.325 kPa
  3. 精度受温度、湿度、天气系统影响较大,仅供参考
  4. 建议使用 EXT 扩展属性以获得更精确的气压值,提高海拔估算准确度
场景 3:HVAC 气压监控
  1. 洁净室、实验室等场景需要监控室内外压差
  2. 订阅 MeasuredValue,设定正压/负压阈值
  3. 压差异常时触发报警或自动调节新风系统
  4. 结合 TemperatureMeasurement(0x0402)和 RelativeHumidityMeasurement(0x0405)实现环境综合监控