[Bloquant v1.0] Pas de déduplication de compte (async_set_unique_id) + store d'énergie global partagé entre entrées #79

Open
opened 2026-08-26 05:31:52 +00:00 by mat · 0 comments
Owner

Problème

Deux défauts complémentaires :

  1. Config flow (config_flow.py) : aucun appel à async_set_unique_id / _abort_if_unique_id_configured. Le même compte Comwatt peut être configuré N fois — la clé already_configured déclarée dans strings.json et translations/en.json est du code mort.
  2. Store (coordinator.py:28) : _STORE_KEY = "comwatt.energy_state" est global au domaine, pas clé par entry_id. Deux entrées (doublon du même compte ou 2 comptes Comwatt distincts) lisent/écrivent le même store ; chaque sauvegarde reconstruit tout le dict et écrase l'état d'énergie de l'autre entrée.

Risque

Corruption silencieuse de compteurs total_increasing (dernier écrivain gagne), entités dupliquées/rejetées, reauth croisés entre les entrées.

Recommandation (décision produit à trancher avant v1.0)

  • Option multi-comptes propre : await self.async_set_unique_id(user_input["username"].lower()) + self._abort_if_unique_id_configured() dans async_step_user, et clé de store par entry.entry_id.
  • Option mono-compte : "single_config_entry": true dans le manifest + quand même le unique_id.

Dans tous les cas, ajouter des tests : double soumission du même username → abort already_configured ; deux entrées simultanées → états d'énergie isolés.


Constaté lors de la review de code pré-v1.0 (v0.8.1).

## Problème Deux défauts complémentaires : 1. **Config flow** (`config_flow.py`) : aucun appel à `async_set_unique_id` / `_abort_if_unique_id_configured`. Le même compte Comwatt peut être configuré N fois — la clé `already_configured` déclarée dans `strings.json` et `translations/en.json` est du code mort. 2. **Store** (`coordinator.py:28`) : `_STORE_KEY = "comwatt.energy_state"` est **global au domaine**, pas clé par `entry_id`. Deux entrées (doublon du même compte ou 2 comptes Comwatt distincts) lisent/écrivent le même store ; chaque sauvegarde reconstruit tout le dict et **écrase** l'état d'énergie de l'autre entrée. ## Risque Corruption silencieuse de compteurs `total_increasing` (dernier écrivain gagne), entités dupliquées/rejetées, reauth croisés entre les entrées. ## Recommandation (décision produit à trancher avant v1.0) - Option multi-comptes propre : `await self.async_set_unique_id(user_input["username"].lower())` + `self._abort_if_unique_id_configured()` dans `async_step_user`, **et** clé de store par `entry.entry_id`. - Option mono-compte : `"single_config_entry": true` dans le manifest + quand même le unique_id. Dans tous les cas, ajouter des tests : double soumission du même username → abort `already_configured` ; deux entrées simultanées → états d'énergie isolés. --- Constaté lors de la review de code pré-v1.0 (v0.8.1).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
mat/homeassistant-comwatt#79
No description provided.