光照度测量 Cluster(IlluminanceMeasurement)

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

IlluminanceMeasurement 用于上报环境光照强度(单位 lux)。 这是一个纯只读的 Server Cluster —— 没有任何命令,只有 5 个属性。 光照传感器、多合一环境传感器、智能窗帘控制器等设备会用到它。

关键陷阱:对数刻度,不是线性值

MeasuredValue 不是 lux 的直接值,而是经过对数变换后的整数:

MeasuredValue = 10000 × log10(lux) + 1

反向换算(App 必须做的):

lux = 10(MeasuredValue - 1) / 10000

例如设备返回 10001,实际光照是 10 lux,不是一万多 lux。 直接展示原始值会让用户误以为亮度极高。展示前必须做对数反转。

常见 MeasuredValue 速查

1 = 1 lux(月光) |  10001 = 10 lux(昏暗走廊) |  20001 = 100 lux(普通室内) |  30001 = 1000 lux(阴天户外) |  40001 = 10000 lux(晴天户外)

值为 0 表示光照低于传感器可测下限;值为 null 表示传感器尚未完成测量或数据无效,App 应显示"--"。

属性总览

IlluminanceMeasurement 有 5 个属性,其中 MeasuredValue 是最核心的。点击属性 ID 可跳转到详细说明。

ID 名称 类型 读写 说明
0x00 MeasuredValue uint16 / null 只读 当前光照度(对数刻度),Nullable
0x01 MinMeasuredValue uint16 / null 只读 传感器可测最低光照度,Nullable
0x02 MaxMeasuredValue uint16 / null 只读 传感器可测最高光照度,Nullable
0x03 Tolerance uint16 只读 测量容差(对数刻度)
0x04 LightSensorType enum8 / null 只读 传感器类型,Nullable

属性详解

MeasuredValue(当前光照度)

传感器最近一次测量到的光照强度,采用对数刻度编码。这是整个 Cluster 最核心的属性。

  • 类型: uint16,Nullable
  • 有效范围: 1 ~ 65534(对应约 1 lux ~ 3.5 × 106 lux)
  • 特殊值: 0 = 光照低于可测下限;null = 数据无效或未完成测量
  • 换算: lux = 10(MeasuredValue - 1) / 10000
转换代码参考
{`// 设备返回 MeasuredValue
val rawValue: Int? = 10001    // Nullable,可能为 null
val lux = when {
    rawValue == null -> null           // 传感器未就绪
    rawValue == 0    -> 0.0            // 低于可测下限
    else -> Math.pow(10.0, (rawValue - 1).toDouble() / 10000.0)
}
// rawValue = 10001 → lux = 10.0
// rawValue = 20001 → lux = 100.0
// rawValue = 30001 → lux = 1000.0

// 显示时处理 null 和精度
val display = lux?.let { String.format("%.0f lux", it) } ?: "--"`}

MinMeasuredValue(可测最低光照度)

传感器能够测量的最低光照度值(对数刻度编码)。当 MeasuredValue 为 0 时, 表示实际光照低于此下限。

  • 类型: uint16,Nullable
  • 范围: 1 ~ 65533
  • Nullable: 为 null 时表示设备未定义下限

MaxMeasuredValue(可测最高光照度)

传感器能够测量的最高光照度值(对数刻度编码)。 MeasuredValue 不会超过此值。

  • 类型: uint16,Nullable
  • 范围: 2 ~ 65534,且必须大于 MinMeasuredValue
  • Nullable: 为 null 时表示设备未定义上限

Tolerance(测量容差)

传感器的测量精度容差,同样采用对数刻度。这是可选属性,不是所有设备都上报。

  • 类型: uint16(无符号)
  • 范围: 0 ~ 2048

LightSensorType(传感器类型)

描述设备使用的光照传感器类型。不同传感器类型在光谱响应和灵敏度上有差异。 值为 null 表示传感器类型未知。

LightSensorTypeEnum 枚举值

0
Photodiode 光电二极管 — 响应快、线性度好,常见于专业照度计
1
CMOS CMOS 图像传感器 — 成本低、集成度高,常见于多合一传感器
null
Unknown 传感器类型未知

命令

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

示例数据

读取一个光照传感器的 IlluminanceMeasurement Cluster 属性:

{
  // --- IlluminanceMeasurement Cluster(Endpoint 1)---
  "0x0":  10001,       // MeasuredValue = 10001 → 10 lux(普通走廊照度)
  "0x1":  1,           // MinMeasuredValue = 1 → 1 lux
  "0x2":  50001,       // MaxMeasuredValue = 50001 → 100000 lux
  "0x3":  0,           // Tolerance = 0(未上报容差)
  "0x4":  0            // LightSensorType = Photodiode
}

订阅光照变化 —— 实时跟踪光照更新:

{
  // 订阅光照变化(每 10 秒~2 分钟上报一次)
  "subscribeRequests": [{
    "attributePath": {
      "endpointId": 1,
      "clusterId": "0x0400",
      "attributeId": "0x00"        // MeasuredValue
    },
    "minIntervalFloor": 10,        // 最少 10 秒上报一次
    "maxIntervalCeiling": 120      // 最多 2 分钟上报一次
  }]
}

常见场景

场景 1:读取并展示当前光照度
  1. 读取 MeasuredValue (0x00),先判断 null(传感器未就绪)和 0(低于可测下限)
  2. 对数反转:lux = 10(MeasuredValue - 1) / 10000
  3. 根据 lux 值选择合适的展示单位 —— 低于 1000 显示整数(如"320 lux"),超过 1000 可用"klux"(如"12.5 klux")
  4. 可选:读取 LightSensorType (0x04),在设备详情页展示传感器类型
场景 2:自动窗帘 / 灯光联动
  1. 订阅 MeasuredValue (0x00),持续监听光照变化
  2. 设定阈值 —— 例如低于 100 lux(对应 MeasuredValue ≈ 20001)时自动开灯,高于 500 lux(对应 ≈ 26990)时自动关灯
  3. 加入回差(Hysteresis) —— 开灯阈值和关灯阈值拉开差距,避免阴天云层间歇导致灯光反复开关
  4. 结合 OccupancySensing Cluster(0x0406):只在有人时响应光照变化,无人时保持关灯
场景 3:日照统计与节能分析
  1. 定时采样 MeasuredValue(如每 5 分钟一次),转换为 lux 后存储
  2. 按日统计光照曲线 —— 可以判断房间朝向、遮光效果
  3. 结合 LevelControl Cluster(0x0008)的调光记录,分析自然光利用率,优化灯光策略
  4. 对数刻度天然适合大范围光照记录 —— 从月光(1 lux)到直射阳光(100000 lux)都能精确表达