L'energie de la session dans le panneau Chargeur VE

Quatrieme valeur : « Session », le compteur de la BORNE, celui qui vaut les
8 kWh de VRM et compte depuis le vrai debut de la charge.

Il vient de PostgreSQL et non d'InfluxDB : `sensor.evcs_hq2239dnt7p_*` n'est
pas dans les globs d'entites envoyees a InfluxDB. Plutot que de redemarrer Home
Assistant pour l'y ajouter — en pleine charge, a 4 h du matin — la valeur est
reprise de la table `session_charge`, ou elle est deja enregistree. Le panneau
passe donc en source « Mixed », chaque requete portant la sienne.

La session n'est affichee que si elle date de moins de deux heures : au-dela,
la case reste vide plutot que d'exhiber le reliquat d'une charge terminee la
veille — meme principe que la fenetre de lecture des autres panneaux.

La premiere rangee passe a sept unites de hauteur et la Batterie a neuf
colonnes : quatre et cinq valeurs cote a cote redevenaient illisibles a cinq
unites, c'est le defaut deja corrige une fois sur ce meme panneau.

54/54 requetes verifiees. Valeur attendue a l'ecran : 8,30 kWh.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
Tallagrand Thierry
2026-09-05 03:32:46 +02:00
parent 9748325356
commit 27b2004622
2 changed files with 79 additions and 28 deletions

View File

@@ -140,7 +140,7 @@
"x": 0, "x": 0,
"y": 0, "y": 0,
"w": 5, "w": 5,
"h": 5 "h": 7
}, },
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
@@ -257,7 +257,7 @@
"x": 5, "x": 5,
"y": 0, "y": 0,
"w": 4, "w": 4,
"h": 5 "h": 7
}, },
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
@@ -381,8 +381,8 @@
"gridPos": { "gridPos": {
"x": 9, "x": 9,
"y": 0, "y": 0,
"w": 10, "w": 9,
"h": 5 "h": 7
}, },
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
@@ -523,7 +523,7 @@
"percentChangeColorMode": "standard", "percentChangeColorMode": "standard",
"noValue": "—", "noValue": "—",
"text": { "text": {
"valueSize": 26, "valueSize": 22,
"titleSize": 11 "titleSize": 11
}, },
"wideLayout": true "wideLayout": true
@@ -534,8 +534,8 @@
"title": "Chargeur VE", "title": "Chargeur VE",
"description": "Consigne = ce que le controleur demande a la borne, reecrit toutes les 30 s. Courant = ce que la voiture prend reellement.", "description": "Consigne = ce que le controleur demande a la borne, reecrit toutes les 30 s. Courant = ce que la voiture prend reellement.",
"datasource": { "datasource": {
"type": "influxdb", "type": "datasource",
"uid": "evcs-influx" "uid": "-- Mixed --"
}, },
"targets": [ "targets": [
{ {
@@ -561,13 +561,24 @@
"uid": "evcs-influx" "uid": "evcs-influx"
}, },
"query": "from(bucket: \"evcs\")\n |> range(start: -24h)\n |> filter(fn: (r) => r._measurement == \"A\" and r.entity_id == \"victron_evcs_set_current\" and r._field == \"value\")\n |> last()\n |> keep(columns: [\"_value\"])\n |> rename(columns: {_value: \"Consigne\"})" "query": "from(bucket: \"evcs\")\n |> range(start: -24h)\n |> filter(fn: (r) => r._measurement == \"A\" and r.entity_id == \"victron_evcs_set_current\" and r._field == \"value\")\n |> last()\n |> keep(columns: [\"_value\"])\n |> rename(columns: {_value: \"Consigne\"})"
},
{
"refId": "D",
"datasource": {
"type": "grafana-postgresql-datasource",
"uid": "evcs-pg"
},
"format": "table",
"rawQuery": true,
"editorMode": "code",
"rawSql": "-- Le compteur de la BORNE, repris de la table des sessions : il\n-- compte depuis le vrai debut, la ou une integration ne couvre que\n-- ce que le service a vu. Session close depuis plus de 2 h : rien.\nSELECT round(coalesce(energie_station_kwh, energie_kwh)::numeric, 2) AS \"Session\"\nFROM session_charge\nWHERE fin > now() - interval '2 hours'\nORDER BY debut DESC LIMIT 1"
} }
], ],
"gridPos": { "gridPos": {
"x": 19, "x": 18,
"y": 0, "y": 0,
"w": 5, "w": 6,
"h": 5 "h": 7
}, },
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
@@ -633,6 +644,29 @@
"value": 0 "value": 0
} }
] ]
},
{
"matcher": {
"id": "byName",
"options": "Session"
},
"properties": [
{
"id": "unit",
"value": "kwatth"
},
{
"id": "decimals",
"value": 2
},
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "green"
}
}
]
} }
] ]
}, },
@@ -651,6 +685,10 @@
"justifyMode": "center", "justifyMode": "center",
"percentChangeColorMode": "standard", "percentChangeColorMode": "standard",
"noValue": "—", "noValue": "—",
"text": {
"valueSize": 22,
"titleSize": 11
},
"wideLayout": true "wideLayout": true
} }
}, },
@@ -682,7 +720,7 @@
], ],
"gridPos": { "gridPos": {
"x": 0, "x": 0,
"y": 5, "y": 7,
"w": 5, "w": 5,
"h": 8 "h": 8
}, },
@@ -775,7 +813,7 @@
], ],
"gridPos": { "gridPos": {
"x": 5, "x": 5,
"y": 5, "y": 7,
"w": 13, "w": 13,
"h": 8 "h": 8
}, },
@@ -944,7 +982,7 @@
], ],
"gridPos": { "gridPos": {
"x": 18, "x": 18,
"y": 5, "y": 7,
"w": 6, "w": 6,
"h": 8 "h": 8
}, },
@@ -1065,7 +1103,7 @@
], ],
"gridPos": { "gridPos": {
"x": 0, "x": 0,
"y": 13, "y": 15,
"w": 24, "w": 24,
"h": 9 "h": 9
}, },
@@ -1212,7 +1250,7 @@
], ],
"gridPos": { "gridPos": {
"x": 0, "x": 0,
"y": 22, "y": 24,
"w": 24, "w": 24,
"h": 9 "h": 9
}, },

View File

@@ -798,7 +798,7 @@ systeme = dashboard("evcs-systeme", "Le systeme", (
flux_dernier("A", "W", "victron_grid_power_l1", "Puissance", fenetre="6h"), flux_dernier("A", "W", "victron_grid_power_l1", "Puissance", fenetre="6h"),
flux_dernier("B", "V", "airtria_mpii_v1_input_voltage_l1", "Tension", fenetre="6h"), flux_dernier("B", "V", "airtria_mpii_v1_input_voltage_l1", "Tension", fenetre="6h"),
flux_dernier("C", "A", "gx_device_grid_current_l1", "Courant", fenetre="6h")], flux_dernier("C", "A", "gx_device_grid_current_l1", "Courant", fenetre="6h")],
IN, 0, 0, 5, 5, IN, 0, 0, 5, 7,
"Positif : le reseau alimente la maison. Le contacteur EDF est pilote par " "Positif : le reseau alimente la maison. Le contacteur EDF est pilote par "
"le workflow d'hysteresis, pas depuis ici.", "le workflow d'hysteresis, pas depuis ici.",
overrides=[col("Puissance", "watt"), col("Tension", "volt"), col("Courant", "amp", dec=1)]), overrides=[col("Puissance", "watt"), col("Tension", "volt"), col("Courant", "amp", dec=1)]),
@@ -806,7 +806,7 @@ systeme = dashboard("evcs-systeme", "Le systeme", (
stat("Charges CA", [ stat("Charges CA", [
flux_dernier("A", "W", "victron_consumption_power_l1", "Consommation"), flux_dernier("A", "W", "victron_consumption_power_l1", "Consommation"),
flux_dernier("B", "Hz", "airtria_mpii_v1_output_frequency_l1", "Frequence")], flux_dernier("B", "Hz", "airtria_mpii_v1_output_frequency_l1", "Frequence")],
IN, 5, 0, 4, 5, IN, 5, 0, 4, 7,
"Ce que la maison consomme, voiture comprise.", "Ce que la maison consomme, voiture comprise.",
overrides=[col("Consommation", "watt"), col("Frequence", "hertz", dec=1)]), overrides=[col("Consommation", "watt"), col("Frequence", "hertz", dec=1)]),
@@ -816,7 +816,7 @@ systeme = dashboard("evcs-systeme", "Le systeme", (
flux_dernier("C", "V", "victron_battery_voltage", "Tension"), flux_dernier("C", "V", "victron_battery_voltage", "Tension"),
flux_dernier("D", "A", "victron_battery_current", "Courant"), flux_dernier("D", "A", "victron_battery_current", "Courant"),
flux_dernier("E", "°C", "victron_battery_temperature", "Temperature")], flux_dernier("E", "°C", "victron_battery_temperature", "Temperature")],
IN, 9, 0, 10, 5, IN, 9, 0, 9, 7,
"Puissance positive : la batterie se charge. Sept modules actifs sur huit, " "Puissance positive : la batterie se charge. Sept modules actifs sur huit, "
"un pack bloquant la charge vers 94 %.", "un pack bloquant la charge vers 94 %.",
overrides=[ overrides=[
@@ -828,29 +828,42 @@ systeme = dashboard("evcs-systeme", "Le systeme", (
# Cinq valeurs dans huit colonnes : Grafana reduisait le texte jusqu'a # Cinq valeurs dans huit colonnes : Grafana reduisait le texte jusqu'a
# l'illisible. Dix colonnes et une taille imposee, plutot que de laisser # l'illisible. Dix colonnes et une taille imposee, plutot que de laisser
# l'ajustement automatique decider. # l'ajustement automatique decider.
taille={"valueSize": 26, "titleSize": 11}), taille={"valueSize": 22, "titleSize": 11}),
stat("Chargeur VE", [ dict(stat("Chargeur VE", [
flux_dernier("A", "W", "victron_evcs_ac_power", "Puissance"), flux_dernier("A", "W", "victron_evcs_ac_power", "Puissance"),
flux_dernier("B", "A", "victron_evcs_current", "Courant"), flux_dernier("B", "A", "victron_evcs_current", "Courant"),
flux_dernier("C", "A", "victron_evcs_set_current", "Consigne")], flux_dernier("C", "A", "victron_evcs_set_current", "Consigne"),
IN, 19, 0, 5, 5, sql("D", "-- Le compteur de la BORNE, repris de la table des sessions : il\n"
"-- compte depuis le vrai debut, la ou une integration ne couvre que\n"
"-- ce que le service a vu. Session close depuis plus de 2 h : rien.\n"
"SELECT round(coalesce(energie_station_kwh, energie_kwh)::numeric, 2) AS \"Session\"\n"
"FROM session_charge\n"
"WHERE fin > now() - interval '2 hours'\n"
"ORDER BY debut DESC LIMIT 1", fmt="table")],
IN, 18, 0, 6, 7,
"Consigne = ce que le controleur demande a la borne, reecrit toutes les " "Consigne = ce que le controleur demande a la borne, reecrit toutes les "
"30 s. Courant = ce que la voiture prend reellement.", "30 s. Courant = ce que la voiture prend reellement.",
overrides=[col("Puissance", "watt"), col("Courant", "amp", dec=1), overrides=[col("Puissance", "watt"), col("Courant", "amp", dec=1),
col("Consigne", "amp", dec=0)]), col("Consigne", "amp", dec=0),
sur("Session", [{"id": "unit", "value": "kwatth"},
{"id": "decimals", "value": 2},
{"id": "color", "value": {"mode": "fixed", "fixedColor": "green"}}])],
taille={"valueSize": 22, "titleSize": 11}),
# Sources melangees : le panneau porte « Mixed », chaque requete la sienne.
datasource={"type": "datasource", "uid": "-- Mixed --"}),
stat("Chargeur PV", [ stat("Chargeur PV", [
flux_dernier("A", "W", "victron_pv_power_system", "Production"), flux_dernier("A", "W", "victron_pv_power_system", "Production"),
flux_dernier("B", "W", "victron_pv_power_10m_avg", "Moyenne 10 min")], flux_dernier("B", "W", "victron_pv_power_10m_avg", "Moyenne 10 min")],
IN, 0, 5, 5, 8, IN, 0, 7, 5, 8,
"Rappel qui vaut pour toute lecture de cette valeur : sans injection, la " "Rappel qui vaut pour toute lecture de cette valeur : sans injection, la "
"production MESUREE vaut min(ressource, consommation + absorption " "production MESUREE vaut min(ressource, consommation + absorption "
"batterie). Basse ne veut pas dire mauvais temps.", "batterie). Basse ne veut pas dire mauvais temps.",
overrides=[col("Production", "watt"), col("Moyenne 10 min", "watt")]), overrides=[col("Production", "watt"), col("Moyenne 10 min", "watt")]),
dict(table("Detail par tracker", [flux("A", TRACKERS_FLUX)], dict(table("Detail par tracker", [flux("A", TRACKERS_FLUX)],
IN, 5, 5, 13, 8, IN, 5, 7, 13, 8,
"Les 52 panneaux en quatre plans : sud-est 40 degres, trois chaines sud " "Les 52 panneaux en quatre plans : sud-est 40 degres, trois chaines sud "
"35 degres, ouest 45 degres. Le suiveur de trois panneaux ne publie pas " "35 degres, ouest 45 degres. Le suiveur de trois panneaux ne publie pas "
"de mode de fonctionnement et n'apparait donc pas ici.", "de mode de fonctionnement et n'apparait donc pas ici.",
@@ -892,7 +905,7 @@ systeme = dashboard("evcs-systeme", "Le systeme", (
' |> keep(columns: ["_value"])\n' ' |> keep(columns: ["_value"])\n'
' |> rename(columns: {_value: "Desequilibre"})'), ' |> rename(columns: {_value: "Desequilibre"})'),
flux_dernier("D", "%", "airtria_8_us2000c_state_of_health", "Sante", fenetre="48h")], flux_dernier("D", "%", "airtria_8_us2000c_state_of_health", "Sante", fenetre="48h")],
IN, 18, 5, 6, 8, IN, 18, 7, 6, 8,
"« Charge max » est la limite que le BMS impose au systeme entier. Le " "« Charge max » est la limite que le BMS impose au systeme entier. Le "
"04/09 elle est tombee de 150 a 20 A en trois minutes, des 76 % de charge, " "04/09 elle est tombee de 150 a 20 A en trois minutes, des 76 % de charge, "
"au moment ou l'alarme de tension de cellule s'est declenchee — le parc " "au moment ou l'alarme de tension de cellule s'est declenchee — le parc "
@@ -918,7 +931,7 @@ systeme = dashboard("evcs-systeme", "Le systeme", (
('sensor.victron_battery_power', 'Batterie'), ('sensor.victron_battery_power', 'Batterie'),
('sensor.victron_consumption_power_l1', 'Maison'), ('sensor.victron_consumption_power_l1', 'Maison'),
('sensor.victron_evcs_ac_power', 'Voiture')], fmt="table")], ('sensor.victron_evcs_ac_power', 'Voiture')], fmt="table")],
PG, 0, 13, 24, 9, "watt", PG, 0, 15, 24, 9, "watt",
"Batterie positive : elle se charge. Reseau positif : il alimente. " "Batterie positive : elle se charge. Reseau positif : il alimente. "
"Aux instants ou tout est a zero sauf la maison, c'est la batterie qui " "Aux instants ou tout est a zero sauf la maison, c'est la batterie qui "
"porte tout.", "porte tout.",
@@ -932,7 +945,7 @@ systeme = dashboard("evcs-systeme", "Le systeme", (
"transformations": FILTRE_VUE}), "transformations": FILTRE_VUE}),
dict(barchart("Energie par periode", [sql("A", ENERGIE_SQL, fmt="table")], dict(barchart("Energie par periode", [sql("A", ENERGIE_SQL, fmt="table")],
PG, 0, 22, 24, 9, "kwatth", PG, 0, 24, 24, 9, "kwatth",
"Le pas suit la periode choisie : l'heure jusqu'a 4 jours, le jour " "Le pas suit la periode choisie : l'heure jusqu'a 4 jours, le jour "
"jusqu'a 70, le mois au-dela. Obtenue en integrant la puissance, PAS en " "jusqu'a 70, le mois au-dela. Obtenue en integrant la puissance, PAS en "
"lisant les compteurs kWh du GX : ceux-ci se remettent a zero sans le " "lisant les compteurs kWh du GX : ceux-ci se remettent a zero sans le "