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

Harald J.

Neuer User
Mitglied seit
24 Nov 2008
Beiträge
9
Punkte für Reaktionen
0
Punkte
0
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
 
Zuletzt bearbeitet:
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...
 
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.
 
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.
 
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)
 
Liege ich da etwa falsch? Was muss ich denn tun um die Q nach einer bestimmten Zeit zu beenden?

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]):
 
ist mein Problem so trivial oder hat einfach keiner Lust zu antworten?

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. :)
 

Neueste Beiträge

Statistik des Forums

Themen
244,695
Beiträge
2,216,684
Mitglieder
371,314
Neuestes Mitglied
Gjorstn
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.