miércoles, 1 de agosto de 2012

Callback automático en Elastix


Una de las funcionalidades de Asterisk 1.8 es Call Completion Supplementary Service (CCSS).

El objetivo del CCSS es el siguiente, vamos a llamar a una extensión que estará ocupada, entonces marcaremos que queremos que nos llame cuando se quede libre, cuando finalmente la persona con la que queremos hablar cuelga el teléfono Asterisk nos generará una llamada, cuando descolgamos llamará a nuestro interlocutor y nos pondrá en comunicación.



Elastix versión 2.3 viene con Asterisk 1.8 y soporta esta funcionalidad, para lo cual hay que hacer algunos cambios.


Lo primero que hay que hacer es ingresar al Elastix y habilitamos el acceso al FreePBX no embebido, esto se lo hace yendo a la pestaña Security -> Advanced Options -> Enable access to FreePBX -> ON. Luego en una nueva pestaña del explorador se debe poner lo siguiente: 


https://ip-del-elastix/admin


Aqui va a solicitar el usuario y contraseña para ingresar.

Una vez dentro de FreePBX no embebido, se debe ir a la sección (ubicada en la esquina superior izquierda) 
Tools -> Asterisk SIP Settings. Aquí se pueden editar las configuraciones generales para SIP. En la parte final hay una sección que dice Other SIP Settings, ahi ponemos lo siguiente:


call-limit=50


Para habilitar esta funcionalidad he realizado algunos cambios en la configuración por lo que deben bajarse el archivo functions_inc.php y sustituirlo (siempre es bueno sacar una copia del original por si algo falla) por el original que se encuentra en: 

cd /var/www/html/admin/modules/core/

Luego de eso reiniciar el amportal:

amportal stop

amportal start

Veran que en PBX -> PBX Configuration -> Extensions y seleccionan cualquier extensión que tengan creada, en la sección Device Options aparecen dos nuevos campos que dicen cc_agent_policy y cc_monitor_policy.


Los campos mencionados anteriormente son los que habilitan el callback por extensión, las opciones principales son: never y generic. Una vez seteados estos parámetros hay que hacer un cambio en el plan de marcado, para lo cual agregamos unas líneas en el archivo:


vim /etc/asterisk/extensions_custom.conf


Al final del archivo agregamos lo siguiente:



[app-callback]
exten => *123,1,CallCompletionRequest()
exten => *123,n,Hangup()
exten => *124,1,CallCompletionCancel()
exten => *124,n,Hangup()

Debemos agregar a la app-callback dentro del contexto por default que se utilice, por ejemplo si se usa el contexto from-internal se debe agregar lo siguiente al final del archivo /etc/asterisk/extensions_custom.conf:

[from-internal-additional-custom]
include => app-callback

Luego de haber guardado los cambios se debe hacer un reload de la configuración:

rasterisk -x "dialplan reload"

En este caso, si la persona a la que llamamos se encuentra al teléfono, por lo que no puede atender nuestra llamada, colgamos y marcamos *123, una vez que la persona con la que queremos comunicarnos termina su conversación timbra nuestro teléfono y el de la persona con la que queremos comunicarnos de forma automática.

20 comentarios:

Unknown dijo...

Juan buenas tardes, probe este modulo y si bien pude terminar de instalarlo al apretar el *123 me dice mi tel IP (404 Not found) la verdad es que ya me perdi el hilo con esto y me gustaria saber si pudieras darme una mano.

Unknown dijo...

Pusiste el include => app_callback dentro del contexto que estas utilizando para esa extension? Me parece que esa es la falla.

Unknown dijo...

hola, excelente informacion, sobre todo para los que utilizamos elastix. Aunque, sabes, no pude hacerlo funcionar :S. Hice la APP en el diaplan, puedo ejecutarla, pero el regreso de llamada no se realiza. Algun tip para sugerir?

Unknown dijo...

aqui esta mi app:
exten => 6,1,Answer
exten => 6,n,CallCompletionRequest()
exten => 6,n,Playback(beep)
exten => 6,n,Hangup()

exten => 7,1,Answer
exten => 7,n,CallCompletionCancel()
exten => 7,n,Playback(beep)
exten => 7,n,Hangup()

Unknown dijo...

sigo reportandome! jeje, logre hacerlo funcionar, pero, a medias.... osea, funciona, pero solo cuando el telefono al que intento llamar, esta descolgado, no cuando esta ocupado hablandp... ideas?? sera muy complicado si te adjunto un log del asterisk?

clopez dijo...

Juan Buenas tardes, realice el procedimiento asi como lo indicaste y no logro realizar el procedimiento; ya tenia las extensiones creadas; tengo que eliminarlas y volcer a crearlas para que tome los valores cc_agent_policy y cc_monitor_policy

Unknown dijo...

Te deben aparecer los campos cc_agent_policy y cc_monitor_policy en las extensiones que ya tenias creadas.

clopez dijo...

si me aparecen los campos cc_agent_policy y cc_monitor_policy en todas las extensiones. Pero al llamar a una extension que esta ocupada y colgar no me funciona, aclaro que estoy ocupando softphone zoiper; o solo funciona con teléfonos físicos?

Unknown dijo...

lo termine solucionando de otra manera:

exten => *76,1,MYSQL(Connect connid localhost root tupassword asteriskcdrdb)
exten => *76,n,NoOp(connid = ${connid})
exten => *76,n,MYSQL(Query resultid ${connid} SELECT dst FROM cdr WHERE src="${CALLERID(num)}" ORDER BY calldate DESC LIMIT 1)
exten => *76,n,NoOp(resultid = ${resultid})
exten => *76,n,MYSQL(Fetch fetchid ${resultid} var1)
exten => *76,n,NoOp(Variabili = ${fetchid},${var1},)
exten => *76,n,MYSQL(Clear ${resultid})
exten => *76,n,MYSQL(Disconnect ${connid})
exten => *76,n,Playback(beep)
exten => *76,n,System(/bin/echo Channel: SIP/${var1} > /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call)
exten => *76,n,System(/bin/echo MaxRetries: 6 >> /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call)
exten => *76,n,System(/bin/echo RetryTime: 30 >> /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call)
exten => *76,n,System(/bin/echo WaitTime: 45 >> /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call)
exten => *76,n,System(/bin/echo CallerID: Retrollamada: ${var1} >> /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call)
exten => *76,n,System(/bin/echo Context: from-internal >> /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call)
exten => *76,n,System(/bin/echo Extension: ${CALLERID(num)} >> /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call)
exten => *76,n,System(/bin/echo Priority: 1 >> /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call)
exten => *76,n,System(mv /var/lib/asterisk/callback-${CALLERID(num)}-${UNIQUEID}-${(STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.call /var/spool/asterisk/outgoing)
exten => *76,n,Hangup()

ronald rivera dijo...

Gracias Juan ... exelente Blog !!!
Me preguntaba si esto funciona con el Elastix 2.4

Graicas!

Unknown dijo...

Si funciona en Elastix 2.4

ronald rivera dijo...

Gracias Juan ... con tu confirmacion ya me arriesgo a probar. Lo que pasa es que la tengo en produccion y siempre hay que ser cuidadoso ... Gracias!!

Manuel Salas dijo...

No me resulto, algun mail a donde te pueda escribir, al parecer esta todo OK.

Manuel Salas dijo...

Estimado,

Aca esta mi config:

; This file contains the contexts the agents login for the module call center.
; and contains the context conferences for module conferences of elastix 1.0.

[from-internal-custom]
exten => 1234,1,Playback(demo-congrats) ; extensions can dial 1234
exten => 1234,2,Hangup()
exten => h,1,Hangup()
include => agentlogin
include => conferences
include => calendar-event
include => weather-wakeup

[agentlogin]
exten => _*8888.,1,Set(AGENTNUMBER=${EXTEN:5})
exten => _*8888.,n,NoOp(AgentNumber is ${AGENTNUMBER})
exten => _*8888.,n,AgentLogin(${AGENTNUMBER})
exten => _*8888.,n,Hangup()

[mm-announce]
exten => 9999,1,Set(CALLERID(name)="MMGETOUT")
exten => 9999,n,Answer
exten => 9999,n,Playback(conf-will-end-in)
exten => 9999,n,Playback(digits/5)
exten => 9999,n,Playback(minutes)
exten => 9999,n,Hangup

[conferences]
;Used by cbEnd script to play end of conference warning
exten => 5555,1,Answer
exten => 5555,n,Wait(3)
exten => 5555,n,CBMysql()
exten => 5555,n,Hangup

[calendar-event]
exten => _*7899,1,Answer
exten => _*7899,2,Playback(${FILE_CALL})
exten => _*7899,3,Wait(2)
exten => _*7899,4,Hangup()

[weather-wakeup]
exten => *61,1,Answer
exten => *61,2,AGI(nv-weather.php)
exten => *61,3,Hangup
exten => *62,1,Answer
exten => *62,2,AGI(wakeup.php)
exten => *62,3,Hangup

[app-callback]
exten => *123,1,CallCompletionRequest()
exten => *123,n,Hangup()
exten => *124,1,CallCompletionCancel()
exten => *124,n,Hangup()

[from-internal-additional-custom]
include => app-callback

Unknown dijo...

bueno a ver quien me puede ayudar necesito configurar mi centrar ip especificamente con el fpbx - a2biiling y usando el sistema callback, si alguine puede favor de contactarme por skyper:callinternacionalrd@hotmail.com o victorfernandezrd
nos pondremos de acuerdo y podemos hacer un acuerdo de precio por hora en todos los soporte que nos brinden
att. victor fernandez
call internacional

Unknown dijo...

A mi no me funciona, pero en el panel FreePBX no embemido me parece lo siguente:
_______________________
ERRORS

File /etc/asterisk/sip.conf should not have any settings in it. Those settings should be removed.
Settings in /etc/asterisk/sip_general_custom.conf may override these. Those settings should be removed.
Settings in /etc/asterisk/sip_custom.conf may override these. Those settings should be removed.

_____________________________

Puede ser debido a esto ?

Unknown dijo...

No tiene nada que ver.
El error que te muestra es facil de entender, dice que hay una configuración que puede ser sobrescrita.
Si vas a hacer algun cambio en la configuración debes hacerlo en los archivos que terminan con custom, ya que esos tienen mayor prioridad. El resto de archivos, principalmente los que terminan en additional son escritos por la interfaz gráfica.

Unknown dijo...

saludos Juan, estuve intentando realizar esta configuración, pero no tuve resultados, pude ver los logs de asterisk y veo que se ejecuta el callcompletionrequest("canal",) por lo que supongo que algun parametro. las extensiones tiene las opciones de policy como generic.

si me puedes ayudar con una sugerencia. mi archivo de extensions_custom es el mismo que tiene Manuel Salas en su comentario

Unknown dijo...

Hola. He implementado el retrollamado y me ha funcionando muy bien. pero cuando quiero llamar a otro asterisk, no sale. Si quito la entrada, funciona perfectamente. Esto es lo que hice en extension.conf
No es exactamente como lo planteas aqui, pero en un solo asterisk funciona.

[from-internal]
include => retrollamada


[retrollamada]
exten => _XXXX,1,Macro(user-callerid)
exten => _XXXX,n,Dial(SIP/${EXTEN},20)
exten => _XXXX,n,Hangup
;exten => _XXXX,1,Dial(SIP/${EXTEN},20)
;exten => _XXXX,n,Hangup
exten => 2,1,CallCompletionRequest
exten => 2,n,Hangup
exten => 3,1,CallCompletionCancel
exten => 3,n,Hangup

Como digo, si quiero hacerlo en 1 solo asterisk, funciona impresionante, pero al querer salir a otro asterisk no. Directamente dice no hay respuesta. si quito el include => retrollamada puedo salir sin problemas.

Desde ya gracias.

Omar Galaviz dijo...

sabes si sirve para elastix 4 o issabel ippbx ??