mar 10

S.A.R.A.H. , Contrôler votre domotique autrement

Un retour à la domotique en attendant la suite de mon billet système qui me prend plus de temps de rédaction que prévu :p
Que voulez-vous, on se laisse aller à tester plein de trucs et le temps file plus vite que l’on ne le souhaiterait…

Aujourd’hui je vais vous présenter un projet dont vous avez sûrement entendu parler si vous côtoyez l’actualité domotique, S.A.R.A.H.

S.A.R.A.H. (Self Actuated Residential Automated Habitat) est un framework écrit en C# pour Windows, basé sur les API de reconnaissance vocale Speech API et le SDK de la Kinect de Microsoft.

Et la vous vous dites, le GuiguiAbloc, il a pété un câble, il parle de windows sur son blog et il met même des liens vers Micro$oft !!!

C’est pas faux…

J’avoue que j’ai trainé des pieds avant de tester le projet de Jean-Philippe Encausse à cause de ma révulsion envers celui dont on peut pas citer le nom, mais il faut bien se rendre à l’évidence, la reconnaissance vocale sous Linux, c’est une horreur.
A part des POCs a 2 balles ou des démos du M.I.T., je n’ai pour l’instant vu personne faire un(e) tuto/démonstration tout simple pour faire de la reconnaissance vocale sous mon OS fétiche (si toi aussi tu as essayer de te configurer Sphinx le soir au fond des bois, tu me comprendras…)

Bref, mes aversions mises de côté, il faut se rendre a l’évidence, ce Monsieur a fait un travail époustouflant.

Ca me réconcilierais presque avec Micro$oft (nan j’déconne).

S.A.R.A.H. permet de contrôler votre domotique par la voix, par les gestes, par la reconnaissance faciale (en cours), par des QR codes etc…
En gros, toutes les possibilités énormes de la Kinect sont exploitées pour interagir avec votre domotique et bonus, elle vous répond (bon d’accord ça fait une femme de plus a causer dans la maison, je vous l’accorde)

En gros, il suffit de dire « Sarah, allume la lumière du salon » et « Sarah, lis le film la Cambrioleuse » pour que xbmc lance votre film favori sous le doux éclairage de votre halogène.

Intéressant, non ?

Concernant l’architecture de S.A.R.AH., vous trouverez tout ce qu’il vous faut ici:

http://encausse.wordpress.com/s-a-r-a-h/s-a-r-a-h-architecture/

Je ne rentrerais pas dans les détail du projet, le site de l’auteur vous l’expliquera mieux que moi, vidéo à l’appui, mais je vais plutôt vous parlez de sa mise en oeuvre ainsi que de la création d’un plugin tout simple pour s’intercaler avec un webservice qui interrogera une base de données.

Car si j’ai une remarque à formuler, c’est le côté léger de la documentation pour l’installation et l’utilisation, surtout quand, comme moi, on n’a pas toucher un Windows depuis 1993…

Tout d’abord, il vous faut un windows, Seven de préférence.
J’ai personnellement installé un windows 7 32bits tout ce qu’il y a de plus basique, sans fioritures, sur un ordinateur portable avec 2Go de RAM (ce qui me permet de profiter du micro intégré).

Ensuite, les pré-requis (bien sûr, installer les versions x64 si vous êtes sous un windows en 64bits) :

- Le framework Microsoft .Net 4.5

- Le SDK Microsoft Speech Platform (j’ai installé la version 11)

- Le Speech Platform Runtime (version 11 également)

- Le pack de langue Française

- les runtime Kinect

En résumé, voici ce que j’ai d’installer pour faire tourner S.A.R.A.H.

 

Ensuite je vous conseille fortement de configurer la reconnaissance vocale de Windows 7  pour être sur que tout fonctionne correctement.

http://windows.microsoft.com/fr-fr/windows7/set-up-speech-recognition

Ne reste qu’a récupérer le programme S.AR.A.H

Dézipper le (j’ai tout mis dans c:\sarah).

- Installer la voix française « Virginie » inclus dans le répertoire README/ScanSoftTTS
(je vous conseille d’ailleurs de régler la voix de synthèse vocale dans les paramètres Windows http://windows.microsoft.com/fr-fr/windows7/setting-speech-options )

Puis lancer le WSRNode.bat

Si vous n’avez pas autant de plugins qui se lance, rassurez vous, cela s’installe après

Puis le WSRMicro.bat (si comme moi vous n’avez qu’un micro, sinon le WSRKinect.bat si vous avez la kinect).

L’icône d’une petite maison doit apparaître dans la barre des tâches et si vous faites un clic droit dessus, vous pouvez lancer « Sentinel » qui permet de visualiser en direct les logs du programmes.

A vous de jouer maintenant pour essayer S.A.R.A.H en testant le plugin « time » déjà inclus :

Dites « Sarah, quelle heure est-il ? » et elle devrait vous donner l’heure :D Magique non ?

Si cela ne fonctionne pas, regarder ce qui défile dans la console Sentinel, cela devrait vous aider a débugger. Sachez que le groupe de discussion est là pour vous aider :)

Maintenant que cela fonctionne, vous pouvez ajouter des plugins via l’interface web (http://127.0.0.1:8080), dans le « Store ».
Ces plugins s’installeront dans le répertoire « plugins » (dingue, non) et leur structure est toute simple.

Nous allons donc ensemble créer un plugin tout simple qui va me permettre d’interroger S.A.R.A.H pour connaître la température ou le degré d’hygrométrie dans une pièce de la maison.

Toutes les données de mes sondes de températures sont enregistrées dans une base MySQL grâce au client xpl-mysql-logger.
La structure de la table est toute simple :

mysql> desc sensor ;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| idx            | int(11)      | NO   | PRI | NULL    | auto_increment |
| curDate        | date         | YES  |     | NULL    |                |
| curTime        | time         | YES  |     | NULL    |                |
| sensorType     | varchar(10)  | YES  |     | NULL    |                |
| sensorLocation | varchar(255) | YES  |     | NULL    |                |
| sensorValue    | varchar(25)  | YES  |     | NULL    |                |
| sensorUnit     | varchar(25)  | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

Pour interroger cette base de données, on va vite fait s’écrire un Webservice en python :

simplews.py

#!/usr/bin/env python
# Grouik coded by GuiguiAbloc
 
import web, MySQLdb
import re,socket,sys,os
web.config.debug = False
urls = (
'/', 'index',
'/temp/(.*)', 'temp'
)
 
render = web.template.render('templates/', globals={'re':re})
app = web.application(urls, globals())
 
class index:
def GET(self):
return web.HTTPError(403)
def POST(self):
return web.HTTPError(403)
 
class temp:
def GET(self,id):
db = web.database(dbn='mysql', user='sensor', pw='sensor', db='sensor')
todos = db.query("SELECT * from sensor where sensorType=$toto ORDER BY idx DESC limit 1", vars={ 'toto' : id})
for todo in todos:
return todo.sensorValue
 
if __name__ == '__main__':
app.run()

Ne reste qu’a le lancer en spécificant le port d’écoute:

python simplews.py 8085

et une simple requête http du type :

http://serveur;8085/temp/TempSalon interrogera la base de données et vous retournera la valeur associée à l’entrée TempSalon :

$ curl http://serveur:8085/temp/TempSalon
20.7
 
# python simplews.py 8085
http://0.0.0.0:8085/
192.168.0.10:58311 - - [10/Mar/2013 17:30:49] "HTTP/1.1 GET /temp/TempSalon" - 200 OK

Maintenant que nous avons un webservice, écrivons un petit plugin pour S.A.R.A.H.

Dans c:\sarah\plugins, nous allons créer le répertoire « temperature ».

Ce répertoire contiendra 3 fichiers :

temperature.prop (qui est le descriptif du plugin)

{
"modules" : {
"temperature":     {
"description": "Lit des infos provenant de la bdd",
"version"    : "0.1",
"api_url"    : "http://serveur:8085/temp"
}
}
}

temperature.js (qui est le script js qu’exécutera S.A.R.A.H)

exports.action = function(data, callback, config){
 
// Retrieve config
config = config.modules.temperature;
if (!config.api_url){
console.log("Missing temperature config");
return;
}
 
console.log("temperature config complete");
var periphId;
if (data.room == "salon") {
var place = "le salon";
if (data.type == "T") {
var mesure = "la température";
periphId = "TempSalon";
}
}
 
if (data.room == "dehors") {
var place = "le jardin";
if (data.type == "T") {
var mesure = "la température";
periphId = "TempExt";
}
if (data.type == "H") {
var mesure = "le taux d'humidité";
periphId = "HygroExt";
}
}
 
// Build URL
var url = config.api_url;
url += '/'+periphId;
 
console.log('URL:' + url);
 
// Send Request
var request = require('request');
request({ 'uri' : url }, function (err, response, body){
 
if (err || response.statusCode != 200) {
callback({'tts': "Désolé , je ne parviens pas récupérer  " + mesure + "dans " + place});
 
return;
}
// Callback with TTS
console.log("Page : " + body);
console.log(data.type + " : " +body);
var value = body;
callback({'tts': mesure + " est de " + value + data.unit + " dans " + place});
});
}

Et enfin, le temperature.xml qui configure les phrases sur lesquelles S.A.R.A.H. doit réagir :

<grammar version="1.0" xml:lang="fr-FR" mode="voice" root="ruletemperature" xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
  <rule id="ruletemperature" scope="public">
 
<example>Sarah combien fait-il dans le salon</example>
    <tag>out.action=new Object(); </tag>
    <item weight="2">Sarah</item>
    <one-of>
<item>Quelle est la temperature dans out.action.type="T"out.action.unit="degrés"
</tag></item>
<item>Quelle est la temperature out.action.type="T"out.action.unit="degrés"
</tag></item>
<item>Combien fait-il dans out.action.type="T"out.action.unit="degrés"
</tag></item>
<item>Combien fait-il out.action.type="T"out.action.unit="degrés"
</tag></item>
<item>Quel est le taux d'humidité out.action.type="H"out.action.unit="pourcents"
</tag></item>
<item>Quelle est l'humidité out.action.type="H"out.action.unit="pourcents"
</tag></item>
<item>Quelle est l'hygrométrie out.action.type="H"out.action.unit="pourcents"
</tag></item>
 
</one-of>
    <one-of>
 
<item>le salonout.action.room="salon"
</tag></item>
<item>dehorsout.action.room="dehors"
</tag></item>
</one-of>
<tag>out.action._attributes.tts="Je regarde tout de suite";
</tag>
<tag>out.action._attributes.uri="http://127.0.0.1:8080/sarah/temperature";
</tag>
</rule>
</grammar>

Vraiment tout simple non ?

Pour vous donner un aperçu de ce que cela donne, je vous colle une petite vidéo vite faite :)


Démonstration S.A.R.A.H. par Guiguiabloc

Bref un excellent projet, qui fonctionne parfaitement et je compte continuer mes expérimentations avec une Kinect, histoire de voir ce que cela donne :D

Amusez-vous bien :D

Classé dans domotique | Taggé , | 15 Commentaires
fév 04

Haute-disponibilité et Load-Balancing par Cascade de NS

©Disney/Pixar

 Un retour aux premiers amours de ce blog, avec, pour changer, une suite de billets système et réseau.

Cette série est issue d’une petite discussion que j’ai eu avec mon ami Horacio, du blog LostinBrittany, durant un projet technique professionnel commun.
Plutôt que de garder pour moi mes réflexions, autant vous les faire partager :)

Cette discussion concerne surtout le prochain billet de ce blog, mais avant de l’aborder, il fallait poser les bases d’une certaine architecture et c’est ce que nous allons tout d’abord voir aujourd’hui.

Je vais vous parler d’une technique qui paraît bien triviale mais étonnamment efficace et largement employée dans les architectures disposant de 2 branches d’accès Internet.

Après tout, dans votre soucis constant de disposer d’une architecture hautement disponible et partant du sacro-saint adage « on ne met pas les oeufs dans le même panier », vous avez décidé de confier l’accès internet de votre infrastructure à deux opérateurs différents (par exemple, si  > 2, cela marche aussi…)

Bien évidemment, cela peut aussi être l’hébergement de vos serveurs dédiés chez deux entités différentes, ou encore, plus simplement, des serveurs dédiés dans 2 datacenters différents, ou tout bêtement, de 2 serveurs dédiés devant lesquelles vous n’avez pas de load-balancer…

Quoi qu’il en soit, la multiplication des points d’entrées « Internet » de votre service sur plusieurs chemins différents, vous donne, déjà, une meilleure sérénité de sa disponibilité envers le « monde ».

L’inconvénient de ce choix est qu’il est difficile de positionner un Load-Balancer devant vos serveurs pour répartir la charge ou tout simplement de renvoyer tout le trafic sur le serveur « vivant » quand l’autre est tombé.

On ramenant le concept à deux serveurs web (que je vais utiliser pour un exemple plus « accessible » ), nous allons voir comment utiliser le service DNS pour aller sur l’un ou l’autre des serveurs et pouvoir basculer le trafic sur l’un des deux en cas de panne d’un accès (ou du décès de l’un des serveurs Web).

Dans un vision très habituelle des choses, que l’on rencontre fréquemment sur les architectures exposées par les sysadmins, la technique souvent utilisée est le « Round Robin DNS« .

Je vous rassure tout de suite, rien à voir avec des problèmes d’obésité d’un quelconque défenseur de la fôret de Sherwood, mais d’une bidouille d’un enregistrement dns.

En effet, pour un enregistrement de type A (un enregistrement DNS spécifiant un nom = une adresse IP  pour faire simple), on peut donner 2 entrées pour le même nom.

Exemple :

blog.guiguiabloc.fr  IN A 10.10.10.10
blog.guiguiabloc.fr  IN A 10.20.20.20

Les plus pointus allant même jusqu’à modifier l’entrée TTL pour peaufiner.

Résultat, alternativement, les requêtes sont envoyées sur 10.10.10.10 ou sur 10.20.20.20.

Le gros inconvénient de cette technique est que les requêtes iront toujours sur l’un ou l’autre, même si l’un des deux est mort… Un accès sur 2 n’aura donc pas de réponse… Gênant.
C’est donc une technique « a pas cher » de load-balancing, mais nullement une solution de haute-disponibilité (ou de Fail-Over).

Alors comment utiliser les DNS pour faire et du load-balancing et du fail-over ?
La réponse s’appelle du « Cascading NS » (ou cascade de serveurs NS).

Si une entrée DNS de type A fait la correspondance entre un nom d’hôte et une adresse IP, un enregistrement de type NS vous donne le serveur DNS ayant autorité sur le domaine (et qui donc sera à même de vous donner l’adresse IP (ou type A) du nom d’hôte que vous recherchez ou de vous indiquez à qui le demander).

Un dessin valant un long discours, regardons un peu le fonctionnement du cascading NS :

Que se passe t-il quand le client demande « blog.guiguiabloc.fr » ?

- Les autorités TLD répondent que le domaine « guiguiabloc.fr » est géré par les NS de tel registrar (OVH, GANDI, etc…) (je simplifie hein :p)

- Les serveurs DNS du Registrar répondent qu’il faut interroger deux autres NS, NS1.mondns.fr et NS2.mondns.fr qui sont autorité de zone pour le domaine « guiguiabloc.fr » (on arrive la sur VOS serveurs DNS) (1)

- Les serveurs DNS, ns1.mondns.fr et ns2.mondns.fr répondent qu’ils gèrent bien le domaine « guiguiabloc.fr » mais le sous-domaine « blog.guiguiabloc.fr » est géré par deux autres DNS, web-1.mondns.fr et web-2.mondns.fr (qui sont vos serveurs Web sur lesquelles tournent un serveur DNS ne s’occupant que de cette zone) (2)

- Le client interroge alors l’un des NS (web-1.mondns.fr ou web-2.mondns.fr) pour connaitre l’entrée A de blog.guiguiabloc.fr (3)

- Si c’est web-1.mondns.fr qui est interrogé, il répondra 10.10.10.10, si c’est web-2.mondns.fr, il répondra 10.20.20.20, avec une durée de vie d’1 minute de la correspondance (60 secondes plus tard, si le client doit demander de nouveau blog.guiguiabloc.fr, il devra demander de nouveau l’adresse IP (lors d’une nouvelle session par exemple).

Voila ce que donnera une demande de résolution :

guigui@Clara:~$ dig blog.guiguiabloc.fr
 
; <<>> DiG 9.7.3 <<>> blog.guiguiabloc.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41551
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
 
;; QUESTION SECTION:
;blog.guiguiabloc.fr.              IN      A
 
;; ANSWER SECTION:
blog.guiguiabloc.fr.       49      IN      A       10.10.10.10
 
;; AUTHORITY SECTION:
blog.guiguiabloc.fr.       49      IN      NS      web-1.mondns.fr.
 
;; ADDITIONAL SECTION:
web-1.mondns.fr.         3922    IN      A       10.10.10.10

Et 60 secondes plus tard :

...
;; ANSWER SECTION:
blog.guiguiabloc.fr.       60      IN      A       10.20.20.20
 
;; AUTHORITY SECTION:
blog.guiguiabloc.fr.       60      IN      NS      web-2.mondns.fr.
 
;; ADDITIONAL SECTION:
web-2.mondns.fr.         5006    IN      A       10.20.20.20

Vous avez compris que le site web blog.guiguiabloc.fr tourne sur les deux serveurs web avec chacun une IP différente.

A l’inverse du Round-Robin DNS, le client interroge les NS aléatoirement et prend la réponse du plus rapide (et donc également du plus proche géographiquement).
Rassurez vous, toute cette séquence ne prend que quelques millisecondes.

Mais que se passe-t-il quand web-1.mondns.fr tombe (et donc ne peut plus répondre).

 Le début est identique mais quand le client demande « blog.guiguiabloc.fr »  aux serveurs NS de la sous-zone, seul le « NS » 2 répondra.

Vous avez la un fail-over immédiat (tout au moins a 60 secondes après le crash) puisque NS1 ne répondra jamais.
La technique est aussi très efficace quand vous souhaitez retirer un des serveurs web de votre pool, il vous suffit d’arreter le serveur DNS dessus. Il ne répondra plus aux requètes NS et donc ne prendra pas de trafic :D

La configuration des DNS est des plus basiques pour cela, il faut bien évidemment que les serveurs DNS de web-1.mondns.fr et web-2.mondns.fr soit chacun master (maître) (puisqu’ils donnent une entrée de type A différente).

Pré-requis, vous avez bien entendu défini une entrée de type A pour web-1 et web-2 dans la zone « mondns.fr ».

Sur vos serveurs DNS principaux (ns1.mondns.fr et ns2.mondns.fr), pour la zone « guiguiabloc.fr » (bien sûr remplacez tout cela par vos domaines/IP ;) )

$TTL 600
@                IN SOA  ns1.mondns.fr. noc.mondns.fr. (
2013020400 ; serial
3600       ; refresh
3600       ; retry
3600000    ; expire
3600       ; minimum
)
 
IN NS ns1.mondns.fr.
IN NS ns2.mondns.fr.
blog                  IN NS web-1.mondns.fr.
                        IN NS web-2.mondns.fr.

Sur web-1, pour la zone « blog.guiguiabloc.fr » :

$ORIGIN .
$TTL 60
blog.guiguiabloc.fr                IN SOA  ns1.mondns.fr. noc.mondns.fr. (
2013020400 ; serial
3600       ; refresh
3600       ; retry
3600000    ; expire
3600       ; minimum
)
 
IN NS          web-1.mondns.fr.
IN A       10.10.10.10

Sur web-2, pour la zone « blog.guiguiabloc.fr »

$ORIGIN .
$TTL 60
blog.guiguiabloc.fr                IN SOA  ns1.mondns.fr. noc.mondns.fr. (
2013020400 ; serial
3600       ; refresh
3600       ; retry
3600000    ; expire
3600       ; minimum
)
 
IN NS          web-2.mondns.fr.
IN A       10.20.20.20

Bien entendu, je vous laisse adapter à votre configuration, c’est juste un exemple :)

Alors, elle n’est pas sympa cette technique ? :)

« oui,oui. Très sympa oh Grand Guiguiabloc, mais y’a quand même un problème ! »
« Ah ? Je t’écoute jeune Padawan »
« si le service web de web-1 plante par exemple, mais pas le serveur, mon DNS il répond toujours !!! et les visiteurs ils arrivent toujours sur mon serveur !! Ca craint ! »
« Je m’attendais à cette remarque, jeune youglin, et comme je suis dans une année de grande bonté, je vais te donner une solution pour cela »

« oh merci Grand Guiguiabloc !!! » (flap-flap-flap)

La solution pour couper votre DNS local sur votre serveur web (ou votre reverse-proxy hein) en cas de crash du service http s’appelle :
MONIT.

MONIT est un utilitaire qui surveille vos process (mais également vos répertoires, fichiers, programmes etc..) et execute des actions en cas de soucis.

L’action la plus courante est d’avertir l’admin (forcément :p) mais également par exemple, de tenter de relancer le programme.

Exemple pour surveiller le process Nginx

check process nginx with pidfile /var/run/nginx.pid
  start program = "/etc/init.d/nginx start"
  stop program  = "/etc/init.d/nginx stop"
  group www-data

Vous trouverez des exemples sur la page wiki du projet :

http://mmonit.com/wiki/Monit/ConfigurationExamples

En cas de non réponse du process, vous pouvez appeler un script par « exec » ‘de type « /etc/init.d/bind9 stop » ;)

Plus simple encore, un simple script bash appeler en crontab :

#!/bin/bash
#pre-requis blog.guiguiabloc.fr a une entrée dans
#le fichier /etc/hosts avec son ip locale
#pour éviter d'interroger les DNS
TESTING=`curl -sL -w "%{http_code} %{url_effective}\\n" "blog.guiguiabloc.fr" -o /dev/null`
if test "$TESTING" != "200 http://blog.guiguiabloc.fr"
then
echo "CA CHIE"
else
echo "ok"
fi

Et donc arreter le service DNS si « CA CA CHIE » :D

En espérant que cela vous donne des idées

Amusez-vous bien :D

 

 

Classé dans architecture, linux | Taggé , | 22 Commentaires
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 :D

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 :D )

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 :D

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