andrewmitchell-automations/intellipure-esphome

GitHub: andrewmitchell-automations/intellipure-esphome

通过 ESP32 读取空气净化器前面板 LED 状态并模拟物理按键,将仅支持按钮循环的 Intellipure Compact 接入 Home Assistant 实现完整的非侵入式风速控制。

Stars: 1 | Forks: 0

# Intellipure Compact → Home Assistant 风扇控制 为 **Intellipure Compact 10600-9** 空气净化器从 Home Assistant 添加真实的速度控制 (Off / Low / Med / High / Turbo) —— 无需修改其固件,无需 割断走线,也无需 破坏物理按钮。 该净化器只有一个输入:一个瞬时按钮,循环切换 `Off → Low → Med → High → Turbo → Off`。没有遥控器,没有 app,也没有网络。 带功率监测的智能插座能让你实现一部分功能 —— 它可以切断电源,并且在恢复供电时设备会恢复 之前的速度 —— 但它永远无法**选择**速度,也 永远无法告诉你**设备当前处于哪个速度**。这两点都需要用到按钮和 前面板的 LED。这正是本项目要解决的问题。 运行 [ESPHome](https://esphome.io) 的 ESP32 主要做两件事: 1. **读取前面板的状态 LED**,以了解设备当前所处的速度。 2. **按下按钮**,通过 MOSFET 将开关线短接到地 —— 这与手指按下在电气上是完全相同的。 一切都通过净化器低压 LED 子板上现有的 单个 8 针连接器完成。ESP32 由净化器自身的 5 V 电源轨供电,因此没有任何部件需要露出外壳外。 ## 在 Home Assistant 中你能获得的功能 | 实体 | 类型 | 用途 | |---|---|---| | `fan.*` | 风扇 | Off / 25 / 50 / 75 / 100 % → Off / Low / Med / High / Turbo | | `sensor.*_unit_state` | 文本 | 以名称显示当前速度,包括手动按钮按下 | | `binary_sensor.*_filter_needs_replacement` | 问题 | 锁存 DFS 滤网警告 LED | | `binary_sensor.*_sense_fault` | 问题 | 如果控制器无法验证其当前操作则触发 | | `sensor.*_fault_reason` | 文本 | 触发故障的原因 | | `sensor.*_presses_last_command` | 诊断 | 上次命令所需的按钮按下次数 | | `sensor.*_adc_{dfs,low,med,high,turbo}` | 诊断 | 原始感测电压 | 物理按钮依然有效,并且 HA 会反映手动做出的更改。 ## 工作原理 三个核心想法构成了整个设计。 ### 1. LED 即状态,且仅存在两个频段 速度 LED 为共阳极且 **低电平有效**:MCU 通过吸收电流来点亮其中一个 LED,因此一个 **点亮的** LED 电压读数接近 0 V,而未点亮的 LED 电压则位于接近 5 V 的电源轨上。 显而易见的方法 —— 读取三个电平 (点亮 / 变暗 / 熄灭) —— **行不通。** 大约 60 秒后,面板会进入睡眠调光模式,以低占空比对 LED 进行 PWM 调光。取平均值后,一条 *变暗但仍在运行* 的线路读数约为 4.9 V —— 这与 *熄灭* 无法区分。实测结果: | 状态 | 在连接器处 | 在 ESP 引脚处 (÷2 分压器) | |---|---|---| | 点亮 | 0.07 – 0.11 V | ~0.05 V | | 熄灭 / 空闲 | 4.98 V | ~2.49 V | | **变暗 (运行中!)** | **4.92 V** | **~2.46 V** | 因此,固件仅分类 **两个频段** —— 点亮与未点亮 —— 使用单一的 1.5 V 阈值,并且两侧各有大约一伏的裕量。 ### 2. 锁定高亮状态 由于变暗的线路看起来是熄灭的,因此控制器无法持续读取速度。但它不需要这样做:**每次状态改变都是一次按钮按下,而任何按下都会使 LED 重新亮起约 60 秒。** 因此固件读取清晰的明亮状态,*锁定* 它,并在变暗期间保持该值。没有按下意味着没有改变。 唯一无法区分的是 **真正的熄灭 (关闭)** 和 **运行但变暗** —— 两者都显示没有点亮的 LED。这可以通过可选的智能插座功率读数来解决 (见下文)。*控制* 流程永远不需要它。 ### 3. 按下,然后验证 为了达到目标速度,固件按下按钮,重新读取 LED,并再次按下, 直到 LED 显示目标速度 —— 最多允许 10 次按下的预算,否则将触发故障。 这使得几种棘手的情况无需特殊处理即可消失: - **睡眠怪癖** — 变暗期间的第一次按下只会唤醒面板,而不会 改变速度。循环只会看到没有进展并再次按下。 - **有人在序列中途按下按钮** — 循环每次都会重新读取实际情况,因此 它仍会收敛。 - **循环是一个环** — 从任何地方开始,任何目标最多只需 ≤5 次按下即可达到。 - **关闭状态能被可靠检测到**,因为面板在按下后立即变 *亮*,因此 “没有 LED 点亮”明确意味着 Off (关闭) — 无需读取插座。 ``` flowchart TD A[New target from HA] --> B[Read the LED lines] B --> C{Matches target?} C -->|yes| D[Publish state, idle] C -->|no| E[Pulse the button 100 ms] E --> F[Wait 600 ms for the LEDs
and the ADC filter to settle] F --> G[Re-read: panel is bright,
so no-LED-lit means Off] G --> C C -->|over 10 presses| H[Stop pressing
raise sense fault] ``` ## 硬件 所有连接都通过 **`J1`** 完成,它是 LED 子板 (`JH09B-PCB-A`) 上现有的一个 8 针接头。其连接到控制板的排线保持插入状态;你需要并联焊接 背面的预镀锡引脚残端。 ``` flowchart LR subgraph purifier["Air purifier (stock)"] PCBB["PCB-B
control board / MCU
untouched"] PCBA["PCB-A
LED + button board"] PCBB <-->|"original ribbon
(stays connected)"| PCBA end subgraph added["Added controller"] DIV["5 × voltage divider
100 kΩ / 100 kΩ"] FET["2N7000 MOSFET
(button driver)"] ESP["ESP32
ESPHome"] DIV --> ESP ESP --> FET end PCBA -->|"J1 pins 4-8
LED lines"| DIV FET -->|"J1 pin 3
button line"| PCBA PCBA -->|"J1 pins 1-2
5 V + GND"| ESP ESP <-->|Wi-Fi| HA["Home Assistant"] ``` 完整的引脚定义、原理图、电路板布局以及分步组装说明位于 **[docs/hardware.md](docs/hardware.md)** 和 **[docs/build-guide.md](docs/build-guide.md)** 中。 ### 物料清单 | 数量 | 零件 | 备注 | |---|---|---| | 1 | ESP32 开发板 | 任何带有空闲 ADC1 引脚的 ESP32;本项目使用的是 DOIT DevKit V1 | | 10 | 100 kΩ 电阻 | ¼ W,用于五个 ÷2 分压器 | | 5 | 0.1 µF 陶瓷电容 | 标有 `104`;平滑 LED PWM | | 1 | 1000 µF 电解电容,≥10 V | 缓冲 ESP 的 Wi-Fi 瞬时电流 | | 1 | 2N7000 N 沟道 MOSFET | 按钮驱动器 | | 1 | 1 kΩ 电阻 | MOSFET 栅极串联电阻 | | 1 | 100 kΩ 电阻 | MOSFET 栅极下拉电阻 (**必需** — 防止幻象按下) | | — | 洞洞板,连接线 (22 AWG 实心线 + 用于分接的细线) | | | — | 带功率监测的智能插座 | *可选*,见下文 | 强烈建议使用带有温度控制的烙铁;这八个分接点是 唯一有些棘手的焊点,如果使用温度不够的烙铁会让焊接变得极其痛苦。 ### 可选的智能插座 如果将净化器插入 **常通型** 带功率监测的智能插座中, 固件将导入其功率读数,以区分 *真正的关闭* 和 *运行但变暗*。如果没有它, 一切仍然可以正常工作 —— 控制器只会在变暗期间保持其最后已知的速度,而不是报告 Off (关闭)。 实测功耗,对校准功率频段很有用: | 速度 | 瓦数 | |---|---| | Off (待机) | 0.35 | | Low | 4.3 | | Med | 11.1 | | High | 25.3 | | Turbo | 65.4 | (官方标称的 9 / 15 / 25 / 61 W 是错误的;请测量你自己的设备。) ## 安装 1. **组装硬件** — [docs/build-guide.md](docs/build-guide.md)。 2. **配置 ESPHome:** cd esphome cp secrets.yaml.example secrets.yaml # 填入 Wi-Fi 并生成密钥 esphome run intellipure.yaml 3. **在 Home Assistant 中接管设备** (Settings → Devices → ESPHome)。 4. *可选:* 添加来自 [home-assistant/automations.example.yaml](home-assistant/automations.example.yaml) 的 watchdog 自动化。 如果你的智能插座的功率传感器有不同的实体 ID,请在 `substitutions:` 块中更改 `power_sensor`。如果你没有插座,请完全移除该传感器。 ## ⚠️ 安全警告 **本项目涉及打开市电供电的电器设备。如果你对在内部操作感到不适,请不要进行。** - 开关电源板 (`JH09B-PCB-C`) 带有 **市电电压,以及一个 拔下插头后仍会保持电荷的 450 V 电容。** 它是真正致命的。绝不要 探测、触摸或修改它。本项目的所有工作都仅限于低压 LED 板。 - 在进行所有焊接和连续性测试时,请 **拔下设备插头**。 - 净化器的低压地线 **未与大地隔离**。不要将其与大地短接。 特别是,**在净化器插电期间,绝对不要从接地的计算机的 USB 端口为 ESP32 供电** —— 在开发期间,这曾触发了浪涌保护器。使用浮地电源 (USB 电池组或双管充电器) 进行台架测试,对于最终的成品构建则使用 净化器自带的 5 V 电源轨。之后通过 OTA 进行刷机。 - 打开设备会使其保修失效。 ## 项目状态 工作正常且已安装。速度控制、状态反馈、滤网警报和故障检测 均已通过硬件验证。 **计划中:** 用于控制器板的 3D 打印外壳 — 见 [enclosure/README.md](enclosure/README.md)。 ## 兼容性 基于 **Intellipure Compact 10600-9** (约 2019 年硬件) 开发,其主板标记为 `JH09B-PCB-A/B/C` 以及 SinOne `SC92F7323M` MCU。该系列中的其他设备可能也使用 类似的单按钮循环,但 **请在你自己的硬件上验证 `J1` 引脚定义** —— 不要盲目相信本文档中的引脚编号。[docs/measurements.md](docs/measurements.md) 解释了如何进行检查。 ## 许可证 MIT — 见 [LICENSE](LICENSE)。
标签:ESP32, ESPHome, Home Assistant, 客户端加密, 智能家居, 物联网, 硬件控制, 空气净化器