本帖最后由 ShadowZZP 于 2026-6-29 05:25 编辑
一句话: 把松下新风(全热交换器 / ERV)的原厂 Wi-Fi 模块拆了,换上一块 ~¥30 的 ESP32(跑 ESPHome),逆向了它跟主板之间那条私有串口 CN12,现在完全本地接进 Home Assistant 和苹果 HomeKit:开关、模式、风速,状态双向同步。不碰松下云、不用 App,也不需要 RS485 模块 + Modbus 网关。
松下这些新风,原厂想远程控制只有两条路:① Wi-Fi 模块 + 松下 App + 云;② RS485 模块,接进楼宇 / Modbus 系统。这两个模块都插在主板上同一个 4 针小口——丝印 CN12。所以只要能讲这个口的“话”,就能把模块整个拔掉,直接跟机器对话。问题是这协议没有任何公开文档,于是我拿逻辑分析仪把它啃了出来,做成了一个 ESPHome 组件。 本帖前半是怎么上手(想直接用看这就够);后半是协议 + 逆向细节(想给别的型号 DIY、或纯好奇的往下翻)。 ✨ 能实现什么- 开关、模式(热交换 / 内循环 / 外循环)、风速(1 / 2 / 3)
- 状态双向:在墙面板上改,HA 里约 1 秒就跟上
- 原生 HomeKit:在苹果家庭里就是一个带三档风速 + 模式预设的风扇
- 能封盖里长期跑:OTA 远程升级、safe-mode 远程恢复、命令去抖(防 HomeKit 滑杆把慢总线刷爆)
💸 为什么这套最划算[td]方案 | 额外硬件 | 能控什么 | | 智能继电器(Shelly / Z-Wave) | 一两个继电器 | 只有开关 + 增压 | | RS485 模块 + Modbus/TCP 网关(如有人 USR) | 原厂模块 + 一个网关 | 功能全,但多两个盒子 | | 本方案(CN12 + ESPHome) | 就一块 ~¥30 的 ESP32 | 原生全控 开关 / 模式 / 风速 |
CN12 两根数据线在主板侧都是 3.3V,ESP 直连即可,不用电平转换。 🛒 需要什么(全部物料)- 1 块 ESP32-S3 开发板(~¥30,示例用 esp32-s3-devkitc-1)
- 几根杜邦线(母对母最好插)
- 一根 USB 线(只第一次烧录用)
- 一台装了 ESPHome 的电脑(或直接用 HA 的 ESPHome 加载项)
没了。不要松下模块、不要网关、不要账号订阅。 🧪 兼容哪些机型我在 FY-25ZDP1C(家用薄型)上端到端实测通过。原厂同一个模块覆盖一大票松下 FY-* 新风,所以下面这些理论上都能用(只有 FY-25ZDP1C 真机测过,其余按“理论可用、未实测”看待;不同机型可选模式略有差异): [td]类别 | 机型 | | 家用薄型 | FY-15ZDP1C、FY-25ZDP1C ✅、FY-35ZDP1C、FY-50ZDP1C、FY-15/25/35/50GZD1、FY-RZ18/28/38DP1 | | 家用薄型·寒冷地 | FY-15/25/35ZDP1CX | | 直流马达 | FY-15/25/35ZJD2C、FY-15/25/35GZJP2、FY-15/25/35ZJP2C | | 商用 | FY-15/25/35/50/65/80ZY1C、FY-1KZY1C、FY-1HZY1C、FY-2KZY1C | | 柜式 | FY-50ZR1C、FY-70ZR1C | 📦 手把手安装(小白细看)
工程附件_esphome-panasonic-erv.zip
(23.62 KB, 下载次数: 12)
第 0 步 · 装 ESPHome(二选一): - 图形界面(推荐小白):Home Assistant → 加载项商店,装 “ESPHome Device Builder”,之后全程网页点点点。
- 命令行:电脑装好 Python,运行 pip install esphome。
另外,国内的 ESP32 板子接电脑可能认不出串口,要先装 USB 转串口驱动:板上芯片是 CH340 就装 CH340 驱动、是 CP2102 就装 CP2102 驱动(Windows 必装;Linux/Mac 一般免驱)。ESP32-S3 用板载 USB 口的话通常免驱。 第 1 步 · 拿文件:解压本帖附件,得到 panasonic-erv.yaml(设备配置)和 secrets.yaml.example(密钥模板)。 第 2 步 · 填 WiFi 账号密码(最关键的一步!) 设备要连你家 WiFi。账号密码这些敏感信息单独放在一个叫 secrets.yaml 的文件里,配置文件用 !secret xxx 去引用它(好处:配置能公开分享,密码不外泄)。做法: - 把 secrets.yaml.example 复制一份、改名成 secrets.yaml,跟 panasonic-erv.yaml 放同一个文件夹。
- 用文本编辑器打开 secrets.yaml,改成你自己的:
wifi_ssid: "你家WiFi名字"wifi_password: "你家WiFi密码"fallback_ap_password: "随便设个8位以上的密码" # 连不上WiFi时设备会自己开热点,用这个密码panasonic_erv_api_key: "填下面生成的第1串"panasonic_erv_ota_password: "填下面生成的第2串"最后两个密钥要生成——终端里把这条运行两次,各复制一串(每串 43 位、末尾带 = 的乱码): openssl rand -base64 32(Windows 没 openssl 的话:用 ESPHome 图形界面新建设备时,API key 会自动生成;OTA 密码随便敲一长串字母数字也行。) 提示:配置里那行 external_components: github://... 会在编译时自动联网拉取组件代码,你不用手动下载。如果你接的引脚跟下面不一样,在 panasonic-erv.yaml 里把 rx_pin / tx_pin 改成你接的脚即可。 第 3 步 · 接线(先给新风断电、拔掉原厂模块。两根线都是 3.3V,直连,不用电平转换): 松下新风主板 CN12 ESP32-S3 +---------------+ +--------------+ | 线A(主板TX)--+---------->| GPIO18 (rx) | | 线B(主板RX)<-+-----------| GPIO17 (tx) | | GND ----------+-----------| GND | | 5V -----------+--(可选)-->| 5V (排针) | +---------------+ +--------------+⚠️ 原厂模块和 ESP 绝不能同时插在 CN12 上。 调试期可只接线A(只读旁听)。正式装可从 CN12 取 5V 喂 ESP 的 5V 排针(就是原厂模块用的同一条轨),省掉 USB 线。 第 4 步 · 烧录 - 第一次必须用 USB 线刷。 命令行:esphome run panasonic-erv.yaml --device /dev/ttyACM0(Linux 板载USB口一般是 ttyACM0;CH340 芯片是 /dev/ttyUSB0;Windows 是 COM3 这种,在“设备管理器→端口”里看)。图形界面:把配置贴进新建的设备,点“安装 → 通过 USB(Plug into this computer)”。
- 之后改配置都走 WiFi 空中刷(OTA),不用再插线、不用开盖:esphome run panasonic-erv.yaml --device 设备IP(IP 在路由器后台看,或首刷成功后日志里会打印)。
第 5 步 · 上电接管:把 ESP 接到新风 CN12、上电。示例默认 tx_enable_at_boot: true,开机自动注册,面板 F02 消失 = 接管成功。 第 6 步 · 进 Home Assistant:设备联网后,HA 会自动发现这个 ESPHome 设备(设置 → 设备与服务,会有“发现”提示),点添加、把 secrets.yaml 里那串 panasonic_erv_api_key 粘进去即可,马上出现 开关 / 模式 / 风速 实体。 第 7 步 · 接 HomeKit:把附件里的 panasonic_erv.yaml 拷到 HA 的 config/packages/ 目录(文件名一定保留下划线——带连字符 HA 会静默忽略,这是个坑),configuration.yaml 里加上: homeassistant: packages: !include_dir_named packages重载一下,它会把开关 + 两个选择器合成一个 fan.panasonic_erv,经 HomeKit Bridge 变成苹果家庭里带三档风速 + 模式预设的风扇。 🎛️ 装好后 HA 里有哪些- switch.panasonic_erv_power —— 开关
- select.panasonic_erv_mode —— 模式(热交换 / 内循环 / 外循环)
- select.panasonic_erv_fan —— 风速(1 / 2 / 3)
- fan.panasonic_erv —— 合成的统一风扇(给 HomeKit)
- 一堆诊断/配置实体:TX 总闸、自动保活、远程重启、Safe Mode 恢复、Send Registration(重发注册)、Raw TX(注入任意帧)、校验基值、WiFi 信号、运行时长、收发帧计数
🛠️ 常见问题- 面板报 F02:主板没看到已注册的模块。确认 tx_enable_at_boot: true、原厂模块已拔、TX/RX 没接反;按一下 Send Registration。
- 关机状态下改风速/模式没反应:正常,主板关机时不接受这俩。先开机(HomeKit 那个风扇会自动先开机)。
- 总线上收不到状态:确认共地,且 rx_pin 接在线A(主板 TX)。
- 连发很多命令后面板白屏:瞬态,断电重来或按面板键即可;固件里的命令去抖就是防这个的。
⬆️ 到这儿,想直接用已经够了。⬇️ 下面是协议 + 逆向细节,想给别的型号 DIY、或者纯好奇的往下看。 🔍 工作原理原厂模块和主板在 CN12 上以 A5 A5 5A 5A 帧头、9600 8N1 通信。本组件顶替模块的位置、扮演它: - 注册:开机重放模块的上电握手,再用 ~2s 一次的轮询 + ~6s 一次的心跳保活。不这么做面板报 F02。
- 读状态:解析主板的状态帧(03 0B … RUN MODE FAN),所以墙面板上的改动也同步到 HA。
- 发命令:构造带正确校验的 66 字节命令帧(02 0B),掩码写——只改一个字段不动其它。
🔬 逆向实录没有文档,全靠逻辑分析仪一点点抠: 1. 找总线。 拔了原厂模块,面板报 F02(设备连接异常)——说明模块↔主板这条线就是控制命脉,CN12 就是它。主板那根发送线 3.3V,可只接收、旁听,安全。 2. 定帧。 先量准位宽再信解码(我一开始波特率搞错,采到一堆“像样的乱码”白忙)。量准 = 9600 8N1,每帧 A5 A5 5A 5A 开头,后跟 2 字节字段 + 2 字节报文类型 + 负载。 3. 认报文。 盯稳态流量分帧:主板每 ~2s 发状态帧(03 0B);模块发轮询(01 0B)、保活(EC 03);上电有注册握手;主板周期发 hello;模块还推网络对时帧。照节奏回放,F02 才消。 4. 认字段。 按面板开关/模式/风速,盯哪个字节变,定位出负载里的 RUN/MODE/FAN。命令是掩码写:FF=不改该字段。 5. 破校验(最难)。 命令里有个 16 位字段,踩两坑:① 以为跟松下空调(CN-CNT)一样“全字节和为零”,不对;② 这字段每次开机都变、同条命令三次抓包全不同,像没法复现的 nonce。顿悟:总线上有两个这种字段——每次开机变的是“主板状态帧”自己的序列号,只读、无视;真正的“命令校验”是确定性的。最后一坑:早期抓包截断了,抓全 66 字节后公式蹦出: 命令校验 = (Σ负载 + 0xC0BA) & 0xFFFF 小端三条抓包全对上。手搓一条开机命令发出去,机器当场启动——成了。
📡 CN12 协议规格物理层:9600 8N1,无校验位。两根单向线(全双工):线A=主板 TX(空闲 ≈3.4V→主板 3.3V 逻辑);线B=模块 TX(空闲 ≈4.8V→原厂模块 5V)。拔模块后线B 只是主板 RX 输入,吃 3.3V 没问题,所以 ESP 直连。 帧格式:A5 A5 5A 5A | b5 b6 | op obj | 负载…(前导码 / 序列或校验 / 报文类型 / 负载)。命令帧与状态帧都是 66 字节。 报文类型: [td]op obj | 方向 | 含义 | 负载(示例) | | 03 0B | 主板→模块 | 状态上报 | 36 00 00 00 [RUN][MODE][FAN] … | | 02 0B | 模块→主板 | 命令(设置) | 同上,FF=不改 | | 01 0B | 模块→主板 | 轮询/保活 | 00 00 00 00 | | 04 0B | 模块→主板 | 注册(报到) | — | | 05 0B | 主板→模块 | 注册(应答) | 02 00 00 00 02 02 | | EC 03 | 模块→主板 | 模块周期帧 | — | | EE 03 | 模块→主板 | 网络对时 | 年/秒/分/时/周/日/月 | | ED 03 | 主板→模块 | hello | 9D C1 ED 03 … |
状态/命令字段(负载 36 00 00 00 [RUN][MODE][FAN]):RUN 00关/01开;MODE 00热交换/02内循环/05外循环;FAN 01弱/02中/03强。命令掩码写,FF=不改。 注:0x05 随机型不同——家用薄型(○)是外循环,寒冷地(△)是严寒模式,商用(□)则是普通(0x01)。本组件按家用薄型实现。 稳态节奏:轮询 B9 C0 01 0B … /2s、A4 C1 EC 03 … /6s、网络对时 /30s。主板每 ~2s 回一帧状态。主板还每 ~30s 发 hello 9D C1 ED 03(正常期一分钟 8~10 次,不是掉线)。 📋 官方 Modbus 寄存器表(来自 RS485 模块说明书,交叉参考)RS485 模块跟 Wi-Fi 模块是同一条 CN12 上的兄弟,它把这些寄存器对外暴露成 Modbus。本项目走 CN12 原始协议、不走 Modbus,但这表是“硬件还能干啥”的好参考(热交换 0x00、内循环 0x02、风速 1/2/3 都与 CN12 抓包对得上)。 控制寄存器(读写): 地址 | 功能 | R/W | 取值 | | 0x0001 | 运转状态(开关) | R/W | 0关 / 1开 | | 0x0002 | 运转模式 | R/W | 0热交换 / 1普通 / 2内循环 / 5外循环(○)或严寒(△) | | 0x0003 | 风量 | R/W | 1弱 / 2中 / 3强 | | 0x000E | OA 滤网更换周期 | R/W | 60/90/120/150/180 日 | | 0x0011–0x0013 | 定时开 / 取消 / 定时关 | R/W | 时 0–23、分 0–59,0x7F无效 | | 0x0014–0x0017 | 网络时间(年/秒/分时/周日月) | W | 0xFF/0xFFFF=跳过 |
监视寄存器(只读): 地址 | 功能 | 取值 | | 0x0004 | 运转模式状态 | 热交换 / 内循环 / 严寒 | | 0x0005 | 风量状态 | 停 / 弱 / 中 / 强 | | 0x0007 | RA 湿度 | 0–100% | | 0x0008 | OA / RA 温度 | −30 ~ +50 ℃ | | 0x0009 | 寒冷地控制状态 | 无 / 防结露 / 防结冰 | | 0x000B / 0x000D | OA 滤网清扫 / 更换剩余 | 0–720h / 0–2880h | | 0x000F | 异常状态 | 电机 / 本体回路 / 传感器 / 风阀等故障码 |
(适用范围随机型不同,说明书用 △寒冷地薄型 / ○家用薄型 / □商用 标注。家用薄型主要是开关/模式/风速这块;温湿度、故障寄存器多属更大机型。) ⚡ 一点工程细节- 滑杆洪水:拖 HomeKit 风速滑杆会瞬间打一串命令,固件合并只发最终值,慢总线和面板不受罪。
- 省流同步:ESPHome 的 select 不去重,直接轮询会狂刷 HA;这里改成乐观 + 仅变化时推送,空闲几乎零流量、墙面板改动 ~1s 同步、还不闪。日志默认 INFO,逐帧 hex 编译期裁掉,封盖设备需要时翻 DEBUG 再 OTA 也能远程深挖。
开源(MIT),欢迎反馈、提问、PR。要是帮你省了事,点个赞 / star 都行。有问题楼下问我 🙌
|