Konfiguration¶
Direkt nach dem Kopieren der Vorlage (siehe Installation) läuft Core noch nicht ohne Weiteres — mindestens dein MQTT-Passwort musst du eintragen. Alle anderen Werte auf dieser Seite haben brauchbare Defaults; du musst sie nur ändern, wenn du einen konkreten Grund dazu hast (z. B. Azure statt Piper für die Sprachausgabe).
Core ist außerdem die einzige Komponente mit zwei getrennten Konfigurationsebenen:
- Die meisten Einstellungen (NLU-Wortlisten, LLM-System-Prompt, BLE-Tags,
Auto-Zuordnungen, Trigger, Routinen, Fahrzeuge, Gruppen, …) liegen nicht in
config.yaml, sondern in Cores eigener Datenbank (hannah.db) und werden ausschließlich über die WebUI verwaltet. Sie gehören nicht auf diese Seite, weil sie sich zur Laufzeit ändern und nicht Teil der Auslieferung sind. config.yamlenthält nur die Infrastruktur-/Bootstrap-Konfiguration — alles, was Core zum Start braucht, bevor die Datenbank überhaupt erreichbar ist.
Diese Seite beschreibt ausschließlich config.yaml.
Netzwerk¶
udp:
host: "0.0.0.0" # Bind-Adresse des Servers
port: 7775 # UDP-Port für Audio-Streaming und Registrierung
advertise_host: "" # Leer = eigene IP automatisch ermitteln
discovery_topic: "hannah/server" # Retained MQTT-Topic für Satellit-Discovery
mqtt:
host: "192.168.1.1"
port: 1883
username: "mqtt"
password: "IHR_MQTT_PASSWORT"
topic_audio_in: "hannah/+/audio"
topic_intent_out: "hannah/{device}/intent"
topic_text_out: "hannah/{device}/text"
topic_answer_out: "hannah/{device}/answer"
topic_error_out: "hannah/{device}/error"
topic_text_command_in: "0_userdata/0/hannah/set/textCommand"
grpc:
host: "0.0.0.0"
port: 50051
enforce_protocol_version: false
enforce_compat_version: false
| Schlüssel | Zweck |
|---|---|
udp.* |
UDP-Server für direkt verbundene Satelliten. Deaktiviert sich selbst, solange ein Proxy per RegisterProxy verbunden ist |
mqtt.* |
Zugangsdaten zum MQTT-Broker sowie die Topic-Namen für Audio/Intent/Antwort/Fehler pro Satellit |
grpc.host / grpc.port |
Bind-Adresse des gRPC-Servers (externe Services: Telegram, Proxy, WebUI, Adapter, …) |
grpc.enforce_protocol_version |
Lehnt gRPC-Calls ohne/mit falscher x-proto-version-Metadata ab statt nur zu loggen. Erst aktivieren, wenn alle Clients umgestellt sind |
grpc.enforce_compat_version |
Wie oben, aber pro Nachricht (x-compat-version) statt global |
Sprachverarbeitung¶
stt:
model: "base" # tiny | base | small | medium | large-v3 (lokales Fallback)
language: "de"
device: "cpu" # cpu | cuda
compute_type: "int8" # int8 (schnell, Pi) | float16 (GPU) | float32
no_speech_threshold: 0.6
# Remote-STT (empfohlen): faster-whisper-server auf einem stärkeren Rechner
# remote_url: "http://192.168.1.2:8000"
# remote_model: "Systran/faster-whisper-large-v3"
# remote_timeout: 15.0
# Azure Speech-to-Text (Alternative zu faster-whisper)
# azure_key: "..."
# azure_region: germanywestcentral
tts:
backend: piper # piper (lokal/offline) | azure | polly — piper ist immer der Fallback
model: "/home/pi/de_DE-kerstin-low.onnx" # leer = TTS deaktiviert
length_scale: 1.0 # Sprechgeschwindigkeit (>1 = langsamer)
noise_scale: 0.667
noise_w: 0.8
# azure_key / azure_region / azure_voice (backend: azure)
# polly_key_id / polly_secret_key / polly_region / polly_voice / polly_engine (backend: polly)
cache_dir: .tts_cache # Disk-Cache für Cloud-Synthesen
warm_phrases: [...] # Beim Start vorsynthetisierte Standard-Phrasen
confirmation_sound: "/home/pi/confirmation.wav" # leer = synthetisiert
voice_id:
enabled: false # true = Speaker-ID aktiv (Core löst Sprecher selbst auf)
base_url: "http://localhost:8765" # HTTP-Base-URL des VoiceID-Diensts
timeout_sec: 3.0
audio:
sample_rate: 16000
sample_width: 2 # Bytes pro Sample (2 = 16-bit)
channels: 1
format: "auto" # "raw_pcm" | "wav" | "auto" (erkennt WAV-Header, sonst raw_pcm)
llm:
enabled: false # true = LLM aktiv (Smalltalk, Notification-Reformulierung)
provider: ollama # ollama | openai_compat | openai | groq | mistral
base_url: "http://localhost:11434"
# api_key: "" # Nur für Cloud-Anbieter
model: "llama3.2"
timeout: 60
max_tokens: 2048
context_ttl: 120.0 # Sekunden bis der Konversations-Kontext verfällt
history_turns: 3 # Wie viele vergangene Turns maximal einfließen
fallback_response: "Das kann ich leider nicht beantworten." # Antwort ohne aktives LLM
| Schlüssel | Zweck |
|---|---|
stt.* |
faster-whisper-Konfiguration — lokal, remote (empfohlen) oder Azure |
tts.* |
Piper (immer Fallback), optional Azure oder Polly als Cloud-Backend |
voice_id.* |
Anbindung an VoiceID für Speaker-Erkennung |
audio.* |
Erwartetes Audioformat für eingehende Streams |
llm.* |
Ollama/Cloud-LLM für Smalltalk. system_prompt liegt in den DB-Settings, nicht hier |
Sonstiges¶
user_registry:
hannah_roomie: "hannah" # Roomie-ID, unter der Hannah sich selbst als Resident registriert
satellite_manager:
seed_ttl_days: 7 # Provisionierte, aber nie gepairte Satelliten-Seeds nach X Tagen löschen
restart_interval_days: 7 # Präventiver Rejuvenation-Restart
residents:
topic_prefix_read: "residents/0/roomie"
state_key: "presence/state"
hannah_roomie: "hannah"
state_home: 1
state_away: 0
iobroker:
feedback_timeout: 3.0 # Sekunden bis "Gerät antwortet nicht"
memory:
db: "memory.db" # SQLite-Datei für Langzeitgedächtnis
recent_limit: 10 # Wie viele Erinnerungen in den System-Prompt injiziert werden
# plink_wav_path: "/home/pi/plink.wav" # WAV für den Wakeword-Training-Plink-Ton
# Leer/nicht ladbar = generierter Ersatzton
| Schlüssel | Zweck |
|---|---|
user_registry.hannah_roomie |
Roomie-ID für Hannahs eigenen Resident-Eintrag — unabhängig von residents.hannah_roomie unten, beide haben zufällig denselben Default |
satellite_manager.* |
Aufräum-Fristen für Satelliten-Provisionierung |
residents.* |
Anbindung an den ioBroker-Residents-Adapter für Anwesenheitserkennung |
iobroker.feedback_timeout |
Wartezeit, bevor ein gesteuertes Gerät als "antwortet nicht" gilt |
memory.* |
SQLite-Speicher für Langzeit-Erinnerungen |
plink_wav_path |
Eigener Ton für den geführten Plink beim Wakeword-Training statt des generierten Standardtons |
Nicht (mehr) in config.yaml¶
Diese Themen klingen nach Infra-Config, leben aber komplett in der DB — ein config.yaml-Eintrag hat keine Wirkung:
- Fahrzeuge (
cars/user_to_car-Tabellen) und BLE-Tags (ble_tags-Tabelle) — Admin-UI bzw.GetCars/CreateCar/… undGetGroups/… gRPC - Gruppen (Satelliten-Sets für Announcements/Steuerung) — Admin-UI /
GetGroups/CreateGroup/SetGroupSatellitesgRPC - NLU-Wortlisten, LLM-System-Prompt — Admin-UI /
GetSettings/UpdateConfiggRPC, bei leerer DB automatisch mit generischen Defaults befüllt