冰箱模式 Cluster(RefrigeratorAndTemperatureControlledCabinetMode)
Cluster ID: 0x0052 |
所在 Endpoint: 冷藏室 / 冷冻室功能端点(可能有多个)
RefrigeratorAndTemperatureControlledCabinetMode 是 Matter 中用于冰箱模式控制的 Cluster,派生自 ModeBase Cluster。 它允许用户切换冰箱各温区的工作模式,例如启用急速制冷(RapidCool)或急速冷冻(RapidFreeze)。 每种模式通过语义标签(ModeTag)描述其用途,使不同厂商的冰箱能以统一方式被控制。
RefrigeratorAndTemperatureControlledCabinetMode 继承了 ModeBase Cluster 的全部命令和属性结构, 并定义了冰箱专属的 ModeTag 值(0x4000 ~ 0x4001)。 如果你已经熟悉 ModeBase 的工作方式,这个 Cluster 的使用方式完全一致,只是模式标签不同。
一台冰箱设备通常包含多个温控区域(冷藏室、冷冻室),每个区域对应一个独立的 Endpoint。 每个 Endpoint 上都有自己的 RefrigeratorAndTemperatureControlledCabinetMode Cluster 实例, 各自维护独立的 SupportedModes 和 CurrentMode。 例如冷藏室 Endpoint 可能支持 RapidCool,冷冻室 Endpoint 则支持 RapidFreeze。 操作时需先确认目标 Endpoint,避免对错误的温区发送命令。
命令(Commands)
RefrigeratorAndTemperatureControlledCabinetMode Cluster 只有一个命令 ChangeToMode,用于切换冰箱模式。 命令执行后设备返回 ChangeToModeResponse,告知切换是否成功。
| ID | 名称 | 方向 | 说明 |
|---|---|---|---|
0x00 |
ChangeToMode | Client → Server | 切换到指定冰箱模式 |
0x01 |
ChangeToModeResponse | Server → Client | 切换结果响应(Status + StatusText) |
ChangeToMode -- 切换模式(0x00)
请求设备切换到指定的冰箱模式。NewMode 的值必须是 SupportedModes 列表中某个 ModeOptionStruct 的 Mode 字段。 设备收到后返回 ChangeToModeResponse。注意需要向正确的 Endpoint 发送命令 -- 冷藏室和冷冻室是独立的。
请求参数
| 参数 | 类型 | 说明 |
|---|---|---|
| NewMode | uint8 | 目标模式编号,必须存在于该 Endpoint 的 SupportedModes 列表中 |
响应字段(ChangeToModeResponse)
| 字段 | 类型 | 说明 |
|---|---|---|
| Status | enum8 | 操作结果状态码(见状态码) |
| StatusText | string(可选) | 人类可读的状态描述,失败时提供原因 |
使用场景
用户在 App 上对冷冻室启用「急速冷冻」模式,App 向冷冻室 Endpoint 发送 ChangeToMode(NewMode = 1)。 冰箱返回 ChangeToModeResponse(Status = 0x00, Success),该 Endpoint 的 CurrentMode 更新为 1。 如果冰箱当前状态不允许切换(例如正在除霜),会返回 GenericFailure 并在 StatusText 中说明原因。
属性详解
RefrigeratorAndTemperatureControlledCabinetMode Cluster 继承 ModeBase 的 4 个属性。每个 Endpoint 各自维护一份。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
SupportedModes | list<ModeOptionStruct> | 该温区支持的所有工作模式 |
0x0001 |
CurrentMode | uint8 | 当前选中的模式 |
0x0002 |
StartUpMode 新版已移除 | uint8 / null | 设备启动时的默认模式 |
0x0003 |
OnMode 新版已移除 | uint8 / null | 设备开机时自动切换到的模式 |
SupportedModes -- 支持的模式列表(0x0000)
该 Endpoint(温区)支持的全部工作模式,每个元素是一个 ModeOptionStruct:
| 字段 | 类型 | 说明 |
|---|---|---|
| Label | string | 模式名称,供人类阅读(如 "Normal"、"Rapid Cool") |
| Mode | uint8 | 模式编号,在列表中唯一,用于 ChangeToMode 命令 |
| ModeTags | list<ModeTagStruct> | 语义标签列表,描述模式的用途(见ModeTag 标签) |
冷藏室 Endpoint 可能支持 RapidCool 模式,而冷冻室 Endpoint 支持 RapidFreeze 模式。 App 应分别读取每个 Endpoint 的 SupportedModes,独立展示各温区的可用模式列表。
CurrentMode -- 当前模式(0x0001)
当前选中的工作模式编号。值必须是 SupportedModes 中某个 ModeOptionStruct 的 Mode 字段。 通过 ChangeToMode 命令修改。可订阅此属性获取模式变更通知。
StartUpMode -- 启动模式(0x0002) 新版已移除
StartUpMode 已不在较新版本的 Matter 规范中(本站对照的 connectedhomeip v1.6 官方定义里已没有它)。按新版本开发的设备不会实现它,这里保留说明仅供对接旧设备时参考。新版本中上电后的模式由设备自行决定,控制端改用 ChangeToMode 命令切换模式。
设备上电或重启后的初始模式。Nullable -- 值为 null 时表示保持上次断电前的模式。
设置具体值时,该值必须存在于 SupportedModes 列表中。
冰箱断电恢复后,通常应回到普通模式而非继续急速制冷/冷冻。 建议将 StartUpMode 设为普通模式的编号(如 0),避免断电恢复后压缩机长时间高功率运行。
OnMode -- 开机模式(0x0003) 新版已移除
OnMode 已不在较新版本的 Matter 规范中(本站对照的 connectedhomeip v1.6 官方定义里已没有它)。按新版本开发的设备不会实现它,这里保留说明仅供对接旧设备时参考。它依赖的 DEPONOFF(OnOff 依赖)特性也一并被移除;控制端改用 ChangeToMode 命令切换模式。
当设备从 Off 切换到 On 时自动应用的模式。Nullable -- 值为 null 时不覆盖,保持 CurrentMode 不变。
如果 OnMode 有值,每次开机都会将 CurrentMode 强制设为该值,忽略 StartUpMode 的设置。
如果 OnMode 不为 null,它的优先级高于 StartUpMode。 设备上电流程:先应用 StartUpMode(如果有),再在 Off → On 时应用 OnMode 覆盖。 实际效果是开机后始终使用 OnMode 指定的模式。
OnMode 属性仅在设备支持 DEPONOFF 特性时才存在。 该特性表示此 Cluster 依赖同一 Endpoint 上的 OnOff Cluster, 当 OnOff 状态从 Off 变为 On 时,会自动将 CurrentMode 设为 OnMode 指定的值。
ModeTag 语义标签
RefrigeratorAndTemperatureControlledCabinetMode 定义了 2 个专属 ModeTag 值,用于标准化描述冰箱工作模式。 App 应根据这些标签识别模式用途,而不是依赖厂商自定义的 Label 文字。
通常 RapidCool 出现在冷藏室 Endpoint 的 SupportedModes 中, RapidFreeze 出现在冷冻室 Endpoint 的 SupportedModes 中。 但规范并不强制这种对应关系 -- 某些高端冰箱可能在同一温区同时支持两种标签。 App 应始终以实际读取到的 SupportedModes 为准。
状态码(StatusCode)
ChangeToModeResponse 中 Status 字段的可能取值:
Feature 位图
RefrigeratorAndTemperatureControlledCabinetMode Cluster 通过 FeatureMap(0xFFFC)声明设备支持的特性:
大多数冰箱不会频繁开关机,因此 DEPONOFF 特性在冰箱场景下使用较少。 但如果冰箱的温区可以独立开关(例如变温室可在冷藏/冷冻/关闭之间切换), 启用 DEPONOFF 后可通过 OnMode 属性在温区重新开启时自动恢复到指定模式。
示例数据
一台双温区冰箱的两个 Endpoint 分别读取到的 Cluster 数据:
冷藏室 Endpoint
{
// --- 冷藏室 Endpoint 的模式列表 ---
"0x0000": [ // SupportedModes
{
"Label": "Normal",
"Mode": 0,
"ModeTags": [] // 普通模式,无特殊标签
},
{
"Label": "Rapid Cool",
"Mode": 1,
"ModeTags": [{ "Value": 16384 }] // 0x4000 = RapidCool
}
],
// --- 当前模式 ---
"0x0001": 0 // CurrentMode = 0(Normal)
// --- 启动与开机模式 ---
}
冷冻室 Endpoint
{
// --- 冷冻室 Endpoint 的模式列表 ---
"0x0000": [ // SupportedModes
{
"Label": "Normal",
"Mode": 0,
"ModeTags": []
},
{
"Label": "Rapid Freeze",
"Mode": 1,
"ModeTags": [{ "Value": 16385 }] // 0x4001 = RapidFreeze
}
],
// --- 当前模式 ---
"0x0001": 1 // CurrentMode = 1(Rapid Freeze 急冻中)
// --- 启动与开机模式 ---
}
同一台冰箱的不同 Endpoint 上,SupportedModes 的内容和编号可以完全不同。 App 展示模式列表时应针对每个 Endpoint 独立读取 SupportedModes,不要假设各温区的模式列表相同。 使用 ModeTag 值判断模式类型,而不是比较 Label 字符串或 Mode 编号。
常见场景
场景 1:大量食材入库后启用急速制冷
操作步骤与说明
场景:用户采购大量食材回家,需要快速降低冷藏室温度以保持食材新鲜。
- 通过 Descriptor Cluster 确认冰箱的 Endpoint 结构,找到冷藏室对应的 Endpoint
- 读取冷藏室 Endpoint 的
SupportedModes (0x0000),找到带有 RapidCool(0x4000)ModeTag 的模式条目 - 发送
ChangeToMode (0x00),NewMode 填入 RapidCool 模式的 Mode 编号 - 检查 ChangeToModeResponse 的 Status 是否为 Success
- 订阅
CurrentMode (0x0001),在用户界面显示当前处于急速制冷状态 - 急速制冷结束后(设备自动或用户手动),再次发送 ChangeToMode 切回普通模式
注意:部分冰箱会在急速制冷达到目标温度后自动回退到普通模式, App 应通过订阅 CurrentMode 感知这种自动切换,及时更新界面状态。
场景 2:多温区独立控制
操作步骤与说明
场景:用户想对冷冻室启用急速冷冻,同时保持冷藏室的普通模式不变。
- 读取设备的 Descriptor Cluster(Endpoint 0),获取所有 Endpoint 及其 Device Type
- 识别冷藏室 Endpoint(Device Type: Refrigerator,0x0070)和冷冻室 Endpoint(Device Type: Temperature Controlled Cabinet,0x0071)
- 分别读取两个 Endpoint 的
SupportedModes (0x0000):- 冷藏室:可能包含 Normal 和 RapidCool
- 冷冻室:可能包含 Normal 和 RapidFreeze
- 向冷冻室 Endpoint 发送
ChangeToMode,切换到 RapidFreeze 模式 - 冷藏室不做操作,保持当前模式
- App 界面上分区展示两个温区的当前模式,各自独立控制
关键点:冷藏室和冷冻室的 Cluster 实例是完全独立的, 对一个 Endpoint 的操作不会影响另一个。App 设计时应体现这种分区控制的概念。