.titleBar { margin-bottom: 5px!important; }

Dialplan dynamisch verändern

Dieses Thema im Forum "Asterisk Rufnummernplan" wurde erstellt von schwerdy, 5 Nov. 2004.

  1. schwerdy

    schwerdy Neuer User

    Registriert seit:
    5 Nov. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    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...
     
  2. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
  3. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    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.
     
  4. Tucca

    Tucca Neuer User

    Registriert seit:
    14 Juli 2004
    Beiträge:
    174
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  5. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    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.
     
  6. Ulimuc

    Ulimuc Neuer User

    Registriert seit:
    30 Okt. 2004
    Beiträge:
    31
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  7. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    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 :?:
     
  8. schwerdy

    schwerdy Neuer User

    Registriert seit:
    5 Nov. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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?
     
  9. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    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:
     
  10. schwerdy

    schwerdy Neuer User

    Registriert seit:
    5 Nov. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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?
     
  11. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    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.
     
  12. schwerdy

    schwerdy Neuer User

    Registriert seit:
    5 Nov. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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?
     
  13. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    jedes normale Telefon an einer normal konfigurierten Telefonanlage - egal ob Hardware oder Software - sollte über eine numerische Anwahl erreichbar sein. Punkt. Ende.
     
  14. schwerdy

    schwerdy Neuer User

    Registriert seit:
    5 Nov. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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?
     
  15. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    :bahnhof:

    Die Nebenstelle 77 ruft man einfach über exten => 77,1,Dial(SIP/77) - wo ist eigentlich Dein Problem ?
     
  16. schwerdy

    schwerdy Neuer User

    Registriert seit:
    5 Nov. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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?
     
  17. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    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>
     
  18. schwerdy

    schwerdy Neuer User

    Registriert seit:
    5 Nov. 2004
    Beiträge:
    28
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    DANKE!!!

    Wenn ich nicht hetero währe, würd ich dich jetzt abknutschen ;-)
     
  19. Ulimuc

    Ulimuc Neuer User

    Registriert seit:
    30 Okt. 2004
    Beiträge:
    31
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  20. tkrause_de

    tkrause_de Neuer User

    Registriert seit:
    16 Juni 2005
    Beiträge:
    55
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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