Wie ANSWEREDTIME erfassen, wenn Anruf vom Callfile erzeugt wurde?

PsychoMantis

Aktives Mitglied
Mitglied seit
18 Dez 2005
Beiträge
2,542
Punkte für Reaktionen
10
Punkte
38
Wenn ich am Ende eines Kontextes so was wie "exten => h,1,NoOp,${ANSWEREDTIME}" schreibe, dann sehe ich immer nach einem Anruf die Dauer des gerade beendeten Gespräches in Sekunden.

Wenn der Anruf jedoch von einem Callfile ausgelöst wurde, dann ist ANSWEREDTIME komischerweise immer "0". Wie kann ich das Problem lösen?

Hier mein Callfile:
Code:
Channel: Local/01747993xxx@default
Callerid: test
Context: callback
Extension: s
MaxRetries: 2
RetryTime: 3
Setvar: CALL=test
WaitTime: 20

Das steht in der Asterisk-CLI:
Code:
    -- Attempting call on Local/01747993xxx@default for s@callback:1 (Retry 1)
    -- Executing [01747993xxx@ausgehend:1] Dial("Local/01747993xxx@default-0b0c,2", "SIP/01747993xxx@provider|90") in new stack
    -- Called 01747993xxx@provider
    -- SIP/provider-0820be38 is making progress passing it to Local/01747993xxx@default-0b0c,2
    -- SIP/provider-0820be38 is ringing
    -- SIP/provider-0820be38 is making progress passing it to Local/01747993xxx@default-0b0c,2
    -- SIP/provider-0820be38 answered Local/01747993xxx@default-0b0c,2
    -- Executing [s@callback:1] DISA("Local/01747993xxx@default-0b0c,1", "no-password|default") in new stack
  == Spawn extension (ausgehend, 01747993xxx, 1) exited non-zero on 'Local/01747993xxx@default-0b0c,2'
    -- Executing [h@ausgehend:1] NoOp("Local/01747993xxx@default-0b0c,2", "0") in new stack
  == Spawn extension (callback, s, 1) exited non-zero on 'SIP/provider-0820be38'
    -- Executing [h@callback:1] NoOp("SIP/provider-0820be38", "") in new stack
[May 15 22:53:36] NOTICE[20993]: pbx_spool.c:351 attempt_thread: Call completed to Local/01747993xxx@default
vs909*CLI>

Es sind hier zwei mal eine h-Extension zu sehen: Die erste ist, wenn ich wenn ich im Handy den Freiton (DISA) höre. Die zweite, wenn ich auflege.

Bisher habe ich nichts dazu finden können, außer wo jemand ein ähnliches (oder das gleiche?) Problem hat.

Ideen?
 
Zuletzt bearbeitet:
Also ich hatte das gleiche problem, und hatte damals keine einfache lösung gefunden dann habe ich das einfach so gemacht

exten => s,1,Answer()
exten => s,n,Set(DB(START/${UNIQUEID})=${EPOCH})


exten => h,1,Set(DB(STOP/${UNIQUEID})=${EPOCH})


Wie du dann die werte berechnest oder verarbeitest liegt ganz an dir.
Ich habe sie in eine php übergeben die mir diese dann zusammen gerechet haben und in ne datenbank geschrieben hat.
Also durch eine Einfache Divison von den beiden EPOCHS bekommt man halt dann im Endefekt die Dauer herraus.
Bei mir sah das ganze dann so aus.

Code:
[neue-files]
exten => s,1,Answer()
exten => s,n,Set(DB(START/${UNIQUEID})=${EPOCH})

exten => h,1,System(php /var/www/html/time.php ${DB(START/${UNIQUEID})} ${EPOCH})
exten => h,n,DBdel(START/${UNIQUEID}) 
exten => h,n,Hangup
Das Problem hier bei ist das auch die zeit wo man noch nicht wirklich verbunden ist die zeit läuft.
Diese Methode benutzte ich selber nur um die zeit zu stopen wenn jemand angerufen wird und dann der anruf an eine Ansage übergeben wird so das erst die zeit gestopt wird wenn er abhebt.

Zum testen kannst du ja dann einfach ein NOoP das so aussieht.

exten => h,1,NoOp( [${EPOCH} - ${DB(START/${UNIQUEID})}] )
Bin mir aber gearde nicht sicher wie man noch mal mathematische aufgaben in einer NoOP löst.

Vielleicht konnte ich dir damit etwas weiter helfen.
Schreib mir mal alles was du in der Extensions drinne hast und in der callfiles hast hier rein oki dann passe ich dir das an.
 
Zuletzt bearbeitet:
Ja, bevor ich gestern (eigentlich heute) eingeschlafen bin, habe ich mir auch genau diese Lösung überlegt.

Das Problem hier bei ist das auch die zeit wo man noch nicht wirklich verbunden ist die zeit läuft.

Darauf bin ich gestern auch gekommen. Aber ich glaube, das ist einfach zu vermeiden: Die Variable ${DIALEDTIME} wird nämlich richtig angegeben. Das ist die Zeit vom Dial bis zum rangehen. Die musst du am Ende einfach abziehen und so bekommst du genau das Ergebnis.

Damit ist dein Problem hier dann wohl auch gelöst. :-)
 
Leider war damit damals mein problem nicht gelöst :)
Aber ich habe es über umwege dann halt anders hinbekommen. ^^
Gut das es bei dir so geht.
 
So funktioniert es.
Vor dem dial mache ich
Code:
exten => _0.,n,Set,GLOBAL(WERT)=${EPOCH}

Sobald DISA erreicht wird, dann wird die h-Extension aufgerufen. Dann greift
Code:
exten => h,1,ExecIf($[${DIALEDPEERNAME:4:6} = provider],Set,GLOBAL(ZEIT)=$[${WERT} + ${DIALEDTIME}].${DIALEDPEERNAME})

Irgendwann wird dann so richtig aufgelegt und die h-Extension wird wieder aufgerufen. Dann greift
Code:
exten => h,n,ExecIf($["${CUT(ZEIT,.,2)}" = "${CHANNEL}"],Set,DB(provider/sekunden)=$[${DB(provider/sekunden)} + $[${EPOCH} - ${CUT(ZEIT,.,1)}]])

Diese Zeile habe ich auch in den Context callback rein getan. Falls einer gleich nach DISA auflegt, wird der Anruf so auch mitgezählt.

Sieht alles komisch aus, funktioniert aber :-)


Nachtrag: Insgesamt ist es aber eine sehr hässliche Lösung. Gibt es echt keine Lösung, dass mir ANSWEREDTIME richtig angezeigt wird?
 
Zuletzt bearbeitet:
Es sind ein paar Jährchen vergangen. Gibt es vielleicht irgendeine gute Lösung? Mittlerweile gibt es ja Asterisk 1.8 - vielleicht wurden da diese Funktionen irgendwo ergänzt?
 
wieso nicht einfach aus der

/var/log/asterisk/cdr-csv/Master.csv

auslesen?

- sparkie
 
Soweit ich weiß ist das gerade das Problem, dass Asterisk bei Call-Files das CDR nicht richtig schreibt, weil ANSWEREDTIME immer 0 ist.
 
Kostenlos!

Statistik des Forums

Themen
248,892
Beiträge
2,304,315
Mitglieder
378,584
Neuestes Mitglied
Spider67