Front : la courbe relie deux points de part et d'autre d'un trou et fait passer une panne pour une droite #211

Closed
opened 2026-09-08 14:35:40 +00:00 by lenaic · 0 comments
Owner

Exigence couverte

EF-04 · la valeur brute et la méthode restent lisibles à côté. EF-11 · vue d'un site.

Épreuve servie

EC05 · Data, ETL et BI

Charge estimée

une demi-journée

Ce qu'on veut obtenir

Une heure sans mesure disparaît de la courbe au lieu d'y creuser un trou, et le trait relie les deux heures qui l'encadrent. Une panne de trois heures se lit comme une droite.

Mesuré en production ce matin :

site_id   heure sans moyenne
SITE001   2026-09-08 08:00
SITE002   2026-09-08 08:00
SITE004   2026-09-08 08:00
SITE006   2026-09-08 08:00
SITE007   2026-09-08 08:00

Cinq sites sur sept. Leur courbe passe de 07:00 à 09:00 par un segment droit, et l'axe des abscisses n'affiche même pas 08:00 : les étiquettes sont construites depuis les points reçus, donc l'axe devient silencieusement irrégulier. Rien à l'écran ne dit qu'il manque une heure.

Deux causes, une de chaque côté.

SQL_SERIE_HEURE et SQL_SERIE_JOUR portent and h.moyenne_kw is not null. Le seau existe dans mesure_horaire, sa moyenne est nulle parce que toutes ses minutes ont été écartées, et la requête le supprime de la réponse au lieu de le rendre avec une valeur nulle.

Côté front, GraphiqueSite.vue construit labels et data depuis les points reçus. Un point absent n'est pas un trou, c'est un point qui n'existe pas : Chart.js relie ses voisins et l'axe se resserre.

C'est le même défaut que le #199, un cran plus loin. Le #199 a corrigé la tuile et la fiche ; la courbe est restée. Elle était explicitement hors périmètre, avec la raison suivante : « un seau vide de mesure_horaire est une heure sans donnée, pas une panne d'une minute ». C'était vrai et ça ne suffit pas : une heure sans donnée mérite aussi d'être vue.

Critères d'acceptation

  • Les deux requêtes de série rendent le seau dont la moyenne est nulle, avec moyenne_kw à null, au lieu de l'écarter
  • Le contrat rend un point par heure de la fenêtre, valeur nulle comprise, et le schéma le déclare float | None
  • GraphiqueSite.vue et GraphiqueConsommation.vue ne relient pas deux points de part et d'autre d'une valeur nulle (spanGaps: false)
  • L'axe des abscisses porte toutes les heures de la fenêtre, y compris celles sans valeur
  • La table sous le graphique affiche « — » sur ces heures, jamais un zéro
  • Un cas de test monte une fenêtre à trou et vérifie que le point nul traverse jusqu'au composant

Comment on le vérifie

tests/unit/api/test_dashboard_parc.py : une fenêtre dont une heure n'a pas de moyenne rend un point de plus, avec moyenne_kw nul, et non un point de moins.

Côté front, GraphiqueSite.test.js : une série portant un null au milieu produit un jeu Chart.js avec spanGaps à faux.

À l'écran, sur SITE001 en fenêtre 24 h : le creux de 08:00 doit se voir.

Hors périmètre

Le rattrapage des heures manquantes. Ce ticket les MONTRE, il ne les comble pas — combler serait exactement l'erreur que le #199 a corrigée ailleurs.

La fraîcheur de l'agrégat, qui est le #205.

### Exigence couverte EF-04 · la valeur brute et la méthode restent lisibles à côté. EF-11 · vue d'un site. ### Épreuve servie EC05 · Data, ETL et BI ### Charge estimée une demi-journée ### Ce qu'on veut obtenir Une heure sans mesure disparaît de la courbe au lieu d'y creuser un trou, et le trait relie les deux heures qui l'encadrent. Une panne de trois heures se lit comme une droite. Mesuré en production ce matin : ``` site_id heure sans moyenne SITE001 2026-09-08 08:00 SITE002 2026-09-08 08:00 SITE004 2026-09-08 08:00 SITE006 2026-09-08 08:00 SITE007 2026-09-08 08:00 ``` Cinq sites sur sept. Leur courbe passe de 07:00 à 09:00 par un segment droit, et l'axe des abscisses n'affiche même pas 08:00 : les étiquettes sont construites depuis les points reçus, donc l'axe devient silencieusement irrégulier. Rien à l'écran ne dit qu'il manque une heure. Deux causes, une de chaque côté. `SQL_SERIE_HEURE` et `SQL_SERIE_JOUR` portent `and h.moyenne_kw is not null`. Le seau existe dans `mesure_horaire`, sa moyenne est nulle parce que toutes ses minutes ont été écartées, et la requête le supprime de la réponse au lieu de le rendre avec une valeur nulle. Côté front, `GraphiqueSite.vue` construit `labels` et `data` depuis les points reçus. Un point absent n'est pas un trou, c'est un point qui n'existe pas : Chart.js relie ses voisins et l'axe se resserre. C'est le même défaut que le #199, un cran plus loin. Le #199 a corrigé la tuile et la fiche ; la courbe est restée. Elle était explicitement hors périmètre, avec la raison suivante : « un seau vide de `mesure_horaire` est une heure sans donnée, pas une panne d'une minute ». C'était vrai et ça ne suffit pas : une heure sans donnée mérite aussi d'être vue. ### Critères d'acceptation - [ ] Les deux requêtes de série rendent le seau dont la moyenne est nulle, avec `moyenne_kw` à `null`, au lieu de l'écarter - [ ] Le contrat rend un point par heure de la fenêtre, valeur nulle comprise, et le schéma le déclare `float | None` - [ ] `GraphiqueSite.vue` et `GraphiqueConsommation.vue` ne relient pas deux points de part et d'autre d'une valeur nulle (`spanGaps: false`) - [ ] L'axe des abscisses porte toutes les heures de la fenêtre, y compris celles sans valeur - [ ] La table sous le graphique affiche « — » sur ces heures, jamais un zéro - [ ] Un cas de test monte une fenêtre à trou et vérifie que le point nul traverse jusqu'au composant ### Comment on le vérifie `tests/unit/api/test_dashboard_parc.py` : une fenêtre dont une heure n'a pas de moyenne rend un point de plus, avec `moyenne_kw` nul, et non un point de moins. Côté front, `GraphiqueSite.test.js` : une série portant un `null` au milieu produit un jeu Chart.js avec `spanGaps` à faux. À l'écran, sur SITE001 en fenêtre 24 h : le creux de 08:00 doit se voir. ### Hors périmètre Le rattrapage des heures manquantes. Ce ticket les MONTRE, il ne les comble pas — combler serait exactement l'erreur que le #199 a corrigée ailleurs. La fraîcheur de l'agrégat, qui est le #205.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision#211
No description provided.