Установка агента очереди на паузу при DND
Введение Время от времени в работе инженера VoIP приходится сталкиваться с весьма специфичными и откровенно странными хотелками клиента. Поводом для написания данной статьи стала просьба руководителя it-отдела одной строительной компании, озвучившего следующую задачу: при стратегии очереди rrmemory или fewestcalls звонки не приходили в очередь, если все агенты в ней поставлены на DND средствами сервера телефонии […]
Введение
Время от времени в работе инженера VoIP приходится сталкиваться с весьма специфичными и откровенно странными хотелками клиента. Поводом для написания данной статьи стала просьба руководителя it-отдела одной строительной компании, озвучившего следующую задачу: при стратегии очереди rrmemory или fewestcalls звонки не приходили в очередь, если все агенты в ней поставлены на DND средствами сервера телефонии Asterisk. Далее мы рассмотрим для чего это было нужно, как реализовывалось решение данной задачи и с какими проблемами есть возможность столкнуться в процессе.
Описание и постановка задачи
Итак, казалось бы простейшая задача, но со своими нюансами. Исходные данные: CentOS 7.5, сервер телефонии Asterisk версии 13.29.2, в качестве веб интерфейса FreePBX 14.0.13.26, две очереди со статическими агентами. По заявленной клиентом логике, звонок по истечении 30 секунд из очереди 1 уходит в очередь 2, и, если в ней все агенты на DND, возвращается сразу же в обратно в очередь 1. На первый взгляд поставленную задачу можно решить так:

В настройках очереди 2 во вкладке Capacity Options оба параметра выставляем Ultra Strict. Что это за параметры и почему именно ультра стрикт? Разберем подробнее:
Join Empty – параметр отвечающий за поступление звонка в очередь. При выбранном режиме Ultra Strict звонок придет в очередь в том случае, если будет непосредственно доступный оператор, т.е. тот, что сможет сразу ответить. Агент, находящийся в процессе разговора, считается в данном случае недоступным.
Leave Empty – параметр отвечающий за покидание звонком очереди. Режим Ultra Strict убирает звонок из очереди, если нет агентов, имеющих возможность принять вызов.
Казалось бы, на этом можно и закончить, но, к сожалению, это не сработает. При постановке сервисным кодом всех агентов второй очереди на DND, вызовы продолжат приходить в очередь 2 и лишь по истечении времени ожидания (в нашем случае 30 секунд) будут возвращаться в очередь 1, а для операторов будет отображаться как пропущенный. В качестве выхода из ситуации было придумано следующее решение: переписать логику сервисного кода постановки на DND таким образом, чтобы агент также ставился на паузу.
Реализация
Самое время начинать кастомизировать наши сервисные коды DND (у клиента это комбинации *78 – для включения и *79 – для выключения). Наш кастом мы будем писать в файле /etc/asterisk/extensions_override_freepbx.conf, открываем его любым текстовым редактором и пишем диал план. Сначала пишем для включения:
[app-dnd-on]
include => app-dnd-on-custom
exten => *78,1,Macro(user-callerid,)
exten => *78,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
exten => *78,n,Set(CONNECTEDLINE(name,i)=Do Not Disturb: ON)
exten => *78,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
exten => *78,n,Answer
exten => *78,n,Wait(1)
exten => *78,n,Set(DB(DND/${AMPUSER})=YES)
exten => *78,n,Set(STATE=BUSY)
exten => *78,n,Gosub(app-dnd-on,sstate,1())
exten => *78,n(hook_1),Playback(do-not-disturb&activated)
exten => *78,n,Macro(user-callerid,)
exten => *78,n,AGI(queue_devstate.agi,toggle-pause-all,${AMPUSER})
exten => *78,n,Playback(dictate/pause&${IF($[${TOGGLEPAUSED}]?activated:de-activated)})
exten => *78,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
Следующим шагом пишем диал план для выключения:
[app-dnd-off]
include => app-dnd-off-custom
exten => *79,1,Macro(user-callerid,)
exten => *79,n,Set(CONNECTEDLINE(name-charset,i)=utf8)
exten => *79,n,Set(CONNECTEDLINE(name,i)=Do Not Disturb: OFF)
exten => *79,n,Set(CONNECTEDLINE(num,i)=${AMPUSER})
exten => *79,n,Answer
exten => *79,n,Wait(1)
exten => *79,n,Noop(Deleting: DND/${AMPUSER} ${DB_DELETE(DND/${AMPUSER})})
exten => *79,n,Set(STATE=NOT_INUSE)
exten => *79,n,Gosub(app-dnd-off,sstate,1())
exten => *79,n(hook_1),Playback(do-not-disturb&de-activated)
exten => *79,n,Macro(user-callerid,)
exten => *79,n,AGI(queue_devstate.agi,toggle-pause-all,${AMPUSER})
exten => *79,n,Playback(dictate/pause&${IF($[${TOGGLEPAUSED}]?activated:de-activated)})
exten => *79,n,Macro(hangupcall,)
exten => sstate,1,Set(DEVICE_STATE(Custom:DND${AMPUSER})=${STATE})
exten => sstate,n,Set(DEVICES=${DB(AMPUSER/${AMPUSER}/device)})
exten => sstate,n,GotoIf($["${DEVICES}" = "" ]?return)
exten => sstate,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => sstate,n,Set(ITER=1)
exten => sstate,n(begin),Set(DEVICE_STATE(Custom:DEVDND${CUT(DEVICES,&,${ITER})})=${STATE})
exten => sstate,n,Set(ITER=$[${ITER} + 1])
exten => sstate,n,GotoIf($[${ITER} <= ${LOOPCNT}]?begin)
exten => sstate,n(return),Return()
Должно получиться примерно так:

По сути, в данном коде представлен диал план, взятый из файла extensions_additional.conf с добавлением диалплана ставящего на паузу агента, добавленные строки помечены комментарием, как видно из скриншота. Сохраняем изменения и делаем перезагрузку диалплана командой daiplan reload в консоли Asterisk.

Теперь нам необходимо проверить кастом, который мы написали. Смотрим консоль астериска параллельно набирая сервисные коды. Состояние агентов можно проверить командой queue show [номер_очереди]. Должно получиться как представлено на скришотах ниже:



Остались вопросы?
Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.