Contents
Intro
Sur mon blog domo.rem81.com, je partage mes projets domotiques pour rendre ma maison plus intelligente et économe. Après avoir présenté le flow « Communs » pour la collecte des données générales, le flow « Batteries » pour la gestion de ma batterie, et le flow « Prévision production solaire » pour estimer ma production PV, je vous présente aujourd’hui un quatrième flow Node-RED, nommé « Calcul du niveau SOC pour la charge programmée ». Ce flow gère la charge programmée (CP) de ma batterie en ajustant dynamiquement le SOC cible et en configurant un planning de charge en fonction de plusieurs paramètres.
Objectif du flow
Ce flow a pour but de gérer la charge programmée de ma batterie via le système ESS (Energy Storage System) de Victron. Il calcule un SOC cible en fonction de la prévision de production solaire, configure un planning de charge (heure de début, durée, et validation), et active la charge uniquement dans des conditions spécifiques, comme les heures creuses (HC) ou un forçage manuel à 100 %. Cela me permet d’optimiser la charge de ma batterie pour minimiser les coûts et maximiser l’utilisation de l’énergie solaire.
Le flow Node-RED
Code json
Vous pouvez copier/coller le fichier .json en Annexe.
Visualisation du flow
Voici une capture d’écran de mon flow « Charge PGM » dans Node-RED, où vous pouvez voir la disposition des nœuds et le flux des données entre eux :

Cette capture montre les sous-flux principaux : la réception des données via MQTT et link in
(SOC, prévision de production, HC/HP, etc.), le calcul du SOC cible (nœud function
nommé « Calcul Cible SOC »), la configuration du planning de charge (nœuds bigtimer
et function
nommé « Convert »), et l’application des paramètres au système Victron (nœuds victron-output-ess
).
Analyse du flow :
- Entrées de données :
- Le SOC de la batterie est reçu depuis le flow « Batteries » via un nœud
link in
et stocké dans une variable de fluxsoc
. - La prévision de production solaire (en kWh) est reçue depuis le flow « Prévision production solaire » via un nœud
link in
et stockée dansprevi_prod
. - Plusieurs paramètres sont reçus via MQTT depuis Home Assistant :
- Heures creuses/pleines (HC/HP) sur le topic
ha/mp2/cp/hc
. - Niveau de forçage pour la charge programmée sur
ha/mp2/cp/niveauforcagecp1
. - Forçage à 100 % sur
ha/mp2/cp/forcage100
(« on » ou « off »). - Validation de la charge programmée (ESS) sur
ha/mp2/cp/validcp
(« on » ou « off »).
- Heures creuses/pleines (HC/HP) sur le topic
- Fenêtre horaire de charge :
- Un nœud
bigtimer
définit une fenêtre horaire de charge de 22h00 à 6h00 tous les jours. Il envoie1
(actif) ou0
(inactif) selon l’heure, stocké dans la variablehorloge
.
- Calcul du SOC cible :
- Un nœud
function
calcule le SOC cible en fonction de la prévision de production (previ_prod
) et d’un forçage éventuel :- Formule de base : SOC cible = 95 – 1.5 * prévision de production (en kWh).
- Si le forçage à 100 % est activé (
forc100 = "on"
), le SOC cible est fixé au niveau de forçage (niveauforcp1
). - Le résultat est arrondi au multiple de 5 le plus proche et limité entre 0 et 100.
- Le SOC cible est publié sur le topic
mp2/batteries/cible_soc
et appliqué au système Victron via un nœudvictron-output-ess
.
- Configuration du planning de charge :
- Un nœud
function
détermine si la charge doit être activée en fonction de plusieurs conditions :- Le SOC actuel (
soc
) est inférieur au SOC cible (seuil_soc
). - La charge programmée est validée (
valid_cp_ess = "on"
). - On est dans la fenêtre horaire (
horloge = 1
). - On est en heures creuses (
hc = "HC.."
).
- Le SOC actuel (
- Si ces conditions sont remplies, la charge est activée (valeur
7
pour « tous les jours ») ; sinon, elle est désactivée (valeur-7
). - L’heure de début et la durée de la charge sont également configurées :
- Par défaut, de 22h00 à 6h00 (8 heures).
- Si forçage à 100 %, ces valeurs sont fixes (22h00 à 6h00).
- Ces paramètres sont appliqués au système Victron via des nœuds
victron-output-ess
sur les chemins/Settings/CGwacs/BatteryLife/Schedule/Charge/0/Day
,/Start
, et/Duration
.
Détails techniques :
- Calcul du SOC cible : Le script suivant ajuste le SOC cible en fonction de la prévision de production :
let prod = flow.get('previ_prod');
const a = 95; // 80 l'été
const b = 1.5;
var state = b * prod;
state = a - state; // SOC cible = 95 - 1.5 * prévision
var y = Math.round(state / 5) * 5; // Arrondi au multiple de 5
if (y < 15) {
y = 0;
}
if (y > 101) {
y = 100;
}
msg.payload = Math.trunc(y);
return [msg];
- Configuration du planning : Le script suivant active ou désactive la charge et configure le planning :
let soc = flow.get('soc');
let seuil = flow.get('seuil_soc');
let havalid = flow.get('valid_cp_ess');
let hc = flow.get('hc');
var horloge = flow.get('horloge');
var valid = { payload: 7 }; // Activer tous les jours
var devalid = { payload: -7 }; // Désactiver
if (soc < seuil && havalid === "on" && horloge === 1 && hc == "HC..") {
return [valid, hdebuts, duree, { payload: "Actif" }];
} else {
return [devalid, hdebuts, duree, { payload: "Inactif" }];
}
- Brokers MQTT : Les données sont publiées et reçues via le broker « MQTTHA » (
192.168.0.37:1883
) pour une intégration avec Home Assistant.
Interactions avec les flows précédents :
Ce flow s’appuie sur les flows précédents pour fonctionner :
- Le flow « Communs » ([lien vers l’article « Communs » sur domo.rem81.com]) fournit des données générales comme l’état du réseau, qui pourraient influencer des automatisations liées à la charge.
- Le flow « Batteries » ([lien vers l’article « Batteries » sur domo.rem81.com]) fournit le SOC actuel de la batterie (
mp2/batteries/soc
), utilisé pour décider si la charge est nécessaire. - Le flow « Prévision production solaire » ([lien vers l’article « Prévision production solaire » sur domo.rem81.com]) fournit la prévision de production (
mp2/prediction/prod_total
), utilisée pour ajuster le SOC cible.
Intégration avec Home Assistant
Ce flow interagit avec Home Assistant via MQTT (broker à 192.168.0.37:1883
) :
- Il reçoit des paramètres comme HC/HP, le forçage à 100 %, et la validation ESS depuis Home Assistant.
- Il publie le SOC cible sur
mp2/batteries/cible_soc
, que je peux afficher dans un tableau de bord pour suivre l’objectif de charge.
Pourquoi Node-RED ?
- Simplicité : Je peux gérer des logiques complexes (calcul du SOC cible, planning de charge) sans écrire de code complexe.
- Flexibilité : Les nœuds Victron et MQTT s’intègrent parfaitement avec Home Assistant et le système ESS.
- Visuel : L’interface de Node-RED me permet de voir clairement le flux des données.
Palettes Utilisées
Pour reproduire ce flow, vous aurez besoin d’installer les palettes suivantes dans Node-RED :
- node-red-contrib-victron : Fournit les nœuds pour interagir avec les systèmes Victron Energy, comme
victron-output-ess
. Installez-la via le gestionnaire de palettes de Node-RED ou avec la commande :
npm install node-red-contrib-victron
- node-red-node-mqtt : Fournit les nœuds MQTT (
mqtt in
,mqtt out
,mqtt-broker
). Cette palette est généralement incluse par défaut dans Node-RED, mais si elle est absente, vous pouvez l’installer avec :
npm install node-red-node-mqtt
- node-red-contrib-bigtimer : Fournit le nœud
bigtimer
pour gérer les fenêtres horaires. Installez-la avec :
npm install node-red-contrib-bigtimer
- Nœuds de base (Core) : Les nœuds comme
inject
,debug
,function
,change
,comment
, etlink in
sont inclus par défaut dans Node-RED.
Note : Assurez-vous que votre instance Node-RED a accès à votre système Victron (via DBus ou MQTT, selon votre configuration) pour que les nœuds Victron fonctionnent correctement.
Conclusion
Ce flow « Calcul du niveau SOC pour la charge programmée » est la dernière brique de mon système de gestion d’énergie solaire avec Victron Energy. Il me permet de charger ma batterie de manière intelligente, en tenant compte de la production solaire prévue, des heures creuses, et de mes préférences manuelles. Combiné aux flows « Communs », « Batteries », et « Prévision production solaire », il offre une solution complète pour surveiller et optimiser mon installation solaire. Si vous avez un système Victron ou utilisez Node-RED, ce projet pourrait vous inspirer. Des questions ou des idées ? Laissez un commentaire sur domo.rem81.com !
Annexe: Code Json
[
{
"id": "252756711fe9b50a",
"type": "function",
"z": "c277166614a46765",
"name": "Convert to MQTT",
"func": "let soc = flow.get('soc')\nlet seuil = flow.get('seuil_soc')\nlet val = flow.get('valid_cp_ess')\nvar horloge = msg.horloge;\n\nvar msg1 = { topic: \"W/c0619ab1db0d/settings/0/Settings/CGwacs/BatteryLife/Schedule/Charge/0/Day\", payload: { \"value\": 7 } };\nvar msg2 = { topic: \"W/c0619ab1db0d/settings/0/Settings/CGwacs/BatteryLife/Schedule/Charge/0/Day\", payload: { \"value\": -7 } };\nif (soc < seuil && val===\"on\" && horloge === \"1\" ) {\n return [msg1];\n} else {\n return [msg2];\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 630,
"y": 600,
"wires": [
[
"bde25226922e506d"
]
]
}
]