亮度控制 Cluster(LevelControl)

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

LevelControl 提供了对设备「可调级别」的完整控制能力 —— 最典型的场景是灯的亮度调节,但也适用于风扇转速、窗帘开合度等任何可以用数值表示「程度」的设备。 它定义了两组命令:一组不影响 OnOff 状态,另一组会联动 OnOff Cluster 的开关状态。

与 OnOff Cluster 的关系

LevelControl 通常和 OnOff Cluster(0x0006)配合使用。 带 WithOnOff 后缀的命令(如 MoveToLevelWithOnOff)会在亮度为 0 时自动关灯、在亮度大于 0 时自动开灯。 不带后缀的命令只调亮度,不动开关。

命令(Commands)

LevelControl 提供两组命令:基本组(0x00~0x03)和 WithOnOff 组(0x04~0x07)。 两组命令的参数完全一样,区别在于 WithOnOff 组会联动 OnOff Cluster 的开关状态。 此外还有一个频率控制命令(0x08),仅在设备支持 Frequency feature 时可用。

ID 名称 说明 联动 OnOff
0x00 MoveToLevel 移动到指定亮度 不联动
0x01 Move 持续向上/向下移动亮度 不联动
0x02 Step 按步进值调整亮度 不联动
0x03 Stop 停止正在进行的亮度移动 不联动
0x04 MoveToLevelWithOnOff 移动到指定亮度(联动开关) 联动
0x05 MoveWithOnOff 持续移动亮度(联动开关) 联动
0x06 StepWithOnOff 按步进值调整亮度(联动开关) 联动
0x07 StopWithOnOff 停止移动(联动开关) 联动
0x08 MoveToClosestFrequency 移动到最接近的频率值 不联动
过渡时间单位

所有命令中的 TransitionTime 参数单位是十分之一秒(0.1s)。 例如传入 10 表示 1 秒,传入 50 表示 5 秒。 如果传入 0xFFFF(65535),设备会使用 OnOffTransitionTime 属性的值作为默认过渡时间。

MoveToLevel —— 移动到指定亮度(0x00)

将 CurrentLevel 从当前值平滑过渡到指定的目标亮度。这是最常用的命令 —— App 上的亮度滑块松手时就是发这个命令。 不会影响 OnOff 状态,即使目标亮度是 0 也不会关灯。

参数类型说明
Leveluint8目标亮度值,范围 0~254
TransitionTimeuint16 / null过渡时间(0.1s 为单位)。null 使用 OnOffTransitionTime
OptionsMaskbitmap8选项掩码(见 OptionsBitmap)
OptionsOverridebitmap8选项覆盖值
使用场景与参数

用户在 App 上拖动亮度滑块时调用。发送前读取 MinLevel (0x02) 和 MaxLevel (0x03) 确认有效范围,将 UI 滑块的百分比映射到这个范围内。

Move —— 持续移动亮度(0x01)

让 CurrentLevel 以指定速率持续向上或向下变化,直到达到 MinLevel/MaxLevel 或收到 Stop 命令。 适合长按按钮持续调光的场景。

参数类型说明
MoveModeenum8移动方向:0 = Up,1 = Down(见 MoveModeEnum)
Rateuint8 / null每秒变化的单位数。null 使用 DefaultMoveRate
OptionsMaskbitmap8选项掩码
OptionsOverridebitmap8选项覆盖值
使用场景与参数

用户长按物理调光按钮时触发。按下时发送 Move(指定方向),松手时发送 Stop 停止变化。适合实体开关或遥控器的持续调光交互。

Step —— 按步进值调整亮度(0x02)

将 CurrentLevel 按指定步进值向上或向下调整一档。适合短按按钮「调亮一格」「调暗一格」的场景。

参数类型说明
StepModeenum8步进方向:0 = Up,1 = Down(见 StepModeEnum)
StepSizeuint8步进大小(变化的绝对值)
TransitionTimeuint16 / null过渡时间(0.1s 为单位)。null 使用 OnOffTransitionTime
OptionsMaskbitmap8选项掩码
OptionsOverridebitmap8选项覆盖值
使用场景与参数

用户短按物理按钮或 App 中的「+/-」按钮调光时使用。每次按下发送一次 Step 命令,实现逐级调光。典型步进值为 25~50(约 10%~20% 亮度变化)。

Stop —— 停止移动(0x03)

停止正在进行的 Move 或 Step 过渡。CurrentLevel 会保持在收到 Stop 命令时的值。

参数类型说明
OptionsMaskbitmap8选项掩码
OptionsOverridebitmap8选项覆盖值

MoveToLevelWithOnOff —— 移动到指定亮度(联动开关)(0x04)

功能与 MoveToLevel 完全相同,区别在于会联动 OnOff Cluster:目标亮度为 0 时自动关灯(OnOff 变为 Off),目标亮度大于 0 时自动开灯(OnOff 变为 On)。 App 调光时应优先使用这个命令,确保亮度和开关状态始终一致。

参数类型说明
Leveluint8目标亮度值,范围 0~254
TransitionTimeuint16 / null过渡时间(0.1s 为单位)
OptionsMaskbitmap8选项掩码
OptionsOverridebitmap8选项覆盖值
使用场景与参数

App 调光的首选命令。拖动亮度滑块到 0 时灯会自动关掉,拖到任意正值时灯会自动亮起,保证用户看到的 UI 状态与实际设备一致。

MoveWithOnOff —— 持续移动亮度(联动开关)(0x05)

功能与 Move 相同,但移动过程中会联动 OnOff 状态。参数与 Move 一致。

StepWithOnOff —— 按步进值调整亮度(联动开关)(0x06)

功能与 Step 相同,但步进过程中会联动 OnOff 状态。参数与 Step 一致。

StopWithOnOff —— 停止移动(联动开关)(0x07)

功能与 Stop 相同,但联动 OnOff 状态。参数与 Stop 一致。

MoveToClosestFrequency —— 移动到最近频率(0x08)

将 CurrentFrequency 移动到设备支持的最接近目标频率的值。仅在设备支持 Frequency feature 时可用,日常灯控开发中很少用到。

参数类型说明
Frequencyuint16目标频率值

属性详解

LevelControl 的属性按功能分为四组。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。

ID 名称 类型 分组 说明
0x00 CurrentLevel uint8 / null 当前状态 当前亮度值
0x01 RemainingTime uint16 当前状态 过渡剩余时间
0x02 MinLevel uint8 当前状态 最低可用级别
0x03 MaxLevel uint8 当前状态 最高可用级别
0x04 CurrentFrequency uint16 频率控制 当前频率
0x05 MinFrequency uint16 频率控制 最低频率
0x06 MaxFrequency uint16 频率控制 最高频率
0x0F Options bitmap8 过渡与开关联动 命令执行选项
0x10 OnOffTransitionTime uint16 过渡与开关联动 开关过渡时间
0x11 OnLevel uint8 / null 过渡与开关联动 开灯时的目标亮度
0x12 OnTransitionTime uint16 / null 过渡与开关联动 开灯过渡时间
0x13 OffTransitionTime uint16 / null 过渡与开关联动 关灯过渡时间
0x14 DefaultMoveRate uint8 / null 过渡与开关联动 默认移动速率
0x4000 StartUpCurrentLevel uint8 / null 启动行为 上电初始亮度

当前状态(0x00 – 0x03)

描述设备当前的亮度级别和允许的范围。这是 App 展示亮度状态最直接的数据来源。

ID名称类型说明
0x00 CurrentLevel
当前亮度
uint8 / null 设备当前的亮度级别。有效范围 MinLevel~MaxLevel(通常 1~254)。Nullable —— 设备不确定当前级别时返回 null
0x01 RemainingTime
剩余过渡时间
uint16 当前过渡动画的剩余时间,单位 0.1 秒。无过渡进行时为 0
0x02 MinLevel
最低级别
uint8 设备支持的最低亮度值。支持 Lighting feature 时默认 1,不支持时默认 0
0x03 MaxLevel
最高级别
uint8 设备支持的最高亮度值。默认 254(0xFE)
CurrentLevel 是 Nullable

和 DoorLock 的 LockState 一样,CurrentLevel 可能为 null。 设备刚上电、固件升级后或硬件异常时都可能出现。 App 端显示亮度时务必处理 null 值,可以显示为「未知」或使用 MinLevel 作为默认值。

亮度值映射

CurrentLevel 的范围是 MinLevel~MaxLevel(通常 1~254),不是 0~100。 转换为百分比的公式:百分比 = (CurrentLevel - MinLevel) / (MaxLevel - MinLevel) * 100。 例如 MinLevel=1, MaxLevel=254, CurrentLevel=127 时约为 50% 亮度。

频率控制(0x04 – 0x06)

描述设备的频率控制能力。仅在设备支持 Frequency feature(Feature Map Bit 2)时才有这些属性。

适用范围

频率控制属性在普通灯具开发中很少用到。它主要用于需要精确控制输出频率的特殊设备(如某些工业照明或信号设备)。 绝大多数智能灯只用到当前状态和过渡相关的属性。

ID名称类型说明
0x04 CurrentFrequency
当前频率
uint16 设备当前的输出频率
0x05 MinFrequency
最低频率
uint16 设备支持的最低频率
0x06 MaxFrequency
最高频率
uint16 设备支持的最高频率

过渡与开关联动(0x0F – 0x14)

控制亮度变化的过渡行为,以及 OnOff Cluster 开灯/关灯时如何影响亮度。 这组属性直接决定了用户体验 —— 灯是突然亮/灭还是平滑过渡。

ID名称类型说明
0x0F Options
选项
bitmap8 命令执行的全局选项。可写(见下方 OptionsBitmap)
0x10 OnOffTransitionTime
开关过渡时间
uint16 开灯/关灯时亮度从 MinLevel 到 MaxLevel(或反向)的过渡时间,单位 0.1 秒。默认 0(瞬间切换)。可写
0x11 OnLevel
开灯亮度
uint8 / null OnOff Cluster 的 On 命令执行时,亮度设为此值。null 表示恢复到上次关灯前的亮度。范围 1~254,可写
0x12 OnTransitionTime
开灯过渡时间
uint16 / null OnOff 开灯时的过渡时间,单位 0.1 秒。null 时使用 OnOffTransitionTime。可写
0x13 OffTransitionTime
关灯过渡时间
uint16 / null OnOff 关灯时的过渡时间,单位 0.1 秒。null 时使用 OnOffTransitionTime。可写
0x14 DefaultMoveRate
默认移动速率
uint8 / null Move 命令不指定 Rate 时使用的默认速率(每秒变化的单位数)。null 表示设备自行决定。可写
OnLevel 的作用

OnLevel 决定了用户按「开灯」时灯亮到什么程度:

  • null(推荐默认)—— 记忆上次关灯前的亮度,开灯后恢复到上次的亮度。用户体验最自然
  • 具体数值(如 254)—— 每次开灯都亮到这个固定值,忽略上次关灯时的亮度

启动行为(0x4000)

控制设备重新上电后的初始亮度。

ID名称类型说明
0x4000 StartUpCurrentLevel
上电初始亮度
uint8 / null 设备上电时 CurrentLevel 的初始值。可写

StartUpCurrentLevel 特殊值

0x00
MinLevel 上电时设为 MinLevel(最低亮度)
1~254
指定亮度 上电时设为这个固定值
null
恢复断电前 上电时恢复到断电前的亮度值(推荐默认)
断电恢复的陷阱

StartUpCurrentLevel 只控制 CurrentLevel,不控制 OnOff 状态。 如果用户希望「来电后灯自动亮」,还需要配合 OnOff Cluster 的 StartUpOnOff 属性一起设置。 只设 StartUpCurrentLevel 而不设 StartUpOnOff,可能出现亮度恢复了但灯是关的情况。

枚举与位图

MoveModeEnum

Move 和 MoveWithOnOff 命令中的 MoveMode 参数使用此枚举,指定亮度移动方向。

0
Up 向上移动(增加亮度),直到 MaxLevel
1
Down 向下移动(降低亮度),直到 MinLevel

StepModeEnum

Step 和 StepWithOnOff 命令中的 StepMode 参数使用此枚举,指定步进方向。

0
Up 向上步进(增加亮度)
1
Down 向下步进(降低亮度)

OptionsBitmap

Options 属性以及所有命令中 OptionsMask / OptionsOverride 参数使用此位图。 它控制命令在特定条件下是否执行。

Bit 0
ExecuteIfOff 设备处于 Off 状态时是否仍执行 Level 命令。置 1 = 即使灯是关的也执行调光
Bit 1
CoupleColorTempToLevel 亮度变化时是否联动色温。置 1 = 亮度降低时色温自动变暖(需 ColorControl Cluster 配合)
OptionsMask / OptionsOverride 怎么用

这两个参数用于临时覆盖设备的 Options 属性。计算逻辑: effectiveOptions = (Options AND NOT OptionsMask) OR (OptionsOverride AND OptionsMask)。 简单理解:OptionsMask 标记哪些位要被覆盖,OptionsOverride 提供覆盖值。 两者都传 0 则直接使用设备的 Options 属性。

Feature Map

LevelControl 通过 Feature Map 声明设备支持的可选能力。

Bit 0
OnOff (OO) 依赖 OnOff Cluster,支持 WithOnOff 系列命令联动开关状态
Bit 1
Lighting (LT) 支持灯光应用行为。MinLevel 默认 1(非 0),支持 StartUpCurrentLevel 和 OnTransitionTime/OffTransitionTime
Bit 2
Frequency (FQ) 支持频率控制(Provisional)。启用 CurrentFrequency/MinFrequency/MaxFrequency 属性和 MoveToClosestFrequency 命令
常见组合

绝大多数智能灯的 Feature Map 是 0x03(OnOff + Lighting),表示同时支持开关联动和灯光行为。 读到 Feature Map 后可以判断哪些属性和命令可用,避免读取不存在的属性导致错误。

示例数据

一个典型可调光灯具的 LevelControl Cluster 读取结果:

{
  // --- 当前状态 ---
  "0x0": 127,                // CurrentLevel = 127(约 50% 亮度)
  "0x1": 0,                  // RemainingTime = 0(无进行中的过渡)
  "0x2": 1,                  // MinLevel = 1(最低可用级别)
  "0x3": 254,                // MaxLevel = 254(最高可用级别)

  // --- 过渡与开关联动 ---
  "0xF": 0,                  // Options = 0(无特殊选项)
  "0x10": 10,                // OnOffTransitionTime = 10(1 秒过渡)
  "0x11": null,              // OnLevel = null(On 时恢复之前亮度)
  "0x12": null,              // OnTransitionTime = null(使用 OnOffTransitionTime)
  "0x13": null,              // OffTransitionTime = null(使用 OnOffTransitionTime)
  "0x14": 50,                // DefaultMoveRate = 50(每秒变化 50 个单位)

  // --- 启动行为 ---
  "0x4000": null              // StartUpCurrentLevel = null(上电恢复断电前亮度)
}
亮度展示处理逻辑

App 展示亮度信息时,典型的处理流程:

  1. 读取 CurrentLevel (0x00),处理 null 情况
  2. 读取 MinLevel (0x02) 和 MaxLevel (0x03),确定滑块范围
  3. 将 CurrentLevel 换算为百分比:(CurrentLevel - MinLevel) / (MaxLevel - MinLevel) * 100
  4. 如果 RemainingTime (0x01) 大于 0,说明正在过渡中,UI 可以显示过渡动画

常见场景

场景 1:App 调光

  1. 读取 MinLevel (0x02) 和 MaxLevel (0x03),映射到滑块 0%~100%
  2. 用户拖动滑块时,将百分比换算为目标亮度值
  3. 发送 MoveToLevelWithOnOff (0x04)(推荐使用 WithOnOff 版本,保证开关状态一致)
  4. 订阅 CurrentLevel (0x00) 的变化,实时更新 UI 显示

场景 2:记忆亮度开关灯

  1. 设置 OnLevel (0x11) 为 null —— 让设备记忆上次关灯前的亮度
  2. 用户点击「开灯」→ OnOff Cluster 发 On 命令 → 灯自动恢复到上次的亮度
  3. 用户点击「关灯」→ OnOff Cluster 发 Off 命令 → 亮度渐暗到 0
  4. 可选:设置 OnTransitionTime (0x12) 和 OffTransitionTime (0x13) 控制过渡速度

场景 3:断电恢复设置

  1. 设置 StartUpCurrentLevel (0x4000):null = 恢复断电前亮度,0x00 = 最低亮度,具体值 = 固定亮度
  2. 同时设置 OnOff Cluster 的 StartUpOnOff,确保开关状态和亮度配合正确
  3. 典型配置:StartUpCurrentLevel=null + StartUpOnOff=RestorePrevious → 完整恢复断电前状态

场景 4:物理按钮调光(长按 + 短按)

  1. 短按 → 发送 StepWithOnOff (0x06),每次增减固定步进值(如 25)
  2. 长按按下 → 发送 MoveWithOnOff (0x05),持续变化
  3. 长按松手 → 发送 StopWithOnOff (0x07),停在当前亮度