Files
ha_explore/consigne.md
2026-02-21 16:55:10 +01:00

151 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 :
1) **Scanner / récupérer** la liste des entités,
2) **Afficher** une page web avec **liste + filtres**,
3) Permettre de **désactiver** une ou plusieurs entités (ou, si la désactivation native nest pas possible via API HA, fournir une alternative fiable et clairement indiquée à lutilisateur).
## 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 denvironnement.
- Journalisation : logs backend lisibles + page “Journal” simple (dernières actions : scan, désactivation, erreurs).
- Fournir un **README** (installation, variables denv, utilisation).
- Ne jamais bloquer lUI : scan asynchrone + état davancement.
## Périmètre fonctionnel (MVP)
### A. Connexion Home Assistant
- Paramètres :
- `HA_BASE_URL = http://10.0.0.2:8123`
- `HA_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhNjI1NzkyYjZhZmE0MTliOTEwMmFiMGQ4YjExNDZjNiIsImlhdCI6MTc3MTY4MTE2NSwiZXhwIjoyMDg3MDQxMTY1fQ.uus2-4HCDFajj2oFPiiW9b3KjhxF-DdhFN0XuZ_n5E8`
- Tester la connexion via lAPI 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 laffichage :
- `domain` (ex: light, switch, sensor)
- `friendly_name`
- `device_class`, `unit_of_measurement`, `icon`
- `area_id` / `device_id` / `integration` si accessibles (sinon marquer “non disponible”)
- booléen `is_hidden` / `is_disabled` / `is_available` si 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 daction sur cette entité
## “Désactiver une entité” — règles dimplémentation
Home Assistant noffre pas toujours une “désactivation” universelle via une simple API REST. Claude Code doit :
1) **Rechercher la méthode la plus correcte** selon le type dentité :
- Si lentité 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 lapp” (flag local DB) avec libellé clair.
- Option “Désactiver en empêchant les services” : non (trop intrusif) sauf si explicitement demandé.
2) LUI doit **indiquer clairement** ce que fait laction (désactivation HA réelle vs masquage/ignore local).
3) 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 :
1) **Recherche texte** (entity_id, friendly_name).
2) **Domain** (multi-select) : light/switch/sensor/… + compteur par domaine.
3) **État** :
- `state` exact (on/off/…)
- “Indisponible” (`unavailable`, `unknown`)
4) **Disponibilité** :
- disponibles vs indisponibles
5) **Dernier changement** :
- “modifié dans les 5 min / 1 h / 24 h”
6) **Attributs** :
- `device_class` (multi-select)
- `unit_of_measurement` (multi-select)
7) **Source / intégration** (si accessible) :
- ZHA / Zigbee2MQTT / ESPHome / MQTT / Tapo / Reolink / …
8) **Zone / Pièce** (area) si accessible.
9) **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
10) **Statut de gestion** (dans lapp) :
- “Désactivées”
- “Masquées”
- “Ignorées localement”
11) **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.yml` avec volumes (db + config)
- variables denvironnement pour `HA_BASE_URL`, `HA_TOKEN`
## Endpoints backend (à produire)
- `GET /api/health` : état de lapp + état HA
- `POST /api/scan` : lance un scan (asynchrone)
- `GET /api/entities` : liste paginée + filtres (query params)
- `GET /api/entities/{entity_id}` : détails
- `POST /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_at
- `entity_flags` : entity_id (PK), ignored_local (bool), favorite (bool), notes (text)
- `audit_log` : id, ts, action, entity_ids_json, result, error
## Exigences qualité
- Gestion derreurs 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.md` clair.
- 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é
1) Backend : health + scan + entities list (sans disable)
2) Frontend : page liste + filtres + détails
3) Ajout flags locaux (ignore/favorite)
4) Implémenter “désactiver/masquer” via API HA la plus officielle possible
5) Audit log + finitions UI + README final