Asterisk настройка очереди - queues.conf
Очередь входящих вызовов Asterisk. Подробное описание стратегии вызовов. Penalty, timeout, member и все доступные параметры. Примеры.
Основы работы с очередями в Asterisk
Для создания статической очереди, достаточно определить её имя в квадратных скобках и стратегию вызова операторов. Остальные параметры будут назначены по умолчанию.
/etc/asterisk/queues.conf
[queue_01] strategy = ringall
В дальнейшем имя очереди будет использовано для вызова ее в диалплане командой Queue.
exten => s,1,Queue(queue_01)
Для применения параметров очередей и управления ими, могут быть использованы команды консоли Asterisk:
*CLI> queue add reload remove reset set show pause unpause
Asterisk queue reload
*CLI> queue reload members parameters rules all
Выполните queue reload all для инициации новой очереди и queue show <имя очереди> для её отображения в консоли Asterisk:
Asterisk queue status
*CLI> queue show queue_01 queue_01 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s No Members No Callers
В данном случае очередь пуста, принимать вызовы некому. Агенты принимающие вызовы в очереди могут быть статическими, т.е. назначены в конфиге очереди - queues.conf:
/etc/asterisk/queues.conf
[queue_01] strategy = ringall member = PJSIP/2777
Теперь у очереди есть members, пользователи для обработки входящих вызовов:
*CLI> queue show queue_01 queue_01 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s Members: PJSIP/2777 (ringinuse enabled) (Not in use) has taken no calls yet No Callers
Или же, агенты могут быть динамическими, т.е. добавляться при помощи интерфейсов Asterisk - CLI, AMI или AGI.
Пример конфигурации очереди
Комментарии даны относительно заданного в примере значения.
- [queue_01] ;имя очереди, все параметры заданные после него и до следующих […] скобок, будут относится к данной очереди.
- announce-frequency=45 ;объявление каждые 45 секунд
- announce-holdtime=yes ;объявлять среднее время ожидания
- announce-position=yes ;объявлять позицию в очереди
- autofill=yes ;включить автозаполнение очереди
- autopause=no ;не вкл. автопаузу если оператор не ответил на вызов
- autopausebusy=no ; не вкл. автопаузу, если оператор не ответил на вызов когда был занят.
- autopausedelay=0 ; таймаут автопаузы =0 (выкл.)
- autopauseunavail=yes ;вкл. автопаузу, если оператор недоступен.
- joinempty=paused,penalty,inuse,ringing ;присоединиться к очереди, даже если все операторы имеет один из перечисленных статусов.
- leavewhenempty=no ;не покидать очередь из-за если все недоступны
- maxlen=11 ;максимально кол-во ожидающих в очереди = 11
- memberdelay=0 ; пауза между перед соединением агента и вызывающего абонента = 0
- monitor-type=mixmonitor ; приложение записи - mixmonitor
- penaltymemberslimit=5 ;если очередь обслуживают 5 или меньше операторов, не использовать пенальти
- periodic-announce-frequency=0 ;не делать объявление: все операторы заняты (по умолч.)
- queue-callswaiting=queue-callswaiting ;файлы объявлений в очереди.
- queue-thankyou=queue-thankyou
- queue-thereare=queue-thereare
- queue-youarenext=queue-youarenext
- reportholdtime=no ; не объявлять агенту время, которое абонент провел в очереди
- retry=5 ;пауза перед повторным вызовом оператора 5 секунд.
- ringinuse=no ; не вызывать операторов со статусом 'in use' (вызывается очередью).
- servicelevel=20 ; считать процент вызовов отвеченных в течении 20 секунд.
- setqueuevar=yes ; задать переменные очереди
- setinterfacevar=yes ;задать переменные интерфейсов (операторов очереди)
- setqueueentryvar=yes ;задать переменные сред. время ожидания и позиция абонента.
- strategy=ringall ; стратегия - звонят все операторы
- timeout=15 ; время вызова операторов, перед retry
- timeoutpriority=app ; приоритет таймаута приложения
- timeoutrestart=yes ; сбросить таймаут оператора, если он CONGESTION
- weight=0 ;вес очереди = 0
- wrapuptime=0 ;время отдыха оператора после вызова = 0
- member=PJSIP/2777 ;пользователь очереди.
Общие (глобальные) настройки очередей.
[general]
Persistent Members (Постоянные пользователи )
Сохранять каждого динамического пользователя во внутренней БД Asterisk (astdb), чтобы после перезагрузки, все пользователи были восстановлены из записей очереди в astdb. см. также RemoveQueueMember По умолчанию:
persistentmembers = no
AutoFill Behavior (Автозаполнение очереди)
Старое, по умолчанию, поведение очереди (autofill=no) подразумевало последовательный тип подключения, при котором ожидающий абонент, подключался к пользователю, только с первой позиции в очереди. Новое поведение по умолчанию, (autofill=yes) позволяет ожидающему абоненту, подключится к пользователю (агенту) очереди, с любой позиции, если есть свободные агенты, не дожидаясь, пока он займет головную позицию. Такое поведение позволяет быстрее обрабатывать вызовы и является предпочтительным.
autofill = yes
Monitor Type (Приложение для записи разговоров )
Приложение MixMonitor записывает разговор непосредственно в один файл, в отличии от устаревшего Monitor, раздельно записывающего вх. исх. голосовые потоки.
monitor-type = MixMonitor
UpdateCDR behavior(Изменить поведение CDR)
Записать в поле CDR dstchannel имя агента, которое вы можете установить во время входа в систему с параметром MemberName AddQueueMember.
updatecdr = yes
shared_lastcall (общий последний вызов)
Если оператор (агент) обслуживает больше чем одну очередь, учитывать параметры, такие как wrapuptime (пауза после завершения разговора в течении которой на агента не поступают вызовы), для всех вызовов, из всех очередей.
shared_lastcall=no
Negative_penalty_invalid
Рассматривать операторов с отрицательным пенальти, как неактивных (не подавать на них вызовы).
negative_penalty_invalid = no
log_membername_as_agent
Регистрировать агентов с именем, а не номером интерфейса. параметр для обратной совместимости, поведение как при работе с модулем chan_agents.
log_membername_as_agent = no
Параметры очередей Asterisk
[queuename]
Musicclass
Устанавливает класс Музыки на Удержании (MOH) используемый данной очередью. Эта установка будет иметь приоритет над всеми, кроме переменной канала, заданной в диалплане: Set(CHANNEL(musicclass)=whatever)
musicclass = default
announce
Сообщение пользователю обслуживающему очередь. Сообщение может быть проиграно пользователю (а не вызывающему абоненту) перед тем, как он примет вызов, например , для идентификации очереди, из которой поступил вызов, если агент обслуживает более одной очереди.
announce = file_to_play
Asterisk queue strategy
Стратегия вызова операторов очереди.
Важнейший параметр, указывает как будет распределяться вызовы между агентами:
- ringall - вызываются все пользователи одновременно, пока кто-нибудь не ответит (по умолчанию)
- leastrecent - вызвать оператора дольше всех не принимавшего вызовы.
- fewestcalls - вызвать оператора принявшего меньше всего вызовов.
- random - распределить вызовы случайным образом.
- rrmemory - по кругу (round robin), после агента отвечавшего крайним.
- linear - вызывать начиная с первого в порядке перечисления. Динамические агенты, будут вызываться в порядке добавления.
- wrandom - звонит случайный интерфейс, но использует штраф этого участника в качестве веса (weight) при расчете метрики.
Таким образом, оператор с пенальти 0 будет иметь метрику в диапазоне от 0 до 1000,
оператор с пенальти 1 от 0 до 2000,
а оператор с пенальти 2 будет иметь метрику между 0 и 3000.
Обратите внимание, что при использовании этой стратегии, пенальти оператора не такой же,
как при использовании других стратегий очереди.
Он используется ТОЛЬКО в качестве весового коэффициента для вычисления метрики.
strategy = ringall
servicelevel
Параметр статистики. Задает диапазон от 0 до servicelevel= в секундах. Приложение app_queue высчитает процент вызовов, отвеченных за указанный период. Например, если servicelevel=30 ожидавших в очереди не более 30-ти секунд.
servicelevel=30
Ниже приведен пример, где мы видим, что 89.4% процента вызовов в очереди q1 были отвечены в течении 30 секунд (SL:89.4% within 30s).
*CLI> queue show q1 q1 has 0 calls (max unlimited) in 'leastrescent' strategy (6s holdtime, 120s talktime), W:0, C:5156, A:584, SL:89.4% within 30s Members: SIP/4886 (ringinuse disabled) (Not in use) has taken no calls yet SIP/4887 (ringinuse disabled) (Not in use) has taken no calls yet PJSIP/4889 (ringinuse disabled) (Unavailable) has taken no calls yet No Callers
context
Указывает на контекст диалплана, в который ожидающий в очереди абонент может попасть набором одной цифры в DTMF. В контексте должен быть определен екстеншен для обработки этой цифры. Например, можно использовать для интерактивного меню.
context = context_name
penaltymemberslimit
не использовать penalty, если очередь обслуживают кол-во операторов меньшее или равное тому, что указано:
penaltymemberslimit = 5
Asterisk queue Timeout
Примечание для рассматриваемых далее таймаутов очереди.
Таймаут выхода из очереди по не ответу, не является параметром очереди, а может быть назначен как опция вызова приложения Queue
Queue(queuename,[options],[optionalurl],[announceoverride],[timeout])
Пример:
Queue(queuename,t,,,45)
Timeout
Очередь имеет два разных «таймаута» связанных с ней. Один из них назначается в queue.conf.
Этот таймаут указывает в течении какого промежутка времени, в секундах, будет вызываться телефон пользователя, прежде чем будет считаться, что он не ответил. Второй таймаут, это аргумент приложения Queue(). Это абсолютный таймаут, по истечении которого, вызов выходит из очереди и переходит на следующий приоритет в контексте. В некоторых ситуациях, эти таймауты сталкиваются. Например, если таймаут в queue.conf установлен 5 секунд, retry = 4 секунды, а таймаут приложения Queue() задан 10 секунд
произойдет следующее:
- вызов попадает в очередь
- очередь выбирает оператора и вызывает его в течении 5 секунд
- затем выдерживается время retry - 4 секунды
- очередь выбирает второго оператора.
Как долго будет вызываться второй оператор? Осталась 1 секунда до истечения абсолютного таймаута приложения Queue(). Будет ли второй оператор вызываться 1 секунду или 5 как задано в таймауте queue.conf?
Эту коллизию призван разрешить параметр timeoutpriority: если timeoutpriority=conf, то второй оператор будет вызваться в течении 5-ти секунд. Если timeoutpriority=app, то в течении 1-й секунды.
Существуют и некоторые исключения и приведенных выше правил:
предположим timeoutpriority=app, в queues.conf таймаут равен 0, а аргумент приложения Queue задан 10 сек.
Тогда timeoutpriority игнорируется, а таймаут приложения используется как таймаут вызова операторов queues/conf.
И наоборот, если таймаут приложения не задан, тогда timeoutpriority игнорируется и таймаут конф. файла queues.conf всегда используется.
Несмотря на то, что timeoutpriority=conf таймаут конфигурационного файла queues.conf имеет приоритет над таймаутом приложения,
если таймаут конф. файла равен 0, каждый участник очереди будет вызываться в течении неопределенного времени, а таймаут приложения будет проверяться после этих попыток.
По умолчанию: timeoutpriority=app
timeout = 15 retry = 5 timeoutpriority = app|conf
weight
Чем выше вес (weight) очереди, тем выше приоритет для вызова оператора обслуживающего больше одной очереди.
по умолч. 0
weight=0
wrapuptime
После завершения успешного вызова, время отдыха оператора, прежде чем он снова сможет принимать вызовы. по умолч. 0
wrapuptime=0
autofill
Переопределяет глобальную установку autofill, рассмотренную выше, отдельно для каждой очереди.
autofill=yes|no
autopause
Поставить оператора на паузу, если он не ответил на вызов. см. также PauseQueueMember
- no: Не использовать автопаузу для данной очереди.
- yes: Поставить на паузу, только в данной очереди.
- all: Поставить на паузу во всех очередях, которые обслуживает оператор.
autopause=no|yes|all
Autopausedelay
Отложить постановку на паузу оператора на время, с момента завершения последнего неудачного вызова.
autopausedelay=60
Autopausebusy
Ставить или нет оператора на паузу, если он занят (BUSY).
autopausebusy=no
Autopauseunavail
Ставить или нет оператора на паузу, если он недоступен (UNAVAILABEL).
autopauseunavail=no
maxlen
Максимально кол-во ожидающих в очереди. Если превышено, последующие вызовы будут отвергаться.
0 - неограниченно.
maxlen=0
Asterisk queue variables
variables
Примечание для рассматриваемых ниже параметров очереди - setinterfacevar, setqueueentryvar, setqueuevar. Если канал оператора (member channel) определен как Local, то для установки переменных он должен быть оптимизирован при помощи опции /n.
Например:
Local/2666@from-queue/n
Если setinterfacevar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди:
- MEMBERINTERFACE - наименование интерфейса оператора(например. Local/1234)
- MEMBERNAME - имя оператора (например. O.Agentova)
- MEMBERCALLS - кол-во вызовов принятых данным интерфейсом оператора.
- MEMBERLASTCALL - Время последнего вызова (UNIX-time).
- MEMBERPENALTY - штраф (penalty) оператора.
- MEMBERDYNAMIC - указывает динамический пользователь или нет.
- MEMBERREALTIME - указывает realtime конфигурация оператора или нет.
setinterfacevar=no
setqueueentryvar
Если setqueueentryvar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди:
- QEHOLDTIME - время ожидания вызывающего абонента.
- QEORIGINALPOS - позиция в очереди.
setqueueentryvar=no
setqueuevar
Если setqueuevar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди, при соединении или когда вызывающий абонент покидает очередь:
- QUEUENAME - имя очереди.
- QUEUEMAX - максимальное кол-во вызовов разр. в очереди;
- QUEUESTRATEGY - стратегия очереди;
- QUEUECALLS - текущее кол-во вызовов в очереди;
- QUEUEHOLDTIME - среднее время ожидания в очереди на данный момент;
- QUEUECOMPLETED - кол-во обработанных вызовов;
- QUEUEABANDONED - кол-во отвергнутых (неотвеченных) вызовов;
- QUEUESRVLEVEL - уровень обслуживания очереди;
- QUEUESRVLEVELPERF - процент вызовов отвечающих условию servicelevel на данный момент;
setqueuevar=no
membermacro
Если установлено, выполнить Macro, когда соединение с оператором установлено.
Эта опция может быть перекрыта параметром macro приложения Queue()
membermacro=macro_name[,arg1[,...][,argN]]
membergosub
Если установлено, выполнить GoSub, когда соединение с оператором установлено.
Эта опция может быть перекрыта параметром gosub приложения Queue()
membergosub=gosub_context_name[,arg1[,...][,argN]]
announce-frequency
Как часто анонсировать позицию в очереди и среднее время ожидания. Если 0 то не анонсировать. Примечание: этот параметр игнорируется при изменении позиции абонента в очереди (см. min-announce-frequency)
announce-frequency = 90
min-announce-frequency
Минимальный интервал между моментом перехода на следующую позицию и анонсом среднего времени удержания. Это полезно для избежания постоянных объявлений когда позиция в очереди абонента часто меняется. т.е., если позиция в очереди изменилась, то не оповещать, даже если подошло время announce-frequency. (см. announce-frequency)
min-announce-frequency = 15
periodic-announce-frequency
Как часто делать periodic-announce.
periodic-announce-frequency=60
random-periodic-announce
Производить периодическое оповещение в случайном порядке? По умолчанию - no.
random-periodic-announce=no
relative-periodic-announce
Отсчитывать время для periodic-announce с момента завершения предыдущего анонса, а не от его начала. по умолчанию выключено.
relative-periodic-announce=no
announce-holdtime
Включать объявление о среднем времени ожидания в объявление о позиции в очереди?
Можно указать yes, no или once (один раз).
announce-holdtime = yes|no|once
announce-position
Объявлять позицию в очереди?
Возможные значения: «yes», «no», «limit», или «more».
- yes - оповещать о позиции ожидающего абонента;
- more - если кол-во ожидающих в очереди больше чем задано в announce-position-limit.
т.е., если announce-position-limit=5 объявлять, что в очереди ожидают больше 5-ти абонентов.
- limit - только ожидающие абоненты в пределах announce-position-limit услышат объявление.
- no - не объявлять позицию.
announce-position = yes
announce-to-first-user
Если включено, то объявления будут проигрываться первому в очереди. Это может привести к ситуации, когда агент готов принять вызов, но соединени откладывается из-за объявления и приведет к задержкам в очереди. по умолчанию выключено.
announce-to-first-user = no
announce-position-limit
Если назначено «limit» или «more» в announce-position будет задействован этот параметр.
announce-position-limit = 5
announce-round-seconds
Округлять тайминги объявлений до заданного значения, если не = 0
Возможные значения 0, 5, 10, 15, 20, and 30.
announce-round-seconds = 10
Аудио файлы используемые для объявлений
Если не заданы другие, используются файлы перечисленные ниже:
queue-youarenext = queue-youarenext ;(«You are now first in line.»)
queue-thereare = queue-thereare ; («There are»)
queue-callswaiting = queue-callswaiting ; («calls waiting.»)
queue-holdtime = queue-holdtime ; («The current est. holdtime is»)
queue-minute = queue-minute ; («minute.»)
queue-minutes = queue-minutes ; («minutes.»)
queue-seconds = queue-seconds ; («seconds.»)
queue-thankyou = queue-thankyou ; («Thank you for your patience.»)
queue-reporthold = queue-reporthold ; («Hold time»)
periodic-announce = queue-periodic-announce ; («All reps busy / wait for next»)
queue-less-than
queue-quantity1
queue-quantity2
periodic-announce
Можно установить несколько звуковых файлов для основного объявления через запятую.
Файлы будут воспроизведены в порядке перечисления.
Например:
periodic-announce = queue-periodic-announce,your-call-is-important,please-wait
monitor-format
Для включения записи вызовов, требуется задать «monitor-format»,
если monitor-format не задан, запись разговоров считается выключенной.
Вызовы будут записаны только с момента поднятию трубки оператором.
monitor-format = gsm|wav|wav49
Queue Empty Options(параметры заполнения очереди)
Параметры очереди Asterisk «joinempty» и «leavewhenempty» регламентируют условия при которых абонент может встать в очередь и покинуть ее, соответственно.
Параметры «joinempty» и «leavewhenempty» могут принимать несколько значений, перечисленных через запятые.
Ниже приведем список факторов влияющих на эти параметры:
- paused: считать недоступным, если оператор на паузе;
- penalty: считать недоступным, если пенальти оператора меньше чем QUEUE_MAX_PENALTY;
- inuse: считать недоступным, если телефон оператора в данный момент вызывается (звонит);
- ringing: a member is not considered available if his phone is currently ringing
- unavailable: Касается в основном каналов Agent (заданных в agents.conf). если агент назначен в agent.conf, но не зарегистрировался(каналы Agent можно считать устаревшими)
- invalid: Интерфейсы имеющие статус «invalid».
- unknown: Не имеющий явного статуса оператор.
- wrapup: Оператор на таймауте wrapuptime после вызова.
Пример, не подключаться к очереди,если все операторы имеют один из перечисленных статусов:
joinempty = paused,inuse,invalid
Покинуть очередь, если все операторы имеют один из указанных статусов:
leavewhenempty = inuse,ringing
; Устаревшие значения, могут быть указаны для обратной совместимости:
- yes - (empty) for joinempty; penalty,paused,invalid for leavewhenempty
- no - penalty,paused,invalid for joinempty; (empty) for leavewhenempty
- strict - penalty,paused,invalid,unavailable
- loose - penalty,invalid
reportholdtime
Если нужно оповестить оператора о том сколько абонент ожидал в очереди.
reportholdtime = no
ringinuse
Чтобы избежать посылки вызова на оператора, чей интерфейс находится с состоянии 'in use', установите = no. Помимо общего значения очереди, можно установить этот параметр для отдельных пользователей очереди через команду QUEUE_MEMBER, поле 'ringinuse' реалтайм пользователей и CLI/AMI:
*CLI> queue set ringinuse no on SIP/4887 in queue1
SIP/4887 (ringinuse disabled) (dynamic) (Not in use)
*CLI> queue set ringinuse yes on SIP/4887 in queue1
SIP/4887 (ringinuse enabled) (dynamic) (Not in use)
только драйверы каналов SIP и PJSIP поддерживают в данный момент статус 'in use'
ringinuse = no
memberdelay
Параметр устанавливает время задержки между моментом, когда агент отвечает на вызов и соединения его с вызывающим абонентом.
memberdelay = 0
timeoutrestart
Если параметр «timeoutrestart» установлен в значение yes, тогда значение таймаута для агента будет сбрасываться, если от него будет получен сигнал BUSY или CONGESTION. Это бывает полезно, когда агент имеет возможность отметить вызов, отвергая его или, производя некоторые действия, которые имеют подобный эффект. (Обнаружено, что если вызов агента завершился со статусом NOANSWER (ring, no-answer), это так же заставляет вызов отправить к следующему агенту в очереди по алгоритму roundrobin).
timeoutrestart = no
defaultrule
назначить правила по умолчанию. Конфигурация находится в queuerules.conf
defaultrule = myrule
Asterisk queue Members
Каждый пользователь очереди перечисляется в отдельной строке
в виде технология/строка набора. Под пользователем понимается оператор очереди.
Дополнительный параметр penalty может быть задан после запятой.
Каждый оператор очереди Asterisk имеет параметр penalty.
Пенальти может быть определен в настройках пользователя очереди:
member ⇒ interface[,penalty][,membername][,state_interface][,ringinuse]
или при добавлении динамического агента:
queue add member <dial string> to <queue> [[[penalty <penalty>] as <membername>] state_interface <interface>]
Данный параметр определяет приоритет для посылки вызова на оператора, чем ниже пенальти, тем выше приоритет при выборе оператора для вызова.
Если пенальти не задан, то по умолчанию = 0
Предположим, очередь обслуживают 3 оператора с пенальти - 0,1 и 2 соответственно.
Первым будет вызван оператор с пенальти = 0 и только если он недоступен, оператор с пенальти = 1 и так далее.
Пенальти оператора может быть динамически изменен, например через CLI:
queue set penalty <penalty> on <interface> [in <queue>]
или через AMI Actions QueuePenalty.
Пользователи с большим значением пенальти имеют, более низкий приоритет для вызовов.
После второй запятой назначается имя.
Использование имени может быть удобно для представления в логах очереди.
Разные интерфейсы могут использовать одно имя.
Дополнительное описание интерфейса указывается после третьей запятой.
На этот интерфейс будут посылаться уведомления app_queue,
но для вызова будет всегда использоваться указанный первым интерфейс.
member => interface [,penalty][,membername][,state_interface][,ringinuse]
member => DAHDI/1 member => DAHDI/2,10 member => DAHDI/3,10,Stev Morrissev member => Local/1000@default,0,Patty Smithoff,SIP/1000 member => Local/2000@default,0,Syd Buratinov,SIP/2000,no