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

[geloest] Asterisk QUEUESTATUS "Timeout" leider auch bei "busy-Event"

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von Harald J., 12 Feb. 2009.

  1. Harald J.

    Harald J. Neuer User

    Registriert seit:
    24 Nov. 2008
    Beiträge:
    9
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #1 Harald J., 12 Feb. 2009
    Zuletzt bearbeitet: 19 Feb. 2009
    Hoffentlich ist es nur eine einfache Angelegenheit...

    Ich schicke die Anrufer in eine Queue (Realtime), diese ruft dann ueber ein Interface eine Nummer an (SIP/493011111).
    Code:
    exten => known_ins,n,Queue(${PHONENUMBER}_${REGSTATUS}_${INSSTATUS},n)
    Wenn diese Telefon nun besetzt ist wird der Anrufer aus der Queue gekickt, aehnlich wie nach einem Timeout.

    Dumm nur, dass ich, nachdem der Anrufer aus der Queue entlassen wird weil das Zieltelefon besetzt war, den gleichen Queue-Status (Timeout) bekomme. Somit kann ich nicht unterscheiden ob besetzt war oder einfach niemand ans Telefon gegangen ist was fuer meine Zwecke sehr wichtig ist.

    Gibt es eine Moeglichkeit diesen Unterschied auszumachen? Und wenn ja wie?

    Was ich eigentlich erreichen will ist, einen Anrufer in die Queue schicken, diese anrufen lassen, wenn besetzt ist den Anruf nach Zeit X nochmal wiederholen, wenn immer noch besetzt dann dem Anrufer eine Playback-Sound anbieten. Kann ja soo schwer nicht sein nur macht mich das gerade fertig.

    Vielen Dank im vorraus.
    Harald
     
  2. doxon

    doxon Mitglied

    Registriert seit:
    11 Juni 2006
    Beiträge:
    781
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    IT-Systemelektroniker
    Ort:
    Aurich
    Normalerweise sollte der Anrufer auch in der Queue bleiben wenn der Agent am Telefonieren ist.
    Das ist ja der Sinn einer Queue.

    Vielleicht stimmt irgendwas mit deiner queues.conf nicht...
     
  3. Harald J.

    Harald J. Neuer User

    Registriert seit:
    24 Nov. 2008
    Beiträge:
    9
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Tja, ich sitze leider immer noch vor dem Problem. Ich beschreibe es mal genauer.

    Ich benutze Realtime-Queues mit den Spalten
    -name
    -interface (Angabe der Telefonnummer {z.B. SIP/4912345})
    -queue-name
    -timeoutrestart (standardmaessig auf null)
    -timeout

    queues.conf (hat die ueberhaupt einen Effekt wenn ich Realtime nutze?)
    Code:
    [general]
    persistentmembers = yes
    musiconhold=default
    keepstats = no
    autofill = yes
    monitor-type = MixMonitor
    shared_lastcall=no
    joinempty = yes
    
    Im Dialplan rufe ich die Queues folgendermassen auf:
    Code:
    exten => known_ins,n,Queue(${PHONENUMBER}_${REGSTATUS}_${INSSTATUS},n)
    exten => known_ins,n,NoOp(${QUEUESTATUS})
    exten => known_ins,n,Goto(q-${QUEUESTATUS},1)
    exten => q-TIMEOUT,1,Playback(Achtung_keineSprechzeit)
    ...
    
    Meine Queues werfen den Anrufer immer direkt nachdem festgestellt wurde, dass die Zielrufnummer belegt ist, aus der Leitung zurueck in den Dialplan. Hier kann ich aber keinen Unterschied machen ob nun die Leitung belegt war oder einfach nur der Timeout zugeschlagen hat.
     
  4. Harald J.

    Harald J. Neuer User

    Registriert seit:
    24 Nov. 2008
    Beiträge:
    9
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    So, jetzt habe ich das Problem teilweise geloest. Doch wie das immer so ist ergeben sich dann neue Aufgaben.

    Ich starte meine Queue jetzt so: (ohne irgendwelche Optionen)
    Code:
    exten => Q,n,Queue(${PHONENUMBER}_${REGSTATUS}_${INSSTATUS})
    
    Ist die Leitung besetzt so soll nach ein paar Sekunden nochmal probiert werden.
    Meine queues.conf dazu:
    Code:
    [general]
    keepstats = no
    autofill = yes
    monitor-type = MixMonitor
    timeout = 20
    retry = 5
    
    Doch jetzt bleibt der Anrufer stur in der Queue. Das Timeout greift leider garnicht, es wird immer wieder versucht anzurufen. Ich kann mir nicht erklaeren warum das Timeout nicht funktioniert. Das retry sollte doch nur solange funktionieren bis Timeout zuschlaegt.
    Liege ich da etwa falsch? Was muss ich denn tun um die Q nach einer bestimmten Zeit zu beenden?

    Danke, Harald.
     
  5. Harald J.

    Harald J. Neuer User

    Registriert seit:
    24 Nov. 2008
    Beiträge:
    9
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    selbst ist der Mann...

    ist mein Problem so trivial oder hat einfach keiner Lust zu antworten?
    Wie dem auch sei.. ich habe mir einen workaround geschrieben da mein Timeout merkwuerdigerweise nicht funktioniert.

    Die Funktion ist folgende:
    Bevor die Q startet speichere ich den Zeitpunkt, addiere einen Zeitraum hinzu. Fliegt der Anrufer sofort wieder aus der Q weil Telefon besetzt (Q gestartet mit Option 'n' um Timeout-reset zu vermeiden) ist, wird dann wiederrum die Zeit gespeichert. Zusaetzlich wird noch gezaehlt wie oft der Anrufer bereits in der Q war. War er bereits 2mal drin fliegt er raus. War er erst einmal drin werden die Zeitpunkte verglichen und entsprechend entschieden, wie es weitergehen soll. Entweder man geht nochmal in die Q nachdem man sich ein bischen Musik angehoert hat, oder man wird aus dem Programm verabschiedet.
    Code:
    [startQ]
    exten => Q,1,Set(QUEUESTARTTIME=${STRFTIME(${EPOCH},,%H%M%S)})
    exten => Q,2,Set(QUEUESTARTTIME=$[${QUEUESTARTTIME}+21])
    exten => Q,3,Set(Q_COUNT=0)
    exten => Q,4,Set(Q_COUNT=$[${Q_COUNT}+1])
    
            ; start Q
    exten => Q,n,Queue(${PHONENUMBER}_${REGSTATUS}_${INSSTATUS},n)
    
            ; end Q
    exten => Q,n,Set(QUEUEENDTIME=${STRFTIME(${EPOCH},,%H%M%S)})        
    exten => Q,n,Set(QUEUEENDTIME=$[${QUEUEENDTIME}+1])       
            ; check how offen the callee has been in the Q
    exten => Q,n,GotoIf($["${Q_COUNT}"<"2"]?decide:is_busy)                  
    exten => Q,n(decide),GotoIf($["${QUEUEENDTIME}"<"${QUEUESTARTTIME}"]?wait_a_bit:is_timeout)        
    exten => Q,n(is_busy),Playback(...)        
    exten => Q,n(is_busy),Hangup()        
    exten => Q,n(is_timeout),Playback(...)        
    exten => Q,n(is_timeout),Hangup()        
    exten => Q,n(wait_a_bit),Playback(...)       
    exten => Q,n(wait_a_bit),Goto(Q,4)
    
     
  6. Thomas007

    Thomas007 Aktives Mitglied

    Registriert seit:
    18 Sep. 2005
    Beiträge:
    1,455
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Die Verweildauer des Anrufers wird mit dem Queue Kommando definiert, timout in der queues.conf hat eine andere Bedeutung

    Queue(queuename[|options[|URL][|announceoverride][|timeout][|AGI]):
     
  7. doxon

    doxon Mitglied

    Registriert seit:
    11 Juni 2006
    Beiträge:
    781
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    IT-Systemelektroniker
    Ort:
    Aurich
    Ich konnte dir bei deinem Problem nicht weiter helfen, darum habe ich auch nichts weiter geschrieben. Was nützt es einem wenn jeder schreibst das er einem nicht weiter Helfen kann...

    Trotzdem danke für deinen Workaround. So kann es anderen Usern auch helfen. :)