7.3 KiB
7.3 KiB
CONSIGNE — Claude Code — Webapp “HA Entity Scanner & Manager”
Objectif
Développer une webapp self-hosted (Docker) qui se connecte à Home Assistant (URL : http://10.0.0.2:8123 et token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhNjI1NzkyYjZhZmE0MTliOTEwMmFiMGQ4YjExNDZjNiIsImlhdCI6MTc3MTY4MTE2NSwiZXhwIjoyMDg3MDQxMTY1fQ.uus2-4HCDFajj2oFPiiW9b3KjhxF-DdhFN0XuZ_n5E8) pour :
- Scanner / récupérer la liste des entités,
- Afficher une page web avec liste + filtres,
- Permettre de désactiver une ou plusieurs entités (ou, si la désactivation native n’est pas possible via API HA, fournir une alternative fiable et clairement indiquée à l’utilisateur).
Contraintes et attentes générales
- Langue UI : français.
- UI : claire, orientée “admin”, table + panneaux, responsive.
- Architecture standard : Backend API + Frontend.
- Stockage : SQLite par défaut (persistant via volume Docker).
- Auth : au minimum token HA côté backend (jamais exposé côté frontend). Idéalement variable d’environnement.
- Journalisation : logs backend lisibles + page “Journal” simple (dernières actions : scan, désactivation, erreurs).
- Fournir un README (installation, variables d’env, utilisation).
- Ne jamais bloquer l’UI : scan asynchrone + état d’avancement.
Périmètre fonctionnel (MVP)
A. Connexion Home Assistant
- Paramètres :
HA_BASE_URL = http://10.0.0.2:8123HA_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhNjI1NzkyYjZhZmE0MTliOTEwMmFiMGQ4YjExNDZjNiIsImlhdCI6MTc3MTY4MTE2NSwiZXhwIjoyMDg3MDQxMTY1fQ.uus2-4HCDFajj2oFPiiW9b3KjhxF-DdhFN0XuZ_n5E8
- Tester la connexion via l’API REST Home Assistant.
- Si erreur : message UI explicite (HTTP code + cause probable).
B. Récupération des entités
- Récupérer la liste des entités (au minimum :
entity_id,state,attributes,last_changed,last_updated). - Normaliser les champs utiles pour l’affichage :
domain(ex: light, switch, sensor)friendly_namedevice_class,unit_of_measurement,iconarea_id/device_id/integrationsi accessibles (sinon marquer “non disponible”)- booléen
is_hidden/is_disabled/is_availablesi déductible
- Mettre en cache en base (table
entities_cache) et timestamp du dernier scan.
C. UI de listing + actions
- Page principale : tableau (virtualisé si besoin) avec colonnes configurables.
- Action : sélection multiple (checkbox) + actions en lot :
- “Désactiver”
- “Réactiver” (si applicable)
- “Masquer (UI)” (fallback si désactivation native impossible)
- Afficher un panneau “Détails” à droite quand on clique une entité :
- attributs bruts JSON
- infos clés (domain, nom, device_class, etc.)
- boutons d’action sur cette entité
“Désactiver une entité” — règles d’implémentation
Home Assistant n’offre pas toujours une “désactivation” universelle via une simple API REST. Claude Code doit :
- Rechercher la méthode la plus correcte selon le type d’entité :
- Si l’entité est gérable via registry (entity_registry / device_registry) via WebSocket API, utiliser la méthode officielle.
- Sinon, proposer un fallback :
- “Masquer” (côté HA si possible via registry) ou “Ignorer dans l’app” (flag local DB) avec libellé clair.
- Option “Désactiver en empêchant les services” : non (trop intrusif) sauf si explicitement demandé.
- L’UI doit indiquer clairement ce que fait l’action (désactivation HA réelle vs masquage/ignore local).
- Toute action doit être journalisée (quoi, qui, quand, résultat, erreur).
Brainstorming — filtres “judicieux” à implémenter
Implémenter une barre de filtres combinables + chips actives :
- Recherche texte (entity_id, friendly_name).
- Domain (multi-select) : light/switch/sensor/… + compteur par domaine.
- État :
stateexact (on/off/…)- “Indisponible” (
unavailable,unknown)
- Disponibilité :
- disponibles vs indisponibles
- Dernier changement :
- “modifié dans les 5 min / 1 h / 24 h”
- Attributs :
device_class(multi-select)unit_of_measurement(multi-select)
- Source / intégration (si accessible) :
- ZHA / Zigbee2MQTT / ESPHome / MQTT / Tapo / Reolink / …
- Zone / Pièce (area) si accessible.
- Entités problématiques (smart filters) :
- “spam logbook” : change très souvent (détecter fréquence)
- “entités orphelines” : pas de device_id / integration inconnue
- “noms manquants” : pas de friendly_name
- Statut de gestion (dans l’app) :
- “Désactivées”
- “Masquées”
- “Ignorées localement”
- Favoris :
- Marquer favori (flag local) pour accès rapide.
UX attendue
- En-tête :
- bouton “Scanner maintenant”
- indicateur “Dernier scan : …”
- statut connexion HA (OK/KO)
- Zone filtres :
- champ recherche + filtres en dropdown + chips
- Table :
- tri colonnes (domain, nom, last_changed, state)
- pagination ou virtual scroll
- multi-sélection + actions groupées
- Panneau latéral détails :
- affichage propre des attributs JSON
- actions rapides (désactiver/masquer/ignorer/favori)
Tech recommandée (choix par défaut)
- Backend : Python FastAPI
- Client HA via REST + WebSocket (si nécessaire pour registry)
- SQLite via SQLModel ou SQLAlchemy
- Frontend : Vue 3 + Vite (ou React si préféré), UI simple
- Docker :
docker-compose.ymlavec volumes (db + config)- variables d’environnement pour
HA_BASE_URL,HA_TOKEN
Endpoints backend (à produire)
GET /api/health: état de l’app + état HAPOST /api/scan: lance un scan (asynchrone)GET /api/entities: liste paginée + filtres (query params)GET /api/entities/{entity_id}: détailsPOST /api/entities/actions: actions bulk (disable/enable/hide/unhide/ignore/unignore/favorite/unfavorite)GET /api/audit: dernières actions
Données (SQLite)
Tables minimales :
entities_cache: entity_id (PK), domain, friendly_name, state, attrs_json, last_changed, last_updated, fetched_atentity_flags: entity_id (PK), ignored_local (bool), favorite (bool), notes (text)audit_log: id, ts, action, entity_ids_json, result, error
Exigences qualité
- Gestion d’erreurs explicite (HA down, token invalide, timeout).
- Timeout réseau configurable.
- Tests minimaux :
- test de parsing entités
- test filtre domain/state
- test “action bulk” (mock HA)
- Sécurité :
- le token HA ne doit jamais apparaître dans le HTML/JS.
- CORS maîtrisé.
Livrables attendus
- Arborescence projet complète.
docker-compose.yml- Backend FastAPI prêt à lancer.
- Frontend page unique fonctionnelle.
README.mdclair.- Une section “Limitations” expliquant la différence entre :
- désactivation réelle HA via registry (si implémentée)
- masquage/ignore local si non possible selon entité.
Ordre de réalisation imposé
- Backend : health + scan + entities list (sans disable)
- Frontend : page liste + filtres + détails
- Ajout flags locaux (ignore/favorite)
- Implémenter “désactiver/masquer” via API HA la plus officielle possible
- Audit log + finitions UI + README final