tpawley2001/Wyze-Bolt-WiFi-Bridge-ESP32

GitHub: tpawley2001/Wyze-Bolt-WiFi-Bridge-ESP32

通过 ESP32 充当 Wi-Fi 与 BLE 之间的桥接,将纯蓝牙的 Wyze Lock Bolt 接入 Home Assistant 并实现实时电量解密读取。

Stars: 0 | Forks: 0

# Wyze Bolt Wi‑Fi Bridge (ESP32) 通过 **ESP32 作为 Wi‑Fi ↔ Bluetooth 桥接**,将纯 **BLE 的 Wyze Lock Bolt (YD_BT1)** 完全接入 **Home Assistant over Wi‑Fi**,实现**上锁/解锁、实时状态和实时电量**。 Bolt 本身没有网关或 Wi‑Fi;一切都依赖于 Bluetooth LE,且其无线电信号较弱。本仓库封装了一套完整、可靠的设置方案: - **ESP32 Wi‑Fi ↔ BLE bridge** —— 在门附近运行 ESPHome 的 ESP32 作为*主动式* Bluetooth proxy,从而让 HA 能够通过您的局域网访问门锁。 - **上锁/解锁 + 状态** —— 由 [`ha-wyzeapi`](https://github.com/SecKatie/ha-wyzeapi)提供,它通过该桥接解析 Bolt 的加密 BLE 协议。(这是他们的工作成果——本仓库在此基础之上构建。) - **实时电量** —— 一个用于解密门锁 BLE Battery Level 特征值的小补丁,`ha-wyzeapi` 原本并不读取该数据(它只会回退到陈旧的 Wyze **云**电量,这是一个长期以来的痛点:[ha-wyzeapi #833](https://github.com/SecKatie/ha-wyzeapi/issues/833))。**此处的解码即为本仓库的原创贡献。** - **更新防护守卫** —— 在 `ha-wyzeapi` 的 HACS 更新(会覆盖原有补丁)之后,自动重新应用电量补丁。 ## 架构 ``` Wyze Lock Bolt ──BLE──► ESP32 (ESPHome active BT proxy) ──Wi‑Fi──► Home Assistant (YD_BT1) esphome/…-proxy.yaml │ ├─ ha-wyzeapi ──► lock.* (lock/unlock, state) └─ battery patch ─► sensor.*_lock_battery_ble (+ MQTT) ``` 为什么需要**主动式** proxy:被动式 proxy 虽能监听到门锁的广播,但无法承载查询状态、电量或进行上锁/解锁所需的 GATT 连接。请将 ESP32 放置在距离房门约 15 英尺的范围内。 ## 仓库内容 | 路径 | 用途 | |------|---------| | `esphome/wyze-bolt-ble-proxy.example.yaml` | ESP32 主动式 BT‑proxy 固件 | | `ha-wyzeapi-patch/battery.patch` | 将 BLE 电量读取功能添加到 `ha-wyzeapi` 的 Diff | | `ha-wyzeapi-patch/coordinator_patcher.py` | 幂等且基于锚点检查的补丁应用器 | | `guard/` | 用于在 HACS 更新后重新应用补丁的 systemd timer + 脚本 | | `examples/decode_battery.py` | 独立的 AES‑ECB 电量解码演示 | | `docs/PROTOCOL.md` | BLE GATT + 加密 + 上锁/解锁协议说明 | ## 安装 **前置条件:** Home Assistant + MQTT 集成、一台 ESP32 以及关联在您 Wyze 账户下的 Wyze Bolt。 ### 1. 刷入 ESP32 桥接固件 修改 `esphome/wyze-bolt-ble-proxy.example.yaml`(填入您的 ESPHome `secrets.yaml`),并将其刷入放置在门附近的 ESP32 中。HA 会将其识别为 ESPHome 设备 / Bluetooth proxy。 ### 2. 添加门锁(上锁/解锁 + 状态) 通过 HACS 安装 [`ha-wyzeapi`](https://github.com/SecKatie/ha-wyzeapi) 并使用您的 Wyze 凭据登录。Bolt 将显示为一个 `lock.*` 实体,并通过 ESP32 桥接经由 BLE 进行连接。验证您是否可以进行上锁/解锁操作并查看状态。 ### 3. 添加实时电量 将补丁应用到 `ha-wyzeapi` 的 coordinator,然后重启 HA: ``` # 选项 A — the diff cd /config/custom_components/wyzeapi && patch -p1 < /path/to/ha-wyzeapi-patch/battery.patch # 选项 B — the idempotent patcher (验证 anchors;拒绝不干净的 apply) python3 ha-wyzeapi-patch/coordinator_patcher.py /config/custom_components/wyzeapi/coordinator.py ``` 在下一次轮询后,一个 `sensor.*_lock_battery_ble` (`device_class: battery`) 实体会通过 MQTT 发现机制发布——无需 broker 密码。它会通过 BLE 读取**真实的实时**百分比(带有门锁自身的时间戳),而不是陈旧的云端数值。如有需要,您可以在补丁中重命名该实体或 topic。 ### 4.(推荐)保持其在更新后依然生效 `ha-wyzeapi` 是一个 HACS 组件,因此每次更新都会覆盖 `coordinator.py` 并移除该补丁。请在任意可以通过 SSH 连接到 HA 且常开的设备上安装此防护守卫: ``` cp guard/*.example ~/.config/systemd/user/ # then edit the Environment= lines systemctl --user daemon-reload systemctl --user enable --now wyze-ble-battery-guard.timer loginctl enable-linger "$USER" ``` 它每 6 小时检查一次;如果补丁丢失,它会重新应用补丁,重启 HA,并可通过 Telegram 通知您。如果未来的 `ha-wyzeapi` 重构了文件结构,导致无法安全地自动应用补丁,它会提醒您手动重新打补丁,而不会静默失败。 ## 电量解码原理(简述) 门锁暴露了标准的 Battery Level 特征值 `0x2A19`,但读取返回的是 16 字节的 **AES‑128‑ECB 密文**。其密钥是门锁 Wyze `uuid` **最后 16 个字符**的小写 ASCII 字符串——这与 `ha-wyzeapi` 用于门锁状态的*密钥相同*。解密后,`byte[0]` 即为电池百分比;结尾处固定的 `"loock"` 标记用于确认密钥正确。完整详情(包括上锁/解锁的 UART 交互流程)请参阅 [`docs/PROTOCOL.md`](docs/PROTOCOL.md)。 密钥是在运行时派生的——**本仓库中不存储任何设备密钥**。 ## 注意事项 - 已在 `ha-wyzeapi` 0.1.38 和一台 Bolt (`YD_BT1` / `XFPL106`) 上测试通过。 - 配套的**密码键盘**是一个拥有独立密钥的 BLE 设备——不在此项目范围内。 - 属于社区逆向工程成果,不提供任何担保。遵循 MIT 许可证 (`LICENSE`)。 ## 致谢 感谢 [`SecKatie/ha-wyzeapi`](https://github.com/SecKatie/ha-wyzeapi) 提供 Bolt BLE 协议(状态特征值、AES‑ECB 密钥派生以及上锁/解锁的挑战-响应机制)。本仓库在此基础上增加了 ESP32 桥接封装、电量特征值解码以及更新防护守卫。
标签:ESP32, ESPHome, Home Assistant, Wi-Fi网桥, 智能家居, 物联网, 蓝牙低功耗, 逆向工具