Jeep identifiee aussi par sa fin de trajet juste avant le branchement (soir sans charge)

This commit is contained in:
Tallagrand Thierry
2026-10-05 23:42:14 +02:00
parent 8f526bdcd6
commit 5e88ce5720
4 changed files with 61 additions and 16 deletions

View File

@@ -303,24 +303,52 @@ export async function ingererJeep(sql, lire, st, journaliser, etiqueter = null)
{ vehicule: 'JEEP', km, niveau, ts: ts.toISOString(), source: 'uconnect' });
}
}
if (niveau !== null && st.get(JEEP.branchee)?.state === 'on'
&& st.get('binary_sensor.victron_evcs_vehicle_connected')?.state === 'on') {
// Deux preuves que le branchement de la borne est la JEEP :
// 1. elle se DECLARE branchee dans [branchement -5 min, +30 min] (charge demarree) ;
// 2. (05/10, accord du proprietaire) elle a FINI UN TRAJET (releve uconnect,
// compteur change) dans les 10 min AVANT le branchement. Le soir en « sans
// EDF » la charge ne demarre pas et la Jeep ne republie rien : sans cet
// indice, le 05/10 a 19:06 le concierge a du poser sa question.
// Risque assume : une autre voiture branchee dans ces 10 min serait prise pour
// la JEEP — la reponse du proprietaire corrige (sa derniere reponse fait foi).
if (st.get('binary_sensor.victron_evcs_vehicle_connected')?.state === 'on') {
const { rows: b } = await lire(
`SELECT max(ts) AS t FROM evenement WHERE genre = 'vehicule'
AND detail->>'entite' = 'binary_sensor.victron_evcs_vehicle_connected' AND detail->>'apres' = 'on'`, []);
const branche = b[0]?.t;
if (branche && ts >= new Date(branche.getTime() - 5 * 60000) && ts <= new Date(branche.getTime() + 30 * 60000)) {
let preuve = null;
if (branche && niveau !== null && st.get(JEEP.branchee)?.state === 'on'
&& ts >= new Date(branche.getTime() - 5 * 60000) && ts <= new Date(branche.getTime() + 30 * 60000)) {
preuve = { ts, niveau, motif: 'branchee' };
} else if (branche) {
const { rows: arr } = await lire(
`SELECT ts, niveau_pct FROM releve_km WHERE vehicule = 'JEEP' AND source = 'uconnect'
AND ts >= $1 AND ts <= $2 AND niveau_pct IS NOT NULL ORDER BY ts DESC LIMIT 1`,
[new Date(branche.getTime() - 10 * 60000), branche]);
if (arr.length) preuve = { ts: arr[0].ts, niveau: Number(arr[0].niveau_pct), motif: 'arrivee' };
}
// Le proprietaire a deja nomme un AUTRE vehicule pour ce branchement : on n'y touche pas.
let autre = false;
if (preuve) {
const { rows: et } = await lire(
`SELECT label FROM etiquette_branchement WHERE branchement BETWEEN $1 AND $2 LIMIT 1`,
[new Date(branche.getTime() - 2000), new Date(branche.getTime() + 2000)]);
autre = et.length > 0 && et[0].label !== 'JEEP';
}
if (preuve && !autre) {
const ts = preuve.ts, niveau = preuve.niveau;
const { rows: deja } = await lire(
"SELECT 1 FROM niveau_saisi WHERE source = 'uconnect' AND saisi_a >= $1", [new Date(branche.getTime() - 5 * 60000)]);
"SELECT 1 FROM niveau_saisi WHERE source = 'uconnect' AND saisi_a >= $1", [new Date(branche.getTime() - 10 * 60000)]);
if (!deja.length) {
const r = await sql(
"INSERT INTO niveau_saisi (saisi_a, niveau_pct, ref_kwh, source) VALUES ($1,$2,NULL,'uconnect') ON CONFLICT DO NOTHING",
[ts, niveau]);
if (r?.rowCount) {
n++;
await journaliser(sql, 'vehicule', `Niveau JEEP au branchement : ${niveau} % (lu par Uconnect)`,
{ niveau, ts: ts.toISOString(), branchement: branche.toISOString() });
if (etiqueter) n += await etiqueter(branche, niveau);
await journaliser(sql, 'vehicule', `Niveau JEEP au branchement : ${niveau} % (lu par Uconnect`
+ (preuve.motif === 'arrivee' ? ', fin de trajet juste avant le branchement)' : ')'),
{ niveau, ts: ts.toISOString(), branchement: branche.toISOString(), preuve: preuve.motif });
if (etiqueter) n += await etiqueter(branche, niveau, preuve.motif);
}
}
}