Le compteur de la borne fait foi, pas mon integration
Le tableau annoncait 750 Wh la ou VRM affichait 8 kWh. Ce n'etait pas une erreur de mesure mais une erreur de SOURCE : j'integrais la puissance depuis le moment ou mon detecteur avait commence a fonctionner — 03:16 — pour une session ouverte a 01:25. Or la borne tient son propre compteur de session, `sensor.evcs_hq2239dnt7p_last_session_energy`, qui vaut exactement les 8,0 kWh de VRM et compte depuis le vrai debut. Nouvelle colonne `energie_station_kwh` : c'est elle qui alimente desormais les totaux et le graphique. Mon integration est conservee en colonne « kWh integres » : l'ecart entre les deux signale un demarrage ou un redemarrage du service en cours de session, ce qui est une information en soi. Et elle sert de secours si la borne ne publie rien. Cherche au passage, sans succes : VRM affiche « Vehicule : Guest EV » mais AUCUNE entite ne porte ce champ cote Home Assistant. « Guest EV » signifie d'ailleurs vehicule NON identifie — Victron ne sait pas non plus qui est branche. 50/53 : les trois requetes en echec portent sur la nouvelle colonne, que la migration creera au prochain demarrage du service. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
@@ -355,6 +355,12 @@ async function migrer(client) {
|
||||
await client.query(
|
||||
'ALTER TABLE session_charge ADD COLUMN IF NOT EXISTS energie_reseau_kwh '
|
||||
+ 'double precision NOT NULL DEFAULT 0');
|
||||
// Le compteur de la BORNE, qui fait foi. Mon integration de la puissance
|
||||
// est robuste mais ne couvre que ce que le service a vu : le 05/09, la
|
||||
// session avait commence a 01:25 et le detecteur n'a compte qu'a partir de
|
||||
// 03:16 — 0,75 kWh au lieu de 8. La borne, elle, compte depuis le debut.
|
||||
await client.query(
|
||||
'ALTER TABLE session_charge ADD COLUMN IF NOT EXISTS energie_station_kwh double precision');
|
||||
await client.query(
|
||||
'CREATE INDEX IF NOT EXISTS session_charge_debut_idx ON session_charge (debut DESC)');
|
||||
// Le role de lecture doit voir la nouvelle table. S'il n'existe pas encore,
|
||||
@@ -403,13 +409,15 @@ async function ecrireSession(sql, client, st) {
|
||||
if (!ouverte) {
|
||||
await sql(
|
||||
`INSERT INTO session_charge (debut, fin, vehicule, energie_kwh, p_max_w,
|
||||
courant_max_a, consigne_max_a, source_mode, brut)
|
||||
VALUES ($1,$1,$2,0,$3,$4,$5,$6,$7) ON CONFLICT (debut) DO NOTHING`,
|
||||
courant_max_a, consigne_max_a, source_mode, brut,
|
||||
energie_station_kwh)
|
||||
VALUES ($1,$1,$2,0,$3,$4,$5,$6,$7,$8) ON CONFLICT (debut) DO NOTHING`,
|
||||
[maintenant, vehicule, p,
|
||||
num(g('sensor.victron_evcs_current')?.state),
|
||||
num(g('sensor.victron_evcs_set_current')?.state),
|
||||
txt(g('input_text.victron_evcs_source_mode')?.state) || null,
|
||||
JSON.stringify({ profil: txt(g('input_text.victron_evcs_operating_mode')?.state) })]);
|
||||
JSON.stringify({ profil: txt(g('input_text.victron_evcs_operating_mode')?.state) }),
|
||||
num(g('sensor.evcs_hq2239dnt7p_last_session_energy')?.state)]);
|
||||
n++;
|
||||
} else {
|
||||
// Le pas de temps est plafonne : un arret du service ne doit pas
|
||||
@@ -432,13 +440,15 @@ async function ecrireSession(sql, client, st) {
|
||||
p_max_w = GREATEST(coalesce(p_max_w, 0), $3),
|
||||
courant_max_a = GREATEST(coalesce(courant_max_a, 0), coalesce($5, 0)),
|
||||
consigne_max_a = GREATEST(coalesce(consigne_max_a, 0), coalesce($6, 0)),
|
||||
energie_station_kwh = GREATEST(coalesce(energie_station_kwh, 0), coalesce($9::float8, 0)),
|
||||
vehicule = coalesce($7, vehicule),
|
||||
vehicule_sur = vehicule_sur AND ($7 IS NULL OR vehicule IS NULL OR vehicule = $7)
|
||||
WHERE debut = $1`,
|
||||
[ouverte.debut, maintenant, p, dt,
|
||||
num(g('sensor.victron_evcs_current')?.state),
|
||||
num(g('sensor.victron_evcs_set_current')?.state), vehicule,
|
||||
txt(g('input_text.victron_evcs_source_mode')?.state).startsWith('Réseau') ? 1 : 0]);
|
||||
txt(g('input_text.victron_evcs_source_mode')?.state).startsWith('Réseau') ? 1 : 0,
|
||||
num(g('sensor.evcs_hq2239dnt7p_last_session_energy')?.state)]);
|
||||
n++;
|
||||
}
|
||||
} else if (ouverte) {
|
||||
@@ -447,7 +457,7 @@ async function ecrireSession(sql, client, st) {
|
||||
await sql('UPDATE session_charge SET terminee = true WHERE debut = $1', [ouverte.debut]);
|
||||
await journaliser(sql, 'vehicule',
|
||||
`Session de charge terminee : ${ouverte.vehicule ?? 'vehicule inconnu'}, ` +
|
||||
`${Number(ouverte.energie_kwh).toFixed(2)} kWh`,
|
||||
`${Number(ouverte.energie_station_kwh ?? ouverte.energie_kwh).toFixed(2)} kWh`,
|
||||
{ debut: ouverte.debut, vehicule: ouverte.vehicule, kwh: ouverte.energie_kwh });
|
||||
n += 2;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user