diff --git a/INTERFACE.md b/INTERFACE.md index 625b249..b071e0e 100644 --- a/INTERFACE.md +++ b/INTERFACE.md @@ -51,14 +51,17 @@ ### `ChargingInfo` Configuration d'une borne EV. Seuls les champs marqués `(writable)` peuvent être modifiés via `SetChargingInfo` — les autres sont ignorés ou read-only. +> ⚠️ **`SetChargingInfo` REMPLACE l'objet entier.** Un champ writable absent de l'appel n'est pas +> préservé : il retombe sur son **défaut** (colonne ci-dessous). Voir `NymeaEnergy.SetChargingInfo`. + | Champ | Type | Writable | Description | |---|---|---|---| | `evChargerId` | `Uuid` | — | Identifiant de la borne (obligatoire dans SetChargingInfo) | | `assignedCarId` | `Uuid` | ✓ | Véhicule associé (optionnel) | | `chargingMode` | `ChargingMode` | ✓ | Mode de recharge | | `endDateTime` | `DateTime` | ✓ | Deadline cible (EcoWithTargetTime / EcoMinWithTargetTime) | -| `repeatDays` | `[Int]` | ✓ | Jours de répétition (0=Lun … 6=Dim, liste vide = pas de répétition) | -| `targetPercentage` | `Uint` | ✓ | Niveau batterie cible en % (défaut : 80) | +| `repeatDays` | `[Int]` | ✓ | Jours de répétition (**1=Lun … 7=Dim** ; hors [1, 7] → `EnergyErrorInvalidParameter`). Défaut : liste vide (pas de répétition) | +| `targetPercentage` | `Uint` | ✓ | Niveau batterie cible en %. Défaut : **80** ; > 100 → `EnergyErrorInvalidParameter` | | `chargingState` | `ChargingState` | — | État calculé (lecture seule) | | `spotMarketChargingEnabled` | `Bool` | ✓ | Activer la recharge sur spot market | | `dailySpotMarketPercentage` | `Uint` | ✓ | % de la charge quotidienne à faire en heures spot bon marché | @@ -260,7 +263,28 @@ Retourne la configuration de recharge de toutes les bornes, ou d'une seule. --- #### `NymeaEnergy.SetChargingInfo` -Met à jour la configuration d'une borne. Seuls les champs `USER true` sont modifiables (voir type `ChargingInfo`). Les autres champs sont ignorés. +Met à jour la configuration d'une borne. Seuls les champs `USER true` sont modifiables (voir type `ChargingInfo`) ; les autres (`chargingState`) sont ignorés. + +⚠️ **L'objet donné REMPLACE le stocké — l'appel n'est pas partiel.** Un champ writable omis +**retombe sur son défaut**, il n'est pas préservé : + +| Champ omis | Valeur obtenue | +|---|---| +| `assignedCarId` | aucune (null) | +| `chargingMode` | `ChargingModeNormal` | +| `endDateTime` | aucune | +| `repeatDays` | liste vide | +| `targetPercentage` | **80** | +| `spotMarketChargingEnabled` | `false` | +| `dailySpotMarketPercentage` | `0` | + +Et l'appel réussit : `EnergyErrorNoError`. Rien ne signale la perte. +**Constaté sur le banc `.75` le 2026-08-26** : un appel ne portant que `chargingMode` a porté +`targetPercentage` de 0 à 80. + +**Le geste correct est lire → modifier → renvoyer complet** : `GetChargingInfos`, changer le +champ voulu, réémettre l'objet entier. Le renvoyer tel quel est sûr — `chargingState`, en lecture +seule, est ignoré. **Params :** ```json @@ -956,6 +980,6 @@ L'optimizer reçoit les données de contexte (`SurplusData`) et retourne une `Ch - Les puissances sont en **Watts**, les courants en **Ampères**. - `phasePowerLimit` est en **Ampères** (par phase), pas en Watts. - `weighting` des `ScoreEntry` : 1.0 = créneau le moins cher, 0.0 = le plus cher. -- `SetChargingInfo` est partiel : seuls les champs présents sont appliqués, sauf `evChargerId` qui est toujours requis. +- `SetChargingInfo` **n'est PAS partiel** : l'objet remplace le stocké, et tout champ writable omis retombe sur son défaut (`targetPercentage` → 80, `repeatDays` → vide, …), sans erreur. Lire avec `GetChargingInfos`, modifier, renvoyer complet. `evChargerId` est toujours requis. - `currentPower` du root meter est **négatif** quand il y a surplus solaire (export réseau). - Le plugin fonctionne sans `powersync-optimizer` (mode Community, dégradé proprement).