首页
/ 你的风扇集成为什么找不到路径?解析 aiomodernforms 库的请求头陷阱。

你的风扇集成为什么找不到路径?解析 aiomodernforms 库的请求头陷阱。

2026-04-29 11:32:41作者:凤尚柏Louis

如果你已经按照上一篇的教程尝试将 /mf 修改为 /device,却发现 Home Assistant 依然无法正确读取风扇状态,甚至报错从 404 变成了 ModernFormsError: 500 或直接连接超时,那么你正面临着厂商在 G4 固件中埋下的第二个深坑:严格的请求头校验(Header Validation)与负载格式陷阱。

ModernForms ModernFormsError 404 的深度调试过程中,我们发现厂商不仅改了 API 路径,还给底层 Web Server 增加了一层模拟校验。如果你的 HTTP 请求中缺少特定的 Content-Type 或者 JSON 负载(Payload)多了一个不该有的逗号,风扇那颗简陋的处理器会直接抛出 500 错误并切断连接。作为一名写过上百个驱动的架构师,这种不透明的 API 变动最是折磨人。

💡 报错现象总结:用户在修正端点路径后,仍遇到 ModernFormsError: 500 或设备状态在 HA 中显示为“不可用”。本质原因是底层库 aiomodernforms 在发送 POST 请求时,其生成的 JSON 结构或 HTTP Header 不符合新版固件的预期,导致风扇内部的解析器崩溃。


源码探哨:为什么 aiomodernforms 的请求被拒之门外?

Home Assistant 的 Modern Forms 集成底层,aiomodernforms 库负责构造发送给风扇的二进制数据包。

1. 严格的 Content-Type 限制

在旧版固件中,你甚至可以用纯文本发指令。但 G4 固件的 Web Server 开始严格检查 AcceptContent-Type。如果请求头里没有明确标注 application/json,风扇会认为这是一个非法的 CSRF 攻击。

# aiomodernforms 库中的 _request 方法陷阱
async def _request(self, method: str, path: str, data: Any = None):
    # 架构师发现:如果这里没明确指定 headers,aiohttp 会默认使用
    # 一些风扇固件无法解析的默认头部信息
    headers = {
        "Content-Type": "application/json; charset=utf-8",
        "Accept": "application/json",
    }
    # 缺少这些头部,风扇就会直接回一个 500 错误

2. 字段冗余导致的解析崩溃

新版固件的 JSON 解析器非常脆弱。在获取状态(Query)时,如果你的 JSON 负载中包含了一些用于控制(Command)的冗余字段(如 query: {} 却带了 fanSpeed: null),底层的 C 代码解析器会因为找不到对应的 Key 映射而直接内存溢出。

校验维度 旧版固件 (G3) 新版固件 (G4) 架构师修正方案
HTTP Method POST / GET 混合 严格限制为 POST 统一所有查询与控制指令为异步 POST
Header 校验 几乎不校验 必须包含 JSON 声明 强制在 _request 方法中注入标准 Header
JSON 格式 容错率高 极度敏感(Strict Schema) 清理所有空值字段,仅发送必要的指令 Key
连接保持 短连接 由于 API 频率限制需长连接 引入 TCPConnector 复用,防止端口耗尽

填坑实战:深度修正驱动库请求逻辑的“笨办法”

既然单纯改 URL 不行,我们需要对 aiomodernforms 的网络请求层进行“外科手术”。

第一步:修正 _request 方法的 Header 注入

你需要定位到 aiomodernforms/modernforms.py 文件中的核心请求函数。

# 找到发送请求的地方,手动补全 headers
async with self._session.request(
    method,
    url,
    json=data, # 确保使用 json 参数而非 data,让 aiohttp 自动处理序列化
    headers=headers, # 传入我们定义的严格头信息
    timeout=self._timeout,
) as response:

第二步:清理 info_data 查询逻辑

在执行查询操作(获取风扇当前档位、灯光状态)时,确保发送的 JSON 负载是干净的。 架构师提醒:很多开发者习惯发一个全量 JSON。在 G4 固件下,这会导致 404/500。正确做法是只发送 { "query": "all" } 这种极其精简的结构。

痛苦的临时方案:为何“重置风扇”依然无效?

很多玩家尝试捅风扇背后的 Reset 孔。这能清空 WiFi 配置,但改不了固件里的 Web Server 逻辑。只要固件版本没降级,驱动库里这些隐蔽的 Header 陷阱就会一直存在,这属于典型的“底层协议不兼容”。


降维打击:访问 GitCode “Modern Forms 驱动修复分支”

与其在 HA 容器的黑盒里一行行 debug 那些晦涩的异步请求代码,不如直接换装已经过全量压测的修正版驱动。

我已经将彻底解决了路径报错、Header 校验失败、以及 JSON 解析冲突的驱动代码同步到了 GitCode。这个分支被称为**《Modern Forms 驱动修复分支》**。

这套代码的核心改进包括:

  1. 自动路径探测:自动识别固件版本,在 /mf/device 之间无缝切换。
  2. 请求头补丁:内置了适配 G4 固件的所有必须 HTTP Header。
  3. 负载降噪:重写了状态查询逻辑,确保每次请求的 Payload 都是“固件最爱”的精简格式。

别再让风扇在 HA 里频繁掉线了。 作为一个技术老炮,我建议你直接前往 GitCode 仓库,通过 Custom Components 的方式挂载这个修复分支。把厂商偷偷挖的坑填平,这才是硬核架构师该有的节奏。

[前往 GitCode 查看 Modern Forms 驱动修复分支]

登录后查看全文
热门项目推荐
相关项目推荐