扫地机器人操作状态 Cluster(RvcOperationalState)

Cluster ID: 0x0061  |  所在 Endpoint: 通常在 Endpoint 1(功能端点) |  继承自: OperationalState(0x0060)

RvcOperationalState 是 OperationalState(0x0060) 的扫地机器人专用派生 Cluster。它继承了基础状态机的所有属性和事件结构, 但根据扫地机器人的实际使用场景做了重要调整:

  • 去掉了 Start 和 Resume 命令 —— 扫地机器人通过 RvcRunMode Cluster 选择清扫模式来启动,不直接用 Start
  • 新增了 GoHome 命令(0x80) —— 让机器人主动回充电座
  • 扩展了 3 个 RVC 专属运行状态 —— SeekingCharger(寻找充电座)、Charging(充电中)、Docked(已停靠)
  • 扩展了 8 个 RVC 专属错误码 —— 涵盖充电座、卡住、尘盒、水箱、拖布等常见故障
与基础 OperationalState 的关系

RvcOperationalState 并非替代 OperationalState,而是在其基础上定制了扫地机器人的行为。 基础的 4 个状态(Stopped/Running/Paused/Error)仍然保留,RVC 扩展的 3 个状态(0x40~0x42) 是在此基础上增加的。同样,基础的 4 个错误码(NoError/UnableToStartOrResume 等)仍然有效, RVC 扩展的 8 个错误码(0x40~0x47)用于描述扫地机器人特有的故障场景。

命令(Commands)

RvcOperationalState Cluster 共有 3 个命令。相比基础 OperationalState 的 4 个命令, 去掉了 Start(0x02)和 Resume(0x03), 因为扫地机器人的启动和模式切换由 RvcRunMode Cluster 负责。 新增了 GoHome(0x80) 命令,用于让机器人返回充电座。 所有命令执行后都会返回 OperationalCommandResponse,包含一个 ErrorStateStruct 用于指示操作是否成功。

ID 名称 说明 响应
0x00 Pause 暂停当前操作 OperationalCommandResponse
0x01 Stop 新版已移除 停止操作 OperationalCommandResponse
0x80 GoHome 返回充电座 OperationalCommandResponse
没有 Start 和 Resume 命令

扫地机器人的启动不是通过 OperationalState 的 Start 命令,而是通过 RvcRunMode Cluster 的 ChangeToMode 命令来实现。 选择清扫模式(如标准清扫、深度清扫)后,机器人自动开始工作。 同理,暂停后的恢复也通过 RvcRunMode 来控制。 如果向 RvcOperationalState 发送 Start 或 Resume 命令,会收到 CommandInvalidInState (3) 错误。

Pause —— 暂停(0x00)

暂停机器人当前正在进行的操作(清扫、回充等)。执行成功后,OperationalState 属性变为 Paused (2)。机器人会原地停止并保留当前位置和清扫进度。不需要参数。

状态限制

只有当机器人处于 Running (1) 或 SeekingCharger (0x40) 状态时才能暂停。 如果在 Stopped (0)、Charging (0x41)、Docked (0x42) 或 Error (3) 状态下调用,会返回 CommandInvalidInState (3) 错误。

使用场景

机器人正在清扫客厅,用户需要临时搬开地上的杂物。App 发送 Pause 命令, 机器人原地停止等待。整理完毕后通过 RvcRunMode 恢复清扫。

Stop —— 停止(0x01) 新版已移除

新版 Matter 已移除

Stop 已不在较新版本的 Matter 规范中(本站对照的 connectedhomeip v1.6 官方定义里已没有它)。按新版本开发的设备不会实现它,这里保留说明仅供对接旧设备时参考。新版本的扫地机状态 Cluster 只保留 Pause(0x00)、Resume(0x03)和 GoHome(0x80)三个命令。要结束清扫,应通过 RvcRunMode 把运行模式切回空闲(Idle)模式。

完全停止机器人的当前操作。执行成功后,OperationalState 属性变为 Stopped (0)。与 Pause 不同,Stop 会结束本次清扫任务, 需要通过 RvcRunMode 重新选择模式才能开始新的清扫。不需要参数。

使用场景

用户要出门,不想让机器人继续清扫。发送 Stop 命令终止清扫任务。 回家后可以通过 RvcRunMode 重新启动清扫。

GoHome —— 返回充电座(0x80)

RVC 专属命令。指示机器人停止当前操作并返回充电座。 执行成功后,OperationalState 属性变为 SeekingCharger (0x40), 机器人开始自动导航回充电座。到达后状态依次变为 Charging (0x41) → Docked (0x42)。不需要参数。

状态限制

当机器人已经处于 Charging (0x41) 或 Docked (0x42) 状态时, 调用 GoHome 会返回 CommandInvalidInState (3) 错误 —— 机器人已经在充电座上了。

使用场景

机器人清扫到一半,用户想让它提前回充电座。App 发送 GoHome 命令, 机器人放弃剩余清扫区域,自动导航回充电座充电。 也常用于清扫完成后未自动回充的情况。

OperationalCommandResponse —— 命令响应

所有三个命令(Pause/Stop/GoHome)执行后都会返回此响应。 它包含一个 ErrorStateStruct,用于指示命令是否成功。

字段类型说明
CommandResponseState ErrorStateStruct 命令执行结果。ErrorStateID = 0 (NoError) 表示成功

属性详解

RvcOperationalState Cluster 继承了基础 OperationalState 的全部 6 个属性,定义完全一致。 点击下方汇总表中的属性 ID 可跳转到对应的详细说明。

ID 名称 类型 分组 说明
0x0000 PhaseList list<string> / null 阶段信息 操作阶段列表
0x0001 CurrentPhase uint8 / null 阶段信息 当前所处阶段索引
0x0002 CountdownTime elapsed_s / null 阶段信息 剩余时间(秒)
0x0003 OperationalStateList list<OperationalStateStruct> 运行状态 设备支持的所有状态(含 RVC 扩展)
0x0004 OperationalState OperationalStateEnum 运行状态 当前运行状态
0x0005 OperationalError ErrorStateStruct 运行状态 当前错误信息

阶段信息(0x0000, 0x0001, 0x0002)

描述机器人当前清扫任务的阶段进度和剩余时间。 扫地机器人的阶段划分可能包括:主区域清扫、沿边清扫、拖地、回充等。

ID 名称 类型 说明
0x0000 PhaseList(阶段列表) list<string> / null 机器人清扫操作的有序阶段名称列表。例如 ["主刷清扫", "沿边清扫", "回充中"]。 Nullable —— null 表示机器人不支持阶段划分。 列表最多 32 项
0x0001 CurrentPhase(当前阶段) uint8 / null 当前所处阶段在 PhaseList 中的索引(从 0 开始)。 Nullable —— 当 PhaseList 为 null 时,此值也为 null
0x0002 CountdownTime(剩余时间) elapsed_s / null 当前清扫任务的预计剩余时间,单位秒。机器人会根据剩余面积和电量定期更新此值。 Nullable —— null 表示机器人无法预估剩余时间
扫地机器人的阶段特殊性

与洗衣机等家电不同,扫地机器人的阶段划分不一定是固定的线性流程。 有些机器人可能在清扫过程中动态调整阶段(如发现电量不足时插入回充阶段), 因此 PhaseList 的内容可能随任务执行而变化。 App 应定期重新读取 PhaseList,而不是只在任务开始时读取一次。

运行状态(0x0003, 0x0004, 0x0005)

描述机器人的运行状态和错误信息。OperationalStateList 会包含基础的 4 个状态 以及 RVC 扩展的 3 个状态(SeekingCharger/Charging/Docked)。

ID 名称 类型 说明
0x0003 OperationalStateList(状态列表) list<OperationalStateStruct> 机器人支持的所有运行状态。除了基础的 0~3 四个状态之外, RVC 还会在列表中包含 0x40~0x42 三个扩展状态(寻找充电座/充电中/已停靠)
0x0004 OperationalState(运行状态) OperationalStateEnum 机器人当前的运行状态,取值范围见 OperationalStateEnum(含 RVC 扩展值)。 这是 App 展示机器人状态的核心属性
0x0005 OperationalError(当前错误) ErrorStateStruct 机器人当前的错误状态。当 OperationalState 为 Error (3) 时,此属性包含具体的错误信息(含 RVC 扩展错误码)。 无错误时 ErrorStateID = 0 (NoError)

枚举定义

OperationalStateEnum —— 运行状态

RVC 的运行状态枚举继承了基础 OperationalState 的 4 个标准值(0~3), 并在 0x40~0x42 范围内扩展了 3 个扫地机器人专属状态。

基础状态(继承自 OperationalState)

0
Stopped 已停止 —— 机器人空闲,可以通过 RvcRunMode 启动清扫
1
Running 运行中 —— 正在执行清扫任务,可以 Pause、Stop 或 GoHome
2
Paused 已暂停 —— 清扫被暂停,可以通过 RvcRunMode 恢复或 Stop
3
Error 错误 —— 发生故障,查看 OperationalError 获取详情

RVC 扩展状态

0x40
SeekingCharger 寻找充电座 —— 机器人正在自动导航回充电座的途中
0x41
Charging 充电中 —— 已停靠在充电座上并正在充电
0x42
Docked 已停靠 —— 停靠在充电座上,电量已满或待机中
充电状态的变迁

典型的充电流程是:SeekingCharger (0x40) → Charging (0x41) → Docked (0x42)。机器人回到充电座后先进入 Charging 状态充电, 电量充满后转为 Docked 待机状态。从 Docked 或 Charging 状态启动清扫, 需要通过 RvcRunMode Cluster 发送 ChangeToMode 命令。

ErrorStateEnum —— 错误类型

RVC 的错误状态枚举继承了基础的 4 个通用错误码(0~3), 并在 0x40~0x47 范围内扩展了 8 个扫地机器人专属错误码,涵盖充电座、机械故障、耗材等常见问题。

基础错误码(继承自 OperationalState)

0
NoError 无错误 —— 一切正常
1
UnableToStartOrResume 无法启动或恢复 —— 机器人因某种原因无法开始清扫
2
UnableToCompleteOperation 无法完成操作 —— 清扫过程中遇到了不可恢复的问题
3
CommandInvalidInState 命令在当前状态无效 —— 如在 Docked 状态下调用 GoHome

RVC 扩展错误码

0x40
FailedToFindChargingDock 找不到充电座 —— 机器人无法定位或导航到充电座
0x41
Stuck 卡住了 —— 机器人被障碍物或地形困住无法移动
0x42
DustBinMissing 尘盒未安装 —— 尘盒被取出后未放回
0x43
DustBinFull 尘盒已满 —— 需要清倒尘盒才能继续清扫
0x44
WaterTankEmpty 水箱无水 —— 拖地模式下水箱已空,需要加水
0x45
WaterTankMissing 水箱未安装 —— 水箱被取出后未放回
0x46
WaterTankLidOpen 水箱盖未关 —— 水箱盖子未正确关闭,有漏水风险
0x47
MopCleaningPadMissing 拖布未安装 —— 拖地模式需要安装拖布才能工作
错误处理建议

RVC 的 8 个扩展错误码都是用户可自行解决的物理问题。 App 在收到这些错误时,应该给出明确的操作指引(如「请清倒尘盒后重启清扫」), 而不只是显示错误码。用户处理完问题后,通过 RvcRunMode 重新启动清扫即可。

数据结构

ErrorStateStruct —— 错误状态结构

用于描述机器人的错误信息。既用于 OperationalError 属性,也用于命令响应。 结构与基础 OperationalState 完全一致。

字段类型必选说明
ErrorStateID ErrorStateEnum 是 错误类型编码。0 表示无错误。RVC 扩展错误码范围 0x40~0x47
ErrorStateLabel string 否 可选的本地化错误标签,供 App 直接展示。对于 RVC 扩展错误码(0x40~0x47),此字段必须提供
ErrorStateDetails string 否 可选的错误详细描述,提供更多诊断信息(如「左侧轮子被线缆缠绕」)

OperationalStateStruct —— 操作状态结构

用于 OperationalStateList 属性中,描述机器人支持的每一个运行状态。

字段类型必选说明
OperationalStateID uint8 是 状态编码。0~3 为标准状态,0x40~0x42 为 RVC 扩展状态
OperationalStateLabel string 否 可选的本地化状态标签。对于标准状态(0~3)可省略;对于 RVC 扩展状态(0x40~0x42)必须提供

事件(Events)

RvcOperationalState Cluster 继承了基础 OperationalState 的 2 个事件, 用于通知控制端机器人的重要状态变化。

OperationalError 事件

当机器人进入错误状态时触发此事件。事件优先级为 CRITICAL, 确保 App 能及时收到错误通知(如机器人卡住、尘盒已满等)。

字段类型说明
ErrorState ErrorStateStruct 当前的错误信息,ErrorStateID 可能是 RVC 扩展错误码(0x40~0x47)

OperationCompletion 事件

当机器人完成一个完整清扫周期时触发此事件。事件优先级为 INFO。 该事件携带清扫的时间统计信息,方便 App 展示清扫报告。

字段类型必选说明
CompletionErrorCode ErrorStateEnum 是 清扫完成时的错误码。0 (NoError) 表示正常完成
TotalOperationalTime elapsed_s / null 否 清扫总耗时(秒),包含暂停时间。null 表示机器人不支持统计
PausedTime elapsed_s / null 否 暂停累计时长(秒)。null 表示机器人不支持统计
清扫报告

App 可以结合 OperationCompletion 事件的时间统计和清扫面积等信息, 生成清扫报告。例如:「本次清扫耗时 45 分钟,实际清扫 40 分钟,暂停 5 分钟」。 注意 CompletionErrorCode 不一定是 NoError —— 机器人可能因为 电量耗尽或故障而提前结束清扫,此时会携带对应的错误码。

示例数据

一台正在清扫中的扫地机器人的 RvcOperationalState Cluster 读取结果:

{
  // --- 阶段信息 ---
  "0x0000": ["主刷清扫", "沿边清扫", "回充中"],  // PhaseList(操作阶段列表)
  "0x0001": 0,                                    // CurrentPhase = 0(当前处于「主刷清扫」阶段)
  "0x0002": 2400,                                  // CountdownTime = 2400 秒(剩余约 40 分钟)

  // --- 运行状态 ---
  "0x0003": [                                      // OperationalStateList(设备支持的状态列表)
    { "OperationalStateID": 0, "OperationalStateLabel": "已停止" },
    { "OperationalStateID": 1, "OperationalStateLabel": "运行中" },
    { "OperationalStateID": 2, "OperationalStateLabel": "已暂停" },
    { "OperationalStateID": 3, "OperationalStateLabel": "错误" },
    { "OperationalStateID": 64, "OperationalStateLabel": "寻找充电座" },
    { "OperationalStateID": 65, "OperationalStateLabel": "充电中" },
    { "OperationalStateID": 66, "OperationalStateLabel": "已停靠" }
  ],
  "0x0004": 1,                                     // OperationalState = Running(正在清扫)
  "0x0005": {                                      // OperationalError(当前无错误)
    "ErrorStateID": 0,
    "ErrorStateLabel": "",
    "ErrorStateDetails": ""
  }
}
开发提示

RVC 设备的 OperationalStateList (0x0003) 会比基础 OperationalState 多出 3 个扩展状态条目(ID 64/65/66 即 0x40/0x41/0x42)。App 在渲染状态选择或状态指示时, 需要处理这些 RVC 专属状态的 UI 展示(如为「寻找充电座」显示导航动画、为「充电中」显示电量进度)。 同样,错误处理逻辑也需要覆盖 0x40~0x47 范围的 RVC 扩展错误码。

常见场景

场景 1:完整清扫生命周期

  1. 机器人处于 Docked (0x42) 状态,停靠在充电座上待机
  2. 用户通过 RvcRunMode Cluster 发送 ChangeToMode 命令,选择「标准清扫」模式
  3. 机器人离开充电座,状态变为 Running (1),开始清扫
  4. App 订阅 OperationalState、CurrentPhase、CountdownTime, 实时更新清扫进度和剩余时间
  5. 清扫完成后,机器人自动进入 SeekingCharger (0x40) 状态回充
  6. 到达充电座后变为 Charging (0x41),充满电后变为 Docked (0x42)
  7. 触发 OperationCompletion 事件,App 展示清扫报告:「清扫完成,总耗时 45 分钟」

场景 2:清扫中的错误处理

  1. 机器人正在清扫(Running (1)),突然被地毯边缘卡住
  2. 机器人尝试脱困失败,状态变为 Error (3),OperationalError 更新为:
    • ErrorStateID = 0x41 (Stuck)
    • ErrorStateLabel = "机器人卡住"
    • ErrorStateDetails = "左侧轮子无法转动,请检查是否有异物缠绕"
  3. 设备触发 OperationalError 事件(CRITICAL 优先级),App 弹出推送通知
  4. App 根据错误码 0x41(Stuck)展示对应的操作指引:「请将机器人搬到开阔位置」
  5. 用户处理完毕后,发送 Stop (0x01) 新版已移除 清除错误状态
  6. 通过 RvcRunMode 重新启动清扫任务

场景 3:手动回充(GoHome)

  1. 机器人正在清扫(Running (1)),用户想让它提前回充
  2. App 发送 GoHome (0x80) 命令
  3. 机器人停止清扫,状态变为 SeekingCharger (0x40),开始自动导航回充电座
  4. App 可以展示「正在返回充电座...」的状态提示
  5. 机器人到达充电座后,状态变为 Charging (0x41)
  6. 如果导航过程中找不到充电座,状态变为 Error (3), 错误码为 FailedToFindChargingDock (0x40)
  7. App 展示:「找不到充电座,请检查充电座是否通电并且前方无障碍物」