忍无可忍!为了打游戏不被空调直吹,我重写了TCL空调HA接入代码

不知道大家在家里有没有过这种极其崩溃的体验:
好不容易熬到了周末,外面的天气又闷又热。你美滋滋地瘫在客厅沙发上,顺手拿起手柄唤醒 Xbox。伴随着智能家居的丝滑联动,电视自动切到了 HDMI 游戏信号源,客厅的空调也随之“滴”的一声自动开启,冷气喷涌而出。
原本这一切都很完美——直到那股强劲的冷风,顺着空调导风板,精准无误地直直劈向你的天灵盖。
一打游戏就被冷风吹得头疼,手动拿遥控器去调风向又觉得破坏了全自动的优雅。其实我之前写过一篇文章,记录了我自己怎么通过小程序的接口,把这台 TCL 空调接入家里的 Home Assistant(HA)智能中枢的。但那个小程序接口能力不完整,最要命的就是不支持调整风向!

作为一个受不了半点委屈的折腾狂,我脑海里萌生了一个计划:我要让它不仅能在 HA 里调风向,后续我还要实现让空调根据我在房间里的位置,自动调整风向避开我吹。
第一步,我得先拿到完整的空调控制权。既然小程序的接口不行,那就只能把目标瞄准 TCL 的国内版官方 App 了。今天这篇文章,就来复盘一下我是如何分析官方 App 的接口,最终把它做成一个 HA 标准集成的。

---
01. 摸清云端通信接口
要控制空调,首先得搞清楚 App 的通信地址。通过抓包分析,我摸清了两个核心域名:
• 账号相关 (cn.account.tcl.com): 负责登录、刷新凭证(Token)、获取用户信息。
• 设备控制 (io.zx.tcljd.com): 负责拉取设备列表和下发具体的控制指令。
逻辑很简单:先通过账号域名拿到合法的 Token,再带着 Token 去设备域名下发指令。
---
02. 登录验证与设备标识
登录过程并不只是发送账号密码那么简单。登录接口 /auth/auth/login 除了需要将密码做 MD5 处理外,还需要在请求中携带一个 reportState 参数。
这个参数包含了手机的 App 版本号、操作系统版本,以及一个客户端独有的设备 ID。如果参数格式不对,服务器会直接报错返回。
为了能够稳定登录,我在代码中模拟了一台运行 Android 15、安装了最新版 App 的手机,并生成了一个固定的 UUID 作为设备 ID。这里有一个坑:设备 ID 不能每次请求都随机生成,否则服务器会判定账号在频繁更换设备登录,从而导致账号被锁或者频繁掉线。
---
03. 梳理控制字段
拿到 Token 后,我顺利获取了设备列表,并通过 category == "AC" 过滤出了空调设备。
接下来就是梳理所有能控制的属性字段。接口返回的数据非常丰富,除了基础的开关 (powerSwitch)、目标温度 (targetTemperature)、工作模式 (workMode) 和风速 (windSpeedPercentage) 之外,我终于找到了心心念念的上下风向 (verticalDirection) 和左右风向 (horizontalDirection) 字段。
除此之外,像节能模式(ECO)、电辅热(PTC),甚至睡眠模式、自学习等功能也一应俱全。距离实现“风避开人吹”的目标,只差最后一步的逻辑处理了。

---
04. 摸透面板的联动规则
拿到这些字段名后,如果直接向服务器发送控制指令,很容易遇到指令无效的情况。这是因为 App 面板底层有一套严格的联动逻辑和互斥规则。
比如:
• 关机状态下,发送调整风向的指令设备是不会响应的。
• ECO(节能)只能在特定的工作模式下开启,而且开启后可能无法同时使用电辅热。
• 某些模式下的风速是锁死的,即便接口返回了“成功”,机器也不会执行风速调整操作。
为了解决这个问题,我先用 Python 写了一个简单的临时控制面板,通过反复点击各个功能,比对 App 发送的原始请求,整理出了两套规则库:一套是禁用规则(在什么状态下哪些功能不可用),另一套是联动规则(修改某个属性时,必须同时带上哪些关联属性)。
把这套逻辑加进去之后,发出的指令就和真实使用 App 操作完全一致了。
---
05. 打包上架 HACS
代码跑通、各项控制都验证无误后,我把它打包成了 Home Assistant 的标准集成,加入了可视化的配置流,大家直接在网页 UI 里输入账号密码就能登录。

目前,这个项目我已经提交到了 HACS 默认商店。按照 HACS 的审核进度,一般半个月到一个月左右,大家就能直接在商店里搜索到并一键安装了。
如果是等不及想提前体验的朋友,也可以直接访问项目地址手动添加自定义仓库:
https://github.com/qwqqq6/tclplus-ac

能用技术手段消灭生活里这些让人不爽的小痛点,折腾这一大圈,也算是值了。
