From cb114b62bd327bedc86fc360c436bb9b31edef06 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Sun, 6 Sep 2026 14:58:30 +0200 Subject: [PATCH] fix(tableau de bord): les DEUX providers, pas un seul MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Troisième tentative sur le même symptôme, et la bonne : le détail de consommation croise la TÉLÉMÉTRIE (la mesure) et la CONFIGURATION (le domaine), et ni l'un ni l'autre n'était attaché ailleurs que sur l'écran des rôles. Sur le tableau de bord, `telemetry` était null ET `entries` vide. Les deux correctifs précédents ne traitaient que la configuration — la moitié que le premier diagnostic avait désignée. C'est la recherche auto-confirmante en version « je n'ai regardé qu'un provider » : j'ai vérifié la partie que je venais d'écrire, jamais l'autre, et l'écran a redit trois fois la même chose. La donnée était pourtant sans ambiguïté à chaque étape : `chauffe-eau` → `ecs`, `pac-terrain` → `heating`, et `{powerW: 0, source: "meter"}` sur les deux. Rien ne manquait côté box ; tout manquait côté app, à l'endroit où on va chercher. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw --- lib/screens/dashboard_screen.dart | 44 ++++++++++++++++++------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index ab3acb2..69da71f 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -72,11 +72,9 @@ class _DashboardScreenState extends State { // à l'écran le 2026-09-06 — le correctif « charger au montage » n'a rien changé. // Accroché au tick, il se rattrape de lui-même dès que la box répond. final cfg = context.read(); - if (cfg.entries.isEmpty) { - cfg - ..attach(svc) - ..load(); - } + if (cfg.entries.isEmpty) cfg..attach(svc)..load(); + final tel = context.read(); + if (tel.telemetry == null) tel..attach(svc)..load(); // Les ratios de la box sont lus à côté du bilan, pas à sa place : ils ne couvrent pas // la même fenêtre, et c'est justement ce que l'écran doit pouvoir dire. final r = await svc.fetchEnergyRatios(); @@ -119,22 +117,32 @@ class _DashboardScreenState extends State { return out; } - /// Vrai une fois la configuration demandée avec une box joignable — évite de relancer - /// l'appel à chaque trame pendant que la réponse arrive. - bool _configDemandee = false; + /// Vrai une fois les deux providers demandés avec une box joignable — évite de relancer + /// les appels à chaque trame pendant que les réponses arrivent. + bool _chargesDemandees = false; - /// Le tick est à cinq minutes : trop lent pour un premier chargement. On se raccroche - /// donc aussi au moment où la box devient joignable, une seule fois. - void _assurerConfig(NymeaService service) { - if (_configDemandee || !service.isConnected) return; + /// **Les DEUX providers, pas un seul.** + /// + /// Le détail de consommation croise la télémétrie (la mesure) et la configuration (le + /// domaine). Or ni l'un ni l'autre n'était attaché ailleurs que sur l'écran des rôles : + /// sur le tableau de bord, `telemetry` était `null` **et** `entries` vide. + /// + /// Deux correctifs ont échoué avant celui-ci parce qu'ils ne traitaient que la + /// configuration — la moitié que le premier diagnostic avait désignée. Vérifier le + /// correctif sur la partie qu'on vient d'écrire ne dit rien de l'autre moitié : + /// c'est la recherche auto-confirmante, en version « je n'ai regardé qu'un provider ». + /// + /// Le tick à cinq minutes rattrape ; c'est ici que ça se joue au premier affichage. + void _assurerCharges(NymeaService service) { + if (_chargesDemandees || !service.isConnected) return; final cfg = context.read(); - if (cfg.entries.isNotEmpty) return; - _configDemandee = true; + final tel = context.read(); + if (cfg.entries.isNotEmpty && tel.telemetry != null) return; + _chargesDemandees = true; WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; - cfg - ..attach(service) - ..load(); + if (cfg.entries.isEmpty) cfg..attach(service)..load(); + if (tel.telemetry == null) tel..attach(service)..load(); }); } @@ -142,7 +150,7 @@ class _DashboardScreenState extends State { Widget build(BuildContext context) { return Consumer( builder: (context, service, _) { - _assurerConfig(service); + _assurerCharges(service); final data = service.energyData; return Scaffold( backgroundColor: EtmTokens.bgOf(context),