Coverbild des Asterisk Buches von Stefan Wintermeyer

Beta Test!

  • Bitte melden Sie Fehler! Informationen dazu in der Beta-Test FAQ.
  • Besuchen Sie den Asterisk-Tag.org in Chemnitz und lassen Sie sich dort Ihr Buch von Stefan Wintermeyer signieren.
  • Bestellmoeglichkeiten fuer das gedruckte Buch: Amazon oder direkt beim Verlag

Asterisk-Schulungen und Consulting vom Autor dieses Buches finden Sie auf http://www.amooma.de.
Naechste Asterisk-Schulung am 18. und 19. Januar. Noch 2 Plaetze frei!


5. extensions.conf

Im Dialplan (Kapitel 4, Programmieren im Dialplan) können sich zum einen die Agenten über eine bestimmte Extension in die Warteschleife einloggen, zum anderen werden Anrufe mit der Applikation Queue() (Abschnitt 7.69, „Queue()) in eine Schlange eingereiht.

Eine minimale Extension, die die Anrufer in die Warteschleife einreiht, sähe so aus:

exten => 20,1,Answer()                   ; abheben
exten => 20,n,Set(MUSICCLASS()=default)  ; Musikklasse "default" setzen
exten => 20,n,Queue(support,t)           ; in Schlange "support" einreihen
exten => 20,n,Hangup()                   ; hinterher auflegen

Wir lieben es etwas vollständiger und verwenden diese Extension:

exten => 20,n,Wait(2)
exten => 20,n,Answer()                   ; abheben
exten => 20,n,Set(MUSICCLASS()=default)  ; Musikklasse "default" setzen
exten => 20,n,Queue(support,t)           ; in Schlange "support" einreihen
; zur Erinnerung: die Option t erlaubt es dem Agenten, den Anruf
; an eine andere Extension weiterzuleiten
; setzt QUEUESTATUS =
; TIMEOUT | FULL | JOINEMPTY | JOINUNAVAIL | LEAVEEMPTY | LEAVEUNAVAIL
exten => 20,n,Goto(q-${QUEUESTATUS},1)  ; je nach QUEUESTATUS springen

; keine Agenten auf der Schlange:
; (hier könnte man alternativ auf VoiceMail() leiten)
exten => q-JOINEMPTY,1,Wait(1)
exten => q-JOINEMPTY,n,Playback(vm-nobodyavail,noanswer)
exten => q-JOINEMPTY,n,Playback(vm-goodbye,noanswer)
exten => q-JOINEMPTY,n,Hangup()

; keine Agenten (oder nur nicht-verfügbare) auf der Schlange:
exten => q-JOINUNAVAIL,1,Goto(q-JOINEMPTY,1)   ; wie JOINEMPTY behandeln

; alle Agenten haben Schlange verlassen:
exten => q-LEAVEEMPTY,1,Goto(q-JOINEMPTY,1)    ; wie JOINEMPTY behandeln

; alle Agenten (auch nicht-verfügbare) haben Schlange verlassen:
exten => q-LEAVEUNAVAIL,1,Goto(q-JOINEMPTY,1)  ; wie JOINEMPTY behandeln

; kein Agent antwortet:
exten => q-TIMEOUT,1,Goto(q-JOINEMPTY,1)       ; wie JOINEMPTY behandeln

; max. Anruferzahl für Schlange erreicht:
; (hier könnte man alternativ auf VoiceMail() leiten)
exten => q-FULL,1,Busy(5)
exten => q-FULL,n,Hangup()

Wenn wir diese Extension anrufen, werden wir, da keine Agenten angemeldet sind, die Ansage hören, dass z.Zt. niemand unseren Anruf entgegennehmen kann. (Wenn Sie das verschleiern wollen, setzen Sie in der queues.conf die Parameter joinempty=yes und leaveempty=no.)

Es fehlt also noch eine Extension unter der sich die Agenten einloggen, d.h. anwesend melden:

exten => 25,1,Answer()       ; abheben
exten => 25,n,AgentLogin()   ; Agent einloggen
exten => 25,n,Hangup()       ; hinterher auflegen

Mit AgentLogin() bleibt die Verbindung zum Agenten dauerhaft bestehen, und die eingehenden Anrufe werden auf diesen bereits aufgebauten Sprachkanal aufgeschaltet. Wenn der Agent den Hörer auflegt, wird er abgemeldet. Das bedeutet auch, dass ein Agent nicht gleichzeitig eingeloggt sein kann und ausgehende Gespräche machen kann. AgentLogin() ist daher in der Praxis wirklich nur dann geeignet, wenn es sich um ein reines Inbound-Call-Center handelt.

AgentCallbackLogin() hingegen hat den Vorteil, dass sich Agenten einmal anmelden können und bei eingehenden Gesprächen zurückgerufen werden. Sie bleiben also auch beim Auflegen angemeldet und können ausgehende Gespräche führen. Diese Applikation ist aber seit Version 1.4 „deprecated“, wird also zukünftig nicht mehr vorhanden sein.

Digium verwendet im Beispiel doc/queues-with-callback-members.txt (in AEL, lässt sich aber leicht in einen „herkömmlichen“ Dialplan umwandeln)

Read(agentennr,agent-user);
VMAuthenticate(${agentennr},s);

zum Authentifizieren der Agenten, AddQueueMember() zum dynamischen Hinzufügen zur Schlange und Dial() zum Anrufen der Agenten.

Sollte AgentCallbackLogin() tatsächlich ersatzlos wegfallen, geht damit tatsächlich Funktionalität und das leichte Setup verloren. (An dieser Stelle nochmal vielen Dank an Markus Bönke!)

Aufgabe. Es bleibt dem Leser als Aufgabe überlassen, vor die Einreihung in eine Warteschlange noch ein Menü zu schalten, z.B. „Um eine Bestellung aufzugeben, drücken Sie die 1. Für Reklamationen drücken Sie die 2.“, und dann 2 Warteschlangen einzurichten, denen die Agenten der entsprechenden Abteilung angehören.