Chauffe-eau : Grafana « Le chauffe-eau », historisation (compteur rattrape depuis le 14/08), jour faible = aussi surplus solaire reel et securite douche de 20 h

This commit is contained in:
Tallagrand Thierry
2026-10-07 07:25:41 +02:00
parent c9e0e4bb5a
commit 36c2fb713a
10 changed files with 654 additions and 12 deletions

View File

@@ -269,8 +269,15 @@ if (!forceOffNow && !restoreNow && forcedOffByAdvisorPrev && waterHeaterSwitchOn
// comportement d'avant revient, jamais un ballon froid par panne de capteur).
// Jour normal : le chauffe-eau coupe par cette regle est remis sous tension.
const ECS_EAU_FROIDE_KWH = 1.5;
// Douches a 06:00 et 20:00 tous les jours (proprietaire, 07/10) : couper toute
// la journee laisserait l'eau froide a 20 h. Un jour faible, il chauffe donc
// AUSSI sur un vrai surplus solaire (jamais sur la batterie), et a partir de
// 16 h s'il n'a presque pas chauffe depuis 07:24 (securite de la douche du soir).
const ECS_SOIR_DEBUT_H = 16;
const ECS_SOIR_FIN_H = 20;
const {
ecsNuit = false, hcSessionCommitted = false, ecs24hKwh = NaN, offJourFaiblePrev = false,
ecsNuit = false, hcSessionCommitted = false, ecs24hKwh = NaN, ecsJourKwh = NaN,
offJourFaiblePrev = false, pvPowerW = 0, autoPowerW = 1200,
} = normalized;
let offJourFaible = false;
let jourFaibleState = 'none';
@@ -278,11 +285,21 @@ if (advisorEnabled && ecsNuit) {
const energieConnue = Number.isFinite(ecs24hKwh);
const eauFroide = energieConnue && ecs24hKwh < ECS_EAU_FROIDE_KWH;
const heuresCreusesEdf = hcSessionCommitted && gridIsOn;
const veutChauffer = !energieConnue || heuresCreusesEdf || eauFroide;
// Surplus reel : sous tension, la production couvre la maison (chauffe-eau
// compris) ; hors tension, il reste de quoi l'alimenter. Reseau ouvert.
const solaireCouvre = !gridIsOn && (waterHeaterSwitchOn
? pvPowerW >= houseAcPowerW
: pvPowerW - houseAcPowerW >= autoPowerW);
const heure = Number.isFinite(now.hour) ? now.hour : -1;
const securiteSoir = heure >= ECS_SOIR_DEBUT_H && heure < ECS_SOIR_FIN_H
&& !(Number.isFinite(ecsJourKwh) && ecsJourKwh >= ECS_EAU_FROIDE_KWH);
const veutChauffer = !energieConnue || heuresCreusesEdf || eauFroide || solaireCouvre || securiteSoir;
offJourFaible = true;
jourFaibleState = !energieConnue ? 'jour_faible_energie_illisible'
: heuresCreusesEdf ? 'jour_faible_chauffe_hc_edf'
: eauFroide ? 'jour_faible_eau_froide'
: securiteSoir ? 'jour_faible_securite_soir'
: solaireCouvre ? 'jour_faible_surplus_solaire'
: 'jour_faible_coupe';
if (veutChauffer !== waterHeaterSwitchOn) {
powerSwitchAction = veutChauffer ? 'turn_on' : 'turn_off';
@@ -299,6 +316,8 @@ if (advisorEnabled && ecsNuit) {
jourFaibleState === 'jour_faible_chauffe_hc_edf' ? 'Jour faible : eau chaude en heures creuses sur EDF (session reseau engagee)'
: jourFaibleState === 'jour_faible_eau_froide' ? `Jour faible mais seulement ${round1(ecs24hKwh)} kWh en 24 h : chauffe pour garantir l eau chaude`
: jourFaibleState === 'jour_faible_energie_illisible' ? 'Jour faible, energie 24 h illisible : aucune restriction'
: jourFaibleState === 'jour_faible_securite_soir' ? 'Jour faible : chauffe pour la douche de 20 h (peu chauffe depuis 07:24)'
: jourFaibleState === 'jour_faible_surplus_solaire' ? 'Jour faible : surplus solaire reel, il chauffe sans toucher la batterie'
: 'Jour faible : chauffe-eau coupe, il chauffera en heures creuses sur EDF'
);
} else if (advisorEnabled && offJourFaiblePrev && !waterHeaterSwitchOn) {

View File

@@ -31,6 +31,7 @@
"ecs_nuit_jour": states("input_text.evcs_balance_ecs_nuit_jour"),
"hc_session_committed": states("input_boolean.victron_evcs_night_grid_session_committed"),
"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"),
"advisor_enabled": states("input_boolean.victron_water_heater_advisor_enabled"),

View File

@@ -195,6 +195,7 @@ const lastSignature = cleanStateText(input.last_signature);
const ecsNuit = low(input.ecs_nuit) === 'on';
const hcSessionCommitted = low(input.hc_session_committed) === 'on';
const ecs24hKwh = num(input.ecs_24h_kwh, NaN);
const ecsJourKwh = num(input.ecs_jour_kwh, NaN);
const offJourFaiblePrev = low(input.off_jour_faible_prev) === 'on';
const forecastSource = cleanStateText(input.forecast_source) || 'forecast_solar';
@@ -243,6 +244,7 @@ return [{
ecsNuit,
hcSessionCommitted,
ecs24hKwh,
ecsJourKwh,
offJourFaiblePrev,
forecastSource
}