fix(énergie): la légende ne promet pas une courbe qui n'existe pas
« 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) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw
This commit is contained in:
parent
9c19791e9a
commit
67bc0ca7ea
@ -67,6 +67,17 @@ class _EnergyScreenState extends State<EnergyScreen> {
|
||||
List<PowerBalanceEntry> _data = [];
|
||||
List<HistoryEntry> _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<EnergyScreen> {
|
||||
],
|
||||
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<EnergyScreen> {
|
||||
/// 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<EnergyScreen> {
|
||||
'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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user