JEEP branchee a midi : reseau en HC seulement si le solaire ne suffit pas avant son depart

Regle du proprietaire (28/09). Le bilan compare le besoin saisi (niveau x capacite
mesuree - deja delivre) au solaire disponible avant le depart de 15:30 (mar/mer/
ven/sam) sans descendre la batterie sous le plancher « tenir jusqu'a la prochaine
HC ». Le controleur relaie le verdict sous les gardes du bilan ; session de midi
engagee -> voiture sur le reseau avec la batterie. Bilan 61/61, golden 121/121.

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 13:55:40 +02:00
parent 9b1c9d30cf
commit 3b9b67268c
17 changed files with 501 additions and 14 deletions

View File

@@ -106,6 +106,13 @@ const SUMMARIZE = {
hcReachActive: o.hcReach ? o.hcReach.active : false,
hcFloorPct: o.hcReach ? o.hcReach.floorPct : null,
hcNightFloorPrudentPct: o.hcReach ? o.hcReach.nightFloorPrudentPct : 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,
vehicleReachableKwh: o.vehicleMidday ? o.vehicleMidday.reachableKwh : null,
vehicleSolarKwh: o.vehicleMidday ? o.vehicleMidday.solarKwh : null,
vehicleFloorAtDeparturePct: o.vehicleMidday ? o.vehicleMidday.floorAtDeparturePct : null,
vehicleGridNeeded: o.vehicleMidday ? o.vehicleMidday.gridNeeded : false,
}) : ({ usable: false, missing: o.missing.join(',') }),
};

View File

@@ -64,6 +64,13 @@ function snap2709(nowIso, soc, fenetre, facteur27 = 1) {
const NUIT_2709 = ['2026-09-27T07:24:00+02:00', '2026-09-27T12:24:00+02:00', '2026-09-28T01:24:00+02:00'];
const MIDI_2709 = ['2026-09-27T14:24:00+02:00', '2026-09-28T01:24:00+02:00', '2026-09-28T01:24:00+02:00'];
const SOMBRE = 18 / 25.1;
// JEEP branchee a midi, depart 15:30 (28/09) : niveau saisi, capacite mesuree
// 8,7 kWh, rien de delivre depuis la saisie sauf mention.
function jeep(snapshot, niveau, extra = {}) {
return Object.assign(snapshot, { vehicle_connected: true,
vehicle_departure_ms: Date.parse('2026-09-27T15:30:00+02:00'), vehicle_level_pct: niveau,
vehicle_level_valid: true, vehicle_capacity_kwh: 8.7, vehicle_delivered_since_level_kwh: 0 }, extra);
}
export const balanceScenarios = [
{
@@ -432,5 +439,54 @@ export const balanceScenarios = [
label: 'Hors fenetre HC : aucune exigence ajoutee (22 %, pas de reseau)',
snapshot: snap2709('2026-09-27T12:30:00+02:00', 30, null, SOMBRE),
expect: { usable: true, requiredSocPct: 22, gridNeeded: false, hcReachActive: false, hcFloorPct: 0 },
}, // ======== JEEP BRANCHEE A MIDI, DEPART 15:30 (28/09/2026) ========
{
node: 'BALANCE',
id: 'bilan-jeep-midi-soleil-solaire-suffit',
label: 'JEEP a 12 %, midi ensoleille (prevision 25,1 kWh), SOC 47 : le solaire couvre, pas de reseau',
// Verifie a la main : 88 % x 8,7 = 7,66 kWh. Plancher au depart 33,5 % ->
// 13,5 points x 0,30 = 4,05 kWh de batterie + 4,96 kWh de surplus net
// 12:30-15:30 = 9,01 kWh >= 7,66.
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 47, MIDI_2709), 12),
expect: { usable: true, vehicleActive: true, vehicleNeedKwh: 7.66, vehicleSolarKwh: 9,
vehicleFloorAtDeparturePct: 33.5, vehicleGridNeeded: false },
},
{
node: 'BALANCE',
id: 'bilan-jeep-midi-sombre-reseau-justifie',
label: 'JEEP a 12 %, midi sombre (18 kWh), SOC 30 : le solaire ne couvre pas avant 15:30 -> reseau justifie',
// La batterie est SOUS son plancher de depart (41,4 %) : il lui manque
// 3,42 kWh, plus que les 2,26 kWh de surplus -> rien pour la voiture.
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 30, MIDI_2709, SOMBRE), 12),
expect: { usable: true, vehicleActive: true, vehicleSolarKwh: 0, vehicleReachableKwh: 7.66,
vehicleGridNeeded: true },
},
{
node: 'BALANCE',
id: 'bilan-jeep-midi-sans-depart-regle-muette',
label: 'Jour sans depart (lundi, jeudi, dimanche) : la regle se tait, la HC de 01:24 finira la charge',
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 30, MIDI_2709, SOMBRE), 12, { vehicle_departure_ms: null }),
expect: { usable: true, vehicleActive: false, vehicleGridNeeded: false },
},
{
node: 'BALANCE',
id: 'bilan-jeep-midi-niveau-perime-regle-muette',
label: 'Niveau saisi avant ce branchement : on ne devine pas le besoin, la regle se tait',
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 30, MIDI_2709, SOMBRE), 12, { vehicle_level_valid: false }),
expect: { usable: true, vehicleActive: false, vehicleGridNeeded: false },
},
{
node: 'BALANCE',
id: 'bilan-jeep-midi-deja-chargee-par-le-solaire',
label: 'Saisie 12 % puis 7,5 kWh deja delivres : besoin residuel 0,16 kWh, sous le seuil -> pas de reseau',
snapshot: jeep(snap2709('2026-09-27T12:30:00+02:00', 30, MIDI_2709, SOMBRE), 12, { vehicle_delivered_since_level_kwh: 7.5 }),
expect: { usable: true, vehicleActive: true, vehicleNeedKwh: 0.16, vehicleGridNeeded: false },
},
{
node: 'BALANCE',
id: 'bilan-jeep-hors-fenetre-hc-regle-muette',
label: 'Hors fenetre HC (15:00) : la regle ne s engage jamais hors HC',
snapshot: jeep(snap2709('2026-09-27T15:00:00+02:00', 30, null, SOMBRE), 12),
expect: { usable: true, vehicleActive: false, vehicleGridNeeded: false },
},
];

View File

@@ -2562,6 +2562,103 @@ export const scenarios = [
takeoverNeeded: false,
},
},
// ======== JEEP BRANCHEE A MIDI, DEPART 15:30 (28/09/2026) ========
// « JEEP branchee engage le reseau en HC midi si l'analyse de production le
// justifie » : le BILAN fait l'analyse et publie un verdict, le controleur le
// relaie sous les memes gardes (statut, fraicheur) que la cible. Ici la
// batterie n'a rien a reclamer (SOC 45 > 30) : seul le verdict voiture engage.
{
id: 'hc-midi-jeep-verdict-bilan-engage-la-session',
label: 'MIDI 28/09 — JEEP branchee, le bilan juge le solaire insuffisant avant 15:30 : la session HC de midi s engage',
time: MIDDAY,
overrides: {
evcs_vehicle_connected: 'on',
evcs_device_connected: 'on',
soc_percent: '45', battery_current_a: '10',
pv_power_w: '3000', pv_power_10m_avg_w: '3000', 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_vehicle_grid_needed: 'on',
},
expect: { profile: 'midday_hc_or_solar', sessionCommittedService: 'turn_on', takeoverNeeded: true },
},
{
id: 'hc-midi-jeep-sans-verdict-aucun-engagement',
label: 'CONTREFACTUEL — meme midi, le bilan juge le solaire suffisant : aucune session',
time: MIDDAY,
overrides: {
evcs_vehicle_connected: 'on',
evcs_device_connected: 'on',
soc_percent: '45', battery_current_a: '10',
pv_power_w: '3000', pv_power_10m_avg_w: '3000', 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_vehicle_grid_needed: 'off',
},
expect: { profile: 'midday_hc_or_solar', takeoverNeeded: false },
},
{
id: 'hc-midi-jeep-verdict-voiture-debranchee',
label: 'CONTREFACTUEL — verdict encore a ON mais voiture debranchee : aucune session',
time: MIDDAY,
overrides: {
evcs_vehicle_connected: 'off',
evcs_device_connected: 'on',
soc_percent: '45', battery_current_a: '10',
pv_power_w: '3000', pv_power_10m_avg_w: '3000', 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_vehicle_grid_needed: 'on',
},
expect: { profile: 'midday_hc_or_solar', takeoverNeeded: false },
},
{
id: 'hc-midi-jeep-verdict-bilan-perime',
label: 'CONTREFACTUEL — verdict a ON mais bilan vieux de 2 h : on ne relaie pas un verdict perime',
time: MIDDAY,
overrides: {
evcs_vehicle_connected: 'on',
evcs_device_connected: 'on',
soc_percent: '45', battery_current_a: '10',
pv_power_w: '3000', pv_power_10m_avg_w: '3000', 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_vehicle_grid_needed: 'on',
},
expect: { profile: 'midday_hc_or_solar', takeoverNeeded: false },
},
{
id: 'hc-midi-session-engagee-voiture-sur-reseau',
label: 'MIDI — session engagee, contacteur ferme, plein soleil : la voiture passe sur le reseau (batterie et voiture ensemble)',
time: MIDDAY,
overrides: {
evcs_vehicle_connected: 'on',
grid_state: 'on', victron_acin1_available: '1',
night_grid_session_committed_prev: 'on',
evcs_device_connected: 'on',
soc_percent: '45', battery_current_a: '10',
pv_power_w: '6000', pv_power_10m_avg_w: '6000', 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_vehicle_grid_needed: 'on',
},
expect: { profile: 'midday_hc_or_solar', sourceMode: 'grid_hc_allowed', takeoverNeeded: true },
},
{
id: 'consigne-bilan-plancher-nuage-exclut-la-batterie',
label: 'CONSIGNE 18/09 — midi, soleil bride, manque batterie, PAS de voiture : le terme batterie ne doit PAS remonter le plancher nuage',