Lammerink/Dimplex-Optimyst-BLE
GitHub: Lammerink/Dimplex-Optimyst-BLE
通过 ESP32 搭建 BLE↔MQTT 桥接器,将老款 Dimplex Optimyst 电壁炉接入 Home Assistant 进行远程控制。
Stars: 1 | Forks: 0
# Dimplex Opti‑myst (Cassette 400 / CAS400LNH) → 通过 BLE 接入 Home Assistant
使用 **M5Stack Atom Lite (ESP32)** 作为 BLE↔MQTT 桥接,从 **Home Assistant** 控制 **Dimplex Optimyst Cassette 电壁炉**
([Cassette 400/600 LED](https://www.dimplexfires.com/en-nl/cassette-400-600-led) —— 老款蓝牙遥控一代,BLE service 为 `00060000‑f8ce‑11e4‑…`)。
这款 Dimplex 壁炉使用**已认证的 Bluetooth 配对(LE legacy passkey)**与其遥控器进行配对 —— 因此你*不能*简单地重放(replay)命令,而是必须进行配对。关于这一代的协议,目前**没有任何公开文档或应用**(现有的 Dimplex/Faber 应用使用的是更新、不同的协议)。本仓库是从零开始对其进行逆向工程的成果。请参阅 **[docs/PROTOCOL.md](docs/PROTOCOL.md)** 了解完整协议,并参阅 **[docs/REVERSE-ENGINEERING.md](docs/REVERSE-ENGINEERING.md)** 了解它是如何被破解的,以及如何在你自己的设备上进行复现(例如,如果你的配对 passkey 不同)。
## 你将在 Home Assistant 中获得什么
自动发现的 MQTT 设备 **"Dimplex CAS400LNH"** 包含:
| 实体 | 类型 | 说明 |
|---|---|---|
| **Fireplace** | switch | 开 / 关(独立于火力强度) |
| **Flame intensity** | number 1–6 | 火焰/雾化程度(不会关闭电源) |
| **Volume** | number 0–6 | 声音(0 = 关闭) |
| **Flame intensity state** | sensor | 当前等级 |
状态每约 8 秒轮询一次,因此如果壁炉自身状态发生变化(例如自动关机),HA 会在几秒钟内同步更新。
## 硬件
- **M5Stack Atom Lite** (ESP32‑PICO‑D4) —— Arduino 开发板类型为 **`M5Atom`**。
- 一台属于 BLE 遥控一代的 Dimplex Opti‑myst Cassette 壁炉(广播名称为 `FI####`,service 为 `00060000‑f8ce‑11e4‑abf4‑0002a5d5c51c`)。
- 一个 ESP 可访问的 MQTT broker(例如 Home Assistant 中的 Mosquitto 插件)。
## 固件
你日常使用的桥接程序是 **[`Dimplex_MQTT/`](Dimplex_MQTT)**(Arduino,ESP32 core 3.x)—— 包含 NimBLE + MQTT 自动发现 + Wi‑Fi/MQTT 配置门户。
此外还有一个诊断程序 **[`tools/Dimplex_Dump/`](tools/Dimplex_Dump)**,它会进行配对并导出所有可读的寄存器(register) —— 仅用于映射新设置(参见下文的*映射更多控制功能*),不用于日常使用。
**依赖库(Libraries):** `NimBLE-Arduino` (≥2.x), `PubSubClient`, `WiFiManager`。
**为什么使用 NimBLE:** 当 BLE 和 Wi‑Fi 在 ESP32 上同时运行时,Bluedroid 协议栈会崩溃;而 NimBLE 可以稳定共存(并且 ESPHome 的 `ble_client` 根本无法进行 MITM 配对 —— 参见 PROTOCOL.md)。
### 编译与烧录
使用 Arduino IDE:选择开发板 **M5Atom**,安装上述三个库,打开 `Dimplex_MQTT/Dimplex_MQTT.ino` 并上传 —— **无需修改任何代码**。桥接器会根据壁炉广播的名称自动检测你的设备,并使用默认的 passkey 进行配对;你可以稍后在配置门户中锁定特定设备的 BLE 地址或更改 passkey(见下文)。只有在你希望将这些参数固化时,才需要修改代码。
或者使用 `arduino-cli`:
```
arduino-cli core install esp32:esp32
arduino-cli lib install "NimBLE-Arduino" "PubSubClient" "WiFiManager"
arduino-cli compile --fqbn esp32:esp32:m5stack_atom Dimplex_MQTT
arduino-cli upload --fqbn esp32:esp32:m5stack_atom -p /dev/cu.usbserial-XXXX Dimplex_MQTT
```
## 首次运行配置(管理界面)
没有硬编码的凭据。在首次启动时(或当无法连接到 Wi‑Fi 时),Atom 会打开一个**强制门户(captive-portal)配置页面**:
1. Atom 启动一个 Wi‑Fi 网络 **`Dimplex-Setup`**(密码 `dimplex123`)。
2. 用你的手机/笔记本电脑连接它 —— 页面会自动弹出(或者你可以直接在浏览器访问 `192.168.4.1`)。
3. 输入你的 **Wi‑Fi** 网络和 **MQTT broker** 地址(可以是 IP **或** 主机名,例如 `homeassistant.local` —— `.local` 域名会通过 mDNS 解析),以及 **端口、用户名、密码**。
4. 保存 → 设备将重启、连接,随后该设备就会出现在 Home Assistant 中。
**壁炉(通常无需理会)。** 配置门户还会扫描附近的壁炉并显示一个**选择器** —— 但你可以忽略它:将地址留**空**,桥接器会通过名称(`FI####`)自动检测壁炉。仅在你拥有多台壁炉,或者自动检测找到了错误设备时,才使用选择器/地址栏。**passkey** 字段已预填 `584936`;只有当它无法配对你的设备时才需要更改它([查找你的 passkey](docs/PROTOCOL.md#finding-your-passkey))。
### 网页控制页面
一旦连接到你的网络,桥接器会在 **`http://dimplex-atom.local/`**(或其 IP 地址)提供一个小型**控制页面** —— 包含独立的电源(开/关)、火焰强度(1–6)和音量(0–6)控制,可直接通过浏览器操作而无需 Home Assistant。更改会同步到 HA。
### 重新配置 Wi‑Fi / MQTT
**在开机通电时长按 Atom 的按钮**,或**在运行状态下长按约 3 秒**即可重新打开配置 AP —— 它会广播 `Dimplex-Setup` 供你更改 Wi‑Fi/MQTT。如果**在启动时无法连接到 Wi‑Fi,同一个 AP 也会自动开启**,因此你始终可以进行恢复。设置保存在 flash 中;Wi‑Fi 凭据永远不会被写入源码。
## 映射更多控制功能
遥控器上有一些我们尚未开放的功能(定时器、亮度、夏令时等)。在无需 BLE 嗅探器(sniffer)的情况下,解码这些功能最可靠的方法是使用 [`tools/Dimplex_Dump`](tools/Dimplex_Dump) 的**寄存器差异对比法(register‑diff method)**:
1. 烧录 `tools/Dimplex_Dump`,通电 → 它会打印出一份完整的寄存器转储(快照 **A**)。
2. **拔下 Atom**(释放壁炉唯一的 BLE 连接)。
3. 在物理遥控器上更改**一项**设置。
4. 重新插上 Atom → 获取快照 **B**。
5. 对比 A 和 B 的 `diff`(差异) → 发生变化的那个寄存器即对应这项设置。
这正是发现音量(`0x0076`)和时钟(`0x0010/0x0012`)的方法。
## 工具 (`tools/`)
在逆向工程(macOS)期间使用的辅助工具:
- **[`Dimplex_Dump/`](tools/Dimplex_Dump)** —— Arduino 程序,用于配对并导出所有可读的寄存器(register),专为寄存器差异对比法服务(见*映射更多控制功能*)。
- `serial_read.py` —— 读取 ESP 的 USB 串口(并支持发送命令);无需使用 Arduino Serial Monitor。
- `crack_and_parse.sh` / `parse_att.py` —— 使用 [`crackle`](https://github.com/mikeryan/crackle) 破解嗅探到的配对数据,并解码 ATT 写入操作。
## 致谢与状态
从零开始进行逆向工程并构建;不附属于 Dimplex / Glen Dimplex,也未获得其认可。按“原样”提供。欢迎提交 PR —— 尤其是确认其他设备上的 passkey 以及映射剩余的寄存器(register)。
许可证:[MIT](LICENSE)。
标签:ESP32, Home Assistant, 云资产清单, 应用安全, 智能家居, 物联网, 蓝牙低功耗, 逆向工具, 逆向工程