From 66daac29335268e2fe64f93e8252214b80235605 Mon Sep 17 00:00:00 2001 From: Tallagrand Thierry Date: Tue, 15 Sep 2026 04:55:31 +0200 Subject: [PATCH] Cinquante reglages batterie qui disparaissaient au redemarrage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le proprietaire demande d assouplir la garde de decharge souple en bande 40-60, de -12 a -15 A de base — 39 a 49 A appliques sur treize modules, soit 3,5 A par equivalent US2000 et 19 % de ce que le BMS autorise. Son argument : en ete, avec 52 panneaux et une production bridee des midi, garder le parc plein n a aucun sens, et cette nuit a coute 8 kWh de reseau en touchant a peine la batterie. Le reglage aurait ete perdu. Les cinquante helpers de la table de politique batterie portaient un `initial:`, qui DESACTIVE la restauration d etat : chaque redemarrage de Home Assistant les remet a leur valeur d origine, en silence. Et un redemarrage etait prevu le soir meme pour le tableau du moniteur LLM. Meme defaut que les cinq helpers corriges le 06/09 — selecteur de vehicule, toggles de cablage — mais ici sur une table entiere de REGLAGE, donc sur tout ajustement futur et pas seulement celui-ci. Les valeurs par defaut restent dans INPUT_PARSE, qui les applique quand le helper est absent. Rien n est perdu. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj --- packages/victron_evcs_battery_dynamic.yaml | 65 +++++----------------- packages/victron_evcs_night_battery.yaml | 35 ++++++++++++ src/nodes/HA_SNAPSHOT_TEMPLATE.json.tpl | 3 + src/nodes/INPUT_PARSE.js | 7 +++ src/nodes/WINDOWS_SOURCEV2.js | 56 ++++++++++++++++++- 5 files changed, 115 insertions(+), 51 deletions(-) create mode 100755 packages/victron_evcs_night_battery.yaml diff --git a/packages/victron_evcs_battery_dynamic.yaml b/packages/victron_evcs_battery_dynamic.yaml index 6fe28c9..2f53dce 100755 --- a/packages/victron_evcs_battery_dynamic.yaml +++ b/packages/victron_evcs_battery_dynamic.yaml @@ -1,3 +1,18 @@ +# ⚠️ AUCUN `initial:` DANS CE FICHIER, ET C'EST DELIBERE. +# +# Declarer `initial:` DESACTIVE la restauration d'etat : le helper est force a +# cette valeur a CHAQUE demarrage de Home Assistant. Pour une table de REGLAGE, +# c'est un piege — tout ajustement disparait au prochain redemarrage, sans +# message, et on cherche ensuite pourquoi le comportement a change. +# +# Constate le 15/09/2026 : le passage de `batt_discharge_soft_40_60_a` de -12 a +# -15 A, decide pour permettre la charge nuit sur batterie, aurait ete annule +# par le redemarrage prevu le soir meme. Meme defaut que les cinq helpers +# corriges le 06/09 (selecteur de vehicule, toggles de cablage). +# +# Les valeurs par defaut restent dans le CODE (`INPUT_PARSE.js`), qui les +# applique quand le helper est absent ou illisible. Rien n'est perdu. + input_number: # ===================================================== @@ -11,7 +26,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 10 victron_evcs_solar_potential_grace_minutes: name: EVCS Batt - Grâce solaire potentiel @@ -20,7 +34,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 12 victron_evcs_step_up_cooldown_seconds: name: EVCS Batt - Cooldown montée courant @@ -29,7 +42,6 @@ input_number: step: 5 unit_of_measurement: s mode: box - initial: 30 victron_evcs_step_down_cooldown_seconds: name: EVCS Batt - Cooldown baisse courant @@ -38,7 +50,6 @@ input_number: step: 5 unit_of_measurement: s mode: box - initial: 60 victron_evcs_force_mode_auto_revert_minutes: name: EVCS Batt - Retour auto mode forcé @@ -47,7 +58,6 @@ input_number: step: 5 unit_of_measurement: min mode: box - initial: 120 victron_evcs_overload_step_down_a: name: EVCS Batt - Step-down surcharge convertisseur @@ -56,7 +66,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: 2 victron_evcs_overload_hold_seconds: name: EVCS Batt - Maintien avant nouvelle baisse surcharge @@ -65,7 +74,6 @@ input_number: step: 5 unit_of_measurement: s mode: box - initial: 30 victron_evcs_overload_stop_after_seconds: name: EVCS Batt - Arrêt surcharge persistante @@ -74,7 +82,6 @@ input_number: step: 10 unit_of_measurement: s mode: box - initial: 120 # ===================================================== @@ -88,7 +95,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -50 victron_evcs_batt_discharge_hard_gt90_a: name: EVCS Batt >90 - Décharge hard @@ -97,7 +103,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -100 victron_evcs_batt_charge_reserve_gt90_a: name: EVCS Batt >90 - Réserve charge batterie @@ -106,7 +111,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: 5 victron_evcs_batt_soft_tol_gt90_min: name: EVCS Batt >90 - Tolérance soft @@ -115,7 +119,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 12 victron_evcs_batt_hard_tol_gt90_sec: name: EVCS Batt >90 - Tolérance hard @@ -124,7 +127,6 @@ input_number: step: 1 unit_of_measurement: s mode: box - initial: 20 victron_evcs_batt_recovery_gt90_min: name: EVCS Batt >90 - Récupération @@ -133,7 +135,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 6 # ===================================================== @@ -147,7 +148,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -40 victron_evcs_batt_discharge_hard_80_90_a: name: EVCS Batt 80-90 - Décharge hard @@ -156,7 +156,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -80 victron_evcs_batt_charge_reserve_80_90_a: name: EVCS Batt 80-90 - Réserve charge batterie @@ -165,7 +164,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: 10 victron_evcs_batt_soft_tol_80_90_min: name: EVCS Batt 80-90 - Tolérance soft @@ -174,7 +172,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 10 victron_evcs_batt_hard_tol_80_90_sec: name: EVCS Batt 80-90 - Tolérance hard @@ -183,7 +180,6 @@ input_number: step: 1 unit_of_measurement: s mode: box - initial: 20 victron_evcs_batt_recovery_80_90_min: name: EVCS Batt 80-90 - Récupération @@ -192,7 +188,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 6 # ===================================================== @@ -206,7 +201,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -20 victron_evcs_batt_discharge_hard_60_80_a: name: EVCS Batt 60-80 - Décharge hard @@ -215,7 +209,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -50 victron_evcs_batt_charge_reserve_60_80_a: name: EVCS Batt 60-80 - Réserve charge batterie @@ -224,7 +217,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: 40 victron_evcs_batt_soft_tol_60_80_min: name: EVCS Batt 60-80 - Tolérance soft @@ -233,7 +225,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 6 victron_evcs_batt_hard_tol_60_80_sec: name: EVCS Batt 60-80 - Tolérance hard @@ -242,7 +233,6 @@ input_number: step: 1 unit_of_measurement: s mode: box - initial: 15 victron_evcs_batt_recovery_60_80_min: name: EVCS Batt 60-80 - Récupération @@ -251,7 +241,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 8 # ===================================================== @@ -265,7 +254,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -12 victron_evcs_batt_discharge_hard_40_60_a: name: EVCS Batt 40-60 - Décharge hard @@ -274,7 +262,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -30 victron_evcs_batt_charge_reserve_40_60_a: name: EVCS Batt 40-60 - Réserve charge batterie @@ -283,7 +270,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: 70 victron_evcs_batt_soft_tol_40_60_min: name: EVCS Batt 40-60 - Tolérance soft @@ -292,7 +278,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 4 victron_evcs_batt_hard_tol_40_60_sec: name: EVCS Batt 40-60 - Tolérance hard @@ -301,7 +286,6 @@ input_number: step: 1 unit_of_measurement: s mode: box - initial: 10 victron_evcs_batt_recovery_40_60_min: name: EVCS Batt 40-60 - Récupération @@ -310,7 +294,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 10 # ===================================================== @@ -324,7 +307,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -5 victron_evcs_batt_discharge_hard_25_40_a: name: EVCS Batt 25-40 - Décharge hard @@ -333,7 +315,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -15 victron_evcs_batt_charge_reserve_25_40_a: name: EVCS Batt 25-40 - Réserve charge batterie @@ -342,7 +323,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: 110 victron_evcs_batt_soft_tol_25_40_min: name: EVCS Batt 25-40 - Tolérance soft @@ -351,7 +331,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 2 victron_evcs_batt_hard_tol_25_40_sec: name: EVCS Batt 25-40 - Tolérance hard @@ -360,7 +339,6 @@ input_number: step: 1 unit_of_measurement: s mode: box - initial: 5 victron_evcs_batt_recovery_25_40_min: name: EVCS Batt 25-40 - Récupération @@ -369,7 +347,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 12 # ===================================================== @@ -383,7 +360,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -3 victron_evcs_batt_discharge_hard_lt25_a: name: EVCS Batt <25 - Décharge hard @@ -392,7 +368,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: -8 victron_evcs_batt_charge_reserve_lt25_a: name: EVCS Batt <25 - Réserve charge batterie @@ -401,7 +376,6 @@ input_number: step: 1 unit_of_measurement: A mode: box - initial: 150 victron_evcs_batt_soft_tol_lt25_min: name: EVCS Batt <25 - Tolérance soft @@ -410,7 +384,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 1 victron_evcs_batt_hard_tol_lt25_sec: name: EVCS Batt <25 - Tolérance hard @@ -419,7 +392,6 @@ input_number: step: 1 unit_of_measurement: s mode: box - initial: 2 victron_evcs_batt_recovery_lt25_min: name: EVCS Batt <25 - Récupération @@ -428,7 +400,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 15 # ===================================================== @@ -442,7 +413,6 @@ input_number: step: 0.1 unit_of_measurement: V mode: box - initial: 51.3 victron_battery_charge_voltage_hcv_step1_v: name: Batt - Tension HCV palier 1 @@ -451,7 +421,6 @@ input_number: step: 0.1 unit_of_measurement: V mode: box - initial: 51.0 victron_battery_charge_voltage_hcv_step2_v: name: Batt - Tension HCV palier 2 @@ -460,7 +429,6 @@ input_number: step: 0.1 unit_of_measurement: V mode: box - initial: 50.9 victron_battery_charge_voltage_recovery_step_v: name: Batt - Pas de remontée tension @@ -469,7 +437,6 @@ input_number: step: 0.1 unit_of_measurement: V mode: box - initial: 0.1 victron_battery_hcv_hold_minutes: name: Batt - Maintien réduction HCV @@ -478,7 +445,6 @@ input_number: step: 1 unit_of_measurement: min mode: box - initial: 15 input_text: @@ -502,5 +468,4 @@ input_text: name: Victron EVCS Batt - Debut depassement souple min: 0 max: 32 - initial: "" icon: mdi:battery-clock-outline diff --git a/packages/victron_evcs_night_battery.yaml b/packages/victron_evcs_night_battery.yaml new file mode 100755 index 0000000..4936231 --- /dev/null +++ b/packages/victron_evcs_night_battery.yaml @@ -0,0 +1,35 @@ +# Charge nuit du vehicule SUR LA BATTERIE (P12) +# +# Idee du proprietaire, 14/09/2026 au soir : plutot qu'acheter du reseau la nuit +# pour charger la voiture, lui donner le solaire DEJA STOCKE — doucement, a +# courant minimal — et laisser ainsi de la place dans la batterie pour la +# production du lendemain. +# +# Le calcul qui l'a motive, sur la prevision du 15/09 (38,7 kWh, pic a 16 h) : +# VW sur EDF -> batterie 55 % a 9 h -> 10,5 kWh ECRETES +# VW sur batterie -> batterie 38 % a 9 h -> 5,3 kWh ecretes +# + JEEP le matin -> 0,0 kWh ecretes +# Payer du reseau la nuit pour ecreter le solaire le lendemain, c'est perdre +# deux fois. +# +# ⚠️ AUCUN `initial:` — declarer `initial:` DESACTIVE la restauration d'etat. + +input_boolean: + victron_evcs_night_battery_charge: + name: "EVCS — charge nuit sur batterie (P12)" + icon: mdi:battery-charging-low + + # ⚠️ LE VERROU, ET IL N'EST PAS DECORATIF. + # + # Le plancher est `required_soc_prudent`, qui DESCEND pendant la nuit puisqu'il + # reste moins de nuit a couvrir. Le SOC descend aussi. Mesure du 15/09 : + # + # voiture en charge : SOC -7,1 pt/h, plancher -3,7 pt/h -> surplus s'epuise + # voiture arretee : SOC -2,6 pt/h, plancher -3,7 pt/h -> surplus REAPPARAIT + # + # Sans verrou, la charge repartirait des qu'elle s'arrete : cinquieme + # oscillateur du projet, par construction. Une seule passe de surplus par + # session de nuit. + victron_evcs_night_battery_done: + name: "EVCS — surplus batterie de la nuit épuisé" + icon: mdi:battery-off-outline diff --git a/src/nodes/HA_SNAPSHOT_TEMPLATE.json.tpl b/src/nodes/HA_SNAPSHOT_TEMPLATE.json.tpl index 03d2f57..50d083d 100644 --- a/src/nodes/HA_SNAPSHOT_TEMPLATE.json.tpl +++ b/src/nodes/HA_SNAPSHOT_TEMPLATE.json.tpl @@ -142,6 +142,9 @@ "evcs_night_session_start_soc": states("input_text.victron_evcs_night_session_start_soc"), "evcs_night_session_start_at": states("input_text.victron_evcs_night_session_start_at"), + "balance_required_soc_prudent": states("input_number.evcs_balance_required_soc_prudent"), + "night_battery_charge_enabled": states("input_boolean.victron_evcs_night_battery_charge"), + "night_battery_done_prev": states("input_boolean.victron_evcs_night_battery_done"), "balance_required_soc": states("input_number.evcs_balance_required_soc"), "balance_energy_to_cover_kwh": states("input_number.evcs_balance_energy_to_cover_kwh"), "balance_status": states("input_text.evcs_balance_status"), diff --git a/src/nodes/INPUT_PARSE.js b/src/nodes/INPUT_PARSE.js index 8cd62c8..80eb9f0 100644 --- a/src/nodes/INPUT_PARSE.js +++ b/src/nodes/INPUT_PARSE.js @@ -470,6 +470,13 @@ const params = { // BILAN ENERGETIQUE (03/09/2026). Meme format d'horodatage que l'advisor // ("DD/MM HH:mm"), d'ou la reutilisation du parseur. balanceRequiredSocPct: num(input.balance_required_soc, NaN), + // P12 — charge nuit sur batterie. Le plancher est le SOC requis PRUDENT (p80) + // et non le p50 : la marge est mesuree, pas inventee. On descend la voiture + // jusqu'a ce que la batterie n'ait plus que ce qu'il lui faut pour tenir + // jusqu'au croisement PV. + balanceRequiredSocPrudentPct: num(input.balance_required_soc_prudent, NaN), + nightBatteryChargeEnabled: low(input.night_battery_charge_enabled || 'off') === 'on', + nightBatteryDonePrev: low(input.night_battery_done_prev || 'off') === 'on', balanceEnergyToCoverKwh: num(input.balance_energy_to_cover_kwh, NaN), balanceStatusOk: cleanText(input.balance_status).toLowerCase() === 'ok', balanceLastRunMs: parseRunStampToMs(cleanText(input.balance_last_run)), diff --git a/src/nodes/WINDOWS_SOURCEV2.js b/src/nodes/WINDOWS_SOURCEV2.js index 0f0e2b2..42406f7 100644 --- a/src/nodes/WINDOWS_SOURCEV2.js +++ b/src/nodes/WINDOWS_SOURCEV2.js @@ -561,10 +561,61 @@ const nightTakeoverLatched = parsed.soc < NIGHT_TAKEOVER_RELEASE_SOC_PCT && !vehicleChargeCompleted; +// ===================================================== +// P12 — CHARGE NUIT SUR LA BATTERIE (15/09/2026) +// ===================================================== +// Idee du proprietaire : plutot qu'acheter du reseau la nuit pour charger la +// voiture, lui donner le solaire DEJA STOCKE, doucement, et laisser ainsi de la +// place dans la batterie pour la production du lendemain. Payer du reseau la +// nuit pour ecreter le solaire le lendemain, c'est perdre deux fois. +// +// Le mode `battery_assist_night` existe depuis toujours pour exactement ca, et +// il est MORT depuis toujours : il exige `batteryCurrentA >= plancher de +// decharge` (0 A), impossible la nuit puisque la maison tire sur la batterie +// (§11 du HANDOFF, ~ -14 A). On ne cree donc pas un chemin, on rend viable +// celui qui existe — en remplacant un test de COURANT impossible par un test +// d'ENERGIE : rester au-dessus de ce qu'il faut pour tenir jusqu'au croisement. +// +// Le plancher n'est PAS une constante nouvelle : c'est `required_soc_prudent`, +// que le bilan publie deja, en profil p80. La marge est mesuree, pas inventee. +const nightBatterySurplusFloorPct = Math.max( + batteryHardFloorPct, + Number.isFinite(params.balanceRequiredSocPrudentPct) + ? params.balanceRequiredSocPrudentPct + : Infinity, +); + +// ⚠️ LE VERROU, ET IL N'EST PAS DECORATIF. Le plancher DESCEND pendant la nuit +// (il reste moins de nuit a couvrir) et le SOC aussi. Mesure du 15/09 : +// +// voiture en charge : SOC -7,1 pt/h, plancher -3,7 pt/h -> le surplus s'epuise +// voiture arretee : SOC -2,6 pt/h, plancher -3,7 pt/h -> le surplus REVIENT +// +// Sans verrou, la charge repartirait des qu'elle s'arrete : cinquieme +// oscillateur du projet, par construction. UNE SEULE PASSE de surplus par +// session de nuit, comme la recovery batterie depuis le 27/08. +const nightBatterySurplusExhausted = + params.nightBatteryDonePrev || + (nightSessionActive && parsed.soc <= nightBatterySurplusFloorPct); + +const nightBatterySurplusAvailable = + nightSessionActive && + params.nightBatteryChargeEnabled && + balanceMorningTargetApplied && + Number.isFinite(params.balanceRequiredSocPrudentPct) && + !vehicleChargeCompleted && + !nightBatterySurplusExhausted && + parsed.soc > nightBatterySurplusFloorPct; + +// La batterie d'abord, le reseau quand le surplus est epuise. C'est la soupape +// decrite par le proprietaire — « quitte a fermer EDF entre 6h et 7h24 pour +// completer » — et elle devient automatique : l'epuisement du surplus rend +// `nightGridHcPreferred` vrai, donc P7 prend le relais. const nightGridHcPreferred = nightSessionActive && params.allowGridHcNight && - !vehicleChargeCompleted; + !vehicleChargeCompleted && + !nightBatterySurplusAvailable; const batteryAssistAllowed = nightSessionActive && @@ -1041,6 +1092,9 @@ return [{ batteryMorningTargetPct, batteryMorningTargetBasePct, balanceMorningTargetApplied, + nightBatterySurplusFloorPct, + nightBatterySurplusAvailable, + nightBatterySurplusExhausted, nightGridSessionCommitted, nightGridSessionUncovered, balanceTargetAgeMin: