你有 Zendure 电池?同时还给你的车充电?这可不太妙哦哦哦…

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 3EMSmappee需要 1 个电流钳(Shelly,实时)或 Smappee 能源监测器(云端 API,每 5 分钟一个数据块),用于测量消耗
Wallbox / 充电桩任何充电桩都可以:检测依据是耗电量,而不是充电桩本身
PC、服务器或 NASWindows、Linux 或 macOS,程序会全天候在后台运行
 

安装

1. 解压压缩包

将 ZIP 文件的内容解压到你选择的目录中,例如:

  • WindowsC:\ZendureEvGuard\
  • Linux/home/ZendureEvGuard/
  • macOS/Applications/ZendureEvGuard/

2. 执行权限(仅限 Linux / macOS)

在 Linux 和 macOS 上,你必须先让文件变为可执行文件才能运行它:

chmod +x ZendureEvGuard
./ZendureEvGuard

3. 配置 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

下面是你可以配置的所有参数。ShellyZendureDevice 部分是必需的。

消息 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"
PollingIntervalSecondsSmappee API 的查询频率30

🔋 Zendure 电池 必需

配置你的 Zendure SolarFlow 2400 AC hub 或其他设备。IP 地址可以在 Zendure 应用中找到。

参数描述示例
Host你的 Zendure hub 在本地网络中的 IP 地址"192.168.1.127"
Port本地 API 的 HTTP 端口(默认为 80)80
DefaultOutputLimitEV 充电后要恢复的最大输出功率,单位为瓦特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
PauseOnSourceUnreachableMinutes1.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
SmtpHostSMTP 服务器 (例如: smtp.gmail.com)""
SmtpPortSMTP 端口587
UseSsl使用 TLS/SSLtrue
Username / PasswordSMTP 凭据""
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机器人列表。每个机器人都有自己的 NameBotTokenChatIds 列表。这就可以在不同群组中通知不同的人
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 起,程序不再自动更新。它每小时检查一次是否存在更新版本,只会提醒你:在你安装新版本之前,每小时都会在日志中留下一条提醒,并且只会在你配置的频道中发送一条消息,其中包含直接下载链接。

在服务运行期间替换保护电池的二进制文件,这是产品中风险最高的操作。还是由你来决定时间比较好。旧的 AutoUpdateEnabledCheckIntervalHours 键已经不再读取:你可以把它们留在文件中,它们会被忽略。

参数描述默认值
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 等)。

如何激活你的许可证

  1. 订阅 "One for All"
  2. 登录你在 digital3d.com 上的账户,并复制你的密钥(一个 GUID 格式的唯一标识符,例如:f89f26cc-eb03-48d7-94f8-xxxxxxxxxxxx
  3. 打开 appsettings.json 文件,并在 Subscription 部分添加你的密钥:
    "Subscription": {
      "SecretKey": "votre-clef-secrete-guid"
    }
  4. 重启程序:PRO 许可证会自动激活并自动续订,无需你进行任何操作。

准备好保护你的电池了吗?

免费下载,5分钟内完成配置,安心睡觉。

订阅One for All ”:一个订阅,适用于 Digital3D 的所有应用。

Download — Version 1.3.12

Version history
1.3.12 2026/8/22Current
- La langue des messages se regle sous la section Messages : "Messages": { "Language": "fr" }. Une cle Language posee a la racine du fichier n'est plus lue - La mise en pause ecrit desormais minSoc ET outputLimit, et les reecrit toutes les 5 secondes - Nouveau : tout ce que vous lisez existe en francais et en anglais (Messages:Language, "en" par defaut). Les journaux techniques restent en anglais - Nouveau : un rapport a la fin de chaque charge (duree, kWh au compteur, part estimee du vehicule, pointe, moyenne) - Nouveau : le cout indicatif de la charge, si vous donnez le prix de votre kWh dans Energy:PricePerKwhCents (28 centimes par defaut, 0 pour ne rien afficher) - Nouveau : la fuite de pause est mesuree et refermee. Un hub en mode HEMS pouvait rouvrir sa sortie pendant la pause, et alimenter la voiture sans que rien ne le dise - Nouveau : une alerte quand le hub cesse d'appliquer la pause pendant une charge - Nouveau : une pause de precaution quand le compteur devient injoignable, levee des la premiere mesure valide - Nouveau : l'archive contient les scripts d'installation Windows, Linux et macOS, plus le guide utilisateur en francais et en anglais - Nouveau : quatre reglages de detection exposes (NotifyPrecautionaryPauseAfterMinutes, SourceUnreachableReleaseMinutes, ReleaseHysteresisWatts, PostResumeCooldownSeconds) et deux de surveillance (PostResumeGuardSeconds, DeviceUnreachableAlertMinutes) - Vos batteries sont remises en service avant l'arret du programme, y compris quand c'est le systeme qui l'arrete - Le programme refuse de demarrer si votre compteur Shelly rejette les identifiants, et vous previent au lieu de tourner en aveugle - Correction : un mot de passe Shelly refuse n'est plus confondu avec un compteur hors ligne - Correction : plus de rafales de messages quand la consommation oscille autour du seuil de detection - Correction : une notification qui echoue est reessayee pendant 5 minutes, au lieu d'etre perdue - Correction : le comptage des kWh ignore les intervalles de mesure trop longs au lieu de les integrer
1.3.0 2026/8/20
- Le plancher de décharge par défaut (DefaultMinSoc) passe de 950 à 100 : à 950, les batteries n'avaient plus le droit de descendre sous 95%, donc plus rien à donner - Au démarrage, une valeur de DefaultMinSoc hors de 1 à 999 est refusée, et une valeur au-dessus de 500 déclenche un avertissement - Nouvelle clé EvDetection.PauseOnSourceUnreachableMinutes (3 par défaut) : si le compteur reste injoignable plus longtemps, les batteries sont mises en pause par précaution, jusqu'à la première mesure valide - La clé Smappee.EvThresholdWatts n'existe plus, elle n'était lue nulle part - L'état d'avant-pause est enregistré sur disque : un redémarrage pendant une pause ne perd plus les valeurs à restaurer - Correction : la notification « batteries pleines » se basait sur le plancher de décharge au lieu du plafond de charge du hub - Correction : plus de fausse restauration au démarrage en pleine journée, qui envoyait un e-mail et un message pour rien - Correction : après une reprise, la vérification automatique surveille la valeur réellement envoyée à l'appareil
1.2.0 2026/8/5
- Le programme ne se met plus à jour tout seul : il vérifie chaque heure et vous prévient, une seule fois par version - Rappel horaire dans les logs tant que la nouvelle version n'est pas installée, avec le lien de téléchargement - Nouvelles clés de la section Update : CheckEnabled et NotifyOnNewVersion - Les anciennes clés AutoUpdateEnabled et CheckIntervalHours ne sont plus lues, elles sont simplement ignorées - Telegram : plusieurs bots, chacun avec sa liste de destinataires, via la nouvelle liste Bots - L'ancienne configuration Telegram continue de fonctionner telle quelle - Un destinataire injoignable n'empêche plus les autres de recevoir le message - Correction : une valeur trop grande dans l'ancien intervalle de vérification pouvait arrêter le service
Join the conversation

You need an account to comment on this article. Creating one is free and takes under a minute.

  • The XMLTV file, free to download every day
  • Comment on articles and reply to other readers
  • Get an e-mail when an article you follow is updated

No comments yet.

Une erreur s'est produite. Cette application peut ne plus répondre jusqu'à ce qu'elle soit rechargée.Veuillez contacter l'auteur. Reload 🗙