Sprünge in Macro

wolfi3300

Neuer User
Mitglied seit
28 Dez 2005
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
Hallo Leute,

ich versuche gerade ein Macro zu basteln, wo der Anrufer, wenn niemand abhebt in ein Menü kommt wo er auswählen können soll, ob er eine Nachricht hinterlassen will, die Durchwahl nochmals anwählen kann oder auf das Handy weitergeleitet werden kann.

Ohne Macro funktioniert das ganze gut. Ich würde das aber jetzt gerne verpacken um es für mehrere Klappen zur Verfügung zu stellen.

Und hier bekomme ich das Problem, dass das Macro wenn die Auswahltaste (1 - 3) gedrückt wird, immer versucht eine Sprungmarke im Default-Context anzuspringen und nicht im Macro bleibt.

ich habe zBsp.: folgendes im Macro für die [1] definiert:
exten => 1,1,NoOp(1 Gewaehlt - Nachricht hinterlassen)
exten => 1,n,Voicemail(u${ARG1})
exten => 1,n,Hangup

drücke ich jetzt allerdings 1, so bekomme ich die Fehlermeldung:
" Invalid extension '1', but no rule 'i' in context 'default' "

Asterisk sucht also die Extension für [1] in Default und nicht im Macro-Code.
Wie kann ich Asterisk sagen, dass die [1] im Macro gesucht werden soll? Oder ist mein Ansatz hier überhaupt schon falsch?

Für einen Tipp dankbar,
Wolfgang
 
Deine Problembeschreibung ist falsch :!:

Asterisk sucht nicht nach [1] in default, sondern nach

Code:
" Invalid extension '1', but no rule 'i' in context 'default' "

also nach der extension um ungültige Eingaben zu behandeln. Er weiß schlichtweg nicht, was er mit der 1 anfangen soll, und möchte Dir das mit einer Behandlung in z.B. i,1,PlayBack,invalid gerne ansagen.

Also - das Problem ist nicht der [default] Kontext, sondern die Tatsache, daß mit Deiner Makro-Logik was nicht stimmt.
 
ich fürchte, das Problem ist, dass Asterisk scheinbar generell in Makros nichts anderes anspringt als "s"-Extensions.

Ich habe jetzt noch diesen Artikel zu der Problematik gefunden:
http://www.voip-info.org/tiki-pagehistory.php?page=Asterisk+cmd+Macro&diff2=8

unter "Note 2" ist genau mein Problem beschrieben.

Also ich weiß ja nicht, ob das auf der "Todo-Liste" steht bei Asterisk, aber dass das nicht geht find ich äußerst bedauerlich!?

Gibt's da einen vernünftigen Work-Around? Ich schicke mal mein Macro zur Veranschaulichung mit...

Code:
[macro-HOV_main]
; ARG1= Rufnummer
; ARG2= Handynummer
; ARG3= Handypasswort für Gateway
; ARG4= CALLERID

exten => s,1,Set(HANDY${ARG1}=${ARG2},g)                ; Handynummer
exten => s,n,Set(HPASS${ARG1}=${ARG3},g)               ; Passwort Handygateway
exten => s,n,NoOp(${ARG4} ruft an ...)
exten => s,n,Dial(SIP/${ARG1},20,tTr)

; Niemand hat abgehoben ...
exten => s,n,Answer
exten => s,n,Set(COUNT=0)
exten => s,n,SetMusicOnHold(default)
exten => s,n,Set(Timeout(digit),5)
exten => s,n,Set(Timeout(response),15)
exten => s,n,Background(wr_herzlich_willkommen)
exten => s,n(nicht_gemeldet),Background(wr_teilnehmer_nicht_gemeldet)
exten => s,n(menue),Background(wr_menue_nicht_gemeldet)
exten => s,n,Set(COUNT=$[${COUNT}+1])
exten => s,n,NoOp(Count=${COUNT})
exten => s,n,GotoIf($[${COUNT} <= 3]?:900)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Wait(4)
exten => s-NOANSWER,2,Goto(s,menue)
;
exten => s,900,Playback(vm-goodbye)
exten => s,901,Hangup()
;
exten => _1,1,NoOp(1 Gewaehlt - Nachricht hinterlassen)
exten => _1,n,Voicemail(u${ARG1})
exten => _1,n,Hangup
;
exten => _2,1,NoOp(2 Gewaehlt - Nochmals anläuten)
exten => _2,n,Dial(SIP/${ARG1},30,Ttm)      ; Diesmal Music On Hold, nochmal anwählen
exten => _2,n,Goto(2-${DIALSTATUS},1)
exten => _2-NOANSWER,1,Goto(s,nicht_gemeldet)
;
exten => _3,1,NoOp(3 Gewaehlt - Weiterverbinden auf Handy)
exten => _3,2,Authenticate(${HPASS${ARG1})
exten => _3,3,Dial(SIP/${HANDY${ARG1}@xxxxxxx,60,r)
exten => _3,2+101,Goto(s,nicht_gemeldet)
;
exten => _#,1,NoOp(# Gewaehlt)
exten => _#,n,Playback(vm-goodbye)
exten => _#,n,Hangup
;
exten => t,1,NoOp(Timed-Out)
exten => t,2,Goto(s,menue)         ; Bei Timeout menü wiederholen
;
;exten => i,1,Playback(invalid) ; "That's not valid, try again"
exten => i,1,Goto(s,menue)

Grüße,
Wolfgang
 
Hast Du mal probiert, die _ bei _1 _2 _3 wegzulassen ? Du willst ja da keine Pattern auswerten, sondern direkt die Eingabe. Pattern aufzulösen geht auf jeden Fall im Macro nicht. Aber ansonsten müßten auch andere extensions als s im Macro funktionieren - solange sie statisch sind und nicht zur Laufzeit erst entstehen.
 
ja, ohne die "_" hatte ich es am Anfang, leider hat das auch nicht's geändert. Ich habe keine Möglichkeit gefunden, im Macro auszuwerten, welche Taste gedrückt wurde ...

Wie macht Ihr denn eure Macros? Kann doch nicht sein, das ich schon bei meinem ersten kleinen Minimacro über so ein Problem stolpere ? Wie kann man denn sonst sinnvoll mein oben beschriebenes Problem für mehrere Klappen ausprogrammieren?

Ich hab's zwar auch schon mit einem eigenen Context versucht, von dem dann das Macro aufgerufen wird und in welchen dann wieder zurückgesprungen wird, aber der Code wird so extrem aufwendig und ich bekomme Probleme mit Variablen wo Durchwahlen etc. zwischengespeichert werden, wenn andere Teilnehmer auch noch in das selbe Makro gelangen.

Mir ist bei der Programmierung aufgefallen, dass wenn man im Menü ist und eine Taste drückt die Variable {EXTEN} mit der gewählten Taste überschrieben wird. D.h. wenn der Anrufer im Menü landet und die Taste [1] drückt, dann kann ich für eine Widerwahl diese Variable EXTEN nicht mehr hernehmen, weil hier dann Schrott drinnensteht. Speicher ich mir die Variable EXTEN in eine andere Variable zur Sicherheit weg und ein anderer Benutzer geht in das Makro dann wird diese ja erneut neu überschrieben und das klappt dann nicht. -> Die Lösung mit dem Macro schien mir hier der einzig vernünftige Weg, da ja jeder Anrufer in seinem eigenen Macro landet, aber wenn das auch nicht geht .... ???

Wolfgang
 
Zuletzt bearbeitet:
In Macros ist einiges anders als in "normalen" Kontexten - z.B. kann die ${EXTEN} dort nicht verwendet werden. Da wirst Du Dir noch öfters irgendwelche Krücken bauen müssen. Aber ich denke, Dein Problem wäre in einem eigenen Context einfacher zu lösen als in einem Macro. Wenn ich mal Zeit und Muse habe, teste ich das Ganze mal auf meinem Server.
 
ja, bin gerade am versuchen, das über einen eigenen Context vernünftig zum Laufen zu bringen. Wenn's klappt werde ich es hier mal Posten.

Schade eigentlich. Ist nur zu Hoffen, dass die Asterisk-Programmierer die Macrosache noch nachbessern. So ist's leider für wirklich interessante Anwendungen unbrauchbar ...

Wolfgang
 
Also jetzt weiß ich echt nicht was nicht stimmt, ich habe das ganze in einen eigenen Context verpackt und jetzt erkennt er im Menü die Ziffern nicht mehr die gewählt werden.

Was ist an dem Code falsch?
Das Menü meldet sich nach dem Timeout des Dial() korrekt. Danach wird zBsp. [1] gedrückt und er landet bei "i" ??

Code:
[incoming_wolfgang]
exten => 8787913,1,Goto(incoming_wolfgang,30,1)  ; ohne Durchwahl auf 30 schicken

; Durchwahl 30 - Wolfgang
exten => 30,1,SetVar(EXTEN=30)
exten => 30,n,SetVar(DIALED=${EXTEN})
exten => 30,n,SetVar(HANDY${DIALED}=06765798383)        ; Handynummer
exten => 30,n,SetVar(HPASS${DIALED}=1234)               ; Passwort Handygateway
exten => 30,n,NoOp(${CALLERID} ruft an ...)
exten => 30,n,Dial(SIP/${DIALED},20,tTr)
exten => 30,n,Goto(s,menuestart)        ; Niemand hat abgehoben ...

; ... Niemand hat abgehoben
exten => s,n(menuestart),Answer
exten => s,n,SetVar(COUNT=0)
exten => s,n,SetMusicOnHold(default)
exten => s,n,Set(TIMEOUT(digit)=5)
exten => s,n,Set(TIMEOUT(response)=15)
exten => s,n,Background(wr_herzlich_willkommen)
exten => s,n(nicht_gemeldet),Background(wr_teilnehmer_nicht_gemeldet)
exten => s,n(menue),Background(wr_menue_nicht_gemeldet)
exten => s,n,Set(COUNT=$[${COUNT}+1])
exten => s,n,NoOp(Count=${COUNT})
exten => s,n,GotoIf($[${COUNT} <= 3]?:900)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Wait(4)
exten => s-NOANSWER,2,Goto(s,menue)
;
exten => s,900,Playback(vm-goodbye)
exten => s,901,Hangup()
;
exten => 1,1,NoOp(1 Gewaehlt - Nachricht hinterlassen)
exten => 1,n,Voicemail(u${DIALED})
exten => 1,n,Hangup
;
exten => 2,1,NoOp(2 Gewaehlt - Nochmals anläuten)
exten => 2,n,Dial(SIP/${DIALED},30,Ttm)      ; Diesmal Music On Hold, nochmal anwählen
exten => 2,n,Goto(2-${DIALSTATUS},1)
exten => 2-NOANSWER,1,Goto(s,nicht_gemeldet)
;
exten => 3,1,NoOp(3 Gewaehlt - Weiterverbinden auf Handy)
exten => 3,2,Authenticate(${HPASS${DIALED})
exten => 3,3,Dial(SIP/${HANDY${DIALED}@8787913,60,r)
exten => 3,2+101,Goto(s,nicht_gemeldet)
;
exten => #,1,NoOp(# Gewaehlt)
exten => #,n,Playback(vm-goodbye)
exten => #,n,Hangup
;
exten => t,1,NoOp(Timed-Out)
exten => t,2,Goto(s,menue)         ; Bei Timeout menü wiederholen
;
exten => i,1,NoOp(${EXTEN} wurde gewählt)       ; Falsche Auswahl
exten => i,n,Goto(s,menue)

Langsam denke ich ich hab bei Asterisk irgendwie noch überhaupt nichts geschnallt *g*

Wolfgang
 
Problem gelöst:

Ursache war die Zeile
"exten => s,n(menuestart),Answer"

Auch wenn Sprungbezeichnungen verwendet werden und Asterisk sicht nicht beschwert keine "s,1,..." Zeile zu finden, so muß man diese trotzdem verwenden, da das System sonst scheinbar einfach keine gewählten Zahlen erkennt (auch wennn sonst alles klappt) :mad:

Habe jetzt den Code auf "Ohne-Macro" umgeschrieben. Leider nicht so schön, wie es mit Macro möglich sein sollte, aber als Work-Around klappt es.

Verbesserungsvorschläge Willkommen !!

Code:
[wr_menu]
; Durchwahl 30 - Wolfgang
exten => 30,1,SetVar(DIALED=30)
exten => 30,n,SetVar(HANDY${DIALED}=067612345)        ; Handynummer
exten => 30,n,SetVar(HPASS${DIALED}=1234)             ; Passwort Handygateway
exten => 30,n,Goto(s,1) ; Rufen ...

; Durchwahl 31 - Nicole
exten => 31,1,SetVar(DIALED=31)
exten => 31,n,SetVar(HANDY${DIALED}=067654321)        ; Handynummer
exten => 31,n,SetVar(HPASS${DIALED}=1234)             ; Passwort Handygateway
exten => 31,n,Goto(s,1) ; Rufen ...

; Durchwahl 32 - MM1
exten => 32,1,SetVar(DIALED=32)
exten => 32,n,SetVar(HANDY${DIALED}=067698765)        ; Handynummer
exten => 32,n,SetVar(HPASS${DIALED}=1234)             ; Passwort Handygateway
exten => 32,n,Goto(s,1) ; Rufen ...

; ... Rufen
exten => s,1,NoOp(${CALLERID} ruft an ...)
exten => s,n,Dial(SIP/${DIALED},20,tTr)
exten => s,n,Answer
exten => s,n,SetVar(COUNT=0)
exten => s,n,SetMusicOnHold(default)
exten => s,n,Set(TIMEOUT(digit)=5)
exten => s,n,Set(TIMEOUT(response)=15)
exten => s,n,Background(wr_herzlich_willkommen)
exten => s,n(nicht_gemeldet),Background(wr_teilnehmer_nicht_gemeldet)
exten => s,n(menue),Background(wr_menue_nicht_gemeldet)
exten => s,n,Set(COUNT=$[${COUNT}+1])
exten => s,n,NoOp(Count=${COUNT})
exten => s,n,GotoIf($[${COUNT} <= 3]?:900)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => _s-.,1,Wait(4)
exten => _s-.,Goto(s,menue)
;
exten => s,900,Playback(vm-goodbye)
exten => s,901,Hangup()
;
exten => 1,1,NoOp(1 Gewaehlt - Nachricht hinterlassen)
exten => 1,n,Voicemail(u${DIALED})
exten => 1,n,Hangup
;
exten => 2,1,NoOp(2 Gewaehlt - Nochmals anläuten)
exten => 2,n,Dial(SIP/${DIALED},30,Ttm)      ; Diesmal Music On Hold, nochmal anwählen
exten => 2,n,Goto(2-${DIALSTATUS},1)
exten => _2-.,1,Goto(s,nicht_gemeldet)
;
exten => 3,1,NoOp(3 Gewaehlt - Weiterverbinden auf Handy)
exten => 3,2,Authenticate(${HPASS${DIALED}})
exten => 3,3,Dial(SIP/${HANDY${DIALED}}@12345678,60,r)
exten => 3,2+101,Goto(s,nicht_gemeldet)
;
exten => #,1,NoOp(# Gewaehlt)
exten => #,n,Playback(vm-goodbye)
exten => #,n,Hangup
;
exten => t,1,NoOp(Timed-Out)
exten => t,2,Goto(s,menue)         ; Bei Timeout menü wiederholen
;
exten => i,1,NoOp(${EXTEN} wurde gewählt)       ; Falsche Auswahl
exten => i,n,Goto(s,menue)

Vielleicht hat ja jemand Connection zu den Asterisk-Entwicklern und könnte mal anregen, dass das Problem mit Menüs & Macros mal angegangen werden sollte !? :rolleyes:

Grüße,
Wolfgang
 
Daß man jede neue extension in einem Kontext mit priority 1 anfangen muß, steht übrigens in der Asterisk Doku :wink:

In diesem Zusammenhang stellt die von Dir gewählte extension "s" nämlich eine neue dar, und die prio "n" bedeutet nur, daß auf die vorherige priority der aktuellen extension 1 aufaddiert werden soll - und da es keine vorherige gab, konnte er die "1" eben nicht finden.

Ein Macro hat die Angewohnheit, daß er nicht "dynamisch" ist - sobald der Macro aufgerufen wird, wird alles was dort abgearbeitet werden soll, statisch generiert und ist während der Laufzeit des Macros nicht änderbar. Deshalb kannst Du darin auch keine Menüsteuerung einbauen. Sowas ist nunmal Sinn und Zweck eines Macros - das was Du bräuchtest, ist ein Unterprogramm und läßt sich prima mit AEL lösen. Damit solltest Du Dich mal beschäftigen, dann klappts auch mit dem Menü :wink:
 
Ja, wenn AEL mal ordentlich dokumentiert ist ! ;-)
 
Kostenlos!

Statistik des Forums

Themen
248,856
Beiträge
2,302,974
Mitglieder
378,504
Neuestes Mitglied
Hallo61Hallo