- FreePBX. Настройка Asterisk для e-mail уведомлений о пропущенных входящих вызовах в очереди
- FreePBX Очереди — Queue
- Queue General Settings
- Queue number
- Queue Name
- Queue Password
- Generate Device Hints
- Call confirm
- Call Confirm Announce
- CID name prefix
- Wait Time Prefix
- Alert Info
- Restrict Dynamic Agents
- Agent Restrictions
- Ring Strategy
- Autofill
- Skip Busy Agents
- Queue Weight
- Music on Hold Class
- Join Announcement
- Call Recording
- Mark calls answered elsewhere
- Fail Over Destination
- Timing & Agent Options
- Max Wait Time
- Max Wait Time Mode
- Agent Timeout
- Agent Timeout Restart
- Retry
- Wrap-Up-Time
- Member Delay
- Agent Announcement
- Report Hold Time
- Auto Pause
- Auto Pause on Busy
- Auto Pause on Unavailable
- Auto Pause Delay
- Capacity Options
- Max Callers
- Join Empty
- Leave Empty
- Penalty Members Limit
- Caller Announcements
- Frequency
- Announce Position
- Announce Hold Time
- Periodic Announcements
- IVR Break Out Menu
- Advanced options
- Service Level
- Фильтр регулярных выражений для операторов
FreePBX. Настройка Asterisk для e-mail уведомлений о пропущенных входящих вызовах в очереди
IP ATC Asterisk — это мощный комбайн в области IP-телефонии. А web-интерфейс FreePBX, созданный для Asterisk, значительно упрощает настройку и снижает порог вхождения в систему.
Если вы можете придумать какую-либо задачу, связанную с IP-телефонией, то почти наверняка это можно реализовать в Asterisk. Но будьте уверены, что от вас потребуется упорство и выдержка.
Перед нами встала задача настроить e-mail уведомления о пропущенных вызовах. Точнее говоря, оповещать через e-mail о тех случаях, когда входящий вызов перешёл в очередь, но никто (из агентов) так и не ответил на этот входящий вызов.
На удивление мы не обнаружили штатных средств для решения этой задачи во FreePBX. О том, как мы решили эту задачу, расскажу под катом.
Предисловие
Перед решением задачи «в лоб» мы конечно поискали информацию в интернете, но решения под ключ не нашли (возможно плохо искали, но что поделаешь… ).
Навыков работы непосредственно в Asterisk не так много, как хотелось бы, поэтому решение, предлагаемое здесь, не было до конца осмыслено и было отброшено.
Понравилось решение, предложенное здесь, хоть оно и не заработало. Отсюда подчеркнули, что работать в Asterisk нужно в контексте очередей [ext-queues]. И так как мы работаем во Freepbx, то работать нужно в файле конфигурации «extensions_override_freepbx.conf». Обратили внимание на то, что «ловить пропущенные вызовы» удобно перед событием hangupcall (окончание вызова).
Прочитав обсуждение здесь, появилась идея о том, что нужно фильтровать в CDR переменную «Disposition» по всем агентам в очереди. А после прочтения этой информации сформировались вполне конкретные шаги по решению поставленной задачи.
Есть FreePBX 13.0.197, который использует Asterisk 13.12.1. Версия ОС SHMZ release 6.6 (Final). Дистрибутив базируется на CentOS.
В Asterisk настроен IVR (голосовое меню) раскидывающий входящие вызовы на разные Queues (очереди). Каждой очереди назначены Agents (агенты), т. е. операторы.
Что происходит в Asterisk
Когда на Asterisk поступает входящий вызов, этот вызов попадает на IVR. Звонящий делает выбор, нажав определенную цифру на телефоне, и попадает в определенную очередь. После этого всем свободным агентам очереди одновременно поступает звонок.
Для того чтобы лучше понять, что происходит в этот момент и что происходит дальше, обратимся к Report CDR (Рис.1).
Рис.1
Когда входящий вызов попал в очередь, у всех агентов значение переменной «Disposition» стало равным «NO ANSWER», если агенты в этот момент были не заняты. Переменная «Disposition» могла принять и другие значения (см. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr), кроме значения «ANSWERED». А в тот момент, когда один из агентов отвечает на входящий вызов, значение переменной «Disposition» этого агента становится равной «ANSWERED».
Из Report CDR можно заметить, что когда вызов перешел в очередь (в колонке App значение становится равным «Queue»), то все события фигурируют с одинаковым «uniqueid» (колонка System).
Важно понимать что такое CDR, и в какой именно момент в CDR заносятся данные, которые мы наблюдаем в Report CDR. CDR, относительно операционной системы — это база данных, в которую Asterisk записывает детализированный отчет вызовов (см. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr). В нашем случае это база под именем asteriskcdrdb, которая находится в mysql. Опытным путем мы установили, что данные о вызове с определенным «uniqueid» заносятся в asteriskcdrdb не сразу после возникновения какого-либо события, а после события hangupcall (окончание вызова).
Принцип работы созданного решения
Так как у нас познаний в bash больше, чем познаний в Asterisk, то основная идея получилась следующей. Перед событием hangupcall вызвать bash-скрипт. В этот скрипт передать 3 параметра. Первый параметр «uniqueid», для фильтрации данных, получаемых из CDR. Второй параметр «CALLERID(num)» (номер звонившего), чтобы знать кому перезвонить. Третий параметр «NODEST» (номер очереди), в которую поступил звонок, для того, чтобы знать по какому вопросу был звонок, и кому отправить e-mail уведомление о пропущенном вызове.
Bash-скрипт должен подключиться к базе asteriskcdrdb в mysql и взять все значения переменной «Disposition» с определенным «uniqueid». Из полученных данных нужно исключить значения: «NO ANSWER», «BUSY», «FAILED», «UNKNOWN». В результате останутся либо «ANSWERED» — на входящий вызов ответили, либо вообще ни чего — пропущенный вызов.
Далее, если вызов оказался пропущенным, то скрипт должен отправить e-mail уведомление.
Забегая вперед отмечу важный момент. Asterisk выполняет команды последовательно, дожидаясь их выполнения (что в общем-то логично). А вызывать bash-скрипт мы будем до того, как выполнится команда hangupcall. Таким образом в момент непосредственного выполнения скрипта, в CDR еще не будет внесена информация об искомом нами «uniqueid». Для решения этой проблемы bash-скрипт мы будем вызывать с параметром «&», чтобы Asterisk сразу перешел к выполнению следующего шага, т. е. hangupcall. А внутри bash-скрипта, в самом начале, мы установим небольшую задержку по времени, чтобы дать время для Asterisk внести данные с интересующим нас «uniqueid» в CDR.
Перед тем как перейти к настройке Asterisk и созданию bash-скрипта, нужно настроить отправку e-mail уведомлений. Для этого мы будем использовать утилиту postfix.
У нас есть почтовый домен «lucky.ru», расположенный в Яндексе. Мы настроим postfix в режим smtp-клиента и будем отправлять письма с аккаунта asterisk@lucky.ru.
За основу взято решение отсюда: https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex.
Сначала установим/обновим/проверим наличие пакетов:
Не будем затирать основной файл конфигурации postfix «/etc/postfix/main.cf», а создадим его резервную копию:
Редактируем файл «/etc/postfix/main.cf» и приводим его к следующему виду:
Не каждую строку в «/etc/postfix/main.cf» можно комментировать. Комментарии в некоторых строках не определяются парсером и передаются в обработку, а это приводит к ошибкам. Лучше отказаться от комментариев внутри этого файла. Можете поэкспериментировать с этим запустив в соседнем окне «tail -f /var/log/messages».
Отмечу строку «smtputf8_autodetect_classes = all». Эта запись включает utf-8 по умолчанию, что позволяет использовать кириллицу и в теле письма, и в теме письма без дополнительных манипуляций (См. http://www.postfix.org/SMTPUTF8_README.html).
Создадим каталог для файлов конфигураций:
Редактируем файл «/etc/postfix/private/sender_relay». В нем нужно указать на какой smtp-сервер нужно ссылаться при использовании нашего почтового домена:
Редактируем файл «/etc/postfix/private/sasl_passwd». В нем мы укажем e-mail адрес, который мы будем использовать для отправки писем, а так же логин и пароль от этой учетной записи (логин и пароль указываем через двоеточие):
Изначальный исходящий адрес зависит от содержимого «/etc/hosts» и «/etc/hostname», а также от имени пользователя, который будет отправлять письмо. Т. е. не смотря на то, что мы используем smtp-клиент и отправляем письма от asterisk@lucky.ru, все равно в адрес отправителя postfix изначально подставит «что-то своё» и это нужно исправить правилами из этого файла конфигурации.
Приведу содержимое своего файла «/etc/hosts»:
Важно, чтобы сервер имел какой-либо домен (значение после точки), потому что утилита mail «ищет» имя домена в «/etc/hosts» и если «не находит» его сразу, то продолжит это делать в течение еще нескольких минут и только потом отправит письмо. Т. е. если домен не прописан, то письмо будет уходить с задержкой в несколько минут.
Приведу содержимое своего файла «/etc/hostname»:
Далее необходимо перевести созданные файлы конфигурации в индексированные базы данных, для этого выполним следующую команду:
Далее нам необходимо скачать и разместить на сервере сертификат smtp.yandex.ru, для этого выполним следующую команду:
Но после того, как на экран выйдет техническая информация команда будет «продолжать висеть». Нажмите Ctrl+C чтобы прервать её.
Теперь вручную удалим из получившегося файла весь мусор и оставим только сертификат. Должно получиться нечто подобное:
И наконец перезапустим postfix:
Отправляем тестовое письмо:
admin@lucky.ru — адрес назначения
На этом настройка posfix закончена.
Создаем директорию для хранения bash-скрипта (тут кому где больше нравится):
Создаем файл bash-скрипта:
Выдаем файлу скрипта права на выполнение:
Если есть сомнения в правах на файл, то на время отладки можно дать полный доступ к файлу. Но это «не безопасно».
Краткий разбор скрипта:
«sleep 7»:
Это та самая задержка по времени, о которой я писал ранее. У нас установлена задержка на 7 сек. Хотя, думаю, и одной секунды вполне хватит.
Запрос в mysql мы вынесли в отдельную переменную для удобства.
Далее мы делаем запрос в mysql и фильтруем полученный вывод. Удаляем все варианты кроме «ANSWERED», если такой вообще есть. Если же значений «ANSWERED» несколько, то нужно оставить только одно. В конце в переменную «answer» мы получим либо «ANSWERED» либо «».
Если значение переменной «answer» не равно «ANSWERED», то это пропущенный вызов. В зависимости от номера очереди, с помощью оператора case мы зададим адрес, кому именно необходимо отправить e-mail уведомление, и что в этом сообщении написать (изменяемая часть сообщения).
Далее рассмотрен вариант, когда очередь задана в Asterisk, но не описана в скрипте. В этом случае admin@lucky.ru получит письмо, о том, что очередь не известна скрипту.
Если же очередь описана, то будет отправлено письмо по назначению и дублирующее письмо на admin@lucky.ru с указанием «uniqueid», для того, чтобы можно было отследить события по этому звонку, в случае необходимости.
На этом скрипт заканчивается.
Отмечу, что для подключения к mysql мы использовали логин и пароль, которые заранее узнали. Во FreePBX для того, чтобы узнать логин пользователя Asterisk в mysql выполните следующую команду:
А для того, чтобы узнать пароль пользователя Asterisk в mysql выполните следующую команду:
Мы используем FreePBX. Во FreePBX есть разные типы конфигурационных файлов (см. https://asterisk-pbx.ru/wiki/freepbx/files), некоторые из них FreePBX перезаписывает при перезагрузке, а некоторые не перезаписывает (их называют custom), так как они специально предназначены для пользователя.
Мы будем работать с файлом конфигурации «extensions_override_freepbx.conf», так как он относится к типу custom.
Для начала убедимся, что в файле «/etc/asterisk/extensions.conf» подключен файл «extensions_override_freepbx.conf». Для этого выполним следующую команду:
Редактируем файл «/etc/asterisk/extensions_override_freepbx.conf» и приведем его к следующему виду:
Как я и писал ранее символ «&» в конце обязателен. Так как мы будем работать в bash-скрипте с данными CDR непосредственно из базы mysql, а эти данные заносятся в mysql только после выполнения «exten => h,2,Macro(hangupcall,)», то необходимо не ждать окончания отработки bash-скрипта, а перейти к выполнению следующего шага в Asterisk. А сам bash-скрипт должен содержать задержку по времени, перед выполнением основной своей части.
Для того, чтобы изменения в конфигурационном файле «/etc/asterisk/extensions_override_freepbx.conf» вступили в силу необходимо перезагрузить ядро Asterisk следующей командой:
Это нужно сделать после того как bash-скрипт будет создан.
Наверное, это 1001-й способ «отлова пропущенных вызовов» в Asterisk. Поделитесь в комментариях как эту задачу решаете вы. И что, по вашему мнению, можно доработать/переделать/оптимизировать. Будем признательны за конструктивные идеи.
Источник
FreePBX Очереди — Queue
Подробное описание. Стратегии вызова. Политика записи. Таймауты агентов.
Очереди для эффективной обработки множества одновременных звонков, меньшим количеством операторов Call Центра.
Queue General Settings
Queue number
Используйте номер очереди для вызова и наведения входящих вызовов в модуле Inbound Routes.
Динамические Агенты (операторы Call центра) набирают код ‘*45’ и номер очереди для подключения.
Queue Name
Имя очереди для идентификации в веб интерфейсе. Не используется для вызовов.
Queue Password
Можно ограничить доступ в очередь для операторов Call центра паролем. Эта опция необязательна.
Generate Device Hints
Asterisk «Hints»
Тонкий намек, на толстые обстоятельства.
[subscribers]
exten ⇒ 2777,hint,PJSIP/777
[subscribers]
exten ⇒ Таня,hint,PJSIP/2777
Если этот параметр включен, индивидуальные hints будут сгенерированы для каждого устройства, которое назначено для обслуживания очереди. Hints используются в сочетании с программируемыми BLF кнопками телефона, чтобы при входе или выходе из обслуживания очереди генерировать статус текущего состояния для BLF. Формат hints.
где *45 код переключения по умолчанию, ddd — номер устройства и qqq номер очереди.
Call confirm
Требовать подтверждения от оператора для приема вызова .
Yes No
Call Confirm Announce
Сообщение будет воспроизведено оператору очереди при поступлении вызова, для подтверждения приема перед ответом (если Call Confirm=yes ). По умолчанию воспроизводится стандартное сообщение подтверждения (если оператор доступен не через сервис Follow-Me) или альтернативное сообщение, если оператор доступен через Follow-Me. Установленное здесь сообщение переопределяет все остальные. Для добавления сообщений используйте модуль FreePBX 12 System Recordings.
CID name prefix
Добавляет префикс к callerid «name» поступившего вызова. Если, например, агент обслуживает несколько очередей, позволяет обозначить из какой очереди поступил вызов.
Wait Time Prefix
Alert Info
Restrict Dynamic Agents
Ограничить регистрацию динамических агентов только списком Динамических агентов. Если установлено в ‘yes’, то динамические агенты не указанные списке не смогут подключится к обслуживанию очереди. Yes No
Agent Restrictions
Если установлено в значение ‘Call as Dialed‘ то очередь совершает вызов, также, как и обычный внутренний вызов в системе. Но тогда, все установки ‘FollowMe‘ и ‘Call Forward‘ установленные для внутреннего номера, будут уводить вызовы из очереди согласно этим значениям. Это поведение по умолчанию для последних версий FreePBX. Если установлено в значение ‘No Follow-Me or Call Forward‘ то вызовы агентов будут ограничены только внутренним номером. Установки ‘FollowMe‘ и ‘Call Forward‘ будут игнорироваться. Если установлено в значение ‘Extensions Only‘ то вызовы из очереди будут проходить так же, как при значениях ‘No Follow-Me or Call Forward‘. Но будут вызываться, только екстеншены заданные в пределах системы (FreePBX).
Call as Dialed No Follow-Me or Call Forward Extensions Only
Ring Strategy
Autofill
Если авто-заполнение включено ( Yes ), звонок с любой позиции в очереди, пытается вызвать свободных агентов в порядке определенном заданной стратегией вызова.
Если выключено( No ), только вызов находящийся на первом месте в очереди подается агентам, пока кто-то из них не ответит, остальные же, ожидают первой позиции в очереди и только тогда подаются на свободных операторов.
Yes No
Очевидно, что включение данной опции, позволит сократить время ожидания в очереди, за счет периода, с момента начала посылки первого вызова операторам и ответа на него.
В больших очередях, с множеством вызовов, это может быть очень существенно.
Skip Busy Agents
No Yes Yes + (ringinuse=no) Queue calls only (ringinuse=no)
Queue Weight
Чем выше число, тем выше приоритет очереди. Для агентов обслуживающих более одной очереди, это означает что вызов из такой очереди имеет больший приоритет. По умолчанию — 0, то есть не использовать вес очереди.
Music on Hold Class
Музыка на Удержании проигрывается ожидающему абоненту, пока он ожидает ответа оператора. Унаследованный (тот же, что на входящем маршруте), По Умолчанию (в системе) и Нет, выбор дефолтных значений. Если у вас настроены пользовательские классы MOH , они тоже появятся в списке.
MoH Only Agent Ringing Ring Only
Join Announcement
Объявление проигрывается перед попаданием абонента в очередь. Если есть свободные агенты, объявление может быть пропущено, если выбрать опцию ‘When No Free Agents’, т.е. проигрывать, только если нет свободных агентов. Записи объявлений можно добавить в модуле System Recordings.
Always When No Free Agents When No Ready Agents
Call Recording
Записывать входящие вызовы. Если выбрано ‘never’ запись по запросу (on demand) недоступна.
Force Yes Don’t Care No Never
Mark calls answered elsewhere
Помечать отклоненные вызовы, как отвеченные. (Чтобы на телефоне не было сообщений о пропущенных вызовах)
Fail Over Destination
Назначение по неответу и истечению таймаута очереди, если задано.
Timing & Agent Options
Параметры времени и операторов
Max Wait Time
Максимальное время нахождения в очереди. По его истечению, будет выполнен пункт Fail Over Destination по умолчанию неограниченно.
Max Wait Time Mode
Параметры таймаута вызова в очереди. Определяет отношения абсолютного таймаута очереди и таймаута оператора.
Когда ‘Max Wait Time’ истекло, что делать:
Читайте подробнее о таймаутах в очереди Queues.conf — Timeout
Agent Timeout
Время в секундах, в течение которого вызов будет поступать на телефон оператора, после которого наступит таймаут Retry, а затем вызов снова будет подан операторам в зависимости от заданной стратегии очереди.
Agent Timeout Restart
Этот параметр устанавливает время повторного вызова оператора, который оказался принять звонок из очереди. Это может быть полезно, если операторы очереди имеют возможность отказа приема вызова из очереди.
Retry
Через сколько секунд будет повторена попытка позвонить снова на все телефоны. Выбирая вариант «Без повторений» звонок будет направлен из очереди по назначению при неответе. Звонок перенаправится туда после тайм-аута у первого оператора, переход на второго оператора не произойдёт.
Wrap-Up-Time
Указывает сколько секунд агент останется свободным после окончания очередного вызова из очереди. Если используете Asterisk 1.6 и выше, Вы также можете установить параметр ‘Применить передышку для всех очередей’ на странице ‘Дополнительные настройки’ и операторы, работающие в нескольких очередях будут иметь перерыв после вызова в любой очереди.
Member Delay
Данный параметр позволяет установить задержку в секундах между ответом оператора и соединением с вызывающим абонентом (или оповещением).
Agent Announcement
Оповещение, воспроизводимое оператору, перед соединением с вызывающим абонентом
Для добавления оповещения используйте раздел FreePBX 12 System Recordings.
Report Hold Time
Если хотите сообщать позвонившему время ожидания прежде чем его соединят с оператором — установите Да.
Auto Pause
Поставить агента на паузу в данной очереди (или во всех очередях обслуживаемых оператором), если тот не ответил на вызов . Уточните данное поведение при помощи других настроек: Auto Pause Delay, Auto Pause Busy/Unavailable.
Yes in this queue only Yes in all queues Нет
Auto Pause on Busy
Поставить агента на паузу в данной очереди если он занят.
Auto Pause on Unavailable
Поставить агента на паузу в данной очереди если он недоступен.
Auto Pause Delay
Отложить постановку на паузу на заданное время. Если за это время агент ответит на вызов, пауза отменяется, если нет, то применяется. По умолчанию 0
Capacity Options
Параметры емкости очереди
Max Callers
Максимальное число ожидающих в очереди (0 — неограниченно)
Join Empty
Если установлено Да, новый вызов поступает в очередь независимо, есть в ней пользователи способные принять вызов, если нет — сразу используется Fail Over Destination.
Возможные значения:
Yes Strict Ultra Strict No Loose
Leave Empty
Определяет, что вызов должен быть преждевременно удален из очереди, если не осталось свободных операторов, способных обработать звонок Параметр может принимать значения:
Yes Strict Ultra Strict No loose
Penalty Members Limit
Если очередь обслуживают выбранное кол-во или меньше операторов, не использовать пенальти
Подробнее о пенальти: queues.conf
Caller Announcements
Frequency
Как часто объявляется позиция в очереди и приблизительное время ответа агента, Установите 0 для полного отключения этой функции.
Announce Position
Установите «yes» для объявления позиции.
Announce Hold Time
Анонсировать время ожидания в очереди. Не объявляется если осталось менее минуты.
Periodic Announcements
Объявление в разрыв. Назначается в IVR
IVR Break Out Menu
Перенаправить вызов в заданный IVR с последующим возвращением в очередь, если абонент ничего не выбрал.
Repeat Frequency
Advanced options
Service Level
Параметр статистики очереди. Например, если задано 20 секунд, очередь будет подсчитывать процент отвеченных за это время вызовов: SL: 45.8% within 20s.
Фильтр регулярных выражений для операторов
Agent Regex Filter Задайте регулярные выражения. Все что попадает в фильтр агенты смогут набирать, остальное нет.
Источник