diff --git a/docs/captures/2026-09-08_ev-trois-modes.png b/docs/captures/2026-09-08_ev-trois-modes.png new file mode 100644 index 0000000..8ef0998 Binary files /dev/null and b/docs/captures/2026-09-08_ev-trois-modes.png differ diff --git a/lib/screens/energy/load_mechanism_screen.dart b/lib/screens/energy/load_mechanism_screen.dart index 137c4cc..e5c39e8 100644 --- a/lib/screens/energy/load_mechanism_screen.dart +++ b/lib/screens/energy/load_mechanism_screen.dart @@ -18,7 +18,6 @@ import '../../services/nymea_service.dart'; import '../../services/rpc_schema.dart'; import '../../theme/etm_tokens.dart'; import '../../widgets/load_cards.dart'; -import '../../widgets/ev_boost_button.dart'; import '../../widgets/ev_mode_buttons.dart'; import '../../widgets/garde_brouillon.dart'; import '../../widgets/schema_gated.dart'; @@ -510,28 +509,19 @@ class _SectionBorne extends StatelessWidget { onSetMode: (m) => service.setChargingInfo(mode: m, evChargerId: borne.thingId), ), - // **Le boost est une ACTION à côté du sélecteur, pas une quatrième position.** + // ── Pas de bouton de boost ici ──────────────────────────────────────── // - // Une dérogation se superpose au mode courant et s'efface ; elle ne le - // remplace pas. La mettre dans le sélecteur ferait croire qu'on en sort en - // choisissant autre chose, alors qu'elle finit d'elle-même. + // Décision de Patrick, 2026-09-08 : l'écran garde **trois modes et rien + // d'autre**. Le bouton d'action a été écrit puis retiré le jour même — j'avais + // lu « ouvre-le quand tu veux » dans un message du moteur comme un feu vert, + // alors que la décision produit était déjà prise en sens inverse. Un avis + // technique ne remplace pas un arbitrage de produit. // - // L'entrée de télémétrie vient de `loads[]` : `null` quand la borne n'est pas - // arbitrée en ce moment. Le bouton se tait alors — « pas d'entrée » n'est pas - // « pas de boost », c'est « on ne sait pas ». - if (_entreeTelemetrie(telemetry, borne.thingId) != null) ...[ - const SizedBox(height: 8), - EvBoostButton( - entry: _entreeTelemetrie(telemetry, borne.thingId), - onSet: ({required int durationS, double? targetWh}) => - service.setLoadDerogation( - loadId: _entreeTelemetrie(telemetry, borne.thingId)!.loadId, - durationS: durationS, - targetWh: targetWh), - onClear: () => service.clearLoadDerogation( - _entreeTelemetrie(telemetry, borne.thingId)!.loadId), - ), - ], + // Ce qui reste en place : `EvBoostButton`, `setLoadDerogation` / + // `clearLoadDerogation` et le modèle `Derogation`. Ce n'est pas de la donnée + // fabriquée — c'est la lecture d'un contrat réel, testée, qui ne s'affiche + // nulle part. Le jour où le boost revient, il se rebranche ici en trois + // lignes. if (borne.isUnmanaged) ...[ const SizedBox(height: 8), Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -2338,18 +2328,3 @@ class _SectionObligationState extends State<_SectionObligation> { } } -/// L'entrée de télémétrie d'une borne, cherchée sur l'identifiant **nu**. -/// -/// Les identifiants voyagent avec ou sans accolades selon l'appel (UI_data_contract §9) : -/// comparer les chaînes brutes ferait rater la borne une fois sur deux, et l'écran -/// conclurait « pas arbitrée » sur une borne qui l'est. -LoadTelemetryEntry? _entreeTelemetrie( - LoadTelemetryProvider telemetry, String thingId) { - String nu(String x) => - x.replaceAll('{', '').replaceAll('}', '').toLowerCase(); - final cible = nu(thingId); - for (final e in telemetry.telemetry?.loads ?? const []) { - if (nu(e.loadId) == cible) return e; - } - return null; -}