P11-bis : second signal de fraicheur de session, independant du charging_time borne
Incident du 19/09 : VW debranchee ~14:50, JEEP branchee, mais le swap n'a dure que 14 s. La borne a GELE son etat (charging_time reste a 1h25, jamais reinitialise) → P11 (base uniquement sur charging_time <= 90s) restait aveugle → le collant 'vehicule plein' de la VW bloquait la JEEP, qui n'a pas charge de l'apres-midi. Un debranchement FRANC de 30s a tout debloque (borne reset). Le last_changed du capteur de connexion, lui, a bien bouge sur le swap de 14 s (14:54:17). C'etait l'info qui manquait : personne ne la lisait. sessionFresh gagne donc un SECOND terme, l'age du dernier (re)branchement, meme fenetre 90s, independant de la borne : - gabarit : evcs_vehicle_connected_ts (as_timestamp du last_changed, patron acin1_last_changed_ts §29) ; - INPUT_PARSE : evcsVehicleConnectedAgeSec (Infinity si absent => repli sur) ; - WINDOWS : sessionFresh = charging_time bas OU reconnexion recente. Golden 113 -> 115 : p11bis-swap-rapide-borne-figee (charging_time fige 1h25 + reconnexion 30s -> retest) et son contrefactuel reconnexion-vieille (2h -> reste collant). Gabarit rendu contre HA : 202 champs, aucun null. Mutation deux sens : retrait du signal -> le swap tombe ; fenetre infinie -> l'etablie tombe. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
@@ -38,6 +38,7 @@
|
|||||||
"evcs_current_a": states("sensor.victron_evcs_current"),
|
"evcs_current_a": states("sensor.victron_evcs_current"),
|
||||||
"evcs_ac_power_w": states("sensor.victron_evcs_ac_power"),
|
"evcs_ac_power_w": states("sensor.victron_evcs_ac_power"),
|
||||||
"evcs_charging_time": states("sensor.victron_evcs_charging_time"),
|
"evcs_charging_time": states("sensor.victron_evcs_charging_time"),
|
||||||
|
"evcs_vehicle_connected_ts": as_timestamp(states.binary_sensor.victron_evcs_vehicle_connected.last_changed, 0) if states.binary_sensor.victron_evcs_vehicle_connected is not none else 0,
|
||||||
"evcs_session_energy_kwh": states("sensor.evcs_hq2239dnt7p_last_session_energy"),
|
"evcs_session_energy_kwh": states("sensor.evcs_hq2239dnt7p_last_session_energy"),
|
||||||
"evcs_charging_switch": states("switch.victron_evcs_charging"),
|
"evcs_charging_switch": states("switch.victron_evcs_charging"),
|
||||||
"evcs_auto_start_switch": states("switch.victron_evcs_auto_start"),
|
"evcs_auto_start_switch": states("switch.victron_evcs_auto_start"),
|
||||||
|
|||||||
@@ -340,6 +340,17 @@ const parsed = {
|
|||||||
|
|
||||||
evcsAcPowerW: Math.max(0, num(input.evcs_ac_power_w, 0)),
|
evcsAcPowerW: Math.max(0, num(input.evcs_ac_power_w, 0)),
|
||||||
evcsChargingTimeSec: parseChargingTimeToSec(input.evcs_charging_time),
|
evcsChargingTimeSec: parseChargingTimeToSec(input.evcs_charging_time),
|
||||||
|
// P11-bis (19/09/2026) : age, en secondes, du dernier changement du
|
||||||
|
// capteur de connexion. C'est le SECOND signal de fraicheur, independant
|
||||||
|
// du charging_time de la borne — qui gele sur un swap trop rapide (14 s
|
||||||
|
// le 19/09) et laisse alors P11 aveugle. last_changed du binary_sensor,
|
||||||
|
// lui, bouge sur ce meme swap. Horodatage absent/nul => age infini =>
|
||||||
|
// aucun effet, comportement historique (on ne devine pas un branchement).
|
||||||
|
evcsVehicleConnectedAgeSec: (() => {
|
||||||
|
const ts = num(input.evcs_vehicle_connected_ts, 0);
|
||||||
|
if (!(ts > 0)) return Number.POSITIVE_INFINITY;
|
||||||
|
return Math.max(0, (nowMs / 1000) - ts);
|
||||||
|
})(),
|
||||||
// Energie deja livree par la session EN COURS (kWh). Le capteur de la borne
|
// Energie deja livree par la session EN COURS (kWh). Le capteur de la borne
|
||||||
// s'appelle "last_session_energy" mais il suit la session courante et repart
|
// s'appelle "last_session_energy" mais il suit la session courante et repart
|
||||||
// de zero a chaque nouvelle connexion (verifie le 07/09/2026 : 0 -> 0,1 -> 0,2
|
// de zero a chaque nouvelle connexion (verifie le 07/09/2026 : 0 -> 0,1 -> 0,2
|
||||||
|
|||||||
@@ -419,10 +419,23 @@ const prevSurplusState = (input.prev_surplus_state ?? '').toString().trim().toLo
|
|||||||
// nouvelle connexion physique. Sous ~90 s → session neuve → on neutralise le
|
// nouvelle connexion physique. Sous ~90 s → session neuve → on neutralise le
|
||||||
// collant pour laisser le système RETESTER le véhicule fraîchement branché.
|
// collant pour laisser le système RETESTER le véhicule fraîchement branché.
|
||||||
const P11_FRESH_SESSION_MAX_SEC = 90;
|
const P11_FRESH_SESSION_MAX_SEC = 90;
|
||||||
|
// P11-bis (19/09/2026) : le charging_time de la borne repart de 0 sur un
|
||||||
|
// debranchement FRANC, mais reste FIGE sur un swap trop rapide (14 s le 19/09 :
|
||||||
|
// VW debranchee, JEEP branchee, borne gelee a l'etat VW). P11 restait alors
|
||||||
|
// aveugle et le collant "vehicule plein" de la VW bloquait la JEEP. Le
|
||||||
|
// last_changed du capteur de connexion, lui, a bien bouge sur ce swap : c'est
|
||||||
|
// un SECOND signal de fraicheur, independant de la borne. Meme fenetre (90 s =
|
||||||
|
// 3 cycles de 30 s, assez pour capter un (re)branchement entre deux cycles).
|
||||||
|
// Cout d'un faux positif (glitch MQTT sub-seconde) : au pire un retest, que le
|
||||||
|
// statut 3 / VDF re-latche aussitot si le vehicule est vraiment plein.
|
||||||
const sessionFresh =
|
const sessionFresh =
|
||||||
parsed.evcsVehicleConnected &&
|
parsed.evcsVehicleConnected &&
|
||||||
Number.isFinite(parsed.evcsChargingTimeSec) &&
|
(
|
||||||
parsed.evcsChargingTimeSec <= P11_FRESH_SESSION_MAX_SEC;
|
(Number.isFinite(parsed.evcsChargingTimeSec) &&
|
||||||
|
parsed.evcsChargingTimeSec <= P11_FRESH_SESSION_MAX_SEC) ||
|
||||||
|
(Number.isFinite(parsed.evcsVehicleConnectedAgeSec) &&
|
||||||
|
parsed.evcsVehicleConnectedAgeSec <= P11_FRESH_SESSION_MAX_SEC)
|
||||||
|
);
|
||||||
|
|
||||||
// Fix D (08/08/2026) : le statut natif EVCS "charged" (3) vaut aussi fin de
|
// Fix D (08/08/2026) : le statut natif EVCS "charged" (3) vaut aussi fin de
|
||||||
// charge, sans attendre le VehicleDemandFilter (désarmé si la session a été
|
// charge, sans attendre le VehicleDemandFilter (désarmé si la session a été
|
||||||
|
|||||||
@@ -558,6 +558,60 @@ export const scenarios = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// ============ P11-bis : SWAP RAPIDE, BORNE FIGEE (19/09/2026) ============
|
||||||
|
// Incident du 19/09 : VW debranchee ~14:50, JEEP branchee, mais le swap n'a
|
||||||
|
// dure que 14 s → la borne a GELE son etat (charging_time reste a 1h25, status
|
||||||
|
// fige). P11 (base sur charging_time <= 90s) restait aveugle → le collant VW
|
||||||
|
// bloquait la JEEP. Le last_changed du capteur de connexion, lui, a bouge :
|
||||||
|
// c'est le second signal de fraicheur.
|
||||||
|
{
|
||||||
|
id: 'p11bis-swap-rapide-borne-figee',
|
||||||
|
label: 'Jour PV fort, prev=day_vehicle_full_idle, charging_time FIGE 1h25 MAIS reconnexion il y a 30 s → retest (second signal)',
|
||||||
|
time: MORNING,
|
||||||
|
overrides: {
|
||||||
|
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||||
|
soc_percent: '60', pv_power_w: '4500', pv_power_10m_avg_w: '4200',
|
||||||
|
pv_trend_w: '100', battery_current_a: '10',
|
||||||
|
house_ac_power_w: '900', vebus_ac_out_l1_power_w: '900',
|
||||||
|
evcs_status_raw: '1',
|
||||||
|
prev_surplus_state: 'day_vehicle_full_idle',
|
||||||
|
// la borne n'a PAS reinitialise : charging_time fige haut
|
||||||
|
evcs_charging_time: '1h 25m',
|
||||||
|
// mais la connexion a change il y a 30 s (le swap rapide)
|
||||||
|
evcs_vehicle_connected_ts: String(MORNING_TS - 30),
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
profile: 'morning_solar',
|
||||||
|
sourceMode: 'solar_only',
|
||||||
|
state: 'start_min_current',
|
||||||
|
decision: 'start',
|
||||||
|
desiredCharging: true,
|
||||||
|
currentA: 6,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'p11bis-session-etablie-reconnexion-vieille',
|
||||||
|
label: 'CONTREFACTUEL : charging_time 1h25 ET reconnexion il y a 2h → PAS frais → reste collant (pas de reset abusif)',
|
||||||
|
time: MORNING,
|
||||||
|
overrides: {
|
||||||
|
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||||
|
soc_percent: '60', pv_power_w: '4500', pv_power_10m_avg_w: '4200',
|
||||||
|
pv_trend_w: '100', battery_current_a: '10',
|
||||||
|
house_ac_power_w: '900', vebus_ac_out_l1_power_w: '900',
|
||||||
|
evcs_status_raw: '1',
|
||||||
|
prev_surplus_state: 'day_vehicle_full_idle',
|
||||||
|
evcs_charging_time: '1h 25m',
|
||||||
|
evcs_vehicle_connected_ts: String(MORNING_TS - 7200),
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
profile: 'morning_solar',
|
||||||
|
sourceMode: 'blocked',
|
||||||
|
state: 'day_vehicle_full_idle',
|
||||||
|
decision: 'hold',
|
||||||
|
desiredCharging: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
// ================= FIN DE CHARGE NUIT (P8) =================
|
// ================= FIN DE CHARGE NUIT (P8) =================
|
||||||
{
|
{
|
||||||
id: 'night-vw-pleine-transition',
|
id: 'night-vw-pleine-transition',
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user