my_voice_assistant_v3_jamulix/emergency_bridge/README.md
dschlueter ea0e3674ad refactor: Notruf-Bridge nutzt seven-send-Library statt eigenem seven.io-Code
Die seven.io-Aufrufe (SMS + Voice/SSML) leben jetzt in der wiederverwendbaren
Library seven-send; die Bridge ist nur noch der HTTP-Adapter und ruft den
synchronen SevenClient via asyncio.to_thread. Eine getestete Stelle für die
API-Logik, ~50 Zeilen Duplikat raus.

- main.py: import SevenClient; _make_client() aus der Env; _dispatch() pro
  Kanal/Nummer; ohne API-Key sauberes "nicht gesetzt"-Ergebnis (kein Versand)
- Tests: mocken jetzt seven_send.client.httpx.post; neuer Test "ohne API-Key
  kein Versand" (6 Tests)
- Doku: Bridge-README + DEPLOYMENT 2.9 — seven-send als venv-Voraussetzung
  (pip install git+https://kitux.de/forgejo/dschlueter/seven_send.git)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 11:50:05 +02:00

2.9 KiB

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

Voraussetzung — die Library seven-send muss in der venv installiert sein (sie kapselt die seven.io-Aufrufe):

sudo -u voice /opt/voice-assistant/.venv/bin/pip install \
     git+https://kitux.de/forgejo/dschlueter/seven_send.git
  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