Vehicule branche a midi : JEEP, VW et moto ZERO (calendrier, capacite et puissance par vehicule)
ZERO ajoutee au selecteur avec son heure de depart (P9). Le bilan lit la capacite et la puissance de charge mesurees du vehicule selectionne ; 0 = inconnue (regle muette / pas de borne). Bilan 64/64, golden 123/123. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uJ47NxgfpGnuuMr3f2n7Z
This commit is contained in:
@@ -349,7 +349,7 @@ const typical = coverage(slotsP50, hcFloorTypicalPct);
|
||||
const prudent = coverage(slotsP80, hcFloorPrudentPct);
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// VOITURE BRANCHEE EN HC AVEC UN DEPART AVANT LA PROCHAINE HC (28/09/2026)
|
||||
// VEHICULE BRANCHE EN HC AVEC UN DEPART AVANT LA PROCHAINE HC (28/09/2026)
|
||||
//
|
||||
// Regle du proprietaire : « JEEP branchee engage le reseau en HC midi si
|
||||
// l'analyse de production le justifie ». La JEEP repart a 15:30 certains jours
|
||||
@@ -369,14 +369,17 @@ const prudent = coverage(slotsP80, hcFloorPrudentPct);
|
||||
// moins ce que la borne a deja delivre depuis la saisie. Aucun capteur ne donne
|
||||
// le niveau de la voiture : sans saisie valable, la regle se tait.
|
||||
//
|
||||
// Deux constantes, justifiees :
|
||||
// - 3,7 kW : plateau MESURE des deux vehicules du foyer (3 655 et 3 680 W a
|
||||
// consigne pleine, MANUEL §0) ; au-dela la voiture n'absorbe rien de plus.
|
||||
// - 0,5 kWh : seuil de manque en dessous duquel une session ne se justifie
|
||||
// pas — une fermeture du contacteur coute 50 a 150 Wh de transitoire (§57),
|
||||
// on exige un gain d'au moins trois fois ce cout.
|
||||
const VEHICLE_CHARGER_KW = 3.7;
|
||||
// Vaut pour les TROIS vehicules (JEEP, VW, moto ZERO) : capacite, puissance de
|
||||
// charge et calendrier viennent de HA pour le vehicule selectionne.
|
||||
// La puissance du chargeur EMBARQUE (plateau mesure : JEEP 3,66 kW, VW
|
||||
// 3,68 kW) borne ce que le vehicule peut prendre avant son depart ; inconnue
|
||||
// (0), on ne borne pas — l'erreur va alors vers « reseau justifie », c'est-a-
|
||||
// dire vers le vehicule charge, jamais vers la batterie videe.
|
||||
// Seuil de 0,5 kWh : en dessous une session ne se justifie pas — une fermeture
|
||||
// du contacteur coute 50 a 150 Wh de transitoire (§57), on exige un gain d'au
|
||||
// moins trois fois ce cout.
|
||||
const VEHICLE_GRID_MIN_SHORTFALL_KWH = 0.5;
|
||||
const vehicleChargerKw = num(input.vehicle_charger_kw, NaN);
|
||||
const nowMsBalance = num(input.nowMs, Date.now());
|
||||
const vehicleConnected = input.vehicle_connected === true || input.vehicle_connected === 'true';
|
||||
const vehicleDepartureMs = num(input.vehicle_departure_ms, NaN);
|
||||
@@ -414,7 +417,9 @@ if (vehicleRuleActive) {
|
||||
? energyBetweenSoc(plancherDepart, socPct)
|
||||
: -energyBetweenSoc(socPct, plancherDepart);
|
||||
vehicleSolarKwh = Math.max(0, batterieAuDessusKwh + netKwh);
|
||||
vehicleReachableKwh = Math.min(vehicleNeedKwh, VEHICLE_CHARGER_KW * (vehicleDepartureMs - nowMsBalance) / 3600000);
|
||||
vehicleReachableKwh = Number.isFinite(vehicleChargerKw) && vehicleChargerKw > 0
|
||||
? Math.min(vehicleNeedKwh, vehicleChargerKw * (vehicleDepartureMs - nowMsBalance) / 3600000)
|
||||
: vehicleNeedKwh;
|
||||
vehicleShortfallKwh = Math.max(0, vehicleReachableKwh - vehicleSolarKwh);
|
||||
}
|
||||
const vehicleGridNeeded = vehicleRuleActive && vehicleShortfallKwh > VEHICLE_GRID_MIN_SHORTFALL_KWH;
|
||||
|
||||
@@ -20,20 +20,24 @@
|
||||
{%- if w[0] >= repere and ns.suivant == '' -%}{%- set ns.suivant = w[0] -%}{%- endif -%}
|
||||
{%- if w[0] >= repere and w[2] == 'nuit' and ns.nuit == '' -%}{%- set ns.nuit = w[0] -%}{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{#- Voiture branchee a midi (28/09/2026). Le calendrier (jours et heure de
|
||||
depart de la JEEP apres le dejeuner) reste dans HA : le bilan recoit un
|
||||
instant de depart, vide si la voiture ne repart pas aujourd'hui. Le niveau
|
||||
saisi n'est retenu que s'il date de ce branchement (tolerance 1 h avant). -#}
|
||||
{%- set vh = namespace(dep='', valide=false, cap=none) -%}
|
||||
{#- Vehicule branche a midi (28/09/2026) — JEEP, VW ou ZERO, selon le
|
||||
selecteur. Pour chacun, HA porte le calendrier (jours et heure de depart
|
||||
apres le dejeuner), la capacite et la puissance de charge MESUREES ; le
|
||||
bilan recoit un instant de depart, vide si le vehicule ne repart pas
|
||||
aujourd'hui. Le niveau saisi n'est retenu que s'il date de ce branchement
|
||||
(tolerance 1 h avant). Capacite ou puissance a 0 = inconnue. -#}
|
||||
{%- set vh = namespace(dep='', valide=false, cap=none, kw=none) -%}
|
||||
{%- set jours = ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'] -%}
|
||||
{%- if is_state('input_select.victron_evcs_vehicle', 'JEEP') -%}
|
||||
{%- set vh.cap = states('input_number.victron_evcs_capacity_jeep_kwh') -%}
|
||||
{%- if jours[now().weekday()] in states('input_text.victron_evcs_jeep_midday_departure_days') | lower -%}
|
||||
{%- set d = today_at(states('input_datetime.victron_evcs_jeep_midday_departure')) -%}
|
||||
{%- set cle = {'JEEP': 'jeep', 'VW': 'vw', 'ZERO': 'zero'}.get(states('input_select.victron_evcs_vehicle')) -%}
|
||||
{%- if cle -%}
|
||||
{%- set vh.cap = states('input_number.victron_evcs_capacity_' ~ cle ~ '_kwh') -%}
|
||||
{%- set vh.kw = states('input_number.victron_evcs_charger_kw_' ~ cle) -%}
|
||||
{%- set heure = states('input_datetime.victron_evcs_' ~ cle ~ '_midday_departure') -%}
|
||||
{%- if jours[now().weekday()] in states('input_text.victron_evcs_' ~ cle ~ '_midday_departure_days') | lower
|
||||
and heure not in ['unknown', 'unavailable', ''] -%}
|
||||
{%- set d = today_at(heure) -%}
|
||||
{%- if d > now() -%}{%- set vh.dep = d -%}{%- endif -%}
|
||||
{%- endif -%}
|
||||
{%- elif is_state('input_select.victron_evcs_vehicle', 'VW') -%}
|
||||
{%- set vh.cap = states('input_number.victron_evcs_capacity_vw_kwh') -%}
|
||||
{%- endif -%}
|
||||
{%- set branche = states.binary_sensor.victron_evcs_vehicle_connected -%}
|
||||
{%- set niveau = states.input_number.victron_evcs_vehicle_level_pct -%}
|
||||
@@ -47,6 +51,7 @@
|
||||
"vehicle_level_pct": states("input_number.victron_evcs_vehicle_level_pct"),
|
||||
"vehicle_level_valid": vh.valide,
|
||||
"vehicle_capacity_kwh": vh.cap,
|
||||
"vehicle_charger_kw": vh.kw,
|
||||
"vehicle_delivered_since_level_kwh": ((states("sensor.evcs_hq2239dnt7p_total_energy") | float(0)) - (states("input_number.victron_evcs_vehicle_level_ref_kwh") | float(0))) if states("sensor.evcs_hq2239dnt7p_total_energy") | is_number else none,
|
||||
"hc_window_end_ms": (as_timestamp(ns.fin) * 1000) if ns.fin != '' else none,
|
||||
"next_hc_start_ms": (as_timestamp(ns.suivant) * 1000) if ns.suivant != '' else none,
|
||||
|
||||
@@ -60,12 +60,13 @@ return [{
|
||||
// Plancher de charge HC manuelle (18/09) : oublie ici jusqu'au 28/09, le
|
||||
// bouton n'avait donc jamais atteint le bilan.
|
||||
manual_hc_floor_percent: snapshot.manual_hc_floor_percent,
|
||||
// Voiture branchee a midi (28/09) : depart du jour et besoin saisi.
|
||||
// Vehicule branche a midi (28/09, JEEP/VW/ZERO) : depart du jour et besoin saisi.
|
||||
vehicle_connected: snapshot.vehicle_connected,
|
||||
vehicle_departure_ms: snapshot.vehicle_departure_ms,
|
||||
vehicle_level_pct: snapshot.vehicle_level_pct,
|
||||
vehicle_level_valid: snapshot.vehicle_level_valid,
|
||||
vehicle_capacity_kwh: snapshot.vehicle_capacity_kwh,
|
||||
vehicle_charger_kw: snapshot.vehicle_charger_kw,
|
||||
vehicle_delivered_since_level_kwh: snapshot.vehicle_delivered_since_level_kwh,
|
||||
hc_window_end_ms: snapshot.hc_window_end_ms,
|
||||
next_hc_start_ms: snapshot.next_hc_start_ms,
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
|
||||
"departure_time": states("input_datetime.victron_evcs_departure_time"),
|
||||
"departure_time_jeep": states("input_datetime.victron_evcs_departure_time_jeep"),
|
||||
"departure_time_zero": states("input_datetime.victron_evcs_departure_time_zero"),
|
||||
"evcs_vehicle": states("input_select.victron_evcs_vehicle"),
|
||||
"allow_grid_departure_urgent": states("input_boolean.victron_evcs_allow_grid_departure_urgent"),
|
||||
"last_start_at": states("input_datetime.victron_evcs_last_start_at"),
|
||||
|
||||
@@ -445,6 +445,8 @@ const params = {
|
||||
// Le sélecteur input_select.victron_evcs_vehicle choisit l'heure de départ
|
||||
// effective : VW = victron_evcs_departure_time (~08:50),
|
||||
// JEEP = victron_evcs_departure_time_jeep (~06:30).
|
||||
// ZERO (moto, 28/09/2026) = victron_evcs_departure_time_zero. Heure absente
|
||||
// ou illisible -> repli sur celle de la VW, comme la JEEP.
|
||||
selectedVehicle: cleanText(input.evcs_vehicle, 'VW'),
|
||||
departureTimeMin:
|
||||
low(input.evcs_vehicle || 'vw') === 'jeep'
|
||||
@@ -452,7 +454,12 @@ const params = {
|
||||
input.departure_time_jeep,
|
||||
parseTimeToMinutes(input.departure_time, null)
|
||||
)
|
||||
: parseTimeToMinutes(input.departure_time, null),
|
||||
: low(input.evcs_vehicle || 'vw') === 'zero'
|
||||
? parseTimeToMinutes(
|
||||
input.departure_time_zero,
|
||||
parseTimeToMinutes(input.departure_time, null)
|
||||
)
|
||||
: parseTimeToMinutes(input.departure_time, null),
|
||||
allowGridDepartureUrgent: low(input.allow_grid_departure_urgent || 'off') === 'on',
|
||||
dayStartTimeMin: parseTimeToMinutes(input.day_start_time, 7 * 60 + 30),
|
||||
dayStopTimeMin: parseTimeToMinutes(input.day_stop_time, 20 * 60 + 30),
|
||||
|
||||
Reference in New Issue
Block a user