I've created an alarm clock facility and added it to the dialplan of my Asterisk server, but I use it so seldom that I can never remember how to use it when I want to.
TODO: Add a facility to set just a one-off alarm (the above, once set, go off every day until disabled).
TODO: Get the system to notice which extension the alarm was set from, and only ring that extension for the alarm itself.
To make this work on your own Asterisk server, you need to do four things:
exten => _ZXXXX,1,NoOp(Setting alarm ${EXTEN:0:1} to ${EXTEN:1}) same => n,GotoIf($["${EXTEN:1:2}">"23"]?inval) same => n,GotoIf($["${EXTEN:3:2}">"59"]?inval) same => n,Set(CHANNEL(language)=al) same => n,System(/etc/asterisk/alarm/do.sh set ${EXTEN:0:1} ${EXTEN:1}) same => n,Playback(silence/1) same => n,Playback(alarm) same => n,Playback(digits/${EXTEN:0:1}) same => n,Playback(is-set-to) same => n,SayUnixTime(${STRPTIME(2000-01-01 ${EXTEN:1:2}:${EXTEN:3:2}:00,,%Y-%m-%d %H:%M:%S)},,HM) same => n,Playback(silence/1) same => n,Hangup() same => n(inval),Playback(im-sorry&please-try&another-time) same => n,Hangup() exten => _Z0,1,NoOp(Disabling alarm ${EXTEN:0:1}) same => n,System(/etc/asterisk/alarm/do.sh disable ${EXTEN:0:1}) same => n,Set(CHANNEL(language)=al) same => n,Playback(silence/1) same => n,Playback(alarm) same => n,Playback(digits/${EXTEN:0:1}) same => n,Playback(off) same => n,Playback(silence/1) same => n,Hangup() exten => _Z1,1,NoOp(Enabling alarm ${EXTEN:0:1}) same => n,System(/etc/asterisk/alarm/do.sh enable ${EXTEN:0:1}) same => n,Set(CHANNEL(language)=al) same => n,Playback(silence/1) same => n,Playback(alarm) same => n,Playback(digits/${EXTEN:0:1}) same => n,Playback(on) same => n,Playback(silence/1) same => n,Hangup() exten => 0,1,NoOp(Reviewing all alarm times) same => n,Set(CHANNEL(language)=al) same => n,Playback(silence/1) same => n,Playback(current-time-is) same => n,SayUnixTime(,,HM) same => n,Playback(silence/1) same => n,Set(n=1) same => n,While($[${n}<10]) same => n,Set(t=${FILE(/etc/asterisk/alarm/alarm.${n}.txt)}) same => n,GotoIf($["x${t}"="x"]?none) same => n,Playback(alarm) same => n,Playback(digits/${n}) same => n,Playback(is-set-to) same => n,GotoIf($["${t:0:1}"="#"]?hash) same => n,SayUnixTime(${STRPTIME(2000-01-01 ${t:0:2}:${t:2:2}:00,,%Y-%m-%d %H:%M:%S)},,HM) same => n,Playback(silence/1) same => n,Goto(none) same => n(hash),SayUnixTime(${STRPTIME(2000-01-01 ${t:1:2}:${t:3:2}:00,,%Y-%m-%d %H:%M:%S)},,HM) same => n,Playback(off) same => n,Playback(silence/1) same => n(none),Set(n=$[${n}+1]) same => n,EndWhile same => n,Hangup() exten => _Z,1,NoOp(Cancelling alarm ${EXTEN}) same => n,System(/etc/asterisk/alarm/do.sh cancel ${EXTEN}) same => n,Set(CHANNEL(language)=al) same => n,Playback(silence/1) same => n,Playback(alarm) same => n,Playback(digits/${EXTEN:0:1}) same => n,Playback(has-been-cleared) same => n,Playback(silence/1) same => n,Hangup()
[WakeyWakey] exten => Call,1,NoOp(Call) same => n,Set(CHANNEL(language)=al) same => n,Dial(SIP/KSnom870) same => n,Hangup() exten => Alarm,1,NoOp(Alarm) same => n,Set(CHANNEL(language)=al) same => n,Playback(silence/1) same => n,Playback(this-is-yr-wakeup-call) same => n,Playback(silence/1) same => n,Playback(current-time-is) same => n,SayUnixTime(,,HM) same => n,Hangup()
Note: adjust the above extension name "KSnom870" to whichever phone/s you wish the ring when the alarm goes off.
#!/bin/bash # Process various alarm functions if [ "$1" = "set" ] then # Set alarm $2 to time $3 echo "$3" >/etc/asterisk/alarm/alarm.$2.txt sed -i "/ringnow $2/d" /etc/asterisk/alarm/crontab echo "${3:2:2} ${3:0:2} * * * /etc/asterisk/alarm/do.sh ringnow $2 $3" >>/etc/asterisk/alarm/crontab crontab /etc/asterisk/alarm/crontab fi if [ "$1" ] "cancel" ] then # Cancel alarm $2 rm -f /etc/asterisk/alarm/alarm.$2.txt sed -i "/ringnow $2/d" /etc/asterisk/alarm/crontab crontab /etc/asterisk/alarm/crontab fi if [ "$1" = "enable" ] then # Enable alarm $2 if grep -q "^#" /etc/asterisk/alarm/alarm.$2.txt then sed -i "s/^#\+//" /etc/asterisk/alarm/alarm.$2.txt sed -i "s/#\+\(.*ringnow $2 .*\)/\1/" /etc/asterisk/alarm/crontab crontab /etc/asterisk/alarm/crontab fi fi if [ "$1" = "disable" ] then # Disable alarm $2 if ! grep -q "^#" /etc/asterisk/alarm/alarm.$2.txt then sed -i "s/^/#/" /etc/asterisk/alarm/alarm.$2.txt sed -i "s/\(.*ringnow $2 .*\)/#\1/" /etc/asterisk/alarm/crontab crontab /etc/asterisk/alarm/crontab fi fi if [ "$1" = "ringnow" ] then # Copy the callfile to place the call cd /etc/asterisk/alarm rsync -aq callfile /var/spool/asterisk/outgoing fi
Channel: Local/Call@WakeyWakey Context: WakeyWakey Extension: Alarm Priority: 1
Go up
Return to main index.