Grafana La nuit : voiture sur la batterie, budget contre donne ; historisation du budget et du compteur de la borne

This commit is contained in:
Tallagrand Thierry
2026-09-30 18:33:32 +02:00
parent 01c12345f3
commit baf62bb3d5
4 changed files with 272 additions and 8 deletions

View File

@@ -1307,6 +1307,15 @@ autoriser une charge complete avec EDF.** Decisions (30/09) : profil **prudent +
A verifier le 01/10 : index fige, kWh reellement donnes, heure d'arret, SOC a 9 h contre le A verifier le 01/10 : index fige, kWh reellement donnes, heure d'arret, SOC a 9 h contre le
plancher, et si le debit sur batterie (gardes de courant par bande) a permis de donner tout plancher, et si le debit sur batterie (gardes de courant par bande) a permis de donner tout
le budget. le budget.
- **Grafana « La nuit »** : panneau **« Voiture sur la batterie : budget contre donne »**
(sous « Les puissances de la nuit ») — budget prevu par le bilan (sa valeur a 01:24 est
celle figee), kWh donnes depuis 01:24 (compteur de la borne, 01:24-09:00), SOC et plancher
prudent sur l'axe de droite. Pour l'alimenter, la table `mesure` historise desormais
`input_number.evcs_balance_night_vehicle_budget_kwh` et `sensor.evcs_hq2239dnt7p_total_energy`,
et le journal des evenements le mode de nuit et le budget fige. Requete « donne depuis
01:24 » verifiee sur le compteur EDF de la nuit du 28-29/09 : 4,40 kWh (4,61 par
integration de la puissance, le compteur fait foi). Charge dans Grafana, requetes OK
(la courbe « donne » se remplit a partir de 01:24).
--- ---
*Document mis a jour le : 30/09/2026 (~18:30) — commande vocale du mode de nuit validee, premiere nuit budget a suivre ; budget voiture de la nuit sans EDF (bilan + controleur) ; fiche de l'agent allegee (25 831 car.), concierge sans silence, calendrier JEEP mar/sam ; nuit du 28-29 verifiee, achat EDF annonce = maison en HC + manque batterie ; regle HC active, vehicule branche a midi (JEEP/VW/ZERO), prevision de nuit a trois verdicts, nuits superposees et bilan recale sur la soiree* *Document mis a jour le : 30/09/2026 (~18:30) — commande vocale du mode de nuit validee, premiere nuit budget a suivre ; budget voiture de la nuit sans EDF (bilan + controleur) ; fiche de l'agent allegee (25 831 car.), concierge sans silence, calendrier JEEP mar/sam ; nuit du 28-29 verifiee, achat EDF annonce = maison en HC + manque batterie ; regle HC active, vehicule branche a midi (JEEP/VW/ZERO), prevision de nuit a trois verdicts, nuits superposees et bilan recale sur la soiree*

View File

@@ -519,6 +519,200 @@
} }
} }
}, },
{
"type": "timeseries",
"title": "Voiture sur la batterie : budget contre donne",
"description": "Le budget est ce que la voiture peut prendre sur la batterie SANS EDF (profil prudent, plancher 22 %, la batterie tient jusqu'a la nuit suivante). Le controleur le FIGE a 01:24 : sa valeur a 01:24 est celle qui compte. « Donne depuis 01:24 » = compteur de la borne depuis l'ouverture des heures creuses. En « sans EDF », la charge doit s'arreter quand la courbe bleue atteint le budget ; en « charge complete », EDF finit le reste. Axe de droite : la batterie et son plancher prudent.",
"datasource": {
"type": "grafana-postgresql-datasource",
"uid": "evcs-pg"
},
"targets": [
{
"refId": "A",
"datasource": {
"type": "grafana-postgresql-datasource",
"uid": "evcs-pg"
},
"format": "time_series",
"rawQuery": true,
"editorMode": "code",
"rawSql": "SELECT ts AS time, valeur AS \"Budget prevu (bilan)\"\nFROM mesure\nWHERE cle = 'input_number.evcs_balance_night_vehicle_budget_kwh'\n AND $__timeFilter(ts)\nORDER BY 1"
},
{
"refId": "B",
"datasource": {
"type": "grafana-postgresql-datasource",
"uid": "evcs-pg"
},
"format": "time_series",
"rawQuery": true,
"editorMode": "code",
"rawSql": "SELECT m.ts AS time, m.valeur - b.valeur AS \"Donne depuis 01:24\"\nFROM mesure m\nJOIN LATERAL (\n SELECT valeur FROM mesure\n WHERE cle = m.cle\n AND ts <= ((((m.ts AT TIME ZONE 'Europe/Paris') - interval '84 minutes')::date\n + time '01:24') AT TIME ZONE 'Europe/Paris')\n ORDER BY ts DESC LIMIT 1) b ON true\nWHERE m.cle = 'sensor.evcs_hq2239dnt7p_total_energy'\n AND $__timeFilter(m.ts)\n AND (m.ts AT TIME ZONE 'Europe/Paris')::time BETWEEN time '01:24' AND time '09:00'\nORDER BY 1"
},
{
"refId": "C",
"datasource": {
"type": "grafana-postgresql-datasource",
"uid": "evcs-pg"
},
"format": "time_series",
"rawQuery": true,
"editorMode": "code",
"rawSql": "SELECT ts AS time,\n soc_pct AS \"SOC batterie\",\n soc_requis_prudent_pct AS \"Plancher prudent\"\nFROM bilan\nWHERE $__timeFilter(ts)\nORDER BY 1"
}
],
"gridPos": {
"x": 0,
"y": 24,
"w": 24,
"h": 9
},
"fieldConfig": {
"defaults": {
"unit": "kwatth",
"color": {
"mode": "palette-classic"
},
"custom": {
"lineWidth": 2,
"fillOpacity": 0,
"showPoints": "never",
"spanNulls": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Budget prevu (bilan)"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "orange"
}
},
{
"id": "custom.lineInterpolation",
"value": "stepAfter"
},
{
"id": "custom.lineStyle",
"value": {
"fill": "dash",
"dash": [
8,
6
]
}
}
]
},
{
"matcher": {
"id": "byName",
"options": "Donne depuis 01:24"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "blue"
}
},
{
"id": "custom.lineWidth",
"value": 3
},
{
"id": "custom.fillOpacity",
"value": 15
}
]
},
{
"matcher": {
"id": "byRegexp",
"options": "SOC batterie|Plancher prudent"
},
"properties": [
{
"id": "unit",
"value": "percent"
},
{
"id": "min",
"value": 0
},
{
"id": "max",
"value": 100
},
{
"id": "custom.axisPlacement",
"value": "right"
}
]
},
{
"matcher": {
"id": "byName",
"options": "SOC batterie"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "green"
}
}
]
},
{
"matcher": {
"id": "byName",
"options": "Plancher prudent"
},
"properties": [
{
"id": "color",
"value": {
"mode": "fixed",
"fixedColor": "red"
}
},
{
"id": "custom.lineStyle",
"value": {
"fill": "dash",
"dash": [
4,
4
]
}
}
]
}
]
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom",
"showLegend": true,
"calcs": []
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{ {
"type": "table", "type": "table",
"title": "Journal des evenements", "title": "Journal des evenements",
@@ -542,7 +736,7 @@
], ],
"gridPos": { "gridPos": {
"x": 0, "x": 0,
"y": 24, "y": 33,
"w": 24, "w": 24,
"h": 8 "h": 8
}, },
@@ -654,7 +848,7 @@
}, },
"gridPos": { "gridPos": {
"x": 0, "x": 0,
"y": 32, "y": 41,
"w": 14, "w": 14,
"h": 11 "h": 11
}, },
@@ -878,7 +1072,7 @@
], ],
"gridPos": { "gridPos": {
"x": 14, "x": 14,
"y": 32, "y": 41,
"w": 10, "w": 10,
"h": 11 "h": 11
}, },
@@ -925,7 +1119,7 @@
], ],
"gridPos": { "gridPos": {
"x": 0, "x": 0,
"y": 43, "y": 52,
"w": 24, "w": 24,
"h": 9 "h": 9
}, },

View File

@@ -263,7 +263,7 @@ NUIT_XY = {"type": "xychart", "pluginVersion": "11.3.0", "title": "Soiree contre
"droite orange est la regression sur toutes les nuits ; le gros point rouge " "droite orange est la regression sur toutes les nuits ; le gros point rouge "
"est CE SOIR, place sur la droite : une prevision, pas une mesure. " "est CE SOIR, place sur la droite : une prevision, pas une mesure. "
"1 point de SOC = 0,30 kWh sur le parc actuel."), "1 point de SOC = 0,30 kWh sur le parc actuel."),
"datasource": PG, "gridPos": {"x": 0, "y": 32, "w": 14, "h": 11}, "datasource": PG, "gridPos": {"x": 0, "y": 41, "w": 14, "h": 11},
"targets": [sql("A", NUITS_CTE.rstrip() + NUAGE, fmt="table")], "targets": [sql("A", NUITS_CTE.rstrip() + NUAGE, fmt="table")],
"fieldConfig": {"defaults": {"unit": "kwatth", "color": {"mode": "palette-classic"}, "fieldConfig": {"defaults": {"unit": "kwatth", "color": {"mode": "palette-classic"},
"custom": {"show": "points", "pointSize": {"fixed": 9}, "pointShape": "circle", "custom": {"show": "points", "pointSize": {"fixed": 9}, "pointShape": "circle",
@@ -297,13 +297,13 @@ NUIT_TABLE = table("Les nuits, une ligne par nuit", [
'maison_hc_kwh AS "Maison 21:30-01:24", maison_nuit_kwh AS "Maison 21:30-09:00", ' 'maison_hc_kwh AS "Maison 21:30-01:24", maison_nuit_kwh AS "Maison 21:30-09:00", '
'voiture_kwh AS "Voiture", reseau_kwh AS "Reseau", pv_avant_9h_kwh AS "PV avant 9h" ' 'voiture_kwh AS "Voiture", reseau_kwh AS "Reseau", pv_avant_9h_kwh AS "PV avant 9h" '
'FROM nuits ORDER BY j DESC'), fmt="table")], 'FROM nuits ORDER BY j DESC'), fmt="table")],
PG, 14, 32, 10, 11, PG, 14, 41, 10, 11,
"kWh ; « Maison » = voiture exclue. La nuit en cours apparait le lendemain a " "kWh ; « Maison » = voiture exclue. La nuit en cours apparait le lendemain a "
"09:00, une fois close. C'est la matiere du nuage de gauche.") "09:00, une fois close. C'est la matiere du nuage de gauche.")
NUIT_PROFIL = barchart("Profil horaire de la maison : 20 nuits contre cette nuit", [ NUIT_PROFIL = barchart("Profil horaire de la maison : 20 nuits contre cette nuit", [
sql("A", PROFIL_SQL, fmt="table")], sql("A", PROFIL_SQL, fmt="table")],
PG, 0, 43, 24, 9, "kwatth", PG, 0, 52, 24, 9, "kwatth",
"kWh consommes par la maison (voiture exclue) heure par heure, de 18 h a 17 h. " "kWh consommes par la maison (voiture exclue) heure par heure, de 18 h a 17 h. "
"Mediane et valeur haute (8 nuits sur 10 en dessous) sur 20 jours, et la nuit en " "Mediane et valeur haute (8 nuits sur 10 en dessous) sur 20 jours, et la nuit en "
"cours par-dessus — l'heure en cours est partielle. C'est ce profil moyen que le " "cours par-dessus — l'heure en cours est partielle. C'est ce profil moyen que le "
@@ -424,13 +424,68 @@ nuit = dashboard("evcs-nuit", "La nuit", (
"showPoints": "never", "spanNulls": True, "showPoints": "never", "spanNulls": True,
"gradientMode": "opacity"}}}), "gradientMode": "opacity"}}}),
# Budget voiture de la nuit (30/09/2026) : ce que la batterie peut donner sans
# EDF, fige a 01:24, contre ce que la borne a reellement donne.
ts("Voiture sur la batterie : budget contre donne", [
sql("A", "SELECT ts AS time, valeur AS \"Budget prevu (bilan)\"\n"
"FROM mesure\n"
"WHERE cle = 'input_number.evcs_balance_night_vehicle_budget_kwh'\n"
" AND $__timeFilter(ts)\n"
"ORDER BY 1"),
sql("B", "SELECT m.ts AS time, m.valeur - b.valeur AS \"Donne depuis 01:24\"\n"
"FROM mesure m\n"
"JOIN LATERAL (\n"
" SELECT valeur FROM mesure\n"
" WHERE cle = m.cle\n"
" AND ts <= ((((m.ts AT TIME ZONE 'Europe/Paris') - interval '84 minutes')::date\n"
" + time '01:24') AT TIME ZONE 'Europe/Paris')\n"
" ORDER BY ts DESC LIMIT 1) b ON true\n"
"WHERE m.cle = 'sensor.evcs_hq2239dnt7p_total_energy'\n"
" AND $__timeFilter(m.ts)\n"
" AND (m.ts AT TIME ZONE 'Europe/Paris')::time BETWEEN time '01:24' AND time '09:00'\n"
"ORDER BY 1"),
sql("C", "SELECT ts AS time,\n"
" soc_pct AS \"SOC batterie\",\n"
" soc_requis_prudent_pct AS \"Plancher prudent\"\n"
"FROM bilan\n"
"WHERE $__timeFilter(ts)\n"
"ORDER BY 1")],
PG, 0, 24, 24, 9, "kwatth",
"Le budget est ce que la voiture peut prendre sur la batterie SANS EDF "
"(profil prudent, plancher 22 %, la batterie tient jusqu'a la nuit "
"suivante). Le controleur le FIGE a 01:24 : sa valeur a 01:24 est celle "
"qui compte. « Donne depuis 01:24 » = compteur de la borne depuis "
"l'ouverture des heures creuses. En « sans EDF », la charge doit "
"s'arreter quand la courbe bleue atteint le budget ; en « charge "
"complete », EDF finit le reste. Axe de droite : la batterie et son "
"plancher prudent.",
extra={"defaults": {"custom": {"lineWidth": 2, "fillOpacity": 0,
"showPoints": "never", "spanNulls": True}},
"overrides": [
{"matcher": {"id": "byName", "options": "Budget prevu (bilan)"},
"properties": [{"id": "color", "value": {"mode": "fixed", "fixedColor": "orange"}},
{"id": "custom.lineInterpolation", "value": "stepAfter"},
{"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [8, 6]}}]},
{"matcher": {"id": "byName", "options": "Donne depuis 01:24"},
"properties": [{"id": "color", "value": {"mode": "fixed", "fixedColor": "blue"}},
{"id": "custom.lineWidth", "value": 3},
{"id": "custom.fillOpacity", "value": 15}]},
{"matcher": {"id": "byRegexp", "options": "SOC batterie|Plancher prudent"},
"properties": [{"id": "unit", "value": "percent"},
{"id": "min", "value": 0}, {"id": "max", "value": 100},
{"id": "custom.axisPlacement", "value": "right"}]},
{"matcher": {"id": "byName", "options": "SOC batterie"},
"properties": [{"id": "color", "value": {"mode": "fixed", "fixedColor": "green"}}]},
{"matcher": {"id": "byName", "options": "Plancher prudent"},
"properties": [{"id": "color", "value": {"mode": "fixed", "fixedColor": "red"}},
{"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [4, 4]}}]}]}),
table("Journal des evenements", [ table("Journal des evenements", [
sql("A", "SELECT ts AS \"Quand\", genre AS \"Genre\", source AS \"Par\",\n" sql("A", "SELECT ts AS \"Quand\", genre AS \"Genre\", source AS \"Par\",\n"
" resume AS \"Ce qui s'est passe\"\n" " resume AS \"Ce qui s'est passe\"\n"
"FROM evenement\n" "FROM evenement\n"
"WHERE $__timeFilter(ts)\n" "WHERE $__timeFilter(ts)\n"
"ORDER BY ts DESC", fmt="table")], "ORDER BY ts DESC", fmt="table")],
PG, 0, 24, 24, 8, PG, 0, 33, 24, 8,
"Une courbe sans ses evenements ne s'interprete pas. Ces lignes " "Une courbe sans ses evenements ne s'interprete pas. Ces lignes "
"apparaissent aussi en marqueurs verticaux sur tous les graphiques.", "apparaissent aussi en marqueurs verticaux sur tous les graphiques.",
overrides=[{"matcher": {"id": "byName", "options": "Quand"}, overrides=[{"matcher": {"id": "byName", "options": "Quand"},

View File

@@ -88,6 +88,10 @@ const MESURES = [
'sensor.airtria_mpii_v1_energy_from_ac_in_1_to_ac_out', 'sensor.airtria_mpii_v1_energy_from_ac_in_1_to_ac_out',
'sensor.airtria_mpii_v1_energy_from_ac_in_1_to_inverter', 'sensor.airtria_mpii_v1_energy_from_ac_in_1_to_inverter',
'sensor.edf_general_ok_energie_totale', 'sensor.edf_general_ok_energie_totale',
// Budget voiture de la nuit (30/09) : le budget publie par le bilan et le
// compteur de la borne, pour tracer « donne depuis 01:24 » contre le budget.
'input_number.evcs_balance_night_vehicle_budget_kwh',
'sensor.evcs_hq2239dnt7p_total_energy',
]; ];
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@@ -117,6 +121,8 @@ const TRANSITIONS_SUIVIES = [
['binary_sensor.victron_evcs_vehicle_connected', 'vehicule', 'Vehicule branche'], ['binary_sensor.victron_evcs_vehicle_connected', 'vehicule', 'Vehicule branche'],
['input_select.victron_evcs_vehicle', 'intervention','Vehicule selectionne'], ['input_select.victron_evcs_vehicle', 'intervention','Vehicule selectionne'],
['input_select.victron_evcs_strategy', 'intervention','Strategie'], ['input_select.victron_evcs_strategy', 'intervention','Strategie'],
['input_select.victron_evcs_night_charge_mode', 'intervention','Charge de la voiture la nuit'],
['input_text.victron_evcs_night_budget', 'vehicule', 'Budget voiture de la nuit fige (kWh|index borne)'],
['sensor.gx_device_ess_batterylife_state', 'ess', 'Etat BatteryLife de l ESS'], ['sensor.gx_device_ess_batterylife_state', 'ess', 'Etat BatteryLife de l ESS'],
['input_text.victron_charge_mode', 'ess', 'Mode Auto Charge Manager'], ['input_text.victron_charge_mode', 'ess', 'Mode Auto Charge Manager'],
['input_boolean.evcs_balance_grid_needed', 'bilan', 'Reseau necessaire'], ['input_boolean.evcs_balance_grid_needed', 'bilan', 'Reseau necessaire'],