温度测量 Cluster(TemperatureMeasurement)

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

TemperatureMeasurement 是最简单的传感器 Cluster 之一 —— 只有 4 个属性,没有任何命令。 设备作为 Server 角色被动上报温度数据,App(Client)读取或订阅即可。 常见于温湿度传感器、温控器、空调面板等设备。

温度单位陷阱:0.01°C

所有温度属性的值都以 0.01°C 为单位。设备返回 2550,实际温度是 25.50°C; 返回 -500,实际温度是 -5.00°C。 展示时必须除以 100,否则用户会看到「2550 度」。

null 值含义

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

属性总览

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

ID 名称 类型 读写 说明
0x00 MeasuredValue int16 只读 当前温度(单位 0.01°C),Nullable
0x01 MinMeasuredValue int16 只读 传感器可测最低温度,Nullable
0x02 MaxMeasuredValue int16 只读 传感器可测最高温度,Nullable
0x03 Tolerance uint16 只读 测量精度容差(单位 0.01°C)

属性详解

MeasuredValue(当前测量温度)

传感器最近一次测量到的温度值,单位 0.01°C。这是整个 Cluster 最核心的属性。

  • 类型: int16(有符号,支持负温度)
  • 范围: -27315(-273.15°C,绝对零度)到 32767(327.67°C)
  • Nullable: 为 null 时表示传感器数据无效或尚未完成首次测量
  • 换算: 实际温度 = MeasuredValue / 100
常见值速查

0 = 0.00°C  |  2000 = 20.00°C  |  2550 = 25.50°C  |  3700 = 37.00°C  |  -1000 = -10.00°C

MinMeasuredValue(可测最低温度)

传感器能够测量的最低温度值,单位 0.01°C。App 可以用它来设置温度显示范围的下限,或判断当前读数是否已经触底。

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

MaxMeasuredValue(可测最高温度)

传感器能够测量的最高温度值,单位 0.01°C。当 MeasuredValue 接近此上限时,可能意味着传感器已经超出正常工作范围。

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

Tolerance(测量容差)

传感器的测量精度容差,单位 0.01°C。例如值为 50,表示测量精度为 ±0.50°C。 这个属性是可选的,不是所有设备都上报。

  • 类型: uint16(无符号,容差不会为负)
  • 范围: 0 到 2048(即 0 到 ±20.48°C)
Tolerance 的实际用途

如果传感器报告 MeasuredValue = 2550(25.50°C)且 Tolerance = 50(±0.50°C), 那么实际温度在 25.00°C ~ 26.00°C 之间。做温度阈值触发自动化时,应将容差纳入考量,避免在阈值附近频繁触发。

命令

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

示例数据

读取一个温湿度传感器的 TemperatureMeasurement Cluster 属性:

{
  // --- TemperatureMeasurement Cluster(Endpoint 1)---
  "0x0": 2550,       // MeasuredValue = 2550 → 实际 25.50°C
  "0x1": -1000,      // MinMeasuredValue = -1000 → 实际 -10.00°C
  "0x2": 6000,       // MaxMeasuredValue = 6000 → 实际 60.00°C
  "0x3": 50          // Tolerance = 50 → 实际 ±0.50°C
}

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

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

订阅温度变化 —— 实时跟踪温度更新:

{
  // 订阅温度变化(每 30 秒~5 分钟上报一次)
  "subscribeRequests": [{
    "attributePath": {
      "endpointId": 1,
      "clusterId": "0x0402",
      "attributeId": "0x00"        // MeasuredValue
    },
    "minIntervalFloor": 30,        // 最少 30 秒上报一次
    "maxIntervalCeiling": 300      // 最多 5 分钟上报一次
  }]
}
温度转换代码参考

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

{`// 设备返回 MeasuredValue = 2550
val rawValue: Int? = 2550    // Nullable,可能为 null
val tempCelsius = rawValue?.let { it / 100.0 }  // → 25.50°C
val tempFahrenheit = tempCelsius?.let { it * 9.0 / 5.0 + 32 }  // → 77.90°F

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

常见场景

场景 1:读取当前温度
  1. 读取 MeasuredValue (0x00) —— 先判断是否为 null
  2. 除以 100 转换为摄氏度:2550 → 25.50°C
  3. 如果需要华氏度,再做一次转换:°F = °C × 9/5 + 32
  4. 可选:读取 Tolerance (0x03) 评估数据可信度
场景 2:App 首页展示温度卡片
  1. 订阅 MeasuredValue (0x00),设置合理的上报间隔(如 30 秒 ~ 5 分钟)
  2. 收到新值后除以 100,显示一位小数即可(如 25.5°C)
  3. 处理 null 值 —— 展示「--」或「传感器离线」,不要显示 0°C
  4. 可选:读取 MinMeasuredValue / MaxMeasuredValue 判断传感器量程,在异常时给出提示
场景 3:温度阈值自动化
  1. 订阅 MeasuredValue (0x00),持续监听温度变化
  2. 设定阈值时考虑 Tolerance —— 如果容差为 ±0.5°C,阈值设为 30°C,则实际触发范围是 29.5°C ~ 30.5°C
  3. 加入防抖逻辑:温度在阈值附近波动时,要求连续 N 次超过阈值才触发,避免频繁开关空调/风扇
  4. 配合 Thermostat Cluster(0x0201)实现闭环控制:温度传感器报告室温,温控器调整设定点