Zendure EV Guard
Protege tus baterías Zendure durante la carga de tu coche eléctrico
Compatible con Zendure SolarFlow 2400 AC • Shelly Pro 3EM • Smappee • Windows, Linux, macOS
¿Tienes baterías Zendure y un coche eléctrico?
Ya lo sabes: cuando tu coche se conecta a la wallbox, lo absorbe todo. Tus baterías Zendure se vacían a toda velocidad, los ciclos se acumulan y la vida útil de tus preciosas celdas se derrite como la nieve al sol.
Si tu coche es un vehículo de empresa y la electricidad la paga tu empleador, es una pena vaciar tus baterías para recargarlo cuando por la noche ya no te quedará nada para el autoconsumo de tu casa.
Otro caso: aunque no se trate de un coche de empresa, quizá simplemente quieras evitar que tus baterías se vacíen durante la carga, para aprovechar al máximo la electricidad producida por tus paneles solares a pleno sol, sin tirar de tus baterías Zendure.
Zendure EV Guard resuelve este problema automáticamente. En cuanto detecta la carga de tu coche, el programa pone tus baterías en pausa. Cuando termina la carga, las reactiva. Simple, automático, sin riesgo.
¿Cómo funciona?
1. Detección
Tu Shelly Pro 3EM (o Smappee) mide el consumo. Cuando la potencia supera el umbral (ej: 5000W), el programa sabe que tu coche está cargando.
2. Protección
Las baterías Zendure pasan al modo OFF instantáneamente. Ya no se descargan, tus ciclos quedan preservados.
3. Reanudación
¿Carga terminada? El programa reactiva tus baterías automáticamente con tus parámetros originales. Ninguna intervención manual.
🔒 100% sin peligro para tus baterías
Zendure EV Guard utiliza exclusivamente la API local HTTP de tu hub Zendure. Solo toca dos ajustes, los mismos que ves en la aplicación Zendure: el minSoc (el límite inferior de descarga) y el outputLimit (la potencia de salida). Para ponerlas en pausa, sube el minSoc al 100% y baja la salida a 0 W. Para reanudar, restaura tus valores habituales.
¿Por qué los dos? Porque uno solo no siempre basta. Si tu hub funciona en modo HEMS, a veces vuelve a abrir la salida él solo durante la pausa. El programa se da cuenta en unos segundos y la vuelve a cerrar. Medición hecha en mi casa el 22 de agosto de 2026, batería al 30%, coche a 18 kW: dos aperturas, cerradas en 10 y luego 5 segundos, 2 Wh en total.
Ningún firmware modificado, ningún acceso a la nube, ningún riesgo. Es exactamente lo mismo que si cambiaras el ajuste manualmente en la app Zendure, pero automáticamente y en el momento adecuado.
Novedades de la 1.3.12
- El programa habla francés. Todo lo que lees (correos, Pushover, Telegram, informes de carga) existe en francés y en inglés. Una clave de configuración,
Messages:Language, y eso es todo. Los registros técnicos siguen en inglés, a propósito. - Un informe al final de cada carga. Cuántos kWh han pasado por el contador, cuántos para el coche, la duración, el pico, la media. Y el coste indicativo, si das el precio de tu kWh en
Energy:PricePerKwhCents. - La fuga durante la pausa se mide y se cierra. Un hub en modo HEMS puede volver a abrir su salida durante la pausa. El programa lo ve, lo cuantifica, lo cierra y te avisa si dura.
- El archivo contiene lo necesario para instalar. Un script para Linux, uno para macOS, uno para Windows, además de la guía de usuario en francés y en inglés. Ya no hace falta copiar un archivo de servicio a mano.
- Una pausa preventiva si el contador se queda mudo. A ciegas, el programa ya no puede ver cómo se conecta tu coche: pone las baterías a salvo y las libera en la primera medición válida.
- Tus baterías se vuelven a poner en servicio antes del apagado, incluso cuando es el sistema el que detiene el programa.
Requisitos
| Equipo | Detalles |
|---|---|
| Zendure SolarFlow 2400 AC | Hub con API local HTTP activada (puerto 80) |
| Shelly Pro 3EM o Smappee1 necesario | Pinza amperimétrica (Shelly, tiempo real) o monitor energético Smappee (API en la nube, bloques de 5 min) para medir el consumo |
| Wallbox / Estación de carga | Cualquier estación: la detección se basa en el consumo, no en la propia estación |
| PC, Servidor o NAS | Windows, Linux o macOS, el programa funciona en segundo plano 24h/24 |
Instalación
1. Descomprime el archivo
Extrae el contenido del archivo ZIP en el directorio que quieras, por ejemplo :
- Windows :
C:\ZendureEvGuard\ - Linux :
/home/ZendureEvGuard/ - macOS :
/Applications/ZendureEvGuard/
2. Permisos de ejecución (solo Linux / macOS)
En Linux y macOS, debes hacer ejecutable el archivo antes de lanzarlo :
chmod +x ZendureEvGuard
./ZendureEvGuard3. Configura appsettings.json
Abre el archivo appsettings.json situado junto al ejecutable y completa tus parámetros (consulta la sección de abajo).
4. Lanza el programa
# Windows
ZendureEvGuard.exe
# Linux / macOS
./ZendureEvGuardEl programa muestra la información de conexión al iniciarse. Usa P para pausar manualmente, R para reanudar, y Ctrl+C dos veces para detenerlo correctamente.
5. Instálalo como servicio (recomendado)
El programa solo protege tus baterías si está funcionando. Desde la 1.3.12, el archivo contiene un script para cada sistema : instala el servicio, lo activa al iniciar y lo lanza, desde la carpeta donde lo descomprimiste. No se copia nada en otro sitio.
# Linux
sudo sh install-linux.sh
# macOS
sudo sh install-macos.sh
# Windows (PowerShell en tant qu'administrateur)
powershell -ExecutionPolicy Bypass -File .\install-windows.ps1En Windows, el servicio funciona con la cuenta SYSTEM, que no tiene el mismo espacio de datos que tu sesión : indica correctamente Subscription.SecretKey en appsettings.json antes de instalarlo.
El archivo README.txt incluido en el archivo detalla cada comando, la desinstalación y la actualización. Y USER_GUIDE_FR.md recoge todos los ajustes, sin conexión.
¿Prefieres escribir el servicio tú mismo? En Linux, esta es la unidad que instala el script. Dos líneas no son decorativas: TimeoutStopSec=120 deja al programa tiempo para volver a poner tus baterías en servicio antes de que systemd lo mate, y network-online.target evita que se inicie antes de que la red esté realmente disponible.
[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.targetDespués, los comandos habituales:
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-evguardNo pongas un User= dedicado sin haberlo pensado bien: el programa escribe sus registros y su estado de pausa junto al ejecutable, y una cuenta sin permisos sobre esa carpeta hace que falle en el primer reinicio.
Configuración: appsettings.json
Estos son todos los parámetros que puedes configurar. Las secciones Shelly y ZendureDevice son obligatorias.
Mensajes nuevo en 1.3.12
El idioma de todo lo que tú lees: correos, Pushover, Telegram, informes del final de la carga. Los registros técnicos siguen en inglés, para que un mensaje de error se pueda buscar.
| Parámetro | Descripción | Predeterminado |
|---|---|---|
Language | Idioma de los mensajes: "en" o "fr". Cualquier otro valor vuelve al inglés, sin impedir el arranque | "en" |
Ojo con la ubicación: esta clave va debajo de la sección Messages, nunca en la raíz del archivo. En Linux, una clave Language situada en la raíz es sobrescrita por la variable de entorno LANGUAGE del sistema, y tus mensajes vuelven al inglés sin avisar.
"Messages": {
"Language": "fr"
}⚡ Shelly obligatorio
Configuración de tu Shelly Pro 3EM. Es el sensor que mide el consumo eléctrico de tu casa.
| Parámetro | Descripción | Ejemplo |
|---|---|---|
Enabled | Activar Shelly como fuente de medición | true |
Host | Dirección IP de tu Shelly Pro 3EM en tu red local | "192.168.1.50" |
UseDigestAuth | Activar si has protegido tu Shelly con una contraseña | false |
Username | Nombre de usuario (si la autenticación está activada) | "admin" |
Password | Contraseña (si la autenticación está activada) | "monmotdepasse" |
🔌 Punto de carga Smappee opcional
El punto de carga energético Smappee puede utilizarse de dos maneras :
- Como fuente de detección de EV (alternativa a Shelly): si Shelly está desactivado, Smappee se convierte en la fuente de medición de potencia para detectar la carga de EV. La detección se realiza mediante la API cloud de Smappee (bloques de 5 minutos, menos reactiva que Shelly en tiempo real).
- En paralelo con Shelly: si Shelly está activo como fuente de detección, Smappee puede estar activo igualmente para mostrar continuamente la información de consumo (solar, casa, red) y de tu borne Smappee EV Wall (potencia de carga, estado, etc.) en los registros.
| Parámetro | Descripción | Ejemplo |
|---|---|---|
Enabled | Activar Smappee (fuente de detección si Shelly está desactivado, o mostrar la información de consumo/punto de carga EV en paralelo) | false |
ClientId | ID de cliente de tu aplicación Smappee (API v3) | "votre-client-id" |
ClientSecret | Secreto de cliente de tu aplicación Smappee | "votre-client-secret" |
Username | Nombre de usuario de tu cuenta Smappee | "user@email.com" |
Password | Contraseña de tu cuenta Smappee | "motdepasse" |
ServiceLocationId | ID de tu ubicación Smappee (visible en el dashboard de Smappee, no es el número de serie) | "190802" |
PollingIntervalSeconds | Frecuencia de consulta de la API de Smappee | 30 |
Batería Zendure obligatorio
Configuración de tu hub Zendure SolarFlow 2400 AC u otros. La dirección IP se encuentra en la app Zendure.
| Parámetro | Descripción | Ejemplo |
|---|---|---|
Host | Dirección IP de tu hub Zendure en la red local | "192.168.1.127" |
Port | Puerto HTTP de la API local (80 por defecto) | 80 |
DefaultOutputLimit | Potencia máxima de salida en vatios que se debe restaurar después de la carga EV | 2400 |
DefaultMinSoc | Umbral mínimo de descarga que se debe restaurar después de la carga: el nivel por debajo del cual tus baterías ya no se descargarán (el valor es ×10: 100 = 10%, 200 = 20%). No es el nivel máximo de carga. | 100 |
TimeoutSeconds | Tiempo de espera para las solicitudes al hub | 10 |
Comprender el DefaultMinSoc
Este parámetro define el límite de descarga de tus baterías: el nivel por debajo del cual el hub ya no las dejará descargarse. El valor se multiplica por 10 en la API de Zendure:
100= las baterías pueden bajar hasta 10%200= las baterías pueden bajar hasta 20%500= las baterías se detienen en 50%, y la mitad de tu capacidad ya no sirve para nada
No hay que confundirlo con el límite de carga. El nivel en el que tus baterías dejan de cargarse es socSet, otro ajuste, el que ves en la aplicación de Zendure. Poner 950 aquí no quiere decir "carga hasta el 95%" sino "no bajes nunca del 95%" : tus baterías se vuelven inutilizables. Desde la 1.3.0, el programa se niega a iniciarse con un valor fuera de 1 a 999, y te avisa por encima de 500.
¡Tú eliges! Cuanto más bajo sea el valor, más utilizas tus baterías ; cuanto más alto sea, más cuidas las celdas, a costa de la capacidad disponible. La mayoría de los usuarios eligen entre 100 (10%) y 200 (20%).
Detección de vehículos eléctricos
Ajustes de la detección de carga de tu vehículo eléctrico. El algoritmo utiliza una histéresis : hacen falta varias lecturas consecutivas por encima del umbral para confirmar una carga, y varias lecturas por debajo para confirmar la detención.
| Parámetro | Descripción | Predeterminado |
|---|---|---|
PowerThresholdWatts | Umbral de potencia (en vatios) por encima del cual el programa considera que un coche está cargando. Adáptalo a tu wallbox. | 5000 |
ConfirmationReadings | Número de lecturas consecutivas por encima del umbral para confirmar el inicio de la carga | 2 |
ReleaseReadings | Número de lecturas consecutivas por debajo del umbral para confirmar el final de la carga (24 = ~2 minutos a 5s/lectura) | 24 |
PollingIntervalSeconds | Frecuencia de medición en segundos | 5 |
PauseOnSourceUnreachableMinutes | Nuevo en 1.3.0. Duración durante la cual el contador puede quedar inaccesible antes de que las baterías se pongan en pausa por precaución: a ciegas, el programa ya no puede ver cómo conectas tu coche. La pausa se levanta en cuanto llega la primera medición válida. Pon 0 para desactivar esta medida de seguridad. | 3 |
NotifyPrecautionaryPauseAfterMinutes | Se aplica una pausa de precaución de inmediato, pero solo se te notifica cuando supera esta duración: un contador que parpadea tres segundos no merece un correo | 30 |
SourceUnreachableReleaseMinutes | Duración a partir de la cual se levanta una pausa de precaución aunque el contador siga sin dar señales | 10 |
ReleaseHysteresisWatts | Margen por debajo del umbral que hay que volver a alcanzar para confirmar el final de la carga. Evita el vaivén cuando el consumo oscila justo alrededor del umbral | 500 |
PostResumeCooldownSeconds | Retraso después de una reanudación durante el cual se ignora una nueva detección | 60 |
Energía nuevo en 1.3.12
Al final de cada carga, el programa te dice cuántos kWh han pasado. Dale el precio de tu kWh y añade el importe. Es indicativo, no una factura: nadie mide el cargador en sí, y el precio es fijo mientras que el tuyo quizá no lo sea.
El uso en el que pienso: varios coches se conectan en tu casa, y cada uno debe saber cuánto ha consumido.
| Parámetro | Descripción | Predeterminado |
|---|---|---|
PricePerKwhCents | Precio del kWh en céntimos enteros (28 = 0,28 EUR). Pon 0 para no mostrar nada. Un número con coma se rechaza y se lee como 0, sin impedir el arranque | 28 |
El informe cuantifica dos energías. La medida en el contador, que es un hecho. Y la parte estimada del vehículo, que resta el consumo habitual de la casa: una estimación, y un máximo cuando tus paneles exportaban en el momento de conectarlo.
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 WNotificación opcional
Recibe correos electrónicos cuando tus baterías se ponen en pausa, reanudan la carga, o en caso de error. Configura tu servidor SMTP.
| Parámetro | Descripción | Predeterminado |
|---|---|---|
Enabled | Activar las notificaciones por correo electrónico | false |
SmtpHost | Servidor SMTP (ej: smtp.gmail.com) | "" |
SmtpPort | Puerto SMTP | 587 |
UseSsl | Usar TLS/SSL | true |
Username / Password | Credenciales SMTP | "" |
FromAddress | Dirección de correo electrónico del remitente | "" |
ToAddress | Destinatario(s), separados por ; para varios | "" |
RateLimitMinutes | Intervalo mínimo entre dos alertas (antispam) | 15 |
📴 Pushover opcional
Notificaciones push en tu teléfono mediante Pushover. Crea una aplicación en pushover.net para obtener tu API Token.
| Parámetro | Descripción |
|---|---|
Enabled | Activar Pushover (true / false) |
ApiToken | Token API de tu aplicación Pushover |
UserKey | Tu clave de usuario de Pushover |
RateLimitMinutes | Intervalo mínimo entre alertas (por defecto: 15) |
💬 Telegram opcional
Notificaciones mediante un bot de Telegram. Crea un bot con @BotFather y recupera tu Chat ID.
| Parámetro | Descripción |
|---|---|
Enabled | Activar Telegram (true / false) |
Bots | Lista de bots. Cada uno tiene su Name, su BotToken y su lista ChatIds. Esto permite avisar a personas diferentes en grupos diferentes |
RateLimitMinutes | Intervalo mínimo entre alertas (por defecto: 15) |
Desde la 1.2.0, puede avisar a varios grupos a la vez: a dos personas mediante un primer bot, y a otras tres mediante un segundo. Cada envío está aislado, un destinatario inalcanzable ya no impide que los demás reciban el mensaje.
"Telegram": {
"Enabled": true,
"RateLimitMinutes": 15,
"Bots": [
{
"Name": "Famille",
"BotToken": "123456:AAExxxxxxxxxxxxxxxxxxxx",
"ChatIds": [ "11111111", "22222222" ]
},
{
"Name": "Voisins",
"BotToken": "789012:BBEyyyyyyyyyyyyyyyyyyyy",
"ChatIds": [ "33333333", "44444444", "55555555" ]
}
]
}La forma antigua, con un solo BotToken y varios ChatId separados por punto y coma, sigue funcionando. Si no cambia nada en su configuración, sus notificaciones continúan exactamente como antes.
Monitorización opcional
| Parámetro | Descripción | Predeterminado |
|---|---|---|
HealthCheckIntervalSeconds | Frecuencia de comprobación de la conectividad de los dispositivos | 30 |
LogStatusIntervalSeconds | Frecuencia de registro del estado completo en los archivos de registro | 300 |
PostResumeGuardSeconds | Duración durante la que el programa comprueba que el hub ha conservado tus ajustes después de una reanudación | 300 |
DeviceUnreachableAlertMinutes | Duración durante la que un dispositivo no está accesible y a partir de la cual recibes una alerta | 60 |
Actualización opcional
Desde la 1.2.0, el programa ya no se actualiza solo. Comprueba una vez por hora si existe una versión más reciente, y se limita a avisarte: un recordatorio en los registros cada hora mientras no hayas instalado la nueva versión, y un solo mensaje en los canales que hayas configurado, con el enlace de descarga directa.
Reemplazar el binario de un servicio que protege tus baterías mientras está funcionando es la acción más arriesgada del producto. Mejor que seas tú quien decida cuándo hacerlo. Las antiguas claves AutoUpdateEnabled y CheckIntervalHours ya no se leen: puedes dejarlas en tu archivo, se ignoran.
| Parámetro | Descripción | Predeterminado |
|---|---|---|
CheckEnabled | Comprobar cada hora si existe una versión más reciente | true |
NotifyOnNewVersion | Enviar un mensaje a tus canales de notificación cuando se detecte una versión por primera vez. Una sola vez por versión, nunca volver a avisar | true |
Licencia después de la prueba
Después del periodo de prueba de 30 días, añade tu clave secreta para activar la licencia PRO. Tu clave se encuentra en tu cuenta, en arriba a la derecha > "Mi cuenta". La licencia se renueva automáticamente en segundo plano.
| Parámetro | Descripción | Ejemplo |
|---|---|---|
SecretKey | Tu clave secreta única (GUID) desde tu cuenta digital3d.com. Déjalo vacío para utilizar el modo de prueba. | d79d24cc-eb02-48d7-94f8-xxxxxxxxxxxx |
Ejemplo de configuración mínima
Aquí tienes un ejemplo listo para usar. Simplemente sustituye las direcciones IP por las de tus dispositivos:
{
"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"
}
}Con esta configuración, el programa supervisa tu Shelly, detecta cualquier consumo superior a 5000W (por ejemplo), y restaura tus baterías con un mínimo del 10% (100 ÷ 10) y una salida máxima de 2400W. La sección Subscription está vacía por defecto: el programa funciona en modo de prueba durante 30 días. Para activar la licencia PRO, añade tu clave secreta desde tu cuenta arriba a la derecha.
Prueba gratuita y suscripción
30 días de prueba gratuita, sin compromiso!
Descarga Zendure EV Guard y pruébalo durante 30 días completos, sin pagar nada y sin límite de funcionalidades. Tendrás acceso al 100% de las funciones para asegurarte de que el programa se adapta perfectamente a tu instalación.
Al finalizar los 30 días, necesitarás una suscripción Digital3D para seguir utilizando el programa. Una sola suscripción te da acceso a todas las aplicaciones Digital3D (CompactForIA, AutoMouseMove, Zendure EV Guard, etc.).
Cómo activar tu licencia
- Contrata una suscripción en "One for All"
- Inicia sesión en tu cuenta en digital3d.com y copia tu clave secreta (un identificador único en formato GUID, por ejemplo:
f89f26cc-eb03-48d7-94f8-xxxxxxxxxxxx) - Abre el archivo
appsettings.jsony añade tu clave en la secciónSubscription:"Subscription": { "SecretKey": "votre-clef-secrete-guid" } - Reinicia el programa: la licencia PRO se activa automáticamente y se renueva sin ninguna intervención por tu parte.
¿Listo para proteger tus baterías?
Descarga gratis, configura en 5 minutos y duerme tranquilo.
Suscripción « One for All »: una sola suscripción para todas las aplicaciones de Digital3D.
Join the conversation
You need an account to comment on this article. Creating one is free and takes under a minute.
Ningún comentario por el momento.