fix: persist energy state on HA final write and unload #67
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "save-on-stop"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Supprime le résidu du Problème 1 : jusqu'à 2 min d'énergie accumulée par le stream étaient perdues à chaque redémarrage de HA.
Problème (constaté en production)
PR #65 a ajouté la persistance de
live_total_whet supprimé les reculs de milliers de Wh au redémarrage. Maisasync_save_energy_state()n'est appelé qu'à la fin de_async_update_data, soit une fois par cycle de poll (2 min). Tout ce que le stream WebSocket a intégré depuis la dernière sauvegarde est perdu au redémarrage.Trace live au reboot (injection réseau) :
Pertes mesurées selon la puissance de l'appareil : 0.6 Wh (injection) à 15.25 Wh (piscine, 2 min de forte conso).
Correctif
EVENT_HOMEASSISTANT_FINAL_WRITE: listener enregistré dansasync_setup_entry(encapsulé dansentry.async_on_unload) quiawait coordinator.async_save_energy_state(). C'est l'événement HA dédié à la dernière écriture disque.async_unload_entrysauvegarde après l'arrêt du stream (accumulateur figé), donc un simple reload de l'intégration ne perd rien non plus.coordinator.pyn'est pas touché —async_save_energy_state/async_load_energy_statesont réutilisées telles quelles.Pourquoi FINAL_WRITE et pas STOP
Vérifié dans la source HA (
helpers/storage.py) :Pendant
FINAL_WRITE,hass.statevautfinal_write(passtopping) → l'écriture est immédiate. AvecSTOPelle aurait été différée.Vérifié aussi dans
core.pyqueasync_stopfaitSTOP→FINAL_WRITE→CLOSEsans décharger les config entries : le listener est donc bien encore enregistré quand l'événement part, et il n'y a pas de double-sauvegarde à l'extinction (le chemin unload ne sert qu'au reload).Tests
2 nouveaux (
tests/test_init.py, TDD RED→GREEN) : sauvegarde surFINAL_WRITEet sauvegarde au déchargement, tous deux assertant que le store contient la valeur avancée (post-dernier-poll) et non l'ancienne. 91 tests au total, ruff + mypy clean.Périmètre
custom_components/comwatt/__init__.py+tests/test_init.pyuniquement. Basemain. Indépendante de la PR sœurfresh-energy-publish(qui touchecoordinator.py).WIP: fix: persist energy state on HA final write and unloadto fix: persist energy state on HA final write and unload