Asterisk, suivi des appels en xPL

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 😀

Ce billet a été posté dans domotique, geekerie et taggé , . Bookmark ce permalink.

3 commentaires sur “Asterisk, suivi des appels en xPL

  1. 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é.

    😀

  2. 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 »