CFD - automatischer Anruf und Voice Mail Wiedergabe

novumit

Premier Customer
Mitglied seit
7. August 2025
Beiträge
1
Hallo zusammen,


ich habe ein Verständnisproblem mit dem 3CX Call Flow Designer (CFD) und hoffe, jemand kann mir hier etwas auf die Sprünge helfen.


Geplanter Ablauf:
Ein Kunde ruft an, spricht eine Nachricht auf, und die Telefonanlage soll anschließend eigenständig eine Warteschlange anrufen (mehrere Versuche per Loop) und dabei die gespeicherte Aufnahme abspielen.


Was funktioniert:


  • Ich kann erfolgreich eine Nachricht aufnehmen.
  • Diese wird per E-Mail versendet und zusätzlich als Datei gespeichert.
  • Während des gleichen Anrufs kann ich die aufgenommene Nachricht mit einer Prompt Playback-Komponente wiedergeben – das funktioniert problemlos.

Was nicht funktioniert:


  • Wenn ich die Disconnect Call-Komponente verwende, um den ursprünglichen Anruf (vom Kunden) zu beenden, wird der gesamte Call Flow beendet.
  • Wenn ich Disconnect Call weglasse, führt die Make Call-Komponente zwar den neuen Anruf aus, spielt aber nur die Begrüßung ab, da dieser offenbar als neuer unabhängiger Anruf behandelt wird.

Ich habe bereits versucht, einen zweiten Callflow zu bauen, der die Nachricht abspielt.
Allerdings weiß ich nicht, wie ich den variablen Dateinamen CONCATENATE("/var/lib/3cxpbx/Instance1/Data/Recordings/Emergency/Emergency_from_caller_", session.callid, ".wav") vom ersten in den zweiten Callflow bekomme.

Vielleicht über Attach Call Data?


Hat jemand eine Idee oder schon mal etwas Ähnliches umgesetzt und kann mir den richtigen Weg zeigen?


Vielen Dank im Voraus!


Start
│
│ Caller dials 990 (after-hours)
▼
Play Greeting (IVR):
"Willkommen bei der IT-Abteilung.
Sie rufen außerhalb der Geschäftszeiten an.
Für den Support drücken Sie bitte die 1.
Bei einem kompletten Betriebsausfall, zum Beispiel bei Internet-, Telefonie- drücken Sie die 2.
Für alle anderen Anliegen drücken Sie bitte die 3."
│
▼
Get Digit (1,2,3)
├─ If 1 → Forward to Front Office Queue 130
│ └─ TTS: "Einen Moment bitte — Sie werden jetzt mit dem Support verbunden."
│ └─ End call
│
├─ If 2 → Record Voicemail (Critical Outage)
│ ├─ TTS Prompt Before Recording:
│ │ "Bitte nennen Sie nach dem Signalton Ihren Namen und ein Stichwort, zum Beispiel 'Internet' oder 'Telefonie'.
│ │ Drücken Sie zum Beenden die Raute-Taste."
│ ├─ Save as Emergency_[CallID].wav
│ ├─ Send Email to mail address
│ ├─ End Call
│ ├─ Call On-Call Queue 989
│ │ ├─ If answered → Playback Voicemail
│ │ └─ If no answer → Wait 10 min → Retry (up to 5 times)
│ └─ End call
 

Anhänge

  • 1763050066030.png
    1763050066030.png
    18,8 KB · Aufrufe: 2
Hat jemand eine Idee oder schon mal etwas Ähnliches umgesetzt und kann mir den richtigen Weg zeigen?
Richtig erkannt, das geht nur per Makecall von der urspr. angerufenen ersten CFD App aus und mit einer zweiten CFD App die dann den Anruf zum Ziel aufbaut und Audio abspielt. Die Daten für die zweite CFD App müssen anderswo von der ersten CFD App hinterlegt und von der zweiten sicher (eben auch Atomarität) ausgelesen werden. Mit 3CX Bordmitteln (AttachedData, Parameter, irgendeine Datei usw.) geht das nicht.

Aber z.B. mit einer extra SQL Tabelle nur für diesen Zweck geht das.

Angenommen es gibt irgendwo eine SQL Tabelle mit den zwei Spalten audiofile als string und completed als bool.
Die erste CFD App erzeugt einen neuen Datensatz mit dem kpl. Pfad der Audio Datei und completed = false und führt danach ein Makecall von der zweiten CFD App zum Ziel aus.
Die zweite CFD App holt sich per SQL Befehl von einen noch nicht abgearbeiteten Datensatz den Eintrag audiofile, setzt gleichzeitig completed auf true und ruft dann damit an. Eine typisches atomares SQL read and mark as processed Szenario. Ein Beispiel:
SQL:
UPDATE tabelle
SET completed = TRUE
WHERE audiofile = (
    SELECT audiofile
    FROM tabelle
    WHERE completed = FALSE
    LIMIT 1
    FOR UPDATE SKIP LOCKED
)
RETURNING audiofile;

Es gibt wohl Zeitgenossen, die bauen diese Tabelle zusätzlich in die 3CX postgresql DB ein, lesen bei jedem CFD App Aufruf die SQL Zugangsdaten aus der /var/lib/3cxpbx/Bin/3CXPhoneSystem_punkt_ini aus und lassen die CFD App die SQL Operationen ausführen - allein schon weil die DB da ist und es funktioniert.
Aber das ist nicht supported und daher gehe ich nicht weiter darauf ein. ;)
 
Zuletzt bearbeitet:
Wenn ich die Disconnect Call-Komponente verwende, um den ursprünglichen Anruf (vom Kunden) zu beenden, wird der gesamte Call Flow beendet.
Ist zwar ein paar Tage alt aber ich laß es gerade erst da ich selbst gerade selbst die ersten Schritte mit CFD mache.
Im CFD gibt es rechts vom Main Flow den Error Handler und den Disconnect Handler Flow. Alle was nach auflegen noch passieren soll muss da rein. Dann sollte es auch noch ausgeführt werden.
 
Vorausgesetzt die CFD Anwendung stürzt nicht ab (Error Handler Flow) und wird nicht mit dem CFD Baustein Exit Callflow beendet, dann:
Im CFD gibt es rechts vom Main Flow den Error Handler und den Disconnect Handler Flow. Alle was nach auflegen noch passieren soll muss da rein. Dann sollte es auch noch ausgeführt werden.
Das ist grds. richtig und auch wieder nicht.

Der Anruf ist zu diesem Zeitpunkt schon beendet, daher gibt es z.B. auch kein Audio mehr. Es wird nicht alles ausgeführt / man kann auch nicht alles ausführen lassen und es stehen div. Laufzeitvariablen vom normalen Anrufablauf nicht mehr zur Verfügung.

Aber man kann z.B. noch ein Make Call ausführen lassen und einen neuen Anruf starten, z.b. auch von oder zu derselben CFD App (die dann feststellen kann dass sie von sich selber aus aufgerufen wurde) usw.. Alle für den Disconnect Handler Flow gwünschten Laufzeitvariablen des Main Flow oder von User Defined Components sollten daher vorab in globalen Projektvariablen gespeichert werden um zu diesem späteren Zeitpunkt noch Zugriff darauf zu haben.
 

Statistik des Forums

Themen
44.749
Beiträge
233.636
Mitglieder
78.491
Neuestes Mitglied
Toto89DE