组管理 Cluster(Groups)

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

Groups Cluster 管理设备的组成员关系,是 Matter 组播(Multicast)消息的基础。 将多个设备加入同一个 Group,之后向该 Group ID 发送命令,所有成员设备都会同时响应 —— 比如「一键关闭客厅所有灯」就是典型的组播场景。

组播 vs 逐一发送

不使用 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 也会被自动删除。 如果你只是想暂时让设备不响应组播,但保留 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 位图

Bit 7
GroupNames 支持存储组名称(对应 GN Feature)
Bit 0~6
Reserved 保留位,始终为 0
NameSupport 与 FeatureMap 的关系

NameSupport 的 Bit 7 与 FeatureMap 的 GN(Bit 0)是联动的: 如果 FeatureMap 声明了 GN,那么 NameSupport 的 Bit 7 也必须为 1。 读取时两者应保持一致。

Feature 位图

Groups Cluster 通过 FeatureMap(0xFFFC)声明设备支持的可选能力:

Bit 0
GN(GroupNames) 支持存储组名称 —— 启用后 AddGroup 的 GroupName 会被保存,ViewGroup 可查询到名称
大多数设备都支持 GN

组名称存储占用的资源极少(每组最多 16 字节),绝大多数 Matter 设备都会启用 GN 特性。 不支持 GN 的设备通常是资源极度受限的传感器类产品。 App 端应先检查 FeatureMap,不支持 GN 时就不要在 UI 上显示组名称编辑功能。

示例数据

读取一个支持 GN 特性的设备的 Groups Cluster 属性:

{
  // --- 属性 ---
  "0x0000": 128          // NameSupport — Bit 7 = 1,支持组名称
}
GroupID 范围

有效的 GroupID 范围是 0x0001 ~ 0xFEFF。 0x0000 是无效值,0xFF00 ~ 0xFFFF 保留给 Matter 内部使用。 App 分配 GroupID 时需要确保在有效范围内,且同一 Fabric 中不同组使用不同的 ID。

常见场景

场景 1:按房间组织设备(最常见)
  1. App 为每个房间分配唯一的 GroupID(如客厅 = 0x0001,卧室 = 0x0002)
  2. 用户把设备拖入房间时,App 向设备发送 AddGroup(GroupID, 房间名)
  3. 用户点击「客厅全部关灯」,App 向 GroupID 0x0001 发送一条组播 Off 命令
  4. 客厅的所有灯同时关闭,延迟几乎为零
场景 2:多设备联动控制
  1. 用户创建一个「影院模式」组(GroupID = 0x0010),包含吊灯、灯带、电动窗帘
  2. 向组内所有设备发送 AddGroup
  3. 触发影院模式时,向 GroupID 0x0010 发送组播命令:
    • 灯具收到 LevelControl.MoveToLevel(20) 调低亮度
    • 窗帘收到 WindowCovering.GoToLiftPercentage(100) 完全关闭
  4. 注意:组播命令会发给组内所有设备,每台设备只执行自己支持的 Cluster 命令
场景 3:Groups + Scenes 联合使用(自动化预设)

Groups 和 Scenes 是 Matter 中最强的组合 —— Groups 定义「哪些设备一起动」, Scenes 定义「每台设备分别做什么」。

  1. 创建「客厅」组(GroupID = 0x0001),加入 3 盏灯和 1 个窗帘
  2. 在该组下创建 Scene「阅读模式」(SceneID = 0x01):
    • 吊灯:亮度 80%,色温 4000K
    • 台灯:亮度 100%,色温 5000K
    • 灯带:关闭
    • 窗帘:打开 50%
  3. 触发时,向 GroupID 0x0001 发送一条 Scenes.RecallScene(SceneID: 0x01) 组播命令
  4. 所有设备同时切换到各自的预设状态,一条命令搞定
场景 4:配网时批量建组
  1. 安装人员先让目标设备进入 Identify 模式(按物理按钮或通过 App 扫码触发)
  2. 向网络组播地址发送 AddGroupIfIdentifying(GroupID, GroupName)
  3. 只有正在闪灯的设备会加入组,其他设备忽略这条命令
  4. 对下一台设备重复以上操作,逐一完成建组
  5. 这种方式特别适合大量设备的初始部署场景(如办公室、酒店)