hunt-dial macro

This macro helps to define an outbound hunting group for the outbound dialing. In the situation where you have multiple PSTN lines registered as multiple SIP channels (e.g. SIP/line1, SIP/line2, SIP/line3, etc...), on the same or multiple gateways, and you wants to arrange them into an ordered hunting group for outbound calling. You can use the following hunt-dial macro.

This solution is brought to you by Makecall4U Telecom, your Asterisk solution provider in Hong Kong. If you have any enquiry or suggestions, please feel free to contact us at

include => pstn-out

; ${ARG1} channel
; ${ARG2} Dialed Number

exten => s,1,SetGroup(${ARG1}) ; increment GROUPCOUNT
exten => s,2,GetGroupCount()
exten => s,4,GotoIf($~np~["${GROUPCOUNT}"~/np~ = "1"]?5:6) ; if GROUPCOUNT = 1, then it's free for dialing.
exten => s,5,Dial(SIP/${ARG2}@${ARG1}) ; use it to call out.
exten => s,6,NoOp(${ARG1} is inused)

exten => _XXXXXXXX,1,Macro(hunt-dial,line1,${EXTEN}) ; list your SIP channels here in the hunting order
exten => _XXXXXXXX,n,Macro(hunt-dial,line2,${EXTEN})
exten => _XXXXXXXX,n,Macro(hunt-dial,line3,${EXTEN})
exten => _XXXXXXXX,n,Macro(hunt-dial,line4,${EXTEN})
exten => _XXXXXXXX,n,NoOp("No Channel available")
exten => _XXXXXXXX,n,Hangup()

Hunt Dialout Macro using AstDB

The above macro has been helpful in giving me the basic idea to create this macro.
The alternative macro below may be of use to you if you want to use AstDB to store your dialout SIP device information, which you may edit or add dynamically without modifying your extensions.conf

This macro is brought to you by, an Asterisk Contact Center and Linux BPO Service provider in Singapore. Feel free to contact us thru our website.

Store your SIP Device Info on AstDB:
Family : Key : Value
ossteq_dialout : 1 : SIP/1001
ossteq_dialout : 2 : SIP/1003
ossteq_dialout : n : SIP/XXXX

exten => s,1,Set(DBKEY=0)
exten => s,n(increment),Set(DBKEY=$~np~[${DBKEY} + 1]~/np~)
exten => s,n,Set(OUTBOUNDTRUNK=${DB(ossteq_dialout/${DBKEY})})		; retrieve value from AstDB
exten => s,n,GotoIf($~np~[${ISNULL(${OUTBOUNDTRUNK})}]~/np~?giveup:)		; no more available channels - give up!
exten => s,n,Dial(${OUTBOUNDTRUNK}/${ARG1})
exten => s,n,GotoIf($~np~["${DIALSTATUS}" = "CHANUNAVAIL"]~/np~?increment:)	; next 4 lines are channel error trap
exten => s,n,GotoIf($~np~["${DIALSTATUS}" = "BUSY"]~/np~?increment:)		; then iterate to next available 

exten => s,n,GotoIf($~np~["${DIALSTATUS}" = "CONGESTION"]~/np~?increment:)
exten => s,n,GotoIf($~np~["${DIALSTATUS}" = "NOANSWER"]~/np~?increment:)
exten => s,n(giveup),Playback(am-fem/sorry)
exten => s,n,Playback(am-fem/all-circuits-busy-now)
exten => s,n,Playback(am-fem/pls-try-call-later)
exten => s,n,Congestion( )

ignorepat => 9
exten => 911,1,Macro(huntdialout,911)			; Examples on how to call the macro
exten => _9NXXXXXXX,1,Macro(huntdialout,${EXTEN:1})	

Created by: yautinho, Last modification: Thu 04 of Nov, 2010 (06:51 UTC) by admin
Please update this page with new information, just login and click on the "Edit" or "Discussion" tab. Get a free login here: Register Thanks! - Find us on Google+