# CLAUDE.md — etm-powersync-energy-plugin-etm ## Rôle Energy manager nymea : rule-based surplus (Community) + load-management + connecteur vers l'optimiseur (Auto/Predict). ## Source de vérité [etm-powersync-docs / ARCHITECTURE.md](https://git.etm-powersync.fr/ETM-Schurig/etm-powersync-docs/src/branch/master/ARCHITECTURE.md). ## Structure (héritée de l'amont) `EnergyPluginNymea` est une coquille (`IID "io.nymea.EnergyPlugin"`, un `init()`). La logique vit dans des **managers** instanciés dans `init()` : `SmartChargingManager`, `spotmarket/`, `RootMeter`, `EvCharger`, `nymeaenergyjsonhandler` (API JSON-RPC). ## Frontière de licence (impérative) GPL-3. **Ne jamais coder ici** : MPC, prévision, Perez, masque d'ombrage, arbitrage. Ça appartient à `etm-powersync-optimizer`. ## Travail attendu - **Community** : ajuster le rule-based existant (surplus, hystérésis, priorités). Pas de réécriture from scratch — l'amont fournit la base. - **OptimizerManager** (nouveau manager, à côté des autres) : collecte l'état (RootMeter + things) → `POST /optimize` → applique les `setpoints` via le chemin de contrôle existant (`EvCharger`). **Transport pur, zéro maths.** - **Précédence** : optimiseur sain + planning frais → il pilote ; sinon → rule-based local. Le plugin fonctionne toujours seul. ## Règle de sécurité (non négociable) Le **load-management est prioritaire absolu** : toute consigne (y compris de l'optimiseur) qui ferait dépasser `ISOUSC` est **écrêtée localement après réception**. C'est une contrainte appliquée par le plugin, pas une suggestion envoyée à l'optimiseur. ## Contrat `OptimizerManager` implémente [interfaces/optimize.md](https://git.etm-powersync.fr/ETM-Schurig/etm-powersync-docs/src/branch/master/interfaces/optimize.md).