diff --git a/.gitignore b/.gitignore index 3bbba3e..9648966 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ __pycache__/ /telefon/modell.json # Trainingsdaten-Export (pipe.export) - enthaelt volle Transkripte/Namen /training/ +/telefon/notruf_ton.wav diff --git a/HANDOFF.md b/HANDOFF.md index a009aaf..66c7957 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -4,6 +4,25 @@ Voller Weg funktioniert Ende-zu-Ende: externer Anruf auf Durchwahl 9 (Plusnet → FreeSWITCH → `dialog/pipecat_bootstrap.py` → WebSocket → Astra) erreicht Astra, und Astra liefert jetzt auch eine echte, fertige Antwort statt nur "Einen Moment bitte" (Fix 2026-09-13, siehe unten) - kein offener Blocker mehr bekannt. +## 2026-09-17 — Notruf-Ton mit Taste 1 -> Astra + +Hauptnummer (Catch-all `00_praxis_ab.xml`) und DW3 (nach den 20 s) spielen +nach dem Annehmen `telefon/notruf_ton.wav` (54 s Ton, Quelle +`profile/aufzug-notdienst/notruf_ton.m4a`, gebaut von +`telefon/notruf_ton_bauen.sh`: 8 kHz mono PCM16, -3 dB). Taste 1 während des +Tons oder bis 3 s danach -> `execute_extension notruf_taste_1 XML +notruf_menue` -> `socket 127.0.0.1:8095` wie DW9. Ohne Taste weiter zu +Ansage + Aufnahme wie bisher. DW9 unverändert direkt Astra. + +Eigener Kontext `notruf_menue` (`dialplan/notruf_menue.xml`, Top-Level), +weil der Catch-all in `public` die Wahl sonst verschlucken würde. + +Verifiziert: Loopback mit `uuid_recv_dtmf 1` und echter Anruf 17:00 (DTMF +per RTP kam an, Astra übernahm). **Nicht getestet:** Pfad ohne Taste +(Ton zu Ende -> Ansage -> Aufnahme) und Profil ohne Ton-Datei. +Sicherung vorher: Git-Tag `vor-notruf-ton-2026-09-17`, Live-Dialplan + +ansage.wav + plist in `ablage/sicherung-vor-notruf-ton-2026-09-17/`. + ## 2026-09-17 — Leitung stumm nach IP-Wechsel, Watchdog-Kinder sterben **Symptom:** Durchwahl 9 (und die ganze Leitung) nahm nicht ab. Letzter diff --git a/profile/aufzug-notdienst/notruf_ton.m4a b/profile/aufzug-notdienst/notruf_ton.m4a new file mode 100644 index 0000000..9819ee0 Binary files /dev/null and b/profile/aufzug-notdienst/notruf_ton.m4a differ diff --git a/telefon/ansage_bauen.sh b/telefon/ansage_bauen.sh index 93033b6..b189e09 100755 --- a/telefon/ansage_bauen.sh +++ b/telefon/ansage_bauen.sh @@ -136,3 +136,6 @@ ffmpeg -v error -y -i "$TMP/sprache.wav" -i "$TMP/ton.wav" \ DAUER=$(ffprobe -v error -show_entries format=duration -of csv=p=0 telefon/ansage.wav) printf 'telefon/ansage.wav erzeugt (%.1f s, %s)\n' "$DAUER" "$BESCHREIBUNG" + +# Notruf-Ton gehoert zum Profil wie die Ansage - bei Profilwechsel mitziehen. +PROFIL="$PROFIL" telefon/notruf_ton_bauen.sh diff --git a/telefon/freeswitch/dw3_warten.xml.tpl b/telefon/freeswitch/dw3_warten.xml.tpl index f3b1471..a7f64f1 100644 --- a/telefon/freeswitch/dw3_warten.xml.tpl +++ b/telefon/freeswitch/dw3_warten.xml.tpl @@ -21,6 +21,14 @@ + + + diff --git a/telefon/freeswitch/einrichten.sh b/telefon/freeswitch/einrichten.sh index 85184b3..69a9ffd 100755 --- a/telefon/freeswitch/einrichten.sh +++ b/telefon/freeswitch/einrichten.sh @@ -52,10 +52,14 @@ fuelle() { # fuelle "$PROJEKT/telefon/freeswitch/plusnet.xml.tpl" "$FS_ETC/sip_profiles/external/plusnet.xml" chmod 600 "$FS_ETC/sip_profiles/external/plusnet.xml" # enthaelt das SIP-Passwort fuelle "$PROJEKT/telefon/freeswitch/praxis_ab.xml.tpl" "$FS_ETC/dialplan/public/00_praxis_ab.xml" +# Kontext fuer Taste 1 waehrend des Notruf-Tons - Top-Level unter dialplan/, +# nicht in public/ (siehe notruf_menue.xml.tpl). +fuelle "$PROJEKT/telefon/freeswitch/notruf_menue.xml.tpl" "$FS_ETC/dialplan/notruf_menue.xml" echo "Trunk -> $FS_ETC/sip_profiles/external/plusnet.xml (Rechte 600)" echo "Dialplan -> $FS_ETC/dialplan/public/00_praxis_ab.xml" echo "Ansage -> $PROJEKT/telefon/ansage.wav" +echo "Notruf -> $FS_ETC/dialplan/notruf_menue.xml (Ton: telefon/notruf_ton.wav, Taste 1 -> Astra)" echo "Eingang -> $PROJEKT/telefon/eingang" if [ -n "${DW3_DDI:-}" ]; then diff --git a/telefon/freeswitch/notruf_menue.xml.tpl b/telefon/freeswitch/notruf_menue.xml.tpl new file mode 100644 index 0000000..3edeaf6 --- /dev/null +++ b/telefon/freeswitch/notruf_menue.xml.tpl @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/telefon/freeswitch/praxis_ab.xml.tpl b/telefon/freeswitch/praxis_ab.xml.tpl index 445f142..e9147ee 100644 --- a/telefon/freeswitch/praxis_ab.xml.tpl +++ b/telefon/freeswitch/praxis_ab.xml.tpl @@ -9,6 +9,14 @@ + + + . +# Der Ton laeuft im Dialplan vor der Ansage; Taste 1 verbindet waehrenddessen +# zu Astra (siehe telefon/freeswitch/notruf_menue.xml.tpl). +# Format wie telefon/ansage.wav: 8 kHz mono PCM16, -3 dB Kopfraum. +# +# Hat das Profil keinen Ton, wird eine alte notruf_ton.wav entfernt. Der +# Dialplan findet dann keine Datei, play_and_get_digits kehrt sofort zurueck +# und der Anruf laeuft direkt zur Ansage - kein Ton, kein Menue. +set -euo pipefail +cd "$(dirname "$0")/.." +if [ -z "${PROFIL:-}" ] && [ -f .env ]; then + PROFIL=$(awk -F= '$1=="PROFIL"{gsub(/"/,"",$2); print $2}' .env) +fi +PROFIL="${PROFIL:-praxis}" + +QUELLE="" +for ext in m4a ogg mp3 wav aiff; do + if [ -f "profile/$PROFIL/notruf_ton.$ext" ]; then + QUELLE="profile/$PROFIL/notruf_ton.$ext" + break + fi +done + +if [ -z "$QUELLE" ]; then + rm -f telefon/notruf_ton.wav + echo "Kein Notruf-Ton im Profil $PROFIL - telefon/notruf_ton.wav entfernt (kein Menue)." + exit 0 +fi + +ffmpeg -v error -y -i "$QUELLE" -af volume=-3dB -ar 8000 -ac 1 -c:a pcm_s16le telefon/notruf_ton.wav +DAUER=$(ffprobe -v error -show_entries format=duration -of csv=p=0 telefon/notruf_ton.wav) +printf 'telefon/notruf_ton.wav erzeugt (%.1f s, %s)\n' "$DAUER" "$QUELLE"