Wednesday, September 9, 2009
Asterisk in 6h
Author:
Rene und ich haben gestern Abend in nur 6 Stunden von null auf fertig auf
dem rohen Asterisk uns unsere Telefonanlage programmiert. Das ist so
einfach und gut verständlich, dass ich die Config hier kurz erklären
möchte. Ich annotiere dazu eine Mail an Astrid und Harald, die
beschrieben hat, was wir alles umgesetzt haben.
Wir haben nur ca. 120 Zeilen für die gesamte Konfiguration gebraucht.
Aber zunächst braucht man mal Telefone. Der Abschnitt ist nicht so
spannend und ihr könnt gerne zum nächsten großen Abschnitt "Dialplan"
springen. Unsere Telefone sind alle gleich konfiguriert und haben alle
die gleichen Berechtigungen und unterscheiden sich also nur in den
Nebenstellennummern. Damit sich das Telefon an Asterisk anmelden kann
braucht man ein SIP Konto. Damit man nicht alle Parameter einzeln
definieren muss, legt man ein Template an, dass alle gemeinsamen
Einstellungen zusammenfasst, davon "leitet man dann ab", so dass Renes
Nebenstelle mit der Nummer 66 so aussieht:
Natürlich muss man das Template "defaults" mit den für alle geltenen
Einstellungen auch definieren (ws. sogar vorher):
Natürlich muss man das Template "defaults" mit den für alle geltenen
Einstellungen auch definieren (ws. sogar vorher):
Das "subscribecontext" ist wichtig, damit dieses Telefon sieht, was andere
Telefone im angegebenen Kontext gerade machen, also ob telefoniert wird,
ob es klingelt oder ob es frei ist. Das übernehmen von Anrufen anderer
Telefone geht über "callgroup" und "pickupgroup". Jedes Telefon gehört zu
einer Gruppe und darf für Anrufe von bestimmmten anderen Gruppe
"abgreifen". Hier gehören alle zu "2" und es dürfen auch alle Anrufe von
"2" annehmen.
Um nach draußen telefonieren zu können und von draußen Rufe annehmen zu
können brauchen wir noch ein Konto für unseren SIP-to-ISDN Gateway von
Patton:
Damit man überhaupt "subscriben" (also andere Telefone beobachten) darf
braucht's noch folgende allgemein Config:
Das war's bei der Definition der Telefone.
Der Dialplan bestimmt was passiert wenn man welche Nummer anruft. Wenn
man gar nichts definiert kann man GAR KEINE Nummern anrufen. Nicht mal
intern. Man muss also auch definieren, dass die eine Nebenstelle über die
Nummer der anderen Nebenstelle diese Nebenstelle auch tatsächlich anrufen
darf. Und damit sind wir beim ersten Punkt aus das oben genannten Mail:
Das bedeutet, dass Telefone, die im Kontext "intern" sind über wählen der
"11" eine Verbindung zum SIP Telefon mit der Nebenstellennummer "11"
herstellen. Die eins nach dem ersten Komma bedeutet, dass das die erste
Aktion ist, die ausgeführt werden soll, wenn die Nummer gewählt wird. Man
kann danach mit höheren Nummern die Aktionen angeben, die danach passieren
sollen. Das ganze gilt natürlich nicht nur für die 11 sondern analog für
alle anderen Telefone. Und weil es so mühsam ist, das für alle zu
definieren, kann man auch ein Muster angeben und wenn die gewählte Nummer
darauf passt, dann passiert etwas, bei uns also:
Der Unterstrich bedeutet, dass das folgende keine vollständige Nummer,
sondern ein Muster ist. Die beiden XX passen z.B. auf 83 oder auf 22 oder
auf 11 oder auf 30. Das ${EXTEN} ist eine Dialplan-Variable, die immer
die gewählte Nummer enthält, d.h. wenn die 22 gewählt wird, dann passt 22
auf das _XX Muster und es wird der Befehl Dial(SIP/${EXTEN}) ausgeführt,
wobei das ${EXTEN} vorher durch die gewählte Nummer 22 ersetzt wird.
Damit man auch nach draußen telefonieren kann muss man angeben, was mit
anderen Nummern passiert:
Das X steht wieder für eine Ziffer, der Punkt steht für ein oder mehrere
Ziffern, dass heisst die kürzeste Nummer, die passt ist dreistellig. Beim
Wählen muss man jetzt noch angeben, dass man nicht intern sondern über den
in sip.conf definierten Patton-Gateway rauswählen will. Und das war's.
Damit man Gespräche von außen annehmen kann muss man definieren, was
passiert, wenn ein Gespräch an die externe Rufnummer ankommt. Wir wollen
zum Beispiel, das Gespräche an die externe Nummer mit angehängter
Durchwahl direkt zur angewählten Nebenstelle durchgestellt werden:
Diese Regel müssen wir im vordefinierten "default" Kontext definieren,
denn der Patton ist NICHT im Kontext "intern" und deswegen gelten für ihn
auch nicht die Regeln aus dem "intern" Kontext. Das Muster passt auf alle
Nummern, die mit unserer externen Nummer beginnen und bei denen noch zwei
beliebige Ziffern folgen, also z.B. 896456033 für die Durchwahl "33".
Wenn diese Nummer gewählt wird, soll wieder verbunden werden, aber diesmal
an ${EXTEN:7} wobei das :7 bedeutet, dass die ersten 7-Stellen von der
gewählten Nummer abgeschnitten werden sollen, bevor durchgestellt wird.
Für das Beispeil heisst das, dass für Asterisk dann Dial(SIP/33) da steht,
genau wie wenn man intern 33 gewählt hätte.
Wir wollen, dass bei eingehenden Anrufen auf die Hauptnummer 8964561 (ohne
weiter Durchwahl) erst einige wenige Telefone klingeln, aber nach kurzer
Zeit, wenn keiner dran geht, eine größere Gruppe von Telefonen klingelt.
Das geht so:
Das ist die erste zweistufige Regel. Erst wird bei 22 und 44
angeklingelt. Aber nur bis zum Timeout von 10 Sekunden. Danach ist die
erste Regel beendet und Regel mit Laufnummer 2 kommt dran: dort wird auf
22, 44 aber zusätzlich auf 55 und 66 angeklinglt.
Anrufbeantworter, der dran geht, wenn das Telefon innerhalb der
Aha, wenn also auch bei der zweite Gruppe keiner dran geht, soll der AB
dran gehen und einen Text aufsagen. Dann erweitern wir mal unsere Regel
Jetzt gibt's zusätzlich in Zeile 2 einen Timeout von 20s und danach wird
der Anruf von der Telefonanlage angenommen und eine Nachricht
eingespielt. Danach wird aufgelegt.
Anrufbeantwortertext abhängig von angerufener Nummer (L&B MS, factis
Na, das ist einfach, einfach nämlich das gleiche nochmal für die andere
Rufnummer mit anderem Dateinamen im Playback für eine andere Nachricht:
Okay, erstmal die Anzeige. Damit dass funktioniert, muss Asterisk BEVOR
man eine angerufene Nummer bearbeitet, sagen welche Telefone klingeln
werden. Dieser Hinweis heisst "hint" und hat eine eigene
Reihenfolgenbezeichnung, die vor allen anderen stehen muss. Für interne
Anrufe geht das so:
Und das war's (jedenfalls mit den Einstellungen, die wir oben in sip.conf
gemacht haben).
Für's übernehmen muss man für Snom Telefone Rufnummern der Form *8XX
definieren, wobei XX die Nebenstelle ist von der übernommen werden soll.
Denn diese Nummer wählt das Snom, wenn man auf die Nebenstellentaste der
Person drückt. Ein Gespräch kann man im Dialplan mit "Pickup" übernehmen.
Eigentlich sollte folgendes reichen:
Denn so würde der Ruf, der an der Nebenstelle XX anliegt angenommen
werden. Aber irgendwie meldet Asterisk dann immer, dass es keinen
solchen Channel findet. Mit folgendem Workaround, nämlich den Channel
erst in der globalen Variable PICKUPMARK zu speichern und dann wieder dort
auszulesen, geht's dann:
Dazu braucht muss man eigentlich nichts weiter tun, als bei allen
Dial-Befehlen, bei denen das Gespräch übergeben werden darf hinten noch
"tT" als Option anzuhängen. Das eine steht für "attended transfer" und
das andere für "blind transfer" (also Übergabe ohne Rückfrage).
Richtig sieht also das Annehmen eines externen Anrufs so aus:
Beim Snom muss man noch konfigurieren was die Tasten jeweils genau machen
(d.h. wie man z.B. mehrere gehaltene Gespräche vermitteln will).
Ausserdem braucht man noch folgende Konfiguration in features.conf:
Damit kann man dann auch durch wählen von *8 irgendeinen gerade
klingelnden Anruf annehmen, den man nach sip.conf "callgroup" und
"pickupgroup" Konfiguration annehmen darf. (Wenn mehrere klingeln,
bekommt man einen zufälligen zugewiesen.)
Wichtig für den Transfer sind die Werte unter "featuremap". Im Moment
geht das übergeben durch auflegen noch nicht, vielleicht braucht man da
doch noch was.
Damit die Telefone unterschiedlich klingeln muss man bei SIP einen
speziellen Snom Header setzen, das geht so:
Der Klingelton "alert-external" wird im Telefon konfiguriert. Statt
"alert-external" gibt's noch "alert-group" und "alert-internal". Man kann
auch eine eigene Klingelton-URL angeben.
Wir wollen einen AB, der ausserhalb der Geschäftszeiten nach ca. 2x klingeln dran geht
und ja nach angerufener eine andere Meldung (auch anders als die
"keiner dran gegangen Meldung") abspielt und anbietet eine Nachricht zu
hinterlassen.
Das sind eigentlich zwei Sachen auf einmal. Einmal ein zeitabhängiger
Dialplan und einmal eine AB, der es erlaubt Nachrichten zu hinterlassen
und abzufragen. Erst der AB. Dazu legt man eine Datei "voicemail.conf" an:
Hier definieren wir die Mailbox 2000, die wir in der sip.conf allen
Benutzern zugewiesen haben. Um die Mailbox abfragen zu können braucht's
noch folgende Konfiguration im Dialplan:
Ich glaube eigentlich braucht's nur die zweite Zeile für die Taste am
Snom. Aber die zweite Zeile ist nützlich, weil man die Nummer an jedem
Telefon wählen kann. Wenn wir die Nummer auf 80 verkürzen würden könnte
man sie wahrscheinlich sogar von extern abrufen. Allerdings sollten wir
dann das "s" weg machen, denn das sorgt dafür, dass man kein Passwort
eingeben muss zum abfragen. :-)
Damit man eine Nachricht hinterlassen kann, muss man bei statt "Playback"
das Kommando "VoiceMail" benutzen und sagen in welche Mailbox die
aufgenommene Nachricht gespeichert werden soll. Mit der Option "s" sorgt
man dafür, dass das VoiceMail-System "silent" ist und nicht erst dumm
quatscht. Lieber spielen wir vorher eine Nachricht ab, also:
Der zeitabhängig Dialplan ist auch einfach. Man kann im Dialplan einen
Kontext in einen anderen includen. Es wird dann immer die erste passende
Extension ausgewählt. Unser Hauptkontext "default" sieht im Moment so aus
Das heisst es werden "per Default" erst werden alle Regeln im Kontext
"allgemein" geprüft. Wenn es Montag bis Freitag zwischen 8 und 17:30 ist,
dann werden ausserdem die Regeln in "innerhalb" geprüft, sonst nur die in
"ausserhalb". Bei "innerhalb" sind die externen Extensions (mit 896456X)
so definiert, wie in den weiter oben stehenden Punkten. Im Kontext
ausserhalb sind die externen Nummern so wie hier oben mit "VoiceMail" und
kurzer Klingelzeit (5s) definiert.
Anrufbeantworter wird an allen Telefonen durch das blinkende Lämpchen
signalisiert und kann mit der Anrufbeantworter-Taste an jedem Telefon
abgehört werden
Das Abhören geht durch die "exten => asterisk,1,VoicemailMain(...)"
Extension, das Blinken kommt, glaube ich, deswegen automatisch, weil in
sip.conf die Mailbox 2000 eingetragen ist und diese Mailbox in
voicemail.conf definiert ist.
Das geht indem im oben gezeigten Defaultkontext der eigene Kontext
"allgemein" inkludiert wird, der gerade die Regel zum direkten Anrufen
einer Nebenstelle von außen enthält. Die wird erst geprüft und ist damit
tageszeitunabhängig.
Wählen ohne Vorwahl einer Null, denn Nebenstellen sind genau
zweistellig und extern gibt es keine zweistelligen Nummern, so dass
alle Nummern, die länger als zwei Stellen sind extern gewählt werden.
War oben schon beschrieben in der Regel mit dem Pattern "_XX.", das auf
drei- oder mehrstellige Rufnummern matcht. Das Pattern "_XX" benutzen wir
für's interne Anrufen.
dem rohen Asterisk uns unsere Telefonanlage programmiert. Das ist so
einfach und gut verständlich, dass ich die Config hier kurz erklären
möchte. Ich annotiere dazu eine Mail an Astrid und Harald, die
beschrieben hat, was wir alles umgesetzt haben.
Wir haben nur ca. 120 Zeilen für die gesamte Konfiguration gebraucht.
DIE TELEFONE
Aber zunächst braucht man mal Telefone. Der Abschnitt ist nicht so
spannend und ihr könnt gerne zum nächsten großen Abschnitt "Dialplan"
springen. Unsere Telefone sind alle gleich konfiguriert und haben alle
die gleichen Berechtigungen und unterscheiden sich also nur in den
Nebenstellennummern. Damit sich das Telefon an Asterisk anmelden kann
braucht man ein SIP Konto. Damit man nicht alle Parameter einzeln
definieren muss, legt man ein Template an, dass alle gemeinsamen
Einstellungen zusammenfasst, davon "leitet man dann ab", so dass Renes
Nebenstelle mit der Nummer 66 so aussieht:
v v sip.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
[66](defaults)
callerid=Rene
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Natürlich muss man das Template "defaults" mit den für alle geltenen
Einstellungen auch definieren (ws. sogar vorher):
v v sip.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
[66](defaults)
callerid=Rene
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Natürlich muss man das Template "defaults" mit den für alle geltenen
Einstellungen auch definieren (ws. sogar vorher):
v v sip.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
[defaults](!)
type=friend ; weiss nicht
secret=7531 ; SIP Passwort
host=dynamic ; jede IP darf
context=intern ; selbstdefinierter "Sicherheitsbereich"
subscribecontext=intern ; Tel. darf andere Tels in diesem Bereich abhören
call-limit=10 ; weiss nicht
pickupgroup=2 ; Tel. darf Rufe für Tels dieser Gruppe annehmen
callgroup=2 ; Gruppe dieses Telefons
mailbox=2000 ; Voicemailbox dieses Telefons
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Das "subscribecontext" ist wichtig, damit dieses Telefon sieht, was andere
Telefone im angegebenen Kontext gerade machen, also ob telefoniert wird,
ob es klingelt oder ob es frei ist. Das übernehmen von Anrufen anderer
Telefone geht über "callgroup" und "pickupgroup". Jedes Telefon gehört zu
einer Gruppe und darf für Anrufe von bestimmmten anderen Gruppe
"abgreifen". Hier gehören alle zu "2" und es dürfen auch alle Anrufe von
"2" annehmen.
Um nach draußen telefonieren zu können und von draußen Rufe annehmen zu
können brauchen wir noch ein Konto für unseren SIP-to-ISDN Gateway von
Patton:
v v sip.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
[gw_patton]
type = peer
host = patton.factis.lan
port = 5060
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Damit man überhaupt "subscriben" (also andere Telefone beobachten) darf
braucht's noch folgende allgemein Config:
v v sip.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
[general]
port=5060
bindaddr=0.0.0.0
allowsubscribe = yes
notifyringing = yes
notifyhold = yes
limitonpeers = yes
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Das war's bei der Definition der Telefone.
DER DIALPLAN
Der Dialplan bestimmt was passiert wenn man welche Nummer anruft. Wenn
man gar nichts definiert kann man GAR KEINE Nummern anrufen. Nicht mal
intern. Man muss also auch definieren, dass die eine Nebenstelle über die
Nummer der anderen Nebenstelle diese Nebenstelle auch tatsächlich anrufen
darf. Und damit sind wir beim ersten Punkt aus das oben genannten Mail:
Gespräche intern führen
v v BEISPIEL v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
[intern]
exten => 11,1,Dial(SIP/11)
exten => 22,1,Dial(SIP/22)
exten => 33,1,Dial(SIP/33)
exten => 44,1,Dial(SIP/44)
exten => 55,1,Dial(SIP/55)
exten => 66,1,Dial(SIP/66)
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Das bedeutet, dass Telefone, die im Kontext "intern" sind über wählen der
"11" eine Verbindung zum SIP Telefon mit der Nebenstellennummer "11"
herstellen. Die eins nach dem ersten Komma bedeutet, dass das die erste
Aktion ist, die ausgeführt werden soll, wenn die Nummer gewählt wird. Man
kann danach mit höheren Nummern die Aktionen angeben, die danach passieren
sollen. Das ganze gilt natürlich nicht nur für die 11 sondern analog für
alle anderen Telefone. Und weil es so mühsam ist, das für alle zu
definieren, kann man auch ein Muster angeben und wenn die gewählte Nummer
darauf passt, dann passiert etwas, bei uns also:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
[intern]
exten => _XX,1,Dial(SIP/${EXTEN})
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Der Unterstrich bedeutet, dass das folgende keine vollständige Nummer,
sondern ein Muster ist. Die beiden XX passen z.B. auf 83 oder auf 22 oder
auf 11 oder auf 30. Das ${EXTEN} ist eine Dialplan-Variable, die immer
die gewählte Nummer enthält, d.h. wenn die 22 gewählt wird, dann passt 22
auf das _XX Muster und es wird der Befehl Dial(SIP/${EXTEN}) ausgeführt,
wobei das ${EXTEN} vorher durch die gewählte Nummer 22 ersetzt wird.
Gespräche von extern annehmen und nach extern führen
Damit man auch nach draußen telefonieren kann muss man angeben, was mit
anderen Nummern passiert:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
[intern]
exten => _XX,1,Dial(SIP/${EXTEN})
exten => _XX.,1,Dial(SIP/${EXTEN}@gw_patton)
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Das X steht wieder für eine Ziffer, der Punkt steht für ein oder mehrere
Ziffern, dass heisst die kürzeste Nummer, die passt ist dreistellig. Beim
Wählen muss man jetzt noch angeben, dass man nicht intern sondern über den
in sip.conf definierten Patton-Gateway rauswählen will. Und das war's.
Damit man Gespräche von außen annehmen kann muss man definieren, was
passiert, wenn ein Gespräch an die externe Rufnummer ankommt. Wir wollen
zum Beispiel, das Gespräche an die externe Nummer mit angehängter
Durchwahl direkt zur angewählten Nebenstelle durchgestellt werden:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
exten => _8964560XX,1,Dial(SIP/${EXTEN:7})
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Diese Regel müssen wir im vordefinierten "default" Kontext definieren,
denn der Patton ist NICHT im Kontext "intern" und deswegen gelten für ihn
auch nicht die Regeln aus dem "intern" Kontext. Das Muster passt auf alle
Nummern, die mit unserer externen Nummer beginnen und bei denen noch zwei
beliebige Ziffern folgen, also z.B. 896456033 für die Durchwahl "33".
Wenn diese Nummer gewählt wird, soll wieder verbunden werden, aber diesmal
an ${EXTEN:7} wobei das :7 bedeutet, dass die ersten 7-Stellen von der
gewählten Nummer abgeschnitten werden sollen, bevor durchgestellt wird.
Für das Beispeil heisst das, dass für Asterisk dann Dial(SIP/33) da steht,
genau wie wenn man intern 33 gewählt hätte.
Gruppenrufe mit schrittweise größer werdender Gruppe
Wir wollen, dass bei eingehenden Anrufen auf die Hauptnummer 8964561 (ohne
weiter Durchwahl) erst einige wenige Telefone klingeln, aber nach kurzer
Zeit, wenn keiner dran geht, eine größere Gruppe von Telefonen klingelt.
Das geht so:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
exten => _8964561,1,Dial(SIP/22&SIP/44, 10)
exten => _8964561,2,Dial(SIP/22&SIP/44&SIP/33&SIP/55&SIP/66)
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Das ist die erste zweistufige Regel. Erst wird bei 22 und 44
angeklingelt. Aber nur bis zum Timeout von 10 Sekunden. Danach ist die
erste Regel beendet und Regel mit Laufnummer 2 kommt dran: dort wird auf
22, 44 aber zusätzlich auf 55 und 66 angeklinglt.
Anrufbeantworter, der dran geht, wenn das Telefon innerhalb der
Geschäftszeiten zu lange klingelt und eine Nachricht spricht.
Aha, wenn also auch bei der zweite Gruppe keiner dran geht, soll der AB
dran gehen und einen Text aufsagen. Dann erweitern wir mal unsere Regel
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
exten => _8964561,1,Dial(SIP/22&SIP/44, 10)
exten => _8964561,2,Dial(SIP/22&SIP/44&SIP/33&SIP/55&SIP/66, 20)
exten => _8964561,3,Answer()
exten => _8964561,4,Playback(alle_mitarbeiter_im_gespraech)
exten => _8964561,5,Hangup()
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Jetzt gibt's zusätzlich in Zeile 2 einen Timeout von 20s und danach wird
der Anruf von der Telefonanlage angenommen und eine Nachricht
eingespielt. Danach wird aufgelegt.
Anrufbeantwortertext abhängig von angerufener Nummer (L&B MS, factis
Team oder factis research)
Na, das ist einfach, einfach nämlich das gleiche nochmal für die andere
Rufnummer mit anderem Dateinamen im Playback für eine andere Nachricht:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
exten => _8964560,1,Dial(SIP/22&SIP/44&SIP/33&SIP/55&SIP/66, 30)
exten => _8964560,2,Answer()
exten => _8964560,2,Playback(lubms_sagt_hallo)
exten => _8964560,3,Playback(alle_mitarbeiter_im_gespraech)
exten => _8964560,4,Hangup()
exten => _8964561,1,Dial(SIP/22&SIP/44, 10)
exten => _8964561,2,Dial(SIP/22&SIP/44&SIP/33&SIP/55&SIP/66, 20)
exten => _8964561,3,Answer()
exten => _8964561,4,Playback(factisteam_sagt_hallo)
exten => _8964561,5,Playback(alle_mitarbeiter_im_gespraech)
exten => _8964561,6,Hangup()
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Kurzwahltasten, Busy-Lamps und Rufübernahme
Okay, erstmal die Anzeige. Damit dass funktioniert, muss Asterisk BEVOR
man eine angerufene Nummer bearbeitet, sagen welche Telefone klingeln
werden. Dieser Hinweis heisst "hint" und hat eine eigene
Reihenfolgenbezeichnung, die vor allen anderen stehen muss. Für interne
Anrufe geht das so:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
[intern]
exten => _XX,hint,SIP/${EXTEN}
exten => _XX,1,Dial(SIP/${EXTEN})
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Und das war's (jedenfalls mit den Einstellungen, die wir oben in sip.conf
gemacht haben).
Für's übernehmen muss man für Snom Telefone Rufnummern der Form *8XX
definieren, wobei XX die Nebenstelle ist von der übernommen werden soll.
Denn diese Nummer wählt das Snom, wenn man auf die Nebenstellentaste der
Person drückt. Ein Gespräch kann man im Dialplan mit "Pickup" übernehmen.
Eigentlich sollte folgendes reichen:
v v BEISPIEL v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
[intern]
exten => _*8XX,1,Pickup(${EXTEN:2})
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Denn so würde der Ruf, der an der Nebenstelle XX anliegt angenommen
werden. Aber irgendwie meldet Asterisk dann immer, dass es keinen
solchen Channel findet. Mit folgendem Workaround, nämlich den Channel
erst in der globalen Variable PICKUPMARK zu speichern und dann wieder dort
auszulesen, geht's dann:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
[intern]
exten => _*8X.,1,Set(GLOBAL(PICKUPMARK)=${EXTEN:2})
exten => _*8X.,n,Pickup(${EXTEN:2}@PICKUPMARK)
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Halten, Durchstellen und Konferenz
Dazu braucht muss man eigentlich nichts weiter tun, als bei allen
Dial-Befehlen, bei denen das Gespräch übergeben werden darf hinten noch
"tT" als Option anzuhängen. Das eine steht für "attended transfer" und
das andere für "blind transfer" (also Übergabe ohne Rückfrage).
Richtig sieht also das Annehmen eines externen Anrufs so aus:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
exten => 8964560,1,Dial(SIP/22&SIP/33&SIP/44&SIP/55, 30, tT)
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Beim Snom muss man noch konfigurieren was die Tasten jeweils genau machen
(d.h. wie man z.B. mehrere gehaltene Gespräche vermitteln will).
Ausserdem braucht man noch folgende Konfiguration in features.conf:
v v features.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v
[general]
parkext => 700
parkpos => 701-720
context => parkedcalls
pickupexten = *8
[featuremap]
blindxfer => #1
atxfer => *2
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Damit kann man dann auch durch wählen von *8 irgendeinen gerade
klingelnden Anruf annehmen, den man nach sip.conf "callgroup" und
"pickupgroup" Konfiguration annehmen darf. (Wenn mehrere klingeln,
bekommt man einen zufälligen zugewiesen.)
Wichtig für den Transfer sind die Werte unter "featuremap". Im Moment
geht das übergeben durch auflegen noch nicht, vielleicht braucht man da
doch noch was.
Unsere gewählten Klingeltöne für intern und extern
Damit die Telefone unterschiedlich klingeln muss man bei SIP einen
speziellen Snom Header setzen, das geht so:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
[intern]
exten => _896456XXX,1,SIPAddHeader("Alert-Info:\;info=alert-external\;x-line-id=0")
exten => _896456XXX,n,Dial(SIP/${EXTEN:7})
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Der Klingelton "alert-external" wird im Telefon konfiguriert. Statt
"alert-external" gibt's noch "alert-group" und "alert-internal". Man kann
auch eine eigene Klingelton-URL angeben.
AB-Konfiguration
Wir wollen einen AB, der ausserhalb der Geschäftszeiten nach ca. 2x klingeln dran geht
und ja nach angerufener eine andere Meldung (auch anders als die
"keiner dran gegangen Meldung") abspielt und anbietet eine Nachricht zu
hinterlassen.
Das sind eigentlich zwei Sachen auf einmal. Einmal ein zeitabhängiger
Dialplan und einmal eine AB, der es erlaubt Nachrichten zu hinterlassen
und abzufragen. Erst der AB. Dazu legt man eine Datei "voicemail.conf" an:
v v voicemail.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v
[general]
format = wav
[default]
2000 => 7531,factis mailbox
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Hier definieren wir die Mailbox 2000, die wir in der sip.conf allen
Benutzern zugewiesen haben. Um die Mailbox abfragen zu können braucht's
noch folgende Konfiguration im Dialplan:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
exten => 800,1,VoicemailMain(2000, s)
exten => asterisk,1,VoicemailMain(s2000)
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Ich glaube eigentlich braucht's nur die zweite Zeile für die Taste am
Snom. Aber die zweite Zeile ist nützlich, weil man die Nummer an jedem
Telefon wählen kann. Wenn wir die Nummer auf 80 verkürzen würden könnte
man sie wahrscheinlich sogar von extern abrufen. Allerdings sollten wir
dann das "s" weg machen, denn das sorgt dafür, dass man kein Passwort
eingeben muss zum abfragen. :-)
Damit man eine Nachricht hinterlassen kann, muss man bei statt "Playback"
das Kommando "VoiceMail" benutzen und sagen in welche Mailbox die
aufgenommene Nachricht gespeichert werden soll. Mit der Option "s" sorgt
man dafür, dass das VoiceMail-System "silent" ist und nicht erst dumm
quatscht. Lieber spielen wir vorher eine Nachricht ab, also:
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
exten => 8964560,1,SIPAddHeader("Alert-Info:\;info=alert-external\;x-line-id=0")
exten => 8964560,n,Dial(SIP/22&SIP/33&SIP/44&SIP/55, 5, tT)
exten => 8964560,n,Playback(lubms_begruessung)
exten => 8964560,n,Playback(lubms_ausserhalb)
exten => 8964560,n,VoiceMail(2000, s)
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Der zeitabhängig Dialplan ist auch einfach. Man kann im Dialplan einen
Kontext in einen anderen includen. Es wird dann immer die erste passende
Extension ausgewählt. Unser Hauptkontext "default" sieht im Moment so aus
v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v
[default]
include => allgemein
include => innerhalb,08:00-17:30,mon-fri,*,*
include => ausserhalb
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
Das heisst es werden "per Default" erst werden alle Regeln im Kontext
"allgemein" geprüft. Wenn es Montag bis Freitag zwischen 8 und 17:30 ist,
dann werden ausserdem die Regeln in "innerhalb" geprüft, sonst nur die in
"ausserhalb". Bei "innerhalb" sind die externen Extensions (mit 896456X)
so definiert, wie in den weiter oben stehenden Punkten. Im Kontext
ausserhalb sind die externen Nummern so wie hier oben mit "VoiceMail" und
kurzer Klingelzeit (5s) definiert.
Signalisierung von neuen Anrufen
Anrufbeantworter wird an allen Telefonen durch das blinkende Lämpchen
signalisiert und kann mit der Anrufbeantworter-Taste an jedem Telefon
abgehört werden
Das Abhören geht durch die "exten => asterisk,1,VoicemailMain(...)"
Extension, das Blinken kommt, glaube ich, deswegen automatisch, weil in
sip.conf die Mailbox 2000 eingetragen ist und diese Mailbox in
voicemail.conf definiert ist.
Direktes, zeitunabhängiges Anrufen einer Nebenstelle
Das geht indem im oben gezeigten Defaultkontext der eigene Kontext
"allgemein" inkludiert wird, der gerade die Regel zum direkten Anrufen
einer Nebenstelle von außen enthält. Die wird erst geprüft und ist damit
tageszeitunabhängig.
Extern wählen ohne Null
Wählen ohne Vorwahl einer Null, denn Nebenstellen sind genau
zweistellig und extern gibt es keine zweistelligen Nummern, so dass
alle Nummern, die länger als zwei Stellen sind extern gewählt werden.
War oben schon beschrieben in der Regel mit dem Pattern "_XX.", das auf
drei- oder mehrstellige Rufnummern matcht. Das Pattern "_XX" benutzen wir
für's interne Anrufen.
Autor: David Leuschner
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment