Bilan : la nuit prevue suit la soiree reelle (regression sur 24 nuits), nuage Grafana corrige

Le service publie le facteur nuit prevue / nuit moyenne (sensor.evcs_nuit_maison_prevue_kwh),
le bilan l'applique a son profil de 21:30 a 09:00. Diagnostics 81/81, bilan 68/68.

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:
Tallagrand Thierry
2026-09-28 23:36:08 +02:00
parent fc5b219abf
commit e18158bfd1
14 changed files with 306 additions and 153 deletions

View File

@@ -106,6 +106,9 @@ const SUMMARIZE = {
hcReachActive: o.hcReach ? o.hcReach.active : false,
hcFloorPct: o.hcReach ? o.hcReach.floorPct : null,
hcNightFloorPrudentPct: o.hcReach ? o.hcReach.nightFloorPrudentPct : null,
// Nuit prevue par la soiree (28/09).
nightModelActive: o.nightModel ? o.nightModel.active : false,
nightFactor: o.nightModel ? o.nightModel.factor : null,
// Voiture branchee en HC, depart avant la prochaine HC (28/09).
vehicleActive: o.vehicleMidday ? o.vehicleMidday.active : false,
vehicleNeedKwh: o.vehicleMidday ? o.vehicleMidday.needKwh : null,

View File

@@ -512,4 +512,49 @@ export const balanceScenarios = [
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 30, MIDI_2709, SOMBRE), 0, { vehicle_capacity_kwh: 15, vehicle_charger_kw: 0 }),
expect: { usable: true, vehicleActive: true, vehicleReachableKwh: 15, vehicleGridNeeded: true },
},
// ======== LA NUIT PREVUE PAR LA SOIREE (28/09/2026) ========
// Soir du 28/09 : soiree 6,27 kWh -> facteur 1,092 sur le profil de 21:30 a
// 09:00. Meme snapshot avec et sans facteur : seule la consommation de nuit
// bouge, donc le SOC requis monte.
{
node: 'BALANCE',
id: 'bilan-nuit-soiree-reference-sans-facteur',
label: 'Reference : 23:00, SOC 52, sans facteur de nuit',
snapshot: snap2709('2026-09-27T23:00:00+02:00', 52, null),
expect: { usable: true, nightModelActive: false, nightFactor: 1, energyToCoverKwh: 7.77, requiredSocPct: 47.9 },
},
{
node: 'BALANCE',
id: 'bilan-nuit-soiree-chargee-releve-le-requis',
label: 'Soiree chargee (facteur 1,092) : la nuit est plus lourde, le SOC requis monte',
snapshot: Object.assign(snap2709('2026-09-27T23:00:00+02:00', 52, null), {
night_house_factor: 1.092, night_house_forecast_kwh: '11.59',
night_house_start_ms: Date.parse('2026-09-27T21:30:00+02:00'), night_house_end_ms: Date.parse('2026-09-28T09:00:00+02:00'),
night_house_computed_ms: Date.parse('2026-09-27T22:57:00+02:00') }),
// Verifie a la main : profil 23:00->09:00 = 8,0 kWh, x 0,092 = +0,74 (0,71
// apres l'heure ou le soleil revient) ; +2,4 points = 0,71 / 0,30. Le
// prudent (p80) est deja au-dessus du p50 recale : il ne bouge pas.
expect: { usable: true, nightModelActive: true, nightFactor: 1.092, energyToCoverKwh: 8.48,
requiredSocPct: 50.3, prudentRequiredSocPct: 56.7 },
},
{
node: 'BALANCE',
id: 'bilan-nuit-soiree-facteur-perime',
label: 'Facteur calcule il y a 2 h : on ne l applique pas',
snapshot: Object.assign(snap2709('2026-09-27T23:00:00+02:00', 52, null), {
night_house_factor: 1.092,
night_house_start_ms: Date.parse('2026-09-27T21:30:00+02:00'), night_house_end_ms: Date.parse('2026-09-28T09:00:00+02:00'),
night_house_computed_ms: Date.parse('2026-09-27T21:00:00+02:00') }),
expect: { usable: true, nightModelActive: false, nightFactor: 1 },
},
{
node: 'BALANCE',
id: 'bilan-nuit-soiree-facteur-aberrant-borne',
label: 'Facteur 3 (mesure fausse) : borne a 1,45, l extreme observe',
snapshot: Object.assign(snap2709('2026-09-27T23:00:00+02:00', 52, null), {
night_house_factor: 3,
night_house_start_ms: Date.parse('2026-09-27T21:30:00+02:00'), night_house_end_ms: Date.parse('2026-09-28T09:00:00+02:00'),
night_house_computed_ms: Date.parse('2026-09-27T22:57:00+02:00') }),
expect: { usable: true, nightModelActive: true, nightFactor: 1.45, requiredSocPct: 59.8, prudentRequiredSocPct: 62.2 },
},
];