pgchenu/airwell-ir-homeassistant

GitHub: pgchenu/airwell-ir-homeassistant

该项目实现了通过 ESP32 红外发射器和 Home Assistant 对使用 AIRWELL 协议的老旧 Airwell 空调进行智能化控制与集成。

Stars: 0 | Forks: 0

# airwell-ir-homeassistant 本仓库记录了我成功将那台极其老旧的 Airwell 空调(型号 stxlm9rc)与其糟糕透顶的“RC-4”红外遥控器进行集成的过程。不过你很幸运,我不会在这里分享我接线时的挣扎、在 Broadlink RM4 mini 上浪费的无数个小时,也不会诉说面对严重腐蚀的 RC-4 时的那种绝望。 本仓库记录了我成功将那台极其老旧的 Airwell 空调(型号 stxlm9rc)与其糟糕透顶的“RC-4”红外遥控器进行集成的过程。 Airwell RC4 使用 **`AIRWELL`** 协议(34位 Manchester 编码 @ 38 kHz,如 IRremoteESP8266 中所实现)。Airwell 设备是贴牌的 **Electra**,因此这很可能适用于其他 Electra 系列的遥控器。 在大多数情况下,Home Assistant 的集成都能正常工作。然而,你会受到糟糕的红外发射的困扰,这会导致空调的实际状态与 Home Assistant 上的空调接口状态不同步。我添加了一些按钮来强制开启/关闭空调,并实现“虚拟”同步空调状态。 ## 警告 我不是开发者,也不是软件工程师。只是一个有大把时间并且订阅了 Claude 的人。你可以猜到,这一切全凭“凭感觉编程”(vibe coding)。尽管如此,它的运行效果却出奇地好。 我有一些发现,主要是关于 ESPHome 的。你可以在 [`doc.md`](doc.md) 中阅读它们。 ## 状态 — 正常工作 - ✅ ESP32 (Tasmota-ir) 发送 AIRWELL 帧;空调有反应。 - ✅ 完整的状态合成(模式 / 风扇 / 温度),无需捕获 —— 已针对真实的遥控器进行了验证。 - ✅ 带有正确**电源切换**处理的终端控制。 - ✅ Home Assistant `climate` 实体 → 可暴露给 Apple HomeKit。 ## 工作原理(1分钟版本) - 当 *I FEEL* 关闭时,这 34 位的帧是 **(电源, 模式, 风扇, 温度)** 的确定性函数(中间的 5 位是 I FEEL 室温字段;关闭时为 `0` → 无校验和)。目前不支持 “I FEEL” 功能。 - **模式/风扇/温度是绝对且幂等的。** **电源(第 33 位)是一个真正的切换开关(TRUE TOGGLE)**,而且红外是单向的 —— 因此我们追踪一个**假设的**电源状态,并且只有在它需要改变时才发送切换指令。 - 一个小编码器将状态转换为数值;Tasmota 的 `IRSend AIRWELL` 负责发送它。 帧布局(MSB 优先): | 位 | 字段 | |---|---| | 33 | 电源切换 (1 = 切换电源 + 应用状态;0 = 仅状态) | | 32–30 | 模式: COOL=1 HEAT=2 AUTO=3 DEHUM=4 FAN=5 | | 29–28 | 风扇: 字段 = 风速−1 (风速 1–4) | | 27–23 | I FEEL 室温 (0 = 关闭) | | 22–19 | 温度: 字段 = °C−15 (16–30 °C) | | 18–0 | 恒定尾部 `0x2` | 每个帧重复发送三次。 `encode(power=0, COOL, fan=2, temp=22) == 0x050380002` ## 硬件 - ESP32(任意型号;ESP32-D 即可)+ **2N2222** 三极管 + **950 nm 红外 LED** + 电阻,LED 由 **GPIO25** 驱动。(参见 `images/driver_schematic.jpg`,见*下文*。) - 刷入 **Tasmota-ir** (`tasmota32-ir`),GPIO25 设置为 `IRsend`。 ![我使用的硬件设置](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/55db8889d6064641.jpg) ## 仓库结构 | 路径 | 内容 | |---|---| | [`airwell.py`](airwell.py) | AIRWELL 34位编码/解码器(唯一事实来源)。`uv run airwell.py selftest` | | [`ac_ctl.py`](ac_ctl.py) | 通过 Tasmota HTTP 进行终端控制,包含假设状态切换逻辑 | | [`airwell_ac.yaml`](airwell_ac.yaml) | HA 包 —— `climate.airwell_ac` 恒温器 + 重新同步按钮 | | [`HA_SETUP.md`](HA_SETUP.md) | Home Assistant + HomeKit 设置指南 | | [`doc.md`](doc.md) | 项目备忘 / 发现 | | [`plan.md`](plan.md) | 工作笔记 | | [`TUTORIAL.md`](TUTORIAL.md) | 完整的逐步复制指南 | | `send_rm4.py`, `capture_rm4.py` | Broadlink RM4 脚本 —— *已废弃*(RM4 发射器太弱);仅作保留以供参考 | ## 快速开始 ``` # 1. 验证 encoder uv run airwell.py selftest # 2. 向你的 Tasmota blaster 发送一个 frame(AC 应该会有反应) curl 'http:///cm?cmnd=IRSend%20%7B%22Protocol%22%3A%22AIRWELL%22%2C%22Bits%22%3A34%2C%22Data%22%3A%220x250380002%22%7D' # 3. 终端控制(记住 host + 假设状态) uv run ac_ctl.py on --host uv run ac_ctl.py set --temp 24 uv run ac_ctl.py off ``` Home Assistant + HomeKit:参见 [`HA_SETUP.md`](HA_SETUP.md) 和 `TUTORIAL.md`。 Python 依赖项以行内方式声明 (PEP 723);使用 **`uv run`** 运行脚本 —— 它会自动安装依赖。 ## 致谢 - [petrklus/airwellhvac](https://github.com/petrklus/airwellhvac) —— 原始的 RC4 逆向工程。非常感谢 [Petr Klus](https://github.com/petrklus) 为我的遥控器所做的出色工作。他让我得以证实我的观察结果。 - [IRremoteESP8266](https://github.com/crankyoldgit/IRremoteESP8266) —— `AIRWELL` 协议。 - [Tasmota](https://tasmota.github.io/),[jcwillox/hass-template-climate](https://github.com/jcwillox/hass-template-climate)。
标签:ESP32, Home Assistant, 智能家居, 物联网, 空调控制, 红外遥控, 逆向工具