Jour faible : session HC midi et nuit engagee pour le chauffe-eau ; alerte « passe en BOOST » si pompe a chaleur en HC ; HANDOFF
This commit is contained in:
@@ -2639,6 +2639,67 @@ export const scenarios = [
|
||||
},
|
||||
expect: { profile: 'midday_hc_or_solar', sessionCommittedService: 'turn_on', takeoverNeeded: true },
|
||||
},
|
||||
// CHAUFFE-EAU (07/10/2026) : un jour faible, l'eau chaude se fait en HC sur
|
||||
// EDF a pleine consommation -> la session HC s'engage meme sans voiture et
|
||||
// sans manque batterie.
|
||||
{
|
||||
id: 'hc-midi-jour-faible-chauffe-eau-engage-la-session',
|
||||
label: 'MIDI — jour faible (decision du bilan), pas de voiture, SOC au-dessus du requis : la session HC s engage pour le chauffe-eau',
|
||||
time: MIDDAY,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'off', evcs_device_connected: 'on',
|
||||
soc_percent: '45', battery_current_a: '2',
|
||||
pv_power_w: '1200', pv_power_10m_avg_w: '1200', pv_trend_w: '0',
|
||||
house_ac_power_w: '900', vebus_ac_out_l1_power_w: '900', evcs_ac_power_w: '0',
|
||||
balance_required_soc: '30', balance_energy_to_cover_kwh: '0', balance_grid_energy_needed_kwh: '0',
|
||||
balance_status: 'ok', balance_last_run: '08/08 12:50',
|
||||
balance_ecs_nuit: 'on',
|
||||
},
|
||||
expect: { profile: 'midday_hc_or_solar', sessionCommittedService: 'turn_on', takeoverNeeded: true },
|
||||
},
|
||||
{
|
||||
id: 'hc-midi-jour-faible-bilan-perime-aucun-engagement',
|
||||
label: 'CONTREFACTUEL — jour faible mais bilan vieux de 2 h : on ne relaie pas une decision perimee',
|
||||
time: MIDDAY,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'off', evcs_device_connected: 'on',
|
||||
soc_percent: '45', battery_current_a: '2',
|
||||
pv_power_w: '1200', pv_power_10m_avg_w: '1200', pv_trend_w: '0',
|
||||
house_ac_power_w: '900', vebus_ac_out_l1_power_w: '900', evcs_ac_power_w: '0',
|
||||
balance_required_soc: '30', balance_energy_to_cover_kwh: '0', balance_grid_energy_needed_kwh: '0',
|
||||
balance_status: 'ok', balance_last_run: '08/08 11:00',
|
||||
balance_ecs_nuit: 'on',
|
||||
},
|
||||
expect: { profile: 'midday_hc_or_solar', takeoverNeeded: false },
|
||||
},
|
||||
{
|
||||
id: 'hc-nuit-jour-faible-chauffe-eau-engage-la-session',
|
||||
label: 'NUIT 03:00 — jour faible, SOC 45 au-dessus du requis 30 : la session de nuit s engage quand meme pour le chauffe-eau',
|
||||
time: '2026-08-08T03:00:00+02:00',
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'off', evcs_device_connected: 'on',
|
||||
soc_percent: '45', battery_current_a: '-3',
|
||||
house_ac_power_w: '700', vebus_ac_out_l1_power_w: '700', evcs_ac_power_w: '0',
|
||||
balance_required_soc: '30', balance_energy_to_cover_kwh: '2.0',
|
||||
balance_status: 'ok', balance_last_run: '08/08 02:58',
|
||||
balance_ecs_nuit: 'on',
|
||||
},
|
||||
expect: { profile: 'night_hc', sessionCommittedService: 'turn_on', takeoverNeeded: true },
|
||||
},
|
||||
{
|
||||
id: 'hc-nuit-jour-normal-aucun-engagement',
|
||||
label: 'CONTREFACTUEL — meme nuit, jour normal : rien ne justifie EDF',
|
||||
time: '2026-08-08T03:00:00+02:00',
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'off', evcs_device_connected: 'on',
|
||||
soc_percent: '45', battery_current_a: '-3',
|
||||
house_ac_power_w: '700', vebus_ac_out_l1_power_w: '700', evcs_ac_power_w: '0',
|
||||
balance_required_soc: '30', balance_energy_to_cover_kwh: '2.0',
|
||||
balance_status: 'ok', balance_last_run: '08/08 02:58',
|
||||
balance_ecs_nuit: 'off',
|
||||
},
|
||||
expect: { profile: 'night_hc', takeoverNeeded: false },
|
||||
},
|
||||
{
|
||||
id: 'hc-midi-jeep-sans-verdict-aucun-engagement',
|
||||
label: 'CONTREFACTUEL — meme midi, le bilan juge le solaire suffisant : aucune session',
|
||||
|
||||
@@ -81,6 +81,28 @@ for (const c of cas) {
|
||||
if (o.observedPowerW === 0 && o.observedRegime === 'off') { ok++; console.log('✅ coupe-zero-watt'); }
|
||||
else { ko++; console.log(`❌ coupe-zero-watt | ${o.observedPowerW} W ${o.observedRegime}`); }
|
||||
}
|
||||
// Alerte BOOST (07/10) : en HC sur EDF, le ballon ne tire que la pompe a chaleur.
|
||||
{
|
||||
const minuit = new Date(new Date().toLocaleDateString('sv-SE', { timeZone: 'Europe/Paris' }) + 'T00:00:00');
|
||||
const nowMin = (() => { const p = new Intl.DateTimeFormat('fr-FR', { timeZone: 'Europe/Paris', hour: '2-digit', minute: '2-digit', hour12: false }).format(new Date()).split(':'); return Number(p[0]) * 60 + Number(p[1]); })();
|
||||
const hm = (m) => { const x = ((m % 1440) + 1440) % 1440; return `${String(Math.floor(x / 60)).padStart(2, '0')}:${String(x % 60).padStart(2, '0')}:00`; };
|
||||
const stamp = new Date(Date.now() - 5 * 60000).toLocaleString('sv-SE', { timeZone: 'Europe/Paris' });
|
||||
const fenetre = { hc_midday_start: hm(nowMin - 30), hc_midday_stop: hm(nowMin + 60), hc_night_start: hm(nowMin + 300), hc_night_stop: hm(nowMin + 600) };
|
||||
const base = { ...BASE, ...fenetre, grid_state: 'on', hc_session_committed: 'on', water_heater_switch: 'on',
|
||||
water_heater_energy_total_kwh: '18.65', energy_total_prev_kwh: '18.60', energy_prev_at: stamp }; // 0,05 kWh / 5 min = 600 W : pompe a chaleur
|
||||
const verif = (nom, snap, attenduAlerte) => {
|
||||
const s = executer({ ...base, ...snap });
|
||||
const a = s.ARBITRATION[0].json.finalDecision.alerteChauffeEau;
|
||||
const ok1 = attenduAlerte ? (a && JSON.parse(a).active === true && JSON.parse(a).message.includes('BOOST')) : a === '';
|
||||
const appel = s.BUILD_ACTIONS.map((x) => x.json).find((c) => c.data?.entity_id === 'input_text.evcs_alerte_chauffe_eau');
|
||||
if (ok1 && appel) { ok++; console.log(`✅ ${nom}`); } else { ko++; console.log(`❌ ${nom} | alerte=${a} appel=${!!appel}`); }
|
||||
};
|
||||
verif('alerte-boost-pompe-a-chaleur-en-hc', {}, true);
|
||||
verif('alerte-boost-resistance-pas-d-alerte', { water_heater_energy_total_kwh: '18.75' }, false);
|
||||
verif('alerte-boost-thermostat-satisfait-pas-d-alerte', { water_heater_energy_total_kwh: '18.60' }, false);
|
||||
verif('alerte-boost-debut-de-fenetre-attente', { hc_midday_start: hm(nowMin - 5) }, false);
|
||||
verif('alerte-boost-edf-ouvert-pas-d-alerte', { grid_state: 'off' }, false);
|
||||
}
|
||||
// Prevision forte = le reste du jour seulement (06/10 : demain fort ne rend plus forte une journee faible).
|
||||
{
|
||||
const s = executer({ ...BASE, ecs_nuit: 'off', today_remaining_kwh: '8', tomorrow_kwh: '30' });
|
||||
|
||||
Reference in New Issue
Block a user