Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

To apply user defined custom dialplan to an inbound call before it reaches your FreePBX Inbound routes, create a context similar to this:

Code Block
[from-trunk-preprocess]                                                                             ; context name is arbitrary
; Characters that follow a ; are ignored, use for commenting
exten => _.,1,Noop(Entering user defined context from-trunk-preprocess in extensions_custom.conf)   ; log some breadcrumbs to assist debugging later
exten => _.,n,Verbose(0,Caller ID: ${CALLERID(name)})                                               ; doesn't do much, just logs the Caller ID name
 
;  add whatever other lines you need
 
exten => _.,n,Goto(from-trunk,${EXTEN},1)                                                           ; context must end with at goto the from-trunk context
 
; end of from-trunk-preprocess

With the context created in /etc/asterisk/extensions_custom.conf, you now edit your FreePBX trunk(s) in the GUI and change the context to the name you used above, in this case 'from-trunk-preprocess`. Submit and apply config, and all inbound calls on those trunks will first use the preprocess context before going to the Inbound Routes.

...

If you want to direct a call thru the system to a specific destination with custom dialplan, you do it by creating a Custom Destination. In this example, we are using two APIs, the http://icanhazdadjoke.com to get the text of a joke, and the Voip Innovations apidaze API to send the content of that joke out via SMS. Example dialplan for /etc/asterisk/extensions_custom.conf:

Code Block
[randomjoke-sms-apidaze]
exten => s,1,Noop(Entering user defined context randomjoke-sms-apidaze in extensions_custom.conf)
 
exten => s,n,Set(apidaze_key=xxxxxxxxx)               ; get from APIDAZE Dev App
exten => s,n,Set(apidaze_secret=xxxxxxxxxxxxxxx)      ; get from APIDAZE Dev App
 
exten => s,n,Set(from_DID=xxxxxxxxx)                  ; DID associated with APIDAZE App
exten => s,n,Set(destination=${CALLERID(number)})
 
; set headers and curl for corny joke
exten => s,n,set(CURLOPT(httpheader)=Accept:text/plain)
exten => s,n,set(CURLOPT(httpheader)=User-Agent:Asterisk-FreePBX-joke2SMS)
exten => s,n,set(joke=${URIENCODE(${CURL(https://icanhazdadjoke.com)})})         ; make API call and encode it. Content returned with a <CR> is a problem
exten => s,n,set(joke=${URIDECODE(${STRREPLACE(joke,%0A,%20)})})                 ; filter out <CR> by replacing with a space character
 
; send the joke to the caller's CallerID number via SMS using Voip Innovations api-daze API
exten => s,n,set(result=${CURL(https://api.apidaze.io/${apidaze_key}/sms/send?api_secret=${apidaze_secret},from=${from_DID}&to=${destination}&body=${joke})})
 
exten => s,n,Return                                   ; end the custom destination context with a return application

With the above in place, create a Custom Destination with a GoSub string of:

Code Block
randomjoke-sms-apidaze,s,1

And enable the Return option. Choose the destination for the call and submit. 

...

To create a dial prefix, use code similar to the following. If you want to dial an extension with a specific delay, you can do it with this code in /etc/asterisk/extensions_custom.conf

Code Block
[from-internal-custom]
exten => _**XXX*XXXX,1,Noop(Entering user defined context from-internal-custom in extensions_custom.conf)
exten => _**XXX*XXXX,n,Noop(ext: ${EXTEN:-4} delay: ${EXTEN:2:3})
exten => _**XXX*XXXX,n,Wait(${EXTEN:2:3})
exten => _**XXX*XXXX,n,goto(from-internal,${EXTEN:-4},1)

Once the dialplan has been reloaded (apply config), dialing "**015*1004" will allow the system to dial extension 1004 with a 15 second delay before dialing.

...

If you want to perform an action on all outbound calls, you can use a dialplan hook macro similar to this:

Code Block
[macro-dialout-trunk-predial-hook]
exten => s,1,Noop(Entering user defined context macro-dialout-trunk-predial-hook in extensions_custom.conf)
exten => s,n,GosubIf($["${EMERGENCYROUTE}"="YES"]?ifttt2twitter,s,1)
exten => s,n,MacroExit
 
 
[ifttt2twitter]
; create an ifttt.com webhook to accept one data field and get the webhook name and key
exten => s,1,Noop(Entering user defined context ifttt2twitter in extensions_custom.conf)
exten => s,n,Set(ifttt_app=xxxxxxxxx)               ; get from ifttt.com webhook name
exten => s,n,Set(ifttt_key=xxxxxxxxxxxxxxx)         ; get from ifttt.com webhook key
exten => s,n,Set(result=${CURL(https://maker.ifttt.com/trigger/${ifttt_app}/with/key/${ifttt_key}?value1=${AMPUSER})})
exten => s,n,Return