Portál AbcLinuxu, 3. května 2025 08:50

Asterisk a kalendáře

15. 12. 2009 | Marek Červenka
Články - Asterisk a kalendáře  

Nově připravovaná verze VoIP ústředny a komunikačního řešení Asterisk podporuje integraci s kalendáři. Myšlenkou celého systému je automatické chování linky podle kalendáře uživatele. V případě, že v kalendáři máme nastavenou schůzku, tak telefon automaticky spojuje volajícího do voicemailu nebo mu pomocí systému text to speech přeříká informaci z kalendáře. Různých schémat, která určují, co se s linkou může dít, je mnohem více a tyto možnosti nastíníme v dalším textu.

Obsah

V současných ústřednách jsou typické možnosti nastavení přesměrování linky. K tomu uživatel musí buď znát volby, jak přesměrování nastavit, např. *72, nebo se přihlásit do webového rozhraní ústředny a nastavit přesměrování tam. Pro některé uživatele tedy může být mnohem přirozenější „řízení“ linky kalendářem.

Základní vlastnosti kalendářového modulu:

Kalendářový modul se skládá z několika částí. Jednotlivé části podporují různé kalendářové API a systémy. Soubory jsou ve zdrojových kódech uloženy v adresáři asterisk/res.

Díky podpoře většiny kalendářových API bylo nutné použít knihovny, které tyto API implementují. Tyto knihovny jsou nutné ke kompilaci kalendářového modulu:

Konfigurace

link

Nyní přejděme k praktické konfiguraci a ukázkám fungování. Přeskočíme sekci kompilace projektu Asterisk, protože na toto téma existuje na internetu dokumentace. Kalendářové funkce jsou zatím dostupné pouze ve vývojové verzi.

Konfigurační soubor se jmenuje calendar.conf. Jednotlivé kalendáře definujeme pomocí sekce např.:

[kalendar1]
type 			; typ kalendáře (ical, caldav, exchange)
url 			; url na sdílený kalendář
user 			; uživatelské jméno
secret 			; uživatelské heslo ke kalendáři
refresh 		; obnovování kalendáře v sekundách
timeframe 		; počet minut v kalendáři,
			; které se mají projít při každé obnově kalendáře
autoreminder = 10 	; oznámení nezávislé na nastavení v kalendáři
waittime = 30 		; jak dlouho čekat na zvednutí hovoru

channel = SIP/60001 	; volaný telefon
context = default 	; v jakém kontextu začít hovor
extension = 123 	; na jakou linku se zkusit spojit při zvednutí hovoru
; nebo (nelze obě možnosti zároveň):
app = Playback 		; aplikace, která se spustí při zvednutí kanálu
appdata = tt-weasels 	; parametr aplikace (v tomto případě soubor,
			; který se má přehrát)

Funkce

link

CALENDAR_EVENT(<field>)

Tato funkce nám umožní získat informace z kalendáře. Data potom můžeme například přeříkat volajícímu nebo použít k dalšímu řízení hovoru.

summary     : název události nebo předmět v MS Exchange 
description : popis události
organizer   : organizátor události
location    : místo události 
calendar    : název kalendáře
uid         : ID události
start       : datum začátku události
end         : datum konce události
busystate   : stavy 0=FREE, 1=TENTATIVE, 2=BUSY 

CALENDAR_BUSY

Funkce slouží k dotazování na status kalendáře. Vrací 0, pokud je uživatel k dispozici, nebo 1, pokud má naplánovanou nějakou činnost.

Příklad 1

link

Pokud je uživatel k dispozici, je hovor směrován na jeho telefon. Pokud k dispozici není, je hovor přesměrován do hlasové schránky.

exten => 123,1,GotoIf(${CALENDAR_BUSY(muj_kalendar)},busy,available)
exten => 123,n(available),Macro(dial-exten,${EXTEN})
exten => 123,n,Hangup
exten => 123,n(busy),Voicemail(${EXTEN}@default,u)

CALENDAR_QUERYCALENDAR_QUERY_RESULT

Dotaz na události v kalendáři v definovaném časovém období. Vrací ID, které je pak možné použít s funkcí CALENDAR_QUERY_RESULT pro procházení jednotlivých událostí.

Příklad 2

link

Zobrazí v konzoli Asteriska informace o naplánované události.

exten => s,1,Set(id=${CALENDAR_QUERY(muj_kalendar,${EPOCH},${EPOCH})})
exten => s,n,NoOp(Summary: ${CALENDAR_QUERY_RESULT(${id},summary)})
exten => s,n,NoOp(Description: ${CALENDAR_QUERY_RESULT($ {id}, description)})
exten => s,n,NoOp(Location: ${CALENDAR_QUERY_RESULT(${id},location)})

Příklad 3

link

Na dalším složitějším příkladu si ukážeme, jak si po telefonu poslechnout*, co máme v kalendáři naplánováno.

[internal]
;Zvednutí hovoru
exten => 1337,1,Answer

;Dotaz na kalendář. Parametr specifikuje časové období
exten => 1337,n,Set(id=${CALENDAR_QUERY(mycal,${EPOCH},$[${EPOCH}+24*60*60])})

;Počet položek
exten => 1337,n,Set(num=${CALENDAR_QUERY_RESULT(${id},getnum)})
exten => 1337,n,Set(i=1)

;Oznamení, že následuje přeříkání událostí z kalendáře na dalších 24 hodin
exten => 1337,n,SayText(Your schedule for the next 24 hours is as follows)

;smyčka
exten => 1337,n,While($[${i} <= ${num}])
exten => 1337,n,Playback(from)
exten => 1337,n,SayUnixTime(${CALENDAR_QUERY_RESULT(${id},start,${i})},,Q 'digits/at' IMp)
exten => 1337,n,SayText(until)
exten => 1337,n,SayUnixTime(${CALENDAR_QUERY_RESULT(${id},end,${i})},,IMp)

;položka v kalendáři
exten => 1337,n,SayText(${CALENDAR_QUERY_RESULT(${id},summary,${i})})
exten => 1337,n,Set(i=$[${i} + 1])
exten => 1337,n,EndWhile

* v současné době není k dispozici jednoduše využitelný a použitelný Text-to-Speech systém pro češtinu.

Příklad 4

link

Další prakticky velmi dobře použitelný příklad je automatické svolání telefonické konference. V domluveném čase automaticky Asterisk obvolá účastníky konference a po zvednutí hovoru je do konference spojí.

Definice kalendáře obsahující konferenci:

[mycal]
type=caldav
url=https://www.google.com/calendar/dav/user@domain.com/events/
user=user@domain.com
secret=mysecret
refresh=15
timeframe=1440
channel=Local/calevent@calendar
app=NoOp

Dialplán v extensions.conf:

[calendar]
;zjistím účastníky
exten => calevent,1,Set(attendees=${CALENDAR_EVENT(attendees)})

;dokud není seznam účastníku prázdný tak pracuju ve smyčce
exten => calevent,n,While($["${SET(var=${SHIFT(attendees)})}" != ""])

;zjistím telefonní číslo účastníka
exten => calevent,n,Set(xtn=${DB(lookup/${var:7})})

;zavolám účastníka a spojím do konference
exten => calevent,n,Originate(Local/${xtn},app,ConfBridge,1234)
exten => calevent,n,EndWhile

CALENDAR_WRITE

Příklad 5

link

Na posledním příkladu si ukážeme, jak je možné využít funkci zápisu do kalendáře. Použijeme ji k zápisu záznamu o hovoru. Zpětně se poté můžeme v kalendáři podívat, kdy nám kdo volal.

[internal]
exten => _6XXX,1,Set(start=${EPOCH})

;hovor na naši linku
exten => _6XXX,n,Dial(SIP/${EXTEN})
exten => h,1,Set(end=${EPOCH})

;po skončení hovoru uložíme informaci
exten => h,n,Set(CALENDAR_WRITE(mycal,summary,start,end)= \
Call from ${CALLERID(all)},${start},${end})

Závěr

link

Kalendářový modul je již dnes použitelný a může pro určitou cílovou skupinu znamenat jednodušší a přirozenější řízení jejich telefonní linky, než je nastavování přesměrování pomocí kódu. V současné době modulu ještě chybí podpora novějších verzí MS Exchange. Pokud byste byli ochotní sponzorovat podporu chybějících funkcí, tak přímý kontakt na vývojáře je: Terry Wilson <twilson@digium.com>, popř. zprostředkovaně Marek Červenka <cervajs@freevoice.cz>.

Související články

Asterisk: VoIP ústředna - 1 (plánování)
Asterisk: VoIP ústředna - 2 (konfigurace)
Asterisk: VoIP ústředna - 3 (schránka, konference)
Asterisk: VoIP ústředna - 4 (připojení do PSTN)
VoIP: Telefonování přes internet pro každého
Skype - internetová telefonie na GNU/Linuxu

Odkazy a zdroje

asterisk.org

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

Diskuse k tomuto článku

15.12.2009 12:28 Marek
Rozbalit Rozbalit vše Re: Asterisk a kalendáře
Odpovědět | Sbalit | Link | Blokovat | Admin
Snad text to speech, ne?

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.