开关 Cluster(OnOff)
Cluster ID: 0x0006 |
所在 Endpoint: 通常在 Endpoint 1(功能端点)
OnOff 是 Matter 中最基础的控制 Cluster —— 负责设备的开/关/切换操作。 所有需要「开关」能力的设备类型(灯、插座、开关面板等)都依赖这个 Cluster。 它也是入门 Matter 开发时最先接触的 Cluster。
OnOff Cluster 定义了一个 Lighting(LT) Feature。 启用 LT 后,Cluster 会额外提供 GlobalSceneControl、OnTime、OffWaitTime、StartUpOnOff 四个属性, 以及 OffWithEffect、OnWithRecallGlobalScene、OnWithTimedOff 三个高级命令。 灯具类设备通常启用此特性,普通开关面板可能不需要。
命令(Commands)
OnOff Cluster 共有 6 个命令。基础三件套(Off / On / Toggle)是所有设备都支持的, 后三个高级命令需要设备启用 Lighting(LT)特性。 点击下方表格中的命令 ID 可跳转到对应的详细说明。
| ID | 名称 | 说明 | 所需特性 |
|---|---|---|---|
0x00 |
Off | 关闭设备 | 无 |
0x01 |
On | 开启设备 | 无 |
0x02 |
Toggle | 切换开关状态 | 无 |
0x40 |
OffWithEffect | 带过渡效果关闭 | LT |
0x41 |
OnWithRecallGlobalScene | 开启并恢复全局场景 | LT |
0x42 |
OnWithTimedOff | 定时开启(超时后自动关闭) | LT |
Off —— 关闭(0x00)
将设备切换到关闭状态。执行成功后,OnOff 属性变为 false。
这是最基础的命令,不需要任何参数。
使用场景
用户点击 App 上的关灯按钮、自动化规则触发关灯、语音助手执行「关灯」指令时调用。
On —— 开启(0x01)
将设备切换到开启状态。执行成功后,OnOff 属性变为 true。
同样不需要参数。
使用场景
用户点击开灯按钮、人体传感器检测到有人触发开灯时调用。
Toggle —— 切换(0x02)
切换设备当前状态:如果当前是开,变为关;如果当前是关,变为开。 适合不关心当前状态、只想「翻转」的场景。不需要参数。
使用场景
物理墙壁开关的按下动作、遥控器的单一按键操作。相比单独发 On 或 Off,Toggle 不需要先读取当前状态。
OffWithEffect —— 带效果关闭(0x40)
关闭设备的同时应用一个视觉过渡效果(如渐灭、延迟关闭等)。 关闭前会自动保存当前场景到全局场景(GlobalScene),以便后续通过 OnWithRecallGlobalScene 恢复。
| 参数 | 类型 | 说明 |
|---|---|---|
| EffectIdentifier | EffectIdentifierEnum | 效果类型(见下方枚举) |
| EffectVariant | enum8 | 效果变体(含义取决于 EffectIdentifier 的值) |
EffectIdentifier 枚举值
DelayedAllOff 的 EffectVariant
DyingLight 的 EffectVariant
使用场景
智能灯「晚安」场景:用户点击后灯光慢慢熄灭(DelayedAllOff + SlowFade),而非突然黑灯。 设备会在关闭前保存当前亮度和颜色到 GlobalScene,下次调用 OnWithRecallGlobalScene 时可恢复。
OnWithRecallGlobalScene —— 开启并恢复场景(0x41)
开启设备并恢复之前 OffWithEffect 保存的全局场景(GlobalScene)。
没有参数。执行后 GlobalSceneControl 重新变为 true。
使用场景
与 OffWithEffect 配对使用。例如:晚上用 OffWithEffect 关灯(保存了 70% 暖光的状态), 早上调用 OnWithRecallGlobalScene,灯会直接恢复到 70% 暖光,而不是默认的 100% 白光。
OnWithTimedOff —— 定时开启(0x42)
开启设备并设定一个自动关闭倒计时。如果设备已经开启,则刷新倒计时时间。 适合「只开一会儿」的临时需求。
| 参数 | 类型 | 说明 |
|---|---|---|
| OnOffControl | OnOffControlBitmap | Bit 0: AcceptOnlyWhenOn —— 为 1 时,仅在设备已开启时才接受此命令 |
| OnTime | uint16 | 开启持续时间,单位 1/10 秒。例如 300 = 30 秒 |
| OffWaitTime | uint16 | 关闭后的等待时间(防抖),单位 1/10 秒 |
使用场景与参数
走廊灯、楼道灯:人体传感器触发时发送 OnWithTimedOff(OnTime=300,即 30 秒), 如果在 30 秒内没有再次触发,灯自动关闭。 如果有新检测,重新发一次 OnWithTimedOff 即可刷新倒计时。
AcceptOnlyWhenOn 的用途:避免在用户手动关灯后,传感器又把灯打开。 设置 AcceptOnlyWhenOn = 1 后,只有灯已经亮着时才续时,不会重新打开已关闭的灯。
属性详解
OnOff Cluster 共有 5 个应用属性。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。
| ID | 名称 | 类型 | 分组 | 说明 |
|---|---|---|---|---|
0x0000 |
OnOff | bool | 开关状态 | 当前开关状态 |
0x4000 |
GlobalSceneControl | bool | 开关状态 | 全局场景是否有效 |
0x4001 |
OnTime | uint16 | 定时参数 | 剩余开启时间(1/10 秒) |
0x4002 |
OffWaitTime | uint16 | 定时参数 | 关闭等待时间(1/10 秒) |
0x4003 |
StartUpOnOff | enum8 / null | 上电行为 | 设备上电时的初始状态 |
开关状态(0x0000, 0x4000)
描述设备当前的开关状态和全局场景控制标记。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
OnOff(开关状态) | bool | 设备当前的开关状态。true = 开启,false = 关闭。这是 OnOff Cluster 唯一的必选属性 |
0x4000 |
GlobalSceneControl(全局场景控制) | bool | 标识全局场景是否有效。调用 OffWithEffect 后变为 false(场景已保存待恢复),调用 OnWithRecallGlobalScene 后恢复为 true。需要 LT 特性 |
定时参数(0x4001, 0x4002)
用于 OnWithTimedOff 命令的倒计时控制。这两个属性由设备自动维护,通常不需要手动写入。
OnTime 和 OffWaitTime 的单位是 1/10 秒(100 毫秒),不是秒也不是毫秒。
例如值为 300 表示 30 秒,值为 10 表示 1 秒。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x4001 |
OnTime(开启倒计时) | uint16 | 设备剩余的开启时间,单位 1/10 秒。由 OnWithTimedOff 命令设置,倒计时归零后设备自动关闭。值为 0 表示未启用定时。需要 LT 特性 |
0x4002 |
OffWaitTime(关闭等待时间) | uint16 | 设备关闭后的等待期,单位 1/10 秒。在此期间如果收到 OnWithTimedOff 且 AcceptOnlyWhenOn = 1,命令会被忽略。用于防止传感器误触发重新开灯。需要 LT 特性 |
上电行为(0x4003)
控制设备上电(或重启)后的初始开关状态。这个属性对用户体验影响很大 —— 断电恢复后灯是亮还是灭,取决于它。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x4003 |
StartUpOnOff(上电行为) | enum8 / null | 设备上电后的开关状态(见下方枚举)。Nullable —— null 表示恢复断电前的状态。写入需要 manage 权限。需要 LT 特性 |
StartUpOnOff 枚举值
StartUpOnOff 是 Nullable 类型。在 Matter 协议的线上编码中,null 对应 0xFF。
所以如果你在底层协议数据中看到 0xFF,实际含义是「恢复断电前的状态」,不是一个有效的枚举值。
Feature 位图
OnOff Cluster 通过 FeatureMap(0xFFFC)声明设备支持哪些高级能力:
示例数据
一个启用了 Lighting 特性的智能灯在开启状态下的 OnOff Cluster 读取结果:
{
// --- 开关状态 ---
"0x0000": true, // OnOff = true(当前为开启状态)
"0x4000": true, // GlobalSceneControl = true(全局场景有效)
// --- 定时参数 ---
"0x4001": 0, // OnTime = 0(未启用定时开启)
"0x4002": 0, // OffWaitTime = 0(未启用关闭等待)
// --- 上电行为 ---
"0x4003": null // StartUpOnOff = null(保持断电前的状态)
}
对于最简单的设备(如普通开关面板、插座),可能只有 OnOff (0x0000) 一个属性。
只有支持 Lighting 特性的设备才会上报 0x4000 ~ 0x4003 这四个属性。
读取前可先检查 FeatureMap (0xFFFC) 判断设备支持哪些特性。
常见场景
场景 1:基础开关控制
- 发送
On (0x01)或Off (0x00)命令控制设备 - 订阅
OnOff (0x0000)属性变化,同步 App 界面状态 - 如果不关心当前状态,可以直接用
Toggle (0x02)
场景 2:走廊灯 / 感应灯自动关闭
- 传感器检测到有人,发送
OnWithTimedOff (0x42),OnTime 设为300(30 秒) - 30 秒内无人,灯自动关闭
- 如果又检测到人,再次发送 OnWithTimedOff 刷新倒计时
- 设置 AcceptOnlyWhenOn = 1 可防止用户手动关灯后传感器又把灯打开
场景 3:设置上电恢复行为
- 读取
FeatureMap (0xFFFC),确认设备支持 Lighting(LT)特性 - 写入
StartUpOnOff (0x4003)的值:0(Off)—— 停电后恢复供电时灯保持关闭1(On)—— 恢复供电后灯自动亮起null(Previous)—— 恢复到断电前的状态(推荐)
- 注意:写入 StartUpOnOff 需要 manage 级别的权限(Administrator 角色)
场景 4:渐灭 + 场景恢复(晚安 / 早安)
- 晚安时:发送
OffWithEffect (0x40),设备保存当前亮度和颜色到全局场景,然后渐灭 - 早安时:发送
OnWithRecallGlobalScene (0x41),设备恢复到晚安前的亮度和颜色 - 注意:直接调用
On (0x01)不会恢复场景,灯会以默认亮度开启