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"