• Eigenständig gehostete oder lokal installierte Instanzen sind komplexer in der Einrichtung und Fehlerbehebung und erfordern daher kostenpflichtigen technischen Support. Kostenlosen Support erhalten Sie mit 3CX StartUP oder einer gehosteten 3CX-Installation mit einen unterstützten SIP-Trunk-Anbieter.

Anleitung: IVR Ansage mit CFD per Nebenstelle ändern

mr412

Bronze Partner
Mitglied seit
5. November 2020
Beiträge
86
Hallo Zusammen,

Hier eine Anleitung wie man eine IVR-Ansage von einer Nebenstelle besprechen kann.

2020-11-06 14_27_48-3CX Call Flow Designer - ansagen.png

IVR
  1. Erstellt ein IVR
  2. Setzt dem IVR eine Ansage am besten für dieses Beispiel: "ansage.wav"
CFD
  1. Erstellt im CFD ein neues Projekt zBsp. "ansagen"
  2. Fügt die Komponente "Record" hinzu
  3. In der Konfiguration der Record-Komponente folgendes setzen:
    1. Prompts
      1. Audio File Prompt: Mit einer Ansage zBsp. "Sprechen Sie nach dem "beep" um eine Nachricht aufzunehmen und speichere Sie mit der Raute-Taste
    2. Play beep before recording status einen Haken setzen
    3. Max recording duration setzen
    4. Optional "Stop recording by pressing any DTMF"
    5. Save to file "true"
    6. File name: "ansage.wav"
  4. Bei Audio Recorded die Komponente "Prompt Playback" hinzufügen, damit man die aufgezeichnete Nachricht überprüfen kann
    1. Prompt Playback Konfiguration: Edit Prompts > Add > Recorded Audio Prompt und bei "fx" die Variable "AudioId" wählen
    2. Accept DTMF Input During Prompt kann entfernt werden
  5. Bei Nothing Recorded könnt ihr entweder leer lassen oder zBsp. "DisconnectCall"-Komponente einfügen
  6. Füg nach der Record-Komponente ein Menu hinzu und wie folgt konfigurieren
    1. Accept DTMF Input During Prompt
    2. Valid Option 0 und 1
    3. Initial Prompt: Audio File Prompt zBsp. "Um die Nachricht zu speichern drücken Sie 0, um die Nachricht nochmals aufzunehmen drücken Sie 1
    4. Subsequent Prompts: Dieselbe Konfiguration wie Initial Prompt
    5. Dito Timeout oder leer lassen
    6. Invalid Digit Prompts leer lassen je nach Anforderung
  7. Bei Option 0 folgendes hinzufügen
    1. Execute C# Code (Konfiguration siehe weiter unten)
    2. Prompt Playback > Edit Prompts > Audio File Prompt > "Ansage wurde gespeichert"
    3. Disconnect Call
  8. Option 1
    1. Transfer auf die Nummer der CFD Extension um von vorne zu Beginnen

Execute C# Code

Die aufgezeichnete Nachricht "ansage.wav" wird in Debian in diesem Ordner gespeichert:
Bash:
/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/ansagen/
wobei /ansagen/ dem Projektname entspricht.

Die IVR Ansage "ansage.wav" ist im folgenden Ordner abgelegt:
Bash:
/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/ansage.wav

Nun müssen wir die IVR Ansage mit der aufgezeichneten Ansage ersetzen. Das funktioniert mit diesem C# Code:

C#:
string sourceFile = @"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/ansagen/ansage.wav";
string destFile =  @"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/ansage.wav";
File.Delete(destFile); // Move Funktion kann nicht ersetzen, deshalb löschen wir hier das alte File.
File.Move(sourceFile, destFile); // Alternativ geht auch File.Copy(source, dest, true)
File.Delete(sourceFile);
return true; //Falls eine Rückgabe "true" benötigt wird

Nun kann man der CFD-Extension anrufen und die Ansage von der IVR neu besprechen.
 
Zuletzt bearbeitet:
Cool.

Danke dir!!
 
@ilias_3CX

Das funktioniert super. Er tauscht die Audios aus, in der Verwaltungskonsole kann ich das neue aufgenommene Audio auch anhören und downloaden. Rufe ich den IVR aber an, kommt die zuerst eingespielte Audio. Hast du eine Idee woran das liegen könnte? Cache der Anlage o.Ä.? Auf dem Server liegt auf jeden Fall die richtige, neue WAV-Datei.
 
  • Like
Reaktionen: mr412
Ja liegt am IVR Cache.
Setze unter Parameter (/app/settings/parameters/custom) folgenden neuen Parameter:

IVR_CACHE_DISABLE mit dem Wert 1

und starte den IVR Dienst neu. Es gäbe noch andere "Dirty" Methoden (zBsp. per Cronjob den Service Regelmässig zu restarten oder diesen per CFD zu triggern..). Eine "offizielle" Lösung gibt es leider nicht, diese scheint mir jedoch die beste Lösung zu sein...
 
Zuletzt bearbeitet:
  • Like
  • Love
Reaktionen: erfis und patrickb
Edit:
Läuft wunderbar mit deaktiviertem IVR-Cache! Danke für dieses coole Feature!

Nice @mr412 !
Habe gerade auch den anderen Beitrag von dir gesehen wo das diskutiert wurde. Cool das du auch so schnell antwortest. Der Cache ist dann dauerhaft deaktiviert wie ich dem Parameter entnehme? Ich checke das mal.

Finde deine vorgeschlagene Idee das mit C# zu lösen im CFD auch eigentlich die beste weil man dann sichergehen kann das es bei jeder Änderung mit ausgeführt wird.
 
Zuletzt bearbeitet:
=), ja der Cache ist dauerhaft deaktiviert, auch nach einem 3CX Update.
 
  • Love
Reaktionen: patrickb
Guten Morgen,

habe den Callflow lt. Vorgabe von mr412 nachgebaut, leider erhalte ich beim hochladen in die 3CX (V18 auf RaspberryPI 4SC pro) folgende Fehlermeldung bei den CFD APPs: :[27418..27418)E: (537,1)-(537,1): Error CS1513: } expected .

Gibt es hier irgendwelche Inkompatibilitäten zur Raspi Version der 3CX ?

Besten Dank.

VG Toothmaster
 
Hallo,

prinzipiell nein. Du hast irgendwo ein } zu wenig bzw. ein { zu viel wird da rumgemeckert. Da der gesamte Code bis auf einen kleines C# Schnipsel automatisch erzeugt wird würde ich an deiner Stelle da mal nachschauen.
 
  • Like
Reaktionen: mr412 und ToothMaster
Hi FXbastler,

Vielen Dank, oft sind es wirklich so Kleinigkeiten in einem Wald voller Bäume, es funktioniert nach setzen von {}.

Im CFD gehört es dann so eingebunden:

C#:
{
string sourceFile = @"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/ansagen/ansage.wav";
string destFile =  @"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/ansage.wav";
File.Delete(destFile); // Move Funktion kann nicht ersetzen, deshalb löschen wir hier das alte File.
File.Move(sourceFile, destFile); // Alternativ geht auch File.Copy(source, dest, true)
File.Delete(sourceFile);
return true; //Falls eine Rückgabe "true" benötigt wird
}

Also Vielen Dank und ein schönes Wochenende.

VG,
Toothmaster
 
  • Like
Reaktionen: mr412 und fxbastler
@mr412 Hallo,

gibt es hier Änderungen, die durch Updates der 3CX in Kraft getreten sind?

Bei mir taucht folgendes Problem auf:
Wenn ich die Ansage über die CFD Nummer bespreche und die 0 drücke, wird das Gespräch direkt beendet und die Ansage "Nachricht gespeichert" wird nicht mher wiedergegeben.
Im IVR ist dann keine Ansage mehr im Dropdownmenü der MC hinterlegt.
Die Ansage "ansage.wav" kann auch nicht mehr ausgewählt werden.

Das löschen scheint also zu klappen, das Ersetzen der Ansage allerdings nicht.
 
Hallo erfis
Habe es gerade mit Version 18.4 und 18.5 getestet. Es hat funktioniert...

Ich vermute dein Callflow Projekt heisst nicht "ansagen"...

/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/ansagen/ dieser Pfad /Callflows/ansagen/ entspricht dem Namen deines Projekts.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: erfis und fxbastler
Hallo @mr412 ,

vielen Dank für den Hinweis. Der Callflow war entsprechend meines Projektnamens im C# Code angepasst...die Ansage im CFD Projekt hatte leider einen Tippfehler...funktiniert nun alles!
Vielen Dank für die grandiose Anleitung!
 
Hallo,
nach so einer Lösung habe ich gesucht und diese im CFD nachgebaut. Verwendung auf einer 3CX V18u6

Nun komme ich beim Punkt 7.1 nicht weiter. Jemand hat geschrieben, dass man das ganze in die geschweiften Klammern setzen muss. Habe ich gemacht, oder muss ich die einzelnen Befehle bei "Input Parameter" eingeben?

1675089313184.png

Ich bekomme nämlich folgende Fehlermeldung:

C#:
     :[34093..34094)E: (587,28)-(587,29): Error CS1040: Präprozessordirektiven müssen das erste Zeichen in einer Zeile sein, das keine Leerstelle ist.
                    return C#();
                            ^
:[34115..34116)E: (588,16)-(588,17): Error CS1002: ; erwartet.
                }
                ^
:[34159..34160)E: (590,27)-(590,28): Error CS0548: "Main.ExecuteCSharpCode1505107502ECCComponent.C": Die Eigenschaft oder der Indexer muss mindestens einen Accessor haben.
            private object C#()
                           ^
:[34160..34161)E: (590,28)-(590,29): Error CS1040: Präprozessordirektiven müssen das erste Zeichen in einer Zeile sein, das keine Leerstelle ist.
            private object C#()
                            ^
:[34182..34182)E: (591,17)-(591,17): Error CS1014: get- oder set-Accessor erwartet.
                {
 
Hallo,

poste mal bitte den Inhalt des Fensters des C# Code als Code Block, damit man das (komplett) lesen kann.

Prinzipiell müssen bei so einem C# Code Block keine extra geschweiften Klammern außenrum sein.

Laut deinem Log ist da ein Schreibfehler im Code (den man aber nicht sieht). Da steht wohl irgendwo return C#(); und das ist ein Ding der Unmöglichkeit. Es gibt keine Routine C# irgendwo (schon der Name ...), deren Rückgabewert wiederum als return Rückgabewert genutzt werden könnte.

Grundsätzlich braucht dieses Schnipsel gar keinen Rückgabewert. Dazu den Haken bei 'The method returns a value' im Dialogfeld rausnehmen und die Zeile mit dem return ...; komplett löschen.
 
Hallo,

danke für die Antwort. Hier der Code als Code Block (diesen habe ich von hier mit copy&paste):

C#:
string sourceFile = @"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/ansagen/ansage.wav";
string destFile =  @"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/ansage.wav";
File.Delete(destFile); // Move Funktion kann nicht ersetzen, deshalb löschen wir hier das alte File.
File.Move(sourceFile, destFile); // Alternativ geht auch File.Copy(source, dest, true)
File.Delete(sourceFile);
return true; //Falls eine Rückgabe "true" benötigt wird

Habe es nochmals versucht ohne dem Haken bei "The method returns a value". Selbes Problem.

Wird dieser Code im Fenster "Execute C# Code" auch unter "C# Code" eingegeben, oder muss dieser etwa weiter oben unter "Input Parameters" eingetragen werden?
 
'Input Parameters' bleibt komplett leer. Dieser CFB C# Code Block benötigt keine Übergabeparameter. Ist alles statisch definiert.

Der Fehler liegt irgendwo anders. Ich kann das auch nicht nachvollziehen. Das ist ein völlig simples CFD Stück insgesamt. Da kommt nirgends im Code die Kombination C# inhaltlich vor. Schau mal bei dir nach und poste die entspr. Zeilen (587 - 591?) hier als Code Block.
 
Hier der Code:

C#:
                    C#();
                    return null;
                }
           
            private void C#()

Hat C# eventuell mit dem "Method Name" im Fenster zu tun? Habe dort nämlich C# eingegeben, da ich nicht wusste, was ich sonst eingeben soll.

EDIT: Ja, das C# hat mit dem "Method Name" etwas zu tun. Habe dort jetzt "ansagen" reingeschrieben und jetzt habe ich nur mehr folgenden Fehler:

C#:
        :[34629..34635)E: (599,0)-(599,6): Error CS0127: Da "Main.ExecuteCSharpCode11256624231ECCComponent.ansagen()" "void" zurückgibt, darf auf ein Rückgabeschlüsselwort kein Objektausdruck folgen.
return true; //Falls eine Rückgabe "true" benötigt wird
^^^^^^

Die Zeile 599 ist der Code:

C#:
return true; //Falls eine Rückgabe "true" benötigt wird
 
Zuletzt bearbeitet:
Ich habe jetzt die Zeile 599

C#:
return true; //Falls eine Rückgabe "true" benötigt wird

rausgelöscht und jetzt ist der CFD grün.

Jetzt werde ich das ganze mal testen. Danke
 
  • Like
Reaktionen: MarcosV_ 3CX

Zurzeit aktive Besucher

Statistik des Forums

Themen
21.229
Beiträge
106.815
Mitglieder
70.383
Neuestes Mitglied
malt25
Holen Sie sich 3CX - völlig kostenlos!

Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX register cta
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.