Hi, I have a dial plan where I need to notify an external system when a call was answered and when the call hung up. In both requests the start time needs to be the same. My Dialplan looks something like this: [outbound] Exten => _X.,1,Dial(SIP/${EXTEN}@1.1.1.1,,U(call-answer-from-carrier)) Exten => h,1,NoOp(ANSWERED_TIME: ${ANSWEREDTIME} >>> DIAL_TIME: ${DIALEDTIME} >>> HANGUP_TIME: ${EPOCH} >>> ANSWERED TIME ${MATH(${EPOCH}-${ANSWEREDTIME},int)}) [call-answer-from-carrier] Exten => s,1,Noop(CALL WAS ANSWERED AT ${EPOCH} Exten => s,n,Agi(some_script.py) Now in theory the hangup time of the call (${EPOCH} in the h extension) minus the answered time should be the same as the noop from my subroutine. I am finding that some times they match and some times they are off by a second. My issue is that the external system expects the answered time to the same for when we call it from the SubRoutine as well as from the h extension. I assume the difference is based on the microsecond of when we look at EPOCH how DIALEDTIME is rounded. Any tips on how I can get the same answered time across the board? TIA. Dovid -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.digium.com/pipermail/asterisk-users/attachments/20171226/2739dedc/attachment.html>
Seems like what I needed was the SHARED function which is working perfectly. On Tue, Dec 26, 2017 at 3:28 PM, Dovid Bender <dovid at telecurve.com> wrote:> Hi, > > I have a dial plan where I need to notify an external system when a call > was answered and when the call hung up. In both requests the start time > needs to be the same. My Dialplan looks something like this: > > > [outbound] > Exten => _X.,1,Dial(SIP/${EXTEN}@1.1.1.1,,U(call-answer-from-carrier)) > > Exten => h,1,NoOp(ANSWERED_TIME: ${ANSWEREDTIME} >>> DIAL_TIME: > ${DIALEDTIME} >>> HANGUP_TIME: ${EPOCH} >>> ANSWERED TIME ${MATH(${EPOCH}-${ > ANSWEREDTIME},int)}) > > [call-answer-from-carrier] > Exten => s,1,Noop(CALL WAS ANSWERED AT ${EPOCH} > Exten => s,n,Agi(some_script.py) > > Now in theory the hangup time of the call (${EPOCH} in the h extension) > minus the answered time should be the same as the noop from my subroutine. > I am finding that some times they match and some times they are off by a > second. My issue is that the external system expects the answered time to > the same for when we call it from the SubRoutine as well as from the h > extension. I assume the difference is based on the microsecond of when we > look at EPOCH how DIALEDTIME is rounded. > > Any tips on how I can get the same answered time across the board? > > TIA. > > Dovid > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.digium.com/pipermail/asterisk-users/attachments/20171226/b1e10c93/attachment.html>
Don't use an 'h' extension, use a hangup handler. Use the MASTER_CHANNEL() function to set variables to ensure they are always set in the "top most" channel.? Below is an untested example, but is inspired by dialplan code I use in production.? Maybe it will help. [outbound] ; this is called on the incoming (caller) channel exten => _X.,1,Noop ?same => n,Set(MASTER_CHANNEL(start_timestamp)=${STRFTIME(,,%s.%3q)}) ?same => n,Set(CHANNEL(hangup_handler_push)=hangup_handler,s,1) ?same => n,Set(MASTER_CHANNEL(callid_ingress)=${SIPCALLID}) same => n, *** unrelated dialplan, AGIs, etc. *** ?same => n,Dial(SIP/${EXTEN}@1.1.1.1 <mailto:EXTEN%7D at 1.1.1.1>,,U(answer_handler)b(pre_dial_handler^s^1)g ?same => n, *** dialplan for the caller when the callee hangs up first, not run when caller hangs up first.? use it to try dialing another destination, play intercept to caller, etc. *** [pre_dial_handler] ; this is called on the outgoing (callee) channel exten => s,1,Noop ?same => n,Set(MASTER_CHANNEL(callid_egress)=${SIPCALLID}) ?same => n,Set(MASTER_CHANNEL(dial_timestamp)=${STRFTIME(,,%s.%3q)}) ?same => n,Return [answer_handler] ; run on outgoing (callee) channel, but sets answer_timestamp in the caller channel exten => s,1,Noop ?same => n,Set(MASTER_CHANNEL(answer_timestamp)=${STRFTIME(,,%s.%3q)}) ?same => n,Return [hangup_handler]? ; run on incoming (caller) channel, use to do final post call cleanup exten => s,1,Noop same => n,Set(MASTER_CHANNEL(hangup_timestamp)=${STRFTIME(,,%s.%3q)}) ? same => n, ***post call cleanup AGIs, dialplan, etc.*** same => n,Return On 12/26/2017 03:28 PM, Dovid Bender wrote:> Hi, > > I have a dial plan where I need to notify an external system when a > call was answered and when the call hung up. In both requests the > start time needs to be the same. My Dialplan looks something like this: > > > [outbound] > Exten => _X.,1,Dial(SIP/${EXTEN}@1.1.1.1 > <mailto:EXTEN%7D at 1.1.1.1>,,U(call-answer-from-carrier)) > > Exten => h,1,NoOp(ANSWERED_TIME: ${ANSWEREDTIME} >>> DIAL_TIME: > ${DIALEDTIME} >>> HANGUP_TIME: ${EPOCH} >>> ANSWERED TIME > ${MATH(${EPOCH}-${ANSWEREDTIME},int)}) > > [call-answer-from-carrier] > Exten => s,1,Noop(CALL WAS ANSWERED AT ${EPOCH} > Exten => s,n,Agi(some_script.py) > > Now in theory the hangup time of the call (${EPOCH} in the h > extension) minus the answered time should be the same as the noop from > my subroutine. I am finding that some times they match and some times > they are off by a second. My issue is that the external system expects > the answered time to the same for when we call it from the SubRoutine > as well as from the h extension. I assume the difference is based on > the microsecond of when we look at EPOCH how DIALEDTIME is rounded. > > Any tips on how I can get the same answered time across the board? > > TIA. > > Dovid > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.digium.com/pipermail/asterisk-users/attachments/20171226/fb5be9a2/attachment.html>
On Tue, 26 Dec 2017, Eric Wieling wrote:> Don't use an 'h' extension, use a hangup handler.??Why? -- Thanks in advance, ------------------------------------------------------------------------- Steve Edwards sedwards at sedwards.com Voice: +1-760-468-3867 PST https://www.linkedin.com/in/steve-edwards-4244281
It seems that what ever I set in my answer handler does not show up in the hangup handler. In order to do billing I can't rely on the g option where the caller hangs up the call. Looks like I can either use h or a hangup handler along with the shared function. On Tue, Dec 26, 2017 at 4:40 PM, Eric Wieling <ewieling at nyigc.com> wrote:> Don't use an 'h' extension, use a hangup handler. > Use the MASTER_CHANNEL() function to set variables to ensure they are > always set in the "top most" channel. Below is an untested example, but is > inspired by dialplan code I use in production. Maybe it will help. > > [outbound] ; this is called on the incoming (caller) channel > exten => _X.,1,Noop > same => n,Set(MASTER_CHANNEL(start_timestamp)=${STRFTIME(,,%s.%3q)}) > same => n,Set(CHANNEL(hangup_handler_push)=hangup_handler,s,1) > same => n,Set(MASTER_CHANNEL(callid_ingress)=${SIPCALLID}) > same => n, *** unrelated dialplan, AGIs, etc. *** > same => n,Dial(SIP/${EXTEN}@1.1.1.1,,U(answer_handler)b(pre_dial_ > handler^s^1)g > same => n, *** dialplan for the caller when the callee hangs up first, > not run when caller hangs up first. use it to try dialing another > destination, play intercept to caller, etc. *** > > > [pre_dial_handler] ; this is called on the outgoing (callee) channel > exten => s,1,Noop > same => n,Set(MASTER_CHANNEL(callid_egress)=${SIPCALLID}) > same => n,Set(MASTER_CHANNEL(dial_timestamp)=${STRFTIME(,,%s.%3q)}) > same => n,Return > > > [answer_handler] ; run on outgoing (callee) channel, but sets > answer_timestamp in the caller channel > exten => s,1,Noop > same => n,Set(MASTER_CHANNEL(answer_timestamp)=${STRFTIME(,,%s.%3q)}) > same => n,Return > > > [hangup_handler] ; run on incoming (caller) channel, use to do final post > call cleanup > exten => s,1,Noop > same => n,Set(MASTER_CHANNEL(hangup_timestamp)=${STRFTIME(,,%s.%3q)}) > same => n, ***post call cleanup AGIs, dialplan, etc. *** > same => n,Return > > > > On 12/26/2017 03:28 PM, Dovid Bender wrote: > > Hi, > > I have a dial plan where I need to notify an external system when a call > was answered and when the call hung up. In both requests the start time > needs to be the same. My Dialplan looks something like this: > > > [outbound] > Exten => _X.,1,Dial(SIP/${EXTEN}@1.1.1.1,,U(call-answer-from-carrier)) > > Exten => h,1,NoOp(ANSWERED_TIME: ${ANSWEREDTIME} >>> DIAL_TIME: > ${DIALEDTIME} >>> HANGUP_TIME: ${EPOCH} >>> ANSWERED TIME ${MATH(${EPOCH}-${ > ANSWEREDTIME},int)}) > > [call-answer-from-carrier] > Exten => s,1,Noop(CALL WAS ANSWERED AT ${EPOCH} > Exten => s,n,Agi(some_script.py) > > Now in theory the hangup time of the call (${EPOCH} in the h extension) > minus the answered time should be the same as the noop from my subroutine. > I am finding that some times they match and some times they are off by a > second. My issue is that the external system expects the answered time to > the same for when we call it from the SubRoutine as well as from the h > extension. I assume the difference is based on the microsecond of when we > look at EPOCH how DIALEDTIME is rounded. > > Any tips on how I can get the same answered time across the board? > > TIA. > > Dovid > > > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.digium.com/pipermail/asterisk-users/attachments/20171227/2be03a08/attachment.html>