亮度控制 Cluster(LevelControl)
Cluster ID: 0x0008 |
所在 Endpoint: 通常在 Endpoint 1(功能端点)
LevelControl 提供了对设备「可调级别」的完整控制能力 —— 最典型的场景是灯的亮度调节,但也适用于风扇转速、窗帘开合度等任何可以用数值表示「程度」的设备。 它定义了两组命令:一组不影响 OnOff 状态,另一组会联动 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 也不会关灯。
| 参数 | 类型 | 说明 |
|---|---|---|
| Level | uint8 | 目标亮度值,范围 0~254 |
| TransitionTime | uint16 / null | 过渡时间(0.1s 为单位)。null 使用 OnOffTransitionTime |
| OptionsMask | bitmap8 | 选项掩码(见 OptionsBitmap) |
| OptionsOverride | bitmap8 | 选项覆盖值 |
使用场景与参数
用户在 App 上拖动亮度滑块时调用。发送前读取 MinLevel (0x02) 和 MaxLevel (0x03) 确认有效范围,将 UI 滑块的百分比映射到这个范围内。
Move —— 持续移动亮度(0x01)
让 CurrentLevel 以指定速率持续向上或向下变化,直到达到 MinLevel/MaxLevel 或收到 Stop 命令。
适合长按按钮持续调光的场景。
| 参数 | 类型 | 说明 |
|---|---|---|
| MoveMode | enum8 | 移动方向:0 = Up,1 = Down(见 MoveModeEnum) |
| Rate | uint8 / null | 每秒变化的单位数。null 使用 DefaultMoveRate |
| OptionsMask | bitmap8 | 选项掩码 |
| OptionsOverride | bitmap8 | 选项覆盖值 |
使用场景与参数
用户长按物理调光按钮时触发。按下时发送 Move(指定方向),松手时发送 Stop 停止变化。适合实体开关或遥控器的持续调光交互。
Step —— 按步进值调整亮度(0x02)
将 CurrentLevel 按指定步进值向上或向下调整一档。适合短按按钮「调亮一格」「调暗一格」的场景。
| 参数 | 类型 | 说明 |
|---|---|---|
| StepMode | enum8 | 步进方向:0 = Up,1 = Down(见 StepModeEnum) |
| StepSize | uint8 | 步进大小(变化的绝对值) |
| TransitionTime | uint16 / null | 过渡时间(0.1s 为单位)。null 使用 OnOffTransitionTime |
| OptionsMask | bitmap8 | 选项掩码 |
| OptionsOverride | bitmap8 | 选项覆盖值 |
使用场景与参数
用户短按物理按钮或 App 中的「+/-」按钮调光时使用。每次按下发送一次 Step 命令,实现逐级调光。典型步进值为 25~50(约 10%~20% 亮度变化)。
Stop —— 停止移动(0x03)
停止正在进行的 Move 或 Step 过渡。CurrentLevel 会保持在收到 Stop 命令时的值。
| 参数 | 类型 | 说明 |
|---|---|---|
| OptionsMask | bitmap8 | 选项掩码 |
| OptionsOverride | bitmap8 | 选项覆盖值 |
MoveToLevelWithOnOff —— 移动到指定亮度(联动开关)(0x04)
功能与 MoveToLevel 完全相同,区别在于会联动 OnOff Cluster:目标亮度为 0 时自动关灯(OnOff 变为 Off),目标亮度大于 0 时自动开灯(OnOff 变为 On)。
App 调光时应优先使用这个命令,确保亮度和开关状态始终一致。
| 参数 | 类型 | 说明 |
|---|---|---|
| Level | uint8 | 目标亮度值,范围 0~254 |
| TransitionTime | uint16 / null | 过渡时间(0.1s 为单位) |
| OptionsMask | bitmap8 | 选项掩码 |
| OptionsOverride | bitmap8 | 选项覆盖值 |
使用场景与参数
App 调光的首选命令。拖动亮度滑块到 0 时灯会自动关掉,拖到任意正值时灯会自动亮起,保证用户看到的 UI 状态与实际设备一致。
MoveWithOnOff —— 持续移动亮度(联动开关)(0x05)
功能与 Move 相同,但移动过程中会联动 OnOff 状态。参数与 Move 一致。
StepWithOnOff —— 按步进值调整亮度(联动开关)(0x06)
功能与 Step 相同,但步进过程中会联动 OnOff 状态。参数与 Step 一致。
StopWithOnOff —— 停止移动(联动开关)(0x07)
功能与 Stop 相同,但联动 OnOff 状态。参数与 Stop 一致。
MoveToClosestFrequency —— 移动到最近频率(0x08)
将 CurrentFrequency 移动到设备支持的最接近目标频率的值。仅在设备支持 Frequency feature 时可用,日常灯控开发中很少用到。
| 参数 | 类型 | 说明 |
|---|---|---|
| Frequency | uint16 | 目标频率值 |
属性详解
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) |
和 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 决定了用户按「开灯」时灯亮到什么程度:
null(推荐默认)—— 记忆上次关灯前的亮度,开灯后恢复到上次的亮度。用户体验最自然- 具体数值(如
254)—— 每次开灯都亮到这个固定值,忽略上次关灯时的亮度
启动行为(0x4000)
控制设备重新上电后的初始亮度。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x4000 |
StartUpCurrentLevel 上电初始亮度 |
uint8 / null | 设备上电时 CurrentLevel 的初始值。可写 |
StartUpCurrentLevel 特殊值
StartUpCurrentLevel 只控制 CurrentLevel,不控制 OnOff 状态。
如果用户希望「来电后灯自动亮」,还需要配合 OnOff Cluster 的 StartUpOnOff 属性一起设置。
只设 StartUpCurrentLevel 而不设 StartUpOnOff,可能出现亮度恢复了但灯是关的情况。
枚举与位图
MoveModeEnum
Move 和 MoveWithOnOff 命令中的 MoveMode 参数使用此枚举,指定亮度移动方向。
StepModeEnum
Step 和 StepWithOnOff 命令中的 StepMode 参数使用此枚举,指定步进方向。
OptionsBitmap
Options 属性以及所有命令中 OptionsMask / OptionsOverride 参数使用此位图。
它控制命令在特定条件下是否执行。
这两个参数用于临时覆盖设备的 Options 属性。计算逻辑:
effectiveOptions = (Options AND NOT OptionsMask) OR (OptionsOverride AND OptionsMask)。
简单理解:OptionsMask 标记哪些位要被覆盖,OptionsOverride 提供覆盖值。
两者都传 0 则直接使用设备的 Options 属性。
Feature Map
LevelControl 通过 Feature Map 声明设备支持的可选能力。
绝大多数智能灯的 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 展示亮度信息时,典型的处理流程:
- 读取
CurrentLevel (0x00),处理null情况 - 读取
MinLevel (0x02)和MaxLevel (0x03),确定滑块范围 - 将
CurrentLevel换算为百分比:(CurrentLevel - MinLevel) / (MaxLevel - MinLevel) * 100 - 如果
RemainingTime (0x01)大于 0,说明正在过渡中,UI 可以显示过渡动画
常见场景
场景 1:App 调光
- 读取
MinLevel (0x02)和MaxLevel (0x03),映射到滑块 0%~100% - 用户拖动滑块时,将百分比换算为目标亮度值
- 发送
MoveToLevelWithOnOff (0x04)(推荐使用 WithOnOff 版本,保证开关状态一致) - 订阅
CurrentLevel (0x00)的变化,实时更新 UI 显示
场景 2:记忆亮度开关灯
- 设置
OnLevel (0x11)为null—— 让设备记忆上次关灯前的亮度 - 用户点击「开灯」→ OnOff Cluster 发 On 命令 → 灯自动恢复到上次的亮度
- 用户点击「关灯」→ OnOff Cluster 发 Off 命令 → 亮度渐暗到 0
- 可选:设置
OnTransitionTime (0x12)和OffTransitionTime (0x13)控制过渡速度
场景 3:断电恢复设置
- 设置
StartUpCurrentLevel (0x4000):null= 恢复断电前亮度,0x00= 最低亮度,具体值 = 固定亮度 - 同时设置 OnOff Cluster 的
StartUpOnOff,确保开关状态和亮度配合正确 - 典型配置:
StartUpCurrentLevel=null+StartUpOnOff=RestorePrevious→ 完整恢复断电前状态
场景 4:物理按钮调光(长按 + 短按)
- 短按 → 发送
StepWithOnOff (0x06),每次增减固定步进值(如 25) - 长按按下 → 发送
MoveWithOnOff (0x05),持续变化 - 长按松手 → 发送
StopWithOnOff (0x07),停在当前亮度