This commit is contained in:
pporcheret
2026-10-26 00:06:24 +01:00
parent c9c3d5f223
commit cd37ac3c0a
207 changed files with 19205 additions and 54 deletions
+65 -42
View File
@@ -1,59 +1,82 @@
# Alfred — Interface mise à jour depuis interface.zip (24/10/2026)
# Alfred — Vues dynamiques & Calendrier Home Assistant (V1)
## Modifications
Base : votre **alfredapp.zip** du 25 octobre 2026. Aucun avatar n’est ajouté. Les fonctions Vosk, Hermes, Wyoming Piper, caméra locale, contrôles audio et ComfyUI sont conservées.
- Coin supérieur gauche : état réel de l'agent (`idle`, `listening`, `thinking`, `speaking`, `error`) avec libellé en français. Le titre « Alfred » est supprimé de la page.
- Coin supérieur droit : bouton « réglages audio » ouvrant un panneau flottant (volume sortie, sensibilité micro ALSA, mute micro), et bouton « couper/réactiver le son » (mute haut-parleur).
- Coin inférieur droit : transcription Vosk partielle puis finale, conservée pendant le retour à la veille. Les données arrivent des événements Socket.IO `alfred_state` existants (`partial` et `transcript`).
- Coin inférieur gauche : prévisualisation webcam MJPEG en direct. La caméra s'ouvre **uniquement sur clic** pour ne pas occuper en permanence la caméra utilisée par le MCP facial, et s'arrête lorsque l'onglet devient invisible.
- Protection supplémentaire : le texte d'Hermes est rendu sans injection de code HTML dans la page.
## Installation : patch (conseillé)
## Installation
À effectuer sur la machine Alfred après transfert du ZIP, en étant dans son dossier parent `/opt/alfred` :
1. Sauvegarder **/opt/alfred/app**. Le ZIP de mise à jour ne contient que les fichiers ajoutés/modifiés, sous `app/`.
2. Décompresser `Alfred_Calendrier_HA_V1_PATCH.zip` sous **/opt/alfred/** (pas sous `/opt/alfred/app`, sinon vous obtiendrez `app/app`).
3. Activer votre environnement Python habituel et installer les dépendances si nécessaire :
```bash
sudo systemctl stop alfred
sudo cp -a /opt/alfred/app /opt/alfred/app.sauvegarde-$(date +%Y%m%d-%H%M%S)
cd /opt/alfred
sudo unzip -o /tmp/Alfred_Interface_Reorganisation_V1.zip
python3 -m py_compile /opt/alfred/app/app.py /opt/alfred/app/services/camera.py
sudo systemctl start alfred
sudo journalctl -u alfred -n 50 --no-pager
sudo cp -a /opt/alfred/app /opt/alfred/app.sauvegarde.$(date +%Y%m%d_%H%M%S)
sudo unzip -o /tmp/Alfred_Calendrier_HA_V1_PATCH.zip -d /opt/alfred
cd /opt/alfred/app
# Utiliser le pip du venv exécutant app.py :
/path/vers/venv/bin/python -m pip install requests websocket-client
/path/vers/venv/bin/python -m py_compile app.py services/ha_views.py services/alfred_intents.py services/alfred_views_controller.py
```
Le ZIP remplace uniquement :
Le script de démarrage systemd existant n’est **pas modifié**.
```
app/app.py
app/templates/index.html
app/static/css/alfred.css
app/static/css/alfred-controls.css
app/static/js/alfred.js
app/static/js/alfred-controls.js
app/static/js/alfred-camera.js (nouveau)
app/services/camera.py
## Variables d’environnement à fournir à `alfred.service`
```ini
HA_URL=http://192.168.1.XXX:8123
HA_TOKEN=JETON_LONGUE_DUREE_HOME_ASSISTANT
ALFRED_TIMEZONE=Europe/Paris
# Limiter aux calendriers choisis (laisser absent pour lire tous les calendriers autorisés au jeton) :
# HA_CALENDARS=calendar.famille,calendar.alfred
# Permet de cibler un calendrier pour les créations vocales :
# HA_DEFAULT_CALENDAR=calendar.alfred
# Pour restreindre les caméras visibles (ex. uniquement les caméras extérieures) :
# HA_CAMERAS=camera.entree,camera.jardin
# L'écriture est OFF par sécurité ; l'activer après validation de la lecture :
ALFRED_ALLOW_CALENDAR_WRITES=true
```
## Webcam
Mettre ces valeurs **dans l’environnement du service** (par exemple un fichier `EnvironmentFile=` de systemd ou fichier `.env` effectivement chargé par `/opt/alfred/app/app.py`). **Ne pas mettre le jeton dans le navigateur ni dans le ZIP.** Si l’application utilise `load_dotenv()`, un fichier `.env` dans son répertoire de travail peut convenir, mais vérifiez `systemctl cat alfred` avant de choisir son emplacement.
- Index de la caméra par défaut : 0, réglable avec `CAMERA_INDEX=1` (ou autre) dans l'environnement du service Alfred.
- Options facultatives : `CAMERA_WIDTH=640`, `CAMERA_HEIGHT=480`, `CAMERA_FPS=8`, `CAMERA_JPEG_QUALITY=75`.
- `cv2` / OpenCV doit être installé dans **l'environnement Python d'Alfred**, par exemple `python -m pip install opencv-python-headless` depuis son venv (uniquement si absent).
- Tester le périphérique : `ls -l /dev/video*`.
- URL du flux : `http://IP_ALFRED:54321/api/camera/stream`.
- Si le MCP de reconnaissance faciale utilise déjà la webcam en exclusivité, le flux peut échouer. Désactiver la prévisualisation avant une capture MCP si nécessaire. Cette version ne partage pas les images entre les processus.
- Attention : le flux est actuellement accessible à toute personne ayant accès au serveur Flask (aucune authentification intégrée à l'application de départ). Ne pas exposer le port 54321 sur Internet sans contrôle d'accès.
Après modification des paramètres systemd : `sudo systemctl daemon-reload`. Puis `sudo systemctl start alfred` et `sudo journalctl -u alfred -f`.
## Audio
L’utilisateur associé à HA_TOKEN doit avoir des droits lecture sur les calendriers voulus et des droits écriture sur ceux à modifier. Les calendriers Google ou externes en lecture seule ne permettront pas l’écriture. Certains calendriers n’acceptent pas la suppression.
Le bouton « Mute » en haut à droite agit sur **le haut-parleur**. Le mute du **microphone** se trouve dans le popup audio. Tous les réglages utilisent l'API POST `/api/audio/settings` existante.
## Tests initiaux
## Tests réalisés
1. Ouvrir `http://IP_ALFRED:54321/`. Appuyer sur l'icône **Agenda**.
2. Tester `http://IP_ALFRED:54321/api/calendar/calendars` puis `http://IP_ALFRED:54321/api/calendar/events` depuis une session réseau de confiance.
3. Dire « Alfred, montre-moi mon planning sur sept jours » puis « Et demain ? ».
4. Faire un événement de test via le bouton **+ Rendez-vous** dans un calendrier HA disposant de l'option création.
5. Depuis la grille, ouvrir cet événement, demander sa suppression, puis confirmer la boîte de dialogue ; vérifier l'événement dans HA.
- Compilation syntaxique de `app.py` et `camera.py`.
- Vérification syntaxique des trois scripts JavaScript au moyen de `node --check`.
- Validation des identifiants des contrôles de l'interface.
- Test du générateur MJPEG, du verrou d'accès à la caméra et de sa libération sur fermeture, avec une caméra simulée.
**Commandes prises en charge** : « mon agenda aujourd'hui », « demain », « ce matin », « cet après-midi », « ce soir », « dans la journée », « le 8 novembre », « sur 3 jours », « sur 7 jours », « cette semaine », « la semaine prochaine », « ce mois », « ai-je des choses prévues demain ? », « ajoute un rendez-vous dentiste demain à 15 h dans le calendrier Famille », « supprime mon rendez-vous dentiste demain », « confirme » / « annule », « montre les températures », « affiche les caméras », « reviens à l'accueil ».
Non testés : affichage en conditions réelles sous Chromium, accès à la caméra physique du MINISFORUM, intégration réelle à Vosk/ALSA. L'environnement de test empêche la navigation Chromium locale.
### Écriture vocale et sécurité
- Pour une création entièrement spécifiée (date, heure, calendrier, titre), Alfred propose l'événement et **attend « confirme »** avant d'enregistrer. Si des éléments manquent, il affiche un formulaire prérempli ; il ne devine pas le calendrier ou l'heure.
- Pour une suppression, Alfred recherche l'événement par nom/période, exige un identifiant HA `uid` et une **confirmation explicite**. Si plusieurs événements correspondent, l'écran permet de choisir. Une confirmation vocale expire après 90 secondes ; elle n'est pas sauvegardée après redémarrage. Pour une série récurrente sans `recurrence_id`, la suppression peut affecter toute la série ; la boîte de dialogue l'indique.
- `ALFRED_ALLOW_CALENDAR_WRITES` désactive la création/suppression par défaut ; l'activer seulement sur un réseau de confiance et un utilisateur Home Assistant aux droits restreints. **Cette application ne fournit pas d'authentification utilisateur complète** : ne pas exposer Flask à Internet ni à un réseau non fiable. Les événements contiennent des données personnelles.
- La création utilise `POST /api/services/calendar/create_event`. La suppression utilise la commande HA WebSocket `calendar/event/delete`, **pas** un service REST inexistant.
### Vue capteurs et caméras
- Les températures sont les entités HA `sensor` ayant `device_class: temperature`, plus les températures courantes des entités `climate`. Le clic ouvre un graphique des dernières 24 h (si l'API d'historique HA fournit des points).
- La vue Caméras Home Assistant affiche des **instantanés** sécurisés derrière Flask, rafraîchis toutes les 15 s et seulement quand la vue est ouverte. Ce n'est pas un flux vidéo WebRTC/RTSP. La petite prévisualisation de la webcam locale existante reste inchangée.
- Le bouton Accueil ou la commande vocale rétablit la page d'accueil.
### Remarques sur le contexte Hermes
Ce patch **ne modifie pas `hermes_client.py`, `identity.md`, les sessions Hermes ou le MCP Home Assistant**. Les commandes visuelles explicites sont détectées côté Flask ; les autres demandes continuent vers Hermes et ses MCP, pour éviter de réintroduire la limitation du contexte qui avait empêché la génération ComfyUI.
### Limites connues
- L'interprétation vocale des dates suit un jeu de règles françaises (aujourd'hui/demain/jour de la semaine/jour et mois). Une formulation très libre peut nécessiter le formulaire tactile ou Hermes ; le routeur ne doit pas improviser une écriture.
- La couleur des événements suit la liste des calendriers ; elle n'est pas encore configurable.
- Certains calendriers de HA ne transmettent pas `uid` ou sont en lecture seule : leurs événements restent consultables, mais ne peuvent pas être supprimés dans Alfred.
- Les appels HA ne sont pas testables depuis ce fichier d'installation sans accès à votre serveur/token ; les validations automatiques portent sur la syntaxe, le routage vocal et des réponses HA simulées.
- Les requêtes de lecture et de mutation sont faites directement de Flask vers Home Assistant, **sans dupliquer les calendriers**. C'est un adaptateur de source, réutilisable pour d'autres fournisseurs plus tard.
## Restauration
Arrêter Alfred puis restaurer le dossier sauvegardé. Ne pas copier `identity.md` d'anciennes archives si vous l'aviez volontairement désactivé.