Voicemailbox springt nicht an, will aber Fernabfrage machen können

ploieel

Aktives Mitglied
Mitglied seit
13 Mrz 2005
Beiträge
1,898
Punkte für Reaktionen
28
Punkte
48
Hallo alle, vielleicht hat ja einer (oder mehrere) von Euch einen Tipp für mich:

Ich möchte aus dem Festnetz meine Voicemailbox auf dem Asterisk abfragen können. Aus diesem Grunde sieht meine extensions.conf diesbezüglich folgendermaßen aus:

Code:
[external-ISDN_eingehend]
exten => 3312,1,SetGlobalVar(FOO=3312)
exten => 3312,2,Dial,ZAP/g1/111|15|tr
exten => 3312,3,Goto,r-${DIALSTATUS}|1
exten => _r-.,1,Goto,r-NOANSWER|1
exten => a,1,voicemailmain
exten => a,2,hangup

Hier beißen sich die 1. Zeile mit der 4. Zeile. Das sieht dann folgendermaßen aus: (Asterisk hängt sich anscheinend in einer Schleife auf)

Code:
 -- Goto (external-ISDN_eingehend,r-NOANSWER,1)
    -- Executing Goto("CAPI/ISDN1#02/3312-d", "r-NOANSWER|1") in new stack
    -- Goto (external-ISDN_eingehend,r-NOANSWER,1)
    -- Executing Goto("CAPI/ISDN1#02/3312-d", "r-NOANSWER|1") in new stack
    -- Goto (external-ISDN_eingehend,r-NOANSWER,1)
    -- Executing Goto("CAPI/ISDN1#02/3312-d", "r-NOANSWER|1") in new stack
usw. usw.

Nehme ich die vierte Zeile raus, weil diese ja normalerweise nicht vorhanden sein darf, passiert folgendes:

Code:
 == ISDN1#02: Incoming call '162xxxxxxx' -> '3312'
    -- Executing SetGlobalVar("CAPI/ISDN1#02/3312-0", "FOO=3312") in new stack
  == Setting global variable 'FOO' to '3312'
    -- Executing Dial("CAPI/ISDN1#02/3312-0", "ZAP/g1/111|15|tr") in new stack
    -- Requested transfer capability: 0x00 - SPEECH
    -- Called g1/111
         == Primary D-Channel on span 1 up for TEI 64
    -- Zap/1-1 is ringing
    -- Nobody picked up in 15000 ms
    -- Hungup 'Zap/1-1'
    -- Executing Goto("CAPI/ISDN1#02/3312-0", "r-NOANSWER|1") in new stack
    -- Goto (external-ISDN_eingehend,r-NOANSWER,1)
Jun  1 18:34:15 WARNING[6300]: pbx.c:2378 __ast_pbx_run: Channel 'CAPI/ISDN1#02/3312-0' sent into invalid extension 'r-NOANSWER' in context 'external-ISDN_eingehend', but no invalid handler
  == ISDN1#02: CAPI Hangingup for PLCI=0x101 in state 1
fli4l*CLI>

Kann man da was tun, und wenn ja, was?

Viele Grüße
Günter
 
ploieel schrieb:
Kann man da was tun, und wenn ja, was?

Wie wäre es mal mit nachdenken?

Ich helf Dir mal beim Denken...

Code:
exten => _r-.,1,Goto,r-NOANSWER|1

Was passiert da eigentlich?

Code:
exten => _r-.

Das ist ein Pattern, das besagt, daß ALLES was nach "r-" kommt, verarbeitet werden soll

Code:
Goto,r-NOANSWER|1

Das ist die Aktion, die ausgeführt werden soll, egal wie die mit "r-" beginnende und IRGENDWIE aussehende extension aussieht. Es soll also nach r-NOANSWER gesprungen und dort die prio 1 ausgeführt werden

Du springst also nach jedem Anruf in diese extension und von dort aus nach r-NOANSWER|1

Das heißt doch nix weiter, als daß sich die extension _r-. permanent selbst aufruft, da es die einzige Extension ist, die es überhaupt zu Deinem Goto gibt.

Denn _r-. beinhaltet doch logischerweise auch r-NOANSWER!

xWas Du eigentlich willst, ist doch was ganz anderes...

Du möchtest nach einem nicht beantworteten Anruf irgendwas tun.

Also mußt das Ganze so aussehen:

Code:
[external-ISDN_eingehend]
exten => 3312,1,SetGlobalVar(FOO=3312)
exten => 3312,2,Dial,ZAP/g1/111|15|tr
exten => 3312,3,Goto,r-${DIALSTATUS}|1
exten => r-[COLOR="Red"]NOANSWER[/COLOR],1,[COLOR="Red"]mache,irgendwas[/COLOR]
exten => a,1,voicemailmain
exten => a,2,hangup


x
Mich interessiert aber mal was ganz anderes.

Woher um alles in der Welt kommt dieses verdammte
Code:
exten => _r-.
:?:


Das begegnet mir in letzter Zeit hier im Forum immer öfter, und in mehr als 95% aller Fälle ist es absolut falsch (und sinnlos) eingesetzt, schafft dafür aber jede Menge Verwirrung und Probleme.
 
betateilchen schrieb:
Woher um alles in der Welt kommt dieses verdammte
Code:
exten => _r-.
:?:

Wenn man sicherstellen kann das man alle möglichen Werte von ${DIALSTATUS} für jetzt und die Zukunft kennt kann man darauf verzichten, ansonsten definiert man einen default für diese Werte.

Ansonsten kommt es zu einem ungültigen GoTo Befehl und man springt zur i Extension.
 
Ich weiß was das _r-. bedeutet, und nach der Bedeutung hat auch niemand gefragt :rolleyes:
Aber ich weiß mal wieder nicht, was Du mit Deiner überflüssigen Ausführung auf meine einfache, klar formulierte Frage ("Woher kommt...") eigentlich zum Ausdruck bringen willst :noidea:
 
betateilchen schrieb:
Ich weiß was das _r-. bedeutet

Schön, dann ist Dir ja klar das es zu jeder ordentlichen Auswertung von ${DIALSTATUS} mit GOTO Pflicht ist und nicht Zitat: "schafft dafür aber jede Menge Verwirrung und Probleme".
 
@betateilchen:
ich hatte mal in dem irc-Channel asterisk.de gelesen, dass man auf diese Weise die Voicemailbox von extern anhören könne, wenn man die *-Taste während der Ansage der Voicemailbox drücken würde:

Code:
exten => _r-.,1,Goto,r-NOANSWER|1
exten => a,1,voicemailmain
exten => a,2,hangup

Das hatte glaube ich auch schon funktioniert, aber leider nur für diese einzige Mailbox. Durch das Einführen der globalen Variablen funktionieren nun alle anderen Mailboxen, was ja auch gut und richtig ist.

Insgesamt aber bin ich noch nicht weiter gekommen. Asterisk bleibt nicht bei

exten => r-NOANSWER,1,Goto,a,voicemailmain (exten => r-NOANSWER,1,mache,irgendwas)

stehen und lässt die Voicemailbox anhören, sondern macht folgendes:
es klingelt 4 mal und das Ganze sieht so aus:

Code:
 == ISDN1#02: Incoming call '162xxxxxxx' -> '3312'
    -- Executing SetGlobalVar("CAPI/ISDN1#02/3312-0", "FOO=3312") in new stack
  == Setting global variable 'FOO' to '3312'
    -- Executing Dial("CAPI/ISDN1#02/3312-0", "ZAP/g1/111|15|r") in new stack
    -- Requested transfer capability: 0x00 - SPEECH
    -- Called g1/111
         == Primary D-Channel on span 1 up for TEI 64
    -- Channel 0/1, span 1 got hangup, cause 18
    -- Hungup 'Zap/1-1'
  == Everyone is busy/congested at this time (1:0/0/1)
    -- Executing Goto("CAPI/ISDN1#02/3312-0", "r-CHANUNAVAIL|1") in new stack
    -- Goto (external-ISDN_eingehend,r-CHANUNAVAIL,1)
Jun  1 21:31:35 WARNING[30674]: pbx.c:2378 __ast_pbx_run: Channel 'CAPI/ISDN1#02/3312-0' sent into invalid extension 'r-CHANUNAVAIL' in context 'external-ISDN_eingehend', but no invalid handler
  == ISDN1#02: CAPI Hangingup for PLCI=0x101 in state 1
fli4l*CLI>

wobei der komplette Context im Augenblick so aussieht:

Code:
[external-ISDN_eingehend]
exten => 3312,1,SetGlobalVar(FOO=3312)
exten => 3312,2,Dial,ZAP/g1/111|15|r
exten => 3312,3,Goto,r-${DIALSTATUS}|1
exten => r-NOANSWER,1,Goto,a,voicemailmain
exten => a,1,voicemailmain
exten => a,2,hangup

Asterisk arbeitet im Context Dialstatus die NOANSWER und BUSY anscheinend nicht ab, springt dort nach CHANUNAVAIL, was aber im ISDN-Context nicht enthalten ist.

Gibts bitte noch einen Tipp? Kann doch jetzt nur noch eine Kleinigkeit sein, die ich nicht weiß.
 
@Thomas007

Pflicht ist das überhaupt nicht, denn wie Du selbst schreibst, springt man beim Fehlen einfach in die "i" extension. Also kann ich den Fehlerfall auch einfach in "i" abfangen.

Und der Thread ist doch der eindeutige Beweis dafür, daß _r-. zur Verwirrung beiträgt und Probleme schafft.


x
Code:
exten => r-NOANSWER,1,Goto,a,voicemailmain

ist völlig falsche Syntax, deshalb wird der Befehl einfach ignoriert. Du solltest mal die Syntax für den Goto Befehl nachlesen.

Und BUSY wird nicht abgefangen, weil Du keine Abhandlung für den Fall

Code:
exten => r-BUSY

eingebaut hast.

Die Verzweigung zur Mailbox über die extension a hat übrigens nichts mit Deiner "r-IRGENDWAS" Konstruktion zu tun. Da hast du irgendwas mißverstanden.
 
Zuletzt bearbeitet:
betateilchen schrieb:
@Thomas007

Pflicht ist das überhaupt nicht, denn wie Du selbst schreibst, springt man beim Fehlen einfach in die "i" extension. Also kann ich den Fehlerfall auch einfach in "i" abfangen.

Das ist schlechter Programmierstil.

Ein möglicher ${DIALSTATUS} ist kein Fehler. Ein GOTO Sprung zu einer nicht vorhandene Adresse schon.
Ein einfaches
exten => _r-.,1,NOOP(DIALSTATUS: ${DIALSTATUS})
exten => _r-.,n,HangUp
reicht um den CHANNEL sauber zu beenden.

betateilchen schrieb:
Und der Thread ist doch der eindeutige Beweis dafür, daß _r-. zur Verwirrung beiträgt und Probleme schafft.

Nein, Du hast zwar über Deinem Beispiel gilt nur für "..nicht beantworteten.." in Fett geschrieben, offenbar hat ploieel aber nicht verstanden, dass dieses Beispiel nur für einen einzigen DIALSTATUS funktioniert und für die 8 anderen eben nicht.
 
ein

Code:
exten => i,1,HangUp

beendet einen Channel genauso sauber wie der von Dir vorgeschlagene Weg. Über die i-extension kann ich darüber hinaus gleichzeitig auch noch ganz andere Fehlerursachen abfangen. Deshalb ist es meines Erachtens wichtiger, die extension "i" im Dialplan zu haben als _r-.

Vor allem aber ist die Funktionsweise der Extension "i" für weniger erfahrene Asterisk-User als Dich und mich viel leichter zu verstehen als die Pattern-Konstrukte. Aber Didaktik und Verständnis für die Denkweise unerfahrener User scheint offenbar nicht gerade eine Deiner Stärken zu sein, denn Deine Haarspalterei die Du hier im Thread mit mir betreibst hilft keinem Anfänger wirklich weiter :-Ö
 
OK, habe gelesen:
Goto-Syntax: Goto ([Context|]extension|]priority]

und nähere mich dem Ziel.

Sieht jetzt so aus:

Code:
exten => r-NOANSWER,1,Goto,(DIALSTATUS,r-NOANSWER,1)
exten => r-CHANUNAVAIL,1,Goto,(DIALSTATUS,r-CHANUNAVAIL,1)

und macht nur noch eine Warnung:

Code:
 == ISDN1#02: Incoming call '162xxxxxxx' -> '3312'
    -- Executing SetGlobalVar("CAPI/ISDN1#02/3312-e", "FOO=3312") in new stack
  == Setting global variable 'FOO' to '3312'
    -- Executing Dial("CAPI/ISDN1#02/3312-e", "ZAP/g1/111|15|tr") in new stack
    -- Requested transfer capability: 0x00 - SPEECH
    -- Called g1/111
       
    -- Zap/1-1 is ringing
    -- Nobody picked up in 15000 ms
    -- Hungup 'Zap/1-1'
    -- Executing Goto("CAPI/ISDN1#02/3312-e", "r-NOANSWER|1") in new stack
    -- Goto (external-ISDN_eingehend,r-NOANSWER,1)
    -- Executing Goto("CAPI/ISDN1#02/3312-e", "(DIALSTATUS,r-NOANSWER,1)") in new stack
Jun  1 22:46:25 WARNING[8788]: pbx.c:6563 ast_parseable_goto: Priority '(DIALSTATUS,r-NOANSWER,1)' must be a number > 0, or valid label
  == Spawn extension (external-ISDN_eingehend, r-NOANSWER, 1) exited non-zero on 'CAPI/ISDN1#02/3312-e'
  == ISDN1#02: CAPI Hangingup for PLCI=0x101 in state 1

Eine priority "größer 0" ist doch die "1", und was ist ein "valid label";was läuft da immer noch nicht richtig?
Und warum macht er dazwischen ein hungup? Ich habe es mir echt einfacher vorgestellt...
 
Zuletzt bearbeitet:
Dein Goto Befehl ist immer noch falsch.

Außerdem ist Dir der Unterschied zwischen Context und Extension noch nicht klar.

Schau doch mal in den Asterisk Kurs hier im Forum - da hab ich das doch seinerzeit ausführlich erklärt.

Du hast doch gar keinen Kontext [DIALSTATUS]

${DIALSTATUS} ist eine Variable, die ausgewertet wird. Mehr nicht.

wenn das
Code:
exten => r-NOANSWER,1,Goto,(DIALSTATUS,r-NOANSWER,1)

auch nur ansatzweise funktionieren würde, hättest Du doch schon wieder eine Endlosschleife produziert!

Außerdem ist da ein Komma falsch. Entweder müßte es (jetzt mal rein von der Syntax her) heißen

Code:
exten => r-NOANSWER,1,Goto(DIALSTATUS,r-NOANSWER,1)

oder es muß heißen

Code:
exten => r-NOANSWER,1,Goto,DIALSTATUS|r-NOANSWER|1

Aber das Komma nach Goto und dann noch die Klammern sind definitiv falsche Syntax. Auch das habe ich in meinem oben bereits erwähnten Kurs erklärt.

Mir ist einfach noch unklar, warum Du aus exten => r-BLA irgendwohin mit Goto springen willst.
 
@betateilchen:
Du hast recht, die Kommas nach Goto waren defintiv falsch. Aber ich habe einen Context DIALSTATUS, dort ist zusammengefasst, was passieren soll, wenn die Variable ${DIALSTATUS} ausgewertet werden soll.

Auf der Zielgeraden; es meldet sich jetzt die Voicemailbox, obwohl die 15 Sekunden zum Abnehmen noch nicht abgelaufen sind:

Code:
[external-ISDN_eingehend]
exten => 3312,1,SetGlobalVar(FOO=3312)
exten => 3312,2,Dial,ZAP/g1/111|15|tr
exten => 3312,3,Goto,r-${DIALSTATUS}|1
exten => r-NOANSWER,1,Goto(DIALSTATUS,r-NOANSWER,1)
exten => r-BUSY,1,Goto(DIALSTATUS,r-BUSY,1)
exten => r-CHANUNAVAIL,1,Goto(DIALSTATUS,r-CHANUNAVAIL,1)

[DIALSTATUS]
exten => r-NOANSWER,1,voicemail,u${FOO}
exten => r-NOANSWER,2,Set(LANGUAGE()=de)
exten => r-NOANSWER,3,Playback(vm-nobodyavail)
exten => r-NOANSWER,4,Congestion()
exten => r-NOANSWER,5,Wait(10)
exten => r-NOANSWER,6,Hangup()

sieht dann im Ergebnis so aus:

Code:
 == ISDN1#02: Incoming call '162xxxxxxx' -> '3312'
    -- Executing SetGlobalVar("CAPI/ISDN1#02/3312-1", "FOO=3312") in new stack
  == Setting global variable 'FOO' to '3312'
    -- Executing Dial("CAPI/ISDN1#02/3312-1", "ZAP/g1/111|15|tr") in new stack
    -- Requested transfer capability: 0x00 - SPEECH
    -- Called g1/111
        == Primary D-Channel on span 1 up for TEI 65
    -- Channel 0/1, span 1 got hangup, cause 18
    -- Hungup 'Zap/1-1'
  == Everyone is busy/congested at this time (1:0/0/1)
    -- Executing Goto("CAPI/ISDN1#02/3312-1", "r-CHANUNAVAIL|1") in new stack
    -- Goto (external-ISDN_eingehend,r-CHANUNAVAIL,1)
    -- Executing Goto("CAPI/ISDN1#02/3312-1", "DIALSTATUS|r-CHANUNAVAIL|1") in new stack
    -- Goto (DIALSTATUS,r-CHANUNAVAIL,1)
    -- Executing VoiceMail("CAPI/ISDN1#02/3312-1", "u3312") in new stack
  == ISDN1#02: Answering for 3312
    -- Playing 'vm-theperson' (language 'de')
    -- Playing 'digits/3' (language 'de')
    -- Playing 'digits/3' (language 'de')
    -- Playing 'digits/1' (language 'de')
    -- Playing 'digits/2' (language 'de')
    -- Playing 'vm-isunavail' (language 'de')
    -- Playing 'vm-intro' (language 'de')
  == Spawn extension (DIALSTATUS, r-CHANUNAVAIL, 1) exited non-zero on 'CAPI/ISDN1#02/3312-1'
  == ISDN1#02: CAPI Hangingup for PLCI=0x101 in state 2
       > ISDN1#02: CAPI INFO 0x3490: Normal call clearing

Ich möchte erreichen, dass nach 15 Sekunden Klingeln die Voicemailbox rangeht, mehr nicht; aber auch nicht weniger...
Bei meinem SIP-Gerät geht das doch auch, warum nicht beim ZAP-Gerät?
 
Also das mit dem separaten Kontext für den Dialstatus wäre vermutlich gar nicht notwendig - aber lassen wir das momentan erstmal außer acht.

Mit ZAP kenne ich mich nun gar nicht aus, aber hier wird eine Fehlermeldung erzeugt

Code:
    -- Channel 0/1, span 1 got hangup, cause 18
    -- Hungup 'Zap/1-1'
  == Everyone is busy/congested at this time (1:0/0/1)

die einfach dafür sorgt, daß es wahrscheinlich gar nicht klingelt, sondern der Anruf sofort abgebrochen wird.

Gibt es denn ein Gerät mit der Nummer 111, das korrekt erreichbar ist?
 
Ja, es gibt ein ZAP-Gerät mit internen MSN 111, das wird korrekt erreicht.

Danke erstmal für die Unterstützung; wenn ich nerve, schreibst Du es hierher. ;-)


Ich habe es so verstanden, dass es die Extensions r-NOANSWER, r-BUSY und r-CHANUNAVAIL 1mal in irgendeinem Context geben muss. Dann wird auch korrekt der Context [DIALSTATUS] angesprungen. Wenn es natürlich einfacher ohne diesen [DIALSTATUS]-Context ginge (und übersichtlicher), dann würde ich das selbstredend alles umstricken. :-)

Jedenfalls funktioniert jetzt die Voicemailbox erst einmal ausreichend.
Ich glaube, ich habe wieder viel dazugelernt.

Viele Grüße
Günter

EDIT:
Die Fehlermeldung kam daher, dass ich das ZAP-Gerät nicht richtig aufgelegt hatte! :-( Asche auf mein Haupt! Da musste ja sofort das besetzt kommen.... Ausser die Fernabfrage, die geht immer noch nicht.
 
Zuletzt bearbeitet:
Keine Sorge, das mit der Fernabfrage kriegen wir auch noch hin ;)
 
HmHm, betateilchen, hier bin ich wieder...

Ich habe einen alten Thread von vor 2,5 Jahren zur Fernabfrage hier von Netview gefunden,

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

funktioniert das noch so, oder kann man eine andere (bessere) Lösung finden?

Viele Grüße
Günter
 
es gibt eine nahezu unerschöpfliche Anzahl von Möglichkeiten, die Fernabfrage zu realisiseren.

Der einfachste Fall wäre, wenn Du sicherstellen kannst, daß Du die Fernabfrage immer von der gleichen Rufnummer aus (z.B. Handy) machst.

Dann sieht das einfach so aus:

Code:
exten => 3312/01721234567,1,Voicemailmain
exten => 3312/01721234567,2,HangUp

Damit werden diese Befehle beim Anruf auf die 3312 nur dann ausgeführt, wenn der Anrufer die Nummer 01721234567 hat.
 
Hallo betateilchen;
diese von Dir beschriebene Möglichkeit der Fernabfrage scheint mir nicht so recht praktikabel:
was passiert, wenn ich mit meinem Handy die 3312 *wirklich* einmal anrufen will?

Der von Dir beschriebene Weg würde also dann so aussehen:

Code:
[external-ISDN_eingehend]
exten => 3312,1,SetGlobalVar(FOO=3312)
exten => 3312,2,Dial,ZAP/g1/111|15|tr
exten => 3312,3,Goto,r-${DIALSTATUS}|1
exten => r-NOANSWER,1,Goto(DIALSTATUS,r-NOANSWER,1)
exten => r-BUSY,1,Goto(DIALSTATUS,r-BUSY,1)
exten => r-CHANUNAVAIL,1,Goto(DIALSTATUS,r-CHANUNAVAIL,1)
exten => 3312/01721234567,1,Voicemailmain
exten => 3312/01721234567,2,HangUp

Bei Licht besehen, wird das sicherlich funktionieren, aber mir wäre trotzdem eine andere Variante lieber.

Ich habe hier noch mindestens 5 bisher ungenutzte MSN zur Verfügung. Davon könnte ich eine explizit dafür verwenden, um eine Fernabfrage der Mailbox durchzuführen. Ich würde also vom Handy oder vom Festnetz aus eine dieser ungenutzen MSN anrufen, und damit wäre ich an meiner Mailbox...
Wie lässt sich das realisieren? Möglichst mit einer Passwort-Abfrage. :-)

Viele Grüße
Günter
 
was passiert, wenn ich mit meinem Handy die 3312 *wirklich* einmal anrufen will?

Denk doch mal an die simpelsten Lösungen :mrgreen:

Wenn Du vom Handy aus die 3312 wirklich mal anrufen willst, mußt Du doch lediglich dafür sorgen, daß für diesen Anruf die Rufnummernübermittlung von Deinem Handy deaktiviert wird. Der entsprechende Steuereintrag (bei mir ist das #31# vor der Rufnummer) läßt sich doch einfach im Telefonbuch mit abspeichern.
 
Das ist natürlich genial! Und problemlos machbar!" :-) Gute Idee; nur: dann geht beim Angerufenen (3312) das CLIP nicht mehr, weil ja keine Rufnummer übermittelt wird.
Wo doch die Familie stets damit rechnet: Wenn Papa anruft, steht auch Papa auf dem Telefon-Display...
 
Kostenlos!

Statistik des Forums

Themen
248,331
Beiträge
2,288,429
Mitglieder
377,629
Neuestes Mitglied
Arno Morschhäuser