Dialplan dynamisch verändern

schwerdy

Neuer User
Mitglied seit
5 Nov 2004
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
Mit dem Dialplan (extensions.conf) von Asterisk ist man zwar schon verdammt flexibel, ich suche aber eine Möglichkeit, das Verhalten dynamisch zu ändern. Beispielsweise:

Normal: Mitarbeiter bekommen ihre Anrufe durchgestellt
Besprechung: Mitarbeiter tippen irgendwas ins Telefon, damit Anrufe direkt zur Zentrale vermittelt werden
Stress: Mitarbeiter tippt wieder was ein, damit nur noch Firmeninterne Anrufe durchgestellt werden
usw...

ich bin mir sicher, dass * das kann, die Frage ist nur wie! Gibts dazu irgendwo Doku? Und: Verzeiht mir meine Unwissendheit, ich fang halt gerade erst damit an, mich mit der Thematik zu beschäftigen...
 
Dazu braucht man kein Skript. Ich würde einfach eine extension definieren, die einen Statuswert in die Asterisk eigene Datenbank schreibt, aus der erkennbar ist, ob die Nebenstelle xy erreichbar (=1) oder nicht erreichbar (=0) ist. Bei der Anwahl der Nebenstelle wird dann per Dialplan in der Datenebank der entsprechende Wert ausgelesen und entsprechend reagiert. Natürlich läßt sich das dann auch noch beliebig erweitern, bis hin zu einer telefon-gesteuerten Umleitungsprogrammierung.
 
Ich habe es über die DB von Asterisk gemacht

Code:
[macro-rufumleitung_setzen]
exten => s,1,DBput(CFIM/${CALLERIDNUM}=${ARG1})
exten => s,2,Wait(2)
exten => s,3,SetLanguage(de)
exten => s,4,SayDigits(${ARG1})
exten => s,5,Wait(2)
exten => s,6,Hangup

[macro-rufumleitung]
exten => s,1,SetCallerID(${CALLERIDNUM})
exten => s,2,DBget(temp=CFIM/${ARG1})
exten => s,3,SetCallerID(${CALLERIDNUM})
exten => s,4,GotoIf($[${temp} > 0]?5:6)
exten => s,5,Goto(duo,${temp},1)
exten => s,6,Dial(${ARG2},60,tT)
exten => s,7,DBget(temp=CFBS/${ARG1})

Vielleicht hilft es dir weiter.

CFIM = Ständige Umleitung
CFBS = Bei besetzt


Gruß,
Tucca
 
Bei mir ist die Lösung ein bißchen flexibler gehalten.

Durch Wahl einer der Kennziffern *91-*98 wird dem entsprechenden User der Statuswert 1 - 8 zugeordnet

Durch Wahl der Kennziffer *90 wird der Eintrag des Users komplett gelöscht.

Durch Wahl der Kennziffer *99+Umleitungsziel kann ein Umleitungsziel eingetragen werden.

Code:
[fonestatus]
exten => _*90,1,DBdel(fonestat/${CALLERIDNUM})
exten => _*90,n,Congestion
exten => _*90,n,Hangup

exten => _*9[1-8],1,DBput(fonestat/${CALLERIDNUM}=${EXTEN:2})
exten => _*9[1-8],n,Congestion
exten => _*9[1-8],n,Hangup

exten => _*99.,1,DBput(fonestat/${CALLERIDNUM}=${EXTEN:3})
exten => _*99.,n,Congestion
exten => _*99.,n,Hangup

Die Auswertung erfolgt beispielsweise folgendermaßen:

Code:
[teilnehmer70]
;
; zuerst wird der Status des Teilnehmers ausgelesen:
;
exten => 70,1,DBget(status=fonestat/70)
;
; wird kein Statuswert gefunden, geht die Abarbeitung automatisch bei n+101 (=102) weiter !
; in diesem Fall wird die Extension ganz normal angerufen
;
exten => 70,n,GotoIf($[${status} > 8]?91)
;
; wenn ein Status größer 8 gefunden wurde, wird das als Umleitungsziel betrachtet
; Umleitungsziele werden in extension 91 behandelt
;
; ansonsten geht es mit der Extension 10*status+1 weiter
; Beispiel: Status=2 -> Goto(21)
; was dort passiert, bleibt dem Anwender selbst überlassen
; die angegebenen Beispiele dienen nur der Veranschaulichung
;
exten => 70,n,Goto(${status}1)

; Status =1 -> Mailbox mit Ansage "nicht erreichbar" aufrufen
;
exten => 70,11,VoiceMail(u70)
exten => 70,n,Hangup

; Status = 2 -> Mailbox mit Ansage "im Gespräch" aufrufen
;
exten => 70,21,VoiceMail(b70)
exten => 70,n,Hangup

exten => 70,31,NoOp()
exten => 70,n,Hangup

exten => 70,41,NoOp()
exten => 70,n,Hangup

exten => 70,51,NoOp()
exten => 70,n,Hangup

exten => 70,61,NoOp()
exten => 70,n,Hangup

exten => 70,71,NoOp()
exten => 70,n,Hangup

exten => 70,81,NoOp()
exten => 70,n,Hangup

;
; Hier wird das Umleitungsziel angerufen, natürlich ließe sich sowas auch
; für Anrufe nach extern konfigurieren
;
exten => 70,91,Dial(SIP/${STATUS},30,r)
exten => 70,n,Hangup
;
; Teilnehmer "ganz normal" anrufen, wenn kein Sonderfall gefunden wurde.
;
exten => 70,102,Dial(SIP/70,30,r)
exten => 70,n,Hangup

BTW: Kann das hier mal bitte jemand in die Rubrik "Asterisk Rufnummernplan" verschieben ? Danke.
 
Hi,

es genau das was ich suche - als Newbie habe ich aber kein Plan wie man die Makros aufruft

@betateilchen, wenn ich Dein Script einbinde in die extension.conf kommt die Fehlermeldung, dass "Priotiy n" nicht zulässig ist

@Tucca
wie rufe ich das Script auf ? Wie lösche ich eine Umleitung wieder

Gruss

Uli
 
wenn ich Dein Script einbinde in die extension.conf kommt die Fehlermeldung, dass "Priotiy n" nicht zulässig ist

Dann hast Du eine ältere Version des Asterisk bei Dir laufen und mußt Du einfach die Priorities von Hand numerieren. Die Prio n bedeutet einfach "die nächste"

Also Beispiel:

exten => 70,21,VoiceMail(b70)
;exten => 70,n,Hangup
exten => 70,22,Hangup

exten => 70,31,NoOp()
;exten => 70,n,Hangup
exten => 70,32,Hangup

Alles klar :?:
 
He, danke Betateilchen für deinen Crashcurs in die * Datenbank.

Ich würde gerne ein weiteres mal auf deine (offensichtliche) Erfahrung mit Asterisk zurückgreifen (*schleim* ;-) )
Mein entgültiges Ziel ist ja, dass Chef was ins Telefon tippen kann und dann nur noch von Intern erreichbar ist. Spontan würde ich das so realisieren, dass ich zwei Makros schreibe, die halt (je nach Status) durchstellen oder weiterleiten. Ein Makro das im Kontext [intern] verwendet wird (in den interne Teilnehmer defaultmäßig landen) und ein Makro das im Kontext [extern] verwendet wird. Beide Makros unterscheiden sich nur dadurch, dass bei einem bestimmten Status (beispielsweise 5) beim Internen durchgestellt wird, beim externen nicht, bzw. weitergeleitet wird.

Könntest du diesen Lösungsansatz vertreten oder kennst du einen eleganteren Weg?
 
Das geht auch eleganter und ohne Makros. Aber Dein Denkansatz ist in sofern schonmal nicht schlecht, also probiere einfach mal aus, ob Du das so hinbekommst, wie Du das meinst, denn durch solches Ausprobieren kannst Du eine Menge lernen. Falls Du es nicht hinbekommen solltest, helfe ich Dir natürlich gerne weiter.

Kleiner Tipp: Letztendlich ist es nur eine Frage, an welchen Stellen im Dialplan Du die Datenbank-Statusabfrage machst - was sollte dagegen sprechen, diese auch im "Incoming-Context" durchzuführen, in dem die ankommenden Extern-Anrufe an die Teilnehmer verteilt werden :wink:
 
Noch 'ne Frage zu Betateilchens Lösung:

Mit diesen extensions:
Code:
exten => _*99.,1,DBput(fonestat/${CALLERIDNUM}=${EXTEN:3})
exten => _*99.,n,Congestion
exten => _*99.,n,Hangup

setzt du ja die varible fonestat/${CALLERIDNUM} auf die rufnummer, auf die umgeleitet werden soll. Wenn die jetzt aber nicht mit einer 9 anfängt?...

Müsste es daher nicht

Code:
exten => _*99.,1,DBput(fonestat/${CALLERIDNUM}=${EXTEN:2})

und später

Code:
exten => 70,91,Dial(SIP/${STATUS:1},30,r)

heisen?
 
Du machst einen grundsätzlichen Denkfehler :!:

Der Eintrag eines Umleitungszieles erfolgt durch Wahl der vorangestellten Kombination *99

Beispiel:

Du möchtest als Umleitungsziel die 1234 eintragen, dann mußt Du wählen *991234

Die ersten 3 Stellen dieser Wählfolge werden dann durch ${EXTEN:3} wieder abgeschnitten und in die Datenbank wird korrekt "1234" eingetragen.

Der "Zahlenwert" des Umleitungszieles ist völlig irrelevant, bei meinen Überlegungen bin ich der Einfachheit halber davon ausgegangen, daß Umleitungsziele mindestens 2-stellig Nummern haben.

Um ganz genau zu sein: Das Umleitungsziel muß größer als 8 sein - es würde also auch ein Ziel "9" als solches erkannt. Dieses Gimmick ist den Siemens-Hicom-Anwendern geschuldet, da viele dieser Anlagen so programmiert sind, daß die "Zentrale" über die "9" zu erreichen ist.
 
AHA!

Verstehe dein Konzept. Ich habs jetzt ähnlich bei mir umgesetzt (ich benutze meinerseits ne regex um zu prüfen, ob der status mit 9 anfängt). Problem, dass auch in bezug zu meinem anderen Posting steht: Wenn ich eine Umleitung zu ner Nummer eingerichtet habe, geht das Dial(SIP/11) (nur als beispiel) in die hose, da es in meinem Fall Dial(SIP/telefon1) heisen müsste. Wie machst du das? Haben dein SIP Telefone alle einfach numerische Namen oder gibts ne möglichkeit von Nummer auf Name zu schliesen?
 
jedes normale Telefon an einer normal konfigurierten Telefonanlage - egal ob Hardware oder Software - sollte über eine numerische Anwahl erreichbar sein. Punkt. Ende.
 
Sorry wenns langsam nervt, aber:

Die SIP Telefone werden ja mit Dial(SIP/telefonname) gerufen. Damit ein Telefon über ne Nummer erreichbar ist, mach ich ne extension:
exten => TELEFONNUMMER,1,Dial(SIP/TELEFONNAME)

oder nicht?
 
:bahnhof:

Die Nebenstelle 77 ruft man einfach über exten => 77,1,Dial(SIP/77) - wo ist eigentlich Dein Problem ?
 
das zweite Problem währe ein Kommunikationsproblem ;-), das erste ist, dass ich meine SIP Telefone anders als du konfiguriert habe:

Code:
[telefon1]
fromuser=telefon1
username=telefon1
secret=bla
callerid="telefon1" <11>
type=friend
dtmfmode=rfc2833
host=dynamic
context=intern
canreinvite=no

Ein einfaches Dial(SIP/11) oder so geht da natürlich nicht (habs natürlich trozdem (erfolglos) ausprobiert), denn asterisk kenn den teilnehmer nur als "telefon1", nicht als "11". Ich muss zum Durchstellen Dial(SIP/telefon1) ausführen.

ich vermute daher, du hast deine SIP Telefone so eingerichtet:

Code:
[88]
fromuser=88
username=88
secret=blubb
; callerid="telefon1" <88> ; hm....
type=friend
dtmfmode=rfc2833
host=dynamic
context=intern
canreinvite=no

allerdings musst du dann auf eine namentliche Darstellung des Anrufers auf dem Telefon des Angerufenen verzichten, oder?
 
Nein - muß ich nicht. Denn eine komplette CallerID setzt sich immer aus CallerIDNum und CallerIDName zusammen.

Deshalb ist es durchaus üblich, dem Telefon eine Nummer zu geben, und den Namen entsprechend im Kontext zu definieren. Damit wären ja auch alle Deine Probleme - die eigentlich keine sind - gelöst.

;callerid="Heinz Rindfleisch" <88>
 
DANKE!!!

Wenn ich nicht hetero währe, würd ich dich jetzt abknutschen ;-)
 
Also wenn hier gerade hier das Thema ist:
zunächst danke @betateilchen für das dyn. Script :)

aber ich muss gleich noch ne Frage stellen:
Beim Context default steht bei mir
exten =>s,1,Answer usw
extem =>s,2,Dial(SIP/10&SIP/11....usw) eben jedes Telefon
Geht das auch automatisch, dass man in der sip.conf einen Teilnehmer einträgt, den in der extension.conf ebenfalls hinzufügt und je nach "Zustand" er auch in die "Liste" der verfügbaren Telefone aufgenommen oder auch herausgenommen wird, wenn ein Gespräch reinkommt ?
Alles klar?
Würde ich es programmieren würde es ungefähr so aussehen die Logik:
1. Suche alle Telefone mit dem Staus "2"
2. Rufe alle an die den Status 2 haben, wenn ein Anruf kommt

Ich weiss leider nicht, wie ich es * beibringe.

Danke

Uli
 
Hallo,

super! Jetzt hab ich so langsam auch den Durchblick in Sachen AGI!

Ich benutze ein SNOM 360 SIP Phone.
Bei Eingabe der "*991234" als Rufumleitungsziel kommt immer "NOT FOUND *991234".

Wo liegt mein Problem im Dialplan?

Ich benutze Asterisk 1.0.7-BRIstuffed-0.2.0-RC7k built by kk@nyx on a x86_64 running Linux

Gruß
Tobi
 
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
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.