From 67bc0ca7eaa56b0a58e19598a1742e9d949d61d4 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Tue, 8 Sep 2026 10:43:12 +0200 Subject: [PATCH] =?UTF-8?q?fix(=C3=A9nergie):=20la=20l=C3=A9gende=20ne=20p?= =?UTF-8?q?romet=20pas=20une=20courbe=20qui=20n'existe=20pas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit « SOC % » figurait en dur dans la légende du premier graphe. Sur une installation sans batterie — celle du banc — l'écran annonçait donc une série qu'aucune donnée ne pouvait remplir. Même défaut que partout ailleurs (montrer ce qu'on n'a pas), pris par la légende au lieu du tracé. Le titre, le sous-titre et l'entrée de légende suivent maintenant la présence d'une batterie, et la note d'absence passe SOUS ce graphe-ci : c'est là que le SOC aurait été tracé, donc c'est là qu'il manque. `_sansBatterie` exige que les Things soient chargés : tant qu'ils ne le sont pas, « pas de batterie » et « on ne sait pas encore » sont indiscernables, et annoncer l'absence trop tôt serait une absence côté APP présentée comme une absence côté BOX. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw --- lib/screens/energy_screen.dart | 50 +++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/lib/screens/energy_screen.dart b/lib/screens/energy_screen.dart index 0dc5704..9166aa2 100644 --- a/lib/screens/energy_screen.dart +++ b/lib/screens/energy_screen.dart @@ -67,6 +67,17 @@ class _EnergyScreenState extends State { List _data = []; List _socData = []; ConsumerHistory _conso = ConsumerHistory.vide; + + /// Vrai quand la box a livré ses Things ET qu'aucun ne porte de batterie. + /// + /// Les deux moitiés comptent : tant que les Things ne sont pas chargés, « pas de + /// batterie » et « on ne sait pas encore » sont indiscernables, et annoncer l'absence + /// trop tôt serait une absence côté APP présentée comme une absence côté BOX. + bool get _sansBatterie => + (_nymeaService?.thingsLoaded ?? false) && + _nymeaService?.batterySOCSource == null; + + bool get _aUneBatterie => _nymeaService?.batterySOCSource != null; bool _loading = true; bool _noData = false; DateTime? _selectedDate; @@ -264,21 +275,42 @@ class _EnergyScreenState extends State { ], const SizedBox(height: 16), - // Graphe Puissances · SOC % + // Graphe Puissances (· SOC % quand il y a une batterie) + // + // ⚠️ **La légende ne promet pas une courbe qui n'existe pas.** + // « SOC % » y figurait en dur : sur une installation sans batterie, + // l'écran annonçait donc une série qu'aucune donnée ne pouvait + // remplir. Vu à l'écran le 2026-09-08 — c'est le même défaut que + // partout ailleurs (montrer ce qu'on n'a pas), pris par la légende + // au lieu du tracé. _EtmChartCard( - title: 'Puissances · SOC %', - subtitle: 'kW (gauche) · % batterie (droite)', + title: _aUneBatterie + ? 'Puissances · SOC %' + : 'Puissances', + subtitle: _aUneBatterie + ? 'kW (gauche) · % batterie (droite)' + : 'kW', legend: [ _LegendDot(EtmTokens.amber, 'Production'), _LegendDot(EtmTokens.blue, 'Consommation'), _LegendDot(EtmTokens.green, 'Autoconso', dashed: true), - _LegendDot(EtmTokens.ev, 'SOC %', dashed: true), + if (_aUneBatterie) + _LegendDot(EtmTokens.ev, 'SOC %', dashed: true), ], height: 220, loading: _loading, noData: _noData, child: _buildLineChart(), ), + // La note d'absence de batterie va SOUS ce graphe-ci : c'est ici que + // le SOC aurait été tracé, donc c'est ici qu'il manque. + if (_sansBatterie) + const _NoteEcran( + icon: Icons.battery_unknown_rounded, + texte: 'Aucune batterie sur cette installation : ni charge, ni ' + 'décharge, ni état de charge. Rien n\'est masqué — il n\'y a ' + 'rien à tracer.', + ), const SizedBox(height: 14), // Graphe : qui consomme @@ -645,9 +677,7 @@ class _EnergyScreenState extends State { /// n'entre pas dans `GetThingPowerLogs` — alors que sa puissance instantanée est lisible. Widget _notesConsommateurs() { final manquants = _conso.sansHistorique; - final sansBatterie = - (_nymeaService?.thingsLoaded ?? false) && _nymeaService?.batterySOCSource == null; - if (manquants.isEmpty && !sansBatterie && !_conso.signeIndetermine) { + if (manquants.isEmpty && !_conso.signeIndetermine) { return const SizedBox.shrink(); } return Padding( @@ -661,12 +691,6 @@ class _EnergyScreenState extends State { 'publie pas de comptage. Sa puissance instantanée reste lisible.' : '${manquants.join(', ')} : pas d\'historique de puissance.', ), - if (sansBatterie) - _NoteEcran( - icon: Icons.battery_unknown_rounded, - texte: 'Aucune batterie sur cette installation : ni charge, ni décharge, ' - 'ni état de charge. Rien n\'est masqué — il n\'y a rien à tracer.', - ), if (_conso.signeIndetermine) _NoteEcran( icon: Icons.help_outline_rounded,