workflows.md 7.9 KB

Workflows

Revision: r1 Source: CLAUDE.md Last updated: 2026-01-31 12:35


Wakeword-Erkennung

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   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       │
       │                  │                  │

Timing-Parameter

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

Satellite-Registrierung

┌─────────────┐                     ┌─────────────┐
│   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─>│
       │                                   │

Registrierungsdatei (satellites/{MAC}.json)

{
    "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"
}

Anwendungsstart

┌──────────────────────────────────────────────────────┐
│                    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   │
└─────────────┘  └─────────────┘  └─────────────┘

Service-Start-Reihenfolge

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