RemiPelloux/delonghi-coffee-api

GitHub: RemiPelloux/delonghi-coffee-api

一个基于反向工程 ECAM 协议、通过 REST API 远程控制 DeLonghi 咖啡机的 Docker 化工具。

Stars: 0 | Forks: 0

# ☕ DeLonghi Coffee API 从官方 **Coffee Link** Android 应用中逆向工程得出。通过 Ayla Networks 云使用 **ECAM 二进制协议** 直接向您的机器发送命令。完整技术文档位于 [`docs/writeup.md`](docs/writeup.md)。 适用于 Coffee Link 应用支持的所有 DeLonghi 机型(Primadonna、Maestosa、Dinamica、Eletta 等) ## 功能特性 - **冲泡任意饮品** — 浓缩、美式、长咖啡、双份浓缩、热开水、蒸汽 - **从待机状态开机 / 关机** - **冲泡中途停止** - **机器状态** — 就绪、加热、冲泡中、告警 - **自动令牌刷新** — 会话过期后自动通过 Gigya 重新认证 - **Docker 即用** — 一键部署到树莓派或任意 Linux 主机 - **Swagger UI** 位于 `/docs` ## 仓库结构 ``` delonghi-coffee-api/ ├── api.py # FastAPI server — the main deployable ├── lan_client.py # CLI tool for quick testing ├── Dockerfile ├── compose.yaml ├── requirements.txt ├── .env.example # Copy to .env and fill in your credentials ├── data/ # Token persistence (git-ignored) └── docs/ ├── writeup.md # Full reverse engineering write-up ├── protocol.md # ECAM binary protocol reference └── skills.md # AI agent quick reference (endpoint list) ``` ## 工作原理 DeLonghi Coffee Link 应用不会直接与机器通信 — 所有命令通过 **Ayla Networks IoT 云** 路由。每个命令都是一个二进制的 **ECAM 数据包**,附加 Unix 时间戳,进行 Base64 编码后写入名为 `data_request` 的云属性。机器轮询该属性并执行命令。 本 API 从零开始根据反编译的 APK 还原出这些数据包的格式。 ``` Your request → ECAM binary packet (16 bytes) → CRC-CCITT checksum (seed 0x1D0F) → append Unix timestamp (4 bytes big-endian) → Base64 encode → POST to Ayla cloud (data_request property) → Machine executes ``` **完整文档:** [`docs/writeup.md`](docs/writeup.md) **协议参考:** [`docs/protocol.md`](docs/protocol.md) ## 快速开始 ### 1. 获取 DSN 打开 Coffee Link 应用 → 设置 → 设备信息。您的 DSN 类似于 `AC000W031XXXXXX`。 ### 2. 配置 ``` cp .env.example .env # 编辑 .env 并填写您的 DSN 和 DeLonghi 账户凭证 ``` ### 3. 使用 Docker 运行 ``` docker compose up -d ``` API 服务运行在 **http://localhost:8000** · Swagger UI 位于 **http://localhost:8000/docs** ### 4. 制作一杯咖啡 ``` curl -X POST http://localhost:8000/brew \ -H "Content-Type: application/json" \ -d '{"recipe": "regular"}' ``` ## API 参考 | 方法 | 端点 | 描述 | |--------|----------|-------------| | `GET` | `/status` | 机器状态(就绪、加热、待机、告警…) | | `GET` | `/beverages` | 可用饮品列表 | | `POST` | `/brew` | 冲泡饮品 `{"recipe": "regular"}` | | `POST` | `/stop` | 停止当前冲泡 `{"recipe": "regular"}` | | `POST` | `/power/on` | 从待机唤醒机器 | | `POST` | `/power/off` | 将机器置于待机 | | `GET` | `/stats` | 使用统计(总冲泡次数、减垢用水量等) | | `GET` | `/properties` | 所有原始 Ayla 设备属性 | | `GET` | `/health` | Docker 存活探针 | | `GET` | `/docs` | Swagger UI | ### 可用饮品 `espresso` · `regular` · `long` · `2x_espresso` · `doppio` · `americano` · `hot_water` · `steam` ## 在树莓派上部署 ``` # 将文件复制到您的 Pi rsync -av --exclude '.git' . tkmremi@192.168.1.x:~/delonghi-coffee-api/ # SSH 登录并启动 ssh tkmremi@192.168.1.x cd ~/delonghi-coffee-api cp .env.example .env # fill in your credentials docker compose up -d ``` ## 无需 Docker 运行 ``` pip install -r requirements.txt export DSN=AC000W031XXXXXX export DELONGHI_EMAIL=your@email.com export DELONGHI_PASSWORD=yourpassword python api.py ``` ## CLI(快速测试) ``` python lan_client.py status python lan_client.py brew regular python lan_client.py brew espresso python lan_client.py stop regular python lan_client.py power on python lan_client.py power off ``` ## 环境变量 | 变量 | 是否必需 | 描述 | |----------|----------|-------------| | `DSN` | ✅ | 设备序列号(来自应用) | | `DELONGHI_EMAIL` | ✅ | Coffee Link 账户邮箱 | | `DELONGHI_PASSWORD` | ✅ | Coffee Link 账户密码 | | `REFRESH_TOKEN` | 可选 | 首次登录后自动填充 | | `CREDS_FILE` | 可选 | 令牌持久化路径(默认:`/data/credentials.json`) | | `PORT` | 可选 | API 端口(默认:`8000`) | ## 兼容性 已在 DeLonghi Dinamica Plus ECAM370 上测试通过。适用于 Coffee Link 应用支持的所有 ECAM 系列机型。 ## 安全注意事项 ECAM 协议不包含有效载荷加密。唯一的防重放保护是 Unix 时间戳 — 机器会拒绝超过数秒的旧数据包。认证完全由 Ayla 云层处理。任何拥有有效 `access_token` 和正确 DSN 的人都可以控制机器。 ## 致谢 逆向工程工具:`apktool`、`jadx`、`mitmproxy` ## 许可证 MIT
标签:AV绕过, Ayla Networks, Coffee Link, CRC-CCITT, Docker, ECAM协议, FastAPI, REST API, SEO, Swagger UI, Token刷新, Waymore结果处理, 二进制协议, 反向工程, 咖啡机API, 安全监控, 安全防御评估, 局域网控制, 德龙咖啡机, 物联网, 自动认证, 请求拦截, 逆向工具