ELASTIX – общайтесь свободно

Юров Владислав

Инструкция по программированию (Programming Manual)

 

 

Возможности программирования Elastix практически безграничны. Можно создавать собственные алгоритмы обработки вызовов, использующие обращения к базам данных, к веб-страницам, к внешним программам на PHP и на других языках. Разработчиками Elastix приветствуется написание бесплатных и коммерческих модулей (Addons), после сертификации доступных другим пользователям платформы.

Примеры этой главы описывают как простейшие примеры создания собственных алгоритмов обработки вызовов на примере добавления функции автодозвона, так и более сложные изменения, использующие базу данных вызовов (CDR) для снижения нагрузки на секретарей.

 

Доступ к Очередям и Группам звонков при входящих звонках из города

По умолчанию номера, присвоенные Очередям (Queues) и Группам звонков (Ring Groups) не доступны извне. Абонент, позвонивший из города, не сможет в IVR набрать номер Очереди или Группы звонков и соединиться с ней. Можно для каждой Очереди и Группы звонков создать Виртуальные номера (Virtual Extension), но это непрактично – придется не только поддерживать записи в актуальном состоянии, но и помнить разные номера для звонков из города и с офисного телефона. Это недоразумение легко исправить:

• открыть меню PBX / Tools / Asterisk File Editor

• открыть файл extensions_custom.conf

• добавить три строки

[from-did-direct-ivr-custom]

include => ext-queues

include => ext-group

• сохранить изменения, нажав кнопку Save

• применить настройки, нажав кнопку Reload Asterisk

Определить, что добавить эти строки нужно именно в [from-did-direct-ivr-custom], можно просмотрев файл extensions_additional.conf, создаваемый Elastix после изменения настроек системы – номера всех созданных телефонов прописываются в контексте [from-did-direct-ivr], который включает в себя контекст [from-did-direct-ivr-custom]:

 

Настройка функции Автодозвона

Следует иметь в виду, что автоматический дозвон до занятого/не доступного абонента создает повышенную нагрузку как на вашу станцию Elastix, так и на сети провайдеров связи (если вызываемый абонент находится вне Elastix). Лучше всего найти способ известить абонента другими способами о необходимости с ним переговорить. Однако, если собеседник не слишком заинтересован в беседе, сотрудникам может помочь функция автодозвона:

• откройте меню PBX / Tools / Asterisk File Editor

• откройте файл extensions_custom.conf

• добавите строки

[from-internal-custom]

include => autoredial

[autoredial]

exten => _99.,1,Dial(Local/${EXTEN:2}@from-internal,40,tr)

exten => _99.,n,GotoIF($["${DIALSTATUS}" == "ANSWER"]?end)

exten => _99.,n,GotoIF($["${DIALSTATUS}" == "ANSWERED"]?end)

exten => _99.,n,GotoIF($[${CDR(billsec)} >0]?end)

exten => _99.,n,Wait(10)

exten => _99.,n,Goto(${EXTEN},1)

exten => _99.,n(end),Hangup

• сохраните изменения, нажав кнопку Save

• примените настройки, нажав кнопку Reload Asterisk

Теперь ваши сотрудники могут набрать префикс «99» перед требуемым номером, нажать «#» и ждать пока абонент поднимет трубку. Elastix будет бесконечно вызывать абонента, ожидать ответа 40 секунд, при отсутствии ответа или при ошибке соединения ждать 10 секунд и повторять набор.

Например:

• «9984956881001#» – поможет дозвониться до техподдержки 1С

• «994123#» – поможет дозвониться до абонента Elastix 4123, если абонент долго висит на трубке, очень нужен, но лишен других, известных Вам, средств связи

 

Сохранение в CDR рекламного номера

Оплачивая городские номера полезно знать насколько часто каждый из них используется. По умолчанию Elastix сохраняет информацию о том кто звонил и с кем разговаривал, но информация об использованном для входящей связи номере нигде не сохраняется, хотя зачастую известна системе. Один из способов сохранять эту информацию – создать свою подпрограмму (контекст) для обработки входящих вызовов, заполняя в ней поле accountcode, которое сохраняется в CDR (Call Detail Records – детальная информация о звонках). Сделать это достаточно просто:

• откройте меню PBX / Tools / Asterisk File Editor

• откройте файл extensions_custom.conf

• добавьте строки

[from-trunk-accountcode]

exten => _.,1,Set(CDR(accountcode)=i:${EXTEN})

exten => _.,n,Goto(from-trunk,${EXTEN},1)

exten => h,1,Macro(hangupcall,)

• сохраните изменения, нажав кнопку Save

• откройте каждую Внешнюю линию (Trunk) и укажите «from-trunk-accountcode» в поле «USER Context»

• примените настройки, нажав «Apply Configuration Changes Here»

Теперь в CDR будет сохраняться информация об используемых для входящей связи городских номерах, которые можно увидеть в меню Reports \ CDR Report:

В целях анализа статистики использования городских линий можно выгрузить информацию из CDR в Excel:

Также можно предварительно обработать данные из CDR примерно так:

чтобы выгрузить только по одной записи о каждом входящем звонке, тем самым упростив анализ:

Для подключения к базе CDR указанным выше способом требуется установить phpmyadmin, подключившись по SSH с правами root, выполнить команды:

sudo yum install phpmyadmin

sudo service httpd restart

 

Подпрограмма соединения звонящего с последним собеседником (SmartCallback)

 

Не редко мы пытаемся с офисного телефона позвонить кому-то на мобильный, но абонент оказывается не доступен или занят. Когда искомый нами человек перезванивает по пропущенному вызову, он слышит в ответ название компании, из которой ему звонили, но не всегда может догадаться кому он был нужен. В то же время, Elastix хранит информацию о вызовах и знает разгадку – кто и когда пытался с ним связаться. Если мы, получив такой звонок, соединим абонента с последним, кто ему звонил, скорее всего окажем услугу – сэкономим время обоих. Такой функционал не входит в стандартный набор функций, но может быть относительно просто реализован нами самостоятельно. Для этого потребуется:

• настроить подпрограмму (которую мы назовем SmartCallback) и присвоить ей номер 661234 (файл «extensions_custom.conf»)

• настроить запрос к статистике соединений и назвать его «LASTCALL» (файл «func_odbc.conf»)

• настроить подключение к базе данных CDR со статистикой соединений (файлы «res_odbc.conf» и «/etc/odbc.ini»)

• настроить Собственную функцию (Misc Destination) «SmartCallback» и присвоить ей вызов подпрограммы «661234»

• настроить Внутреннюю функцию (Misc Application) «NoSmartCallback», присвоив ей номер «601234», чтобы переключать на нее вызовы, не обработанные функцией «SmartCallback»

• настроить в правилах входящей связи (Inbound Routes) вызов Собственной функции (Misc Destination) «SmartCallback»

 

Настройка подпрограммы (контекста) SmartCallback

Собственные функции можно писать разными способами:

• в синтаксисе настраиваемого плана набора (файл «extensions_custom.conf»)

• на языке AEL (Asterisk Extension Language) (файл «extensions.ael»)

• на PHP или на другом языке, используя функцию AGI (Asterisk Gateway Interface)

Наша задача легко решается использованием файла «extensions_custom.conf». Для редактирования требуется открыть меню PBX / Tools / Asterisk File Editor:

открыть для редактирования «extensions_custom.conf» и добавить в него подпрограмму (контекст) [SmartCallback] с номером «661234»:

[SmartCallback]

exten => 661234,1,SET(CALL2B=${ODBC_LASTCALL(${CALLERID(number)})})

exten => 661234,n,Set(DIAL=${DB(DEVICE/${CALL2B}/dial)})

exten => 661234,n,GotoIf($["${DIAL}" = ""]?nfound)

exten => 661234,n,Set(CDR(accountcode)=B:${CDR(accountcode)})

exten => 661234,n,DIAL(${DIAL},12,)

exten => 661234,n,GotoIf($["s${DIALSTATUS}" = "sANSWER"]?endcon)

exten => 661234,n(nfound),Goto(601234,1)

exten => 661234,n(endcon),Hangup()

[ext-did-custom]

include => SmartCallback

Наша функция:

• вызывает еще не созданный нами запрос к статистике вызовов под названием «LASTCALL» (запросу передаем номер звонящего – «CALLERID(number)»)

• находит как следует сделать набор абонента, который вызывал звонящего последним

• добавляет к полю «accountcode» префикс «B:», чтобы в статистике сохранилась информация, что вызов был переключен на сотрудника нашей подпрограммой «SmartCallback»

• пытается в течение 12 секунд вызвать найденного абонента

• если абонент не найден или не ответил, переключает на еще не созданный номер «601234»

 

Создание запроса к CDR

Описания запросов хранятся в файле «func_odbc.conf», который по аналогии открываем через меню PBX / Tools / Asterisk File Editor и добавляем следующий текст:

[LASTCALL]

dsn=getcdr

readsql=SELECT src FROM cdr WHERE calldate > CURDATE() – 2 AND RIGHT(dst,10) = RIGHT('${SQL_ESC(${ARG1})}',10) ORDER BY calldate DESC LIMIT 0,1

Здесь «getcdr» – название еще не созданного источника данных, ARG1 – номер звонящего абонента. Чтобы учесть разные способы набора номера, используем последние 10 цифр от номера абонента («RIGHT(…,10)»). Поскольку в статистике могут храниться очень старые вызовы, ограничиваем поиск последними двумя днями («CURDATE() – 2»). Сортируем историю вызовов от последнего звонка к более старым («ORDER BY calldate DESC») и возвращаем первую из найденных записей («LIMIT 0,1»).

 

Настройка источника данных в Asterisk

Описание подключений к ресурсам баз данных Asterisk хра