Les requetes s'executaient, les grandeurs etaient fausses
Trois defauts trouves en LISANT les tableaux, qu'aucune des 19 requetes ne signalait puisqu'elles s'executaient toutes sans erreur. 1. `historise-evcs.mjs` horodate chaque mesure avec son propre last_updated — le vrai instant de la mesure, et c'est le bon choix. Mais deux grandeurs ne partagent alors presque jamais le meme ts : 2656 lignes pour 2656 instants distincts. Mes GROUP BY ts rendaient une ligne par grandeur avec une seule colonne remplie, donc la courbe "Excedent" — la grandeur meme du §36 — etait VIDE sur les 2650 lignes. 2. Le service n'ecrit que les changements, donc un regroupement a la minute laisse des trous : la difference n'existait que 73 minutes sur 434. Report de la derniere valeur connue, ce que fait aussi le controleur en temps reel. 430/435 apres. 3. L'energie horaire par sum(valeur)/60 suppose 60 echantillons par heure ; il y en a eu 26 a 47. Integration ponderee par la duree, plafonnee a 300 s pour qu'un arret du service n'extrapole pas une valeur perimee. ~9 % d'ecart. Le "25 a 58 %" que j'avais d'abord annonce etait faux : il comparait la somme a la moyenne, qui ignore la duree. Plus deux corrections d'affichage : la colonne `jour` s'affichait "2026-09-04 02:00:00" (date nue rendue comme instant UTC), et le decompte des chargeurs MPPT est de six entites publiees, pas sept. Lecon : verifier-dashboards.mjs prouve qu'une requete s'EXECUTE, pas qu'elle rend la grandeur voulue — une colonne integralement nulle passe sans un mot. Ce sont les courbes regardees a l'ecran qui ont attrape les trois. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
@@ -74,7 +74,7 @@
|
||||
"format": "time_series",
|
||||
"rawQuery": true,
|
||||
"editorMode": "code",
|
||||
"rawSql": "SELECT ts AS time,\n max(valeur) FILTER (WHERE cle = 'sensor.victron_pv_power_system') AS \"Production\",\n max(valeur) FILTER (WHERE cle = 'sensor.victron_consumption_power_l1') AS \"Maison\",\n max(valeur) FILTER (WHERE cle = 'sensor.victron_evcs_ac_power') AS \"Voiture\",\n max(valeur) FILTER (WHERE cle = 'sensor.victron_pv_power_system')\n - max(valeur) FILTER (WHERE cle = 'sensor.victron_consumption_power_l1') AS \"Excedent\"\nFROM mesure\nWHERE $__timeFilter(ts)\nGROUP BY ts\nORDER BY ts"
|
||||
"rawSql": "WITH par_minute AS (\n SELECT date_trunc('minute', ts) AS t,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_pv_power_system') AS Production,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_consumption_power_l1') AS Maison,\n avg(valeur) FILTER (WHERE cle = 'sensor.victron_evcs_ac_power') AS Voiture\n FROM mesure WHERE $__timeFilter(ts) GROUP BY 1\n),\npaliers AS (\n SELECT t, Production, Maison, Voiture,\n count(Production) OVER (ORDER BY t) AS g_Production,\n count(Maison) OVER (ORDER BY t) AS g_Maison,\n count(Voiture) OVER (ORDER BY t) AS g_Voiture\n FROM par_minute\n),\nreport AS (\n SELECT t,\n first_value(Production) OVER (PARTITION BY g_Production ORDER BY t) AS Production,\n first_value(Maison) OVER (PARTITION BY g_Maison ORDER BY t) AS Maison,\n first_value(Voiture) OVER (PARTITION BY g_Voiture ORDER BY t) AS Voiture\n FROM paliers\n)\nSELECT t AS time,\n Production AS \"Production\",\n Maison AS \"Maison\",\n Voiture AS \"Voiture\",\n Production - Maison AS \"Excedent\"\nFROM report ORDER BY t"
|
||||
}
|
||||
],
|
||||
"gridPos": {
|
||||
@@ -270,7 +270,7 @@
|
||||
{
|
||||
"type": "state-timeline",
|
||||
"title": "Ce que les chargeurs declarent eux-memes",
|
||||
"description": "mppt_active = ce chargeur donne tout ce qu'il peut. voltage_current_limited ou off = il se retient, faute de preneur. Le 03/09 ces sept capteurs ont bascule 24 minutes avant le drapeau du bilan — c'est le signal le plus direct dont on dispose.",
|
||||
"description": "mppt_active = ce chargeur donne tout ce qu'il peut. voltage_current_limited ou off = il se retient, faute de preneur. Le 03/09 ces capteurs ont bascule 24 minutes avant le drapeau du bilan — c'est le signal le plus direct dont on dispose.",
|
||||
"datasource": {
|
||||
"type": "influxdb",
|
||||
"uid": "evcs-influx"
|
||||
@@ -357,7 +357,7 @@
|
||||
"format": "time_series",
|
||||
"rawQuery": true,
|
||||
"editorMode": "code",
|
||||
"rawSql": "SELECT ts AS time,\n max(valeur) FILTER (WHERE cle = 'sensor.victron_battery_soc') AS \"SOC\"\nFROM mesure WHERE $__timeFilter(ts) GROUP BY ts ORDER BY ts"
|
||||
"rawSql": "SELECT date_trunc('minute', ts) AS time, avg(valeur) AS \"SOC\"\nFROM mesure WHERE cle = 'sensor.victron_battery_soc'\n AND $__timeFilter(ts) GROUP BY 1 ORDER BY 1"
|
||||
},
|
||||
{
|
||||
"refId": "B",
|
||||
@@ -368,7 +368,7 @@
|
||||
"format": "time_series",
|
||||
"rawQuery": true,
|
||||
"editorMode": "code",
|
||||
"rawSql": "SELECT ts AS time,\n max(valeur) FILTER (WHERE cle = 'sensor.victron_battery_current') AS \"Courant\"\nFROM mesure WHERE $__timeFilter(ts) GROUP BY ts ORDER BY ts"
|
||||
"rawSql": "SELECT date_trunc('minute', ts) AS time, avg(valeur) AS \"Courant\"\nFROM mesure WHERE cle = 'sensor.victron_battery_current'\n AND $__timeFilter(ts) GROUP BY 1 ORDER BY 1"
|
||||
}
|
||||
],
|
||||
"gridPos": {
|
||||
|
||||
Reference in New Issue
Block a user