Než začnete
- Zapnutý Node-RED. Cerbo GX s Venus OS Large a zapnutým Node-RED; editor se otevírá na adrese
https://venus.local:1881. Postup: první spuštění Node-RED. - Monitor baterie viditelný v GX. SoC pochází z monitoru baterie nebo BMS připojeného k GX, např. SmartShunt, BMV nebo Lynx Shunt. Pokud GX nezobrazuje stav nabití, nedostane ho ani Node-RED.
- Relé v ručním režimu. Victron: relé lze ovládat z Node-RED až po přepnutí na ruční ovládání. U relé Cerbo GX: Settings → Integrations → Relays, funkce „Manual“. Ve stejném menu je také polarita relé (normálně rozepnuté nebo normálně sepnuté).

Z Node-RED lze ovládat i další relé, ale každé musíte nejprve přenastavit: u BMV nastavte volbu relé na REM (ve VictronConnect), u Lynx Shunt VE.Can funkci na „Manual control“ (v menu GX), u větších regulátorů MPPT a zařízení řady RS ruční režim (ve VictronConnect). Relé Lynx Smart BMS nelze ovládat z Node-RED. Nelze ovládat ani alarmové relé nebo stykač AC-out 2 v MultiPlus a Quattro.
Chcete spouštět elektrocentrálu? GX má pro tento účel vestavěné automatické spouštění a zastavování elektrocentrály pomocí relé s vlastními podmínkami spuštění (v návodu GX kapitola „Generator auto start/stop“), takže Node-RED není potřeba. Příklad Victron s elektrocentrálou (níže) neovládá relé přímo, ale používá uzel Generator.
Jak tento flow funguje
- Battery (input)Stav nabití z monitoru baterie — při každé změně, bez „only changes“ také každých 5 s.
- hystereze (function)SoC ≤ 30% → 1, SoC ≥ 50% → 0, mezi těmito hodnotami beze změny. Odesílá pouze změnu stavu.
- Relay (output)1 sepne, 0 rozepne relé 1 v Cerbo GX (/Relay/0/State).
- debugV panelu Debug zobrazuje každou hodnotu odeslanou do relé.
Sestavení krok za krokem
- Nová záložka. V editoru Node-RED přidejte novou záložku flow (tlačítko „+“ nad pracovní plochou), aby se příklad nemíchal s ostatními flow.
- Uzel Battery. Ze sekce uzlů Victron v paletě přetáhněte vstupní uzel Battery. V jeho nastavení vyberte svůj monitor baterie a měřenou veličinu „State of charge (%)“. Pole „only changes“ nechte nezaškrtnuté — uzel pak odesílá SoC při každé změně a navíc každých 5 sekund, takže funkce rychle dostane hodnotu i po restartu.
- Uzel function. Přidejte běžný uzel function, pojmenujte ho „hystereze“ a vložte kód ze sekce „Kód hystereze“. Propojte výstup uzlu Battery se vstupem funkce.
- Uzel Relay. Přidejte výstupní uzel Relay, vyberte „Venus device“ a „Venus relay 1 state“ (cesta
/Relay/0/State— číslování v cestě začíná od 0, takže index 0 znamená relé 1). Uzel nastaví hodnotu přijatou vmsg.payload: 0 — Open, 1 — Closed. Připojte k němu výstup funkce. - Uzel debug. K výstupu funkce připojte také uzel debug. Hodnoty uvidíte v panelu Debug na pravé straně editoru a pod uzlem „hystereze“ aktuální SoC a stav relé.
- Deploy a test. Klikněte na Deploy. Abyste nemuseli čekat na vybití baterie, dočasně přidejte uzel inject s číselnou hodnotou (typ „number“, např. 25 a potom 55), připojte ho k funkci a zkontrolujte, zda se relé v menu Relays přepíná. Potom inject odstraňte a znovu klikněte na Deploy.
Kód hystereze
Pokud by se relé mělo zapínat a vypínat při jediném prahu, např. 40%, při kolísání SoC kolem této hodnoty by se přepínalo stále dokola. Hystereze tyto prahy odděluje: relé sepne při 30% nebo méně a rozepne až při 50% nebo více. Mezi těmito hodnotami zůstává v předchozím stavu. Funkce si tento stav pamatuje v kontextu uzlu a odesílá zprávu pouze při změně, takže relé nedostává stejnou hodnotu každých 5 sekund.
// Hystereze: sepněte relé při SoC <= 30 %, rozepněte při SoC >= 50 %.
// Prahy jsou příklady - nastavte vlastní.
const PROG_ZAL = 30;
const PROG_WYL = 50;
const soc = msg.payload;
if (typeof soc !== 'number' || isNaN(soc)) return null; // chybí hodnota: nic nedělejte
const poprzedni = context.get('stan');
let stan = (poprzedni === undefined) ? 0 : poprzedni;
if (soc <= PROG_ZAL) stan = 1; // 1 = Closed
else if (soc >= PROG_WYL) stan = 0; // 0 = Open
// mezi prahy se stav nemění
node.status({fill: stan ? 'green' : 'grey', shape: 'dot',
text: 'SoC ' + soc.toFixed(1) + ' %, relé ' + (stan ? 'sepnuté' : 'rozepnuté')});
if (stan === poprzedni) return null; // odesílejte pouze změnu
context.set('stan', stan);
msg.payload = stan;
return msg;
| SoC | Co funkce dělá | Relé |
|---|---|---|
| 60% | první načtení, 50% nebo více → odešle 0 | rozepnuté |
| 40% | mezi prahy — nic neodesílá | rozepnuté |
| 30% | 30% nebo méně → odešle 1 | sepnuté |
| 45% | mezi prahy — nic neodesílá | sepnuté |
| 50% | 50% nebo více → odešle 0 | rozepnuté |
- Obrácená logika. Chcete při nízkém SoC spotřebič odpojit, a ne zapnout? Zaměňte v kódu 1 a 0 ve dvou řádcích s prahy nebo připojte obvod k druhému kontaktu relé — NC místo NO.
- Chybějící hodnota. Pokud
msg.payloadnení číslo (např. monitor baterie přestal být dostupný), funkce nic neodesílá a relé zůstane v dosavadním stavu. - Po restartu. Kontext uzlu se ve výchozím nastavení ukládá do paměti RAM zařízení GX a při restartu nebo výpadku napájení se ztratí. První načtení po restartu vždy nastaví relé: při SoC mezi prahy na 0 (rozepnuté) — i tehdy, když bylo před restartem sepnuté. Jak zachovat kontext, popisuje sekce „Na co si dát pozor“.
Hotový flow k importu
Stejný flow ve formátu JSON. Uzly Victron jsou sestavené stejně jako v příkladech z dokumentace palety node-red-contrib-victron.
- Zkopírujte celý blok níže včetně závorek
[a]. - Import. V editoru otevřete nabídku (tlačítko v pravém horním rohu) → Import nebo stiskněte Ctrl-I, vložte text a klikněte na Import. Flow se zobrazí na nové kartě „Relé podle SoC“.
- Vyberte svůj monitor baterie. Otevřete uzel „SoC baterie“ a ze seznamu vyberte svůj monitor baterie a „State of charge (%)“.
- Zkontrolujte relé v uzlu „Relé 1 GX“, podle potřeby změňte prahy ve funkci a klikněte na Deploy.
Uzel Battery odkazuje na ukázkový SmartShunt z dokumentace Victron (com.victronenergy.battery/277). Číslo na konci je v každé instalaci jiné — závisí na zařízení a způsobu připojení. Dokud v uzlu nevyberete svůj monitor baterie, funkce neobdrží SoC a relé se nepřepne.
[
{"id":"c24a5c0f10000001","type":"tab","label":"Relé podle SoC","disabled":false,"info":"Hystereze 30/50 % - příklad z 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 (příklad - vyberte svůj)"},"pathObj":{"path":"/Soc","type":"float","name":"State of charge (%)"},"initial":"","name":"SoC baterie","onlyChanges":false,"x":150,"y":120,"wires":[["c24a5c0f10000003"]]},
{"id":"c24a5c0f10000003","type":"function","z":"c24a5c0f10000001","name":"hystereze","func":"// Hystereze: sepněte relé při SoC <= 30 %, rozepněte při SoC >= 50 %.\n// Prahy jsou příklady - nastavte vlastní.\nconst PROG_ZAL = 30;\nconst PROG_WYL = 50;\n\nconst soc = msg.payload;\nif (typeof soc !== 'number' || isNaN(soc)) return null; // chybí hodnota: nic nedělejte\n\nconst poprzedni = context.get('stan');\nlet stan = (poprzedni === undefined) ? 0 : poprzedni;\nif (soc <= PROG_ZAL) stan = 1; // 1 = Closed\nelse if (soc >= PROG_WYL) stan = 0; // 0 = Open\n// mezi prahy se stav nemění\n\nnode.status({fill: stan ? 'green' : 'grey', shape: 'dot',\n text: 'SoC ' + soc.toFixed(1) + ' %, relé ' + (stan ? 'sepnuté' : 'rozepnuté')});\n\nif (stan === poprzedni) return null; // odesílejte pouze změnu\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":"Venus device"},"pathObj":{"path":"/Relay/0/State","type":"enum","name":"Venus relay 1 state","enum":{"0":"Open","1":"Closed"},"writable":true},"initial":"","name":"Relé 1 GX","onlyChanges":true,"x":600,"y":120,"wires":[]},
{"id":"c24a5c0f10000005","type":"debug","z":"c24a5c0f10000001","name":"stav relé","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":610,"y":180,"wires":[]}
]
Vestavěné příklady Victron
Paleta Victron obsahuje vestavěnou knihovnu příkladů: nabídka (pravý horní roh) → Import → Examples → node-red-contrib-victron. Stejné flow jsou také na wiki stránce palety, takže si je můžete prohlédnout bez editoru. Tři z nich jsou tomuto příkladu nejbližší:
| Příklad | Co dělá | Čím se liší od flow na této stránce |
|---|---|---|
| Threshold Control | Výstup se zapne, když vstupní hodnota překročí práh ON, a vypne se, když klesne pod práh OFF. Před každým přepnutím čeká po nastavenou dobu zpoždění (ON/OFF delay). Prahy a ruční ovládání jsou na dashboardu. | Ovládá stejné relé 1 (/Relay/0/State), ale vstupem je napětí baterie z uzlu System (/Dc/Battery/Voltage), nikoli SoC, a navíc používá zpoždění. Vyžaduje další moduly: node-red-dashboard, node-red-contrib-ui-led a node-red-contrib-countdown. |
| Run generator at certain time when SOC is below 50% | Každý den v 18.00 kontroluje uložené SoC. Pokud je nízké, spustí elektrocentrálu na 45 minut: uzel trigger odešle 1 a po 45 minutách 0. SoC se ukládá do kontextu flow.SOC prostřednictvím uzlu change. | Ovládá uzel Generator (Manual Start), nikoli relé. Pozor: popis uvádí „pod 50%“, ale uzel switch v tomto flow kontroluje „menší nebo rovno 50“ (název „Start if SOC is <= 50%“). |
| Only messages at regular intervals | Uzel change ukládá poslední hodnotu do kontextu a uzel inject ji načítá v pravidelných intervalech. | Hodí se, když potřebujete poslední hodnotu v pravidelných intervalech, nezávisle na tom, kdy ji vstupní uzel odesílá. |
Popis všech vstupních a výstupních uzlů Victron: uzly Victron v Node-RED.
Na co si dát pozor
- Kontext po restartu. Aby se kontext zachoval po restartu, Victron v FAQ popisuje soubor
/data/home/nodered/.node-red/settings-user.jss nastavenímcontextStorage(modullocalfilesystem, ukládání každých 300 s, tedy každých 5 minut). Pokud jde o výchozí úložiště kontextu, kód funkce funguje beze změn. Victron upozorňuje, abyste neukládali příliš často, protože se tím opotřebovává paměť flash. - Nouzový režim. Pokud po změnách flow přetěžuje GX nebo nefunguje správně, zapněte Node-RED v menu GX v nouzovém režimu (safe mode). Node-RED se spustí bez spuštění flow, takže je můžete opravit. Spustí se po kliknutí na Deploy.
- Restart Node-RED. V menu GX vypněte a zapněte Node-RED v Venus OS Large Features → Node-RED.
- Čas ve flow. V příkladech řízených časem, např. s elektrocentrálou v 18.00, používá Node-RED časové pásmo nastavené v Remote Console. Po jeho změně je nutné restartovat Node-RED.
Flow v Node-RED nenahrazuje BMS, pojistky ani jističe — při restartu GX nebo chybě ve flow může relé zůstat v neočekávaném stavu. Obvod připojený k relé musí být bezpečný v obou stavech. Victron neposkytuje podporu pro instalace, které používají Node-RED pro pokročilá řešení.
Zařízení, kterých se to týká
Zdroje
- Venus OS Large image: Signal K and Node-RED — kap. 2, 5.4 a 5.7, FAQ Q4, Q5, Q9 a Q11victronenergy.com · EN
- Návod k Cerbo GX — konfigurace, 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
Dále: Node-RED na Cerbo GX — všechny články · první spuštění · uzly Victron · Cerbo GX
