Asterisk und Timeserver

ploieel

Aktives Mitglied
Mitglied seit
13 Mrz 2005
Beiträge
1,877
Punkte für Reaktionen
24
Punkte
38
Hallo alle;
ich habe hier am Board an anderer Stelle

http://www.ip-phone-forum.de/showthread.php?t=92512

mein Problem geschildert, meine aber nun, dass es vielleicht hier besser aufgehoben ist.

Ich möchte gern, dass mein Asterisk die Lokal-Zeit des Fli4L verwendet (MEZ bzw. MESZ), und nicht die UTC-Zeit des BIOS des Fli4L-Routers.

Konkret möchte ich nach wie vor mittels chrony bzw. time die Uhrzeit des Routers mit einem Zeitserver im Internet synchron halten und im Weiteren dann meine Clients im LAN mit der Uhrzeit des Routers synchronisieren. Das klappt ja auch mit imonc sehr gut.

Das Problem besteht nun darin, dass Asterisk die BIOS-Zeit, also UTC, des Routers verwendet, Fli4L aber aus dieser UTC die MEZ bzw. MESZ bereitstellt, so wie ich es für den imonc und die Synchronisation des LAN brauche. Asterisk hängt also im Winter immer eine Stunde und im Sommer zwei Stunden hinter MEZ bzw. MESZ her.

Kann man da was machen, und wenn ja, wie? Ich glaube, man könnte im Fli4L die Zeitzone auf UTC stellen, dann im BIOS einfach die Lokalzeit einstellen und somit Asterisk vorgaukeln, es würde die Lokalzeit verwenden. Oder gibt es im Asterisk eine Einstellung, wo man die Zeitzone an MEZ bzw. MESZ anpassen kann? Jedenfalls traue ich mich an die Zeitzoneneinstellung im Fli4L nicht so richtig heran.

Vielleicht weiß ja jemand etwas darüber, ich bin für jeden Tipp (und auch Testvorschlag) dankbar.
 
Hallo ploieel,

ich weiss zwar nicht wie fli4l die Zeitzonenkonfiguration handelt, vielleicht helfen dir aber meine Hinweise wie das unter UNIX Systemen normalerweise gehandhabt wird.

1. Die Uhr im BIOS läuft immer als UTC (Ausnahme: Dual Boot mit Windows)

2. In /etc gibt es eine Datei bzw. einen Symlink namens localtime. Die ist eine Kopie von, bzw. verlinkt /usr/share/zoneinfo/Europe/Berlin oder auch /usr/share/zoneinfo/posix/Europe/Berlin bzw. /usr/share/zoneinfo/right/Europe/Berlin.

Das wars dann schon auch. Ich gehe aber davon aus, dass fli4l das anders bewerkstelligt, immerhin ist /usr/share/zoneinfo über 5Mb gross. Die Datei /usr/share/zoneinfo/Europe/Berlin hingegen ist gerade mal 4k und wenn du diese von einem anderen System nach /etc/localtime kopierst, solltest du, was Asterisk anbelangt, die korrekte Uhrzeit bekommen.

Falls du keine Möglichkeit hast an diese Datei zu kommen, kann ich sie dir gerne bereitstellen.
 
Ich hab mich nun auch nochmal mit dem Thema befasst - Hast Du eigentlich schonmal versucht, die TimeZone in Deinem "SayUnixTime()" mitzugeben ? Da kann man das doch als Parameter mitgeben. Und in Deinen Dial-Plan BEispielen war der Parameter immer leer.

voip-info.org schrieb:
Synopsis
Says a date and/or time to the caller.

Syntax
SayUnixTime(unixtime,timezone,format)

Description
Uses some of the sound files stored in /var/lib/asterisk/sounds to construct a phrase saying the specified date and/or time in the specified format.

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.

timezone specifies the timezone that the unixtime is in. If this parameter is omitted, the default value is the time zone of the computer. It sould be specified as a unix timezone (see your /usr/share/zoneinfo directory for a list of timezones known to your computer), for example, "Pacific/Samoa".

format is a string specifying in what way to say the date/time. It uses a format based on the strftime(3) unix system call, if you're familiar with that. If omitted, the default value is:

ABdY 'digits/at' IMp

This would result in a phrase like this: "Monday January twenty first 2003 at seven fifty two p m". Note that the 'digits/at' part refers to the sound /var/lib/asterisk/sounds/digits/at.gsm, i.e. it is a relative pathname to a sound file.
 
Hallo betateilchen und alle anderen,
ich habe das Zeitansage-Script irgendwo hier am Board vor längerer Zeit mal kopiert und es ist niemals gelaufen. Da es mir nun dank des Kurses gelungen ist, meine extensions.conf grundlegend zu überarbeiten, läuft das Script. Es war aber noch nicht soweit ausgereift, dass darin etwas von einer Zeitzone stand. Ich würde das auch gern einfügen und testen, aber mein englisch ist "very bad", um nicht zu sagen, fast nicht vorhanden.

Ich hänge das Zeitansage-Script der Vollständigkeit halber hier nochmal rein. Vielleicht hat ja jemand einen Vorschlag, wie die Zeitzonen-Zeile in diesem Script lauten könnte.

Code:
[zeitansage]
exten => 99,1,Answer
exten => 99,2,Wait(1)
exten => 99,3,SayUnixTime( | | a)
exten => 99,4,SayUnixTime( | | k)
exten => 99,5,Playback(oclock)
exten => 99,6,SayUnixTime( | | M)
exten => 99,7,Playback(vm-goodbye)
exten => 99,8,Hangup

@rbaer:
Es gibt unter opt/etc ein File mit Namen "adjtime"; ich würde das mal als adjusttime ansehen.

Sein Inhalt ist zur Zeit:

Code:
0.000000 0 0.000000
0
UTC

Vielleicht sollte man hier etwas herumschrauben?

Danke für eure Geduld und für die Hinweise.
 
Probiere doch mal folgendes:

Code:
[zeitansage]
exten => 99,1,Answer
exten => 99,2,Wait(1)
exten => 99,3,SayUnixTime,|CET|a
exten => 99,4,SayUnixTime,|CET|k
exten => 99,5,Playback(oclock)
exten => 99,6,SayUnixTime,|CET|M
exten => 99,7,Playback(vm-goodbye)
exten => 99,8,Hangup
 
So sollte es unter fli4l funktionieren:

Code:
;------------------------------------------------
; Zeitansage
;------------------------------------------------
exten => 99#,1,Set(LANGUAGE()=de)
exten => 99#,2,Set(MEZ=$[${EPOCH} + 3600])
exten => 99#,3,Answer
exten => 99#,4,Wait(1)
exten => 99#,5,SayUnixTime(${MEZ}||a)
exten => 99#,6,SayUnixTime(${MEZ}||k)
exten => 99#,7,SayUnixTime(${MEZ}||M)
exten => 99#,8,Wait(1)
exten => 99#,9,Playback(vm-goodbye)
exten => 99#,10,Hangup
 
@netview:

Deine Version bringt am ssh folgende Fehlermeldung hervor, die sich in einem Besetztzeichen äußert:

Code:
Connected to Asterisk 1.0.7-BRIstuffed-0.2.0-RC8 currently running on fli4l (pid                                               = 5458)
fli4l*CLI> set verbose 3
Verbosity was 0 and is now 3
    -- Accepting overlap voice call from '25' to '<unspecified>' on channel 0/2, span 1
    -- Starting simple switch on 'Zap/2-1'
Jan 18 21:34:52 WARNING[6167]: pbx.c:1292 pbx_extension_helper: No application 'Set' for extension (default, 99, 1)
  == Spawn extension (default, 99, 1) exited non-zero on 'Zap/2-1'
    -- Hungup 'Zap/2-1'
fli4l*CLI>

Asterisk kann an dieser Stelle mit dem set nicht umgehen.
Hast Du vielleicht noch eine andere Idee? In der Zwischenzeit werde ich noch betateilchens script testen...
 
Zuletzt bearbeitet:
ploieel schrieb:
@netview:
Deine Version bringt am ssh folgende Fehlermeldung hervor, die sich in einem Besetztzeichen äußert:
Asterisk kann an dieser Stele mit dem set nicht umgehen.

Dann probiers mal mit SetVar()
 
Hallo ploieel,

das liegt daran, dass du noch eine ältere asterisk-Version hast (< 1.2.0), sodass die syntax etwas anders ist:
Code:
;------------------------------------------------
; Zeitansage
;------------------------------------------------
exten => 99#,1,SetLanguage(de)
exten => 99#,2,SetVar(MEZ=${EPOCH} + 3600)
exten => 99#,3,Answer
exten => 99#,4,Wait(1)
exten => 99#,5,SayUnixTime(${MEZ}||a)
exten => 99#,6,SayUnixTime(${MEZ}||k)
exten => 99#,7,SayUnixTime(${MEZ}||M)
exten => 99#,8,Wait(1)
exten => 99#,9,Playback(vm-goodbye)
exten => 99#,10,Hangup

sollte so gehen ?!
 
@betateilchen:
Asterisk sagt nach Deinem script die UTC-Zeit an, wie sie im BIOS eingestellt ist. Jetzt ist das geänderte script von Netview zum Test dran...

Sorry; es ist eine kleine Spielerei mit Asterisk, das die Zeitansage richtig geht. Aber ich könnte mir auch vorstellen, dass es dafür "richtige" Anwendungen geben könnte, für die eine korrekte Ausgabe der Zeit in der richtigen Zeitzone von Bedeutung sein kann. Z. B. könnte man in einem Hotel den Weckdienst vom Asterisk übernehmen lassen o. ä.
 
ploieel schrieb:
Sorry; es ist eine kleine Spielerei mit Asterisk, das die Zeitansage richtig geht. Aber ich könnte mir auch vorstellen, dass es dafür "richtige" Anwendungen geben könnte, für die eine korrekte Ausgabe der Zeit in der richtigen Zeitzone von Bedeutung sein kann. Z. B. könnte man in einem Hotel den Weckdienst vom Asterisk übernehmen lassen o. ä.

Das ist schon richtig - allerdings sagt mir mein Code-Schnipsel oben die Uhrzeit korrekt an - obwohl im BIOS die Uhrzeit in UTC abgelegt ist.
 
@betateilchen

Das Problem beim fli4l ist, dass es kein /usr/share/zoneinfo-Verzeichnis gibt und fli4l per default nur die timezone UTC kennt. Du kannst daher unter SayUnixTime
alle möglichen timezones spezifizieren - sie haben keinerlei Wirkung.
 
@ netview und betateilchen:
Respekt; das script von Netview hat jetzt funktioniert, es wird die korrekte MEZ angesagt. Ich zweifele nicht im geringsten daran, dass es mit dem script von betateilchen mit einem neueren Asterisk genau so funktionieren wird.

Andere Anwendungsfälle könnten beispielsweise sein:
- eine Tag- und Nachtsteuerung des Asterisk,
- eine sog. Apothekerschaltung
- zeitgesteuerte Anwendungen, wie das scharf- und ausschalten von Alarmanlagen per Telefon

ich denke, das ihr beiden und auch die vielen anderen Asterisk-Experten hier sich noch viele viele weitere Anwendungsfälle vorstellen können, für die eine korrekte Ausgabe der Zeit wichtig ist. Nicht zuletzt die Gesprächsdatenerfassung...

Danke ... und ich mache mal hier ein "gelöst" in die Überschrift.
 
kann fli4l eine vorhandene /etc/TZ auswerten ?
 
betateilchen schrieb:
kann fli4l eine vorhandene /etc/TZ auswerten ?

Ich denke nein :-(

Unter /etc/TZ steht:

MEZ-1MESZ,M3.5.0,M10.5.0

Ich habe auch diese Werte mit SayUnixTime ausprobiert - erfolglos!
 
Immernoch Problem:
Asterisk scheint sich weder nach der BIOS-Zeit des Router-Rechners noch nach der Lokal-Zeit des Fli4L zu richten.

Nacheinem restart des Routers sagt Asterisk schon die korrekte MEZ an, dann nach einiger Zeit geht die Asterisk-Zeit "nach", nach Stunden immer weiter "nach", dann nach 24 Stunden ist sie wieder auf UTC. Und das opt-chrony oder opt-time stellt die BIOS Uhr immer wieder nach UTC. Trotzdem ist im imonc immer die korrekte Zeit zum synchronisieren angezeigt, ist schon seltsam.

"date" an der Konsole zeigt MEZ, imonc lässt korrektes synchronisieren zu, doch Asterisk hängt immer eine Stunde hinterher...

Hat noch jemand eine Idee?
 
Bei mir geht es einwandfrei. Allerdings macht mich stutzig, dass du opt_chrony und opt_time erwähnst. Beide opts dürfen nicht zusammen laufen (entweder chrony oder time)!

Code:
;------------------------------------------------
; Zeitansage
;------------------------------------------------
exten => 99#,1,Set(LANGUAGE()=de)
exten => 99#,2,Set(MEZ=$[${EPOCH} + 3600])
exten => 99#,3,Answer
exten => 99#,4,Wait(1)
exten => 99#,5,SayUnixTime(${MEZ}||k)
exten => 99#,6,SayUnixTime(${MEZ}||M)
exten => 99#,7,SayUnixTime(${MEZ}||S)
exten => 99#,8,Wait(1)
exten => 99#,9,SayUnixTime(${MEZ}||a)
exten => 99#,10,SayUnixTime(${MEZ}||d)
exten => 99#,11,SayUnixTime(${MEZ}||m) ; b
exten => 99#,12,SayUnixTime(${MEZ}||Y)
exten => 99#,13,Wait(1)
exten => 99#,14,Playback(beep)
exten => 99#,15,Goto(1)

Empfehlung: opt_time rauswerfen (gibt's auch in 3.0.0 nicht mehr)!!!
 
@betateilchen: YEPP!! Schlage tot die Büchse!!! :) :)

@Netview: ich verwende entweder opt-chrone ODER opt-time, nicht beides gleichzeitig. Soweit ist mir das schon klar, zumal ja auch bei dem Upload des Fli4l das schon angemeckert wird; das Erstellen des Uploads geht dann schon garnicht. :)

O.K. nur noch zwei oder drei Unklarkeiten bei mir:

Ich habe [zeitansage] als peer eingebunden, auch includiert unter [default], kann das so funktionieren? Und was ist unter dem # bei den 99# zu verstehen? Bei mir möchte ich nur die 99 haben.

@beide und alle: wenn ich das "Problem" heute abend nicht totschlage, dann ist es das gewesen. Ich möchte Euch nicht weiter nerven mit derartigen Kleinigkeiten. Vielen Dank für Eure Geduld. Ich habe eben gedacht, es wäre wirklich eine Kleinigkeit.
 

Neueste Beiträge

Statistik des Forums

Themen
244,695
Beiträge
2,216,686
Mitglieder
371,314
Neuestes Mitglied
Gjorstn
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.