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,HangupOp dit moment is het niet perfect: het slaat soms 10 seconden over.