Assistant vocal local ESP32 : étapes 1 à 15, et 15b écrite

État du projet au premier commit :
- firmware ESP32 : micro I2S, lecture anti-gigue, MQTT (état retenu, testament),
  mains libres, domotique de démonstration, chien de garde, présence du serveur ;
- serveur Python : sessions, VAD, faster-whisper, pyannote, identification,
  droits par profil, domotique, mot de réveil, Piper ;
- broker Mosquitto : configuration, comptes et ACL (non activés en développement) ;
- étape 15b écrite, en attente d'essai : agent MQTT pour machines Linux.

Étapes 1 à 15 validées. 203 tests, pyright sans erreur.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Denis Defolie
2026-09-30 17:40:55 +02:00
commit d20976fea2
108 changed files with 15022 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
"""Aiguillage des commandes autorisées vers leur exécutant (étapes 11 et 15b)."""
from __future__ import annotations
import logging
from voice_server.home_control import HomeController
from voice_server.machine_control import Command, MachineCommand, MachineController
logger = logging.getLogger(__name__)
class CommandRouter:
"""Domotique vers HomeController, machines vers MachineController."""
def __init__(self, home: HomeController | None, machines: MachineController | None) -> None:
"""
Args:
home: domotique ; None si le serveur n'a pas de lien MQTT.
machines: agents Linux ; None si le serveur n'a pas de lien MQTT.
"""
self._home = home
self._machines = machines
def execute(self, board: str, command: Command, speaker: str | None, session: str) -> list[str]:
"""Exécute la commande ; rend les destinations (journal, tests)."""
if isinstance(command, MachineCommand):
if self._machines is not None:
return self._machines.execute(board, command, speaker, session)
elif self._home is not None:
return self._home.execute(board, command, speaker, session)
logger.warning("%s : pas d'executant pour %s %s", board, command.action, command.device)
return []