H.A.C.A
Home Assistant Config Auditor — Auditez, détectez et corrigez automatiquement les problèmes de votre configuration Home Assistant.
Pourquoi H.A.C.A ?
Au fil du temps, une installation Home Assistant accumule des automatisations obsolètes, des entités fantômes, des références cassées et des problèmes de performance difficiles à repérer manuellement. H.A.C.A fait ce travail à votre place — automatiquement, en continu, sans configuration complexe.
Audit continu
Scan auto toutes les 60 min. Score de santé en temps réel exposé comme capteur HA.
Corrections 1-clic
Prévisualisation avant/après. Application directe. Backup automatique YAML avec rollback si le rechargement échoue.
LLM API natif v1.5.2
HACA s'enregistre comme LLM API dans HA. Mistral, Gemini, Llama utilisent les 65 outils nativement. Fallback automatique si l'agent préféré échoue.
Historique
Suivi du score dans le temps. Rapports PDF, Markdown et JSON. Fréquence configurable (quotidien / hebdomadaire / mensuel).
Batteries + Prédictions
Surveillance de tous les niveaux. Régression linéaire — dates de remplacement estimées. Alertes 7 jours à l'avance.
Recorder DB + Impact
Détection et purge des entités orphelines. Analyse de l'impact par entité (écritures/jour, Mo/an). YAML exclude prêt à copier.
Conformité
Audit des métadonnées : noms, zones, labels, helpers. 10 types configurables.
Helpers
Onglet dédié avec sous-onglets par type et détection des helpers jamais utilisés.
Chat IA
Assistant conversationnel avec accès aux 65 outils MCP. Exécute les tâches complexes en plusieurs étapes.
Serveur MCP (65 outils)
Protocole MCP intégré pour 12 agents IA : Claude Desktop, Cursor, VS Code, n8n et plus.
Graphe — sidebar relations v1.5.2
Clic sur un nœud → sidebar "Utilisé par / Utilise" avec navigation cliquable. Exports CSV et Markdown par nœud ou graphe complet.
Complexité des zones
Heatmap interactive par zone. Score composite. Suggestions automatiques de fusion et découpage.
Redondances
Chevauchements logiques, candidates blueprint (≥3 identiques), remplaçables par des fonctionnalités HA natives.
Sécurité renforcée v1.5.2
@require_admin sur 18 handlers destructifs. Écritures YAML atomiques. Protection path traversal.
Graphe de scripts
Cycles, profondeur excessive, scripts orphelins, candidats blueprint générés par l'IA.
Analyseur de groupes
Groupes vides, références manquantes, imbrications excessives.
Score de santé
sensor.haca_health_score — utilisez-le dans vos dashboards Lovelace ou automatisations d'alerte.
Démarrage rapide
Consultez le pour être opérationnel en 5 minutes via HACS ou manuellement.
Installation
H.A.C.A s'installe en quelques minutes via HACS (recommandé) ou manuellement.
Prérequis
/config/| Composant | Version minimale | Notes |
|---|---|---|
| Home Assistant Core | 2024.1.0 | Requis |
| HACS | 1.34.0 | Optionnel (méthode recommandée) |
| PyYAML | 6.0 | Installé automatiquement |
| fpdf2 | 2.7.4 | Installé automatiquement |
Installation via HACS
Installer HACS
Si HACS n'est pas installé, rendez-vous sur hacs.xyz et suivez le guide officiel. Redémarrez HA après installation.
Ajouter le dépôt personnalisé
Dans HACS : Intégrations → ⋮ → Dépôts personnalisés
- URL :
https://github.com/JeanMarc-Labs/ha-config-auditor - Catégorie : Intégration
Cliquez Ajouter.
Installer H.A.C.A
Recherchez H.A.C.A dans la liste, cliquez sur la carte, puis Télécharger. Choisissez la dernière version.
Redémarrer Home Assistant
Paramètres → Système → Redémarrer → Redémarrer Home Assistant
Configurer l'intégration
Paramètres → Appareils & Services → + Ajouter une intégration
Recherchez H.A.C.A ou Config Auditor. ✅ Le panneau H.A.C.A apparaît dans votre sidebar.
Installation manuelle
# Télécharger le projet git clone https://github.com/JeanMarc-Labs/ha-config-auditor.git # Copier le composant mkdir -p /config/custom_components/ cp -r ha-config-auditor/custom_components/config_auditor /config/custom_components/ # Redémarrer HA puis ajouter l'intégration
Dépannage
| Problème | Solution |
|---|---|
| Intégration absente après installation | Vérifiez que custom_components/config_auditor/manifest.json existe. Redémarrez HA (pas reload). |
| Panel absent de la sidebar | Videz le cache navigateur (Ctrl+Shift+R). Vérifiez Profil → Menu latéral. |
No module named fpdf2 | Les dépendances s'installent automatiquement au 1er démarrage complet. |
| Scans ne se lancent pas | Testez via Outils de développement → Services : config_auditor.scan_all |
| Chat IA sans réponse | Configurez un LLM API dans Paramètres → Assistants vocaux et sélectionnez HACA comme LLM API de l'agent. |
Tableau de bord
La première page que vous voyez en ouvrant H.A.C.A. Vue d'ensemble instantanée de la santé de votre installation.
Score de santé
Le score (0–100) est affiché en grand en haut. Il se met à jour après chaque scan.
Score = 100 − Σ pénalités Pénalités par issue : HIGH → −5 points MEDIUM → −2 points LOW → −1 point
Intégration dans HA
automation: - alias: "HACA : Alerte score santé" trigger: - platform: numeric_state entity_id: sensor.haca_health_score below: 70 action: - service: notify.mobile_app data: title: "⚠️ Score HA bas" message: "Score : {{ states('sensor.haca_health_score') }}/100"
Capteurs exposés dans HA
| Capteur | Description |
|---|---|
sensor.haca_health_score | Score de santé global (0–100) |
sensor.haca_total_issues | Nombre total d'issues |
sensor.haca_automation_issues | Issues d'automatisations |
sensor.haca_entity_issues | Issues d'entités |
sensor.haca_battery_low_count | Appareils sous le seuil batterie |
sensor.haca_battery_critical_count | Appareils sous 10% |
sensor.haca_battery_threshold | Seuil batterie configuré |
Analyse des Issues
Comprendre, filtrer et agir sur les problèmes détectés par H.A.C.A.
Structure d'une carte d'issue
┌─────────────────────────────────────────────────────┐ │ ⚠️ HIGH Mode incorrect pour détection de mouvement │ │ │ │ 📍 automation.lumieres_salon │ │ │ │ L'automatisation utilise le mode 'single' mais │ │ contrôle une lampe via un capteur de mouvement. │ │ │ │ [ ✏️ Ouvrir dans HA ] [ 🤖 IA ] [ 🔧 Fix ] │ └─────────────────────────────────────────────────────┘
Boutons IA sur les issues
Chaque issue dispose d'un bouton 🤖 IA qui s'adapte au type d'issue :
| Comportement | Types concernés | Action |
|---|---|---|
| Modale simple fix | no_alias, no_description | Suggestion IA dans un champ texte éditable → Fermer / Modifier manuellement / Appliquer |
| Chat impératif | 66 types (device_id, complexity, blueprints…) | Ouvre le Chat avec un prompt pré-rempli — l'IA exécute la correction via les outils MCP |
| Explication | 8 types informationnels | Explique le problème avec les bonnes pratiques HA |
no_alias et no_description, l'IA génère une suggestion directement dans une modale légère — pas besoin d'ouvrir le Chat complet. La valeur est modifiable avant application.
Filtres disponibles
- 12 sous-onglets — Tous · Sécurité · Automations · Scripts · Scènes · Entités · Helpers · Performance · Blueprints · Dashboards · Carte Zones · Redondances
- Chips de sévérité — HIGH MEDIUM LOW
- Export CSV de la liste filtrée courante
Types d'issues principaux
device_id_in_trigger / action / target
- platform: device device_id: abc123def456 domain: binary_sensor type: motion - platform: state entity_id: binary_sensor.capteur_mouvement_salon to: "on"
incorrect_mode_motion_single
single, si le capteur se déclenche pendant l'exécution (extinction programmée), l'action est ignorée.mode: single mode: restart # ✅ Redémarre si nouveau mouvement détecté
expensive_template_states_all
states sans entité ciblée parcourt TOUTES les entités HA à chaque évaluation. Sur 500+ entités, l'impact est mesurable.Corrections
H.A.C.A corrige certaines issues directement depuis l'interface, avec prévisualisation et backup automatique.
.haca_backups/. Si le rechargement HA échoue après la correction, le fichier original est restauré automatiquement.Issues corrigeables
| Type d'issue | Méthode | Fix |
|---|---|---|
device_id_in_trigger | Conversion → platform: state | Auto |
device_id_in_action | Conversion → service + target.entity_id | Auto |
device_id_in_target | Remplacement device_id → entity_id | Auto |
incorrect_mode_motion_single | Mode single → restart | Auto |
template_simple_state | Template → condition native | Auto |
broken_device_reference | Nettoyage de la référence | Auto |
zombie_entity | Suppression de l'entrée registre | Auto |
no_alias / no_description | Modale IA + champ texte éditable | Modale IA |
high_complexity_actions | Optimisation IA dans le Chat | Chat IA |
| Issues de zones, redondances, blueprints | Prompt impératif dans le Chat IA | Chat IA |
Flux de correction automatique
Cliquez sur 🔧 Fix
Le bouton apparaît sur les issues corrigeables automatiquement.
Prévisualisation diff
Un modal affiche le YAML avant (rouge) et après (vert). Vérifiez la proposition.
Appliquer
H.A.C.A crée le backup, écrit le YAML corrigé de façon atomique, puis recharge. Si le rechargement échoue, le fichier original est restauré automatiquement.
HA recharge
Les automations/scripts sont rechargés immédiatement. Aucun redémarrage nécessaire.
Mode simulation
service: config_auditor.fix_device_id data: automation_id: "1234567890abc" dry_run: true # Aucun fichier modifié
Historique & Rapports
Suivez l'évolution de votre installation dans le temps et générez des rapports exportables.
Onglet Historique
Chaque scan produit un point de données conservé. Le graphique montre l'évolution du score sur les 30 derniers scans. Une hausse stable = vos corrections portent leurs fruits. Une baisse soudaine = nouvelles automations avec problèmes.
Fréquence du rapport automatique
Formats de rapport
| Format | Contenu | Usage |
|---|---|---|
| Rapport formaté, imprimable | Archivage, partage | |
| Markdown | Rapport texte structuré | Documentation, Git |
| JSON | Données brutes structurées | Intégrations, scripts |
service: config_auditor.generate_report data: format: pdf # pdf | markdown | json | all
/config/.haca_reports/ ├── haca_report_20260314_143022.pdf ├── haca_report_20260314_143022.md └── haca_report_20260314_143022.json
Batteries & Recorder DB
Surveillance des niveaux de batterie et analyse de la base de données Recorder.
Module Batteries
| Couleur | Niveau | Action recommandée |
|---|---|---|
| 🔴 Rouge | < 10% | Remplacement urgent |
| 🟠 Orange | 10–20% | Planifier le remplacement |
| 🟢 Vert | > 20% | Niveau acceptable |
automation: - alias: "HACA : Alerte batterie faible" trigger: - platform: numeric_state entity_id: sensor.haca_battery_low_count above: 0 action: - service: notify.mobile_app data: title: "🔋 Batterie(s) faible(s)" message: > {{ states('sensor.haca_battery_low_count') }} appareil(s) sous {{ states('sensor.haca_battery_threshold') }}%
Module Recorder DB
service: config_auditor.purge_recorder_orphans
Prédictions batteries
H.A.C.A analyse la tendance des niveaux de batterie par régression linéaire sur l'historique HA et prédit quand chaque appareil aura besoin d'une pile neuve.
Comment ça marche
Pour chaque entité batterie, H.A.C.A récupère les N derniers points de données et calcule une droite de régression linéaire. La pente détermine le taux de décharge journalier moyen. H.A.C.A extrapole ensuite la date à laquelle le niveau atteindra le seuil critique (10%) et le seuil d'alerte configuré.
Alertes préventives 7 jours
Tout appareil prédit pour atteindre le seuil critique dans les 7 prochains jours remonte une issue battery_predict_critical_soon de sévérité HIGH.
Export CSV
Colonnes : entity_id · current_level · days_remaining · predicted_empty_date · discharge_rate_per_day · confidence_r2.
Impact Recorder
Identifie les entités qui saturent votre base de données SQLite et génère le bloc YAML recorder: exclude: prêt à copier-coller.
/config/home-assistant_v2.db.Métriques calculées
| Colonne | Description |
|---|---|
writes_per_day | Nombre moyen d'écritures en base par jour (30 derniers jours) |
mb_per_year | Estimation de l'espace disque consommé annuellement |
total_states | Nombre total de lignes en base pour cette entité |
linked_automations | Nombre d'automations référençant cette entité |
impact_score | Score composite normalisé 0-100 |
Génération du bloc YAML d'exclusion
recorder: exclude: entities: - sensor.temperature_exterieure # 1842 writes/day — 2.1 MB/year - sensor.cpu_temperature # 1440 writes/day — 1.6 MB/year
Complexité des zones
Heatmap interactive qui visualise la complexité de chaque zone et propose des suggestions automatiques de restructuration.
Score de complexité composite
| Dimension | Poids |
|---|---|
| Nombre d'entités | 30% |
| Nombre d'automations | 30% |
| Nombre de scripts | 20% |
| Imbrication de zones | 10% |
| Interdépendances | 10% |
Interprétation
| Score | Couleur | Signification |
|---|---|---|
| 0–30 | ■ Vert | Zone simple |
| 31–60 | ■ Jaune | Zone modérée — à surveiller |
| 61–80 | ■ Orange | Zone complexe — révision conseillée |
| 81–100 | ■ Rouge | Zone critique — restructuration recommandée |
Suggestions automatiques
- Découpage (
area_split_suggested) — zones rouges > 80 : séparation en 2 sous-zones logiques - Fusion (
area_merge_suggested) — paires de zones vertes < 20 avec entités similaires
Analyseur de redondances
Détecte trois catégories de redondances entre vos automations pour nettoyer, consolider et simplifier votre configuration.
Catégorie 1 — Chevauchements logiques
Deux automations partageant ≥ 80% des mêmes déclencheurs ET ciblant les mêmes entités avec des effets similaires → issue redundancy_overlap. L'IA propose de les fusionner.
Catégorie 2 — Candidates à la blueprintisation
Quand ≥ 3 automations sont structurellement identiques → issue redundancy_blueprint_candidate avec bouton Générer Blueprint.
Catégorie 3 — Remplaçables par des fonctionnalités HA natives
| Pattern détecté | Fonctionnalité HA native suggérée |
|---|---|
| Allumage/extinction selon présence | adaptive_lighting |
| Action planifiée à heure fixe | schedule integration |
| Thermostat avec plages horaires | generic_thermostat |
| Notification sur changement d'état | alert integration |
| Suivi de présence GPS | person + zone natifs |
Conformité
Audit de la qualité des métadonnées de votre configuration : noms lisibles, zones, icônes, labels et unique_id.
Types de checks disponibles
| Type | Description | Sévérité |
|---|---|---|
compliance_no_friendly_name | Entité affichée par son entity_id brut | MEDIUM |
compliance_raw_entity_name | Nom de domaine visible dans l'interface | LOW |
compliance_entity_no_area | Entité sans zone assignée (jusqu'à 150 individuelles) | LOW |
compliance_entity_no_area_bulk | Résumé quand > 150 entités sans zone (bannière orange) | LOW |
compliance_area_no_icon | Zone sans icône définie | LOW |
compliance_helper_no_icon | Helper nommé sans icône | LOW |
compliance_helper_no_area | Helper nommé sans zone | LOW |
compliance_unused_label | Label créé mais non assigné | LOW |
compliance_automation_no_unique_id | Automation non éditable via l'UI | MEDIUM |
compliance_automation_no_description | Automation sans description | LOW |
compliance_script_no_description | Script sans description | LOW |
Configuration
Dans l'onglet Config de H.A.C.A, section Conformité : chaque type de check peut être activé ou désactivé individuellement.
Corrections
Les issues de conformité ne nécessitent pas d'IA pour être corrigées — elles pointent vers des paramètres simples à renseigner directement dans l'interface HA. Utilisez les boutons Ouvrir dans HA de chaque carte pour accéder directement à la page de configuration correspondante.
Helpers
Onglet dédié à tous vos helpers d'entrée avec détection des helpers jamais utilisés.
Types de helpers surveillés
| Domain | Description |
|---|---|
input_boolean | Interrupteurs logiques |
input_number | Valeurs numériques |
input_text | Textes libres |
input_select | Listes de sélection |
input_datetime | Dates et heures |
input_button | Boutons déclencheurs |
timer | Minuteries |
counter | Compteurs |
Détection des helpers inutilisés
H.A.C.A vérifie chaque helper dans les automations, scripts et dashboards. Un helper non référencé génère une issue :
unused_input_helper— Helper jamais utilisé dans une automation ou un script (MEDIUM)unused_timer_helper— Timer non référencé dans une automation, script ou dashboard (LOW)
Graphe de scripts
Analyse les chaînes d'appel entre scripts pour détecter cycles, profondeur excessive et orphelins.
Types d'issues détectées
| Type | Sévérité | Description |
|---|---|---|
script_cycle_detected | HIGH | Script A appelle Script B qui rappelle Script A — boucle infinie |
script_call_depth_exceeded | MEDIUM | Chaîne d'appel > 3 niveaux de profondeur |
script_single_in_loop | HIGH | Script en mode single appelé en boucle — appels manqués |
orphan_script | MEDIUM | Script jamais appelé par aucune automation |
script_blueprint_candidate | LOW | Script appelé par ≥ 3 automations — candidat blueprint |
Graphe de dépendances
Visualisation D3.js force-directed de toutes les dépendances entre entités, automations, scripts et scènes.
Exports disponibles
| Export | Contenu | Disponible dans |
|---|---|---|
| CSV par nœud | Relations d'un nœud sélectionné (colonnes : entity_id, label, type, relationship, direction) | Sidebar (clic sur un nœud) |
| Markdown par nœud | Rapport structuré du nœud avec ses relations "← Utilisé par" / "→ Utilise" | Sidebar (clic sur un nœud) |
| CSV graphe complet | Toutes les relations du graphe | Toolbar |
| Markdown graphe complet | Nœuds groupés par type avec détection des orphelins | Toolbar |
Navigation dans le graphe
- Zoom — molette de la souris ou pinch sur mobile
- Déplacer — clic + drag sur le fond
- Nœud — clic pour ouvrir la sidebar de relations
- Filtres — barre de filtres en haut pour afficher uniquement certains types de nœuds
Intelligence Artificielle
H.A.C.A utilise votre LLM HA existant via une intégration native. Aucune clé API supplémentaire requise.
Paramètres → Assistants vocaux → [votre agent] → LLM API → HACA
Providers supportés
Tout agent conversation configuré dans HA est utilisable :
| Provider | Notes |
|---|---|
| Google Gemini | Via intégration Google Generative AI |
| OpenAI / ChatGPT | Via intégration OpenAI Conversation |
| Anthropic Claude | Via intégration Anthropic |
| Mistral / OpenRouter | Via intégration OpenAI-compatible |
| Ollama | 100% local, aucune donnée envoyée sur internet |
Fallback automatique
Si l'agent préféré échoue (quota dépassé, timeout, erreur), H.A.C.A essaie automatiquement l'agent suivant disponible. L'agent préféré de vos Assistants vocaux est toujours essayé en premier.
Explication des issues
Le bouton 🤖 IA génère pour chaque issue :
- Pourquoi c'est un problème dans votre contexte
- Quel risque cela représente concrètement
- Comment le corriger (ou l'IA l'exécute directement)
- Bonnes pratiques liées à ce type d'issue
Optimiseur d'automatisations complexes
Pour les automatisations avec un score de complexité ≥ 15, le bouton Optimiser ouvre le Chat avec un prompt complet incluant le YAML de l'automatisation. L'IA propose :
- Extraction en scripts réutilisables
- YAML modernisé et simplifié
- Suggestion de blueprint si applicable
Agent IA Proactif
L'agent en arrière-plan génère un rapport automatique à la fréquence configurée (quotidien / hebdomadaire / mensuel). Il détecte aussi des corrélations entre les issues : par exemple, si 3 automations liées à la même zone ont toutes des problèmes similaires.
Chat IA
Assistant conversationnel avec accès à 65 outils MCP — lire, créer, modifier et recharger toute configuration HA en langage naturel.
Exemples de requêtes
"Crée un blueprint à partir de l'automatisation lumières_cuisine et applique-le aux 3 pièces similaires" "Analyse les 5 automations avec le plus fort impact Recorder et génère un bloc d'exclusion YAML" "Renomme toutes les entités de la zone Salon pour suivre la convention snake_case" "Y a-t-il des automations qui se chevauchent logiquement ? Montre-les moi et propose une fusion." "Crée une scène 'Soirée cinéma' avec les lumières du salon à 20%"
Capacités
| Capacité | Exemple |
|---|---|
| Lire la configuration | ha_get_automation, ha_get_entities, ha_get_config_file |
| Créer des automatisations | ha_create_automation avec YAML généré par l'IA |
| Modifier des YAML | ha_update_automation, ha_update_script |
| Créer des blueprints | ha_create_blueprint, ha_import_blueprint |
| Analyser l'historique | ha_get_history, ha_get_statistics |
| Gérer les tableaux de bord | ha_get_lovelace, ha_add_lovelace_card |
| Sauvegarder | ha_backup_create avant toute action destructive |
| Vérifier la config | ha_check_config après chaque écriture YAML |
Rate limiting
Un délai minimum de 3 secondes est imposé entre les messages pour protéger vos quotas IA. Un message de confirmation s'affiche si vous envoyez trop vite.
Conversation ID
Le Chat maintient un conversation_id pour que l'IA se souvienne du contexte d'une message à l'autre au sein de la même session. Rafraîchir la page démarrera une nouvelle conversation.
Serveur MCP — 65 outils
Serveur Model Context Protocol intégré qui expose tous les outils H.A.C.A et HA aux agents IA externes.
Connexion
# URL du serveur MCP http://homeassistant.local:8123/api/haca/mcp # Header d'authentification Authorization: Bearer <votre-token-haca> # Token créé dans HA Paramètres → Votre profil → Sécurité → Tokens d'accès longue durée
Agents supportés
| Agent | Configuration |
|---|---|
| Claude Code | claude mcp add haca --url http://ha:8123/api/haca/mcp |
| Claude Desktop | Section mcpServers dans claude_desktop_config.json |
| Cursor | Settings → MCP → Add server |
| VS Code / Copilot | Extension Copilot → MCP Servers |
| Windsurf | Settings → AI → MCP Servers |
| n8n | Node MCP Client → URL + Bearer |
| HTTP/REST | POST direct sur l'endpoint JSON-RPC 2.0 |
65 outils — 11 catégories
Sécurité
Tous les outils destructifs requièrent un token admin. H.A.C.A vérifie les droits administrateur côté serveur avant d'exécuter toute action d'écriture. Les chemins de fichiers sont validés avec os.path.realpath() pour prévenir le path traversal.
Tous les types d'issues
Tableau complet. Légende fix : Auto automatique · Modale IA champ texte éditable · Chat IA prompt MCP · Manuel édition directe dans HA.
| Type | Sévérité | Fix | Description |
|---|---|---|---|
device_id_in_trigger | HIGH | Auto | Déclencheur utilise device_id — fragile au remplacement matériel |
device_id_in_action | HIGH | Auto | Action utilise device_id directement |
device_id_in_target | HIGH | Auto | target.device_id au lieu de target.entity_id |
device_trigger_platform | HIGH | Auto | Plateforme de déclencheur device |
device_id_in_condition | MEDIUM | Auto | Condition utilise device_id |
incorrect_mode_motion_single | HIGH | Auto | Mode single sur automation mouvement/lumière |
template_simple_state | MEDIUM | Auto | Template remplaçable par condition native |
no_alias | LOW | Modale IA | Automatisation sans nom lisible |
no_description | LOW | Modale IA | Automatisation sans description |
high_complexity_actions | MEDIUM | Chat IA | Score de complexité élevé — refactoring suggéré |
deprecated_service | HIGH | Manuel | Service HA déprécié |
potential_self_loop | HIGH | Manuel | Boucle de déclenchement potentielle |
duplicate_automation | MEDIUM | Manuel | Automation identique à une autre |
never_triggered | LOW | Manuel | Aucun déclenchement en mémoire |
excessive_delay | LOW | Manuel | Délai > 1h dans une action |
high_parallel_max | MEDIUM | Manuel | max_exceeded élevé en mode parallel |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
unavailable_entity | HIGH | Manuel | Entité en état unavailable |
stale_entity | MEDIUM | Manuel | Entité sans changement d'état depuis longtemps |
broken_device_reference | HIGH | Auto | Référence à un appareil inexistant |
zombie_entity | MEDIUM | Auto | Entité dans le registre sans intégration active |
disabled_but_referenced | MEDIUM | Manuel | Entité désactivée utilisée dans une automation |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
expensive_template_states_all | HIGH | Manuel | Template utilisant states (tous) — très coûteux en CPU |
template_time_check | MEDIUM | Manuel | Vérification temporelle coûteuse |
template_numeric_comparison | MEDIUM | Manuel | Comparaison numérique inefficace en template |
recorder_high_impact | MEDIUM | Manuel | Entité avec impact SQLite élevé (écritures/jour) |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
hardcoded_secret | HIGH | Manuel | Secret codé en dur (mot de passe, token…) |
sensitive_data_exposure | HIGH | Manuel | Données sensibles exposées en clair |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
blueprint_file_not_found | HIGH | Manuel | Fichier blueprint introuvable |
blueprint_empty_input | MEDIUM | Manuel | Input de blueprint vide |
blueprint_candidate | LOW | Chat IA | Script appelé par ≥ 3 automations — candidat blueprint |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
script_cycle_detected | HIGH | Manuel | Cycle dans la chaîne d'appel |
script_call_depth_exceeded | MEDIUM | Manuel | Chaîne > 3 niveaux |
script_single_in_loop | HIGH | Auto | Script mode single appelé en boucle |
orphan_script | MEDIUM | Manuel | Script jamais appelé |
unused_input_helper | MEDIUM | Manuel | Helper jamais utilisé |
unused_timer_helper | LOW | Manuel | Timer jamais référencé |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
scene_unavailable_entity | HIGH | Manuel | Scène référençant une entité unavailable |
scene_never_activated | MEDIUM | Manuel | Scène non activée depuis > 90 jours |
scene_duplicate | MEDIUM | Manuel | Scènes en double |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
group_empty | MEDIUM | Manuel | Groupe sans membre |
group_missing_entity | HIGH | Manuel | Groupe référençant une entité inexistante |
group_all_unavailable | MEDIUM | Manuel | Tous les membres unavailable |
group_nesting_exceeded | MEDIUM | Manuel | Groupes imbriqués > 2 niveaux |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
compliance_no_friendly_name | MEDIUM | Manuel | Entité sans nom lisible |
compliance_entity_no_area | LOW | Manuel | Entité sans zone (jusqu'à 150 individuelles) |
compliance_entity_no_area_bulk | LOW | Manuel | Résumé groupé > 150 (bannière orange) |
compliance_area_no_icon | LOW | Manuel | Zone sans icône |
compliance_helper_no_icon | LOW | Manuel | Helper sans icône |
compliance_helper_no_area | LOW | Manuel | Helper sans zone |
compliance_unused_label | LOW | Manuel | Label non assigné |
compliance_automation_no_unique_id | MEDIUM | Modale IA | Automation sans unique_id |
compliance_automation_no_description | LOW | Modale IA | Automation sans description |
compliance_script_no_description | LOW | Modale IA | Script sans description |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
area_high_complexity | MEDIUM | Chat IA | Zone dépassant le seuil de complexité composite |
area_split_suggested | MEDIUM | Chat IA | Zone trop large — découpage suggéré |
area_merge_suggested | LOW | Chat IA | Zones similaires peu peuplées — fusion suggérée |
| Type | Sévérité | Fix | Description |
|---|---|---|---|
redundancy_overlap | MEDIUM | Chat IA | Chevauchement logique : mêmes déclencheurs, mêmes cibles |
redundancy_blueprint_candidate | MEDIUM | Chat IA | ≥3 automations identiques — bouton "Générer Blueprint" |
redundancy_native_ha | LOW | Chat IA | Automation remplaçable par une fonctionnalité HA native |
Services HA
# Scans service: config_auditor.scan_all service: config_auditor.scan_automations service: config_auditor.scan_entities service: config_auditor.scan_compliance # Preview + Fix (backup auto + rollback si reload échoue) service: config_auditor.preview_device_id data: { automation_id: "abc123" } service: config_auditor.fix_device_id data: { automation_id: "abc123", dry_run: false } service: config_auditor.restore_backup data: { backup_path: ".haca_backups/automations_20260314.yaml" } # Rapport service: config_auditor.generate_report data: { format: pdf } # pdf | markdown | json | all # Purge Recorder service: config_auditor.purge_recorder_orphans
Configuration
configuration.yaml.Options
| Option | Type | Défaut | Description |
|---|---|---|---|
scan_interval | int | 60 min | Intervalle de scan automatique (5–1440 min) |
battery_alert_threshold | int | 20% | Seuil d'alerte batterie (1–50%) |
notifications_enabled | bool | true | Notifications HA lors de nouvelles issues HIGH |
report_frequency | string | weekly | Fréquence du rapport auto : daily / weekly / monthly / never |
debug_mode | bool | false | Active les logs debug |
mcp_ha_token | string | — | Token HA longue durée pour le serveur MCP |
excluded_issue_types | list | [] | Types d'issues à exclure des scans |
excluded_compliance_types | list | [] | Types de checks de conformité désactivés |
Structure des fichiers
/config/
├── custom_components/config_auditor/
├── .haca_backups/
│ └── automations_20260314_143022.yaml
└── .haca_reports/
├── haca_report_20260314.pdf
├── haca_report_20260314.md
└── haca_report_20260314.jsonNiveaux de log
logger: logs: custom_components.config_auditor: debug
Architecture
Guide développeur
Patterns obligatoires
Écriture YAML — _safe_write_and_reload
# ❌ Dangereux auto_file.write_text(new_yaml) await hass.services.async_call("automation", "reload", blocking=True) # ✅ Atomique + rollback si reload échoue await _safe_write_and_reload(hass, auto_file, new_yaml, "automation")
Always async
# ✅ Non-bloquant async def async_load_yaml(hass, path): return await hass.async_add_executor_job(lambda: yaml.safe_load(open(path)))
Shadow DOM — appender au body
// ✅ Toujours visible
document.body.appendChild(modal);Build JS — toujours modifier src/*.js
# 1. Modifier dans www/src/ (jamais haca-panel.js directement) # 2. Builder cd www && bash build.sh # 3. Ctrl+Shift+R dans le navigateur
os.path.realpath() pour valider tout chemin fourni par l'utilisateur.
Jamais de
write_text() directement — utiliser _atomic_write().
Ajout d'un module analyseur
| Étape | Fichier | Action |
|---|---|---|
| 1 | my_analyzer.py | Implémenter async def analyze(hass) → list[Issue] |
| 2 | __init__.py | Importer et appeler dans analyze_all() |
| 3 | const.py | Ajouter les types dans ISSUE_TYPES |
| 4 | translations/*.json | Clés dans les 13 langues sous panel.issue_types.types.* |
| 5 | www/src/issues.js | Ajouter dans _buildActionPrompt() |
| 6 | tests/test_my_analyzer.py | Créer le fichier de tests |
| 7 | www/build.sh | Ajouter le .js avant closer.js |
Tests
| Fichier | Module couvert |
|---|---|
test_automation_analyzer.py | Analyseur d'automations, scripts, scènes |
test_refactoring_assistant.py | Corrections auto, preview diff, backup + rollback |
test_entity_analyzer.py | Entités fantômes, zombies, désactivées |
test_v130_features.py | Script graph, scènes, groupes, blueprints, version |
test_conversation.py | Bridge IA, fallback, entity_registry match |
test_websocket.py v1.5.2 | @require_admin, fallback chat, atomic write, auto-backup, path traversal |
test_llm_api.py v1.5.2 | HacaLLMAPI, HacaTool routing, JSON Schema→voluptuous, rollback, timeout deep_search, rate limit |
pip install pytest pytest-asyncio homeassistant --break-system-packages python -m pytest custom_components/config_auditor/tests/ -v python -m pytest custom_components/config_auditor/tests/test_llm_api.py -v
pytest.ini à la racine du repo configure asyncio_mode = auto. Ce fichier ne doit pas être inclus dans le zip de distribution.pytest.ini à la racine du repo configure asyncio_mode = auto. Il ne doit pas être inclus dans le zip de distribution.
Contribuer à H.A.C.A
Toute contribution est bienvenue — bug fix, nouvelle fonctionnalité, documentation ou traduction.
Workflow Git
# 1. Fork + clone git clone https://github.com/VOTRE_USERNAME/ha-config-auditor.git cd ha-config-auditor # 2. Branche feature git checkout -b feature/ma-fonctionnalite # 3. Développer et tester python -m pytest custom_components/config_auditor/tests/ -v cd www && bash build.sh # 4. Commit (Conventional Commits) git commit -m "feat: add configurable report frequency" git commit -m "fix: _async_find_all_ai_task_entities entity_registry match" git commit -m "security: add @require_admin to handle_apply_field_fix" # 5. Push + Pull Request git push origin feature/ma-fonctionnalite
Checklist Pull Request
- Tests unitaires ajoutés/mis à jour pour les nouvelles fonctionnalités
python -m pytest tests/passe sans erreur (0 failed)cd www && bash build.shsi le JS a été modifié- Traductions FR et EN mises à jour si nouveaux textes UI
- 13 langues synchronisées (toutes les clés présentes dans chaque fichier)
CHANGELOG.mdetCHANGELOG_fr.mdmis à jour- Version mise à jour dans
const.py,manifest.jsonettranslations/*.json - Handlers WebSocket destructifs protégés par
@require_admin - Pas de secrets ou données personnelles dans le code
Bonnes pratiques HA
hass.async_add_executor_job()._atomic_write + _safe_write_and_reload (rollback automatique).@require_admin sur tout handler destructif. Valider les chemins avec os.path.realpath().entity_registry.async_get(entity_id) pour les métadonnées.panel.* (pas à la racine).