Jeep identifiee aussi par sa fin de trajet juste avant le branchement (soir sans charge)
This commit is contained in:
@@ -1434,15 +1434,15 @@ async function appliquerEtiquetteConcierge(sql, client, st) {
|
||||
// 3. niveau « saisi » du vehicule = niveau lu, sauf saisie humaine depuis le
|
||||
// branchement - 1 h (l'automatisation HA recale la reference du compteur).
|
||||
// Le concierge ne doit alors plus poser sa question : il lit etiquette_branchement.
|
||||
async function etiqueterJeepUconnect(sql, client, st, branche, niveau) {
|
||||
async function etiqueterJeepUconnect(sql, client, st, branche, niveau, motif = 'branchee') {
|
||||
if (DRY) return 0;
|
||||
const { rowCount } = await client.query(
|
||||
`INSERT INTO etiquette_branchement (branchement, label, source_airtria, confirmed_at)
|
||||
VALUES ($1, 'JEEP', 'uconnect', $2) ON CONFLICT (branchement) DO NOTHING`,
|
||||
[branche, new Date().toISOString()]);
|
||||
if (!rowCount) return 0; // deja etiquete (le proprietaire a repondu) : on ne touche a rien
|
||||
await journaliser(sql, 'vehicule', `Branchement identifie : JEEP (la voiture se declare branchee, Uconnect), niveau ${niveau} %`,
|
||||
{ origine: 'uconnect', label: 'JEEP', branchement: branche.toISOString(), niveau });
|
||||
await journaliser(sql, 'vehicule', `Branchement identifie : JEEP (${motif === 'arrivee' ? 'fin de trajet juste avant le branchement' : 'la voiture se declare branchee'}, Uconnect), niveau ${niveau} %`,
|
||||
{ origine: 'uconnect', label: 'JEEP', branchement: branche.toISOString(), niveau, preuve: motif });
|
||||
let n = 1 + await piloterSelecteurVehicule(sql, st, 'JEEP', 'uconnect');
|
||||
const saisieA = Number(st.get('input_datetime.victron_evcs_vehicle_level_at')?.attributes?.timestamp) * 1000;
|
||||
if (!(saisieA >= branche.getTime() - 3600000)) {
|
||||
@@ -2212,7 +2212,7 @@ async function cycle(client) {
|
||||
}) + await ingererNiveauSaisi(sql, st).catch((e) => {
|
||||
console.error(`niveau saisi en echec : ${e.message}`); return 0;
|
||||
}) + await ingererJeep(sql, (q, v) => client.query(q, v), st, journaliser,
|
||||
(branche, niveau) => etiqueterJeepUconnect(sql, client, st, branche, niveau)).catch((e) => {
|
||||
(branche, niveau, motif) => etiqueterJeepUconnect(sql, client, st, branche, niveau, motif)).catch((e) => {
|
||||
console.error(`jeep uconnect en echec : ${e.message}`); return 0;
|
||||
}),
|
||||
pvDiagnostic: DRY ? 0 : await publierDiagnosticPv(st).catch((e) => {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user