Le fil conducteur des six commits du jour tient en une phrase : l'app ne recalcule pas ce que la box publie, et n'anticipe pas ce qu'elle n'a pas encore publié. Le point à retenir est le seuil de réserve batterie : 0,9 en usine, batterie du banc à 50 %. Quand la règle montera dans le budget, `.75` ne pilotera plus rien par grand soleil, sans erreur ni panne. Le RECAP le dit, et le TODO garde les trois crochets laissés ouverts — dont le `Set` volontairement vide qui attend le code du moteur. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HajXLUczEyZd22JeewRfff
56 lines
2.8 KiB
Markdown
56 lines
2.8 KiB
Markdown
# TODO — ETM PowerSync App
|
|
|
|
## Charges pilotables — ce qui attend la box (2026-08-26)
|
|
|
|
- [ ] **`kCodesReserveBatterie`** — le `Set` est volontairement VIDE dans
|
|
`lib/services/telemetry_text.dart`. Y mettre le code du motif « budget annulé par la réserve
|
|
batterie » **quand le moteur le publiera**, pas avant : deviner son nom produirait un
|
|
affichage qui ne se déclenche jamais.
|
|
- [ ] **`minPowerW == null` sans véhicule branché** — couvert en test unitaire
|
|
(`test/ev_runtime_test.dart`), **pas exercé sur appareil** : la borne n'entre pas dans
|
|
`loads[]` avant `3g`. À reprendre quand l'arbitrage prendra la recharge en charge.
|
|
- [ ] **Réserve batterie — portée élargie.** Le jour où le seuil gouverne tout le budget,
|
|
reprendre le texte de `BatteryReserveCard` : il annonce aujourd'hui un futur, il devra
|
|
décrire un présent.
|
|
- [ ] ~~Zones~~ — `ac_screen.dart` est de la donnée fictive et `.75` n'en déclare aucune.
|
|
**Décidé : à ne pas entreprendre.**
|
|
|
|
## En cours / priorité haute
|
|
|
|
- [ ] **TariffProvider — connexion RPC réelle**
|
|
- `load()` appelle encore un `Future.delayed` fictif
|
|
- Brancher sur nymea JSON-RPC pour récupérer les prix live (ENTSO-E, Tibber, etc.)
|
|
|
|
- [ ] **EnergySetupProvider — persistance**
|
|
- Les assignations de rôles (EV, PAC, batterie…) ne survivent pas au redémarrage
|
|
- Sérialiser en SharedPreferences ou JSON local
|
|
|
|
- [ ] **SchedulerProvider — exécution réelle**
|
|
- `forceRecalc()` ne fait rien pour l'instant
|
|
- Brancher sur l'API nymea Energy Scheduler (si disponible)
|
|
|
|
## Screens à implémenter
|
|
|
|
- [ ] **DeveloperScreen** — logs, introspection JSON-RPC, test ping nymea
|
|
- [ ] **AboutScreen** — version app, version nymea, licences
|
|
- [ ] **SystemSettingsScreen** — adresse serveur nymea, port, transport (TCP/WS)
|
|
|
|
## Amélioration UX
|
|
|
|
- [ ] **Timeline** — remplacer la simulation bell-curve par les vraies créneaux du scheduler nymea
|
|
- [ ] **RoleConfigFlow Step 3** — test de connexion sur RPC réel au lieu du délai simulé
|
|
- [ ] **InstallerModeProvider** — persister le hash PIN dans SharedPreferences (actuellement en mémoire)
|
|
- [ ] **AppSettingsProvider** — persister les préférences (thème, densité, écrans actifs) dans SharedPreferences
|
|
|
|
## Intégration nymea live
|
|
|
|
- [ ] Mapping `EmsRole → nymea thingClass` pour les installations réelles
|
|
- [ ] Vérifier les interfaces nymea sur serveur réel (comparer avec `docs/nymea_integrations.md`)
|
|
- [ ] `Energy.GetSchedule` / `Energy.SetSchedule` si l'API le supporte
|
|
|
|
## Technique / dette
|
|
|
|
- [ ] Ajouter des tests unitaires pour `TariffProvider` et `EnergySetupProvider`
|
|
- [ ] Gérer le cas où `NymeaService.thingClasses` est vide en mode live (classes non chargées)
|
|
- [ ] Revoir `_Step1ThingList` : passer en `context.watch` pour réactivité si les things changent
|