🛠️ Taller 10 - Central Telefónica Completa
¿Listos para construir una central profesional? En el próximo taller, implementaremos un sistema completo con IVR, horarios, colas y grabación. Verás las colas en acción con casos de uso reales.
Arquitectura de app_queue, estrategias de distribución, configuración avanzada, eventos AMI y mejores prácticas para call centers profesionales
Una cola (queue) es un mecanismo de Asterisk que:
| Escenario | Sin Cola | Con Cola |
|---|---|---|
| Soporte técnico | Llamadas perdidas si todos ocupados | Llamadas en espera con música |
| Ventas | Cliente cuelga y llama a competencia | Cliente espera, escucha posición |
| Mesa de ayuda | No hay métricas de atención | SLA, tiempos, abandonos medidos |
| Call center | Distribución manual ineficiente | Distribución automática optimizada |
1. Cola (Queue)
queues.conf2. Miembros (Members)
3. Estrategia (Strategy)
4. Estados de Miembro
| Estrategia | Comportamiento | Caso de Uso Ideal |
|---|---|---|
| ringall | Llama a TODOS los agentes disponibles simultáneamente | Urgencias, pocas llamadas, prioridad en velocidad |
| rrmemory | Round-robin con memoria (recuerda dónde quedó) | Call center balanceado, distribución equitativa |
| linear | Llama en orden fijo (primero 1001, luego 1002, etc.) | Jerarquías (supervisor primero, luego agentes) |
| fewestcalls | Llama al agente con menos llamadas atendidas | Balanceo por carga de trabajo |
| leastrecent | Llama al agente que hace más tiempo no atiende | Rotación justa, evitar “favoritos” |
| random | Llama a un agente aleatorio | Testing, distribución sin patrón |
| wrandom | Aleatorio ponderado por penalty | Priorizar agentes senior (penalty bajo) |
ringall - Todos suenan
Llamada → [Agente 1001] ← Suena [Agente 1002] ← Suena [Agente 1003] ← Suena
El primero que contesta ganarrmemory - Round Robin con Memoria
Llamada 1 → Agente 1001 ✓Llamada 2 → Agente 1002 ✓Llamada 3 → Agente 1003 ✓Llamada 4 → Agente 1001 ✓ (vuelve al inicio)linear - Orden Fijo
Llamada → Intenta 1001 (ocupado) → Intenta 1002 (ocupado) → Intenta 1003 ✓ (disponible)fewestcalls - Menos Llamadas Atendidas
Agente 1001: 5 llamadas atendidasAgente 1002: 3 llamadas atendidas ← SeleccionadoAgente 1003: 7 llamadas atendidas; /etc/asterisk/queues.conf
[general]; === CONFIGURACIÓN GLOBAL ===
; Guardar miembros dinámicos en AstDB (persisten al reiniciar)persistentmembers = yes
; Distribuir llamadas en paralelo (no serial)autofill = yes
; Tipo de grabaciónmonitor-type = MixMonitor
; Compartir lastcall entre colas (para wrapuptime)shared_lastcall = yes
; === PLANTILLA REUTILIZABLE ===[plantilla-cola](!)musicclass = defaultstrategy = rrmemorytimeout = 20retry = 5wrapuptime = 10autopause = yesringinuse = nojoinempty = yesleavewhenempty = noannounce-frequency = 30announce-holdtime = yesannounce-position = yes
; === COLAS ESPECÍFICAS ===[cola-ventas](plantilla-cola)strategy = rrmemorymaxlen = 20
[cola-soporte](plantilla-cola)strategy = fewestcallsmaxlen = 15wrapuptime = 15
[cola-urgencias](plantilla-cola)strategy = ringalltimeout = 10maxlen = 5timeout
timeout = 20retry
retry = 5wrapuptime
wrapuptime = 10autopause
autopause = yesno, yes (solo en esta cola), all (en todas las colas)yes para evitar agentes “fantasma”ringinuse
ringinuse = nono: Solo llama a agentes Idle (RECOMENDADO)yes: Llama incluso si están ocupados (para call waiting)joinempty / leavewhenempty
joinempty = yesleavewhenempty = nojoinempty=yes: Permite entrar a cola aunque no haya agentesleavewhenempty=no: No saca al llamante si todos se deslogueanmaxlen
maxlen = 200 = ilimitado (peligroso en producción)announce-frequency / announce-holdtime / announce-position
announce-frequency = 30announce-holdtime = yesannounce-position = yesEstáticos (en queues.conf)
[cola-ventas]member => PJSIP/1001member => PJSIP/1002,2 ; penalty 2member => PJSIP/1003,1,Juan Perez ; penalty 1, nombre✅ Ventajas: Configuración permanente, no requiere login
❌ Desventajas: No flexible, requiere reload para cambios
Dinámicos (login/logout desde dialplan o AMI)
; Desde CLIqueue add member PJSIP/1001 to cola-ventas
; Desde dialplanexten => *71,1,AddQueueMember(cola-ventas,PJSIP/${CHANNEL(endpoint)})exten => *72,1,RemoveQueueMember(cola-ventas,PJSIP/${CHANNEL(endpoint)})✅ Ventajas: Agentes se loguean/desloguean, flexible
❌ Desventajas: Se pierden al reiniciar (usar persistentmembers=yes)
member => PJSIP/1001,0 ; Penalty 0 (máxima prioridad)member => PJSIP/1002,1 ; Penalty 1member => PJSIP/1003,2 ; Penalty 2 (mínima prioridad)Cómo funciona:
Caso de uso:
QueueMemberStatus
Event: QueueMemberStatusQueue: cola-ventasMemberName: Juan PerezInterface: PJSIP/1001Status: 1 ; 1=Idle, 2=InUse, 5=UnavailablePaused: 0 ; 0=No pausado, 1=PausadoCallsTaken: 15LastCall: 1710876543Penalty: 0QueueCallerJoin
Event: QueueCallerJoinQueue: cola-ventasPosition: 3CallerIDNum: 987654321AgentCalled
Event: AgentCalledQueue: cola-ventasInterface: PJSIP/1001CallerIDNum: 987654321AgentConnect
Event: AgentConnectQueue: cola-ventasInterface: PJSIP/1001HoldTime: 45 ; Segundos que esperó el llamanteAgentComplete
Event: AgentCompleteQueue: cola-ventasInterface: PJSIP/1001TalkTime: 120 ; Duración de la llamada en segundosReason: agent ; agent, caller, transferQueueCallerAbandon
Event: QueueCallerAbandonQueue: cola-ventasPosition: 2HoldTime: 60Holdtime (Tiempo de Espera)
queue show cola-ventasTalktime (Tiempo de Conversación)
Service Level (SL)
servicelevel = 60 (60 segundos)(llamadas atendidas en <60s / total atendidas) * 100Abandonment Rate (Tasa de Abandono)
# Ver estado completo de una colaasterisk -rx "queue show cola-ventas"
# Salida:cola-ventas has 2 calls (max unlimited) in 'rrmemory' strategy (25s holdtime, 180s talktime), W:0, C:15, A:2, SL:86.7% within 60s Members: PJSIP/1001 (dynamic) (Not in use) has taken 5 calls (last was 120 secs ago) PJSIP/1002 (dynamic) (In use) has taken 7 calls (last was 5 secs ago) PJSIP/1003 (dynamic) (paused) (Not in use) has taken 3 calls (last was 300 secs ago) Callers: 1. SIP/trunk-00000001 (wait: 0:15, prio: 0) 2. SIP/trunk-00000002 (wait: 0:08, prio: 0)Interpretación:
holdtime: 25s - Promedio de esperatalktime: 180s - Promedio de duraciónC:15 - 15 llamadas completadasA:2 - 2 llamadas abandonadasSL:86.7% - 86.7% atendidas en < 60s[cola-produccion]timeout = 20 ; Tiempo que suena el agenteretry = 5 ; Pausa antes de siguiente agentetimeoutpriority = conf ; Priorizar timeout de config sobre dialplan¿Por qué timeoutpriority=conf?
wrapuptime = 15autopause = yesautopausedelay = 60autopausedelay: Espera 60s antes de pausar (por si están en baño)ringinuse = noyes si tienes call waiting configurado[general]persistentmembers = yesmaxlen = 50maxlen = (agentes * 3) + bufferannounce-frequency = 30announce-holdtime = yesannounce-position = yesperiodic-announce = custom/espere-por-favorperiodic-announce-frequency = 60Verificar:
# 1. ¿Está el agente logueado?asterisk -rx "queue show cola-ventas"
# 2. ¿Está pausado?# Buscar "(paused)" en la salida
# 3. ¿Está el dispositivo registrado?asterisk -rx "pjsip show endpoints"
# 4. ¿Hay hints configurados?asterisk -rx "core show hints"Solución común:
# Despausar agenteasterisk -rx "queue unpause member PJSIP/1001 queue cola-ventas"Verificar dialplan:
asterisk -rx "dialplan show ruta-entrante"Verificar que la cola existe:
asterisk -rx "queue show cola-ventas"Verificar MOH:
asterisk -rx "moh show classes"En queues.conf:
musicclass = default ; Debe coincidir con moh.conf[general]persistentmembers = yesautofill = yes
[cola-basica]strategy = rrmemorytimeout = 20retry = 5wrapuptime = 10autopause = yesringinuse = nomusicclass = defaultEn el Taller 10 construiremos una central completa con:
🛠️ Taller 10 - Central Telefónica Completa
¿Listos para construir una central profesional? En el próximo taller, implementaremos un sistema completo con IVR, horarios, colas y grabación. Verás las colas en acción con casos de uso reales.