风扇 Cluster(FanControl)

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

FanControl 是 Matter 中控制风扇设备的核心 Cluster,适用于 HVAC 系统风扇、吊扇、独立风扇等场景。 它定义了风扇模式切换、转速控制、摇头、风感模式、送风方向等全部能力。 风扇类设备的日常开发基本都围绕这个 Cluster 展开。

Feature 驱动的能力差异

FanControl 的能力差异很大 —— 一个简单的 HVAC 风扇可能只支持百分比调速, 而一台高端吊扇可能同时支持多档位、自动模式、摇头、自然风和正反转。 开发前先读取 FeatureMap (0xFFFC),确认设备支持哪些 Feature,再决定 UI 布局。

Feature 位图

FanControl Cluster 通过 FeatureMap(0xFFFC)声明设备支持哪些能力。Feature 直接决定了哪些属性和命令可用:

Bit 0
SPD(MultiSpeed) 多档位 —— 支持 SpeedMax / SpeedSetting / SpeedCurrent 三个档位属性
Bit 1
AUT(Auto) 自动模式 —— FanMode 可选 Auto,设备自行调节转速
Bit 2
RCK(Rocking) 摇头 —— 支持 RockSupport / RockSetting,控制风扇摆动方向
Bit 3
WND(Wind) 风感模式 —— 支持 WindSupport / WindSetting,提供睡眠风、自然风等模式
Bit 4
STEP(Step) 步进调速 —— 支持 Step 命令,逐级增减风速
Bit 5
AIRDIR(AirDirection) 送风方向 —— 支持 AirflowDirection 属性,控制正转/反转
Feature 组合示例

一台普通 HVAC 风扇:FeatureMap = 0x00(无额外 Feature,仅百分比调速)。
一台高端吊扇:FeatureMap = 0x3F(全部 6 个 Feature),支持多档位、自动模式、摇头、风感、步进和正反转。
独立落地扇:FeatureMap = 0x0F(SPD + AUT + RCK + WND),有档位、自动、摇头和风感,但不支持步进和反转。

命令(Commands)

FanControl Cluster 只有一个命令 —— Step,用于步进式调整风速。 大部分风扇控制通过直接写属性完成(如写入 FanMode、PercentSetting、SpeedSetting 等), Step 命令提供了一种不需要知道当前状态就能增减风速的便捷方式。 点击下方表格中的命令 ID 可跳转到详细说明。

ID 名称 说明 Feature 要求
0x00 Step 步进调速(增加或减少一档) STEP

Step —— 步进调速(0x00)

向风扇发送步进调速指令,逐级增大或减小风速。 具体增减的幅度由设备自行决定(通常对应一个百分比或一个档位)。 如果当前风速已到最大或最小值,再向同方向调整时设备会忽略(不报错)。

参数类型必填说明
Direction StepDirectionEnum 是 步进方向(见下方枚举)
Wrap bool 否 是否循环。true 表示到最大后再 Increase 会回到最小值(反之亦然)
LowestOff bool 否 循环时最低档是否为关闭。true 表示减到最低后再减一步会关闭风扇

StepDirection 枚举值

0
Increase 增大风速(升一档)
1
Decrease 减小风速(降一档)
使用场景与参数

适合物理遥控器的「风速+」「风速-」按键 —— 每按一次发送一个 Step 命令,不需要事先读取当前速度。 如果 Wrap = true,用户可以不断按「风速+」循环切换档位(如:低 → 中 → 高 → 关 → 低 ...)。

属性详解

FanControl Cluster 的属性按功能分为五组。点击下方汇总表中的属性 ID 可跳转到对应的详细说明。

ID 名称 类型 分组 说明
0x00 FanMode enum8 风扇模式 当前工作模式
0x01 FanModeSequence enum8 风扇模式 支持的模式序列
0x02 PercentSetting uint8 / null 百分比控制 目标风速百分比
0x03 PercentCurrent uint8 百分比控制 实际风速百分比
0x04 SpeedMax uint8 多档位控制 最大档位数
0x05 SpeedSetting uint8 / null 多档位控制 目标档位
0x06 SpeedCurrent uint8 多档位控制 实际档位
0x07 RockSupport bitmap8 摇头功能 支持的摇头方向
0x08 RockSetting bitmap8 摇头功能 当前摇头设置
0x09 WindSupport bitmap8 风感模式 支持的风感模式
0x0A WindSetting bitmap8 风感模式 当前风感设置
0x0B AirflowDirection enum8 送风方向 送风方向(正转/反转)

风扇模式(0x00, 0x01)

控制风扇的工作模式和模式切换范围。FanMode 是最核心的控制属性 —— 大部分 App 界面上的模式按钮直接对应它。

ID 名称 类型 说明
0x00 FanMode
风扇模式
enum8 风扇当前的工作模式。写入新值可切换模式。Auto 和 Smart 模式下设备自行调节转速。见下方枚举
0x01 FanModeSequence
模式序列
enum8 声明设备支持的模式组合。决定 FanMode 可写入哪些值 —— 如果序列里没有 Auto,就不能写 Auto。见下方枚举

FanMode 枚举值

0
Off 关闭,风扇停转
1
Low 低速挡
2
Medium 中速挡
3
High 高速挡
4
On 开启(具体速度由设备决定,通常恢复上次的速度)
5
Auto 自动模式 —— 设备根据环境自动调节转速。需要 AUT Feature
6
Smart 智能模式 —— 已废弃,等同于 Auto。兼容旧设备保留
FanMode 写入与 PercentSetting / SpeedSetting 的联动

写入 FanMode 时,设备会自动更新 PercentSetting 和 SpeedSetting(如果支持 SPD Feature)。 例如写入 FanMode = High 后,PercentSetting 可能自动变为 100。 反过来,直接写 PercentSetting 或 SpeedSetting 也可能导致 FanMode 联动变化。 读取状态时以 PercentCurrent / SpeedCurrent 为准,不要依赖 Setting 值。

FanModeSequence 枚举值

0
OffLowMedHigh Off / Low / Medium / High
1
OffLowHigh Off / Low / High(无中速挡)
2
OffLowMedHighAuto Off / Low / Medium / High / Auto
3
OffLowHighAuto Off / Low / High / Auto(无中速挡)
4
OffHighAuto Off / High / Auto(仅两挡 + 自动)
5
OffHigh Off / High(仅开关,无中间挡位)

百分比控制(0x02, 0x03)

所有风扇都支持百分比控制 —— 这是最通用的调速方式,不依赖任何 Feature。

ID 名称 类型 说明
0x02 PercentSetting
目标风速百分比
uint8 / null 目标风速百分比,范围 0~100。写入 0 等同于 FanMode = Off。Nullable —— null 表示设备处于自动/智能模式,风速由设备自行管理
0x03 PercentCurrent
实际风速百分比
uint8 风扇当前实际运转的风速百分比,范围 0~100。这是只读属性,反映真实物理状态。界面展示应以此值为准
Setting 与 Current 的区别

PercentSetting 是「目标值」(你想要多少),PercentCurrent 是「实际值」(风扇真正在转多少)。 两者可能不一致 —— 例如写入 PercentSetting = 60 后,由于电机特性或档位量化, 实际转速可能是 58% 或 65%。App 界面上展示风速时应使用 PercentCurrent。

多档位控制(0x04, 0x05, 0x06)

需要 SPD(MultiSpeed) Feature。百分比是连续值,档位是离散值 —— 对于有物理挡位的风扇(如 3 挡吊扇),用 SpeedSetting 比百分比更自然。

ID 名称 类型 说明
0x04 SpeedMax
最大档位
uint8 设备支持的最大档位数,范围 1~100。只读属性。例如 SpeedMax = 3 表示风扇有 3 个档位(1、2、3)
0x05 SpeedSetting
目标档位
uint8 / null 目标档位,范围 0~SpeedMax。写入 0 等同于关闭。Nullable —— null 表示自动模式下由设备决定。需要 SPD Feature
0x06 SpeedCurrent
实际档位
uint8 风扇当前实际运转的档位,范围 0~SpeedMax。只读属性。需要 SPD Feature
百分比与档位的自动换算

设备内部会在百分比和档位之间自动换算。例如 SpeedMax = 4 的风扇: 写入 SpeedSetting = 2 后,PercentCurrent 大约是 50%; 写入 PercentSetting = 75 后,SpeedCurrent 大约是 3。 具体换算逻辑由设备固件决定,不一定是精确的线性映射。

摇头功能(0x07, 0x08)

需要 RCK(Rocking) Feature。控制风扇的物理摆动方向 —— 常见于独立风扇和部分吊扇。

ID 名称 类型 说明
0x07 RockSupport
摇头能力位图
bitmap8 设备支持哪些摇头方向(只读)。见下方位图
0x08 RockSetting
摇头设置位图
bitmap8 当前启用的摇头方向。可读写,写入的值必须是 RockSupport 的子集。全部清零表示停止摇头

Rock 位图定义

Bit 0
RockLeftRight 左右摇头
Bit 1
RockUpDown 上下摇头
Bit 2
RockRound 环绕摇头(360 度旋转)
摇头组合

RockSetting 是位图,可以同时启用多个方向。例如 RockSetting = 0x03(Bit 0 + Bit 1)表示同时左右 + 上下摇头。 但前提是 RockSupport 的对应位也是 1 —— 写入不支持的方向会被设备拒绝。

风感模式(0x09, 0x0A)

需要 WND(Wind) Feature。提供模拟自然风、睡眠风等非匀速送风模式,让体感更舒适。

ID 名称 类型 说明
0x09 WindSupport
风感能力位图
bitmap8 设备支持哪些风感模式(只读)。见下方位图
0x0A WindSetting
风感设置位图
bitmap8 当前启用的风感模式。可读写,写入值必须是 WindSupport 的子集。全部清零表示匀速送风

Wind 位图定义

Bit 0
SleepWind 睡眠风 —— 风速随时间逐渐降低,适合入睡
Bit 1
NaturalWind 自然风 —— 风速随机波动,模拟户外微风
风感模式是互斥的

虽然 WindSetting 是位图格式,但 SleepWind 和 NaturalWind 通常互斥 —— 不应同时启用两种风感。 规范未明确禁止同时设置,但实际设备的行为未定义。建议 App 界面上设计为单选按钮。

送风方向(0x0B)

需要 AIRDIR(AirDirection) Feature。控制风扇叶片的旋转方向 —— 主要用于吊扇的夏/冬模式切换。

ID 名称 类型 说明
0x0B AirflowDirection
送风方向
enum8 风扇叶片的旋转方向。对于吊扇,正转向下送风(夏季),反转向上循环(冬季)。见下方枚举

AirflowDirection 枚举值

0
Forward 正转 —— 向下送风(吊扇夏季模式)
1
Reverse 反转 —— 向上送风,利用天花板反射促进空气循环(吊扇冬季模式)
吊扇正反转的实际用途

夏季(Forward / 正转):叶片逆时针旋转,产生向下气流,人站在扇下感受到凉风。
冬季(Reverse / 反转):叶片顺时针旋转,将热空气沿天花板向下推送。 人不会直接感受到风吹,但房间温度更均匀,暖气效率更高。
很多用户不知道吊扇有这个功能 —— App 可以在换季时主动提示切换方向。

示例数据

一台支持全部 Feature 的智能吊扇在运转中的 FanControl Cluster 读取结果:

{
  // --- 风扇模式 ---
  "0x00": 5,              // FanMode = Auto(自动模式)
  "0x01": 2,              // FanModeSequence = OffLowMedHighAuto

  // --- 百分比控制 ---
  "0x02": 60,             // PercentSetting = 60(目标风速 60%)
  "0x03": 58,             // PercentCurrent = 58(实际风速 58%)

  // --- 多档位控制(SPD Feature)---
  "0x04": 10,             // SpeedMax = 10(最多 10 档)
  "0x05": 6,              // SpeedSetting = 6(目标档位 6)
  "0x06": 6,              // SpeedCurrent = 6(实际档位 6)

  // --- 摇头功能(RCK Feature)---
  "0x07": 0x03,           // RockSupport = 0x03(支持左右 + 上下)
  "0x08": 0x01,           // RockSetting = 0x01(当前左右摇头)

  // --- 风感模式(WND Feature)---
  "0x09": 0x03,           // WindSupport = 0x03(支持睡眠风 + 自然风)
  "0x0A": 0x02,           // WindSetting = 0x02(当前自然风)

  // --- 送风方向(AIRDIR Feature)---
  "0x0B": 0               // AirflowDirection = Forward(正转送风)
}
开发提示

最简单的风扇可能只有 FanMode(0x00)、FanModeSequence(0x01)、PercentSetting(0x02)和 PercentCurrent(0x03)四个属性。 其余属性都依赖 Feature。读取前先检查 FeatureMap (0xFFFC), 对不支持的属性发起读取会返回 UNSUPPORTED_ATTRIBUTE。

常见场景

场景 1:基础风扇控制

查看步骤
  1. 读取 FanModeSequence (0x01) 确定设备支持哪些模式
  2. 写入 FanMode (0x00) 切换模式(Off / Low / Medium / High)
  3. 或者写入 PercentSetting (0x02) 直接设置百分比风速
  4. 订阅 PercentCurrent (0x03) 实时同步 App 界面的风速显示

场景 2:多档位风扇界面

查看步骤
  1. 确认 FeatureMap 包含 SPD(Bit 0),读取 SpeedMax (0x04) 获取最大档位数
  2. 根据 SpeedMax 动态生成档位按钮(例如 SpeedMax = 5 就显示 1~5 五个按钮)
  3. 写入 SpeedSetting (0x05) 切换档位
  4. 订阅 SpeedCurrent (0x06) 更新界面上的当前档位高亮
  5. 如果同时支持 STEP Feature,可以用 Step 命令配合遥控器的 +/- 按键

场景 3:吊扇完整控制面板

查看步骤
  1. 读取 FeatureMap,按支持的 Feature 显示/隐藏对应 UI 模块
  2. 风速区域:如有 SPD 显示档位滑块,否则显示百分比滑块
  3. 摇头区域(RCK):读取 RockSupport (0x07),只显示支持的方向选项。写入 RockSetting (0x08) 控制摇头
  4. 风感区域(WND):读取 WindSupport (0x09),显示支持的模式(睡眠风/自然风)。写入 WindSetting (0x0A) 切换风感
  5. 方向区域(AIRDIR):显示正转/反转切换按钮,写入 AirflowDirection (0x0B)
  6. 提示:切换送风方向前建议先将风扇停止(FanMode = Off),待方向切换完成后再开启

场景 4:HVAC 系统联动

查看步骤
  1. FanControl 通常和 Thermostat Cluster(0x0201)在同一个 Endpoint 上配合使用
  2. 当 Thermostat 的 SystemMode 切换为 FanOnly 时,对应的 FanControl 开始工作
  3. 如果风扇支持 AUT Feature,可以设为 FanMode = Auto,让风扇根据温控需求自动调节转速
  4. 读取 Thermostat 的 ThermostatRunningState (0x29) 中的 FanState 位,确认风扇是否在运转