Toutes les évolutions notables de Pool Control sont consignées dans ce fichier.
Le format est inspiré de Keep a Changelog 1.1.0 et le projet suit Semantic Versioning.
- Synoptique 8 étapes dans le panneau, aligné sur un schéma 3D photoréaliste de référence :
- Aspiration via skimmer
- Aspiration via bonde de fond
- Pompe de filtration
- Filtre à sable (vanne 6 voies, manette latérale)
- Pompe à chaleur via by-pass (nouveau) — boîtier extérieur avec hélice frontale + 2 vannes 3 voies bleues qui matérialisent le by-pass
- Analyse et injection pH (sonde dans le tuyau + boîtier mural avec écran + bidon)
- Analyse et injection chlore (idem séparé du pH)
- Retour piscine
- Champ optionnel
heatPumpdans le config flow et l'options flow (sélecteur d'entité, domainesswitch,input_boolean,climate). Permet de relier une PAC pilotée par une autre intégration HA pour visualiser son état dans le synoptique. - Animation contextuelle PAC :
- PAC non configurée → boîtier représenté en transparence (
.pac-housingopacity 0.55), eau passe par le by-pass court-circuit (.flow-bypass). - PAC configurée mais OFF → boîtier opaque, eau toujours par le by-pass.
- PAC configurée et ON → hélice tourne (
.pac-rotor), particules d'eau passent par le chemin PAC (.flow-pac), le by-pass est éteint visuellement.
- PAC non configurée → boîtier représenté en transparence (
- Frise pédagogique en bas du SVG avec les 8 étapes représentées en cercles bleus numérotés et reliés par des flèches, sur fond blanc translucide.
- Encart de légende en haut-gauche avec la liste numérotée 1–8 des étapes (style identique à l'image de référence).
- Badge « Sens de circulation de l'eau » en bas à gauche.
manifest.json:version0.0.26→0.0.27.frontend/pool_control_panel.js:viewBoxagrandi de1200×720à1400×960pour accueillir tous les éléments + frise + encart légende.- Ajout des hooks
_heatPumpEntity(constructeur + setterhass),_isHeatPumpRunning(), et toggle des classes.heat-pump-active/.heat-pump-configuredsur le SVG dans_update(). - Nouveaux keyframes CSS :
flowPac,flowBypass,.pac-rotor(rotation lente 1.6s),.pac-housing(transition d'opacité).prefers-reduced-motioncouvre les nouvelles animations. - Réécriture complète de
_svgMarkup(): décor (mur béton, sol carrelé, néon plafond, coffret électrique mural, bassin en perspective cavalière, galets extérieurs), tuyauterie redessinée avec les 5 segments d'écoulement (flow-asp,flow-pf,flow-fr,flow-bypassouflow-pacselon état,flow-ret), labels chips et numéros stylisés.
config_flow.pyetoptions_flow.py: nouveauvol.Optional("heatPump")dans le schéma user / step user, sans rupture pour les installations existantes (vol.Optionalne casse rien).frontend.py: transmetheat_pump_entityau Web Component viapanel.config.- Traductions FR/EN +
strings.json: libellé « Pompe à chaleur (optionnel) » / « Heat pump (optional) » dansconfig.step.user.data.heatPumpetoptions.step.user.data.heatPump.
- Les installations 0.0.26 sans PAC continuent à fonctionner sans aucune action utilisateur (
heatPump = None). - Aucune logique métier Pool Control n'est modifiée — la PAC n'est pas pilotée par l'intégration, elle est juste visualisée dans le panneau.
- 361 tests passent sans modification.
- Pour ajouter une PAC à un setup existant : Paramètres → Pool Control → Configurer → Configuration des entités → renseigner « Pompe à chaleur (optionnel) » → Sauvegarder. Le panneau se recharge automatiquement et reflète l'état de l'entité choisie.
- Refonte du synoptique hydraulique dans le panneau, inspirée d'un schéma 3D photoréaliste. Le SVG est repensé en perspective semi-isométrique sur fond sol/bassin, et passe de 4 à 6 éléments illustrés :
- Skimmer + Bonde de fond (aspirations multiples côté bassin),
- Pompe avec préfiltre, moteur arrière et rotor qui tourne pendant la filtration,
- Filtre à sable beige avec vanne 6 voies (manette latérale),
- Traitement pH (boîtier bleu doseur + bidon « pH » étiqueté),
- Traitement chlore (boîtier jaune doseur + bidon « Chlore » étiqueté),
- Refoulement (buse de retour au bassin via tuyau qui longe le sol).
- Tuyauterie PVC retracée avec gradients gris foncé pour évoquer le PVC, raccordée précisément à chaque élément. Les flèches d'écoulement (water particles) suivent désormais 4 segments cohérents :
- Aspiration : skimmer + bonde de fond → pompe
- Refoulement pompe → filtre (entrée vanne 6 voies)
- Filtre → doseurs pH puis chlore
- Retour au bassin par le sol jusqu'à la buse de refoulement
- Légende numérotée (1–6) intégrée dans le SVG en bas à gauche, sur fond
#0b1620translucide, accompagnée de pastilles ambrées sur chaque élément du schéma. - Labels chips (« Skimmer », « Bonde de fond », « Pompe », « Filtre à sable », « Traitement pH », « Traitement chlore ») en pill
rgbasombre placés directement sur le SVG. viewBoxdu SVG passé de0 0 1100 560à0 0 1200 720pour accueillir tous les éléments avec respiration.transform-origindu.pump-rotorajusté à la nouvelle position du rotor (600px 540px).
- Aucun changement Python :
frontend.py,__init__.py,manifest.json(hors version), tests et logique métier sont strictement identiques. - Aucun changement de la logique JS du Web Component :
set hass,_update,_isFiltrationRunning,_controlMode,_backwashStep,_callService,_pressButtonsont inchangés. Les hooks d'animation (.running,.stopped,.backwash-active,.pump-rotor,.flow-asp/pf/fr/ret,#status-led-text,.filtre-rect) sont préservés. - 361 tests passent sans modification.
- Aucune action utilisateur requise. Le nouveau synoptique apparaît automatiquement après upgrade HACS et redémarrage HA.
- Refonte UI complète du panneau latéral : passage à un style dashboard moderne avec glassmorphism, hiérarchie typographique soignée, transitions fluides et mise en page restructurée.
- Cards en glassmorphism (
backdrop-filter: blur(24px) saturate(180%), ombres profondes, bordure haute éclairée pour effet de profondeur). - Background du panneau en gradient radial deux passes (cyan eau + amber air) sur fond deep navy, qui se replie sur la variable HA
--primary-background-coloren thème clair. - Hiérarchie typo : températures en chiffres
44px weight 200, statut principal en22px weight 300, titres de sections en11px UPPERCASE letter-spacing 0.18em. Échelle d'espacements 4px (8/12/16/24/32). - Layout desktop corrigé via une grille 12 colonnes : Hero (8) + Modes (4) en haut, puis Schéma (8) + stack Surpresseur/Lavage (4). Ne laisse plus de zone vide à droite comme la 0.0.23.
- Toggle groups « pill connectée » pour Activation (Actif/Auto/Inactif) et Saison (Saison/Hivernage), avec glow contextuel sur le bouton actif (cyan / amber / bleu).
- Transitions Material
cubic-bezier(0.4, 0, 0.2, 1)à 160 / 220 / 320 ms. Animation d'entrée cascadée sur les cards à chaque premier render. - Bandeau d'instruction de vanne (glassmorphism amber, pulsation douce par
box-shadow) avec icône 👉 désormais en pseudo-élément::beforeséparé du texte. - Header sticky avec backdrop-filter, sous-titre « TABLEAU DE BORD », et badge de statut en pill arrondie avec glow contextuel selon l'état (vert / bleu / gris / neutre).
- Cards en glassmorphism (
- Aucun changement Python :
frontend.py,__init__.py,manifest.json(hors version), tests, traductions et logique métier sont strictement identiques. - Aucun changement de la logique JS du Web Component :
set hass,_update,_isFiltrationRunning,_controlMode,_backwashStep,_callService,_pressButtonet l'ensemble du SVG hydraulique sont inchangés. Tous lesentity_idciblés et tous les IDs DOM internes du panneau sont préservés. - 361 tests passent sans modification.
- Aucune action utilisateur requise : le nouveau panneau est servi automatiquement après upgrade HACS et redémarrage HA. La sidebar et l'URL
/pool-control[-<slug>]ne changent pas.
-
Panneau latéral compatible multi-instance. La 0.0.23 enregistrait toujours le panneau sur l'URL fixe
/pool-controlet avec le titre figé « Pool Control ». Avec plusieurs ConfigEntry, la première gagnait, les suivantes étaient ignorées, et décharger une instance retirait le panneau pour toutes les autres. La 0.0.24 calcule désormais l'URL et le titre par instance :- l'instance par défaut (slug
pool_control) garde l'URL historique/pool-controlet le titre « Pool Control » (pas de rupture pour les bookmarks), - chaque instance supplémentaire reçoit
/pool-control-<slug>(ex./pool-control-piscine,/pool-control-spa) et le titre « Pool Control · ».
async_unregister_panelne touche plus qu'au panneau de l'instance déchargée. - l'instance par défaut (slug
-
Appel
hass.callServicecôté JS conforme à la signature standard. Le 4ᵉ paramètretargetétait passé en plus duserviceData; certaines versions du frontend HA l'ignoraient et déclenchaient le service sansentity_id, rendant les boutons inopérants. Leentity_idest désormais inclus directement dans leserviceData(3 paramètres seulement).
manifest.json:version0.0.23→0.0.24.frontend.py: nouvelles helpers_panel_url_path(slug)et_sidebar_title(slug, entry_title).async_register_panel(hass, slug, entry_title, config_entry_data)etasync_unregister_panel(hass, slug)prennent désormais le slug d'instance en argument.__init__.py: nouvelle helper_slug_from_entry(entry)qui calcule le slug depuisentry.unique_id(avec fallbackslugify(entry.title)). Appliquée dansasync_setup_entry,async_unload_entryet_async_update_panel.frontend/pool_control_panel.js:_callServiceutilise(domain, service, { entity_id: target })au lieu de l'ancienne forme à 4 arguments.tests/test_frontend.py: 5 tests adaptés à la nouvelle signature, dont un test de non-régression vérifiant qu'une 2ᵉ instance reçoit une URL et un titre distincts, et qu'async_unregister_panelne touche pas aux autres instances. Réutilise désormais la fixture communemock_hass(étendue avec les attributshttprequis) au lieu de redéfinir une fixturehassambiguë.
- Pour les instances existantes 0.0.23 dont le slug n'est pas
pool_control(ex. instance « Piscine » → slugpiscine), l'URL passe de/pool-controlà/pool-control-piscineaprès upgrade. Les bookmarks utilisateurs sur l'ancienne URL doivent être mis à jour. La sidebar HA se met à jour automatiquement.
- Panneau latéral Home Assistant dédié à Pool Control. Une entrée apparaît dans la sidebar (à côté de « Vue d'ensemble », « Énergie », …) et ouvre une vue full-page comprenant un schéma hydraulique animé (SVG vanilla, animation pilotée par classes CSS), des tuiles températures eau / air, l'état complet du contrôleur (statut, planning, temps calculé), les boutons de mode (Actif / Auto / Inactif) et de saison (Saison / Hivernage), les commandes du surpresseur et l'automate de lavage du filtre avec instructions visuelles pour positionner la vanne 6 voies. Le panneau s'adapte automatiquement au thème HA actif et se recharge tout seul quand les options de l'intégration changent.
manifest.json:version0.0.22→0.0.23. Ajoutefrontend,httpetpanel_customaux dépendances HA.__init__.py:async_setup_entryenregistre le panneau viafrontend.pyaprès les plateformes, et branche un update listener pour le recharger quand les options changent.async_unload_entryretire le panneau avant tout autre cleanup. Nouvelle helper_build_panel_config(entry)qui calcule l'instance_prefixà partir deentry.unique_id(avec fallbackslugify(entry.title)).
custom_components/pool_control/frontend.py: enregistrement du Web Component et du chemin statique (/pool_control_static/) servantpool_control_panel.js. API conforme HA 2026.3 (StaticPathConfig,async_register_static_paths,panel_custom.async_register_panel).custom_components/pool_control/frontend/pool_control_panel.js: Web Component vanilla JS (~32 ko), pas de build, pas de dépendances externes. Lit les états viahass.states, écrit viahass.callService(). Le SVG du schéma est statique, animation pilotée par les classes.running/.stopped/.backwash-activemises à jour à chaque setterhass.tests/test_frontend.py: 4 tests de non-régression sur l'enregistrement et le retrait idempotents du panneau.
- Le panneau est complémentaire au dashboard Lovelace : les deux coexistent sans interférer.
- 360 tests (356 + 4 nouveaux) passent sans modification du code de test existant.
-
L'
entity_idest désormais réellement stable et indépendant de la langue active. Le fix de la 0.0.21 utilisait_attr_suggested_object_id, propriété qui n'existe pas dans Home Assistant :helpers/entity.pyne lit que la propertysuggested_object_id(et celle-ci retourne le nom traduit). Conséquence : la suggestion était purement et simplement ignorée, et l'entity_idcontinuait d'être dérivé du nom traduit (button.pool_control_actifquand HA était en français au moment de la création).La 0.0.22 abandonne cette propriété fantôme et définit directement
self.entity_iddans__init__— c'est le contrat documenté parentity_platform.py:823-845(« An entity may suggest the entity_id by setting entity_id itself »). Cette fois, l'identifiant est vraiment figé en anglais quelle que soit la langue HA.
manifest.json:version0.0.21→0.0.22.entities.py:_build_suggested_object_id(entry, translation_key)remplacée par_build_entity_id(platform, entry, translation_key)qui retourne directementf"{platform}.{prefix}_{translation_key}".PoolControlStatusSensoretPoolControlButtonposent désormaisself.entity_idau constructeur (au lieu du_attr_suggested_object_idignoré).tests/test_entities.py: adapté à la nouvelle helper, +1 test (test_platform_prefix_is_respected).
- Les entités créées sous la 0.0.21 (avec ou sans le fix censé être appliqué) conservent leur
entity_idhistorique tant que leurunique_idest inchangé. - Pour bénéficier des nouveaux IDs anglais (
button.<instance>_active, …) sur une installation existante : supprimer puis recréer l'instance après avoir mis à jour vers la 0.0.22 et redémarré HA.
entity_iddésormais réellement stables et indépendants de la langue active. La 0.0.20 posait bien_attr_translation_key, mais Home Assistant dérivait l'object_id_basedu nom traduit dans la langue active au moment de la création de l'entité, produisant par exemplebutton.pool_control_actifau lieu debutton.pool_control_activequand l'instance était créée avec HA en français. L'ajout de_attr_suggested_object_id = "<slug(entry.title)>_<translation_key>"force un identifiant anglais quelle que soit la langue HA.
manifest.json:version0.0.20→0.0.21.entities.py: nouvelle helper_build_suggested_object_id(entry, translation_key);PoolControlStatusSensoretPoolControlButtonposent désormais_attr_suggested_object_id.
- Les entités créées sous la 0.0.20 conservent leur
entity_idhistorique (button.<instance>_actif, …) tant que leurunique_idest inchangé. Pour bénéficier des nouveaux IDs anglais (button.<instance>_active, …) sur une installation existante :- soit renommer manuellement chaque entité dans Paramètres → Appareils et services → ouvrir l'entité → champ
entity_id, - soit supprimer puis recréer l'instance après un redémarrage de HA (en acceptant la perte de configuration et de l'état persistant).
- soit renommer manuellement chaque entité dans Paramètres → Appareils et services → ouvrir l'entité → champ
entity_idinternationaux et stables via_attr_translation_key. Les nouvelles installations exposent des identifiants en anglais (sensor.<instance>_filtration_time,button.<instance>_reset, …) indépendants de la langue de l'interface.- Libellés affichés localisés dans le frontend Home Assistant : noms d'entités en français ou en anglais selon la langue de l'utilisateur, sans modifier l'
entity_id. Les libellés sont définis dansentity.sensor.*.nameetentity.button.*.namedes fichierstranslations/fr.jsonettranslations/en.json.
manifest.json:version0.0.19→0.0.20.entities.py:PoolControlStatusSensoretPoolControlButtonreçoivent désormais unetranslation_key(anglaise stable) à la place d'unnamefrançais._attr_translation_keyremplace_attr_name.sensor.py,button.py: passage destranslation_keyau lieu des noms français.translations/fr.json,translations/en.json,strings.json:- ajout de la section
entity.sensor.*avec 6 clés (control_status,filtration_time,filtration_schedule,filtration_status,booster_status,backwash_status), - renommage des clés
entity.button.*vers leurs équivalents anglais stables (active,inactive,winter,season,booster,backwash).
- ajout de la section
README.md:- section « Entités exposées » mise à jour avec les nouveaux
entity_idstables et un avertissement sur le préfixe d'instance, - section « Tableau de bord » réécrite avec les
entity_idanglais cohérents.
- section « Entités exposées » mise à jour avec les nouveaux
- Les installations existantes conservent leurs
entity_idhistoriques (sensor.temps_de_filtration,button.actif, …) tels qu'inscrits dans leentity registryde Home Assistant. Lesunique_idrestent identiques, donc HA n'efface ni ne renomme aucunentity_id. Les automatisations basées sur les anciens IDs continuent de fonctionner sans modification. - Les 350 tests passent sans modification du code de test.
- Pour aligner manuellement une installation existante sur les nouveaux
entity_id: Paramètres → Appareils et services → Pool Control → ouvrir chaque entité → renommer l'entity_id. La suppression puis recréation de l'instance n'est pas recommandée pour cet usage car elle efface également la configuration (entités source, options avancées) et l'état persistant ; il faudrait reconfigurer l'intégration de zéro. - L'ajout d'une nouvelle instance après upgrade hérite directement des
entity_idanglais stables.
- Support multi-instance : plusieurs piscines peuvent désormais cohabiter dans une même installation Home Assistant. Chaque instance dispose de son propre nom, ses propres entités et son propre stockage persistant.
- Champ « Nom de l'instance » dans le flux de configuration initiale, utilisé comme
unique_id(viaslugify) et comme titre de l'entrée. - Validation côté UI : un nom vide ou non slugifiable est refusé (
error.invalid_name) ; un nom déjà pris déclencheabort.already_configured. - Regroupement des entités sous un device : les 15 entités d'une instance (6 capteurs + 9 boutons) apparaissent maintenant sous un même appareil typé
servicedans Home Assistant. L'intégration affiche « Pool Control · Ajouter un service » au lieu de « Pool Control · Ajouter une entrée ». - Migration automatique v1 → v2 des installations existantes :
- reprise du titre comme nom d'instance et calcul de l'
unique_id, - copie du store global
pool_control_datavers la clé par instancepool_control_data_<entry_id>, puis suppression de l'ancienne clé, - préfixage des
unique_iddu registre d'entités parentry_idpour préserver les customisations utilisateur (icônes, area, nom personnalisé, désactivation) sans orpheliner les entités historiques.
- reprise du titre comme nom d'instance et calcul de l'
manifest.json:version0.0.18→0.0.19.config_flow.py:VERSION = 2,async_set_unique_id+_abort_if_unique_id_configuredalignés sur le pattern deshutters_management.__init__.py: controllers stockés parentry_id(hass.data[DOMAIN][entry_id]) au lieu d'un singleton, déchargement multi-instance correctement scopé, ajout deasync_migrate_entry.entities.py: déclaration d'unDeviceInfo(entry_type=DeviceEntryType.SERVICE,manufacturer="Pool Control"),_attr_has_entity_name = True,unique_idpréfixé parentry_id.controller.py: accepte unConfigEntryoptionnel et dérive sa clé deStoredeentry_id(l'ancienne clé est conservée comme fallback pour les usages hors-flow).sensor.py,button.py: récupèrent le controller scopé àentry_idet propagententryaux entités.- Traductions FR/EN +
strings.json: champname,abort.already_configured,error.invalid_name.
- La migration v1 → v2 est automatique et silencieuse au premier démarrage après l'upgrade. Aucune action utilisateur n'est requise, les entités existantes conservent leurs
entity_idet leurs customisations. - Les 350 tests passent sans modification du code de test.
- Le minimum Home Assistant requis (
2026.3.0) est inchangé. - Après upgrade, l'intégration apparaît dans Paramètres → Appareils et services sous la forme « Pool Control · Ajouter un service », chaque pool figurant comme un appareil regroupant ses 15 entités.
- L'ajout d'une seconde piscine se fait via « Ajouter un service » et exige un nom distinct du premier.
- Crash
500 Internal Server Errorà la deuxième ouverture du flux d'options de l'intégration. Le constructeur dePoolControlOptionsFlowHandlern'assigne plusself.config_entry(devenu propriété en lecture seule depuis Home Assistant 2024.12) et s'aligne sur la signature moderne sans paramètre.self.optionsest désormais initialisé à la volée dansasync_step_init. - Suppression d'un
async_get_options_flowmort au niveau module dans__init__.py(HA n'utilise que celui défini dans la classePoolControlConfigFlow).
manifest.json:version0.0.17→0.0.18.
ROADMAP.mdà la racine du dépôt, listant les évolutions à moyen et long terme ainsi que les pistes exploratoires.- Nouvelle table des matières dans le
README.md, alignée sur la convention du dépôt jumeaushutters_management. - Section « Structure du dépôt » et bloc « Tests locaux » regroupés sous la rubrique « Contribuer » du
README.md.
manifest.json:version0.0.16→0.0.17.hacs.json:render_readmepassé àtrueafin que HACS affiche directementREADME.md.README.md: réécriture complète selon la table des matières de référence (Fonctionnalités, Prérequis, Installation, Configuration, Comportement, Entités exposées, Tableau de bord, Surpresseur, Lavage, Migration, Roadmap, Changelog, Contribuer, Licence).CHANGELOG.md: réécriture au format Keep a Changelog 1.1.0, sans tableaux de scoring ni sections marketing.
ANALYSIS.md: document interne d'analyse, hors périmètre d'un dépôt distribué.info.md: vitrine HACS rendue inutile parrender_readme: true.
- Aucune modification du code Python, du schéma de configuration, des entités ou des services.
- Les 350 tests passent sans modification.
- Le minimum Home Assistant requis (
2026.3.0) est inchangé par rapport à la v0.0.16. Les utilisateurs sur une version antérieure doivent rester sur la v0.0.16 jusqu'à mise à jour de leur Home Assistant.
- Mixin
ServiceMixin(service.py) avec_safe_service_call(): wrapper dehass.services.async_callavec gestion d'erreurs, logging contextuel et retour booléen pour le suivi des échecs.
- 8 appels de services désormais sécurisés via
_safe_service_call():filtration.py(filtrationOn,filtrationStop),traitement.py(traitementOn,traitementStop,traitement_2_On,traitement_2_Stop),surpresseur.py(surpresseurOn,surpresseurStop). controller.py: intégration deServiceMixinà la chaîne d'héritage.- Suppression de 3 imports
Optionalinutilisés.
- URL de documentation dans
manifest.json. - Métriques v0.0.15 dans le précédent
CHANGELOG.md. - Identifiants d'entités dans l'ancien
info.md.
- Type hints sur les 82 fonctions et méthodes du code source (couverture annotation 100 %).
- Annotations de retour (
-> None,-> bool,-> str, etc.) et de paramètres (Optional,Any,Callable,Tuple). - Code source : 2362 → 2382 lignes.
- Création automatique des entités exposées par l'intégration : 6 capteurs et 9 boutons.
- Guide de migration depuis la configuration
configuration.yamlhistorique.
- Breaking : l'installation passe par Config Flow UI ; la configuration via
configuration.yamln'est plus prise en charge. README.md: ré-organisation autour de la procédure d'installation par interface.- Exemple de tableau de bord mis à jour avec les nouveaux identifiants d'entités.
- Obligation de créer manuellement
input_button,input_textetinput_number. - Instructions de configuration via
configuration.yaml.
- 3 tests précédemment en échec passent désormais (350/350).
- Métriques de test dans la documentation.
- 320 nouveaux tests, répartis sur 6 fichiers :
test_filtration.py,test_lavage.py,test_traitement.py,test_surpresseur.py,test_scheduler.py,test_utils.py. - Fixtures pour l'ensemble des composants de contrôle de filtration.
- Couverture de tests passée de 15 % à environ 65 %.
- Total : 30 → 350 tests, 2 → 12 fichiers de tests, 226 → 5432 lignes de tests.
test_cron_full_5minute_cycle: logique du compteur.test_formatting_pads_single_digits: précision de l'arrondi.test_coefficient_affects_all_methods: tolérance de comparaison flottante.
- Suite de tests initiale (30 tests).
- Workflows GitHub Actions :
tests.yaml,Validate HACS.yaml,Validate Hassfest.yaml. - Infrastructure de test :
conftest.pyavec 9 fixtures,const.py,tests/README.md. - Tests de non-régression couvrant 6 bugs critiques (17 tests) et tests d'environnement (12 tests).
- Documentation : reflet de l'architecture refactorisée et des bénéfices du refactoring.
- Architecture modulaire en 11 mixins :
ActivationMixin,ButtonMixin,FiltrationMixin,HivernageMixin,LavageMixin,SaisonMixin,SchedulerMixin,SensorsMixin,SurpresseurMixin,TraitementMixin,UtilsMixin. - Config Flow et Options Flow.
- Traductions FR / EN.
- Premiers type hints (15 fonctions).
- Breaking :
activation.pyrefactorisé : 1 fonction monolithique → 13 fonctions modulaires, complexité ramenée sous 5, suppression du# noqa: C901. - Architecture passée de monolithique (~1800 lignes dans
__init__.py) à modulaire.
- Méthode
executePoolStop()manquante : remplacée parexecuteButtonStop(). KeyErrorsurtemperatureMaxi: valeur par défaut ajoutée (8 occurrences).- Message de log « Second cron » corrigé en « First cron ».
- Type
methodeCalculincohérent : conversionint()forcée. - Crash si
traitementnon configuré : ajout de vérificationsNone(8 emplacements). - Entité
temperatureDisplayoptionnelle : helperupdateTemperatureDisplay().
Première version publique :
- Architecture monolithique (~1800 lignes dans
__init__.py). - Configuration via
configuration.yaml. - Contrôle de la filtration, du mode hivernage, du surpresseur et de l'assistant de lavage du filtre à sable.
Limitations connues à cette version : complexité de code élevée, pas de couverture de tests, pas de type hints, 6 bugs critiques (corrigés en 0.0.10).