Уведомление о занятости абонента при входящем звонке на занятую линию с включенным Call Waiting в FreePBX 14
В качестве памятки опишу способ доработки функции второй линии (Call Waiting) в FreePBX 14.
По-умолчанию механизм работы второй линии не предполагает никаких уведомлений звонящему в случае если вызываемый абонент уже с кем то разговаривает, а просто воспроизводятся стандартные гудки дозвона. Это создает впечатление у звонящего что вызываемый абонент не хочет брать трубку..
Было бы куда информативнее проигрывать звонящему информационное сообщение, о том что абонент разговаривает, оставайтесь на линии или перезвоните позднее..
Как оказалось в FreePBX есть определенная обработка macro-dialout-one-predial-hook
описанная в /etc/asterisk/extensions.conf
и которая срабатывает до момента непосредственного звонка абоненту. В этой обработке можно проверить статус выдываемого абонента и в случае если статус линии занят, то проигрывать звонящему сообщение и продолжить вызов.
В файл конфигурации /etc/asterisk/extensions_custom.conf
в секцию [from-internal-custom]
добавляем:
[from-internal-custom] ;----- Playback Wait for answer in INUSE line ----- [macro-dialout-one-predial-hook] exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})}) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(custom/wait_for_answer)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm))
[stextbox id=’info’]ПОЯСНЕНИЕ. Возможные варианты состояния линии (DEVICE_STATE) — UNKNOWN, NOT_INUSE, INUSE, BUSY, INVALID, UNAVAILABLE, RINGING, RINGINUSE, ONHOLD
(более подробно можно почитать в оф. документации)[/stextbox]
[stextbox id=’info’]ИНФОРМАЦИЯ. По-умолчанию FreePBX смотрит каталог со звукам по пути — /var/lib/asterisk/sounds/ru
[/stextbox]
Принцип работы простой, при вызове получается статус линии и в случае если она занята, то вызывающему абоненту сперва будет проиграно заданное сообщение а после продолжится вызов абонента с мелодией ожидания вместо гудков.
Скачать “ЗВУК. Абонент разговаривает или временно не доступен” wait_for_answer.wav – Загружено 720 раз – 92,10 КБ
Сергей а какую именно запись использовали? у меня в extensions.conf нету поля [from-internal-custom] нужно вручную добавлять?
Вам нужно редактировать файл — extensions_custom.conf
Спасибо, это помогло FreePBX 15
Уважаемый Jakondo, не могли бы вы подсказать что нужно изменить в написанном Вами руководстве, чтобы оно работало в FreePBX 15? Буду очень признателен Вам за ответ.
Сложно сказать на самом деле, т.к. нет под рукой FreePBX 15 и возможности проверить.
Нужно смотреть лог звонка, анализировать и вносить правки.
Пришлите лог звонка, попробую посмотреть.
Написал такую байду.
Работает на CHANSIP и PJSIP без заморочек
[from-internal-custom]
include => macro-dialout-one-predial-hook
[macro-dialout-one-predial-hook]
exten => s,1,Set(numberLT=$[${LEN(${DEXTEN})}+4])
exten => s,n,Set(numberLS=${LEN(${DSTRING})})
exten => s,n,ExecIf([${numberLS} > ${numberLT}]?Set(fooor=${DSTRING:0:$[${numberLT}+2]}):Set(fooor=${DSTRING}))
exten => s,n,Set(foost=${DEVICE_STATE(${fooor}})
exten => s,n,Noop(HINT ${fooor} — ${foost})
exten => s,n,ExecIf($[«${foost}»=»INUSE»]?Playback(custom/user-on-call))
exten => s,n,ExecIf($[«${foost}»=»INUSE»]?Set(D_OPTIONS=Tt))
exten => s,n,ExecIf($[«${foost}»=»RINGINUSE»]?Playback(custom/user-on-call))
exten => s,n,ExecIf($[«${foost}»=»RINGINUSE»]?Set(D_OPTIONS=Tt))
LOG:
NoOp(«SIP/203-00000c41», «HINT SIP/247 — NOT_INUSE») in new stack
NoOp(«SIP/702-00000c43», «HINT SIP/801 — NOT_INUSE») in new stack
NoOp(«SIP/247-00000c3f», «HINT SIP/203 — INUSE») in new stack
NoOp(«SIP/801-00000c45», «HINT SIP/702 — NOT_INUSE») in new stack
Доброго времени!
Что то ни как не пойму, что не так делаю…
В extensions_custom.conf вписываю строки
[from-internal-custom]
include => macro-dialout-one-predial-hook
[macro-dialout-one-predial-hook]
exten => s,1,Noop(HINT STATUS — ${EXTENSION_STATE(${DEXTEN})})
exten => s,n,ExecIf($[«${EXTENSION_STATE(${DEXTEN})}» = «INUSE»]?Playback(/var/lib/asterisk/sounds/ru/wait_for_answer))
exten => s,n,ExecIf($[«${EXTENSION_STATE(${DEXTEN})}» = «INUSE»]?Set(D_OPTIONS=Ttm))
Но не работает. Follow Me на номере отключен. В консоле тишина. Если INUSE, интереса ради, меняю на UNKNOWN, то звуковое сообщение включается, но звонок не идет, т.е. трубка лежит, звонок не доходит
В консоле появляется
46337 [2021-06-21 16:08:16] VERBOSE[3138][C-0000089c] pbx.c: Executing [s@macro-dialout-one-predial-hook:1] NoOp(«SIP/************», «HINT STATUS — UNKNOWN») in new stack
Вот это работает с SIP и PJSIP
[from-internal-custom]
include => macro-dialout-one-predial-hook
[macro-dialout-one-predial-hook]
exten => s,1,Set(numberLT=$[${LEN(${DEXTEN})}+4])
exten => s,n,Set(numberLS=${LEN(${DSTRING})})
exten => s,n,ExecIf([${numberLS} > ${numberLT}]?Set(fooor=${DSTRING:0:$[${numberLT}+2]}):Set(fooor=${DSTRING}))
exten => s,n,Set(foost=${DEVICE_STATE(${fooor}})
exten => s,n,Noop(HINT ${fooor} — ${foost})
exten => s,n,ExecIf($[«${foost}»=»INUSE»]?Playback(custom/user-on-call))
exten => s,n,ExecIf($[«${foost}»=»INUSE»]?Set(D_OPTIONS=Tt))
exten => s,n,ExecIf($[«${foost}»=»RINGINUSE»]?Playback(custom/user-on-call))
exten => s,n,ExecIf($[«${foost}»=»RINGINUSE»]?Set(D_OPTIONS=Tt))
Доброго времени суток. По итогу у вас получилось решить эту проблему?
Заметил что данная фишка не работает если на номере активна Follow Me. Методом тыка определил что если выставить стратегию ringallv2, то все успешно начинает работать.