[Problem] Zeitsteuerung und Funktionssteuerung im Dialplan klappt nicht

Diani

Neuer User
Mitglied seit
20 Dez 2016
Beiträge
26
Punkte für Reaktionen
0
Punkte
1
Hallo,

ich nutze Asterisk 14.2 und möchte einen Dialplan entwickeln, der zu unterschiedlichen Zeiten verschiedene Voice-Messages zur Verfügung stellen kann. Und da hier mehrere Telefonnummern abgearbeitet werden sollen, soll der Dialplan auch erkennen, ob eine Rufnummer gerade abgemeldet und dann wieder zeitgesteuert die passende Voice-Message abspielen. Optimal wäre bei der Gelegenheit auch, wenn eine besetzte Leitung (BUSY) erkannt wird und wieder separat beantwortet werden kann.
Ich habe mir das einmal bei http://das-asterisk-buch.de/1.6/voicemail-beispiele.html abgeguckt und bei mir versucht umzusetzen:

Code:
[general]
static=yes
writeprotect=yes
autofallthrough=yes
extenpatternmatchnew=no
clearglobalvars=no
userscontext=unspecified

; Zeiten für Anrufbeantworter
include => morning-closed,06:00-7:59,mon-fri;*,*
include => morning,08:00-9:59,mon-fri;*,*
include => day,10:00-14:59,mon-fri;*,*
include => evening,15:00-17:59,mon-fri;*,*
include => evening-closed,18:00-20:59,mon-fri;*,*

[unspecified]
exten => _X.,1,Answer()
exten => _X.,2,Verbose(D E F A U L T ==> ${CALLERID(num)} kam um ${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)} in UNSPECIFIED an, als er versuchte die Nummer ${EXTEN} anzurufen.)
exten => _X.,3,Hangup()

[internalsip]
exten => contact_name1,1,Dial(PJSIP/contact_name1)
exten => contact_name2,1,Dial(PJSIP/contact_name2)

exten => 8888,1,Answer()
exten => 8888,n,Wait(2)
exten => 8888,n,Playback(Closed-Abend)
exten => 8888,n,Playtones(info)
exten => 8888,n,Wait(5)
exten => 8888,n,StopPlaytones
exten => 8888,n,Hangup()

exten => 8882,1,Answer()
exten => 8882,n,Playback(Tag)
exten => 8882,n,Playtones(record)
exten => 8882,n,VoiceMail(3112@Diani,s)

exten => 6500,1,Answer(500)
exten => 6500,n,VoiceMailMain(@Diani)
;exten => 6500,n,VoiceMailMain(${CALLERID(num)})

exten => _+49ZXX!.,1,Dial(PJSIP/telekom_63112_out/sip:0${EXTEN:3}@tel.t-online.de,60)
exten => _+49ZXX!.,n,Hangup()

exten => _+X.,1,Hangup() 
exten => _00X.,1,Hangup() 

exten => _0Z.,1,Dial(PJSIP/telekom_63112_out/sip:${EXTEN}@tel.t-online.de,60)
exten => _0Z.,n,Hangup() 

exten => _Z.,1,Dial(PJSIP/telekom_63112_out/sip:Ortsnetzkennzahl-mit-0${EXTEN}@tel.t-online.de,60)
exten => _Z.,n,Hangup() 

exten => 110,1,Dial(PJSIP/telekom_63112_out/sip:[email protected],60)
exten => 110,n,Hangup() 
exten => 112,1,Dial(PJSIP/telekom_63112_out/sip:[email protected],60)
exten => 112,n,Hangup()

[telekom_63112_in] 
include => evening
include => day

[day]
exten => 03089885880,1,Dial(PJSIP/63112,20&PJSIP/6001,20)
exten => 03089885880,n,Goto(03089885880-${DAILSTATUS},1)
exten => 03089885880,n,NoOp(Dial-Status: ${DAILSTATUS})
exten => 03089885880-NOANSWER,n,Playback(Tag)
exten => 03089885880-NOANSWER,n,Playtones(record)
exten => 03089885880-NOANSWER,n,VoiceMail(3112@Diani,s)
exten => 03089885880-BUSY,n,Playback(busy-pls-hold)
exten => 03089885880-ANSWER,n,Hangup()
exten => 03089885880,n,Playback(lTag)
exten => 03089885880,n,VoiceMail(3112@Diani,s)
exten => 03089885880,n,Hangup()


[evening]
exten => 03089885880,1,Dial(PJSIP/63112,2&PJSIP/6001,2)
exten => 03089885880,n,Set(CALLERID=${EXTEN})
exten => 03089885880,n,NoOp(Caller-ID: ${CALLERID})
exten => 03089885880,n,Playback(Closed-Generell)
exten => 03089885880,n,VoiceMail(3112@Diani,s)
exten => 03089885880,n,Hangup()

Bei "telekom_63112_in" wird allerdings immer die erste Include-Anweisung genommen, egal welche Uhrzeit wir haben. Und bei "[day]" hatte ich versucht den DIALSTATUS dazu zu benutzen, um das richtige Verhalten anzusteuern. Das klappt allerdings nicht.

Meine Fragen sind somit:
Wie kann ich Include so nutzen, dass eine Zeitsteuerung möglich wird?
Wie kann ich den Status "BUSY", "CHANUNAVAIL" (nicht angemeldet) so nutzen, dass situationsgesteuertes Verhalten möglich ist?
Ist das bei Asterisk 14 noch genauso möglich wie in dem Asterisk-Buch für 1.4 und 1.6 dargestellt?

Grüße

Diani
 
Moin


Rechtschreibfehler und Logik
[day]
1. ${DAILSTATUS} gibt es nur wenn du es Set()est
2. Das NoOp() direkt nach Dial() ausführen verrät den ${DIALSTATUS}
 
Was koy damit sagen will, Du hast Dich vertippt, DAILSTATUS muss DIALSTATUS heißen. Das Noop wirst Du nicht erleben, weil davor mit Goto weg gesprungen wird.

Das zweite Problem sind die Prios, Du hast überall nur n, aber keine 1 davor. Zum Beispiel

Code:
exten => 03089885880-NOANSWER,[B][COLOR=#ff0000]1[/COLOR][/B],Playback(Tag)
exten => 03089885880-NOANSWER,n,Playtones(record)
...

Die zeitgesteuerten includes gehören nicht ins general, sondern dorthin in den Dialplan, wo sie ausgeführt werden sollen, also zB. in Deinen telekom-in Context.
 
Weil...
FALSCH
Code:
exten => 03089885880-NOANSWER,n,Playback(Tag)
...eine eigenständige Extension darstellt.

RICHTIG
(Benutze same wenn du die gleiche Extension meinst/willst)
Code:
same => n(NOANSWER),Playback(Tag)
...dann gehört das Label in die runden Klammern von: n

Das Goto() sieht dann innerhalb der selben Extension so aus...
Code:
same => n,Goto(${DIALSTATUS})
 
Vielen Dank,

das mit dem Rechtschreibfehler stimmt, habe ich partout nicht gesehen, und gehofen hat Dein Hinweis auf die Platzierung der Includes. Das funktioniert jetzt soweit.
Das zweite Problem sind die Prios, Du hast überall nur n, aber keine 1 davor. Zum Beispiel

Code:
exten => 03089885880-NOANSWER,[B][COLOR=#ff0000]1[/COLOR][/B],Playback(Tag)
exten => 03089885880-NOANSWER,n,Playtones(record)
...
Was hat es sich mit den Prioritäten aus sich? Ich meine gelesen zu haben - finde es jetzt nur nicht -, dass diese nicht mehr so wichtig seien. Nur die erste Zeile müsste immer eine "1" beinhalten, danach könne man durchaus "n" nutzen.
 
Die Antwort hat koy bereits vorweg genommen. Das n heißt "eins mehr als die Zeile davor", das funktioniert aber nur innerhalb einer exten. Da 030987654-NOANSWER nicht das gleiche ist wie 030987654 musst Du wieder mit 1 anfangen.

koy, mit Labels ist eigentlich ganz geschickt, ich bin ja sowieso ein Fan von Labels, man muss nur aufpassen immer ein HangUp() oder ähnliches am Ende eines jeden Blocks zu haben. Sonst macht Asterisk womöglich mit BUSY weiter, nachdem er mit NOANSWER durch ist. Außerdem muss man wirklich für jeden erdenklichen DIALSTATUS ein Label definiert haben, sonst bringt das Goto einen Fehler.
 
@rentier-s: Genau, für das "flowcontrol" ist der Asteriskextensioncodeschreiber selbstverantwortlich.
Wenn dies verstanden ist, ists auch eine Stärke von Asterisk, ich mach dann meist sowas...
Code:
same  => n,Goto(exit)
...und in exit dann, wenn es so gewünscht ist...
Code:
same  => n(exit),Hangup()
 
Okay, besten Dank,
ich fange an zu kapieren.
 
Diani, ich hoffe es stört Dich nicht, wenn wir hier ein wenig fachsimpeln, geht schließlich um das Thema DIALSTATUS handling, vielleicht kannst Du was davon brauchen.

Ich persönlich finde same => n in Kombination mit Sprungmarken deutlich Blondinenkompatibler ;-) Wobei ich gestehen muss, meine Codes gleichen eher Ascii-Gemälden, da muss alles sauber mit Leerzeilen/-zeichen ausgerichtet sein. Kommt halt darauf an, wie der Dialplan aufgebaut ist, wenn man viele Subroutinen (ehemals Macro) nutzt machen Sprungmarken nicht viel Sinn, weil man da ja doch immer die passende exten anspringen muss.

So ein generelles Sammel-Hangup kann auch wieder schlecht sein, je nachdem was man vorher treibt. In manchen Fällen möchte/sollte man den passenden hangupcause mitschicken, dafür braucht man für jeden Dialstatus ein eigenes Hangup(XY).
 
Moin

Genau Makro-, oder GoSuB()s machen, im Gegensatz zum GoTo(), Returns()s, die dann entsprechend ausgewertet werden können/müssen. ;) (weiah)

@Diani: Die an Basic anmutende Durnummerierung der Prioritäten müssen nicht immer mit 1 beginnen.
Beispiel: exten => _X.,777,NoOp(3xSieben)

Basic: Mit Goto kann immer zu einer Zeilennummer gesprungen werde
Beispiel, Asterisk: Goto(2)
Wenn: exten => _X.,1(start),Verbose(Hallo Welt)
...wird die unwichtige 1 erst gar nicht ausgeführt.
 
Zuletzt bearbeitet:
Diani, ich hoffe es stört Dich nicht, wenn wir hier ein wenig fachsimpeln, geht schließlich um das Thema DIALSTATUS handling, vielleicht kannst Du was davon brauchen.

Ich habe grundsätzlich nichts dagegen, eben weil ich, wie Du selbst sagst, davon profitiere. Ich würde es allerdings begrüßen, wenn Ihr das mit Beispielen, Howtos untermalen könntet. Ich habe nur dieses Asterisk-Buch von 2009, aus dem habe ich diesen Code der extension.conf. Ich weiß, dass das hoffnungslos veraltet ist.

Trotzdem, wenn wir hier in einer entspannten Plauderrunde sind, dann schildere ich mal, was ich vorhabe:

Ich habe 3 Festnetznummern (1 Privat, 1 Büro und 1 Büro-Fax), den Asterisk 14.2 auf RaspberryPi3 mit Debian Jessie, ein OpenStage40-Telefon und ein Zoiper-Client auf KDE-Desktop.
Jetzt möchte ich, dass Voicemail anspringt, wenn eine der beiden Rufnummern nicht am Telefon angemeldet ist - ich nehme an das ist dann "CHANUNAVAIL". Leichter dürfte es sein, dass Voicemail aktiv wird, wenn der Dialstatus "BUSY" ist.

Nächstes Ziel wäre das automatische Ab-/Anmelden meines Openstage40 am Asterisk. Abmelden mit der Ziffernfolge "*0*" und Anmelden mit "03112*" oder "09517*". Ich nehme an, dass ich im Dialplan diesen Ziffernfolgen ein Script zuweise, das dann bei seiner Ausführung dem Openstage40 den Benutzer, Passwort und Rufnummer in den Speicher schreibt.
Wenn ich das schaffen sollte, wäre ich schon mal sehr happy. Und dann möchte ich noch HylaFax an Asterisk anbinden.

Vielleicht könnt Ihr ja auch darüber etwas plaudern. Und Howtos, Beispiele für Dailpläne wäre ebenfalls toll. Wie gesagt das Buch ist ist nicht so berauschend.

Grüße

Diani
 
Zuletzt bearbeitet:
Jetzt möchte ich, dass Voicemail anspringt, wenn eine der beiden Rufnummern nicht am Telefon angemeldet ist - ich nehme an das ist dann "CHANUNAVAIL".

In Deinem Code oben rufst Du zwei Nebenstellen parallel an. Wenn eine davon nicht erreichbar ist, die andere aber schon, wird dieses Telefon klingeln, unabhängig vom Status des anderen. Verstehe ich das richtig, dass Du sofort auf die Voicemail möchtest, sobald eine von beiden Nebenstellen nicht erreichbar wäre? Dazu musst Du nämlich vor dem Dial den DEVICE_STATE beider Nebenstellen abfragen.

Code:
[day]
exten => 098764321,1,GotoIf($[${DEVICE_STATE(PJSIP/63112)}=UNAVAILABLE]?unavail)
 same => n,GotoIf($[${DEVICE_STATE(PJSIP/6001)}=UNAVAILABLE]?unavail)
 same => n,Dial(PJSIP/63112,20&PJSIP/6001,20)
 
In Deinem Code oben rufst Du zwei Nebenstellen parallel an.
Das ist richtig. Die Eine ist das HW-Telefon und das Andere der SIP-Client auf dem Desktop. Hier werde ich nur eine Rufnummer klingeln lassen. Ich habe aber auch noch zwei weitere Rufnummern, von denen eine privat ist. Ein HW-Telefon mit zwei Rufnummern (Privat und Büro). Also wird immer eine Nummer unerreichbar als Status liefern, je nachdem welche Nummer gerade über das Telefon registriert ist.

Da hilft mir Dein Code weiter, das Ganze zu verstehen. Vielen Dank dafür :)
 
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.