Alerte BOOST : resistance jamais atteinte en HC (AUTO s'arrete sous 65 °C) ; Jeep non identifiee si elle roule apres le branchement ; relecture Uconnect au branchement

This commit is contained in:
Tallagrand Thierry
2026-10-07 12:48:46 +02:00
parent 9094984069
commit 377b87f6d1
7 changed files with 71 additions and 24 deletions

View File

@@ -29,6 +29,7 @@ const normalized = root.normalized ?? {};
const observation = root.observation ?? {};
const energyModel = root.energyModel ?? {};
const baseDecision = root.baseDecision ?? {};
const input = root.input ?? {};
let {
recommendedMode,
@@ -333,29 +334,37 @@ if (advisorEnabled && ecsNuit) {
// ALERTE « PASSE EN BOOST » (07/10/2026, proprietaire)
// =====================================================
// En heures creuses sur EDF, le ballon doit consommer AU MAXIMUM toute la
// fenetre : en AUTO il reste sur la pompe a chaleur (lent, 55 °C) et la douche
// ne sera pas a 65 °C (20 h apres la HC de midi, 06 h apres celle de nuit).
// Si, 15 min apres le debut de la fenetre, session engagee, contacteur ferme et
// ballon sous tension, il ne tire que la puissance de la pompe a chaleur
// (regime hp_low), on le SIGNALE : input_text.evcs_alerte_chauffe_eau (JSON,
// `since` = debut de la fenetre -> un seul message par fenetre, envoye par le
// concierge OpenClaw). 0 W = thermostat satisfait : pas d'alerte.
// fenetre (douches 06:00 et 20:00 a 65 °C). Constat du 07/10 a midi : en AUTO
// il etait ARRETE (0-36 W) alors que l'eau n'etait pas a 65 °C — passe en BOOST
// a 12:35 il est reparti a 1 235 W. AUTO s'arrete plus bas : 0 W ne prouve
// donc PAS une eau chaude. Regle : 15 min apres le debut de la fenetre, session
// engagee, contacteur ferme, ballon sous tension, et la puissance de la
// RESISTANCE jamais atteinte depuis le debut de la fenetre -> on le SIGNALE.
// Memoire de la fenetre (puissance max vue) dans le helper lui-meme ; le
// concierge n'envoie que `active: true`, une fois par `since` (debut de la
// fenetre). Limite assumee : ballon deja a 65 °C en BOOST = 0 W aussi, donc un
// message pour rien au plus par fenetre (aucune temperature dans HA).
const ALERTE_DELAI_MIN = 15;
const seuilResistanceW = ((normalized.greenPowerW ?? 620) + (normalized.autoPowerW ?? 1200)) / 2;
const minNow = Number.isFinite(now.minNow) ? now.minNow : null;
const fenetreHc = (normalized.hcWindows || []).find((w) => minNow !== null && (
w.debut <= w.fin ? (minNow >= w.debut && minNow < w.fin) : (minNow >= w.debut || minNow < w.fin)));
const depuisDebutMin = fenetreHc ? ((minNow - fenetreHc.debut + 1440) % 1440) : null;
const alerteBoost = !!fenetreHc && depuisDebutMin >= ALERTE_DELAI_MIN
&& hcSessionCommitted && gridIsOn && waterHeaterSwitchOn && observedRegime === 'hp_low';
let alerteChauffeEau = '';
if (alerteBoost) {
if (fenetreHc) {
const depuisDebutMin = (minNow - fenetreHc.debut + 1440) % 1440;
const h = String(Math.floor(fenetreHc.debut / 60)).padStart(2, '0') + ':' + String(fenetreHc.debut % 60).padStart(2, '0');
const jourFenetre = (fenetreHc.debut > fenetreHc.fin && minNow < fenetreHc.fin)
? new Date(nowMs - 86400000).toLocaleDateString('sv-SE', { timeZone: 'Europe/Paris' }) : now.date;
const since = `${jourFenetre} ${h}`;
let prev = null;
try { prev = JSON.parse(input.alerte_prev || ''); } catch { prev = null; }
const maxPrev = prev && prev.since === since && Number.isFinite(prev.max_w) ? prev.max_w : 0;
const maxW = Math.round(Math.max(maxPrev, waterHeaterSwitchOn ? observedPowerW : 0));
const active = depuisDebutMin >= ALERTE_DELAI_MIN && hcSessionCommitted && gridIsOn
&& waterHeaterSwitchOn && maxW < seuilResistanceW;
alerteChauffeEau = JSON.stringify({
active: true, since: `${jourFenetre} ${h}`, fenetre: fenetreHc.nom,
puissance_w: Math.round(observedPowerW),
message: `🚿 Heures creuses EDF : le chauffe-eau ne tire que ${Math.round(observedPowerW)} W (pompe a chaleur). Passe-le en BOOST pour avoir 65 °C a ${fenetreHc.douche}.`,
active, since, fenetre: fenetreHc.nom, max_w: maxW, puissance_w: Math.round(observedPowerW),
...(active ? { message: `🚿 Heures creuses EDF : le chauffe-eau ne chauffe pas a pleine puissance (${Math.round(observedPowerW)} W). Si tu n'es pas en BOOST, passe-le pour avoir 65 °C a ${fenetreHc.douche}.` } : {}),
});
}

View File

@@ -33,6 +33,7 @@
"ecs_24h_kwh": states("sensor.evcs_chauffe_eau_24h_kwh"),
"ecs_jour_kwh": states("sensor.evcs_chauffe_eau_jour_kwh"),
"off_jour_faible_prev": states("input_boolean.victron_water_heater_off_jour_faible"),
"alerte_prev": states("input_text.evcs_alerte_chauffe_eau"),
"hc_midday_start": states("input_datetime.victron_evcs_hc_midday_start"),
"hc_midday_stop": states("input_datetime.victron_evcs_hc_midday_stop"),
"hc_night_start": states("input_datetime.victron_evcs_hc_night_start"),