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,