Onze sessions etiquetees VW a tort, et l une n est meme pas du foyer

Le selecteur de vehicule est reste sur VW du 07/09 20:49 au 13/09 : onze
sessions consecutives ont herite de cette etiquette, toutes marquees
« sur » — le drapeau `vehicule_sur` ne passe a faux que si le selecteur
bouge PENDANT une session, donc un selecteur perime reste fiable a ses
propres yeux.

Quatre lignes corrigees, apres arbitrage du proprietaire :
  mer 09/09 15:55  6,61 kWh  -> JEEP
  ven 11/09 16:54  7,45 kWh  -> MEGANE
  sam 12/09 11:42  0,09 kWh  -> JEEP
  sam 12/09 11:55  5,94 kWh  -> JEEP

La session du 11/09 n'est ni la VW ni la JEEP : 6 360 W a 28 A quand les
deux vehicules du foyer plafonnent vers 3 680 W. C'est une Megane de
service. Ce cas n'etait documente nulle part, et il corrige la doctrine
« vehicules indiscernables » : elle ne vaut que pour la VW et la JEEP l'une
par rapport a l'autre, un vehicule invite se lit dans `p_max_w`.

Les sept autres lignes etaient justes — par chance, la VW etant celle qui
charge le plus souvent.

L'arbitrage a repose sur un contexte qu'aucun capteur ne produit : sa femme
(JEEP) en conges, son fils (VW) en stage sans retour le midi. C'est
l'argument central pour l'agent conversationnel — il dit lui-meme qu'il lui
est plus facile de donner cela par WhatsApp que de venir sur un PC.

Reparation idempotente, fenetre d'une minute, verifiee en lecture avant
ecriture : chaque predicat vise exactement une ligne, energies concordantes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
Tallagrand Thierry
2026-09-13 17:11:10 +02:00
parent 283ef42203
commit 095d86d146
2 changed files with 79 additions and 0 deletions

View File

@@ -562,6 +562,47 @@ async function migrer(client) {
// « montre-moi tous les signalements graves de la semaine ».
await client.query(
'CREATE INDEX IF NOT EXISTS observation_gravite_idx ON observation (gravite, ts DESC)');
// -------------------------------------------------------------------
// REPARATION UNIQUE (13/09/2026) — onze sessions etiquetees « VW » a tort
// -------------------------------------------------------------------
// `input_select.victron_evcs_vehicle` est reste sur VW du 07/09 20:49 au
// 13/09 : onze sessions consecutives ont herite de cette etiquette, toutes
// avec `vehicule_sur = true` — ce drapeau ne passe a faux que si le
// selecteur bouge PENDANT une session, donc un selecteur perime reste
// « sur ». C'est le defaut qui a motive le concierge vehicule.
//
// Le proprietaire a tranche, et son arbitrage repose sur un contexte
// qu'aucun capteur ne produit : sa femme (JEEP) etait en conges cette
// semaine, son fils (VW) en stage sans retour le midi.
//
// mer 09/09 15:55 6,61 kWh -> JEEP (sa femme en conges, charge l'apres-midi)
// ven 11/09 16:54 7,45 kWh -> MEGANE (voiture de service, voir ci-dessous)
// sam 12/09 11:42 0,09 kWh -> JEEP (samedi midi, routine du week-end)
// sam 12/09 11:55 5,94 kWh -> JEEP
//
// La session du 11/09 n'est NI la VW NI la JEEP : 6 360 W a 28 A, quand les
// deux vehicules du foyer plafonnent vers 3 680 W. C'est une Megane
// electrique de service. Un vehicule invite se reconnait donc a sa
// puissance, contrairement a la VW et a la JEEP entre elles.
//
// Les sept autres lignes etaient justes — par chance, la VW etant le
// vehicule qui charge le plus souvent. Elles ne sont pas touchees.
//
// ⚠️ `debut` porte les millisecondes : fenetre d'une seconde, jamais une
// egalite. La condition sur la valeur attendue rend l'operation idempotente.
for (const [debut, etait, devient] of [
['2026-09-09 15:55:00+02', 'VW', 'JEEP'],
['2026-09-11 16:54:00+02', 'VW', 'MEGANE'],
['2026-09-12 11:42:00+02', 'VW', 'JEEP'],
['2026-09-12 11:55:00+02', 'VW', 'JEEP'],
]) {
await client.query(
`UPDATE session_charge SET vehicule = $3
WHERE debut >= $1::timestamptz AND debut < $1::timestamptz + interval '1 minute'
AND vehicule = $2`,
[debut, etait, devient]);
}
// Le role de lecture doit voir la nouvelle table. S'il n'existe pas encore,
// on ne fait pas echouer le demarrage pour autant.
await client.query(`DO $$ BEGIN