L energie du compteur cesse de porter treize decimales de bruit

`energie_compteur_kwh` vaut la difference de deux releves du compteur
cumulatif de la borne, proches de 3 800 kWh : en double precision la
soustraction rend « 0.8000000000001819 » pour une mesure dont la resolution
est de 0,1 kWh. Arrondi a l ecriture, au millieme, plutot que de laisser
chaque lecteur s en charger.

Signale par la session OpenClaw en calibrant son module de detection sur la
table. Cosmetique pour la logique, mais ce projet a deja paye le prix de la
fausse precision affichee comme une mesure.

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:45:50 +02:00
parent 024eb3e0f7
commit 43bda3df01

View File

@@ -742,9 +742,15 @@ async function ecrireSession(sql, client, st) {
const station = num(g('sensor.evcs_hq2239dnt7p_last_session_energy')?.state);
const dureeBorne = num(g('sensor.evcs_hq2239dnt7p_last_session_time')?.state);
const compteur = num(g('sensor.evcs_hq2239dnt7p_total_energy')?.state);
// Le compteur de la borne a une resolution de 0,1 kWh. La soustraction
// de deux nombres proches de 3 800 en double precision rend
// « 0.8000000000001819 » : treize decimales de fausse precision sur une
// mesure qui n'en a qu'une. On arrondit a l'ECRITURE plutot que de
// laisser chaque lecteur le faire — signale par la session OpenClaw le
// 13/09 en lisant la table.
const parCompteur = compteur !== null && ouverte.compteur_debut_kwh !== null
&& compteur >= ouverte.compteur_debut_kwh
? compteur - Number(ouverte.compteur_debut_kwh) : null;
? Math.round((compteur - Number(ouverte.compteur_debut_kwh)) * 1000) / 1000 : null;
await sql(
`UPDATE session_charge SET terminee = true, energie_station_kwh = $2,
energie_compteur_kwh = $3, duree_borne_min = $4