В этой статье мы создадим автоинформатор времени, который отсутствует в базовой реализации станции. Сделаем это двумя вариантами — с помощью встроенной команды и с помощью отдельных звуковых файлов.

Вариант 1. С помощью встроенной команды SayUnixTime.

По умолчанию SayUnixTime отключена в MikoPBX. Давайте ее для начала включим. Переходим в меню в раздел Кастомизация системных файлов, ищем файл modules.conf, выбираем добавить в конец и добавляем:

[modules](+)
load => app_sayunixtime.so

Плюс в конце говорит, что запись нужно добавить к контексту modules. Без этого модуль не подгрузится.

Далее переходим в раздел Приложения диалпланов. Добавить новое, пишем название, например Время, указываем номер — 000065, Тип кода — диалплан Asteriks. Переходим на вкладку Программный код, вставляем следующие:

1,Answer()
n,SayUnixTime(,,HMAdB)
n,Hangup()

Что он делает? При звонке на номер произносить текущее время, день недели, дату, без года.

Синтаксис команды SayUnixTime можно посмотреть здесь и привести к желательному виду.

Вариант 2. Без встроенный команды SayUnixTime. Используем только Playback.

Данный способ идентичен первому, но не требует подгрузки модулей. Итак мы сразу переходим в Приложения диалпданов, задаем номер, тип кода — диалплан Asteriks, переходим на вкладку Программный код, вставляем следующее:

1,Set(FreezeEPOCH=$[${EPOCH} + 15])
n,Set(TimeNow=${STRFTIME(${FreezeEPOCH},,%Y%m%d%H%M.%S-%w-%j)})
n,Playback(silence/1&at-tone-time-exactly)
n,GotoIf($["${TimeNow:8:2}" < "10"]?hour_true:hour_false); Проверяем часы 
n(hour_true),Playback(digits/${TimeNow:9:1}&hours)
n(hour_false),GotoIf($["${TimeNow:8:2}" > "20"]?hour20_true:hour20_false)
n(hour20_true),Playback(digits/${TimeNow:8:1}0&digits/${TimeNow:9:1}&hours)
n(hour20_false),Playback(digits/${TimeNow:8:2}&hours)
n,GotoIf($["${TimeNow:10:2}" < "10"]?min_true:min_false) ; проверяем минуты
n(min_true),Playback(digits/${TimeNow:11:1}&minutes)
n,Goto(16)
n(min_false),GotoIf($["${TimeNow:10:2}" > "20"]?min20_true:min20_false)
n(min20_true),Playback(digits/${TimeNow:10:1}0&digits/${TimeNow:11:1}&minutes)
n,Goto(16)
n(min20_false),Playback(digits/${TimeNow:10:2}&minutes)
n,Playback(digits/${TimeNow:13:1}0&seconds) ; двадцать + секунд
n,Playback(silence/1&digits/today) ; тишина 1 секунда + сегодня
n,Playback(digits/day-${TimeNow:16:1}) ; четверг
n,GotoIf($["${TimeNow:6:2}" < "10"]?date_true:date_false) ; проверяем число
n(date_true),Playback(digits/${TimeNow:5:1})
n,Goto(26)
n(date_false),GotoIf($["${TimeNow:6:2}" > "20"]?date20_true:date20_false)
n(date20_true),Playback(digits/${TimeNow:6:1}0&digits/h-${TimeNow:7:1})
n,Goto(26)
n(date20_false),Playback(digits/${TimeNow:6:2})
n,GotoIf($["${TimeNow:4:2}" <= "10"]?mon_true:mon_false) ; проверяем месяц
n(mon_true),Playback(digits/mon-$[${TimeNow:5:1}-1])
n(mon_false),Playback(digits/mon-$[${TimeNow:4:2}-1])
n,Playback(silence/1&beep) ; тишина 1 секунда + короткий гудок
n,Hangup()

Данный способ длиннее, потому что в MikoPBX отсутствует возможность сделать файлы spell, которые умеют склонять слова(вернее он есть, но формируется на лету и использовать его в своих диалпланах не очень возможно). UPDATE: возможно с версии MikoPBX 2021.3.86. Это можно прочитать в статье здесь.

Как только вы поместили данный код в окно, нажали сохранение — можете набирать номер и проверять.

Выбирайте, что звучит лучше.

С уважением.

Tags: ,