Manuel Utilisateur - Système EVCS Solaire
Document généré le 17/07/2026 — dernière mise à jour le 09/08/2026
(fixes anti-rebond A→F, câblage advisor cible SOC, P9 départ, véhicules VW/JEEP)
Projet: n8n / Home Assistant / EVCS Solaire sans injection réseau
1. Architecture Globale
2. Workflows n8n Actifs
2.1 Gestion Énergie (EVCS + Grid)
| ID |
Nom |
Fréquence |
Fonction |
ATswvGfG4KJUls0K |
HA Snapshot EVCS Surplus Controller V2.6 |
30s |
Pilotage borne EVCS, décision charge solaire/réseau |
7iIlu7LLTW7TZA8o |
Victron - Battery / Grid Hysteresis Fix V1 |
1 min |
Hystérésis réseau EDF (ON ≤20%, OFF ≥30%) |
cTeeHy4ePiVeELLh |
Victron - Auto Charge Manager V1.2 |
30s |
Limites DVCC batterie (MaxChargeCurrent/Voltage) |
2.2 Gestion Charges
| ID |
Nom |
Fréquence |
Fonction |
2NhrfxuGm4pTUNs9 |
SDB Climate & Surplus Manager V2.2 |
1 min |
Pilotage chauffage SDB selon surplus |
FtPVF7byhtu4o6Oh |
Victron - Garage Thermal Surplus Manager V2.2 |
1 min |
Gestion garage thermique |
A11aOb50cGtpJmvn |
Water Heater Advisor V2.3 |
10 min |
Advisor ballon ECS |
yX2j8m04e3pxaoQq |
Water Heater Advisor ECS 6 Nodes + Build + Execute |
10 min |
Pilotage ballon ECS |
YjiNCpEoVhPT8JMw |
Victron - Flexible Load Advisor V1 |
5 min |
Charge flexible |
2.3 Advisor / Monitoring
| ID |
Nom |
Fréquence |
Fonction |
U0nRmdS9Pa0qzpWm |
Victron - PV Surplus Advisor V1 |
15 min |
Advisor surplus PV |
2.4 MCP (Machine Communication Protocol)
| ID |
Nom |
Fonction |
76hHlVYIgt1lEHyR |
MCP - ha.get_state |
Lecture états HA |
eeDmEICJ3ArjwpCt |
MCP - ha.set_helper |
Écriture helpers HA |
uGZAOJjKegRuRNyb |
MCP - grid-set-state |
Pilotage ON/OFF réseau EDF |
a92quWH4pokpIqdn |
MCP - victron-set-charge-limits |
Limites courant/tension batterie |
RVTMdsvR4i8wSc18 |
MCP - pv.get_forecast |
Prévisions Forecast.Solar |
3. Skills opencode
| Skill |
Chemin |
Fonction |
| n8n-code-javascript |
.opencode/skills/n8n-code-javascript/SKILL.md |
Analyse/patch code JS dans nodes n8n |
| n8n-expression-syntax |
.opencode/skills/n8n-expression-syntax/SKILL.md |
Validation syntaxe {{ }} |
| n8n-mcp-tools-expert |
.opencode/skills/n8n-mcp-tools-expert/SKILL.md |
Utilisation outils MCP |
| n8n-node-configuration |
.opencode/skills/n8n-node-configuration/SKILL.md |
Configuration nœuds n8n |
| n8n-validation-expert |
.opencode/skills/n8n-validation-expert/SKILL.md |
Interprétation erreurs validation |
4. MCP - Outils disponibles
4.1 Lecture
4.2 Écriture
-
ha-set-helper : Écrire un helper HA
-
grid-set-state : Piloter le réseau EDF
- Input:
state ('on' ou 'off')
-
victron-set-charge-limits : Limites de charge
- Input:
max_charge_current_a, max_charge_voltage_v
4.3 Workflows n8n
- n8n-mcp : CRUD workflows
- List workflows, get workflow, update workflow, activate/deactivate
5. Dashboards Home Assistant
5.1 Principaux
| Fichier |
Titre |
Description |
evcs_master.yaml |
EVCS Master |
Dashboard principal borne VE |
evcs_mobile.yaml |
EVCS Mobile |
Version mobile |
victron_master.yaml |
Victron Master |
Dashboard principal système Victron |
victron_mobile.yaml |
Victron Mobile |
Version mobile |
5.2 Debug
| Fichier |
Titre |
Description |
big_victron_debug.yaml |
Victron Debug (complet) |
Debug étendu |
victron_debug.yaml |
Victron Debug |
Debug standard |
EVCS_SOLAR.yaml |
EVCS Solar |
Vue solaire EVCS |
5.3 Pilotage
| Fichier |
Titre |
Description |
ECS_PILOTAGE.yaml |
ECS Pilotage |
Pilotage ECS |
ECS_PILOTAGE_PREMIUM.yaml |
ECS Pilotage Premium |
Pilotage ECS avancé |
GARAGE_PREMIUM_PILOTAGE.yaml |
Garage Premium Pilotage |
Pilotage garage |
SDB_PREMIUM_PILOTAGE.yaml |
SDB Premium Pilotage |
Pilotage SDB |
5.4 Debug Premium
| Fichier |
Titre |
Description |
ECS_DEBUG_REGLAGES.yaml |
ECS Debug Réglages |
Debug ECS |
ECS_DEBUG_REGLAGES_PREMIUM.yaml |
ECS Debug Réglages Premium |
Debug ECS avancé |
GARAGE_DEBUG_PREMIUM.yaml |
Garage Debug Premium |
Debug garage |
SDB_DEBUG_PREMIUM.yaml |
SDB Debug Premium |
Debug SDB |
6. Helpers Home Assistant (principaux)
6.1 Configuration EVCS
| Entity ID |
Type |
Description |
input_select.victron_evcs_strategy |
select |
Stratégie (auto_solar_plus, force_grid_now, etc.) |
input_select.victron_evcs_vehicle |
select |
Véhicule branché : VW ou JEEP (09/08/2026, à sélectionner au branchement) |
input_number.victron_evcs_required_energy_kwh |
number |
Énergie demandée (kWh) |
input_boolean.victron_evcs_departure_priority_enabled |
boolean |
Priorité départ |
input_datetime.victron_evcs_departure_time |
datetime |
Heure de départ VW (~08:50) |
input_datetime.victron_evcs_departure_time_jeep |
datetime |
Heure de départ JEEP (~06:30) |
input_boolean.victron_evcs_allow_grid_departure_urgent |
boolean |
P9 : réseau avant départ hors HC (fenêtre 120 min) |
input_boolean.victron_evcs_allow_grid_hc_night |
boolean |
Réseau HC nuit (P7) |
input_boolean.victron_evcs_allow_grid_hc_midday |
boolean |
Réseau HC midi |
input_boolean.victron_evcs_surplus_auto_enabled |
boolean |
Contrôleur surplus actif |
Package : /mnt/ARCH3/docker/HA/packages/victron_evcs_vehicles.yaml (sélecteur,
départ JEEP, toggle P9). NB : input_select.victron_evcs_target_vehicle
(None/Jeep/Zero) est un ancien helper UI non câblé — ne pas l'utiliser.
6.1bis Conseiller IA (advisor)
| Entity ID |
Type |
Description |
input_boolean.evcs_advisor_enabled |
boolean |
Kill-switch : l'advisor tourne (15 min) et écrit ses recommandations |
input_boolean.evcs_advisor_apply_night_target |
boolean |
CÂBLAGE RÉEL : la cible SOC matin suit l'advisor (bornes 22-90, statut ok, fraîcheur ≤ 120 min) |
input_number.evcs_advisor_night_target_soc |
number |
Cible SOC matin recommandée |
input_text.evcs_advisor_strategy / _reason / _status / _divergence / _last_run / _model |
text |
Détail des recommandations (cartes + historique) |
input_number.evcs_advisor_agree_count / _diverge_count |
number |
Compteurs accord/divergence vs réel |
Package : /mnt/ARCH3/docker/HA/packages/evcs_advisor_shadow.yaml.
6.2 État système
| Entity ID |
Type |
Description |
input_text.victron_evcs_operating_mode |
text |
Profil actif |
input_text.victron_evcs_surplus_state |
text |
État interne |
input_text.victron_evcs_surplus_current_decision |
text |
Décision logique |
input_text.victron_evcs_source_mode |
text |
Source autorisée (Solaire/Réseau) |
input_text.victron_evcs_surplus_reason |
text |
Raison courte |
input_text.victron_evcs_last_block_reason |
text |
Dernier blocage |
6.3 Paramètres seuils
| Entity ID |
Type |
Description |
Valeur actuelle |
input_number.victron_evcs_soc_start_min |
number |
Seuil SOC démarrage |
80% |
input_number.victron_evcs_soc_stop_min |
number |
Seuil SOC arrêt |
70% |
input_number.victron_evcs_midday_soc_min |
number |
Seuil SOC midi |
75% |
input_number.victron_evcs_night_target_soc |
number |
Cible SOC nuit |
70% |
input_number.evcs_plafond_courant_edf_on |
number |
Plafond EDF ON |
20A |
input_number.victron_evcs_current_max_auto_a |
number |
Plafond modes auto |
22A |
6.4 Hystérésis réseau
| Entity ID |
Type |
Description |
input_boolean.victron_grid_hysteresis_latch |
boolean |
Latch hystérésis |
input_boolean.victron_evcs_night_session_active |
boolean |
Session nuit active |
input_boolean.victron_evcs_night_grid_takeover_needed |
boolean |
Takeover réseau nuit |
7. Capteurs clés (lecture seule)
| Entity ID |
Description |
sensor.victron_battery_soc |
SOC batterie (%) |
sensor.victron_battery_current |
Courant batterie (A) |
sensor.victron_pv_power_system |
Puissance PV totale (W) |
sensor.victron_consumption_power_l1 |
Consommation maison (W) |
sensor.victron_grid_power_l1 |
Puissance réseau (W) |
sensor.victron_evcs_current |
Courant EVCS réel (A) |
sensor.victron_evcs_set_current |
Consigne lue borne (A) |
sensor.victron_evcs_ac_power |
Puissance EVCS (W) |
sensor.victron_evcs_charging_time |
Durée de charge |
sensor.victron_evcs_statut_fr |
Statut FR borne |
sensor.victron_evcs_mode_fr |
Mode FR borne |
switch.edf_general_ok_switch |
Interrupteur réseau EDF |
binary_sensor.victron_evcs_vehicle_connected |
Véhicule connecté |
binary_sensor.victron_evcs_device_connected |
Borne détectée |
8. Scripts HA
| Script |
Fonction |
script.evcs_boost_edf |
BOOST EDF 28A (plafonds 28A + force_grid_now) |
script.evcs_boost_off |
Retour normal (plafonds 20/22 + auto_solar_plus) |
script.edf_urgence_off |
EDF Urgence OFF (hystérésis OFF + latch OFF + stratégie stop) |
script.edf_force_on |
EDF forcé ON |
script.edf_rendre_la_main |
Rendre la main au système auto |
9. Stratégies de charge
| Stratégie |
Description |
SourceMode |
Conditions |
|
auto_solar_plus |
Solaire uniquement + assistance batterie haute |
solar_only / solar_potential |
SOC ≥ 90% + dette nuageuse faible |
|
auto_solar |
Solaire classique |
solar_only |
- |
|
force_grid_now |
Préservation batterie (remonter à seuil) |
grid_forced / grid_hc_allowed |
Si SOC < 22% → remonter à 35% été / 50% mi-saison / 75% hiver |
|
force_charge_now |
Charge immédiate (solution de secours manuelle) |
solar_only si possible, grid_forced si SOC < 35% |
À la discrétion du conducteur qui doit prendre sa voiture |
|
stop |
Arrêt complet |
- |
- |
|
10. Profils temporels
| Profil |
Horaire |
Description |
morning_solar |
07:30 - 11:00 |
Fenêtre solaire matin |
midday_hc_or_solar |
12:24 - 14:24 |
HC midi ou solaire |
evening_high_soc |
17:00 - 20:30 |
Soir haute priorité SOC |
night_hc |
01:24 - 07:24 |
Heures creuses nuit |
outside_window |
Autres |
Hors fenêtres → Mode probe (sonde) pour relancer le PV si besoin |
11. Logique de décision (DECISION_ENGINEV2)
11.1 Garde-fous (Safety)
- commonSafetyStartOk : Vérifications sécurité au démarrage
- commonSafetyHoldOk : Vérifications sécurité au maintien
- mustStopHard : Arrêt d'urgence (batterie basse, surcharge)
11.2 Conditions de démarrage
| Condition |
Seuil |
Description |
solarStartOk |
SOC ≥ profil + PV ≥ 1000W |
Démarrage solaire |
gridStartOk |
SOC ≤ 35% + réseau dispo |
Démarrage réseau |
batteryAssistSolarStartOk |
SOC ≥ 90% + dette nuageuse faible |
Assistance batterie solaire |
probeStartOk |
Mode probe actif |
Sonde PV |
11.3 Step-up / Step-down
- Step-up : Augmente le courant si PV suffisant ou batterie en charge
- Step-down : Diminue si batterie décharge trop ou dette nuageuse
11.4 Cloud Debt (Dette Nuageuse) & Probe
Problème
Quand les batteries sont pleines (SOC > 90%) et que la maison consomme peu (< 1200W), le MPPT de l'onduleur Victron se bride à la consommation maison uniquement. Le PV visible reste bas tant que l'EVCS ne démarre pas.
Dette Nuageuse
- Définition : La batterie se décharge pour alimenter la maison + VE sans production PV suffisante
- Seuil max : 1.5 kWh
- Durée max : 30 min
- Cette dette doit être "remboursée" par du surplus PV ultérieur
Mode Probe (Sonde)
- Principe : Lancer la borne à 10A pour "provoquer" une production PV qui va s'adapter en quelques secondes
- Courant probe : 10A (augmenté de 6A à 10A)
- Durée probe : 3 minutes
- Retry : 45 minutes si échec
- Activation : En dehors des fenêtres définies (
outside_window) ou lors de passages nuageux
Bypass outside_window
En mode auto_solar_plus ou force_charge_now, le profil outside_window ne bloque plus la charge solaire locale si :
- SOC batterie ≥ 90%
- Forecast solaire fort
- Maison consommation faible
11.5 Logique Heure de départ (Night EVCS + P9)
Objectif
S'assurer que le véhicule est chargé avant l'heure de départ prévue.
Deux véhicules (09/08/2026)
Le sélecteur input_select.victron_evcs_vehicle choisit l'heure de départ
effective — à positionner au branchement (la borne ne détecte pas qui est
branché) :
| Véhicule |
Heure départ (helper) |
Particularité |
| VW (défaut) |
victron_evcs_departure_time (~08:50) |
Ne publie pas franchement "charged" → fin de charge via VDF |
| JEEP |
victron_evcs_departure_time_jeep (~06:30) |
"Charged" franc (statut 3) ; départ DANS la fenêtre HC → logique nuit |
Comportement
| Scénario |
Action |
| Départ pendant la fenêtre HC (JEEP 06:30) |
Logique nuit : P7 + recovery urgent avant départ |
| Départ après la fenêtre HC (VW 08:50) + charge finie |
Rien (veille collante) |
| Départ ≤ 120 min, hors HC, charge NON finie, toggle P9 ON |
grid_hc_allowed → EDF ON → charge jusqu'à fin (VDF/statut) → departure_done_idle collant → EDF coupé immédiatement |
| Toggle P9 OFF |
Comportement historique (attente solaire) |
P9 ne s'impose jamais sur solar_only (solaire réel prioritaire) ni sur
stop / force_*. Pendant P9 le helper takeover est tenu ON (ACM maintient
la batterie, l'hystérésis maintient EDF).
Paramètres
- batteryHardFloorPct : Plancher dur batterie (ex: 22%)
- batteryMorningTargetPct : Objectif SOC matin
- Règles forecast (fort/moyen/faible) — valeurs helpers ;
- OU la recommandation de l'advisor si le toggle
evcs_advisor_apply_night_target est ON (bornes [max(22, hard floor), 90],
statut ok, fraîcheur ≤ 120 min ; trace (ADVISOR) dans la raison) —
câblage réel du 09/08/2026, HANDOFF §20.
- gridTakeoverTriggerPct : Seuil de basculement réseau
- batteryRecoveryUrgent : Si temps restant < temps de charge nécessaire
(utilise l'heure de départ du véhicule sélectionné)
- P9_DEPARTURE_LEAD_MIN : 120 min (constante WINDOWS_SOURCEV2)
11.6 Cycle nuit HC complet — GRAFCET (P7 + P8 + fixes 08-09/08/2026)
Deux automates coordonnés via les helpers HA (night_grid_takeover_needed,
victron_evcs_surplus_state) :
- G1 = contrôleur EVCS V2.6 (boucle 30 s)
- G2 = hystérésis EDF (« Victron - Battery / Grid Hysteresis Fix V1 », 1 min)
États surplus « fin de charge » (aucun ne doit matcher les patterns no-demand
de G2 — full_or_paused / not_requesting_power / charge_complete / no_demand) :
night_session_done_idle : charge finie, recovery batterie possible (EDF
maintenu si SOC < cible)
night_recovery_done_idle : charge finie ET batterie à la cible → EDF
relâché définitivement (anti-rebond)
departure_done_idle : charge finie pendant la fenêtre départ P9 (jour)
→ EDF relâché définitivement
day_vehicle_full_idle (P10) : véhicule plein en journée → plus AUCUNE
tentative (même solaire) jusqu'au débranchement ; héritages bidirectionnels
jour↔nuit ; échappatoires force_charge_now / force_grid_now
Reset du collant "plein" (P11, 12/08/2026) : au CHANGEMENT DE VÉHICULE,
sensor.victron_evcs_charging_time repart de 0 → sessionFresh (≤ 90 s)
neutralise TOUS les collants (night/departure/day) → le nouveau véhicule est
retesté. Remises à zéro : débranchement, session fraîche (P11), ou force_*.
Incidents de référence
- Nuit 07-08/08 (JEEP) : SOC bloqué pile à la cible = point dégénéré →
rebond EDF ~10 min + flapping ACM ; EDF maintenu 25 min après débranchement.
→ Fix A (collant + bande 2 pts), B (snapshot startSOC/At), C (coupure au
débranchement), D (statut charged).
- Nuit 08-09/08 (JEEP) : statut 3 pendant la session armée → branches
source-lost zombies, état collant jamais écrit, statut retombe à l'ouverture
du relais → re-P7 ~30 min. → Fix E (latch en session active) + E2 (coupure
immédiate recovery done).
- Matin 09/08 (VW pleine rebranchée) : micro-charges du véhicule sur
batterie → hard stop ÉCRASAIT l'état collant → re-P7. → Fix F (mémoire
prioritaire sur les gardes, réécrite chaque cycle).
11.7 Conseiller IA — mode ombre et câblages réels
- Workflow
EVCS Advisor Shadow V1 (15 min) : snapshot HA compact → LLM local
(qwen3-vl / qwen3.6-35b sur la Spark, fallback cloud) → validation stricte →
helpers evcs_advisor_* + logbook. N'écrit RIEN d'autre (testé).
- Câblage réel n°1 (09/08/2026) : cible SOC matin
(
evcs_advisor_apply_night_target, cf. §11.5). Garde-fous : statut ok,
fraîcheur ≤ 120 min, bornes, fallback règles, rollback toggle.
- Suivi : carte « Conseiller IA (ombre) » (accords/divergences), historique
des entités
evcs_advisor_*, logbook « EVCS Advisor », executions n8n.
- Prochains candidats (après observation) : stratégie, plafond courant.
12. Configuration opencode.json
13. Méthode de travail
13.1 Source de vérité et déploiement (R2, 07/08/2026)
Le code des nodes du workflow EVCS V2.6 vit dans src/nodes/*.js
(+ HA_SNAPSHOT_TEMPLATE.json.tpl). Le JSON workflows/*.json est un
artefact reconstruit au push.
- JAMAIS d'édition du JSON ou de l'UI n8n (écrasée au prochain push).
- Tests :
node tests/golden/run.mjs (33 scénarios figés, exécute le JSON
buildé → toujours node tools/n8n-build.mjs avant un run manuel).
- Évolution voulue du comportement → mettre à jour
tests/golden/scenarios.mjs dans le même commit.
- Workflow hystérésis (
7iIlu7LLTW7TZA8o) : fichier local
workflows/victron-grid-hysteresis-v1.json, patches rejouables dans
tools/patch-*.mjs, push via n8n-push.mjs (backup auto).
13.2 Lecture d'un workflow n8n (hors EVCS V2.6)
- Utiliser
n8n-mcp_get_workflow avec l'ID
- Le fichier est écrit dans
~/.local/share/opencode/tool-output/tool_*
- Attention : Le fichier commence par "Retrieved workflow: " AVANT le JSON
- Extraction par nœud :
13.3 Modification
- TOUJOURS backup avant modification
- Une seule modification à la fois
- Vérifier avec dry-run
- Valider en production
13.4 Interdiction
- JAMAIS de curl/wget direct vers HA/n8n/Victron
- JAMAIS d'IP/URL/token inventés
- Utiliser les MCP uniquement
14. À compléter par l'utilisateur
Document généré le 17/07/2026 — mis à jour le 09/08/2026 (HANDOFF §17-21 : fixes A→F, advisor, P9, véhicules)