emdimon/ecoflow-shp-mqtt
GitHub: emdimon/ecoflow-shp-mqtt
通过逆向工程MQTT协议实现对EcoFlow智能面板充电计划的远程控制,解决官方应用限制下的自动化需求。
Stars: 0 | Forks: 0
# r original English form." So for "ecoflow-shp-mqtt", it likely falls under professional terms or proper nouns, so I should keep it in English. But the translation output should be in Chinese, so how do I represent that? In the examples, for 'Running Naabu', the translation is '运行 Naabu', which is a mix of Chinese and English. So for "ecoflow-shp-mqtt", since it's a standalone term, I might output it as "ecoflow-shp-mqtt" in Chinese context, but that's not a translation. Perhaps I need to translate any descriptive parts, but here there are none.
[](https://github.com/emdimon/ecoflow-shp-mqtt/releases)
[](LICENSE)
通过 EcoFlow 私有 MQTT API 远程控制 EcoFlow 智能家居面板(第一代,**SP10**)的充电计划。
本项目通过逆向工程得到,使用纯 JSON,无需 protobuf。
查看 [CHANGELOG.md](CHANGELOG.md) 获取发行历史。
如果你拥有 SHP + Delta Pro 设备组合,并且曾尝试从 Home Assistant 或 EcoFlow 手机应用之外的任何地方自动化每日充电功率,你可能会遇到这样的障碍:
这个仓库正是缺失的那一块:一个 200 行的库和三个示例脚本,让你能够直接将新的充电功率、充电上限和时间段发布到 SHP 的 MQTT 控制主题上。**这与你在手机上编辑计划时 EcoFlow 手机应用发出的调用完全相同。**
## 状态
- ✅ 设置充电功率 (`chChargeWatt`) — 已验证
- ✅ 设置充电上限 (`hightBattery` — *原文如此,拼写错误存在于 EcoFlow 协议中*) — 已验证
- ✅ 设置放电下限 (`lowBattery`) — 已验证
- ✅ 设置每个 Delta Pro 的活动标志 (`chSta`) — 已验证
- ✅ 设置时间段 (`timeScale` 18字节位掩码,10分钟分辨率) — 已验证
- ✅ 通过 `set_reply` (`code:"0"`, `sta:0`, `ack:0`) 验证成功 — 已验证
- ✅ 通过 `/get` → `/get_reply` 读取 SHP 状态 — 可用(间歇性;见注意事项)
- ⚠️ 最后验证于 2026-05-17,针对英国欧盟区域账户和当月发货的 SHP 第一代固件。
查看 [docs/DISCOVERY.md](docs/DISCOVERY.md) 了解完整的逆向工程过程,查看 [docs/SCHEMA.md](docs/SCHEMA.md) 了解完整的载荷字段参考。
## 安装
```
git clone https://github.com/emdimon/ecoflow-shp-mqtt.git
cd ecoflow-shp-mqtt
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
## 凭据
创建 `~/.ecoflow_creds` 文件,内容为你的 EcoFlow 账户登录信息(与你在手机应用中使用的相同):
```
umask 077
cat > ~/.ecoflow_creds <<'EOF'
EMAIL=you@example.com
PASSWORD=your-ecoflow-password
EOF
chmod 600 ~/.ecoflow_creds
```
脚本会在文件权限不是 600 时拒绝运行。凭据永远不会出现在命令行、日志或 MQTT 主题名称中。
## 快速开始
### 设置新的充电计划
```
python3 examples/set_schedule.py \
--shp-sn SP10XXXXXXXXXXXXX \
--watts 500 \
--cap 90
```
设置 `chChargeWatt=500 W / 每个 Delta Pro`,`hightBattery=90%`,时间段 `00:00–07:00`(默认)。成功时打印 `🟢 SHP 已接受`。
使用自定义时间段:
```
python3 examples/set_schedule.py --shp-sn SP10... --watts 800 --cap 85 \
--slot 23:00-06:00
```
### 查看你的 EcoFlow 应用实际发送的内容
运行捕获程序,并在手机应用中编辑 SHP 计划——它发布的 JSON 载荷将被记录到 `./captures/` 目录。可用于在新固件或不同 SHP 型号上确认字段语义。
```
python3 examples/capture.py --shp-sn SP10XXXXXXXXXXXXX --dp-sn DCKBZ8XXXX
# Let's think about the first heading. "ecoflow-shp-mqtt" – it could be interpreted as a software or protocol name. In Chinese technical documentation, such names are often kept in English. So for the translation, I should output "ecoflow-shp-mqtt" as is, but since it's a heading, perhaps it's fine. However, the user expects a translation, so I need to provide something in Chinese.
```
### 读取 SHP 当前存储的计划
```
python3 examples/get_schedule.py --shp-sn SP10XXXXXXXXXXXXX
```
## 作为库使用
```
import ecoflow_shp_mqtt as ef
api_host, token, user_id = ef.login("you@example.com", "your-password")
creds = ef.get_mqtt_credentials(api_host, token, user_id)
payload = ef.build_schedule_payload(
charge_watt = 500, # W per Delta Pro
high_battery= 90, # SOC cap %
low_battery = 85, # SOC floor %
)
result = ef.publish_and_verify(creds, user_id, "SP10XXXXXXXXXXXXX", payload)
assert result["success"], result["error"]
```
## 主题与载荷参考
**写入主题:** `/app/{user_id}/{shp_serial}/thing/property/set`
**回复主题:** `/app/{user_id}/{shp_serial}/thing/property/set_reply`
**标识符:** `cmdSet:11`, `id:81`, `cfgIndex:0` (或其他时间段索引)
完整载荷模式 → [docs/SCHEMA.md](docs/SCHEMA.md)。
## 发现过程
这是在 2026 年 5 月通过被动 MQTT 嗅探进行的两小时逆向工程会话的成果。完整过程(包括死胡同——谢天谢地不需要 protobuf;`hassio-ecoflow-cloud` 集成在写入能力上是个死胡同;`tess1o/go-ecoflow` 拥有最全面的 SHP Go 绑定,但仍然不提供计划写入功能)记录在 [docs/DISCOVERY.md](docs/DISCOVERY.md)。
## 注意事项
- **逆向工程得到的私有协议。** EcoFlow 可能在任何手机应用更新中改变线上格式;届时此库需要重新捕获和验证。`examples/capture.py` 脚本是用于此目的的工具。
- **`/get_reply` 是间歇性的。** 在测试中,SHP 有时会及时返回完整的计划数据块,有时则完全不返回。设置并验证的路径(发布 → `set_reply`)比读回路径可靠得多。
- **消息代理会静默丢弃某些 `set_reply` 消息。** 此库默认使用新的 `msg_id` 重试一次;可通过 `retry=N` 调整。
- **区域很重要。** 此库针对 `api-e.ecoflow.com`(欧盟)进行了测试。美国/亚洲账户应使用 `api.ecoflow.com`。此库会自动回退;如果存在第三个区域,请将其添加到 `API_HOSTS_DEFAULT` 中。
- **仅适用于 SHP 第一代 (`SP10*`)。** SHP 2 / SHP 3 / Ocean 面板使用不同的协议;此库不涉及它们。
- **你的账户、你的设备、你的责任。** 向你的 SHP 发送错误的载荷可能导致其处于意外状态。始终从运行 `examples/capture.py` 开始,验证你的应用当前发送的内容,并优先使用 `examples/set_schedule.py`(它只设置被告知的字段)而不是构建原始载荷。
## 许可证
[MIT](LICENSE) — 随心所欲,不提供任何担保。
## 贡献
欢迎提交 Issues、PRs 以及来自其他 SHP 固件/区域的捕获日志。如果你拥有 SHP 2,并且在编辑其计划时能够运行 `examples/capture.py`,那么即使你不想写代码,由此产生的载荷对该项目也将非常有用。
标签:EcoFlow, Homebrew安装, MQTT协议, Smart Home Panel, SP10, 云资产清单, 充电控制, 时间表管理, 智能家居, 物联网, 电池管理, 能源管理, 设备自动化, 逆向工具, 逆向工程