温度测量 Cluster(TemperatureMeasurement)
Cluster ID: 0x0402 |
所在 Endpoint: 通常在 Endpoint 1+(功能端点)
TemperatureMeasurement 是最简单的传感器 Cluster 之一 —— 只有 4 个属性,没有任何命令。 设备作为 Server 角色被动上报温度数据,App(Client)读取或订阅即可。 常见于温湿度传感器、温控器、空调面板等设备。
所有温度属性的值都以 0.01°C 为单位。设备返回 2550,实际温度是 25.50°C;
返回 -500,实际温度是 -5.00°C。
展示时必须除以 100,否则用户会看到「2550 度」。
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)
如果传感器报告 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:读取当前温度
- 读取
MeasuredValue (0x00)—— 先判断是否为null - 除以 100 转换为摄氏度:
2550 → 25.50°C - 如果需要华氏度,再做一次转换:
°F = °C × 9/5 + 32 - 可选:读取
Tolerance (0x03)评估数据可信度
场景 2:App 首页展示温度卡片
- 订阅
MeasuredValue (0x00),设置合理的上报间隔(如 30 秒 ~ 5 分钟) - 收到新值后除以 100,显示一位小数即可(如
25.5°C) - 处理
null值 —— 展示「--」或「传感器离线」,不要显示 0°C - 可选:读取
MinMeasuredValue/MaxMeasuredValue判断传感器量程,在异常时给出提示
场景 3:温度阈值自动化
- 订阅
MeasuredValue (0x00),持续监听温度变化 - 设定阈值时考虑
Tolerance—— 如果容差为 ±0.5°C,阈值设为 30°C,则实际触发范围是 29.5°C ~ 30.5°C - 加入防抖逻辑:温度在阈值附近波动时,要求连续 N 次超过阈值才触发,避免频繁开关空调/风扇
- 配合 Thermostat Cluster(0x0201)实现闭环控制:温度传感器报告室温,温控器调整设定点