Menú IVR - Siempre llama a la primera extensión

437 views
Skip to first unread message

AntraX

unread,
May 28, 2008, 7:25:53 AM5/28/08
to asterisk-es
Muy buenas a todos.

Estoy montando un menú IVR en Asterisk con Festival, en principio uno
facilito que llamando a la extensión 5000 me de a elegir dos
extensiones, la de Juan (8000) y la de Pepe (9000).

Al llamar al 5000, la "operadora" de Festival suelta el mensaje
correctamente y luego vienen los 10 segundos de espera (lo compruebo
en la consola), pero pulse lo que pulse o si no pulso nada, me llama a
la extensión 8000 directamente, la que tengo configurada como "1".

El menú IVR lo tengo configurado de la siguiente manera en el
"extensions.conf":

[voicemenu-custom-2]
comment=menuprueba
alias_exten=5000
include=dominio
exten=s,1,Festival(Le habla el menú interactivo de prueba por favor
pulse 1 para llamar a Juan pulse 2 para llamar a Pepe)
exten=s,2,Set(TIMEOUT(digit)=10)
exten=s,3,Set(TIMEOUT(response)=10)
exten=s,4,Wait(2)
exten=t,1,Goto(dominio|8000|1)
exten=t,2,Goto(dominio|9000|1)

¿Alguna idea para encaminarme bien?

Elio Rojano

unread,
May 28, 2008, 7:37:02 AM5/28/08
to aster...@googlegroups.com
Prueba con WaitExten(10) en lugar de Wait y añade:

exten=>1,1,Dial(SIP/8000)
exten=>2,1,Dial(SIP/9000)
--
http://www.sinologic.net/

AntraX

unread,
May 28, 2008, 8:34:16 AM5/28/08
to asterisk-es
Gracias, pero nada, hace lo mismo... :(

Creo que el problema es que no capta la pulsación de la tecla, ya que
espera a que acaben los 10 segundos y luego llama directamente al
8000, la primera extensión. Lo suyo es que cuando salta la operadora
yo pulsase el "1" o el "2" y me llamase directamente a la extensión
deseada, ¿no es así?.

¿Necesito alguna orden más para captar correctamente la pulsación de
la tecla?

On 28 mayo, 13:37, "Elio Rojano" <hel...@gmail.com> wrote:
> Prueba con WaitExten(10) en lugar de Wait y añade:
>
> exten=>1,1,Dial(SIP/8000)
> exten=>2,1,Dial(SIP/9000)
>
> 2008/5/28 AntraX <andreu...@gmail.com>:

davidp

unread,
May 28, 2008, 11:53:06 AM5/28/08
to asterisk-es


On May 28, 2:34 pm, AntraX <andreu...@gmail.com> wrote:
> Gracias, pero nada, hace lo mismo... :(
>
> Creo que el problema es que no capta la pulsación de la tecla,

Es que no le estás diciendo que espere ninguna pulsación de teclas.

Tienes puesto "Wait", que es para esperar, pero ignorando lo que pulse
la persona que ha llamado. Ya puedes pulsar el 1 diez veces, que no va
a hacer nada.

> espera a que acaben los 10 segundos y luego llama directamente al
> 8000, la primera extensión.

Has puesto:

exten=>t,1,Goto(dominio|8000|1)
exten=>t,2,Goto(dominio|9000|1)

Eso quiere decir, en español:

"si pasa el tiempo límite (exten=>t) sin que el usuario pulse una
extensión de este contexto... lo mando en primer lugar (exten=>t,1,)
al 8000 y si no puedo, en segundo lugar (exten=>t,2,) al 9000"


> Lo suyo es que cuando salta la operadora
> yo pulsase el "1" o el "2" y me llamase directamente a la extensión
> deseada, ¿no es así?.

Eso es lo que tú quieres, pero no es lo que pone ahí.

> ¿Necesito alguna orden más para captar correctamente la pulsación de
> la tecla?

Bueno, ya te lo ha comentado Elio: Usa "waitexten" en lugar de "wait".
Con eso el asterisk aceptará los números que pulse esa persona, Y
también tienes que poner:

exten=>1,1,Goto(dominio|8000|1)
exten=>2,1,Goto(dominio|9000|1)

para que cuando pulse el 1 vaya al 8000 y cuando pulse el 2 vaya al
9000 (y estoy suponiendo que en tu contexto "dominio", hay un
exten=>8000 que sabe lo que tiene que hacer).

(por cierto, fíjate que tienes cosas mal puestas en tu
extensions.conf, como "exten=" en lugar de "exten=>")

davidp.

Jorge Eduardo Silva Jackson

unread,
May 28, 2008, 1:02:17 PM5/28/08
to aster...@googlegroups.com
On Wed, 2008-05-28 at 05:34 -0700, AntraX wrote:
> Gracias, pero nada, hace lo mismo... :(

Asterisk hace lo que le dices que haga..

Vamos por partes.

1 - Si buscas informacion de como funciona un IVR en Asterisk, tienes
miles de ejemplos.

> > exten=s,1,Festival(Le habla el menú interactivo de prueba por favor
> > > pulse 1 para llamar a Juan pulse 2 para llamar a Pepe)
> > > exten=s,2,Set(TIMEOUT(digit)=10)
> > > exten=s,3,Set(TIMEOUT(response)=10)
> > > exten=s,4,Wait(2)

Wait(XX) - solo hace una pausa de XX segundos y despues ejecuta el
comando siguiente, por lo tanto no te sirve para nada en un IVR

> > > exten=t,1,Goto(dominio|8000|1)
> > > exten=t,2,Goto(dominio|9000|1)

la exten t,1,..... lo que hace es ejecutar el comando cuando se produce
un timeout en el establecimiento de la llamada, es decir que aca no
aplica en lo mas minimo.

por lo tanto conceptualmente estas muy lejos de la realidad, te
recomiendo leer Asterisk TFOT.

Ahora.. como recomendacion que bien dijo Elio

WaitExten(XX), espera por XX segundos que el usuario pulse digitos que
despues son procesados por le dialplan

EJ:

exten => s,1,Festival (pulse 1 para ventas 2 para administracion)
exten => s,n,WaitExten(5)

exten => 1,1,Dial(SIP/ventas) ; salta aca si la opcion es uno
exten => 2,1,Dial(SIP/admin); salta aca si la opcion es dos

o en su defecto => Goto(dominio|9000|1)

Listo..
Saludos


>

-----------------------------------------------
Jorge Eduardo Silva Jackson
Digium Certified Asterisk Professional - dCAP -
Linux user #464413
S&D Informatica
Tel: 099-665783 (+ 598 + 99665783)
-----------------------------------------------

AntraX

unread,
May 29, 2008, 6:26:14 AM5/29/08
to asterisk-es

En primer lugar, muchas gracias a todos por las respuestas y
explicaciones, me han aclarado muchas cosas.

Si he llegado a comprender bien todos los consejos, algo asi deberia
hacer lo que quiero:

comment=menuprueba
alias_exten=5000
exten=s,1,Festival(le habla el menu interactivo de prueba por favor
pulse 1 para llamar a juan pulse 2 para llamar a pepe)
exten=s,2,Set(TIMEOUT(digit)=10)
exten=s,3,Set(TIMEOUT(response)=10)
exten=s,2,WaitExten(10) ;espera 10 segundos la pulsacion de una
tecla
exten=1,1,Goto(dominio|8000|1) ;si la tecla pulsada en el paso
anterior es "1" llama a la extension 8000
exten=2,1,Goto(dominio|9000|1) ;si la tecla pulsada en el paso
anterior es "2" llama a la extension 9000


Los pasos vistos en la consola son los siguientes:

-- Executing [5000@dominio:1] Goto("SIP/7000-081ce6d8", "voicemenu-
custom-2|s|1") in new stack
-- Goto (voicemenu-custom-2,s,1)
-- Executing [s@voicemenu-custom-2:1] Festival("SIP/
7000-081ce6d8", "le habla el menu interactivo de prueba por favor
pulse 1 para llamar a juan pulse 2 para llamar a pepe") in new stack
== Parsing '/etc/asterisk/festival.conf': Found
-- Executing [s@voicemenu-custom-2:2] Set("SIP/7000-081ce6d8",
"TIMEOUT(digit)=10") in new stack
-- Digit timeout set to 10
-- Executing [s@voicemenu-custom-2:3] Set("SIP/7000-081ce6d8",
"TIMEOUT(response)=10") in new stack
-- Response timeout set to 10
-- Executing [s@voicemenu-custom-2:4] WaitExten("SIP/
7000-081ce6d8", "10") in new stack
[May 23 03:24:23] WARNING[8389]: pbx.c:5606 pbx_builtin_waitexten:
Timeout but no rule 't' in context 'voicemenu-custom-2'
== Spawn extension (voicemenu-custom-2, s, 4) exited non-zero on
'SIP/7000-081ce6d8'

Sin embargo como se aprecia esto no termina de hacer lo que quiero,
espera los 10 segundos y pulse lo que pulse me marca un warning.

>(por cierto, fíjate que tienes cosas mal puestas en tu
>extensions.conf, como "exten=" en lugar de "exten=>")

Veras de este detalle ya me di cuenta anteriormente, cuando
configuramos el dialplan, pero lo curioso es que hasta q no quito ">"
no funciona como deberia, si lo dejo tal como deberia ser lo correcto,
da multitud de errores.


>por lo tanto conceptualmente estas muy lejos de la realidad, te
>recomiendo leer Asterisk TFOT.

Apenas estamos iniciandonos en asterisk, y en mi opinion el TFOT (para
personas que se estan iniciando)es algo escaso en informacion sobre
IVR, pero antes de preguntar ya habiamos probado multitud de ejemplos,
pero con los mismos resultados. No se si no funciona porque no tenemos
suficientemente claros los conceptos o simplemente nos falla por algun
error de configuracion del propio asterisk, porque ya nos volvimos
locos anteriormente con un error del page.

Saludos y gracias!!

davidp

unread,
May 29, 2008, 5:37:36 PM5/29/08
to asterisk-es

>   exten=s,2,Set(TIMEOUT(digit)=10)
>   exten=s,3,Set(TIMEOUT(response)=10)
>   exten=s,2,WaitExten(10) ;espera 10 segundos la pulsacion de una

Tienes dos veces el "s,2". La segunda no estará aplicándose.

>     -- Executing [s@voicemenu-custom-2:4] WaitExten("SIP/
> 7000-081ce6d8", "10") in new stack

Sin embargo, aquí aparece esto como s@voicemenu-custom-2:4. Imagino
que lo de arriba es que te equivocaste transcribiendo.

> [May 23 03:24:23] WARNING[8389]: pbx.c:5606 pbx_builtin_waitexten:
> Timeout but no rule 't' in context 'voicemenu-custom-2'
>   == Spawn extension (voicemenu-custom-2, s, 4) exited non-zero on
> 'SIP/7000-081ce6d8'

Puede ser que los tonos DTMF no estén llegando al asterisk. Qué estás
usando como terminal? ¿Un softphone? ¿Cómo tienes configurado el envío
de DTMF? Ponlo como rfc2833.

>    >(por cierto, fíjate que tienes cosas mal puestas en tu
>    >extensions.conf, como "exten=" en lugar de "exten=>")
>
> Veras de este detalle ya me di cuenta anteriormente, cuando
> configuramos el dialplan, pero lo curioso es que hasta q no quito ">"
> no funciona como deberia, si lo dejo tal como deberia ser lo correcto,
> da multitud de errores.

¿qué errores?

haz un:

show dialplan @voicemenu-custom-2

a ver qué sale

davidp.

AntraX

unread,
May 30, 2008, 3:04:11 AM5/30/08
to asterisk-es
> Tienes dos veces el "s,2". La segunda no estará aplicándose.

Cierto, pequeños problemas de probar tanto... xD

> Puede ser que los tonos DTMF no estén llegando al asterisk. Qué estás
> usando como terminal? ¿Un softphone? ¿Cómo tienes configurado el envío
> de DTMF? Ponlo como rfc2833.

De terminal utilizo un softphone X-Lite, lo tenía en "info", lo he
cambiado a "rfc2833" pero nada... bueno, que hace lo mismo de siempre.
Aún así al llamar directamente a una extensión funciona sin problemas
y puedo descolgar desde el otro PC, el problema solo viene al usar el
IVR.

> ¿qué errores? (en referencia al uso de "=>")
> haz un:
> show dialplan @voicemenu-custom-2

Pues sale lo siguiente:

*CLI> show dialplan @voicemenu-custom-2
[ Context 'voicemenu-custom-2' created by 'pbx_config' ]
'>1' => 1. Goto(default|8000|1)
[pbx_config]
'>2' => 1. Goto(default|9000|1)
[pbx_config]
'>s' => 1. Festival(le habla el menu interactivo de
prueba por favor pulse 1 para llamar a juan pulse 2 para llamar a
pepe) [pbx_config]
2. Set(TIMEOUT(digit)=10)
[pbx_config]
3. Set(TIMEOUT(response)=10)
[pbx_config]
4. WaitExten(10)
[pbx_config]
Include =>
'>dominio' [pbx_config]

-= 3 extensions (6 priorities) in 1 context. =-

Y luego al realizar una llamada al 5000 sale de error (utilizando
"=>"):

-- Executing [5000@dominio:1] Goto("SIP/7000-081af318", "voicemenu-
custom-2|s|1") in new stack
-- Goto (voicemenu-custom-2,s,1)
[May 23 07:44:14] WARNING[10654]: pbx.c:2436 __ast_pbx_run: Channel
'SIP/7000-081af318' sent into invalid extension 's' in context
'voicemenu-custom-2', but no invalid handler

Si utilizo simplemente el "=", funciona casi bien, porque sale la
operadora y el problema del inicio, siempre llama a la primera
extensión.

¿Ideas?

IvanFP

unread,
May 30, 2008, 8:36:40 AM5/30/08
to asterisk-es
Yo entiendo que el IVR está esperando que tu introduzcas por DTMF, no
la extensión '1', sino la '>1'!!, y por eso no reconoce.

Prueba a poner en el extensions.conf así (en todas las 'exten' del
contexto, claro):

exten => 1,1,Goto(dominio,8000,1)

Creo que el '=>' es importante. Después de hacer eso prueba a hacer un
dialplan show.

Elio Rojano

unread,
May 30, 2008, 3:50:31 PM5/30/08
to aster...@googlegroups.com


2008/5/30 IvanFP <ivan...@gmail.com>:

Es lo mismo 'exten=' que 'exten=>', el gorrito es puramente decorativo.






--
http://www.sinologic.net/

Ramses II

unread,
May 31, 2008, 5:08:31 AM5/31/08
to aster...@googlegroups.com
Pues entonces no estará poniendo bien el gorrito porque dice que si lo pone
le da errores, ¿no?.


Saludos,

Ramses


________________________________

Reply all
Reply to author
Forward
0 new messages