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

Macro "Bei Leitungsbelegung anderer Provider + Ortsvorwahl Erkennung"

Dieses Thema im Forum "Asterisk Rufnummernplan" wurde erstellt von konabi, 21 Sep. 2006.

  1. konabi

    konabi Mitglied

    Registriert seit:
    11 Apr. 2005
    Beiträge:
    424
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo,
    früher hatte ichnen SIP Provider, welcher mir pro Account 3 Leitungen zum telefonieren zur Verfügung stellt. (Bussiness Account) Nun habe den Tarif gewechselt und nor noch 2 Leitungen mit separaten Anmeldungen und somot auch zweit Kontexten in der sip.conf

    Also mußte eine Lösung her welche erst den ersten SIP Account verwendet und bei Besetzt den zweiten Account nimmt.

    Außerdem unsere Mitarbeiter bemängelt auch für Ortsgespräche immer die Vorwahl mit zu wählen.

    Aus diesem Grund sind diese Macros entstanden welche natürlich auch mit mehr als zwei Accounts/Providern verwendet werden können.

    Vieleicht findet auch jemand anders Nutzen daran oder hat Verbesserungsvorschläge.


    Code:
    [globals]
    ORTSVORWAHL=03445
    ; Anzahl der maximalen ausgehenden Leitungen
    ; ergibt sich aus der Summe der Leitungen der einzelnen Providern
    OUTMAXCHANNELS=2
    
    ; der Kontext in der sip.conf des ersten Providers
    OUT_KONTEXT_1=t-online-out
    ; die CallerID des ersten Providers
    OUT_MYCALLERID_1=xxxxxxx
    ; der Provider stellt eine Leitung zur Verfügung
    OUT_MAX_1=1
    
    
    OUT_KONTEXT_2=strato-out
    OUT_MYCALLERID_2=xxxxxxx
    OUT_MAX_1=1
    
    
    
    [general]
    static=yes
    writeprotect=no
    
    
    
    ;### BEGIN MACRO #############################################
    
    [macro-setvar-dialout]
    ; Startzaehler für Versuche
    exten => s,1,Set(TRY=1)   
    ; die Rufnummer die dem Macro  ubergeben wurde                        
    exten => s,n,Set(RUFNUMMER=${ARG1})
    ; der Kontext aus den globalen Variablen (beim ersten mal OUT_KONTEXT_1)                 
    exten => s,n,Set(KONTEXT=${OUT_KONTEXT_${TRY}}) 
    ; die CallerID aus den globalen Variablen   
    exten => s,n,Set(CALLERID(name)=${OUT_MYCALLERID_${TRY}})
    ; weiter gehts mit dem Macro check-max-channels
    exten => s,n,Macro(check-max-channels)
    
    
    [macro-check-max-channels]
    ; pro Provider wird eine Gruppe angelegt
    exten => s,1,Set(GROUP()= OUT_${TRY})
    ; mit diesen 5 Zeilen kann ich die Werte meiner Variablen auf der CLI sehen
    ; sie dienen nur zum Debuggen
    exten => s,n,NoOp(Anzahl Channels: ${GROUP_COUNT()})
    exten => s,n,NoOp(Maximale Channels: ${OUTMAXCHANNELS})
    exten => s,n,NoOp(Gruppenliste: ${GROUP_LIST()})
    exten => s,n,NoOp(Kontext: ${KONTEXT})
    exten => s,n,NoOp(Versuch: ${TRY})
    
    ; als erstes wir geprueft ob die Anzahl der gesamten maximalen ausgehenden Leitungen ueberschritten ist
    exten => s,n,GotoIf($[${TRY} > ${OUTMAXCHANNELS} ]?allchanfull)
    
    ; Uberpruefung ob die maximale Anzahl von Leitungen eines Providers ueberschritten ist
    exten => s,n,GotoIf($[ ${GROUP_COUNT()} > ${OUT_MAX_${TRY}} ]?chanfull:chanfree)
    
    ; wenn die max Leitungszahl eines Providers ueberschritten ist wird der Zaeheler
    ; $TRY um eins erhoeht und in die zweite Prioritaet des Macros setvar-dialout gesprungen
    ; doert wird dann ein anderer Provider verwendet
    exten => s,n(chanfull),Set(TRY=$[${TRY} + 1]) 
    exten => s,n,NoOp(VERSUCH: ${TRY})
    exten => s,n,Goto(macro-setvar-dialout,s,2)
    
    ; wenn eine Leitung frei ist, geht es weiter mit Macro dialout
    exten=> s,n(chanfree),MACRO(dialout)
    
    ; wenn alle ausgehenden Leitungen belegt sind wird das dem Anrufenden
    ; mitgeteilt und aufgelegt
    exten => s,n(allchanfull),Playback(all-circuits-busy-now)
    exten => s,n,BUSY()
    exten => s,n,HANGUP
    
    
    
    [macro-dialout]
    ; wenn der Anrufer eine Nummer ohne führende Null waehlt handelt es sich um
    ; ein Ortsgesprach 
    exten => s,1,GotoIf($["${RUFNUMMER:0:1}" = "0"]?fern:ort)
    
    ; bei einem Ortsgespraech wird die Ortsvorwahl (festgelegte globale Variable)
    ; und die Rufnummer gewaehlt
    exten => s,n(ort),Dial(SIP/${ORTSVORWAHL}${RUFNUMMER}@${KONTEXT},60,tT)
    
    ; bei einem Ferngespraech wir die Rufnummer gewaehlt
    exten => s,n(fern),Dial(SIP/${RUFNUMMER}@${KONTEXT},60,tT)
    
    ; weiter gehts mit der Uberpruefung des Dialstatus
    exten => s,n,Goto(s-${DIALSTATUS},1)
    
    exten => s-NOANSWER,1,Playback(vm-theperson)
    exten => s-NOANSWER,n,SayDigits(${RUFNUMMER})
    exten => s-NOANSWER,n,Playback(vm-isunavail)
    exten => s-NOANSWER,n,Hangup
    
    exten => s-BUSY,1,Playback(vm-theperson)
    exten => s-BUSY,n,SayDigits(${RUFNUMMER})
    exten => s-BUSY,n,Playback(vm-isonphone)
    exten => s-BUSY,n,Hangup
    
    
    
    
    ;### ENDE MACRO #############################################
    
    
    [sip-out]
    ; hier wird dann das Macro aufgerufen
    exten => _XX,n,Dial(mISDN/g:ISDN-NT/${EXTEN})
    
    
    
    Viel Spaß
    Sven
     
  2. Thomas007

    Thomas007 Aktives Mitglied

    Registriert seit:
    18 Sep. 2005
    Beiträge:
    1,455
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
  3. konabi

    konabi Mitglied

    Registriert seit:
    11 Apr. 2005
    Beiträge:
    424
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    kann ich so nicht bestätigen.
    Das Script läuft so bei mir.

    Viele Grüße
    Sven
     
  4. Thomas007

    Thomas007 Aktives Mitglied

    Registriert seit:
    18 Sep. 2005
    Beiträge:
    1,455
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Du meinst Dein Asterisk
    gibt bei:
    TRY=3 und OUTMAXCHANNELS=20
    exten => s,n,GotoIf($[${TRY} > ${OUTMAXCHANNELS} ]?allchanfull)

    ein FALSE zurück?

    Dann hast Du ein anderes Asterisk als ich.