Asterisk project 002

In het spelen met Asterisk, the open source pbx besloot ik om een 'sprekende klok' te bouwen, in de stijl van 002 van vroeger toen het nog ptt telecom heette.

Om eerlijk te zijn, de tijdmelding bestaat nogsteeds op 0900-8002 (alleen vanuit Nederland, en er moet voor betaald worden).

Een sprekende klok is een natuurlijke keuze voor me, omdat ik altijd alle computers gelijk laat lopen middels ntp. De juiste tijd omzetten naar telefonie leek me een leuk project om mee te starten.

Voor de correcte '002-ervaring' moet de aankondiging van de tijd gesynchroniseerd zijn naar de komende 10 seconden. Dus er moet gerekend worden aan de tijd om te synchroniseren en de toon moet op de juiste tijd komen.

Script hieronder. Heeft minstens Asterisk 1.2.x nodig omdat ik 'n' priority gebruik en labels voor Goto().

In de ontwikkeling hiervan kwam ik nog een bug tegen in de Asterisk SayUnixTime() functie waar de internationalisatie regels niet toegepast worden op SayUnixTime(,,S) voor seconden. Dit is opgelost in de laatste versie van Asterisk (leve open source, de tijd tussen mijn melding van de bug en de oplossing was minder dan 48 uur).

Het relevante deel van extensions.conf:

[speakingclock]
; the speaking clock, old dutch ptt 002 style

; answer the phone
exten => s,1,Set(LANGUAGE()=nl)
exten => s,n,Wait(2)
exten => s,n,Answer()
exten => s,n,Playback(beep)
exten => s,n,Set(TIMEOUT(absolute()=60)
; synchronize to 10 seconds
exten => s,n(clockloop),Set(Waitforten=$[10 - $[${EPOCH} % 10]])
; but don't wait 10 seconds if we jump in at the right moment
exten => s,n,GotoIf($[ ${Waitforten} = 10 ]?clockstart:)
exten => s,n,Wait,${Waitforten}
; and announce time
exten => s,n(clockstart),Set(FutureTime=$[${EPOCH} + 10])
exten => s,n,SayUnixTime(${FutureTime},,R)
exten => s,n,Playback(minutes)
exten => s,n,Playback(vm-and)
; a bug in the internationalization of SayUnixTime(,,S) : local rules for
; saying numbers aren't applied.
exten => s,n,SayUnixTime(${FutureTime},,S)
; workaround:
; exten => s,n,Set(Secondsnumber=$[ ${FutureTime} % 60 ])
; exten => s,n,SayNumber(${Secondsnumber})
exten => s,n,Playback(seconds)
exten => s,n,Set(FutureDelay=$[${FutureTime}-${EPOCH}])
exten => s,n,Wait,${FutureDelay}
exten => s,n,Playback(beep)
exten => s,n,Goto(clockloop)

;byebye
exten => t,1,Playback(beep)
exten => t,n,Hangup
Op dit moment is het niet perfect: het slaat soms 10 seconden over.

Links

Demonstratie

Is momenteel niet beschikbaar.
Creative Commons License
Op dit werk is een Creative Commons Licentie van toepassing.
Commentaar over en updates voor deze pagina zijn welkom. E-mail is de beste manier van contact.
Koos van den Hout (koos+website@idefix.net)
Other webprojects: Camp Wireless The Virtual Bookcase