Una manera de usar miembros dinámicos utilizando nombres de usuario.

En este artículo veremos una manera de asignar a los miembros (también llamados agentes)* de las colas de Asterisk, un nombre de usuario, para hacer más sencillo su uso y su seguimiento.

Para visualizar mejor la configuración de Asterisk, he instalado FOP2 que nos muestra un panel de llamadas de las colas, y Asternic para mostrar un ejemplo de estadísticas que se pueden recoger.

En Asterisk, el uso de miembros dinámicos suele hacerse por medio de números, que representan generalmente una extensión SIP. Esto lo hace poco cómodo para el usuario. Además, al usar nombres de usuario se puede hacer un seguimiento mejor en las estadísticas.

Cuando no usamos nombres de usuario, el aspecto de una cola de llamadas en el panel de FOP2 podría ser similar al siguiente, solo se verían los números de extensión:

Colas sin nombre de usuario

Los miembros de la cola identificados solo por números o etiquetas estáticas


*Nota: la expresión «Agentes» se empleaba en las configuraciones antiguas de Asterisk, se considera obsoleto, pues se usaba un archivo llamado agents.cfg que ya no es necesario. Hoy en día, es peferible utilizar la expresión «Miembros» para evitar confusiones.

Para conseguir nuestro propósito vamos a uilizar un archivo de texto adjunto, en mi caso lo he denominado usuarios.txt, lo guardamos en el directorio de Asterisk o donde queramos, luego indicaremos su ruta.
Solo hay que hacer una configuración en el archivo /etc/asterisk/extensions.conf (tenemos presente que ya tenemos correctamente configuradas las colas en /etc/asterisk/queues.cfg, con miembros dinámicos no es necesario indicar éstos en ese archivo)

La configuración de ejemplo es esta:

exten => _*[a-z].,1,NoOp(-- Petición de login de miembros --)
same => n,Set(VAR=${SHELL(grep ${EXTEN:1} /etc/asterisk/archivos/usuarios.txt -w)}) ; en un archivo guardamos los nombres válidos.
same => n,GotoIf($["${VAR}" = ""]?cuelga) ; si en el archivo no aparece el nombre tecleado por el operario, lo expulsa.
same => n,AddQueueMember(clientes,Local/${EXTEN:1}@atencion_clientes)
same => n,Set(DB(atencion_clientes/${EXTEN:1})=${CALLERID(num)}) ; almacenamos esa correlación en la base de datos interna de Asterisk.
same => n,Playback(agent-loginok)
same => n(cuelga),Hangup()
; para desregistrarse usamos el carácter 0 en vez de * con el mismo código.
exten => _0[a-z].,1,NoOp(-- Petición de deslogueo de miembros--)
same => n,RemoveQueueMember(clientes,Local/${EXTEN:1}@atencion_clientes)
same => n,Set(borrar=${DB_DELETE(atencion_clientes/${EXTEN:1})}) ; aquí se elimina la correlación, usamos una variable (borrar en este caso)
same => n,Playback(agent-loggedoff)
same => n,Playback(goodbye)
same => n,Hangup()
[atencion_clientes] ; este es el contexto que determina la llamada al miembro desde la cola, si está ocupado no hace nada, manda un mensaje por consola.
exten => _[a-z].,1,NoOp(-Llamada al miembro -)
same => n,Set(MIEMBRO=${DB(atencion_clientes/${EXTEN})})
same => n,GotoIf($[${SIPPEER(${MIEMBRO},curcalls)} = 1]?ocupado)
same => n,Dial(SIP/${MIEMBRO})
same => n(ocupado),NoOp(Miembro ocupado, llamada en cola

Con esta configuración, el usuario solo tiene que teclear desde el terminal telefónico, un asterisco seguido de su nombre de usuario para quedar registrado, y ya puede recibir llamadas de esa cola.
Quedaría algo así:

Colas con nombre de usuario

Miembros con nombre de usuario


De esta manera se puede identificar bien cuando uno está en llamada:

Usuario respondiendo

Respondiendo una llamada el miembro de la cola


Por último, con la herramienta Asternic podemos comprobar cómo se pueden obtener estadísticas por usuario:

Nomres de usuario para los miembros dinámicos

Estadísticas de usuarios


Además de como os lo he presentado, podría hacerse de otras maneras, por ejemplo con una base de datos para los nombres de usuarios, lo puse con un archivo de texto por simplicidad.
Animaos a compartir vuestras propias soluciones o posibles mejoras que se os hayan ocurrido.