Grafana : les deux bases se consultent, et les requetes sont verifiees

Trois tableaux de bord provisionnes depuis git, sur le modele de la regle R2
(le depot est la source de verite, l'interface ne peut pas les ecraser) :

  La nuit      SOC reel contre SOC exige par le bilan, et la marge entre les
               deux. C'est la question qui avait demande une nuit d'archeologie
               le 03/09.
  Le solaire   l'excedent (§36), la censure, et le mode declare par chacun des
               sept chargeurs (§37) — le signal le plus direct dont on dispose.
  Prevision    l'ecart heure par heure, avec la bande de censure dessous : une
               production sous la prevision peut vouloir dire mauvaise
               prevision OU absence de preneur.

Les evenements de la table `evenement` deviennent des marqueurs verticaux sur
tous les graphiques — une courbe sans ses evenements ne s'interprete pas.

tools/verifier-dashboards.mjs rejoue CHAQUE requete pour de vrai (SQL contre
PostgreSQL, Flux contre InfluxDB, macros Grafana substituees), annotations
comprises puisqu'elles s'executent sur tous les panneaux. Sans lui une requete
cassee ne se voit qu'a l'ecran, panneau par panneau. 19/19 au deploiement.

Port 3001 et non 3000 : sonde avant d'ecrire la ligne, quelque chose ecoute
deja sur 3000 — la lecon du 5432 deja pris par le PostgreSQL de DSM.

Connexion PostgreSQL par le role evcs_lecture : un tableau de bord ne doit pas
pouvoir ecrire dans la memoire. Aucun secret duplique, aucun secret commite :
le provisionnement les reference par $VARIABLE depuis les deux .env.

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-04 08:06:25 +02:00
parent 931e07eca9
commit fe029cfdff
11 changed files with 2264 additions and 0 deletions

View File

@@ -3438,3 +3438,92 @@ La premiere est plus propre — le role d'analyse reste strictement lecteur.
---
*Document mis a jour le : 04/09/2026 (~07:35) — InfluxDB en service, 249 entites, memoire complete*
## 45. Session du 04/09/2026 — Grafana : les deux bases se consultent
### Ce qu'il y a a consulter, et ce qu'il n'y a pas
Trois bases coexistent, et elles ne jouent pas le meme role :
| base | ou | contenu |
|---|---|---|
| PostgreSQL `evcs` | 10.10.10.22:**5433** | ce que le systeme CALCULE |
| InfluxDB `evcs` | 10.10.10.22:8086 | ce que HA OBSERVE, ~1 pt/s, 113 grandeurs |
| SQLite de HA | 10.10.10.17 | son historique brut (20 j) + statistiques (186 j) |
⚠️ Le PostgreSQL du port **5432** appartient a DSM. Ce n'est pas une base du
projet — la confusion « j'ai deux bases postgres » vient de la.
**La SQLite de HA n'est PAS branchee a Grafana, et c'est deliberé** : il
faudrait lire un fichier de 4,4 Go en mode WAL a travers un partage reseau
pendant que HA ecrit dedans (lecture incoherente garantie), pour un gain nul —
tout ce qui compte pour l'avenir arrive desormais dans InfluxDB a bien meilleure
resolution. L'historique de HA se consulte dans HA.
### Deploiement
Service `grafana` ajoute a `deploy/historisation/compose.yaml`, image
`grafana-oss:11.3.0`, publie sur **3001**.
⚠️ **3000 est deja occupe sur 10.10.10.22** — verifie par sonde AVANT d'ecrire
la ligne, exactement la lecon du 5432 deja pris par le PostgreSQL de DSM.
Telemetrie, verification de version et flux d'actualites desactives : cette
installation doit fonctionner pendant une coupure Internet d'orage (§32).
`bash preparer-grafana.sh` genere le mot de passe admin (genere, pas choisi),
l'affiche une fois, le laisse relisible dans le `.env` 600.
**Aucun secret n'est duplique** : le compose donne DEUX `env_file` a Grafana —
`.env` de la pile (mot de passe admin) et `../../.env` du depot
(`PG_LECTURE_PASSWORD`, `INFLUXDB_TOKEN`). Le provisionnement les reference par
`$VARIABLE`, donc les fichiers YAML de sources de donnees sont commitables tels
quels. C'etait le piege du POSTGRES_PASSWORD/PGPASSWORD tenus egaux a la main.
Connexion PostgreSQL par le role **`evcs_lecture`** : un tableau de bord ne doit
pas pouvoir ecrire dans la memoire.
### Provisionnement = git, comme les nodes n8n (regle R2)
`grafana/provisioning/` (sources + fournisseur) et `grafana/dashboards/`
(les trois JSON) sont montes en LECTURE SEULE, `allowUiUpdates: false`. Une
modification faite dans l'interface serait ecrasee au redemarrage, en silence —
meme raison que « JAMAIS editer l'UI n8n ». Le generateur rejouable est
`tools/gen-grafana-dashboards.py` ; Grafana relit le dossier toutes les 30 s.
« Save as… » reste libre pour explorer (copie personnelle dans General).
### `tools/verifier-dashboards.mjs` — l'equivalent des golden pour les tableaux
Rejoue **chaque** requete : SQL contre PostgreSQL, Flux contre InfluxDB, avec
les macros de Grafana (`$__timeFilter`, `$__timeFrom/To`, `v.timeRangeStart`,
`v.windowPeriod`) substituees comme il le fait. **Les annotations sont testees
aussi** : elles s'executent sur tous les panneaux, donc une annotation cassee
casse le tableau entier. Sortie non nulle au premier echec.
Sans lui, une requete cassee ne se voit qu'a l'ecran, panneau par panneau.
Etat au deploiement : **19/19**.
### Structure InfluxDB (relevee, a ne pas redecouvrir)
L'integration `influxdb` de HA n'ecrit PAS une mesure par entite :
- `_measurement` = **l'unite** (`W`, `A`, `V`, `%`, `kWh`, `°C`, `min`, `s`, `VA`, `Hz`, `°`)
pour tout capteur numerique ; tags `entity_id` (**sans le prefixe de domaine**),
`domain`, `installation` ; champ numerique `value`.
- `_measurement` = **l'entity_id complet** (`sensor.…`, `switch.…`) pour les
entites textuelles ; champ `state` = la chaine, `value` = 0/1 pour un switch.
Donc : `r._measurement == "W" and r.entity_id == "victron_pv_power_system" and r._field == "value"`,
et pour les modes des chargeurs `r._measurement =~ /operation_mode$/ and r._field == "state"`.
Les sept `*_operation_mode` (signal §37) et `switch.edf_general_ok_switch` sont
bien presents.
### Les trois tableaux
- **La nuit** (`evcs-nuit`) — SOC reel contre SOC exige par le bilan, **marge**
(rouge sous zero : la batterie ne passera pas), decisions en frise, puissances,
energie restant a couvrir, journal des evenements.
- **Le solaire** (`evcs-solaire`) — production / maison / voiture et surtout
**l'excedent** (§36), la censure avec son motif, **le mode declare par chacun
des sept chargeurs** (§37), et un panneau au pas natif InfluxDB pour montrer
ce que le pas de 60 s de PostgreSQL ne voit pas.
- **Prevision contre reel** (`evcs-prevision`) — l'ecart heure par heure entre
la prevision du matin meme et la production, **avec la bande de censure juste
dessous** : une production sous la prevision peut vouloir dire mauvaise
prevision OU absence de preneur, et seules les heures non bridees permettent
de juger. C'est le biais de forme identifie au §42, qui demande des semaines.
Les evenements apparaissent en marqueurs verticaux sur **tous** les graphiques.
---
*Document mis a jour le : 04/09/2026 (~08:30) — Grafana provisionne par git, 19/19 requetes verifiees*