组管理 Cluster(Groups)
Cluster ID: 0x0004 |
所在 Endpoint: 通常在 Endpoint 1(功能端点)
Groups Cluster 管理设备的组成员关系,是 Matter 组播(Multicast)消息的基础。 将多个设备加入同一个 Group,之后向该 Group ID 发送命令,所有成员设备都会同时响应 —— 比如「一键关闭客厅所有灯」就是典型的组播场景。
不使用 Groups 时,控制 5 盏灯需要发 5 条单播命令,延迟会随设备数量线性增加。 使用 Groups 后,只需发 1 条组播命令,所有成员几乎同时响应。 这也是 Groups 与 Scenes(场景)配合后最有价值的地方 —— 一条组播命令可以让不同设备各自执行预设动作(灯调暖光、窗帘半开、空调 26 度)。
命令(Commands)
Groups Cluster 共有 6 个命令,用于管理设备的组成员关系。 其中 AddGroup、RemoveGroup、RemoveAllGroups 是写操作,ViewGroup 和 GetGroupMembership 是查询操作, AddGroupIfIdentifying 是一个条件写入命令(设备必须处于 Identify 模式才生效)。 点击下方表格中的命令 ID 可跳转到对应的详细说明。
| ID | 名称 | 方向 | 说明 |
|---|---|---|---|
0x00 |
AddGroup | 请求 / 响应 | 将设备加入指定组 |
0x01 |
ViewGroup | 请求 / 响应 | 查询指定组的名称 |
0x02 |
GetGroupMembership | 请求 / 响应 | 查询设备所属的组列表 |
0x03 |
RemoveGroup | 请求 / 响应 | 将设备从指定组中移除 |
0x04 |
RemoveAllGroups | 仅请求 | 移除设备的所有组成员关系 |
0x05 |
AddGroupIfIdentifying | 仅请求 | 仅在 Identify 模式下加入组 |
AddGroup —— 加入组(0x00)
将当前设备(Endpoint)加入指定的 Group。如果设备已经是该组的成员,命令仍然成功(幂等),
但会更新组名称(如果设备支持 GN 特性)。
执行后返回 AddGroupResponse,包含操作状态和 GroupID。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| GroupID | group-id | 是 | 目标组 ID,范围 0x0001 ~ 0xFEFF |
| GroupName | string | 是 | 组名称(最长 16 字节)。如果设备不支持 GN 特性,传空字符串即可 |
AddGroupResponse
| 字段 | 类型 | 说明 |
|---|---|---|
| Status | status | 0x00 = SUCCESS,0x89 = RESOURCE_EXHAUSTED(组表已满) |
| GroupID | group-id | 请求中的 GroupID 原样返回 |
请求示例:
{
"invokeRequests": [{
"commandPath": {
"endpointId": 1,
"clusterId": "0x0004",
"commandId": "0x00" // AddGroup
},
"commandFields": {
"0": 1, // GroupID = 0x0001
"1": "客厅灯组" // GroupName
}
}]
}
响应示例:
{
"invokeResponseValue": {
"commandPath": {
"endpointId": 1,
"clusterId": "0x0004",
"commandId": "0x00" // AddGroupResponse
},
"commandFields": {
"0": 0, // Status = SUCCESS
"1": 1 // GroupID = 0x0001
}
}
}
使用场景
用户在 App 中创建「客厅」房间后,App 自动为该房间分配一个 GroupID, 然后对房间内的每台设备发送 AddGroup 命令,把它们都加入同一个组。 之后用户点击「全部关灯」,App 只需向该 GroupID 发一条组播 Off 命令。
ViewGroup —— 查询组(0x01)
查询设备是否属于指定的 Group,如果属于则返回该组的名称。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| GroupID | group-id | 是 | 要查询的组 ID |
ViewGroupResponse
| 字段 | 类型 | 说明 |
|---|---|---|
| Status | status | 0x00 = SUCCESS(设备属于该组),0x8B = NOT_FOUND(不属于该组) |
| GroupID | group-id | 请求中的 GroupID 原样返回 |
| GroupName | string | 组名称。仅在 Status = SUCCESS 时有效;不支持 GN 特性时返回空字符串 |
使用场景
App 从云端恢复房间配置后,向每台设备发送 ViewGroup 确认组关系是否还在 —— 如果设备因恢复出厂丢失了组信息,App 需要重新发送 AddGroup。
GetGroupMembership —— 查询组成员关系(0x02)
批量查询设备属于哪些组。可以传入一组 GroupID 做筛选查询,也可以传空列表获取设备所属的全部组。
响应中还包含 Capacity 字段,告诉你设备还能加入多少个组。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| GroupList | list[group-id] | 是 | 要查询的组 ID 列表。传空列表 [] 表示查询设备所属的全部组 |
GetGroupMembershipResponse
| 字段 | 类型 | 说明 |
|---|---|---|
| Capacity | uint8 / null | 设备还能加入的组数量。null 表示未知 |
| GroupList | list[group-id] | 设备实际所属的组 ID 列表(是请求列表与实际成员的交集;请求为空时返回全部) |
请求示例(查询设备是否属于组 1、2、3):
{
"invokeRequests": [{
"commandPath": {
"endpointId": 1,
"clusterId": "0x0004",
"commandId": "0x02" // GetGroupMembership
},
"commandFields": {
"0": [1, 2, 3] // GroupList — 查询设备是否属于这三个组
}
}]
}
响应示例(设备属于组 1 和组 3,还可再加入 5 个组):
{
"invokeResponseValue": {
"commandPath": {
"endpointId": 1,
"clusterId": "0x0004",
"commandId": "0x02" // GetGroupMembershipResponse
},
"commandFields": {
"0": 5, // Capacity = 5(还能再加入 5 个组)
"1": [1, 3] // GroupList — 设备属于组 1 和组 3
}
}
}
使用场景
App 启动时需要同步设备的组关系:传空 GroupList 获取设备所属的全部组, 再与云端存储的房间配置比对,处理新增或丢失的组关系。 Capacity 字段可以用来判断设备是否还有空间加入新的组。
RemoveGroup —— 移出组(0x03)
将设备从指定的 Group 中移除。如果设备不属于该组,返回 NOT_FOUND。 移除组成员关系后,设备将不再响应该组的组播命令。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| GroupID | group-id | 是 | 要移出的组 ID |
RemoveGroupResponse
| 字段 | 类型 | 说明 |
|---|---|---|
| Status | status | 0x00 = SUCCESS,0x8B = NOT_FOUND |
| GroupID | group-id | 请求中的 GroupID 原样返回 |
移除组时,该组下绑定的所有 Scene 也会被自动删除。 如果你只是想暂时让设备不响应组播,但保留 Scene 配置, 目前没有「暂停组成员」的机制 —— 只能移除后重新添加。
使用场景
用户把一盏灯从「客厅」房间移到「卧室」房间: App 先对该灯发送 RemoveGroup(客厅 GroupID),再发送 AddGroup(卧室 GroupID)。
RemoveAllGroups —— 移出所有组(0x04)
将设备从所有已加入的组中移除,相当于清空组表。没有参数,也没有响应。 同时会清除所有关联的 Scene。
这个命令会一次性清除设备的全部组关系和全部 Scene,无法撤销。 通常只在恢复出厂设置、设备移交、或重新配网时才使用。
使用场景
设备恢复出厂设置流程中,App 在 Remove Fabric 之前先发送 RemoveAllGroups, 确保设备上不残留任何组播配置。
AddGroupIfIdentifying —— 在标识模式下加入组(0x05)
功能与 AddGroup 相同,但增加了一个前置条件:设备必须正处于 Identify 模式
(即 Identify Cluster 的 IdentifyTime > 0)才会执行。
如果设备不在 Identify 模式,命令会被静默忽略。没有响应。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| GroupID | group-id | 是 | 目标组 ID |
| GroupName | string | 是 | 组名称(最长 16 字节) |
配网阶段通常会先让设备进入 Identify 模式(用户确认「就是这台设备」), 然后用 AddGroupIfIdentifying 以组播方式批量发送 —— 只有正在闪灯/响铃的那台设备会加入组,其他设备不受影响。 这避免了需要逐一获取每台设备地址再单播 AddGroup 的复杂流程。
使用场景
批量配置新安装的灯具:安装人员逐一触发每盏灯的 Identify(物理按键或扫码), 然后用同一个 AddGroupIfIdentifying 组播命令批量发送。 每盏灯在闪灯期间收到命令后自动加入指定组,不闪灯的灯忽略该命令。
属性详解
Groups Cluster 只有一个应用属性。点击属性 ID 可跳转到详细说明。
| ID | 名称 | 类型 | 读写 | 说明 |
|---|---|---|---|---|
0x0000 |
NameSupport | bitmap8 | 只读 | 是否支持存储组名称 |
NameSupport(名称支持)
一个 8 位的位图,描述设备是否支持存储组名称。目前只使用了 Bit 7(最高位)。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
NameSupport | bitmap8 | Bit 7(0x80): GroupNames —— 为 1 时表示设备可以存储组名称。为 0 时 AddGroup 中的 GroupName 会被忽略,ViewGroup 响应中的 GroupName 始终为空字符串 |
NameSupport 位图
NameSupport 的 Bit 7 与 FeatureMap 的 GN(Bit 0)是联动的:
如果 FeatureMap 声明了 GN,那么 NameSupport 的 Bit 7 也必须为 1。
读取时两者应保持一致。
Feature 位图
Groups Cluster 通过 FeatureMap(0xFFFC)声明设备支持的可选能力:
组名称存储占用的资源极少(每组最多 16 字节),绝大多数 Matter 设备都会启用 GN 特性。 不支持 GN 的设备通常是资源极度受限的传感器类产品。 App 端应先检查 FeatureMap,不支持 GN 时就不要在 UI 上显示组名称编辑功能。
示例数据
读取一个支持 GN 特性的设备的 Groups Cluster 属性:
{
// --- 属性 ---
"0x0000": 128 // NameSupport — Bit 7 = 1,支持组名称
}
有效的 GroupID 范围是 0x0001 ~ 0xFEFF。
0x0000 是无效值,0xFF00 ~ 0xFFFF 保留给 Matter 内部使用。
App 分配 GroupID 时需要确保在有效范围内,且同一 Fabric 中不同组使用不同的 ID。
常见场景
场景 1:按房间组织设备(最常见)
- App 为每个房间分配唯一的 GroupID(如客厅 = 0x0001,卧室 = 0x0002)
- 用户把设备拖入房间时,App 向设备发送
AddGroup(GroupID, 房间名) - 用户点击「客厅全部关灯」,App 向 GroupID 0x0001 发送一条组播
Off命令 - 客厅的所有灯同时关闭,延迟几乎为零
场景 2:多设备联动控制
- 用户创建一个「影院模式」组(GroupID = 0x0010),包含吊灯、灯带、电动窗帘
- 向组内所有设备发送 AddGroup
- 触发影院模式时,向 GroupID 0x0010 发送组播命令:
- 灯具收到
LevelControl.MoveToLevel(20)调低亮度 - 窗帘收到
WindowCovering.GoToLiftPercentage(100)完全关闭
- 灯具收到
- 注意:组播命令会发给组内所有设备,每台设备只执行自己支持的 Cluster 命令
场景 3:Groups + Scenes 联合使用(自动化预设)
Groups 和 Scenes 是 Matter 中最强的组合 —— Groups 定义「哪些设备一起动」, Scenes 定义「每台设备分别做什么」。
- 创建「客厅」组(GroupID = 0x0001),加入 3 盏灯和 1 个窗帘
- 在该组下创建 Scene「阅读模式」(SceneID = 0x01):
- 吊灯:亮度 80%,色温 4000K
- 台灯:亮度 100%,色温 5000K
- 灯带:关闭
- 窗帘:打开 50%
- 触发时,向 GroupID 0x0001 发送一条
Scenes.RecallScene(SceneID: 0x01)组播命令 - 所有设备同时切换到各自的预设状态,一条命令搞定
场景 4:配网时批量建组
- 安装人员先让目标设备进入 Identify 模式(按物理按钮或通过 App 扫码触发)
- 向网络组播地址发送
AddGroupIfIdentifying(GroupID, GroupName) - 只有正在闪灯的设备会加入组,其他设备忽略这条命令
- 对下一台设备重复以上操作,逐一完成建组
- 这种方式特别适合大量设备的初始部署场景(如办公室、酒店)