Wie bekommt man eine "funktionierende" Zeitansage in Asterisk hin?

voipd

IPPF-Promi
Mitglied seit
5 Mai 2005
Beiträge
3,187
Punkte für Reaktionen
4
Punkte
38
Ich habe zur Zeit mit dem nachfolgenden Code eine Zeitansage realisiert. Dieses Beispiel habe ich aus dem Forum, doch es ist Mist! :mad:

Es gilt zwar "Works as designed", aber das Design gibt keine vernueftige Zeitansage her, denn es gibt einen Logikfehler:

Code:
[zeitansage]
exten => s,1,Set(LANGUAGE()=de)
exten => s,n,Answer
exten => s,n,Wait(1)
exten => s,n,SayUnixTime( |CET| a)
exten => s,n,Wait(1)
exten => s,n,SayUnixTime( |CET| k) #*1
;exten => s,n,Playback(oclock)
exten => s,n,SayUnixTime( |CET| M) #*2
exten => s,n,Playback(minutes)
exten => s,n,SayUnixTime( |CET| S) #*3
;exten => s,n,Playback(seconds)
exten => s,n,Wait(1)
exten => s,n,Playback(beep)
exten => s,n,Wait(24)
exten => s,n,Goto(s,6)
exten => s,n,Playback(vm-goodbye)
exten => s,n,Hangup

Betrachten wir hier "k=Stunde", "M=Minute" und "S=Sekunde".

Wenn es nun 14:34:21 ist und das Script an der Stelle *1 loslegt wird
Code:
folgendes angesagt:
[B]14[/B] Uhr            #14:34:21
[B]34[/B] Minuten        #14:34:23
[B]25[/B] Sekunden       #14:34:25
Das ist nicht weiter schlimm, da ich eine Ungenauigkeit von 3-4 Sekunden verschmerzen kann.

Wenn es nun aber 14:34:56 ist, dann wird folgendes Angesagt:
Code:
[B]14[/B] Uhr            #14:34:56
[B][COLOR="Red"]34[/COLOR][/B] Minuten        #14:34:58
[B][COLOR="Red"]0[/COLOR][/B] Sekunden        #14:35:00
obwohl es in dem Moment, wo die Sekunden angesagt werden bereits 14:35:00 ist.

Kann man die Uhrzeit nicht zuerst "capturen" und dann abspielen?


BTW: Beispiel: Da ich mir die Zeit als Schleife mit 24 Sekunden Pause ansagen lasse kann folgendes z.B. angesagt werden:
1. Ansage: 14 Uhr 21 Minuten 28 Sekunden
2. Ansage: 14 Uhr 21 Minuten 0 Sekunden
3. Ansage: 14 Uhr 22 Minuten 26 Sekunden

Fuer eine Loesungsvorschlag waere ich dankbar.

voipd.
 
Zuletzt bearbeitet:
voipd schrieb:
Kann man die Uhrzeit nicht zuerst "capturen" und dann abspielen?

Da hast Du Dir doch die Lösung für Dein nichtexistentes Problem (denn es ist ja gar keins) schon selbst gegeben :D Lies die Uhrzeit in eine Variable und füttere dann die Funktion SayUnixTime() mit diesem Variablenwert. Denn die Uhrzeit, die zur Ansage verwendet wird, ist doch der erste Parameter, den Du übergeben kannst.

Asterisk Doku schrieb:
Syntax
SayUnixTime(unixtime,timezone,format)

Damit kannst Du sicherstellen, daß jeder der drei Aufrufe mit der gleichen Zeit arbeitet. Und du kannst sogar die 3 Sekunden Ansagezeit noch mit reinrechnen (für Perfektionisten)
 
Danke betateilchen,

der Denkanstoss war prima, aber da gibt es noch ein paar Fallstricke. :-)

Zur Info hier fuer die anderen Dokumentiert.

NUR SO! funktioniert es:
Code:
[zeitansage]
exten => s,1,Set(LANGUAGE()=de)
exten => s,n,Set(aktuelle_zeit=${STRFTIME(||%s)})
exten => s,n,Answer
exten => s,n,Wait(1)
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| a)
exten => s,n,Wait(1)
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| k)
[...]

Es MUSS inder Variablen ${aktuelle_zeit} die Unixsekunden (Eine Zahl!) stehen. Wenn dort IRGENDWAS anderes steht, dann wird der Wert bei der Ansage verworfen und die Uhrzeit angesagt, die in dem Moment aktuell ist indem der Befehl ausgefuehrt/angesagt wird.

Code:
[zeitansage]
exten => s,1,Set(LANGUAGE()=de)

exten => s,n,Set(aktuelle_zeit=${STRFTIME()})              #Wird ignoriert, da Ausgabe im Format "Wed Nov 21 17:00:00 2007"
[oder]
exten => s,n,Set(aktuelle_zeit="Wed Nov 21 17:00:00 2007") #Wird bei Ansage ignoriert.
[oder]
exten => s,n,Set(aktuelle_zeit="100")                      #Wird korrekt angesagt.

exten => s,n,NoOp(${aktuelle_zeit})                        #Ausgabe des Strings - Hilft beim debuggen.

exten => s,n,Answer
exten => s,n,Wait(1)
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| a)
exten => s,n,Wait(1)
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| k)
[...]

Also, das gemeine ist, dass eine (und zwar die aktuelle) Uhrzeit angesagt wird, auch wenn die SayUnixTime Funktion mit dem Wert nichts anfangen kann!

voipd.
 
Danke betateilchen,

der Denkanstoss war prima, aber da gibt es noch ein paar Fallstricke. :-)

Es MUSS inder Variablen ${aktuelle_zeit} die Unixsekunden (Eine Zahl!) stehen. Wenn dort IRGENDWAS anderes steht, dann wird der Wert bei der Ansage verworfen und die Uhrzeit angesagt, die in dem Moment aktuell ist indem der Befehl ausgefuehrt/angesagt wird.

:wiejetzt:

Was bitte ist denn daran ein Fallstrick? Das steht doch auch ausdrücklich so in der Syntaxbeschreibung zu sayunixtime.

unixtime is the date/time to say, represented as a standard unix timestamp (number of seconds since 1 Jan 1970). If this parameter is omitted, the default value is the current date/time.

Und wie da ja ausdrücklich steht, ist das sogar STANDARD - wo bitte ist das Problem? Außer daß Du die Doku vorher nicht gelesen hast?
 
Genau,

da von so mancher Unix Shell die Zeitverarbeitung mit mehreren Formaten akzeptiert wird wollte ich nochmals darauf hinweisen, dass man hier sehr genau sein muss. Ich wollte nicht einfach mit einem "Danke, geht jetzt" abschliessen.

Das Gemeine ist, dass die SayUnixTime Funktion auch andere Werte akzepiert, bzw. ohne Fehlermeldung annimmt, aber intern dann verwirft und so tut, als waere kein Parameter uebergeben worden und die aktuelle Zeit ansagt.

BTW: Wer lesen kann ist immer im Vorteil, aber man muss das Gelesene erstmal verstehen und richtig interpretieren um damit was anfangen zu koennen :!:

voipd.
 
Wie bekommt man eine "funktionierende" Zeitansage in Asterisk hin? Teil 2

Hallo zusammen,

ich habe bei der Zeitansage ein weiteres Problem, das ich loesen moechte. Es werden keine Minuten angesagt, insbesondere wird die "Null" Minute komplett unterschlagen, d.h. nicht gesprochen.

Dies passiert aber nur dei den SayUnixTime Parameter "M" und "R". Bei "T" funktioniert es. Anbei die 3 Beispiele mit "M", "R" und "T". Ich habe die Asterisk Version 1.4.11 am laufen. Im Internet habe ich keine Info ueber dieses Problem gefunden.
Koennte dies jemand mal verifizieren, ob das Problem auch bei den neueren Asterisk Versionen auftritt? Sollte es einen Patch fuer meine Version geben waere ich dankbar wenn mir jemand sagen koennte wo man ihn bekommt und wie man ihn einspielt.
Ein Upgrade auf eine neue Asterisk Version moechte ich vermeiden. :-)

Hier die 3 Varianten die es gibt:
Variante A)
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| k) #Ansage Stunden
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| M) #Ansage Minuten #Fehlerhaft s.u.
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| S) #Ansage Sekunden

Variante B)
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| R) #Ansage Stunden und Minuten #Fehlerhaft s.u.
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| S) #Ansage Sekunden

Variante C)
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| T) #Ansage Stunden, Minuten und Sekunden

Details Variante A)
Code:
[zeitansage]
exten => s,1,Set(LANGUAGE()=de)
exten => s,n,Set(aktuelle_zeit="1195682400") #Setzen der "Uhrzeit" auf Mi, 21.11.2007 23:00:00
exten => s,n,Answer
exten => s,n,Wait(1)
;
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| k) #Ansage Stunden
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| M) #Ansage Minuten
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| S) #Ansage Sekunden

Log:
    -- Executing [s@zeitansage:10] SayUnixTime("SIP/sipgate.de-08220a60", "1195682400|CET| k") in new stack
#Stunden
    -- <SIP/sipgate.de-08220a60> Playing 'digits/3-and' (language 'de')
    -- <SIP/sipgate.de-08220a60> Playing 'digits/20' (language 'de')
    -- <SIP/sipgate.de-08220a60> Playing 'digits/oclock' (language 'de')
    -- Executing [s@zeitansage:11] SayUnixTime("SIP/sipgate.de-08220a60", "1195682400|CET| M") in new stack
[B]#Minuten, aber keine Ansage[/B]
    -- Executing [s@zeitansage:12] SayUnixTime("SIP/sipgate.de-08220a60", "1195682400|CET| S") in new stack
#Sekunden
    -- <SIP/sipgate.de-08220a60> Playing 'digits/and' (language 'de')
    -- <SIP/sipgate.de-08220a60> Playing 'digits/0' (language 'de')
    -- <SIP/sipgate.de-08220a60> Playing 'digits/seconds' (language 'de')


Details Variante B)
Code:
[zeitansage]
exten => s,1,Set(LANGUAGE()=de)
exten => s,n,Set(aktuelle_zeit="1195682400") #Setzen der "Uhrzeit" auf Mi, 21.11.2007 23:00:00
exten => s,n,Answer
exten => s,n,Wait(1)
;
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| R) #Ansage Stunden und Minuten
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| S) #Ansage Sekunden

Log:
    -- Executing [s@zeitansage:10] SayUnixTime("SIP/sipgate.de-08xxxxxx", "1195682400|CET| R") in new stack
#Stunden
    -- <SIP/sipgate.de-08xxxxxx> Playing 'digits/3-and' (language 'de')
    -- <SIP/sipgate.de-08xxxxxx> Playing 'digits/20' (language 'de')
    -- <SIP/sipgate.de-08xxxxxx> Playing 'digits/oclock' (language 'de')
[B]# Hier fehlt die Ansage der Minuten[/B]

#Sekunden
    -- Executing [s@zeitansage:11] SayUnixTime("SIP/sipgate.de-08xxxxxx", "1195682400|CET| S") in new stack
    -- <SIP/sipgate.de-08xxxxxx> Playing 'digits/and' (language 'de')
    -- <SIP/sipgate.de-08xxxxxx> Playing 'digits/0' (language 'de')
    -- <SIP/sipgate.de-08xxxxxx> Playing 'digits/seconds' (language 'de')


Details Variante C)
Code:
[zeitansage]
exten => s,1,Set(LANGUAGE()=de)
exten => s,n,Set(aktuelle_zeit="1195682400") #Setzen der "Uhrzeit" auf Mi, 21.11.2007 23:00:00
exten => s,n,Answer
exten => s,n,Wait(1)
;
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| T) #Ansage Stunden, Minuten und Sekunden

Log:
    -- Executing [s@zeitansage:10] SayUnixTime("SIP/sipgate.de-08245cc0", "1195682400|CET| T") in new stack
#Stunden 
    -- <SIP/sipgate.de-08245cc0> Playing 'digits/3-and' (language 'de')
    -- <SIP/sipgate.de-08245cc0> Playing 'digits/20' (language 'de')
    -- <SIP/sipgate.de-08245cc0> Playing 'digits/oclock' (language 'de')
[B]#Minuten[/B]
    -- <SIP/sipgate.de-08245cc0> Playing 'digits/0' (language 'de')
    -- <SIP/sipgate.de-08245cc0> Playing 'digits/minutes' (language 'de')
#Sekunden
    -- <SIP/sipgate.de-08245cc0> Playing 'digits/and' (language 'de')
    -- <SIP/sipgate.de-08245cc0> Playing 'digits/0' (language 'de')
    -- <SIP/sipgate.de-08245cc0> Playing 'digits/seconds' (language 'de')

BTW: Der Workaround mit "T" ist bei mir nicht zielfuehrend, da ich nur Minuten und Sekunden korrekt ansagen moechte.

voipd.
 
Zuletzt bearbeitet:
Die 1.4.13 macht das auch so. Das wirst du wohl selber ändern müssen.
Auf die Schnelle habe ich in der Datei main/say.c eventuell die Lösung gefunden. In Zeile 5557 wird geprüft, ob min>0 und nur dann die Minuten angesagt.

Gruss,
Sachmet.
 
Danke fuer den Test.

Guter Tip und ich denke das Problem liegt hier "minutes only if seconds follow"

Aus "main/say.c":
Code:
/* German syntax */
case 'M':
       /* Minute */
       if (tm.tm_min > 0 || format[offset+ 1 ] == 'S' ) { /* [B]zero 'digits/0' only if seconds follow[/B] (kind of a hack) */
               res = ast_say_number(chan, tm.tm_min, ints, lang, "f");
       }
       if ( !res && format[offset + 1] == 'S' ) { /* [B]minutes only if seconds follow[/B] (kind of a hack) */
               if (tm.tm_min == 1) {
                       res = wait_file(chan,ints,"digits/minute",lang);
               } else {
                       res = wait_file(chan,ints,"digits/minutes",lang);
               }
       }
       break;

case 'R':
       res = ast_say_date_with_format_de(chan, time, ints, lang, "HM", timezone);
       break;


case 'T':                                                                                       
       res = ast_say_date_with_format_de(chan, time, ints, lang, "HMS", timezone);
       break;

Selbst wenn ich da etwas aendere wuesste ich nicht wie ich das in Produktion bekomme. :confused:

So wie ich die Kommentare interpretiere werden die Minuten nur Angesagt, wenn "S" Sekunden direkt danach folden. Das ist natuerlich bei "M" und "R" nicht der Fall.

Kannst du das richtig interpretieren und aendern oder liegt das Problem noch woanders?

voipd.
 
Zuletzt bearbeitet:
so funzt es eigendlich ohne variablen... oder spricht da was gegen?

exten => 6,1,Set(LANGUAGE()=de)
exten => 6,2,Answer
exten => 6,3,Wait(1)
exten => 6,4,SayUnixTime(,,admYHMS)
exten => 6,5,Wait(1)
exten => 6,6,Playback(beep)
exten => 6,7,Wait(1)
exten => 6,8,SayUnixTime(,,HMS)
exten => 6,9,Wait(1)
exten => 6,10,Playback(beep)
exten => 6,11,Wait(1)
exten => 6,12,Goto(8)
 
exten => s,n,SayUnixTime(${aktuelle_zeit}|CET| MS)

Das ist ein funktionienrender Workaround. :p

Hiermit wird das Problem im Quellcode umgangen, dass nur dann die Minuten richtig angesagt werden, wenn anschliessend noch Sekunden folgen ohne vorher die Stunden ansagen zu muessen (Parameter: T).

Haette man da nicht selbst drauf kommen muessen? :oops:

Vielen Dank!

Ob du das Problem mit den Variablen damit geloest hast weiss ich nicht. Man muesste ausprobieren, wass passiert wenn zwischen der Ansage der Stunden und Minuten die Stunde "umspringt" und damit "Null Minuten" angesagt werden.

BTW: Mir ist gerade noch aufgefallen, dass minute.gsm fehlt. Damit wid bei der Ansage von z.B. 13:01:00 bei "Einer ..." abgebrochen. S.u.
Abhilfe schafft, wenn man minutes.gsm nach minute.gsm umkopiert. Dann heisst es zwar "Eine Minuten", aber besser als ein Abbruch.
Code:
WARNING[21725]: file.c:563 ast_openstream_full: File digits/minute does not exist in any format
WARNING[21725]: file.c:813 ast_streamfile: Unable to open digits/minute (format 0x4 (ulaw)): No such file or directory
WARNING[21725]: say.c:409 wait_file: Unable to play message digits/minute
== Spawn extension (zeitansage, s, 10) exited non-zero on 'SIP/sipgate.de-xxx'

voipd.
 
Zuletzt bearbeitet:
Sounds sind falsch

Hallo,

ich habe von Amooma die Deutschen Sprachbausteine herunterladen und installiert.

http://www.amooma.de/asterisk/sprachbausteine

Eigentlich super, aber nun stimmt meine Zeitansage nicht mehr.

Mit gehen immer die Minuten in der Ansage verloren.
Aus z.B 4x (1-9) wird immer vierzig angesagt, auch sonst stimmt hier was nicht.
Muss ich da noch etwas einstellen, oder wie komme ich zu den richtigen Sounds?

Die Ansage für 18:21 lautet:

Sonntag 5tens 10tens Zwei Tausend Acht Achtzehn Uhr Zehn

Das Log dazu:

=========================================================================
Connected to Asterisk 1.4.21.2 currently running on mah-fs1 (pid = 10865)
Verbosity is at least 4
-- Remote UNIX connection
[Oct 5 18:22:09] NOTICE[10893]: chan_sip.c:14035 handle_request_invite: Call from '42' to extension '800' rejected because extension not found.
[Oct 5 18:22:13] NOTICE[10893]: chan_sip.c:14035 handle_request_invite: Call from '42' to extension '800' rejected because extension not found.
-- Executing [880@default:1] Set("SIP/42-008965a0", "LANGUAGE()=de") in new stack
-- Executing [880@default:2] Answer("SIP/42-008965a0", "") in new stack
-- Executing [880@default:3] Wait("SIP/42-008965a0", "1") in new stack
-- Executing [880@default:4] SayUnixTime("SIP/42-008965a0", "||admYHMS") in new stack
-- <SIP/42-008965a0> Playing 'digits/day-0' (language 'de')
-- <SIP/42-008965a0> Playing 'digits/h-5' (language 'de')
-- <SIP/42-008965a0> Playing 'digits/h-10' (language 'de')
-- <SIP/42-008965a0> Playing 'digits/2' (language 'de')
-- <SIP/42-008965a0> Playing 'digits/thousand' (language 'de')
[Oct 5 18:22:24] WARNING[14355]: file.c:602 ast_openstream_full: File digits/and does not exist in any format
[Oct 5 18:22:24] WARNING[14355]: file.c:912 ast_streamfile: Unable to open digits/and (format 0x4 (ulaw)): No such file or directory
-- <SIP/42-008965a0> Playing 'digits/8' (language 'de')
-- <SIP/42-008965a0> Playing 'digits/18' (language 'de')
-- <SIP/42-008965a0> Playing 'digits/oclock' (language 'de')
[Oct 5 18:22:27] WARNING[14355]: file.c:602 ast_openstream_full: File digits/2-and does not exist in any format
[Oct 5 18:22:27] WARNING[14355]: file.c:912 ast_streamfile: Unable to open digits/2-and (format 0x4 (ulaw)): No such file or directory
-- <SIP/42-008965a0> Playing 'digits/20' (language 'de')
[Oct 5 18:22:29] WARNING[14355]: file.c:602 ast_openstream_full: File digits/minutes does not exist in any format
[Oct 5 18:22:29] WARNING[14355]: file.c:912 ast_streamfile: Unable to open digits/minutes (format 0x4 (ulaw)): No such file or directory
[Oct 5 18:22:29] WARNING[14355]: say.c:409 wait_file: Unable to play message digits/minutes
== Spawn extension (default, 880, 4) exited non-zero on 'SIP/42-008965a0'
mah-fs1*CLI>
mah-fs1:~ #
 
hab das bei mir so gelöst
Code:
[zeit_ansage]
exten => 9,1,Set(LANGUAGE()=de)
exten => 9,n,Answer
exten => 9,n,Wait(1)
exten => 9,n,SayUnixTime( |CET| a) ;Wochentag
exten => 9,n,SayUnixTime( |CET| d)
exten => 9,n,SayUnixTime( |CET| m) ; b
exten => 9,n,SayUnixTime( |CET| Y)
exten => 9,n,Wait(1)
exten => 9,n,SayUnixTime( |CET| k) ; Stunde
exten => 9,n,Playback(oclock)
exten => 9,n,SayUnixTime( |CET| M) ; Minute
exten => 9,n,Playback(minutes)
exten => 9,n,SayUnixTime( |CET| S) ; Sekunde
exten => 9,n,Wait(1)
exten => 9,n,goto(9,1)
 
Ansage ist falsch

Vermutlich hast Du mich falsch verstanden.

Das Asterisk Script ist bei mir ok und funktioniert auch. Die Sprachansage ist falsch.

Ich habe die Sounds wie oben beschrieben ersetzt und bekomme nun mit der Code:

Jetzt um 19:37 (beachte Sieben und dreisig)

Die Ansage:

Mittwoch

8tens
10tens
2Tausend
8
19 Uhr 30 Minuten
 
Kostenlos!

Neueste Beiträge

Statistik des Forums

Themen
248,890
Beiträge
2,304,189
Mitglieder
378,576
Neuestes Mitglied
densen420