add ha skill

This commit is contained in:
2026-05-16 06:38:22 +02:00
parent d131eeec5d
commit 22f79d68f0
5 changed files with 698 additions and 0 deletions
+333
View File
@@ -0,0 +1,333 @@
---
name: ha-log-investigator
version: 1.0.0
description: >
Expert Home Assistant (utilisateur, développeur, débogage). À utiliser dès que l'utilisateur
mentionne Home Assistant, HA, des intégrations, des entités, des dashboards Lovelace, des
automatisations, des logs, des erreurs ou des problèmes de configuration HA. Analyse le système,
détecte les problèmes, génère des rapports de réparation et d'amélioration. Toujours déclencher
ce skill même si la demande semble simple — "mon HA bug", "erreur intégration", "entité unavailable",
"log HA", "dashboard cassé" suffisent.
agents: [claude-code]
category: infra
tags: [homeassistant, home-assistant, HA, domotique, IoT, automation, lovelace]
---
# Home Assistant Log Investigator
Tu es un expert Home Assistant polyvalent : utilisateur avancé, développeur d'intégrations et spécialiste du débogage. Tu raisonnes **toujours en français**, tu t'appuies sur la documentation officielle HA, et tu n'inventes jamais de solution non documentée.
## Principe fondamental
> **Ne jamais proposer une solution si tu n'as pas trouvé sa documentation officielle.**
> Si tu n'es pas certain, dis-le explicitement et oriente vers `https://www.home-assistant.io/docs/` ou la communauté.
---
## Phase 0 — Connexion et credentials
### Méthode 1 : MCP Home Assistant (prioritaire)
Si le tool `mcp__claude_ai_homeassistant__authenticate` est disponible, l'utiliser en premier.
- Lance l'authentification OAuth
- Une fois authentifié, le MCP donne accès direct à l'API HA
### Méthode 2 : REST API (avec token)
Si le fichier `.claude/ha-credentials.md` existe, lire l'URL et le token dedans.
Si le fichier n'existe pas, demander à l'utilisateur :
- URL de l'instance (ex: `http://homeassistant.local:8123`)
- Long-lived access token (Profil → Tokens de longue durée)
- Puis sauvegarder dans `.claude/ha-credentials.md` (voir format ci-dessous)
### Méthode 3 : SSH (accès système complet)
Pour l'analyse des logs système, de l'espace disque et des fichiers de config, SSH est nécessaire.
Demander si non fourni :
- Hôte SSH (IP ou hostname)
- Utilisateur (souvent `root` sur HA OS)
- Mot de passe ou chemin de clé privée
### Format du fichier de credentials `.claude/ha-credentials.md`
```markdown
---
ha_url: http://homeassistant.local:8123
ha_token: eyJ0eXAiOiJKV1QiLCJhbGci...
ssh_host: 192.168.1.x
ssh_user: root
ssh_key: ~/.ssh/id_rsa
---
# Credentials Home Assistant
Généré automatiquement par ha-log-investigator.
Ne pas committer ce fichier.
```
Ajouter `.claude/ha-credentials.md` au `.gitignore` si applicable.
---
## Phase 1 — Vérification de la version HA
**Toujours commencer par récupérer la version avant toute analyse.**
Via REST API :
```bash
curl -s -H "Authorization: Bearer TOKEN" http://HA_URL/api/ | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('version','?'))"
```
Via MCP : appeler l'endpoint `/api/` pour lire `version`.
Via SSH (HA OS) :
```bash
ssh root@HA_HOST "ha core info | grep version"
```
Stocker la version (ex: `2025.5.3`) — **toutes les recommandations doivent être compatibles avec cette version**.
---
## Phase 2 — Synthèse hardware du système
Collecter via SSH (ou terminal HA si disponible) :
```bash
# CPU et mémoire
ssh root@HA_HOST "cat /proc/cpuinfo | grep 'model name' | head -1; free -h; uptime"
# Espace disque
ssh root@HA_HOST "df -h"
# Température CPU (si disponible)
ssh root@HA_HOST "cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null | awk '{print $1/1000 \"°C\"}'"
```
Générer un bloc de synthèse :
```
=== SYSTÈME ===
CPU : [modèle]
RAM : [utilisée] / [totale] ([%])
Disque : [utilisé] / [total] sur [partition] ([%])
Uptime : [durée]
Temp CPU: [°C si disponible]
HA ver : [version]
```
---
## Phase 3 — Analyse des logs Home Assistant
### Récupérer les logs récents
Via REST API :
```bash
curl -s -H "Authorization: Bearer TOKEN" "http://HA_URL/api/error_log"
```
Via SSH :
```bash
ssh root@HA_HOST "cat /config/home-assistant.log | tail -500"
# ou pour HA Core dans Docker :
# docker logs homeassistant 2>&1 | tail -500
```
### Classifier les entrées
| Niveau | Priorité | Action |
|--------|----------|--------|
| ERROR | Critique | Analyser en premier |
| WARNING| Moyen | Analyser si répété |
| INFO | Faible | Ignorer sauf si suspect |
| DEBUG | Très faible | Ignorer |
### Patterns d'erreurs courants à détecter
- `Error while setting up integration` → intégration défaillante
- `Platform X not ready` → intégration qui n'arrive pas à démarrer
- `Entity X is None` → entité mal configurée
- `Template error` → erreur de template Jinja2
- `Unexpected error` → bug potentiel
- `SSL certificate` → problème de certificat
- `Connection refused` / `Timeout` → service distant inaccessible
- `deprecated` → usage d'API deprecated
Pour chaque erreur trouvée, noter : composant, message exact, fréquence, premier/dernier horodatage.
---
## Phase 4 — Détection des intégrations fautives
Via REST API :
```bash
# Lister toutes les intégrations configurées
curl -s -H "Authorization: Bearer TOKEN" "http://HA_URL/api/config/config_entries/entry"
# State des intégrations
curl -s -H "Authorization: Bearer TOKEN" "http://HA_URL/api/config/config_entries/entry" | python3 -c "
import sys, json
entries = json.load(sys.stdin)
for e in entries:
if e.get('state') not in ['loaded', 'setup_in_progress']:
print(f\"[{e.get('state','?')}] {e.get('title','?')} ({e.get('domain','?')})\")"
```
Identifier :
- État `setup_error`, `setup_retry`, `failed_unload`, `not_loaded`
- Intégrations dépréciées (croiser avec les notes de version HA)
- Intégrations connues pour des problèmes dans la version installée
---
## Phase 5 — Erreurs dans les dashboards (Lovelace)
Via SSH ou lecture de fichier :
```bash
ssh root@HA_HOST "cat /config/ui-lovelace.yaml 2>/dev/null || ls /config/.storage/lovelace* 2>/dev/null"
# Lire le storage Lovelace
ssh root@HA_HOST "cat /config/.storage/lovelace 2>/dev/null | python3 -m json.tool"
```
Détecter :
- Références à des entités inexistantes (`entity: sensor.xyz` qui n'apparaît pas dans les states)
- Custom cards non chargées (`custom:` sans ressource correspondante)
- Dashboards en mode YAML avec syntaxe invalide
Via REST API pour valider les entités référencées :
```bash
curl -s -H "Authorization: Bearer TOKEN" "http://HA_URL/api/states" | python3 -c "
import sys, json
states = json.load(sys.stdin)
entity_ids = {s['entity_id'] for s in states}
print(f'{len(entity_ids)} entités actives')"
```
---
## Phase 6 — Entités problématiques
Via REST API :
```bash
curl -s -H "Authorization: Bearer TOKEN" "http://HA_URL/api/states" | python3 -c "
import sys, json
states = json.load(sys.stdin)
problems = []
for s in states:
if s['state'] in ['unavailable', 'unknown']:
problems.append((s['entity_id'], s['state'], s['attributes'].get('friendly_name', '')))
for eid, state, name in sorted(problems):
print(f'[{state.upper()}] {eid} — {name}')
print(f'\nTotal problématiques : {len(problems)} / {len(states)}')"
```
Pour chaque entité problématique :
1. Identifier le domaine (sensor, switch, light, etc.)
2. Chercher dans les logs une erreur associée
3. Vérifier la config YAML correspondante
4. Proposer une correction documentée
---
## Phase 7 — Analyse des fichiers de configuration
```bash
# Fichiers principaux à analyser
ssh root@HA_HOST "cat /config/configuration.yaml"
ssh root@HA_HOST "cat /config/automations.yaml 2>/dev/null | wc -l && echo automatisations"
ssh root@HA_HOST "cat /config/scripts.yaml 2>/dev/null | wc -l && echo scripts"
ssh root@HA_HOST "cat /config/scenes.yaml 2>/dev/null"
ssh root@HA_HOST "ls /config/packages/ 2>/dev/null"
```
Valider la config HA (si accessible) :
```bash
ssh root@HA_HOST "ha core check" # HA OS
# ou
ssh root@HA_HOST "docker exec homeassistant python -m homeassistant --config /config --script check_config"
```
Vérifier :
- Indentation YAML correcte
- Références à des secrets (`!secret`) qui existent dans `secrets.yaml`
- `packages:` correctement structurés
- `customize:` cohérent avec les entités existantes
- Intégrations configurées en YAML qui ont migré en UI (peuvent causer des conflits)
---
## Phase 8 — Génération de `repair.md`
Lire le template depuis `templates/repair-template.md` et générer le fichier `repair.md` dans le répertoire courant.
Structure du rapport :
```markdown
# Rapport de réparation Home Assistant
Généré le : [date]
Version HA : [version]
Instance : [url]
## Résumé système
[bloc hardware phase 2]
## Problèmes critiques (à traiter en priorité)
### [Intégration/Entité X]
- **Symptôme** : [message d'erreur exact]
- **Cause probable** : [explication]
- **Solution** : [étapes documentées avec liens]
- **Documentation** : [lien officiel]
## Avertissements
[même structure, pour les WARNING]
## Intégrations à vérifier
[liste des intégrations en état non-loaded]
## Entités indisponibles ([N] total)
[liste groupée par domaine]
```
---
## Phase 9 — Génération de `best_entity.md`
Lire le template depuis `templates/best-entity-template.md` et générer le fichier `best_entity.md`.
Proposer des améliorations dans ces catégories :
### Automatisations
- Détecter les automatisations manquantes évidentes (ex: lumières sans déclencheur de présence)
- Suggérer des blueprints officiels HA pertinents
- Identifier les automatisations redondantes ou conflictuelles
### Entités et nommage
- Conventions de nommage cohérentes (`domaine.pièce_appareil`)
- `friendly_name` manquants ou incohérents
- `device_class` non défini alors qu'il devrait l'être
- Groupes d'entités à créer pour simplifier les dashboards
### Configuration optimale
- Suggestions de `recorder` filtering pour réduire la taille de la DB
- `logbook` filtering pour réduire le bruit
- `history` configuration
- Purgation de la base de données
### Scripts réutilisables
- Patterns répétitifs dans les automatisations → suggérer des scripts
---
## Règles absolues
1. **Vérifier la version avant toute recommandation** — une solution valide en 2024.1 peut casser en 2025.5
2. **Jamais d'invention** — si la documentation officielle n'existe pas, le dire clairement
3. **Toujours citer la source** — inclure le lien `https://www.home-assistant.io/...` dans chaque correction
4. **Tester avec `check_config`** avant de recommander un changement YAML
5. **Backup first** — rappeler à l'utilisateur de faire un backup avant toute modification
## Références utiles
- Docs HA : `https://www.home-assistant.io/docs/`
- Breaking changes : `https://www.home-assistant.io/blog/` (notes de version)
- Intégrations : `https://www.home-assistant.io/integrations/`
- API REST : `https://developers.home-assistant.io/docs/api/rest/`
- Community : `https://community.home-assistant.io/`
Voir `references/ha-common-errors.md` pour un catalogue des erreurs fréquentes et leurs solutions documentées.
@@ -0,0 +1,114 @@
# Erreurs Home Assistant fréquentes — Catalogue documenté
## Intégrations
### `Platform X not ready`
- **Cause** : Le service distant n'est pas encore accessible au démarrage de HA
- **Solution** : Ajouter `initial_state: false` ou augmenter `scan_interval`. Vérifier la connectivité réseau.
- **Doc** : https://www.home-assistant.io/integrations/#configuration-check
### `Error while setting up integration X`
- **Cause** : Credentials invalides, service inaccessible, config incorrecte
- **Solution** : Supprimer et reconfigurer l'intégration via Paramètres → Intégrations
- **Doc** : https://www.home-assistant.io/docs/configuration/
### `Integration X already exists`
- **Cause** : Intégration configurée à la fois en YAML et en UI
- **Solution** : Retirer la config YAML si l'intégration supporte l'UI (voir doc de l'intégration)
- **Doc** : https://www.home-assistant.io/docs/configuration/packages/
### `Deprecated`
- **Cause** : Usage d'une API ou d'un format deprecated
- **Solution** : Consulter les release notes de la version HA installée
- **Doc** : https://www.home-assistant.io/blog/ (chercher la version concernée)
---
## Entités
### `unavailable`
- **Cause possible 1** : Appareil physique hors ligne
- **Cause possible 2** : Intégration en erreur
- **Cause possible 3** : Template invalide
- **Diagnostic** : Vérifier les logs pour le nom de l'entité
### `unknown`
- **Cause** : L'entité existe mais n'a pas encore reçu de valeur (souvent au démarrage)
- **Normal** : Peut disparaître après quelques secondes/minutes
- **Problématique** : Si persiste, vérifier la config
### Template error
```
Error rendering template: UndefinedError: 'sensor.xyz' is undefined
```
- **Solution** : Utiliser `states('sensor.xyz')` au lieu de `states.sensor.xyz.state` (plus robuste)
- **Doc** : https://www.home-assistant.io/docs/configuration/templating/
---
## Base de données / Recorder
### `Database disk usage: X MB`
- **Cause** : Base de données SQLite trop volumineuse
- **Solution** : Configurer `recorder` avec `purge_keep_days` et exclure les entités à haute fréquence
```yaml
recorder:
purge_keep_days: 7
exclude:
entity_globs:
- sensor.*_signal_strength
- sensor.*_rssi
```
- **Doc** : https://www.home-assistant.io/integrations/recorder/
---
## Lovelace / Dashboards
### Custom card non chargée
```
Custom element doesn't exist: custom-card-name
```
- **Cause** : La ressource custom card n'est pas déclarée ou le fichier est manquant
- **Solution** : Paramètres → Tableaux de bord → Ressources → Ajouter le JS
- **Doc** : https://www.home-assistant.io/dashboards/dashboards/
### Entité manquante dans dashboard
```
Entity not available: sensor.xyz
```
- **Solution** : Vérifier que l'entité existe (`États` dans les outils de développement), corriger le nom dans la carte
---
## Réseau / SSL
### `SSL CERTIFICATE_VERIFY_FAILED`
- **Cause** : Certificat auto-signé ou expiré
- **Solution** : Vérifier `verify_ssl: false` pour les connexions internes (non recommandé en prod), ou renouveler le certificat
- **Doc** : https://www.home-assistant.io/docs/configuration/securing/
### `Connection refused` / `Cannot connect to host`
- **Cause** : Service distant éteint ou port bloqué par firewall
- **Diagnostic** : `ping`, `telnet HOST PORT` depuis le host HA
---
## YAML / Configuration
### Indentation YAML incorrecte
- **Erreur** : `mapping values are not allowed here`
- **Outil** : https://yaml-online-parser.appspot.com/
- **Conseil** : Utiliser 2 espaces, jamais de tabulations
### `!secret not found`
- **Cause** : La clé référencée n'existe pas dans `secrets.yaml`
- **Solution** : Ajouter la clé dans `/config/secrets.yaml`
### Config check
```bash
# HA OS
ha core check
# Docker
docker exec homeassistant python -m homeassistant --config /config --script check_config
```
+39
View File
@@ -0,0 +1,39 @@
#!/bin/bash
# Collecte les infos système du host Home Assistant via SSH
# Usage: ./ha-system-info.sh [user@host]
HOST="${1:-root@homeassistant.local}"
echo "=== COLLECTE SYSTÈME HOME ASSISTANT ==="
echo "Hôte : $HOST"
echo "Date : $(date)"
echo ""
echo "--- CPU ---"
ssh "$HOST" "cat /proc/cpuinfo | grep 'model name' | head -1 | cut -d: -f2 | xargs" 2>/dev/null || echo "N/A"
echo ""
echo "--- MÉMOIRE ---"
ssh "$HOST" "free -h" 2>/dev/null || echo "N/A"
echo ""
echo "--- DISQUE ---"
ssh "$HOST" "df -h" 2>/dev/null || echo "N/A"
echo ""
echo "--- UPTIME ---"
ssh "$HOST" "uptime" 2>/dev/null || echo "N/A"
echo ""
echo "--- TEMPÉRATURE CPU ---"
ssh "$HOST" "cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null | awk '{printf \"%.1f°C\n\", \$1/1000}'" 2>/dev/null || echo "N/A"
echo ""
echo "--- VERSION HOME ASSISTANT ---"
ssh "$HOST" "ha core info 2>/dev/null | grep version || grep -r 'homeassistant:' /config/configuration.yaml 2>/dev/null | head -5 || echo 'Utiliser lAPI REST pour la version'" 2>/dev/null
echo ""
echo "--- LOGS RÉCENTS (50 dernières erreurs/warnings) ---"
ssh "$HOST" "cat /config/home-assistant.log 2>/dev/null | grep -E '(ERROR|WARNING)' | tail -50" 2>/dev/null || \
ssh "$HOST" "journalctl -u hassio -n 100 --no-pager 2>/dev/null | grep -E '(ERROR|WARNING)'" 2>/dev/null || \
echo "Logs non accessibles via SSH — utiliser l'API REST"
@@ -0,0 +1,134 @@
# Suggestions d'amélioration Home Assistant
Généré le : {{DATE}}
Version HA : {{HA_VERSION}}
---
## Automatisations suggérées
<!-- Pour chaque automatisation recommandée -->
### [Nom de l'automatisation]
- **Déclencheur** : [event, state, time, etc.]
- **Condition** : [si applicable]
- **Action** : [description]
- **Blueprint disponible** : [URL ou "Non"]
- **Exemple YAML** :
```yaml
automation:
alias: "[Nom]"
trigger:
- platform: [type]
# ...
action:
- service: [service]
# ...
```
- **Documentation** : [URL]
---
## Améliorations des entités
### Nommage et organisation
| Entité actuelle | Nom suggéré | Raison |
|-----------------|-------------|--------|
| `sensor.xxx` | `sensor.pièce_appareil_mesure` | Convention de nommage |
### `friendly_name` manquants
```yaml
# À ajouter dans customize.yaml ou via l'UI
homeassistant:
customize:
sensor.nom_entite:
friendly_name: "Nom lisible"
icon: mdi:icone
```
### `device_class` recommandés
```yaml
sensor:
- platform: template
sensors:
mon_capteur:
device_class: temperature # ou humidity, power, energy...
```
- **Doc** : https://www.home-assistant.io/docs/configuration/customizing-devices/
---
## Optimisation de la base de données
```yaml
# configuration.yaml
recorder:
purge_keep_days: 7
commit_interval: 30
exclude:
domains:
- sun
- weather
entity_globs:
- sensor.*_signal_strength
- sensor.*_rssi
- sensor.*_lqi
entities:
# lister les entités à exclure
```
- **Économie estimée** : [X MB]
- **Documentation** : https://www.home-assistant.io/integrations/recorder/
---
## Scripts réutilisables suggérés
### [Nom du script]
```yaml
script:
nom_script:
alias: "[Nom lisible]"
sequence:
- service: [service]
# ...
```
- **Usage** : [où utiliser ce script]
---
## Configuration recommandée
### Logbook filtering
```yaml
logbook:
exclude:
domains:
- sun
entity_globs:
- sensor.*_signal_strength
```
### History filtering
```yaml
history:
exclude:
domains:
- sun
- weather
```
---
## Pistes d'amélioration avancées
- [ ] [Amélioration 1 — description et lien doc]
- [ ] [Amélioration 2 — description et lien doc]
---
*Suggestions générées par ha-log-investigator. Toutes les recommandations sont basées sur la documentation officielle HA {{HA_VERSION}}.*
@@ -0,0 +1,78 @@
# Rapport de réparation Home Assistant
Généré le : {{DATE}}
Version HA : {{HA_VERSION}}
Instance : {{HA_URL}}
---
## Résumé système
| Ressource | Valeur |
|-----------|--------|
| CPU | {{CPU_MODEL}} |
| RAM | {{RAM_USED}} / {{RAM_TOTAL}} ({{RAM_PCT}}%) |
| Disque | {{DISK_USED}} / {{DISK_TOTAL}} ({{DISK_PCT}}%) |
| Uptime | {{UPTIME}} |
| Temp. CPU | {{CPU_TEMP}} |
---
## Problèmes critiques (à traiter en priorité)
<!-- Répéter ce bloc pour chaque ERROR trouvé -->
### [Composant X] — [description courte]
- **Symptôme** : `[message d'erreur exact extrait des logs]`
- **Fréquence** : [N occurrences depuis [date]]
- **Cause probable** : [explication claire]
- **Solution** :
1. [Étape 1]
2. [Étape 2]
- **Documentation officielle** : [URL https://www.home-assistant.io/...]
- **Compatibilité** : ✅ Confirmé pour HA {{HA_VERSION}}
---
## Avertissements (WARNING)
<!-- Répéter ce bloc pour chaque WARNING significatif -->
### [Composant Y] — [description courte]
- **Symptôme** : `[message]`
- **Action recommandée** : [description]
- **Documentation** : [URL]
---
## Intégrations en erreur
| Intégration | État | Action |
|-------------|------|--------|
| [nom] | setup_error | [action recommandée] |
---
## Entités indisponibles ({{UNAVAILABLE_COUNT}} total)
### Par domaine
#### sensor ({{N}} entités)
- `sensor.nom_entite` — [raison probable]
#### switch ({{N}} entités)
- `switch.nom_entite` — [raison probable]
<!-- etc. -->
---
## Prochaines étapes recommandées
1. [ ] Effectuer un backup complet avant toute modification
2. [ ] Traiter les problèmes critiques dans l'ordre ci-dessus
3. [ ] Redémarrer HA après chaque modification
4. [ ] Vérifier les logs après redémarrage
---
*Rapport généré par ha-log-investigator. Les solutions proposées sont basées sur la documentation officielle Home Assistant.*