Parqueo de Llamadas en Asterisk 20: Guía Completa de Configuración

El parqueo de llamadas (call parking) es una funcionalidad esencial en sistemas telefónicos empresariales que permite a los usuarios "estacionar" temporalmente una llamada en un slot virtual para que pueda ser recuperada desde cualquier otro teléfono en la red. En Asterisk 20, esta característica se implementa a través del módulo res_parking y ofrece gran flexibilidad de configuración.

¿Qué es el Call Parking?

Imagina esta situación: recibes una llamada en tu extensión y necesitas que un compañero en otra área la atienda. En lugar de transferirla directamente, puedes "parquear" la llamada en un slot (por ejemplo, el 701), colgar y simplemente gritarle a tu compañero "llamada en el 701". Él marca 701 desde su teléfono y recupera la llamada.

El parqueo de llamadas se configura en el archivo res_parking.conf, ubicado en /etc/asterisk/. Este archivo define los contextos de parqueo, los rangos de slots disponibles y el comportamiento del sistema.

Estructura Básica del Archivo

[general]
; Configuración global del módulo de parqueo

[default]
; Contexto de parqueo por defecto
parkext => 700                    ; Extensión para parquear llamadas
parkpos => 701-720                ; Rango de slots de parqueo disponibles
context => parkedcalls            ; Contexto donde van las llamadas parqueadas
parkingtime => 45                 ; Tiempo de espera antes de retornar (segundos)
comebacktoorigin => yes           ; Retornar al origen si no se recupera
comebackcontext => default        ; Contexto al que retorna
comebackdialtime => 30            ; Tiempo de marcado al retornar
courtesytone => beep              ; Tono de cortesía al parquear
parkedplay => caller              ; A quién se reproduce música (caller/callee/both)
parkedmusicclass => default       ; Clase de música en espera
findslot => next                  ; Algoritmo de búsqueda (next/first)
parkedcalltransfers => caller     ; Quién puede transferir (caller/callee/both/no)
parkedcallreparking => caller     ; Quién puede re-parquear (caller/callee/both/no)
parkedcallhangup => caller        ; Quién puede colgar (caller/callee/both/no)
parkedcallrecording => caller     ; Quién puede grabar (caller/callee/both/no)

Ejemplo de Configuración Completa

[general]

[companyparking]
; Parqueo para la empresa principal
parkext => 700
parkpos => 701-720
context => parkedcalls
parkingtime => 60
comebacktoorigin => yes
comebackcontext => from-internal
courtesytone => beep
parkedplay => caller
parkedmusicclass => default
findslot => next

[vipparking]
; Parqueo especial para clientes VIP con más tiempo
parkext => 800
parkpos => 801-810
context => vip-parkedcalls
parkingtime => 120
comebacktoorigin => yes
comebackcontext => from-internal
courtesytone => beep
parkedplay => both
parkedmusicclass => vip-music

Aplicaciones Principales

1. Park()

Parquea la llamada actual en un slot disponible.

; Uso básico
exten => _*85,1,Park()

; Parqueo en un contexto específico
exten => _*86,1,Park(companyparking)

; Parqueo con opciones
exten => _*87,1,Park(,,,s)  ; 's' = anunciar el slot

Opciones de Park():

  • s = Announce slot (anunciar el número de slot)
  • r = Return to parker on timeout (retornar al que parqueó)
  • R = Randomize return position (posición aleatoria de retorno)
  • c(context) = Override comeback context (sobrescribir contexto de retorno)
  • t(timeout) = Override timeout (sobrescribir tiempo de espera)

2. ParkedCall()

Recupera una llamada parqueada desde un slot específico.

; Recuperar llamada del slot 701
exten => 701,1,ParkedCall(701)

; Recuperar con contexto específico
exten => 801,1,ParkedCall(801,vipparking)

3. ParkAndAnnounce()

Parquea la llamada y anuncia el slot en otro canal.

; Sintaxis:
; ParkAndAnnounce(announce_template,timeout,dial,return_context)

exten => _*88,1,ParkAndAnnounce(pbx-parkingspot:PARKED,45,SIP/recepcion)

Esta aplicación es útil cuando quieres que el sistema llame automáticamente a alguien y le diga "Llamada parqueada en el slot X".

Funciones Dialplan

PARK_GET_CHANNEL()

Obtiene el canal parqueado en un slot específico.

exten => _*89,1,NoOp(Verificando slot 701)
exten => _*89,n,Set(PARKED_CHANNEL=${PARK_GET_CHANNEL(701)})
exten => _*89,n,GotoIf($["${PARKED_CHANNEL}" = ""]?empty:occupied)
exten => _*89,n(occupied),NoOp(Slot 701 ocupado por: ${PARKED_CHANNEL})
exten => _*89,n,Hangup()
exten => _*89,n(empty),NoOp(Slot 701 está libre)
exten => _*89,n,Hangup()

Sintaxis:

${PARK_GET_CHANNEL(parking_space[,parking_lot])}
  • parking_space = Número del slot (ej: 701)
  • parking_lot = Nombre del lote de parqueo (opcional, usa default si no se especifica)
  • Retorna el nombre del canal parqueado o cadena vacía si el slot está libre

Para Teléfonos SIP/PJSIP

Los endpoints deben estar configurados para poder acceder al contexto de parqueo y recuperar llamadas parqueadas.

Configuración en pjsip.conf

[6001](endpoint-basic)
type=endpoint
context=from-internal
allow=!all,ulaw,alaw,g722
auth=6001
aors=6001
; Permitir transferencias para parqueo
allow_transfer=yes
trust_id_outbound=yes

[6001]
type=auth
auth_type=userpass
password=secreto123
username=6001

[6001]
type=aor
max_contacts=1

Configuración en extensions.conf

Debes crear un contexto que incluya acceso al parqueo:

[from-internal]
; Acceso a extensiones internas
exten => _6XXX,1,Dial(PJSIP/${EXTEN},30)

; Feature code para PARQUEAR llamada (durante llamada activa)
exten => _*85,1,Park()
exten => _*85,n,Hangup()

; Recuperar llamadas parqueadas (marcando el slot)
include => parkedcalls

; Ver estado de parking slots
exten => *90,1,Answer()
exten => *90,n,Playback(silence/1)
exten => *90,n,ParkingStatus()
exten => *90,n,Hangup()

[parkedcalls]
; Este contexto es generado dinámicamente por Asterisk
; Automáticamente contiene los slots 701-720 según res_parking.conf
; No necesitas definir manualmente cada extensión

Uso con Blind Transfer (Transferencia Ciega)

Para que los usuarios puedan parquear llamadas usando el botón de transferencia de su teléfono:

[from-internal]
; ... otras extensiones ...

; Extensión 700 = Parqueo automático
exten => 700,1,Park()
exten => 700,n,Hangup()

; Slots de recuperación (se incluyen automáticamente)
include => parkedcalls

Proceso del usuario:

  1. Usuario está en llamada activa
  2. Presiona botón "Transfer" (transferencia ciega)
  3. Marca 700
  4. Sistema parquea la llamada y anuncia el slot
  5. Usuario cuelga

Para recuperar:

  1. Cualquier usuario marca el número de slot (ej: 701)
  2. Se conecta con la llamada parqueada

Comando CLI: parking show

Desde la consola de Asterisk, puedes monitorear el estado de los slots:

asterisk -rx "parking show"

Salida ejemplo:

Parking lot: companyparking
Extension: 700
Context: parkedcalls
Parking positions: 701-720
Parking time: 60 seconds
Comeback context: from-internal

Parked calls:
Space      Channel                   Caller         Timeout
701        PJSIP/6001-00000012       6002           45 seconds
703        PJSIP/6003-00000014       6005           30 seconds

2 parked calls

Script de Monitoreo con AMI (Asterisk Manager Interface)

Puedes crear scripts para monitorear los slots via AMI:

#!/usr/bin/env python3
import asterisk.manager

# Conectar al AMI
manager = asterisk.manager.Manager()
manager.connect('localhost')
manager.login('admin', 'password')

# Obtener estado de parking
response = manager.command('parking show companyparking')
print(response.data)

manager.logoff()

Hints para BLF (Busy Lamp Field)

Configura hints para que los teléfonos con teclas BLF muestren el estado de los slots:

[from-internal]
; Hints para parking slots
exten => 701,hint,park:701@companyparking
exten => 702,hint,park:702@companyparking
exten => 703,hint,park:703@companyparking
; ... hasta 720

En el teléfono (ejemplo Yealink):

<BLFList>
  <Unit1 Key="1" Label="Park 701" Value="701" Extension="701"/>
  <Unit2 Key="2" Label="Park 702" Value="702" Extension="702"/>
  <Unit3 Key="3" Label="Park 703" Value="703" Extension="703"/>
</BLFList>

Los LEDs del teléfono mostrarán:

  • Verde: Slot libre
  • Rojo: Slot ocupado
  • Parpadeando: Llamada próxima a timeout

Notificaciones Personalizadas

Crear un script que envíe alertas cuando un slot está por hacer timeout:

[parkedcalls-custom]
; Cuando una llamada está cerca del timeout
exten => h,1,NoOp(Call timeout warning)
exten => h,n,System(echo "Slot ${PARKEDLOT} timeout in 10 seconds" | mail -s "Parking Alert" admin@empresa.com)

Configuración Avanzada: Múltiples Lotes de Parqueo

Puedes crear diferentes lotes para diferentes departamentos:

[sales-parking]
parkext => 7000
parkpos => 7001-7010
context => sales-parked
parkingtime => 45
comebackcontext => sales-context

[support-parking]
parkext => 8000
parkpos => 8001-8020
context => support-parked
parkingtime => 90
comebackcontext => support-context

[vip-parking]
parkext => 9000
parkpos => 9001-9005
context => vip-parked
parkingtime => 180
comebackcontext => vip-context
parkedmusicclass => vip-hold-music

En extensions.conf:

[sales-context]
exten => _8XXX,1,Dial(PJSIP/${EXTEN})
exten => 7000,1,Park(sales-parking)
include => sales-parked

[support-context]
exten => _9XXX,1,Dial(PJSIP/${EXTEN})
exten => 8000,1,Park(support-parking)
include => support-parked

Solución de Problemas Comunes

Problema: Las llamadas no se parquean

Verificar:

  1. Módulo cargado: module show like parking
  2. Configuración válida: parking show
  3. Contexto incluido en dialplan
  4. Permisos de transferencia en endpoint

Problema: No se pueden recuperar llamadas parqueadas

Verificar:

  1. Include del contexto parkedcalls en el dialplan del usuario
  2. Que el slot existe: parking show
  3. Que el usuario tiene acceso al contexto correcto

Problema: Llamadas retornan antes de tiempo

Verificar:

  1. Parámetro parkingtime en res_parking.conf
  2. RTP timeout en pjsip.conf: rtp_timeout y rtp_timeout_hold

Debugging

Habilitar logs de parking:

; En logger.conf
[logfiles]
parking => notice,warning,error,debug,verbose

Desde CLI:

core set verbose 5
core set debug 5
module reload res_parking.so

Mejores Prácticas

  1. Timeouts apropiados: No menos de 45 segundos para evitar retornos prematuros
  2. Límite de slots: No crear más slots de los necesarios (máximo 20-30 por lote)
  3. Música en espera: Configurar MOH apropiada para mantener al llamante informado
  4. BLF monitoring: Implementar hints para visibilidad inmediata
  5. Contextos separados: Usar diferentes lotes para diferentes departamentos
  6. Documentación: Capacitar a usuarios sobre los feature codes (*85, 700, etc.)
  7. Monitoreo: Implementar scripts de alertas para timeouts
  8. Backup configuration: Siempre respaldar res_parking.conf antes de cambios

El sistema de parqueo de llamadas en Asterisk 20 es una herramienta poderosa que mejora significativamente la experiencia de manejo de llamadas en entornos empresariales. Con una configuración adecuada de res_parking.conf, las aplicaciones correctas en el dialplan y endpoints bien configurados, puedes implementar un sistema robusto que incluye monitoreo visual a través de BLF y notificaciones automáticas de timeout.

La clave está en:

  • Configurar correctamente res_parking.conf con timeouts y rangos apropiados
  • Incluir el contexto parkedcalls en los contextos de usuarios
  • Configurar hints para monitoreo BLF en teléfonos
  • Implementar feature codes intuitivos (*85 para parquear, 700 como extensión de parqueo)
  • Monitorear activamente el estado de los slots para prevenir pérdidas de llamadas

Con esta guía completa, estás listo para implementar y administrar un sistema profesional de parqueo de llamadas en tu infraestructura Asterisk 20.

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo
Suscribirse a Comentarios de "Parqueo de Llamadas en Asterisk 20: Guía Completa de Configuración" Suscribirse a VozToVoice - Todos los comentarios