Jan 20

Envoyer des SMS en xPL avec SMSGateway

 

Dans un environnement domotisé, l’une des premières taches de communication avec le monde extérieur que l’on met en place est le SMS.

Aujourd’hui, pour un abonnement à 2 euros par mois et un vieux téléphone sous Androïd, vous pouvez envoyer autant de SMS que vous le souhaitez (dans la limite bien sûr du raisonnable, aka « le bon père de famille de Free« …)

Il y a quelques mois, mon confrère Hervé sur son blog Abavala, nous a fait découvrir l’excellent logiciel SMSGateway.

Je n’en reparlerais donc pas, je vous invite plutôt à lire son très bon billet (comme il a l’habitude de nous offrir 😉 ):

http://www.abavala.com/2012/07/09/sms-gateway-une-passerelle-sms-a-la-maison/

Je m’en sers depuis la découverte de ce produit et j’en suis très satisfait.
Toutefois, comme vous le savez, mon environnement domotique est très fortement basé sur le protocole xPL et il me manquait l’interfaçage entre xPL et SMSGateway.

Je vous propose donc un petit client xPL, xPL-SendSMSGateway, qui vous permettra par un message xPL de type sendmsg.basic, d’envoyer directement vos SMS via SMSGateway.

http://code.google.com/p/guiguiabloc/downloads/detail?name=xPL-SendSMSGateway.py

Ce client est bien évidemment téléchargable sur mon Google Code et devrait également être intégré directement a xPL-PyHAL dans les jours qui viennent (d’abord sur le SVN, puis dans la version BETA qui devrait sortir rapidement).

Le fonctionnement est des plus aisé.

La configuration se fait au début du fichier, en spécificant l’url de votre téléphone Android (suivant l’installation de SMSGateway) :

url = 'http://192.168.1.1:9090/sendsms?'

et le mot de passe, si vous en avez défini un dans le logiciel.

C’est tout 😉

Maintenant, pour envoyer un SMS via xPL :

xpl-sender -m xpl-cmnd -c sendmsg.basic to=0612121212 body="wesh gros bien ou bien"

ou to = le numero de téléphone du destinataire
et body= « le texte a envoyer »

Sous xPL-PyHAL, il suffira de créer un fichier YAML de ce type :

ACTION: message
TARGETXPL: sms
PHONE: "0612121212"
MODULE: "m5"
COMMAND: "on"
MESSAGE: "Mouvement dans la niche du chien"

Bien évidemment, des exemples de type .sample seront disponibles dans le répertoire yamlrepo.

En espérant que vous en ferez bon usage.

Amusez vous bien 😀

Classé dans domotique | Taggé , , , | 2 Commentaires
Jan 09

trueCall, filtrer les appels téléphoniques entrants

Dans ce merveilleux XXIe siècle, il faut bien avouer que le Spam est une plaie qu’il est difficile de cautériser.

La première destination de ses sollicitations abusives est bien entendu votre (vos) email(s), mais heureusement, de nombreuses solutions existent et sont pour la plupart très efficace.
Personnellement, j’utilise Spamassassin mais surtout Postgrey qui à réduit mon nombre de spams emails de façon drastique (voire quasi-nulle).
Certains hurleront sur le fait que le greylisting est insupportable pour le client (5 minutes de plus en attente, oh my god !), mais je n’ai qu’une réponse à leur apporter : « C’est votre boulot de sysadmin de remplir la whitelist aussi… »
Honnêtement, si le greylisting vous gène ou insupporte le client, c’est que vous vous la couler douce…
Depuis des années que j’utilise ce système, je n’ai eu aucun retour négatif quand a son efficacité, et je passe peut être 10 minutes par mois à peaufiner ma liste blanche… A bon entendeur.

Ca c’est dit…

Bref, ce n’est pas un billet sur la façon de combattre le spam email mais plutôt le spam téléphonique.

J’avais déjà aborder le sujet dans ce billet, et j’ai découvert une solution beaucoup plus intéressante et performante que je vais vous présenter aujourd’hui.

Des appels commerciaux ou bidons, comme tous, j’en reçois des tas (et pourtant je suis en liste Orange (la liste anti-prospection d’Orange (ça s’invente pas) et j’ai l’option Stop-secret d’Orange.
Ah oui, pour information, j’ai gardé mon numéro RTC Orange fixe en plus de mon numéro de ligne ADSL (pour pleins de raisons que vous retrouverez sûrement dans ce blog).
Avec ma solution domotique, je peux rejeter les appels indésirables avec présentation du numéro mais l’inconvénient principal, c’est que le téléphone de la maison sonne quand même 1 ou 2 fois avant de se faire couper par le modem. Gênant…

Ce bug n’est pas de mon ressort, mais du fonctionnement de la présentation du numéro en France qui n’est transmis qu’a partir de la deuxième sonnerie.

Bon j’avoue aussi jouer au jeu du sifflet avec les call-centers, mais ça va un temps… (pour ceux qui ne connaissent pas, il s’agit de détenir un simple sifflet à bille à côté du téléphone et de « vriller » les oreilles de votre interlocuteur après quelques minutes de discussion. Je sais, c’est très méchant, mais terriblement plaisant 😀 )

Si des solutions de filtrage d’appels entrants existent chez de nombreux FAI sur des lignes téléphoniques ADSL, il n’y a rien sur des lignes RTC. (Va comprendre pourquoi…)

Je me suis donc mis à rechercher un système pouvant s’intercaler sur ma ligne et m’offrant cette possibilité et rapidement, j’ai découvert le Call Blocker de la société TrueCall .

Commande faite pour la somme d’environ 150 euros.

Reçu rapidement, voici la bête :

Le fonctionnement de cette boite est très simple et extrêmement polyvalent.

Le CallBlocker gère 2 types de liste, la « Star list » (les amis/famille) et la « Zap list » (les emmerdeurs).
Outre ces deux listes, il gère les appels  « mobiles », « internationaux », « masqués » ou « indisponibles » (l’appelant ne présente pas d’identification du numéro. C’est ce qui se passe avec certains call-centers à l’étranger).

L’ajout des numéros dans la Zap ou la « Star list » se fait par les touches du téléphone, ou par le site web, ou durant un appel (par exemple quand vous appelez quelqu’un, il vous suffit de rajouter la touche « * » à la fin du numéro pour que le CallBlocker  le rajoute automatiquement dans la liste « Star ».

Une fois en possession de ses listes, un système de workflow permet de définir les flux vers lesquels renvoyer les appels :

– Accepter l’appel (et donc faire sonner le téléphone de la maison)
– Demander à l’appelant de se présenter (c’est le même principe que le « Stop-secret » d’Orange. Le boîtier nous appelle en nous disant que -le message de présentation de l’appelant- veut nous joindre, on accepte ou non l’appel (avec la possibilité également de rajouter son numéro en liste Star ou Zap).
– Bloquer l’appel et diffuser le message Zap (« tu me casses les bonbons » (par exemple ou plus « compréhensif 😉 ))
– Renvoyer sur le répondeur interne du CallBlocker (ici la fonction de répondeur banale du boîtier)
– Bloquer l’appel en annonçant que nous refusons les appels anonymes
– Demander à l’appelant d’appuyer sur telle touche avant de faire sonner le téléphone de la maison
– Bloquer l’appel mais faire croire que notre téléphone sonne en diffusant la tonalité qui va bien
– Demander à l’appelant de taper son « caller code » (un code secret à diffuser auprès de vos correspondants)
– Bloquer l’appel en émettant une tonalité « n’est plus en service »
– Bloquer l’appel et demander à l’appelant de presser telle touche du téléphone, puis après de se présenter, puis enfin fait sonner notre téléphone pour la séquence de choix d’accepter ou pas l’appel.

Ce workflow est paramétrable ou par les touches du téléphone, ou par le site internet de TrueCall dans votre espace client.

Pour se synchroniser à cet espace client (c’est une option non obligatoire), le CallBlocker appelle (à votre demande ou automatiquement) un modem à Londres (rassurez vous, la mise a jour est très rapide et le coût de la communication est de quelques centimes). Ce qui vous permet également d’avoir une liste des appels reçus et bloqués par le CallBlocker.
Sachez toutefois que le CallBlocker appelle quand même le modem après sa mise sous tension pour synchroniser sa date et son heure.

Lors de mes premiers tests, voici donc ce que cela donne sur l’interface :

Par exemple, tout les appels masqués/indisponible sont envoyés vers « la demande de présentation », les numéros en « Zap list » sont bloqués avec le message « va te faire voir » et les autres appels font sonner normalement le téléphone de 7h à 23h (a vous de créer vos scénarios 🙂 )

Il existe des profils pré-définis de différents types, mais l’option « customisée » est quand même plus agréable (la gestion des plages horaires est aussi possible (jour/nuit)).

Je ne vous détaillerais pas toute la documentation (que vous trouverez sur le site du fabricant) mais les possibilités de ce boîtier sont impressionnantes.

De plus, vous pouvez ajouter une carte SD (obligé de les acheter chez le fabricant par contre 🙁 ) ce qui vous permet d’enregistrer les conversations 😀

Voici un petit boîtier très performant et je suis toujours surpris que ce genre d’option n’existe pas chez Orange sur les lignes RTC classiques.

L’équipe TrueCall est très sympathique et répondent rapidement par mail ou par téléphone (attention, ils ne parlent qu’anglais 😉 )

Bilan un produit efficace, avec de nombreuses possibilités et même s’il est un peu cher, il remplit parfaitement le rôle pour lequel il a été conçu.
Je vous invite à consulter le site du fabricant pour découvrir leurs produits et si vous avez des questions, n’hésitez pas à me laisser un commentaire.

EDIT : Juste 2 choses que j’ai oublié de spécifier.
Les messages des menus vocaux sont en anglais (mais vous pouvez modifiez les messages qu’entendent vos correspondants par les vôtres).
Le CallBlocker marche derrière une Freebox (même les mises a jour 😉 )

Amusez vous bien 🙂

 

Classé dans domotique, geekerie, matériel | Taggé , , | 64 Commentaires
Nov 19

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 😀

Classé dans domotique, geekerie | Taggé , | 3 Commentaires
Nov 16

Projet xPL-pyHAL, Alpha release 2

Enfin un peu de nouvelles de mon projet xPL-PyHAL (dont vous trouverez le précédent billet ici).

J’y travaille toujours pour mon propre usage et, honte sur moi, je délaissais un peu la mise à jour du dépot SVN et du package sur googlecode.

Mais je me suis vite fait rattraper par des utilisateurs dont xPL-PyHAL avait, à ma grande fierté je l’avoue, intégré leur environnement domotique 🙂

Donc merci à Olivier de Connecting Stuff  et Johan de Hotfirenet de me secouer un peu les puces 😀

Voici donc une mise à jour, la version Alpha 0.2 que vous pouvez dès à présent télécharger ici :
http://code.google.com/p/guiguiabloc/downloads/detail?name=xPL-PyHAL-alpha-0.2.tgz

ou mettre à jour votre SVN.

Au programme des changements :

  • Optimisation du code python

Une des parties qui m’a prit le plus de temps. Les sections de code du Brain devenaient de plus en plus conséquentes et j’ai tout regroupé dans des fonctions bien définies.

  • Choix du module Memcached

A utilisation intensive, je me suis rendu compte que le module « memcached » de python avait des comportements un peu bizarre et gênant (une nouvelle session à chaque fois sans réutiliser une existante), donc si vous disposez de pylibmc, le Brain l’utilisera en priorité, sinon le module Memcached standard.

N’oubliez pas la configuration dans Memcached_pylibmc.py dans ce cas (adresse du serveur et port de connexion, à l’identique de Memcached.py si vous utilisez ce module).

def __init__(self, hostname="127.0.0.1", port="11211"):
  • Correction d’un bug sur les schémas ac.basic

Plutôt une omission qu’un bug, Marc m’a signalé que certaines télécommandes DIO se présentaient avec le schéma ac.basic plutôt que homeeasy.basic et suite à sa correction, ce type de schéma est désormais intégré au Brain. Merci à lui 🙂 (d’ailleurs vous êtes amplement encouragé a me remonter vos bugs !)

  • Ajout du support DawnDusk xPL

Si vous utilisez le client xPL Dawndusk , qui vous permet d’être alerté dans le bus xPL quand le soleil se lève, ou quand il se couche, xPL-PyHAL intègre désormais la possibilité de générer des évènements suite à cette action.

Le format YAML est le suivant (exemple: envoyer un message notifry « il fait nuit » au coucher du soleil) :

MODULE: dawndusk
DAYNIGHT: dusk
ACTION: message
TARGETXPL: notifry
KEY: "b11111223FFFFFzz"
MESSAGE: "il fait nuit"

Le nom du module pour que xPL-PyHAL réagisse: dawndusk

La clé DAYNIGHT sur laquelle réagir : dusk (coucher du soleil) ou dawn (lever du soleil)

et les actions comme d’habitude (TARGETCOMMAND par exemple pour une action command.

J’ai rajouté quelques exemples dans le répertoire yamlrepo.

 

N’hésitez pas à me remonter les bugs, demande d’évolution 🙂

 

Amusez-vous bien 😀

 

 

 

 

 

Classé dans domotique | Taggé , , | 11 Commentaires