Antes de empezar
- Node-RED activado. Cerbo GX con Venus OS Large y Node-RED activado; el editor se abre en
https://venus.local:1881. Cómo hacerlo: primera puesta en marcha de Node-RED. - Monitor de batería visible en el GX. El SoC procede de un monitor de batería o un BMS conectado al GX, como SmartShunt, BMV o Lynx Shunt. Si el GX no muestra el estado de carga, Node-RED tampoco lo recibirá.
- Relé en modo manual. Victron: el relé solo se puede controlar desde Node-RED tras configurarlo para control manual. Para los relés del Cerbo GX: Settings → Integrations → Relays, función «Manual». En el mismo menú se configura la polaridad del relé (normalmente abierto o normalmente cerrado).

También se pueden controlar otros relés desde Node-RED, pero antes hay que configurarlos: en el BMV, selecciona REM como opción del relé (en VictronConnect); en el Lynx Shunt VE.Can, selecciona la función «Manual control» (en el menú GX); en los reguladores MPPT de mayor tamaño y los dispositivos de la serie RS, selecciona el modo manual (en VictronConnect). El relé del Lynx Smart BMS no se puede controlar desde Node-RED. Tampoco se pueden controlar el relé de alarma ni el contactor AC-out 2 del MultiPlus y el Quattro.
¿Quieres arrancar un generador? El GX ya incorpora arranque y parada automáticos del generador mediante relé, con sus propias condiciones de arranque (capítulo «Generator auto start/stop» del manual GX), y no necesitas Node-RED. El ejemplo de Victron con generador (más abajo) no controla el relé directamente, sino que utiliza el nodo Generator.
Cómo funciona este flujo
- Battery (entrada)Estado de carga del monitor de batería: con cada cambio y, si no se marca «only changes», también cada 5 s.
- histéresis (function)SoC ≤ 30% → 1, SoC ≥ 50% → 0; entre ambos, sin cambios. Solo envía los cambios de estado.
- Relay (salida)1 cierra y 0 abre el relé 1 del Cerbo GX (/Relay/0/State).
- debugMuestra en el panel Debug cada valor enviado al relé.
Montaje paso a paso
- Nueva pestaña. En el editor de Node-RED, añade una nueva pestaña de flujo (botón «+» sobre el área de trabajo) para no mezclar el ejemplo con otros flujos.
- Nodo Battery. Desde la sección de nodos Victron de la paleta, arrastra el nodo de entrada Battery. En sus ajustes, selecciona tu monitor de batería y la medición «State of charge (%)». Deja sin marcar «only changes»: así, el nodo envía el SoC con cada cambio y, además, cada 5 segundos, de modo que la función recibe pronto un valor también después de reiniciar.
- Nodo function. Añade un nodo function estándar, llámalo «histéresis» y pega el código de la sección «Código de histéresis». Conecta la salida del nodo Battery a la entrada de la función.
- Nodo Relay. Añade el nodo de salida Relay, selecciona «Venus device» y «Venus relay 1 state» (ruta
/Relay/0/State: la numeración de la ruta empieza en 0, por lo que el índice 0 corresponde al relé 1). El nodo aplica el valor que recibe enmsg.payload: 0 — Open, 1 — Closed. Conecta la salida de la función a este nodo. - Nodo debug. Conecta también un nodo debug a la salida de la función. Verás los valores en el panel Debug, a la derecha del editor, y debajo del nodo «histéresis» aparecerán el SoC actual y el estado del relé.
- Deploy y prueba. Pulsa Deploy. Para no tener que esperar a que se descargue la batería, añade temporalmente un nodo inject con un valor numérico (tipo «number», por ejemplo, 25 y después 55), conéctalo a la función y comprueba si el relé cambia de estado en el menú Relays. Después, elimina inject y vuelve a pulsar Deploy.
Código de histéresis
Si el relé se activara y desactivara con un único umbral, por ejemplo, el 40%, conmutaría repetidamente cuando el SoC fluctuara alrededor de ese valor. La histéresis separa los umbrales: el relé se cierra al 30% o menos y no se abre hasta el 50% o más. Entre ambos mantiene su estado anterior. La función guarda ese estado en el contexto del nodo y solo envía un mensaje cuando cambia, por lo que el relé no recibe el mismo valor cada 5 segundos.
// Histéresis: cierra el relé con SoC <= 30 %, ábrelo con SoC >= 50 %.
// Los umbrales son de ejemplo - configura los tuyos.
const PROG_ZAL = 30;
const PROG_WYL = 50;
const soc = msg.payload;
if (typeof soc !== 'number' || isNaN(soc)) return null; // sin lectura: no hagas nada
const poprzedni = context.get('stan');
let stan = (poprzedni === undefined) ? 0 : poprzedni;
if (soc <= PROG_ZAL) stan = 1; // 1 = Cerrado
else if (soc >= PROG_WYL) stan = 0; // 0 = Abierto
// entre los umbrales, el estado no cambia
node.status({fill: stan ? 'green' : 'grey', shape: 'dot',
text: 'SoC ' + soc.toFixed(1) + ' %, relé ' + (stan ? 'cerrado' : 'abierto')});
if (stan === poprzedni) return null; // envía solo los cambios
context.set('stan', stan);
msg.payload = stan;
return msg;
| SoC | Qué hace la función | Relé |
|---|---|---|
| 60% | primera lectura, 50% o más → envía 0 | abierto |
| 40% | entre los umbrales — no envía nada | abierto |
| 30% | 30% o menos → envía 1 | cerrado |
| 45% | entre los umbrales — no envía nada | cerrado |
| 50% | 50% o más → envía 0 | abierto |
- Lógica inversa. ¿Quieres desconectar el aparato cuando el SoC sea bajo, en lugar de encenderlo? Intercambia 1 y 0 en las dos líneas del código con los umbrales o conecta el circuito al otro contacto del relé: NC en lugar de NO.
- Sin lectura. Si
msg.payloadno es un número (por ejemplo, el monitor de batería ha dejado de estar disponible), la función no envía nada y el relé mantiene su estado actual. - Tras un reinicio. Por defecto, el contexto del nodo se almacena en la memoria RAM del dispositivo GX y se pierde al reiniciar o al cortarse la alimentación. La primera lectura tras un reinicio siempre establece el estado del relé: si el SoC está entre los umbrales, lo pone a 0 (abierto), incluso si estaba cerrado antes del reinicio. La sección «Precauciones» explica cómo conservar el contexto.
Flujo listo para importar
El mismo flujo en formato JSON. Los nodos Victron están configurados como en los ejemplos de la documentación de la paleta node-red-contrib-victron.
- Copia todo el bloque siguiente, incluidos los corchetes
[y]. - Importación. En el editor, abre el menú (botón de la esquina superior derecha) → Import o pulsa Ctrl-I, pega el texto y haz clic en Import. El flujo aparecerá en una nueva pestaña llamada «Relé según SoC».
- Selecciona tu monitor de batería. Abre el nodo «SoC de la batería» y selecciona en la lista tu monitor de batería y «State of charge (%)».
- Comprueba el relé en el nodo «Relé 1 GX», modifica los umbrales de la función si es necesario y haz clic en Deploy.
El nodo Battery apunta a un SmartShunt de ejemplo de la documentación de Victron (com.victronenergy.battery/277). El número final es distinto en cada instalación: depende del dispositivo y de cómo esté conectado. Hasta que selecciones tu monitor de batería en el nodo, la función no recibirá el SoC y el relé no cambiará de estado.
[
{"id":"c24a5c0f10000001","type":"tab","label":"Relé según SoC","disabled":false,"info":"Histéresis 30/50 % - ejemplo de cpv24.pl"},
{"id":"c24a5c0f10000002","type":"victron-input-battery","z":"c24a5c0f10000001","service":"com.victronenergy.battery/277","path":"/Soc","serviceObj":{"service":"com.victronenergy.battery/277","name":"SmartShunt (ejemplo - selecciona el tuyo)"},"pathObj":{"path":"/Soc","type":"float","name":"State of charge (%)"},"initial":"","name":"SoC de la batería","onlyChanges":false,"x":150,"y":120,"wires":[["c24a5c0f10000003"]]},
{"id":"c24a5c0f10000003","type":"function","z":"c24a5c0f10000001","name":"histéresis","func":"// Histéresis: cierra el relé con SoC <= 30 %, ábrelo con SoC >= 50 %.\n// Los umbrales son de ejemplo - configura los tuyos.\nconst PROG_ZAL = 30;\nconst PROG_WYL = 50;\n\nconst soc = msg.payload;\nif (typeof soc !== 'number' || isNaN(soc)) return null; // sin lectura: no hagas nada\n\nconst poprzedni = context.get('stan');\nlet stan = (poprzedni === undefined) ? 0 : poprzedni;\nif (soc <= PROG_ZAL) stan = 1; // 1 = Cerrado\nelse if (soc >= PROG_WYL) stan = 0; // 0 = Abierto\n// entre los umbrales, el estado no cambia\n\nnode.status({fill: stan ? 'green' : 'grey', shape: 'dot',\n text: 'SoC ' + soc.toFixed(1) + ' %, relé ' + (stan ? 'cerrado' : 'abierto')});\n\nif (stan === poprzedni) return null; // envía solo los cambios\ncontext.set('stan', stan);\nmsg.payload = stan;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":120,"wires":[["c24a5c0f10000004","c24a5c0f10000005"]]},
{"id":"c24a5c0f10000004","type":"victron-output-relay","z":"c24a5c0f10000001","service":"com.victronenergy.system/0","path":"/Relay/0/State","serviceObj":{"service":"com.victronenergy.system/0","name":"Dispositivo Venus"},"pathObj":{"path":"/Relay/0/State","type":"enum","name":"Estado del relé 1 de Venus","enum":{"0":"Abierto","1":"Cerrado"},"writable":true},"initial":"","name":"Relé 1 GX","onlyChanges":true,"x":600,"y":120,"wires":[]},
{"id":"c24a5c0f10000005","type":"debug","z":"c24a5c0f10000001","name":"estado del relé","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":610,"y":180,"wires":[]}
]
Ejemplos integrados de Victron
La paleta Victron incluye una biblioteca de ejemplos: menú (esquina superior derecha) → Import → Examples → node-red-contrib-victron. Los mismos flujos están también en la wiki de la paleta, por lo que puedes consultarlos sin abrir el editor. Tres de ellos son los más parecidos a este ejemplo:
| Ejemplo | Qué hace | En qué se diferencia del flujo de esta página |
|---|---|---|
| Threshold Control | La salida se activa cuando el valor de entrada supera el umbral ON y se desactiva cuando baja del umbral OFF. Antes de cada cambio espera el retardo configurado (ON/OFF delay). Los umbrales y el control manual están en el panel de control. | Controla el mismo relé 1 (/Relay/0/State), pero la entrada es la tensión de la batería del nodo System (/Dc/Battery/Voltage), no el SoC, y añade retardos. Requiere módulos adicionales: node-red-dashboard, node-red-contrib-ui-led y node-red-contrib-countdown. |
| Run generator at certain time when SOC is below 50% | Cada día a las 18.00 comprueba el SoC guardado. Si es bajo, arranca el generador durante 45 minutos: el nodo trigger envía 1 y, tras 45 minutos, 0. El SoC se guarda en el contexto flow.SOC mediante el nodo change. | Controla el nodo Generator (Manual Start), no el relé. Atención: la descripción dice «por debajo del 50%», pero el nodo switch de este flujo comprueba «menor o igual a 50» (nombre «Start if SOC is <= 50%»). |
| Only messages at regular intervals | El nodo change guarda el último valor en el contexto y el nodo inject lo lee a intervalos regulares. | Es útil cuando necesitas el último valor a intervalos regulares, independientemente de cuándo lo envíe el nodo de entrada. |
Descripción de todos los nodos de entrada y salida de Victron: nodos Victron en Node-RED.
Qué debes tener en cuenta
- Contexto tras un reinicio. Para conservar el contexto tras un reinicio, Victron describe en sus FAQ el archivo
/data/home/nodered/.node-red/settings-user.jscon el ajustecontextStorage(módulolocalfilesystem, guardado cada 300 s, es decir, cada 5 minutos). Si este es el almacén de contexto predeterminado, el código de la función funciona sin cambios. Victron advierte de que no se debe guardar con demasiada frecuencia, ya que desgasta la memoria flash. - Modo seguro. Si, tras modificar los flujos, el GX se sobrecarga o funciona mal, activa Node-RED en modo seguro (safe mode) desde el menú del GX. Node-RED arrancará sin ejecutar los flujos; podrás corregirlos y se ejecutarán al pulsar Deploy.
- Reinicio de Node-RED. Desde el menú del GX: desactiva y vuelve a activar Node-RED en Venus OS Large Features → Node-RED.
- Hora en los flujos. En los ejemplos controlados por horario, como el del generador a las 18.00, Node-RED utiliza la zona horaria configurada en Remote Console. Tras cambiarla, debes reiniciar Node-RED.
Un flujo de Node-RED no sustituye al BMS, los fusibles ni los interruptores: al reiniciar el GX o si se produce un error en el flujo, el relé puede quedar en un estado inesperado. El circuito conectado al relé debe ser seguro en ambos estados. Victron no ofrece soporte para instalaciones que utilizan Node-RED en soluciones avanzadas.
Equipos afectados
Fuentes
- Venus OS Large image: Signal K and Node-RED — caps. 2, 5.4 y 5.7, FAQ Q4, Q5, Q9 y Q11victronenergy.com · EN
- Manual del Cerbo GX — configuración, Settings → Integrations → Relaysvictronenergy.com · EN
- node-red-contrib-victron — Input nodes (Battery, /Soc)github.com · EN
- node-red-contrib-victron — Output nodes (Relay, /Relay/{relay}/State)github.com · EN
- node-red-contrib-victron — Example Flowsgithub.com · EN
Más: Node-RED en Cerbo GX — todos los artículos · primera puesta en marcha · nodos Victron · Cerbo GX
