Cara membatasi waktu panggilan

Mas mau tanya,cara membatasi waktu panggilan masuk di elastix gimana yah ?

Edit manual dialplan saja, caranya adalah menambahkan fungsi TIMEOUT pada context trunk yang digunakan untuk incoming.

Contoh untuk set 60 detik, apabila trunk yang digunakan adalah from-zaptel, atau from-dahdi yang biasanya untuk line Analog atau E1 , tambahkan pada context tersebut, setelah priority 1 : s,n,Set(TIMEOUT(absolute)=60)

Sesuaikan dengan context dialplan elastix, saya kurang hapal isi dan lokasinya dimana saja.

Oke, itu kan set limit waktu telpon nya.
dan di set di trunk.
kalo limit jumlah telpon si penelpon nya mas @asoka ?
dan jika menggunakan line telkom juga gimana mas ?

saya menggunakan elastix 4.

Maksudnya ada counter nya ? Jadi apabila yang lewat atau menggunakan trunk itu sudah 10 misalnya, lalu di tutup, atau bagaimana maksudnya ? Saya perlu detail penjelasan akan hal yang mau dicapai.

iya mas @asoka, jadi kalo si user nelpon udah lebih dari 10. dia udh gak bisa nelpon lagi di hari itu.
ulang lagi besok kalo mau nelpon.

bisa gak ya gitu mas ?

Setahu saya belum ada parameter konfigurasi di SIP atau DAHDI nya, jadi harus bikin dialplan sendiri buat membatasinya, nanti kalo ada waktu saya cobain dan update disini dialplannya yah :grin:

Untuk membatasi jumlah call out di TRUNK atau di USER caranya seperti berikut :

  • Edit file /etc/asterisk/extensions_override_freepbx.conf , tambahkan dialplan berikut :
[macro-dialout-trunk]
include => macro-dialout-trunk-custom
exten => s,1,Set(DIAL_TRUNK=${ARG1})
exten => s,n,GosubIf($[$["${ARG3}" != ""] & $["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]]?sub-pincheck,s,1())
exten => s,n,GotoIf($["x${OUTDISABLE_${DIAL_TRUNK}}" = "xon"]?disabletrunk,1)
exten => s,n,Set(DIAL_NUMBER=${ARG2})
exten => s,n,Set(DIAL_TRUNK_OPTIONS=${DIAL_OPTIONS})
exten => s,n,Set(OUTBOUND_GROUP=OUT_${DIAL_TRUNK})
exten => s,n,GotoIf($["${OUTMAXCHANS_${DIAL_TRUNK}}foo" = "foo"]?nomax)
exten => s,n,GotoIf($[ ${GROUP_COUNT(OUT_${DIAL_TRUNK})} >= ${OUTMAXCHANS_${DIAL_TRUNK}} ]?chanfull)
exten => s,n(nomax),GotoIf($["${INTRACOMPANYROUTE}" = "YES"]?skipoutcid)
exten => s,n,Set(DIAL_TRUNK_OPTIONS=${IF($["${DB_EXISTS(TRUNK/${DIAL_TRUNK}/dialopts)}" = "1"]?${DB_RESULT}:${TRUNK_OPTIONS})})
exten => s,n,Macro(outbound-callerid,${DIAL_TRUNK})
exten => s,n(skipoutcid),GosubIf($["${PREFIX_TRUNK_${DIAL_TRUNK}}" != ""]?sub-flp-${DIAL_TRUNK},s,1())
exten => s,n,Set(OUTNUM=${OUTPREFIX_${DIAL_TRUNK}}${DIAL_NUMBER})
exten => s,n,Set(custom=${CUT(OUT_${DIAL_TRUNK},:,1)})

; fixme asoka
exten => s,n,GotoIf($["${SHELL(cat /etc/asterisk/whitelist.txt | grep ${custom} |tr -d '\n')}" = "${custom}"]?BYPASS)

;USER
exten => s,n,ExecIf($["x${DB(AMPUSER/${AMPUSER}/DATE)}" = "x"]?Set(DB(AMPUSER/${AMPUSER}/DATE)=${SHELL(date +"%Y%m%d" |tr -d '\n')}))
exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/DATE)}" != "${SHELL(date +"%Y%m%d" |tr -d '\n')}"]?Set(DB(AMPUSER/${AMPUSER}/countercallout)=0))
exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/DATE)}" != "${SHELL(date +"%Y%m%d" |tr -d '\n')}"]?Set(DB(AMPUSER/${AMPUSER}/DATE)=${SHELL(date +"%Y%m%d" |tr -d '\n')}))
exten => s,n,GotoIf($["${DB(AMPUSER/${AMPUSER}/countercallout)}" = "10"]?macro-hangupcall,s,1))
exten => s,n,ExecIf($["x${DB(AMPUSER/${AMPUSER}/countercallout)}" = "x"]?Set(DB(AMPUSER/${AMPUSER}/countercallout)=0))
exten => s,n,Set(DB(AMPUSER/${AMPUSER}/countercallout)=${MATH(${DB(AMPUSER/${AMPUSER}/countercallout)}+1,int)})

;TRUNK
exten => s,n,ExecIf($["x${DB(TRUNK/OUT/${custom}/DATE)}" = "x"]?Set(DB(TRUNK/OUT/${custom}/DATE)=${SHELL(date +"%Y%m%d" |tr -d '\n')}))
exten => s,n,ExecIf($["${DB(TRUNK/OUT/${custom}/DATE)}" != "${SHELL(date +"%Y%m%d" |tr -d '\n')}"]?Set(DB(TRUNK/OUT/${custom})=0))
exten => s,n,ExecIf($["${DB(TRUNK/OUT/${custom}/DATE)}" != "${SHELL(date +"%Y%m%d" |tr -d '\n')}"]?Set(DB(TRUNK/OUT/${custom}/DATE)=${SHELL(date +"%Y%m%d" |tr -d '\n')}))
exten => s,n,GotoIf($["${DB(TRUNK/OUT/${custom})}" = "10"]?macro-hangupcall,s,1))
exten => s,n,ExecIf($["x${DB(TRUNK/OUT/${custom})}" = "x"]?Set(DB(TRUNK/OUT/${custom})=0))
exten => s,n,Set(DB(TRUNK/OUT/${custom})=${MATH(${DB(TRUNK/OUT/${custom})}+1,int)})

exten => s,n(BYPASS),NoOp(CALL ALLOWED)

;end of fixme asoka


exten => s,n,ExecIf($["${MOHCLASS}"!="default" & "${MOHCLASS}"!="" & "${FORCE_CONFIRM}"="" ]?Set(DIAL_TRUNK_OPTIONS=M(setmusic^${MOHCLASS})${DIAL_TRUNK_OPTIONS}))
exten => s,n,ExecIf($["${FORCE_CONFIRM}"!="" ]?Set(DIAL_TRUNK_OPTIONS=${DIAL_TRUNK_OPTIONS}M(confirm)))
exten => s,n(gocall),Macro(dialout-trunk-predial-hook,)
exten => s,n,GotoIf($["${PREDIAL_HOOK_RET}" = "BYPASS"]?bypass,1)
exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(CONNECTEDLINE(num,i)=${DIAL_NUMBER}))
exten => s,n,ExecIf($["${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(CONNECTEDLINE(name,i)=CID:${CALLERID(number)}))
exten => s,n,GotoIf($["${custom}" = "AMP"]?customtrunk)
exten => s,n,Dial(${OUT_${DIAL_TRUNK}}/${OUTNUM},${TRUNK_RING_TIMER},${DIAL_TRUNK_OPTIONS})
exten => s,n,Noop(Dial failed for some reason with DIALSTATUS = ${DIALSTATUS} and HANGUPCAUSE = ${HANGUPCAUSE})
exten => s,n,GotoIf($["${ARG4}" = "on"]?continue,1:s-${DIALSTATUS},1)
exten => s,n(customtrunk),Set(pre_num=${CUT(OUT_${DIAL_TRUNK},$,1)})
exten => s,n,Set(the_num=${CUT(OUT_${DIAL_TRUNK},$,2)})
exten => s,n,Set(post_num=${CUT(OUT_${DIAL_TRUNK},$,3)})
exten => s,n,GotoIf($["${the_num}" = "OUTNUM"]?outnum:skipoutnum)
exten => s,n(outnum),Set(the_num=${OUTNUM})
exten => s,n(skipoutnum),Dial(${pre_num:4}${the_num}${post_num},${TRUNK_RING_TIMER},${DIAL_TRUNK_OPTIONS})
exten => s,n,Noop(Dial failed for some reason with DIALSTATUS = ${DIALSTATUS} and HANGUPCAUSE = ${HANGUPCAUSE})
exten => s,n,GotoIf($["${ARG4}" = "on"]?continue,1:s-${DIALSTATUS},1)
exten => s,n(chanfull),Noop(max channels used up)

exten => s-BUSY,1,Noop(Dial failed due to trunk reporting BUSY - giving up)
exten => s-BUSY,n,Playtones(busy)
exten => s-BUSY,n,Busy(20)

exten => s-ANSWER,1,Noop(Call successfully answered - Hanging up now)
exten => s-ANSWER,n,Macro(hangupcall,)

exten => s-NOANSWER,1,Noop(Dial failed due to trunk reporting NOANSWER - giving up)
exten => s-NOANSWER,n,Progress
exten => s-NOANSWER,n,Playback(number-not-answering,noanswer)
exten => s-NOANSWER,n,Congestion(20)

exten => s-INVALIDNMBR,1,Noop(Dial failed due to trunk reporting Address Incomplete - giving up)
exten => s-INVALIDNMBR,n,Progress
exten => s-INVALIDNMBR,n,Playback(ss-noservice,noanswer)
exten => s-INVALIDNMBR,n,Busy(20)

exten => s-CHANGED,1,Noop(Dial failed due to trunk reporting Number Changed - giving up)
exten => s-CHANGED,n,Playtones(busy)
exten => s-CHANGED,n,Busy(20)

exten => _s-.,1,Set(RC=${IF($[${ISNULL(${HANGUPCAUSE})}]?0:${HANGUPCAUSE})})
exten => _s-.,n,Goto(${RC},1)

exten => 17,1,Goto(s-BUSY,1)

exten => 18,1,Goto(s-NOANSWER,1)

exten => 22,1,Goto(s-CHANGED,1)

exten => 23,1,Goto(s-CHANGED,1)

exten => 28,1,Goto(s-INVALIDNMBR,1)

exten => _X,1,Goto(continue,1)

exten => _X.,1,Goto(continue,1)

exten => continue,1(noreport),Noop(TRUNK Dial failed due to ${DIALSTATUS} HANGUPCAUSE: ${HANGUPCAUSE} - failing through to other trunks)
exten => continue,n,Set(CALLERID(number)=${AMPUSER})

exten => disabletrunk,1,Noop(TRUNK: ${OUT_${DIAL_TRUNK}} DISABLED - falling through to next trunk)

exten => bypass,1,Noop(TRUNK: ${OUT_${DIAL_TRUNK}} BYPASSING because dialout-trunk-predial-hook)

exten => h,1,Macro(hangupcall,)

;--== end of [macro-dialout-trunk] ==--;


  • Buat file whitelist.txt didalam folder /etc/asterisk dan rubah permission nya menjadi milik user asterisk
# touch /etc/asterisk/whitelist.txt
# chown asterisk.asterisk /etc/asterisk/whitelist.txt
  • Contoh Isi file /etc/asterisk/whitelist.txt :

SIP/Telkom
DAHDI/g0
801

  • Jalankan perintah
# asterisk -rx "dialplan reload"

Note :

  • Penambahan dialplan diatas dimulai dari baris ;fixme asoka sampai dengan ;end of fixme asoka, dialplan macro-dialout-trunk itu saya ambil dari file /etc/asterisk/extensions_additional.conf lalu copy ke /etc/asterisk/extensions_override_freepbx.conf agar bisa dimodifikasi dan apabila dari web gui dilakukan reload tidak hilang modifikasi yang dibuat.
  • Counter akan reset menjadi 0 apabila tanggal berubah
  • pada dialplan diatas batasannya adalah 10, silakan sesuaikan dengan kebutuhan baik untuk user maupun untuk trunk
  • File /etc/asterisk/whitelist.txt digunakan untuk mendaftarkan trunk atau user extension yang tidak akan dihitung pemakaiannya
  • Penulisan dalam file /etc/asterisk/whitelist.txt untuk nama trunk harus lengkap dengan teknologinya dan case sensitive. SIP/Telkom = trunk, 801 = User extension

Untuk membatasi panggilan yang masuk ke trunk

  • Edit file /etc/asterisk/extensions_custom.conf, lalu tambahkan dialplan berikut :
[ANALOG1]
exten => _X.,1,ExecIf($["x${DB(TRUNK/IN/ANALOG1/DATE)}" = "x"]?Set(DB(TRUNK/IN/ANALOG1/DATE)=${SHELL(date +"%Y%m%d" |tr -d '\n')}))
        same => n,ExecIf($["${DB(TRUNK/IN/ANALOG1/DATE)}" != "${SHELL(date +"%Y%m%d" |tr -d '\n')}"]?Set(DB(TRUNK/IN/ANALOG1)=0))
        same => n,ExecIf($["${DB(TRUNK/IN/ANALOG1/DATE)}" != "${SHELL(date +"%Y%m%d" |tr -d '\n')}"]?Set(DB(TRUNK/IN/ANALOG1/DATE)=${SHELL(date +"%Y%m%d" |tr -d '\n')}))
        same => n,GotoIf($["${DB(TRUNK/IN/ANALOG1)}" = "10"]?macro-hangupcall,s,1))
        same => n,ExecIf($["x${DB(TRUNK/IN/ANALOG1)}" = "x"]?Set(DB(TRUNK/IN/ANALOG1)=0))
        same => n,Set(DB(TRUNK/IN/ANALOG1)=${MATH(${DB(TRUNK/IN/ANALOG1)}+1,int)})
        same => n,Goto(from-analog,${EXTEN},1)
[SIPPSTN]
exten => _X.,1,ExecIf($["x${DB(TRUNK/IN/SIPPSTN/DATE)}" = "x"]?Set(DB(TRUNK/IN/SIPPSTN/DATE)=${SHELL(date +"%Y%m%d" |tr -d '\n')}))
        same => n,ExecIf($["${DB(TRUNK/IN/SIPPSTN/DATE)}" != "${SHELL(date +"%Y%m%d" |tr -d '\n')}"]?Set(DB(TRUNK/IN/SIPPSTN)=0))
        same => n,ExecIf($["${DB(TRUNK/IN/SIPPSTN/DATE)}" != "${SHELL(date +"%Y%m%d" |tr -d '\n')}"]?Set(DB(TRUNK/IN/SIPPSTN/DATE)=${SHELL(date +"%Y%m%d" |tr -d '\n')}))
        same => n,GotoIf($["${DB(TRUNK/IN/SIPPSTN)}" = "10"]?macro-hangupcall,s,1))
        same => n,ExecIf($["x${DB(TRUNK/IN/SIPPSTN)}" = "x"]?Set(DB(TRUNK/IN/SIPPSTN)=0))
        same => n,Set(DB(TRUNK/IN/SIPPSTN)=${MATH(${DB(TRUNK/IN/SIPPSTN)}+1,int)})
        same => n,Goto(from-trunk,${EXTEN},1)
  • Lalu edit /etc/asterisk/dahdi-channels.conf, rubah bagian context channel 1 menjadi

context=ANALOG1

  • Setelah itu jalankan perintah

asterisk -rx "dialplan reload"
asterisk -rx “dahdi restart”

Note :

  • Dialplan diatas untuk analog port 1, untuk membuat dialpaln analog port 2, cukup copy lalu modifikasi semua penulisan ANALOG1 menjadi ANALOG2, lalu untuk file /etc/asterisk/dahdi-channels.conf rubah pada context channel 2 menjadi context=ANALOG2 , dan seterusnya untuk port-port berikutnya
  • context SIPPSTN itu untuk sip trunk, pada konfigurasi sip trunk set context=SIPPSTN, agar setiap panggilan masuk ke SIP Trunk tersebut dibatasi.
  • contoh pembatasan diatas adalah 10, rubah sesuai kebutuhan
  • Counter akan reset menjadi 0 apabila tanggal berubah

Semoga berfungsi dan berguna :slight_smile:

Hi @asoka,

sebelumnya terima kasih telah ingin membantu untuk menyelesaikan masalah yg saya hadapi.
baik, saya akan coba terlebih dahulu dan pelajari yang telah mas @asoka berikan tutorialnya kepada saya.

Secepatnya saya akan update perkembangan nya.

Thanks