Asterisk est un serveur VoIP facilement installable à la maison.
Je ne m’étendrais pas la dessus, il y a pléthore de tutos sur le nain ternet pour vous expliquer ce que c’est et comment le mettre en place.
Je m’en sers tout les jours pour de multiples usages et l’une des fonctions qui me manquait était la possibilité de transmettre en xPL les numéros des appels entrants, et pourquoi pas, le numéro des appels émis.
(Rassurez vous, tout cela dans l’idée de l’intégrer à mon centralisateur xPL).
En fouillant un peu, j’ai d’abord découvert le package d’ iranger, xplast.
Puis l’excellent billet de mon confrère Ma domotique
Tout cela était bien gentil et sympa, mais je voulais un truc plus simple et plus rapide à mettre en oeuvre.
Je me suis donc plongé (avec délicatesse je vous rassure) dans la documentation d’Asterisk et surtout sur la partie AGI.
Vous trouverez également plein d’info sur le site voip-info.org a cette adresse :
http://www.voip-info.org/wiki/view/Asterisk+AGI
Un peu de google derrière et je suis tombé sur un très bon billet d’Andy Ortlieb qui explique comment utiliser les Asterisk Gateway Interface avec python.
Je me suis donc servi de ses exemples pour écrire un simple module AGI qui transmet en xPL les numéros des appels reçus ou émis via Asterisk.
Copier ce script dans le répertoire agi-bin d’Asterisk (généralement /var/lib/asterisk/agi-bin)
Mettre l’utilisateur asterisk propriétaire de ce script et le rendre executable
Pour intercepter les appels, il faut rajouter une entrée dans votre extensions.conf :
Exemple, pour envoyer un message xPL à chaque appel sortant avec le numéro appelé:
dans votre contexte « appel sortant »:
[appelsortant] exten => _0ZXXXXXXXX,1,AGI(/usr/bin/python,"/var/lib/asterisk/agi-bin/Asterisk2xPL.agi") exten => _0ZXXXXXXXX,2,Dial(SIP/freephonie-out/${EXTEN}) |
Exemple, pour envoyer un message xPL à chaque appel entrant avec le numéro appelant :
dans votre contexte « appel entrant »:
[appelentrant] exten => s,1,Ringing exten => s,2,AGI(/usr/bin/python,"/var/lib/asterisk/agi-bin/Asterisk2xPL.agi") ... |
Attention, par défaut le message « INBOUND » (appel entrant) est produit quand le script voit une extension « s » (comportement le plus souvent rencontré pour les appels entrants)
#!/usr/bin/python # -*- coding: ISO-8859-1 -*- # # Asterisk2xPL # http://blog.guiguiabloc.fr import sys,os,socket hostname = socket.gethostname() xpladdr = ("255.255.255.255",3865) xplport = 3865 UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) UDPSock.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1) def get(): res = sys.stdin.readline() res = res.strip() response,delim,result=res.partition(' ') result=result.split('=')[1].strip() result,delim,data = result.partition(' ') return response,result,data def send(data): sys.stdout.write("%s \n"%data) sys.stdout.flush() AGIENV={} env = "" while(env != "\n"): env = sys.stdin.readline() envdata = env.split(":") if len(envdata)==2: AGIENV[envdata[0].strip()]=envdata[1].strip() incomingnumber = AGIENV['agi_callerid'] outgoingnumber = AGIENV['agi_extension'] if outgoingnumber == "s": body = 'calltype=INBOUND\nphone='+incomingnumber msg = "xpl-trig\n{\nhop=1\nsource=guigui-asterisk."+hostname+"\ntarget=*\n}\ncid.basic\n{\n" + body + "\n}\n" UDPSock.sendto(msg,xpladdr) else: body = 'calltype=OUTBOUND\nphone='+outgoingnumber msg = "xpl-trig\n{\nhop=1\nsource=guigui-asterisk."+hostname+"\ntarget=*\n}\ncid.basic\n{\n" + body + "\n}\n" UDPSock.sendto(msg,xpladdr) |
Vous trouverez le script en téléchargement sur mon googlecode :
http://code.google.com/p/guiguiabloc/downloads/detail?name=Asterisk2xPL.agi
Bien évidemment, si vous mettez à jour xPL-PyHAL par le SVN, il inclut la possibilité de réagir à la réception ou l’émission d’un numéro de téléphone 😉
Par exemple pour allumer le module « m5 » a la réception d’un appel du 0699999999 :
MODULE: INBOUND TELNUMBER: "0699999999" ACTION: command TARGETXPL: heyu TARGETCOMMAND: "on" TARGETMODULE: "m5" |
Amusez-vous bien 😀
Faut vraiment que je test asterisk ….
J’avais ce tuto sous le coude depuis un bon moment (à force il prenait même la poussière). Et désormais, c’est fait. Il est intégré à mon Asterisk, et lors d’un appel entrant, via mon eedomus, je fais dire au lapinou qui m’appelle : plus besoin de se lever pour aller voir sur le combiné le nom affiché.
😀
Il était temps 😀
A l’usage c’est quand même bien pratique :p
A savoir également si tu es chez OVH et que tu n’utilises pas Asterisk, les API du fournisseur sont aussi une très bonne source de « domotisation »