my_voice_assistant_v3_jamulix/emergency_bridge
dschlueter 7addb903b2 feat: Notruf-Bridge (seven.io) — Webhook-Empfänger für SMS + Anruf
Konkreter Provider hinter dem provider-agnostischen EMERGENCY_WEBHOOK_URL:
ein kleiner FastAPI-Dienst (emergency_bridge/), der das Notruf-Payload der
App entgegennimmt und pro Telefonnummer SMS und/oder TTS-Anruf über die
seven.io-API auslöst.

- main.py: POST /notruf (Bearer-Token-Prüfung), GET /health; seven.io
  SMS (/api/sms) + Voice (/api/voice, Text als SSML, XML-escaped), best
  effort mit Statuscode-100-Auswertung; Kanäle/Texte kommen aus dem Payload
- Betrieb: eigener systemd-Service auf 127.0.0.1:8090, läuft in der
  vorhandenen venv; .env.example + README mit Installations- und
  Verdrahtungsschritten
- Tests: SMS+Anruf-Fan-out, SSML-Escaping, Token-Auth, Kanal-Filter (5 Tests)
- DEPLOYMENT.md: optionaler Abschnitt 2.9 mit Verweis auf die Bridge

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 10:53:34 +02:00
..
__init__.py feat: Notruf-Bridge (seven.io) — Webhook-Empfänger für SMS + Anruf 2026-06-25 10:53:34 +02:00
emergency-bridge.env.example feat: Notruf-Bridge (seven.io) — Webhook-Empfänger für SMS + Anruf 2026-06-25 10:53:34 +02:00
emergency-bridge.service feat: Notruf-Bridge (seven.io) — Webhook-Empfänger für SMS + Anruf 2026-06-25 10:53:34 +02:00
main.py feat: Notruf-Bridge (seven.io) — Webhook-Empfänger für SMS + Anruf 2026-06-25 10:53:34 +02:00
README.md feat: Notruf-Bridge (seven.io) — Webhook-Empfänger für SMS + Anruf 2026-06-25 10:53:34 +02:00

Notruf-Bridge (seven.io)

Kleiner Webhook-Empfänger, der das Notruf-Payload des Voice Assistants über seven.io in SMS und/oder Sprachanruf (Text-to-Speech) umsetzt. Die App bleibt damit provider-agnostisch — der konkrete Anbieter steckt allein hier.

App  --POST /notruf (JSON)-->  Bridge  --seven.io-API-->  📱 SMS  /  ☎️ Anruf

Endpunkte

Methode Pfad Zweck
GET /health Liveness + ob ein API-Key gesetzt ist
POST /notruf nimmt das App-Payload entgegen, löst SMS/Anruf aus

Erwartetes Payload (von der App erzeugt):

{
  "channels": ["sms", "call"],
  "phones": ["+4915112345678"],
  "message": { "sms": "NOTRUF: …", "call": "Achtung. …" }
}

Pro Telefonnummer wird — je nach channels — eine SMS (message.sms) und/oder ein Anruf mit vorgelesenem Text (message.call, als SSML mit SEVENIO_VOICE_NAME) ausgelöst. Antwort: {"received": true, "any_sent": <bool>, "results": [...]}.

Installation

  1. Konfig anlegen:
    sudo cp emergency_bridge/emergency-bridge.env.example /etc/voice-assistant/emergency-bridge.env
    sudo chown voice:voice /etc/voice-assistant/emergency-bridge.env
    sudo chmod 600 /etc/voice-assistant/emergency-bridge.env
    sudo editor /etc/voice-assistant/emergency-bridge.env   # API-Key + BRIDGE_TOKEN setzen
    
  2. Service installieren:
    sudo cp emergency_bridge/emergency-bridge.service /etc/systemd/system/
    sudo systemctl daemon-reload
    sudo systemctl enable --now emergency-bridge
    curl -s localhost:8090/health   # -> {"status":"ok","configured":true}
    
  3. App verdrahten — in /etc/voice-assistant/voice-assistant.env:
    EMERGENCY_WEBHOOK_URL=http://127.0.0.1:8090/notruf
    EMERGENCY_WEBHOOK_TOKEN=<derselbe Wert wie BRIDGE_TOKEN>
    EMERGENCY_CONTACT_PHONE=+49XXXXXXXXXX
    
    Danach sudo systemctl restart voice-assistant.

Konfiguration (Env)

Variable Default Bedeutung
SEVENIO_API_KEY (leer) seven.io API-Key — ohne Key kein Versand
SEVENIO_SMS_FROM Notruf Absender-ID der SMS (alphanumerisch, max. 11 Zeichen)
SEVENIO_VOICE_FROM (leer) Caller-ID des Anrufs (verifizierte Nummer; optional)
SEVENIO_VOICE_NAME de-de-female SSML-Stimme für die Anruf-Ansage
BRIDGE_TOKEN (leer) falls gesetzt: Authorization: Bearer <token> Pflicht
BRIDGE_HOST / BRIDGE_PORT 127.0.0.1 / 8090 Bind-Adresse

Test

.venv/bin/python -m pytest tests/test_emergency_bridge.py -q