Revision: r1 Source: CLAUDE.md Last updated: 2026-01-31 12:35
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Client │ │ Server │ │ Client │
│ (Satellite)│ │ │ │ (andere) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
│ 1. Wakeword erkannt │
│ (Erkennung pausieren) │
│ (Audio puffern) │
│ │ │
│──WakewordDetected────────>│ │
│ │<──────────────────│ WakewordDetected
│ │ │ (wenn auch erkannt)
│ │ │
│ 2. 1 Sekunde warten │
│ (Arbitrierung: │
│ höchstes audio_level │
│ gewinnt) │
│ │ │
│<──WakewordSelected│ │
│ (conversation_id)│──WakewordAbort─────────>│
│ │ │
│ 3. Audio streamen │ │
│ (max 60s oder │ │
│ 3s Stille) │ │
│ │ │
│──────Audio───────>│ │
│──────Audio───────>│ │
│──RecordingDone───>│ │
│ │ │
│ 4. raw_audio_input_received │
│ Event auslösen │
│ │ │
│ 5. STT → NLP → Intent │
│ │ │
| Parameter | Wert | Beschreibung |
|---|---|---|
| Arbitration Timeout | 1 Sekunde | Warten auf mehrere Wakewords |
| Max Silence | 3 Sekunden | Stille beendet Aufnahme |
| Max Duration | 60 Sekunden | Maximale Aufnahmedauer |
| Reconnect Interval | 5 Sekunden | Wiederverbindungsversuch |
┌─────────────┐ ┌─────────────┐
│ Admin │ │ Server │
│ (User) │ │ │
└──────┬──────┘ └──────┬──────┘
│ │
│ 1. Registrierungsmodus aktivieren │
│──────────────────────────────────>│
│ │
│ Timeout: 60 Sekunden │
│ ┌───────────────────────┐ │
│ │ Registration Mode ON │ │
│ └───────────────────────┘ │
│ │
│ ┌──────┴──────┐
│ │ Client │
│ │ (new) │
│ └──────┬──────┘
│ │
│ 2. Client versucht Verbindung │
│ SatelliteConnect<─│
│ │
│ 3. Server prüft MAC-Adresse │
│ → Nicht registriert │
│ → Registrierungsmodus aktiv? │
│ │
│ 4. Registrierung speichern │
│ → satellites/{MAC}.json │
│ │
│ SatelliteAccepted─>│
│ │
{
"id": "sat-uuid-1234",
"room_id": "wohnzimmer",
"mac_address": "AA-BB-CC-DD-EE-FF",
"alias": "Echo Wohnzimmer",
"registered_at": "2026-01-31T12:00:00.000Z"
}
┌──────────────────────────────────────────────────────┐
│ main.py │
│ 1. CLI-Argumente parsen │
│ 2. Modus auswählen (server/client/standalone/train) │
│ 3. Anwendungsklasse instanziieren │
└────────────────────────┬─────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────┐
│ IApplication.run() │
│ 1. Signal-Handler einrichten (SIGINT, SIGTERM) │
│ 2. initialize() aufrufen │
│ 3. start() aufrufen │
│ 4. Auf Shutdown-Event warten │
│ 5. stop() aufrufen │
└────────────────────────┬─────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ initialize()│ │ start() │ │ stop() │
│ │ │ │ │ │
│ • Config │ │ • Services │ │ • Events │
│ laden │ │ starten │ │ shutdown │
│ • Manager │ │ • Plugins │ │ • Satellites│
│ erstellen │ │ laden │ │ trennen │
│ │ │ │ │ • Plugins │
│ │ │ │ │ entladen │
│ │ │ │ │ • Services │
│ │ │ │ │ stoppen │
└─────────────┘ └─────────────┘ └─────────────┘
CRITICAL (0) ──→ CORE (10) ──→ NETWORK (20) ──→ MANAGER (30) ──→ PLUGIN (40) ──→ OPTIONAL (50)
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
Logging EventManager Sockets Satellite Plugins Extras
Config Protocol Registration
Abhängigkeiten werden automatisch aufgelöst: Wenn Service B von Service A abhängt, wird A vor B gestartet, unabhängig von der Priorität.
See also: architecture.md, integrations.md