diff --git a/ALFRED.txt b/ALFRED.txt index ce3c9de..252949c 100644 --- a/ALFRED.txt +++ b/ALFRED.txt @@ -1,18 +1,346 @@ -curl -s http://127.0.0.1:54321/api/audio/settings -> status du micro, hp, volumes... +ALFRED.txt +========== +Aide-mémoire technique du projet ALFRED +Version : 26/10/2026 +À adapter selon les chemins et les versions réellement installés. -output: +====================================================================== +1. PRÉSENTATION RAPIDE +====================================================================== -{"mic_gain":74,"mic_muted":true,"speaker_muted":false,"volume":80} +Alfred = assistant domestique local sur mini-PC MINISFORUM Mars MC560. +- Interface Web : Python / Flask + Socket.IO, port 54321 +- Réveil vocal ("Alfred") : Vosk, moteur vosk_keyword +- Reconnaissance des phrases : STT (Vosk dans la chaîne vocale) +- Agent de conversation : Hermes, connecté au serveur IA Ollama +- Synthèse vocale : Piper / Wyoming selon la configuration +- Domotique : Home Assistant (REST pour vues ; MCP via Hermes) +- Images : ComfyUI, utilisé par Hermes et par le module météo +- Vision : webcam locale / OpenCV / YOLO et MCP reconnaissance faciale +Une commande vocale de météo ou d'agenda peut être traitée directement +par Alfred, sans passer par Hermes. Les autres questions passent par Hermes. -curl -s http://127.0.0.1:54321/api/wake/status -> status de Vosk (stt pour le key world "alfred") +====================================================================== +2. SERVICE ET INTERFACE ALFRED +====================================================================== -output : +# État du service +sudo systemctl status alfred --no-pager -{"engine":"vosk_keyword","error":null,"last_score":1.0,"paused":true,"running":true,"word":"alfred"} +# Redémarrer après changement de configuration ou de code +sudo systemctl restart alfred +# Arrêter / démarrer +sudo systemctl stop alfred +sudo systemctl start alfred +# Logs en direct +journalctl -u alfred -f + +# Derniers logs +journalctl -u alfred -n 100 --no-pager + +# Afficher la configuration du service systemd +sudo systemctl cat alfred + +# Vérifier le port Flask +sudo ss -lntp | grep ':54321' + +Interface locale : http://127.0.0.1:54321 +Interface réseau : http://:54321 +Recharger Chromium sans cache : Ctrl+F5 + +# État d'Alfred (mode, dernière réponse, wake, backend TTS, etc.) +curl -sS http://127.0.0.1:54321/api/state | python3 -m json.tool + +====================================================================== +3. MICROPHONE, HAUT-PARLEUR ET ÉCOUTE +====================================================================== + +# État des réglages audio +curl -sS http://127.0.0.1:54321/api/audio/settings | python3 -m json.tool + +Exemple de réponse observée : +{ + "mic_gain": 74, + "mic_muted": true, + "speaker_muted": false, + "volume": 80 +} + +mic_gain = niveau de capture micro (%) +mic_muted = coupure du micro dans Alfred (true = coupé) +speaker_muted = coupure du haut-parleur (true = coupé) +volume = volume de sortie (%) + +# État de la détection du mot-clé « Alfred » +curl -sS http://127.0.0.1:54321/api/wake/status | python3 -m json.tool + +Exemple de réponse observée : +{ + "engine": "vosk_keyword", + "error": null, + "last_score": 1.0, + "paused": true, + "running": true, + "word": "alfred" +} + +running = moteur lancé ; paused = écoute du mot-clé suspendue. +Quand mic_muted=true, paused=true est généralement attendu. +Le détecteur du mot-clé est distinct de la transcription complète STT. + +# Endpoints d'action (POST) : à utiliser seulement pour le dépannage +curl -sS -X POST http://127.0.0.1:54321/api/wake/start +curl -sS -X POST http://127.0.0.1:54321/api/wake/stop + +# Faire prononcer une phrase pour tester la synthèse vocale +curl -sS -X POST http://127.0.0.1:54321/api/tts/say \ + -H 'Content-Type: application/json' \ + -d '{"text":"Bonjour, je suis Alfred."}' + +Note : si le micro est coupé dans Alfred, le redémarrage du wake +ne suffit pas toujours à réactiver une écoute normale : vérifier +également le bouton Mute. + +====================================================================== +4. CAMÉRA LOCALE ET RÉGLAGES +====================================================================== + +# État des paramètres V4L2 exposés par Alfred +curl -sS http://127.0.0.1:54321/api/camera/settings | python3 -m json.tool + +# Identifier les caméras +v4l2-ctl --list-devices + +# Lire les paramètres matériels de la webcam +v4l2-ctl -d /dev/video0 --list-ctrls-menus + +# Remettre la luminosité à la valeur d'usine de cette webcam +v4l2-ctl -d /dev/video0 --set-ctrl brightness=0 + +# Aperçu MJPEG (ouvre et réserve la webcam le temps de la connexion) +http://127.0.0.1:54321/api/camera/stream + +Attention : l'aperçu local peut monopoliser la webcam et empêcher +temporairement le MCP de reconnaissance faciale d'y accéder. +Le bouton Caméra de l'interface permet de désactiver le flux. + +Fichiers principaux : +/opt/alfred/app/services/camera.py +/opt/alfred/app/services/camera_settings.py + +====================================================================== +5. HERMES : AGENT, WEBUI ET MCP +====================================================================== + +# Lancer le tableau de bord Hermes (port indiqué : 9119) hermes dashboard --host 0.0.0.0 -> lancer le webui por 9119 + +Interface : http://:9119 +Attention : --host 0.0.0.0 expose le tableau de bord sur le réseau. +Éviter l'exposition publique sans contrôle d'accès. + +# Vérifier le MCP de reconnaissance faciale (commande utilisée auparavant) +hermes mcp test face_recognition + +Répertoire des MCP de Hermes : +/opt/hermes/MCP_home_assistant/ +/opt/hermes/MCP_comfyui/ +/opt/hermes/MCP_face_recognition/ + +Exemple de structure d'un MCP : +/opt/hermes/MCP_nom/mcp.py (nom du fichier variable) +/opt/hermes/MCP_nom/venv/ +/opt/hermes/MCP_nom/.env + +# Configuration/session liée à l'intégration Hermes dans Alfred +/opt/alfred/app/services/hermes_client.py +/opt/alfred/app/config/hermes_session.json + +Important : le fichier /opt/alfred/app/config/identity.md a déjà +provoqué des restrictions artificielles empêchant Hermes de proposer +certains outils. Ne pas le réintroduire sans vérifier son contenu. + +====================================================================== +6. HOME ASSISTANT : MÉTÉO, AGENDA, CAPTEURS +====================================================================== + +# État météo actuel et prévisions (depuis l'API Alfred) +curl -sS http://127.0.0.1:54321/api/ha/weather | python3 -m json.tool + +# Recommandations vestimentaires et illustration générée +# Attention : peut déclencher une génération ComfyUI coûteuse ! +curl -sS http://127.0.0.1:54321/api/ha/weather/outfits \ + | python3 -c 'import json,sys; d=json.load(sys.stdin); d.pop("image",None); print(json.dumps(d,indent=2,ensure_ascii=False))' + +# Vérifier les calendriers présents +curl -sS http://127.0.0.1:54321/api/calendar/calendars \ + | python3 -m json.tool + +# Températures exposées par Home Assistant +curl -sS http://127.0.0.1:54321/api/ha/temperatures \ + | python3 -m json.tool + +# Liste des caméras Home Assistant (pas la caméra USB locale) +curl -sS http://127.0.0.1:54321/api/ha/cameras \ + | python3 -m json.tool + +Configuration Home Assistant utilisée par Alfred : +HA_URL = URL de Home Assistant +HA_TOKEN = jeton longue durée (SECRET) +HA_WEATHER_ENTITY = entité weather.* à interroger +ALFRED_TIMEZONE = Europe/Paris +ALFRED_ALLOW_CALENDAR_WRITES = true/false + +Le fichier qui contient ces variables dépend du service systemd. +Vérifier avec « sudo systemctl cat alfred » et le répertoire de travail. +Ne jamais copier HA_TOKEN dans ALFRED.txt. + +Fichiers Python utiles : +/opt/alfred/app/services/ha_weather.py +/opt/alfred/app/services/ha_views.py +/opt/alfred/app/services/alfred_intents.py +/opt/alfred/app/services/alfred_views_controller.py + +====================================================================== +7. COMFYUI : GÉNÉRATION D'IMAGES ET TENUES MÉTÉO +====================================================================== + +Adresse du serveur ComfyUI utilisée jusqu'ici : +http://192.168.1.13:8188 + +# Vérifier la connexion ComfyUI +curl -sS --max-time 5 http://192.168.1.13:8188/system_stats \ + | python3 -m json.tool + +Workflow de génération déjà utilisé par Hermes : +/opt/hermes/MCP_comfyui/workflows/text_to_image.json + +Configuration MCP : +/opt/hermes/MCP_comfyui/.env + +Paramètres propres aux tenues météo (depuis la V5) : +/opt/alfred/app/config/weather_outfits.env + +# Éditer ces paramètres +sudo nano /opt/alfred/app/config/weather_outfits.env + +Réglages du module météo : +ALFRED_WEATHER_ILLUSTRATION_ATTEMPTS=2 +ALFRED_WEATHER_ILLUSTRATION_TARGET_SCORE=8.6 +ALFRED_WEATHER_DISPLAY_SIZE=350 +ALFRED_WEATHER_REVIEW=true +ALFRED_WEATHER_REFERENCE_MODE=auto +ALFRED_WEATHER_REFERENCE_DENOISE=0.56 +ALFRED_WEATHER_PRESERVE_FACE=true +ALFRED_WEATHER_ACCESSORY_LIMIT=1 + +Tentatives : maximum par personnage, pas nombre fixe. +Review : dépend d'un workflow vision compatible ; n'est pas garantie. +Reference mode auto : se replie sur text-to-image si incompatibilité. +Reference denoise : valeur plus élevée = vêtements plus modifiables, +mais risque accru de variation des visages. + +Images de référence V5 : +/opt/alfred/app/static/assets/weather/child-reference.png +/opt/alfred/app/static/assets/weather/adult-reference.png + +Code de génération et assemblage : +/opt/alfred/app/services/weather_outfits.py + +Cache (emplacement par défaut, sauf ALFRED_CACHE_DIR personnalisé) : +/opt/alfred/app/cache/weather_outfit_cache.json +/opt/alfred/app/cache/weather_outfit_images/ + +# Consulter le cache sans le supprimer +ls -lh /opt/alfred/app/cache/weather_outfit_images/ + +# Tester la syntaxe du module +/opt/alfred/venv/bin/python -m py_compile \ + /opt/alfred/app/services/weather_outfits.py + +Après modification du fichier de réglages : +sudo systemctl restart alfred + +====================================================================== +8. ARBORESCENCE IMPORTANTE +====================================================================== + +/opt/alfred/ + venv/ Python virtuel de l'application + app/ + app.py Serveur Flask / API + templates/index.html Page principale + static/js/ Scripts de l'interface + static/css/ Styles de l'interface + services/audio.py STT / TTS + services/wakeword.py Réveil vocal Vosk + services/hermes_client.py Appels Hermes + services/camera.py Caméra locale + services/camera_settings.py Réglages webcam + services/ha_weather.py Météo Home Assistant + services/weather_outfits.py Tenues et ComfyUI + config/weather_outfits.env Réglages V5 + config/hermes_session.json Session Hermes + cache/ Illustrations météo en cache + +/opt/hermes/ + MCP_home_assistant/ + MCP_comfyui/ + MCP_face_recognition/ + +Cette arborescence synthétise plusieurs versions successives : +vérifier l'existence d'un fichier avant de l'éditer. + +====================================================================== +9. DÉPANNAGE RAPIDE +====================================================================== + +# Alfred ne démarre pas +sudo systemctl status alfred -n 50 --no-pager +journalctl -u alfred -n 100 --no-pager + +# Erreur Python dans un module +/opt/alfred/venv/bin/python -m py_compile /opt/alfred/app/app.py + +# API Flask ne répond pas +curl -v --max-time 5 http://127.0.0.1:54321/api/state +sudo ss -lntp | grep ':54321' + +# Micro coupé / mot-clé en pause +curl -sS http://127.0.0.1:54321/api/audio/settings +curl -sS http://127.0.0.1:54321/api/wake/status + +# ComfyUI inaccessible +curl -v --max-time 5 http://192.168.1.13:8188/system_stats +# Vérifier BASE/COMFYUI_URL et le .env du MCP + +# ComfyUI génère la même image +# Vérifier seeds du workflow, bouton Régénérer et cache. +# La V5 utilise de nouveaux seeds lors de la régénération. + +# Les tenues ne correspondent pas à la date demandée +# Vérifier les prévisions de la date, les paramètres focus_date/date +# et la disponibilité des prévisions Home Assistant. + +# Sauvegarder avant de modifier le code +sudo cp -a /opt/alfred/app /opt/alfred/app.backup.$(date +%Y%m%d_%H%M%S) + +====================================================================== +10. RÈGLES PRATIQUES À NE PAS OUBLIER +====================================================================== + +- Ne pas mettre de jetons/API keys/mots de passe dans ce fichier. +- Tester la syntaxe Python avant de redémarrer Alfred. +- Sauvegarder l'app avant d'appliquer un patch. +- Conserver les calendriers et les réglages caméra lors d'une mise à jour météo. +- Ne pas bloquer la webcam avec un aperçu permanent. +- Pour les images météo : une fille de 8 ans et un homme de 42 ans. +- Les deux personnes doivent garder une apparence cohérente entre les jours. +- ComfyUI génère les images ; Home Assistant fournit la météo. +- La génération des tenues peut être longue : ne pas la relancer inutilement. +- La plupart des réglages V5 sont modifiables dans weather_outfits.env. + +FIN DU FICHIER diff --git a/ALFRED.txt.old b/ALFRED.txt.old new file mode 100644 index 0000000..10751a0 --- /dev/null +++ b/ALFRED.txt.old @@ -0,0 +1,22 @@ +curl -s http://127.0.0.1:54321/api/audio/settings +> status du micro, hp, volumes... + +output: + +{"mic_gain":74,"mic_muted":true,"speaker_muted":false,"volume":80} + + +curl -s http://127.0.0.1:54321/api/wake/status +> status de Vosk (stt pour le key world "alfred") + +output : + +{"engine":"vosk_keyword","error":null,"last_score":1.0,"paused":true,"running":true,"word":"alfred"} + + +hermes dashboard --host 0.0.0.0 +> lancer le webui por 9119 + + +/opt/alfred/app/config/weather_outfits.env +> conf pour la géréation des vetements pour les avatars (nombre de check...) diff --git a/alfred/app/cache/weather_outfit_cache.json b/alfred/app/cache/weather_outfit_cache.json index 197e8c1..929e89a 100644 --- a/alfred/app/cache/weather_outfit_cache.json +++ b/alfred/app/cache/weather_outfit_cache.json @@ -191,5 +191,34 @@ }, "cached_at": 1792969491.7701209, "focus_label": "samedi 31 octobre" + }, + "b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a": { + "file": "b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a.jpg", + "prompt_ids": [ + "cdd79fd9-0eef-4a3b-b6c6-d4b5bac8db81", + "0efecd05-8734-4335-91ff-10e282a00095" + ], + "reviews": { + "child": { + "score": 0.0, + "ok": false, + "issues": [ + "review_unavailable" + ], + "reviewed": false, + "reference_applied": true + }, + "adult": { + "score": 0.0, + "ok": false, + "issues": [ + "review_unavailable" + ], + "reviewed": false, + "reference_applied": true + } + }, + "cached_at": 1792970119.676846, + "focus_label": "aujourd’hui" } } \ No newline at end of file diff --git a/alfred/app/cache/weather_outfit_images/b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a.jpg b/alfred/app/cache/weather_outfit_images/b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a.jpg new file mode 100644 index 0000000..44aab42 Binary files /dev/null and b/alfred/app/cache/weather_outfit_images/b4b214f2749f5c44f6aeb3f82ad71808b567e9fc66dbd8459de0c4a9853d111a.jpg differ