扫地机运行模式 Cluster(RvcRunMode)

Cluster ID: 0x0054  |  所在 Endpoint: 通常在 Endpoint 1(功能端点) |  基类: ModeBase(0x0050)

RvcRunMode 是 Matter 为扫地机器人(Robot Vacuum Cleaner)定义的运行模式 Cluster。 它继承自 ModeBase,专门管理扫地机的高级运行状态 —— 空闲、清扫、建图。 通过切换运行模式,用户可以控制扫地机是开始打扫、绘制地图还是返回待命。

扫地机 Cluster 三件套

Matter 为扫地机器人定义了三个协作 Cluster,各管一面:

  • RvcRunMode(本页)—— 高级运行状态:空闲 / 清扫 / 建图
  • RvcCleanMode —— 清扫强度:静音 / 标准 / 深度清洁
  • RvcOperationalState —— 实时运行状态:寻找充电座、充电中、卡住等

典型流程:先通过 RvcCleanMode 设好清扫强度,再通过 RvcRunMode 切到清扫模式启动工作, 运行过程中的实时状态(充电、卡住、回充)由 RvcOperationalState 上报。

命令(Commands)

RvcRunMode 继承自 ModeBase,只有一对命令:发送模式切换请求,设备返回执行结果。

ID 名称 方向 说明
0x00 ChangeToMode 客户端 → 设备 请求切换到指定运行模式
0x01 ChangeToModeResponse 设备 → 客户端 返回模式切换的执行结果

ChangeToMode —— 切换运行模式(0x00)

请求设备切换到指定的运行模式。模式编号必须是 SupportedModes 中定义的有效值。 设备收到后会校验当前状态是否允许切换(例如正在充电时可能无法直接开始清扫),然后通过 ChangeToModeResponse 返回结果。

参数类型说明
NewMode uint8 目标模式编号,必须是 SupportedModes 列表中某个模式的 Mode 字段值
使用场景

用户在 App 上点击「开始清扫」,App 发送 ChangeToMode(NewMode=1) 将扫地机从空闲切换到清扫模式。 如果扫地机电量过低或尘盒未安装,设备会在响应中返回对应的错误状态码。

ChangeToModeResponse —— 切换结果(0x01)

设备对 ChangeToMode 命令的响应。通过 Status 字段告知切换是否成功,失败时附带文字说明。

字段类型说明
Status uint8 0x00 = 成功;其他值为错误码(见状态码章节)
StatusText string(可选) 人类可读的状态描述,用于调试或展示给用户
通用错误码 vs 扫地机专属错误码

Status 字段的值空间分为两段:0x00–0x3F 是 ModeBase 通用错误码(如 GenericFailure、InvalidInMode), 0x40–0x7F 是扫地机专属的错误码(如卡住、尘盒缺失等)。 App 端处理时需要覆盖两段。

属性详解

RvcRunMode 继承 ModeBase 的三个属性。注意:ModeBase 定义了 StartUpMode(0x0002), 但扫地机不支持该属性 —— 扫地机每次上电后的行为由 OnMode 决定。

ID 名称 类型 说明
0x0000 SupportedModes list<ModeOptionStruct> 设备支持的运行模式列表
0x0001 CurrentMode uint8 当前运行模式
0x0003 OnMode 新版已移除 uint8 / null 设备唤醒时自动进入的模式

SupportedModes —— 支持的模式列表(0x0000)

设备支持的全部运行模式。每个模式包含标签名称、模式编号和一组模式标签(ModeTag)。 列表在设备整个生命周期中固定不变。

字段类型说明
Label string 模式的显示名称,如 "清扫"、"建图"
Mode uint8 模式编号,在列表内唯一,作为 ChangeToMode 的参数
ModeTags list<ModeTagStruct> 模式标签列表,标识该模式的语义(见模式标签章节)

CurrentMode —— 当前模式(0x0001)

设备当前的运行模式编号,值必须是 SupportedModes 中某个模式的 Mode 字段。 订阅此属性可以实时跟踪扫地机的运行状态变化。

订阅推荐

建议 App 通过 Subscribe 订阅 CurrentMode 的变化,而不是轮询。 当扫地机完成清扫自动回到空闲模式、或因异常停止时,订阅能实时收到通知。

OnMode —— 唤醒模式(0x0003) 新版已移除

新版 Matter 已移除

OnMode 已不在较新版本的 Matter 规范中(本站对照的 connectedhomeip v1.6 官方定义里已没有它)。按新版本开发的设备不会实现它,这里保留说明仅供对接旧设备时参考。新版本中控制端通过 ChangeToMode 命令切换模式。

设备从非活跃状态唤醒时自动进入的模式。值为 SupportedModes 中某个模式的 Mode 字段, 或 null 表示不自动切换模式。

没有 StartUpMode

ModeBase 定义了 StartUpMode(0x0002) 属性,但 RvcRunMode 明确排除了它。 扫地机的上电行为仅由 OnMode 控制。如果你在读取属性时发现 0x0002 不存在,这是正常的。

模式标签(ModeTag)

每个运行模式通过 ModeTag 标识其语义。ModeTag 让不同厂商的扫地机能用不同的 Label 文字, 但 App 仍然能通过标准化的 Tag 值识别出「这是清扫模式」还是「这是建图模式」。

0x4000
Idle(空闲) 扫地机处于待命状态,未执行任何任务
0x4001
Cleaning(清扫) 扫地机正在执行清扫任务
0x4002
Mapping(建图) 扫地机正在扫描环境、构建地图,不进行实际清扫
ModeTag 的实际用法

厂商 A 的清扫模式叫 "Auto Clean"(Mode=1),厂商 B 叫 "智能清扫"(Mode=3), 但两者的 ModeTags 都包含 0x4001 (Cleaning)。 App 判断模式语义时应看 ModeTag 而非 Label 或 Mode 编号。

状态码(StatusCode)

ChangeToModeResponse 的 Status 字段使用以下错误码。0x00 表示成功, 0x01–0x03 是 ModeBase 通用错误码,0x41–0x48 是扫地机专属错误码。

通用状态码(ModeBase)

0x00
Success 模式切换成功
0x01
UnsupportedMode 请求的模式编号不在 SupportedModes 中
0x02
GenericFailure 通用失败,无法归类到具体原因
0x03
InvalidInMode 当前模式下不允许切换到目标模式

扫地机专属状态码

0x41
Stuck(卡住) 扫地机被障碍物卡住,无法移动
0x42
DustBinMissing(尘盒缺失) 尘盒未安装到位,拒绝启动清扫
0x43
DustBinFull(尘盒已满) 尘盒已满,需要清理后才能继续
0x44
WaterTankEmpty(水箱空) 水箱无水,拖地功能无法启动
0x45
WaterTankMissing(水箱缺失) 水箱未安装
0x46
WaterTankLidOpen(水箱盖未关) 水箱盖子未正确关闭
0x47
MopCleaningPadMissing(拖布缺失) 拖布 / 清洁垫未安装
0x48
BatteryLow(电量不足) 电池电量过低,无法启动任务,需要先充电
App 端错误处理建议

这些状态码对应的都是用户可以自行解决的物理问题。 App 收到错误码后应向用户展示明确的操作指引,例如「请清空尘盒后重试」「请安装水箱」, 而不是显示通用的「操作失败」。StatusText 字段也可作为兜底的展示文案。

示例数据

一台支持三种运行模式的扫地机器人,当前正在清扫中的 RvcRunMode Cluster 读取结果:

{
  // --- 支持的运行模式 ---
  "0x0000": [                                    // SupportedModes(设备支持的模式列表)
    {
      "Label": "空闲",
      "Mode": 0,
      "ModeTags": [{ "Value": 16384 }]           // 0x4000 = Idle
    },
    {
      "Label": "清扫",
      "Mode": 1,
      "ModeTags": [{ "Value": 16385 }]           // 0x4001 = Cleaning
    },
    {
      "Label": "建图",
      "Mode": 2,
      "ModeTags": [{ "Value": 16386 }]           // 0x4002 = Mapping
    }
  ],

  // --- 当前状态 ---
  "0x0001": 1               // CurrentMode = 1(当前正在清扫)
}
关于 ModeTag 的数值

示例中 ModeTags 的 Value 使用十进制:16384 = 0x4000(Idle), 16385 = 0x4001(Cleaning),16386 = 0x4002(Mapping)。 实际协议传输中使用的是整数值,文档中常写十六进制是为了方便对照规范。

常见场景

场景 1:启动清扫

  1. 读取 SupportedModes(0x0000),找到 ModeTags 包含 0x4001 (Cleaning) 的模式,记下其 Mode 编号
  2. 发送 ChangeToMode(0x00),NewMode 设为上一步得到的编号
  3. 检查 ChangeToModeResponse 的 Status:
    • 0x00 —— 成功,扫地机开始清扫
    • 0x42 —— 尘盒未安装,提示用户装好尘盒
    • 0x43 —— 尘盒已满,提示用户清空
    • 0x48 —— 电量不足,提示用户先充电
  4. 订阅 CurrentMode(0x0001),当值变回 Idle 对应的编号时,说明清扫完成

场景 2:查询当前状态并展示

  1. 读取 SupportedModes(0x0000) 获取完整模式列表
  2. 读取 CurrentMode(0x0001) 获取当前模式编号
  3. 在 SupportedModes 中找到匹配的模式,取其 Label 展示在 App 界面上(如「清扫中」)
  4. 同时检查 ModeTags 中的 Tag 值,用标准化语义辅助 UI 展示:
    • 0x4000 (Idle) —— 显示待命图标
    • 0x4001 (Cleaning) —— 显示清扫动画
    • 0x4002 (Mapping) —— 显示地图扫描进度