Zendure EV Guard
在给你的电动车充电时保护 Zendure 电池
兼容 Zendure SolarFlow 2400 AC • Shelly Pro 3EM • Smappee • Windows、Linux、macOS
你有 Zendure 电池和一辆电动车吗?
你知道的:当你的车接上 wallbox 时,它会把所有电力都吸走。你的 Zendure 电池飞快地耗尽,循环次数不断增加,而你那些珍贵电芯的寿命也像阳光下的雪一样融化。
如果你的车是公司车,电费由你的雇主支付,那你为了给它充电而把电池耗光就太可惜了,因为到了晚上,你家里就什么电都不剩,无法自发自用。
另一种情况:即使这不是一辆公司车,你也许只是想在充电期间阻止电池放电,以便充分利用阳光充足时太阳能板产生的电力,而不从 Zendure 电池中取电。
Zendure EV Guard 会自动解决这个问题。一旦检测到你的车正在充电,程序就会暂停电池。充电结束后,它会重新启用电池。简单、自动、无风险。
它是怎么工作的?
1. 检测
你的 Shelly Pro 3EM(或 Smappee)会测量用电量。当功率超过阈值时(例如: 5000W),程序就知道你的车正在充电。
2. 保护
Zendure 电池会立即进入OFF 模式。它们不再放电,你的循环次数得以保留。
3. 恢复
充电结束了?程序会自动使用你的原始参数重新启用电池。无需手动操作。
100% 不会伤害你的电池
Zendure EV Guard只使用你 Zendure hub 的本地 HTTP API。它只会操作两个设置,就是你在 Zendure 应用中看到的那两个:minSoc(放电下限)和 outputLimit(输出功率)。暂停时,它会把 minSoc 调到 100%,并把输出降到 0 W。恢复时,它会还原你平时使用的数值。
为什么要改两个?因为只改一个并不总是够用。如果你的 hub 运行在 HEMS 模式下,它有时会在暂停期间自己重新打开输出。程序几秒钟内就会发现这一点,然后重新关上。我在家里做的测试结果是:2026 年 8 月 22 日,电池电量 30%,汽车功率 18 kW:打开了两次,分别在 10 秒和 5 秒后关上,总共用了 2 Wh。
不修改固件,不访问云端,没有任何风险。这和你在 Zendure 应用中手动修改设置完全一样,只是它会自动在正确的时间完成。
1.3.12 中的新内容
- 程序会说法语。 你看到的一切(邮件、Pushover、Telegram、充电报告)都有法语和英语版本。只需设置一个配置键,
Messages:Language,就这样。技术日志依然使用英语,这是特意的。 - 每次充电结束时都有一份报告。 电表走过了多少 kWh,汽车用了多少,持续时间,峰值,平均值。还有参考费用,如果你在
Energy:PricePerKwhCents中填写了每 kWh 的价格。 - 暂停时的漏电会被测量并关闭。 处于 HEMS 模式的 hub 可能会在暂停期间重新打开输出。程序会发现它,记录数值,关闭输出,如果持续时间过长还会提醒你。
- 压缩包里包含安装所需的一切。 一个用于 Linux 的脚本,一个用于 macOS 的脚本,一个用于 Windows 的脚本,还有法语和英语版的用户指南。不需要再手动复制服务文件。
- 电表变得沉默时会进行预防性暂停。 在看不见数据的情况下,程序无法再看到你的汽车接入充电:它会先保护电池,并在第一次有效测量时释放它们。
- 你的电池会在停止前重新投入使用,包括由系统停止程序的情况。
前提条件
| 设备 | 详情 |
|---|---|
| Zendure SolarFlow 2400 AC | 已启用本地 HTTP API 的 hub(端口 80) |
| Shelly Pro 3EM 或 Smappee需要 1 个 | 电流钳(Shelly,实时)或 Smappee 能源监测器(云端 API,每 5 分钟一个数据块),用于测量消耗 |
| Wallbox / 充电桩 | 任何充电桩都可以:检测依据是耗电量,而不是充电桩本身 |
| PC、服务器或 NAS | Windows、Linux 或 macOS,程序会全天候在后台运行 |
安装
1. 解压压缩包
将 ZIP 文件的内容解压到你选择的目录中,例如:
- Windows:
C:\ZendureEvGuard\ - Linux:
/home/ZendureEvGuard/ - macOS:
/Applications/ZendureEvGuard/
2. 执行权限(仅限 Linux / macOS)
在 Linux 和 macOS 上,你必须先让文件变为可执行文件才能运行它:
chmod +x ZendureEvGuard
./ZendureEvGuard3. 配置 appsettings.json
打开可执行文件旁边的 appsettings.json 文件并填写你的参数(见下方章节)。
4. 运行程序
# Windows
ZendureEvGuard.exe
# Linux / macOS
./ZendureEvGuard程序会在启动时显示连接信息。使用 P 手动暂停,使用 R 恢复,使用 Ctrl+C 两次来正常停止。
5. 将它安装为服务(推荐)
程序只有在运行时才会保护你的电池。从 1.3.12 版本开始,压缩包中包含了每个系统对应的脚本:它会从你解压所在的文件夹安装服务、启用开机启动并运行服务。不会复制到其他地方。
# Linux
sudo sh install-linux.sh
# macOS
sudo sh install-macos.sh
# Windows (PowerShell en tant qu'administrateur)
powershell -ExecutionPolicy Bypass -File .\install-windows.ps1在 Windows 上,服务以 SYSTEM 账户运行,这个账户的数据空间与你的会话不同:请务必在安装之前将 Subscription.SecretKey 填入 appsettings.json。
压缩包中的 README.txt 详细介绍了每条命令、卸载和更新。USER_GUIDE_FR.md 也重新列出了所有设置,可离线查看。
你更喜欢自己编写服务吗? 在 Linux 上,下面是脚本安装的单元文件。两行不是装饰:TimeoutStopSec=120 给程序留出时间,让它在 systemd 将其杀死之前恢复你的电池服务,network-online.target 避免它在网络真正就绪之前启动。
[Unit]
Description=ZendureEvGuard - EV Charging Battery Protection Daemon
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
WorkingDirectory=/home/ZendureEvGuard
ExecStart="/home/ZendureEvGuard/ZendureEvGuard"
Restart=on-failure
RestartSec=10
TimeoutStopSec=120
SyslogIdentifier=zendure-evguard
Environment=DOTNET_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target然后是常用命令:
sudo systemctl daemon-reload
sudo systemctl enable --now zendure-evguard
# Voir le statut
sudo systemctl status zendure-evguard
# Voir les logs en temps reel
sudo journalctl -u zendure-evguard -f
# Redemarrer apres une mise a jour
sudo systemctl restart zendure-evguard不要不加考虑就添加专用的 User=:程序会把日志和暂停状态写在可执行文件旁边,而对该目录没有权限的账户会让它在第一次重启时就失败。
配置:appsettings.json
下面是你可以配置的所有参数。Shelly 和 ZendureDevice 部分是必需的。
消息 1.3.12 中新增
你读到的所有内容的语言:邮件、Pushover、Telegram、充电结束报告。技术日志仍然是英文,这样错误消息还能被搜索到。
| 参数 | 描述 | 默认值 |
|---|---|---|
Language | 消息语言:"en" 或 "fr"。任何其他值都会回退到英语,但不会阻止启动 | "en" |
注意放置位置:这个键要放在 下方的 Messages 部分,绝不能放在文件根部。 在 Linux 上,放在根部的 Language 键会被系统的环境变量 LANGUAGE 覆盖,你的消息会毫无预兆地重新变成英语。
"Messages": {
"Language": "fr"
}Shelly 必需
配置你的 Shelly Pro 3EM。它就是测量你家用电量的传感器。
| 参数 | 描述 | 示例 |
|---|---|---|
Enabled | 启用 Shelly 作为测量来源 | true |
Host | 你的 Shelly Pro 3EM 在本地网络上的 IP 地址 | "192.168.1.50" |
UseDigestAuth | 如果你用密码保护了 Shelly,就启用此项 | false |
Username | 用户名(如果启用了身份验证) | "admin" |
Password | 密码(如果启用了身份验证) | "monmotdepasse" |
Smappee 充电桩 可选
Smappee 充电桩可以通过两种方式使用:
- 作为 EV 检测来源(Shelly 的替代方案):如果 Shelly 被禁用,Smappee 会成为检测 EV 充电的功率测量来源。检测通过 Smappee 云端 API 进行(每 5 分钟一个数据块,响应速度不如 Shelly 的实时检测)。
- 与 Shelly 并行:如果 Shelly 作为检测来源处于启用状态,仍然可以启用 Smappee,以便在日志中持续显示用电信息(太阳能、家庭、电网)以及你的 Smappee EV Wall 充电桩(充电功率、状态等)。
| 参数 | 描述 | 示例 |
|---|---|---|
Enabled | 启用 Smappee (Shelly 停用时作为检测来源, 或同时显示用电信息和 EV 充电桩信息) | false |
ClientId | 你的 Smappee 应用的客户端 ID (API v3) | "votre-client-id" |
ClientSecret | 你的 Smappee 应用的客户端密钥 | "votre-client-secret" |
Username | 你的 Smappee 账户用户名 | "user@email.com" |
Password | 你的 Smappee 账户密码 | "motdepasse" |
ServiceLocationId | 你的 Smappee 位置 ID (在 Smappee 仪表板中可见, 这不是序列号) | "190802" |
PollingIntervalSeconds | Smappee API 的查询频率 | 30 |
🔋 Zendure 电池 必需
配置你的 Zendure SolarFlow 2400 AC hub 或其他设备。IP 地址可以在 Zendure 应用中找到。
| 参数 | 描述 | 示例 |
|---|---|---|
Host | 你的 Zendure hub 在本地网络中的 IP 地址 | "192.168.1.127" |
Port | 本地 API 的 HTTP 端口(默认为 80) | 80 |
DefaultOutputLimit | EV 充电后要恢复的最大输出功率,单位为瓦特 | 2400 |
DefaultMinSoc | 充电后要恢复的放电下限:低于这个水平时你的电池将不再放电(该值乘以 10:100 = 10%,200 = 20%)。这不是最大充电水平。 | 100 |
TimeoutSeconds | 向 hub 发出请求的等待时间 | 10 |
理解 DefaultMinSoc
这个参数定义了电池的放电下限:低于这个电量后,集线器就不会再让电池继续放电。这个值在 Zendure API 中会乘以 10:
100= 电池最低可以降到10%200= 电池最低可以降到20%500= 电池会在50%时停止放电,你一半的容量也就没用了
不要把它和充电上限混淆。电池停止充电的电量是 socSet,这是另一个设置,也就是你在 Zendure 应用中看到的那个设置。在这里设置 950 并不是说“充电到 95%”,而是说“永远不要低于 95%”:你的电池就没法用了。从 1.3.0 版本开始,程序拒绝使用 1 到 999 以外的值启动,并且会在超过 500 时提醒你。
由你来选择!值越低,你使用电池的程度越高;值越高,对电芯越温和,但可用容量也会减少。大多数用户会在 100(10%)和 200(20%)之间选择。
EvDetection
用于检测你的电动车充电状态的设置。这个算法使用了滞回:必须连续多次读取到高于阈值,才能确认正在充电,也必须连续多次读取到低于阈值,才能确认充电停止。
| 参数 | 描述 | 默认值 |
|---|---|---|
PowerThresholdWatts | 程序认为汽车正在充电的功率阈值(单位为瓦特)。根据你的充电墙调整它。 | 5000 |
ConfirmationReadings | 连续高于阈值的读数次数,用于确认充电开始 | 2 |
ReleaseReadings | 连续低于阈值的读数次数,用于确认充电结束(24 = 以每次读取5秒计算约2分钟) | 24 |
PollingIntervalSeconds | 测量频率,单位为秒 | 5 |
PauseOnSourceUnreachableMinutes | 1.3.0 中新增。电表无法访问时可以保持多久,超过这个时间后电池会出于谨慎而暂停:在失明的情况下,程序再也看不到你的汽车接入充电。第一次获得有效测量后,暂停就会解除。设置为0可禁用这个安全措施。 | 3 |
NotifyPrecautionaryPauseAfterMinutes | 谨慎暂停会立即生效,但只有超过这个时长后才会通知你:电表闪断三秒不值得发一封邮件 | 30 |
SourceUnreachableReleaseMinutes | 在电表仍然没有响应的情况下,谨慎暂停经过多长时间后解除 | 10 |
ReleaseHysteresisWatts | 需要低于阈值多少才确认充电结束。避免消耗在阈值附近波动时反复切换 | 500 |
PostResumeCooldownSeconds | 恢复后的一段时间内会忽略新的检测 | 60 |
Energy 1.3.12 中的新功能
每次充电结束时,程序都会告诉你已经充入了多少 kWh。告诉它每 kWh 的价格,它就会算出金额。这只是参考值,不是账单:没人测量充电桩本身,而且价格是固定的,而你的价格可能不是固定的。
我想到的使用场景是:有几辆车在你家充电,每辆车都需要知道自己消耗了多少电。
| 参数 | 描述 | 默认值 |
|---|---|---|
PricePerKwhCents | 每 kWh 的价格,单位为整数分(28 = 0,28 EUR)。填入 0 则不显示任何内容。带小数的数字会被拒绝并按 0 读取,但不会阻止启动 | 28 |
报告会列出两种能量。电表测得的能量,这是事实。以及估算出的车辆所占部分,也就是扣除房屋通常用电量后的数值:这是一个估算值,也是你插入车辆时太阳能电池板正在向外供电时的最大值。
Charge terminee : 1h03 | 11,30 kWh au compteur (3,16 EUR) |
~11,30 kWh pour le vehicule (3,16 EUR) | pointe 14627 W | moyenne 11169 W通知 可选
当你的电池暂停充电、恢复充电或发生错误时接收邮件。配置你的 SMTP 服务器。
| 参数 | 描述 | 默认值 |
|---|---|---|
Enabled | 启用电子邮件通知 | false |
SmtpHost | SMTP 服务器 (例如: smtp.gmail.com) | "" |
SmtpPort | SMTP 端口 | 587 |
UseSsl | 使用 TLS/SSL | true |
Username / Password | SMTP 凭据 | "" |
FromAddress | 发件人电子邮件地址 | "" |
ToAddress | 收件人,以 ; 分隔多个收件人 | "" |
RateLimitMinutes | 两次警报之间的最小间隔 (防止垃圾邮件) | 15 |
Pushover 可选
通过Pushover在你的手机上接收推送通知. 在 pushover.net 上创建一个应用,以获取你的 API Token.
| 参数 | 描述 |
|---|---|
Enabled | 启用 Pushover (true / false) |
ApiToken | 你的 Pushover 应用 API Token |
UserKey | 你的 Pushover 用户密钥 |
RateLimitMinutes | 提醒之间的最小间隔(默认: 15) |
Telegram 可选
通过 Telegram 机器人接收通知. 使用@BotFather创建一个机器人,然后获取你的 Chat ID.
| 参数 | 描述 |
|---|---|
Enabled | 启用 Telegram (true / false) |
Bots | 机器人列表。每个机器人都有自己的 Name、BotToken 和 ChatIds 列表。这就可以在不同群组中通知不同的人 |
RateLimitMinutes | 提醒之间的最短间隔(默认值:15) |
从 1.2.0 开始,你可以同时通知多个群组:通过第一个机器人通知两个人,通过第二个机器人通知另外三个人。每次发送彼此独立,一个无法联系的接收者不再阻止其他人收到消息。
"Telegram": {
"Enabled": true,
"RateLimitMinutes": 15,
"Bots": [
{
"Name": "Famille",
"BotToken": "123456:AAExxxxxxxxxxxxxxxxxxxx",
"ChatIds": [ "11111111", "22222222" ]
},
{
"Name": "Voisins",
"BotToken": "789012:BBEyyyyyyyyyyyyyyyyyyyy",
"ChatIds": [ "33333333", "44444444", "55555555" ]
}
]
}旧的形式使用单个 BotToken 和由分号分隔的多个 ChatId,仍然可以使用。如果你不更改配置,通知仍会和以前完全一样。
📈 监控 可选
| 参数 | 描述 | 默认值 |
|---|---|---|
HealthCheckIntervalSeconds | 设备连接状态检查频率 | 30 |
LogStatusIntervalSeconds | 在日志文件中记录完整状态的频率 | 300 |
PostResumeGuardSeconds | 程序检查集线器在恢复后保持你的设置的持续时间 | 300 |
DeviceUnreachableAlertMinutes | 设备无法连接的时长超过此时间后向你发出提醒 | 60 |
更新 可选
从 1.2.0 起,程序不再自动更新。它每小时检查一次是否存在更新版本,只会提醒你:在你安装新版本之前,每小时都会在日志中留下一条提醒,并且只会在你配置的频道中发送一条消息,其中包含直接下载链接。
在服务运行期间替换保护电池的二进制文件,这是产品中风险最高的操作。还是由你来决定时间比较好。旧的 AutoUpdateEnabled 和 CheckIntervalHours 键已经不再读取:你可以把它们留在文件中,它们会被忽略。
| 参数 | 描述 | 默认值 |
|---|---|---|
CheckEnabled | 每小时检查是否存在更新的版本 | true |
NotifyOnNewVersion | 首次检测到某个版本时,向你的通知渠道发送一条消息。每个版本只发送一次,不会再次提醒 | true |
🔑 许可证 试用期后
30 天试用期结束后,添加你的密钥以激活 PRO 许可证。你的密钥位于你的账户中,路径是 右上角 > “我的账户”。许可证会在后台自动续期。
| 参数 | 描述 | 示例 |
|---|---|---|
SecretKey | 从你的 digital3d.com 账户中获取你的唯一密钥(GUID)。留空以使用试用模式。 | d79d24cc-eb02-48d7-94f8-xxxxxxxxxxxx |
最小配置示例
这里有一个开箱即用的示例。只需将 IP 地址替换为你的设备地址:
{
"Messages": {
"Language": "fr"
},
"Energy": {
"PricePerKwhCents": 28
},
"Shelly": {
"Enabled": true,
"Host": "192.168.1.50"
},
"ZendureDevice": {
"Host": "192.168.1.127",
"Port": 80,
"DefaultOutputLimit": 2400,
"DefaultMinSoc": 100
},
"EvDetection": {
"PowerThresholdWatts": 5000
},
"Subscription": {
"SecretKey": "d79d24cc-eb02-48d7-94f8-xxxxxxxxxxxx"
}
}使用此配置,程序会监控你的 Shelly,检测任何高于 5000W 的用电量(举例来说),并以最低 10%(100 ÷ 10)和最高 2400W 的输出恢复你的电池。Subscription 部分默认为空:程序会在 30 天内以试用模式运行。要激活 PRO 许可证,请从你的账户右上方添加你的密钥。
免费试用 & 订阅
30 天免费试用,无需承诺!
下载 Zendure EV Guard,完整试用 30 天,无需支付任何费用,也没有功能限制。你将可以使用 100% 的功能,确保程序与你的安装完全匹配。
30 天结束后,需要订阅 Digital3D 才能继续使用程序。一个订阅即可让你使用 Digital3D 的所有应用程序(CompactForIA、AutoMouseMove、Zendure EV Guard 等)。
如何激活你的许可证
- 订阅 "One for All"
- 登录你在 digital3d.com 上的账户,并复制你的密钥(一个 GUID 格式的唯一标识符,例如:
f89f26cc-eb03-48d7-94f8-xxxxxxxxxxxx) - 打开
appsettings.json文件,并在Subscription部分添加你的密钥:"Subscription": { "SecretKey": "votre-clef-secrete-guid" } - 重启程序:PRO 许可证会自动激活并自动续订,无需你进行任何操作。
Join the conversation
You need an account to comment on this article. Creating one is free and takes under a minute.
No comments yet.