Archive for the ‘Asterisk’ Category

Checking voicemail remotely

Tuesday, August 7th, 2007

I have been asked by many people how to check your voicemail from out of the office. Normally this is an easy process, however if you don’t have an auto attendant, it doesn’t seem so easy. I researched the voicemail command and found it is quite easy. Here is the output of a “show application voicemail”.

-= Info about application ‘VoiceMail’ =-

[Synopsis]
Leave a Voicemail message

[Description]
VoiceMail(mailbox[@context][&mailbox[@context]][...][|options]): This
application allows the calling party to leave a message for the specified
list of mailboxes. When multiple mailboxes are specified, the greeting will
be taken from the first mailbox specified. Dialplan execution will stop if the
specified mailbox does not exist.
The Voicemail application will exit if any of the following DTMF digits are
received:1*CLI>
0 – Jump to the ‘o’ extension in the current dialplan context.
* – Jump to the ‘a’ extension in the current dialplan context.
This application will set the following channel variable upon completion:
VMSTATUS – This indicates the status of the execution of the VoiceMail
application. The possible values are:
SUCCESS | USEREXIT | FAILED

Options:
b – Play the ‘busy’ greeting to the calling party.
g(#) – Use the specified amount of gain when recording the voicemail
message. The units are whole-number decibels (dB).
s – Skip the playback of instructions for leaving a message to the
calling party.
u – Play the ‘unavailable’ greeting.
j – Jump to priority n+101 if the mailbox is not found or some other
error occurs.

The interesting part is “* – Jump to the ‘a’ extension in the current dialplan context.” This means if a line is added in the same context as the the voicemail(…) line, it will jump to the “a” extension if the user pushes the “*” button during the greeting playback.

Here is an example. If extension 100 that rings and then rolls to voicemail, the code might look like the following.
exten => 100,1,Dial(SIP/100,15)
exten => 100,n,Voicemail(100@default)

By adding a third line of code, the user can push “*” and jump to the VoicemailMain application.
exten => 100,1,Dial(SIP/100,15)
exten => 100,n,Voicemail(100@default)
exten => a,1,VoicemailMain(100@default)

Avaya IP Phones with MWI

Monday, August 6th, 2007

There is a known issue with Avaya IP phone’s Message Waiting Indicator(MWI) with Asterisk 1.2 and 1.4. If you have the phone configured with a mailbox line in the sip.conf, the light will never come on. Worse after about 24 hours, the phone with freeze and need to be restarted.

After lots of work testing many different configurations, I finally found a way to get the Message Waiting Indicator working. I am using Avaya 4610sw phones with the latest SIP firmware from Avaya which is the March 07 release. The version of Asterisk is the current Trunk version.

There was some major work done on the Message Waiting Indicator code and SIP subscriptions in the Trunk and I believe that is what fixed it. All the new code should go into the future 1.6 release. I have heard it rumored that we should expect 1.6 around the end of 07.

Email notifications for missed calls in Asterisk

Saturday, May 5th, 2007

A feature I have wanted for a long time is to get emails about missed calls. I have a Blackberry and knowing that people are calling and hanging up before leaving a vm is very useful when I am out in the field. I wrote a small shell script to add this functionality to Asterisk.

I place the script in the h extension of the stdexten marco. The h extension triggers once a call is hung up from that context. The first and only priority for the h extension is a System() call. It calls this shell script and passes many parameters to it. The first parameter is the email address to send the email to. To make this work for the marco, I adjust the macro to have a third parameter which is email address. I would like to pull the email address from that extensions vm but that function does not exist and I could not figure out how to add that function in the C source code. If anyone knows a better way, please let me know. The script requires you have the mailx package installed.

  • Download the script
  • Rename the file processCallEmail.sh.
    mv processCallEmail.txt processCallEmail.sh
  • Put it in the /var/lib/asterisk/agi-bin directory.
    mv processCallEmail.sh /var/lib/asterisk/agi-bin/"
  • Make sure the asterisk user has execute permissions on the script.
    chmod 755 /var/lib/asterisk/agi-bin/
    processCallEmail.sh
  • Add one line of documentation to macro-stdexten context on the line after ${ARG2}. ; ${ARG3} - email address to send emails about missed calls to
  • Add the h extension line to the macro-stdexten context. exten => h,1,System(processCallEmail.sh "${ARG3}" "${CALLERID(num)}" "${CALLERID(name) }" "${DIALSTATUS}" "${VMSTATUS}")
  • Alter the line that calls the macro to include an email address. exten => 500,1,Macro(stdexten,500,SIP/${EXTEN},abc@test.com)

Here is an example of an updated stdexten macro.
[macro-stdexten];
;
; Standard extension macro:
; ${ARG1} - Extension (we could have used ${MACRO_EXTEN} here as well
; ${ARG2} - Device(s) to ring
; ${ARG3} - email address to send emails about missed calls to
;
exten => s,1,AGI(ldaplookupphone2.agi)
exten => s,n,Dial(${ARG2},20) ; Ring the interface, 20 seconds maximum
exten => s,n,Goto(s-${DIALSTATUS},1) ; Jump based on status NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)

exten => s-NOANSWER,1,Voicemail(${ARG1},u) ; If unavailable, send to voicemail w/ unavail announce

exten => s-NOANSWER,2,Goto(default,s,1) ; If they press #, return to start

exten => s-BUSY,1,Voicemail(${ARG1},b) ; If busy, send to voicemail w/ busy announce
exten => s-BUSY,2,Goto(default,s,1) ; If they press #, return to start

exten => _s-.,1,Goto(s-NOANSWER,1) ; Treat anything else as no answer

exten => a,1,VoicemailMain(${ARG1}) ; If they press *, send the user into VoicemailMain

exten => h,1,System(
processCallEmail.sh "${ARG3}" "${CALLERID(num)}" "${CALLERID(name) }" "${DIALSTATUS}" "${VMSTATUS}")

Answering machine detection

Wednesday, May 2nd, 2007

Today I worked with the Asterisk function amd. Amd stand for answering machine detection and after my initial testing it seems to work very well. The documentation on the function is written very cryptically. I decided to just use the defaults and it worked amazingly well. For any auto dialing applications I highly recommend trying this function.

To help me get started I grabbed an example from the wiki and used an example from it. Here is the example from the wiki modified for Asterisk 1.4. I updated the wiki with the relevant 1.4 information.

[outbound]
exten => s,1,NoCDR
exten => s,n,AMD
exten => s,n,GotoIf($[${AMDSTATUS}=HUMAN]?humn:mach)
exten => s,n(mach),WaitForSilence(2500)
exten => s,n,Playback(message-when-machine)
exten => s,n,Hangup
exten => s,n(humn),WaitForSilence(500)
exten => s,n,Playback(message-when-human)
exten => s,n,Hangup