Kilometrage : niveaux deduits de l'autonomie marques (photo_autonomie), exposes par capacite_estimee.niveau_estime
This commit is contained in:
@@ -156,6 +156,23 @@ if (process.argv.includes('--vues')) {
|
|||||||
await c.query(`INSERT INTO decision (ts, etat) VALUES ('2020-03-02T01:42Z','night_recovery_done_idle')`);
|
await c.query(`INSERT INTO decision (ts, etat) VALUES ('2020-03-02T01:42Z','night_recovery_done_idle')`);
|
||||||
const v = (await c.query("SELECT * FROM capacite_estimee WHERE branche >= '2020-03-01' AND branche < '2020-03-02'")).rows[0];
|
const v = (await c.query("SELECT * FROM capacite_estimee WHERE branche >= '2020-03-01' AND branche < '2020-03-02'")).rows[0];
|
||||||
proche('sans compteur : sessions du branchement 7,7 / 0,95', v.capacite_kwh, 7.7 / 0.95);
|
proche('sans compteur : sessions du branchement 7,7 / 0,95', v.capacite_kwh, 7.7 / 0.95);
|
||||||
|
eq('niveau lu, pas estime', v.niveau_estime, false);
|
||||||
|
// 12/10 : niveau deduit de l'autonomie (photo VW) -> la saisie sans source est marquee.
|
||||||
|
const { marquerNiveauxEstimes } = await import('../../tools/kilometrage.mjs');
|
||||||
|
await ev('2020-04-01T10:00Z', 'on'); await ev('2020-04-01T14:00Z', 'off');
|
||||||
|
await c.query(`INSERT INTO niveau_saisi (saisi_a, niveau_pct, ref_kwh) VALUES ('2020-04-01T10:05Z', 33, 200.0)`);
|
||||||
|
await c.query(`INSERT INTO niveau_saisi (saisi_a, niveau_pct, ref_kwh) VALUES ('2020-04-01T09:50Z', 50, 199.0)`); // lue, autre niveau
|
||||||
|
await c.query(`INSERT INTO releve_km (vehicule, ts, km, niveau_pct, source) VALUES ('TESTV','2020-04-01T10:00Z',9000,33,'photo_autonomie:14/42')`);
|
||||||
|
await c.query(`INSERT INTO releve_km (vehicule, ts, km, niveau_pct, source) VALUES ('TESTV','2020-04-01T10:00:30Z',9000,40,'photo_autonomie:17/42')`);
|
||||||
|
await marquerNiveauxEstimes((q, p) => c.query(q, p));
|
||||||
|
const ns = (await c.query("SELECT source FROM niveau_saisi WHERE saisi_a = '2020-04-01T10:05Z'")).rows[0];
|
||||||
|
eq('saisie marquee estimee (meme niveau, 5 min)', ns.source, 'photo_autonomie:14/42');
|
||||||
|
eq('saisie d un autre niveau non marquee', (await c.query("SELECT source FROM niveau_saisi WHERE saisi_a = '2020-04-01T09:50Z'")).rows[0].source, null);
|
||||||
|
await c.query(`INSERT INTO session_charge (debut, fin, terminee, vehicule, vehicule_sur, energie_kwh, energie_station_kwh)
|
||||||
|
VALUES ('2020-04-01T10:10Z','2020-04-01T12:00Z',true,'TESTV',true,5,5.5)`);
|
||||||
|
await c.query(`INSERT INTO decision (ts, etat) VALUES ('2020-04-01T12:01Z','day_vehicle_full_idle')`);
|
||||||
|
const w = (await c.query("SELECT * FROM capacite_estimee WHERE branche >= '2020-04-01' AND branche < '2020-04-02'")).rows[0];
|
||||||
|
eq('vue : niveau estime expose', w.niveau_estime, true);
|
||||||
} finally { await c.query('ROLLBACK'); await c.end(); }
|
} finally { await c.query('ROLLBACK'); await c.end(); }
|
||||||
}
|
}
|
||||||
console.log(`${ok}/${ok + ko}`);
|
console.log(`${ok}/${ok + ko}`);
|
||||||
|
|||||||
@@ -202,13 +202,18 @@ WITH tr AS (
|
|||||||
ORDER BY r.ts LIMIT 1) AS niveau_releve_apres,
|
ORDER BY r.ts LIMIT 1) AS niveau_releve_apres,
|
||||||
(SELECT nf.niveau_pct FROM niveau_fin nf
|
(SELECT nf.niveau_pct FROM niveau_fin nf
|
||||||
WHERE nf.saisi_a >= v.debranche - interval '15 minutes' AND nf.saisi_a <= v.debranche + interval '1 hour'
|
WHERE nf.saisi_a >= v.debranche - interval '15 minutes' AND nf.saisi_a <= v.debranche + interval '1 hour'
|
||||||
ORDER BY nf.saisi_a LIMIT 1) AS niveau_fin_saisi
|
ORDER BY nf.saisi_a LIMIT 1) AS niveau_fin_saisi,
|
||||||
|
(SELECT nf.source FROM niveau_fin nf
|
||||||
|
WHERE nf.saisi_a >= v.debranche - interval '15 minutes' AND nf.saisi_a <= v.debranche + interval '1 hour'
|
||||||
|
ORDER BY nf.saisi_a LIMIT 1) AS niveau_fin_source
|
||||||
FROM v
|
FROM v
|
||||||
), f AS (
|
), f AS (
|
||||||
SELECT k.*, coalesce(niveau_fin_saisi, CASE WHEN plein THEN 100 ELSE niveau_releve_apres END) AS niveau_fin FROM k
|
SELECT k.*, coalesce(niveau_fin_saisi, CASE WHEN plein THEN 100 ELSE niveau_releve_apres END) AS niveau_fin FROM k
|
||||||
)
|
)
|
||||||
SELECT branche, debranche, coalesce(vehicule, '?') AS vehicule, niveau_pct, niveau_fin,
|
SELECT branche, debranche, coalesce(vehicule, '?') AS vehicule, niveau_pct, niveau_fin,
|
||||||
kwh_livres, plein,
|
kwh_livres, plein,
|
||||||
|
-- Un des deux niveaux est deduit de l'autonomie affichee (pas une lecture).
|
||||||
|
(coalesce(source, '') ILIKE '%autonomie%' OR coalesce(niveau_fin_source, '') ILIKE '%autonomie%') AS niveau_estime,
|
||||||
CASE WHEN vehicule IS NOT NULL AND niveau_fin - niveau_pct >= 10 AND kwh_livres > 0
|
CASE WHEN vehicule IS NOT NULL AND niveau_fin - niveau_pct >= 10 AND kwh_livres > 0
|
||||||
THEN kwh_livres / ((niveau_fin - niveau_pct) / 100.0) END AS capacite_kwh
|
THEN kwh_livres / ((niveau_fin - niveau_pct) / 100.0) END AS capacite_kwh
|
||||||
FROM f`;
|
FROM f`;
|
||||||
@@ -268,9 +273,26 @@ export async function ingererNiveauSaisi(sql, st) {
|
|||||||
const r = await sql(
|
const r = await sql(
|
||||||
'INSERT INTO niveau_saisi (saisi_a, niveau_pct, ref_kwh) VALUES ($1,$2,$3) ON CONFLICT DO NOTHING',
|
'INSERT INTO niveau_saisi (saisi_a, niveau_pct, ref_kwh) VALUES ($1,$2,$3) ON CONFLICT DO NOTHING',
|
||||||
[new Date(at), niveau, ref]);
|
[new Date(at), niveau, ref]);
|
||||||
|
await marquerNiveauxEstimes(sql);
|
||||||
return r?.rowCount || 0;
|
return r?.rowCount || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Niveau ESTIME (12/10/2026, avec SPARK) : un niveau deduit de l'autonomie
|
||||||
|
// affichee (photo du tableau de bord VW, regle de trois sur l'autonomie pleine
|
||||||
|
// de reference) arrive dans le releve avec la source « photo_autonomie:<km>/<ref> »,
|
||||||
|
// mais aussi dans le helper du niveau, donc dans niveau_saisi SANS source.
|
||||||
|
// On recopie la source sur la saisie correspondante (meme niveau, a 20 min pres),
|
||||||
|
// dans un sens comme dans l'autre de l'ordre d'arrivee. La vue capacite_estimee
|
||||||
|
// l'expose (niveau_estime) : un niveau deduit de l'autonomie depend de la
|
||||||
|
// reference, du chauffage et de la conduite, et biaise justement l'usure.
|
||||||
|
export const SOURCE_ESTIMEE = 'photo_autonomie:';
|
||||||
|
export async function marquerNiveauxEstimes(sql) {
|
||||||
|
await sql(
|
||||||
|
`UPDATE niveau_saisi n SET source = r.source FROM releve_km r
|
||||||
|
WHERE n.source IS NULL AND r.source LIKE '${SOURCE_ESTIMEE}%' AND r.niveau_pct = n.niveau_pct
|
||||||
|
AND n.saisi_a BETWEEN r.ts - interval '20 minutes' AND r.ts + interval '20 minutes'`);
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// JEEP LUE DIRECTEMENT (04/10/2026) : integration HACS hass-uconnect (API
|
// JEEP LUE DIRECTEMENT (04/10/2026) : integration HACS hass-uconnect (API
|
||||||
// Stellantis non officielle, compte du proprietaire, intervalle 15 min, sans
|
// Stellantis non officielle, compte du proprietaire, intervalle 15 min, sans
|
||||||
|
|||||||
Reference in New Issue
Block a user