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, 安全监控, 安全防御评估, 局域网控制, 德龙咖啡机, 物联网, 自动认证, 请求拦截, 逆向工具