Raspberry Pi : une passerelle pour envoyer des SMS, recevoir des SMS et déclencher des actions.

Toutes nos boxes sont capables, nativement ou grâce à différents scripts, d’envoyer des notifications. Cette fonction nécessite cependant une connexion internet active. Certaines box (je pense notamment à l’eedomus) permettent même nativement l’envoi de SMS. Mais, même problème : si la connexion internet est coupée, aucun moyen d’informer le serveur qu’il doit envoyer un SMS !

Voici donc la problématique : comment permettre à votre box domotique d’envoyer des notifications par SMS sans connexion internet ?
Mais aussi comment piloter votre installation domotique à partir de SMS si la connexion internet est coupée ?

Ca ira pour cette fois, je vous sauve gratos.

 

logo jeedomMise à jour : puisque vous êtes équipé d’un Raspberry Pi et d’un dongle GSM, la solution la plus simple est d’utiliser la solution JEEDOM (+ plugin SMS) développée par les deux petits frenchies Loïc et Mathieu.

 

Prérequis

Nous avons donc besoin :

  • d’un Raspberry Pi avec n’importe quelle distribution fonctionnelle (testé avec Raspbian et Squeezeplug) et évidemment configuré en IP fixe (ou IP fixée sur votre routeur grâce à l’adresse MAC, bien plus simple …)
  • d’un serveur web avec PHP
  • d’un dongle GSM désimlocké (testé avec une clé 3G Huawei E220)
  • d’une carte SIM avec un crédit de SMS, code PIN désactivé pour faciliter les choses (mais vous pourrez toujours le spécifier dans la configuration)
  • d’un peu d’huile de coude car pour l’instant toute l’installation doit se faire à la mano

Connectez votre dongle et démarrez votre bouzin…
Ouvrez une fenêtre terminal (sur mac) ou putty (sur pc). Quasiment tout se passe en lignes de commandes.
Loggez­-vous en root (ou alors utilisez la commande sudo). Mettez à jour tous vos paquets puis installez gammu et son daemon gammu-­smsd :

# apt-get update
# apt-get install gammu
# apt-get install gammu-smsd

Si vous n’avez pas installé de serveur web, c’est le moment :

# apt-get install lighttpd

Puis installez PHP :

# apt-get install php5-common php5-cgi php5

Puis expliquez à votre serveur d’utiliser PHP avec la commande :

# lighty-enable-mod fastcgi-php

Rechargez votre serveur web pour qu’il prenne en compte les nouveaux paramètres :

# service lighttpd force-reload

 

Envoyer des SMS

Avant tout il faut configurer gammu pour qu’il puisse utiliser votre dongle GSM.
Tapez dsmeg pour savoir sur quel port est connectée votre clé 3G et gardez le bien en mémoire. Il sera normalement du type ttyUSB0, ttyUSB1…

# dmesg

Editez le fichier /etc/gammu-smsdrc et dans la partie [gammu] renseignez le port que vous avez retenu tout à l’heure.
Voici l’exemple de mon fichier :

[gammu]
# Please configure this!
port = /dev/ttyUSB0
connection = at19200
# Debugging
# logformat = textall

Comme je suis une grosse quiche sur vi (l’éditeur en ligne de commandes), j’édite mes fichiers avec WinSCP. Si vous avez une méthode plus simple, n’hésitez pas à la proposer dans les commentaires et je mettrai l’article à jour.

Vous pouvez aussi ajouter votre code PIN si vous ne l’avez pas désactivé en ajoutant :

pin = XXXX

N’oubliez pas de démarrer le daemon :

# service gammu-smsd start

Vous pouvez déjà tester l’envoi de SMS avec la commande :

gammu-smsd-inject TEXT NUMERO -text "MESSAGE"

Maintenant, comment faire pour que votre box (ou autre) puisse utiliser votre Raspberry pour envoyer des SMS à partir d’une simple URL ?

Créez le fichier sendsms.php et placez-le sur votre serveur web.

<?php
$numero = $_GET['numero'];
$texte = $_GET['texte'];
echo `sudo gammu-smsd-inject TEXT '$numero' -text '$texte'`;
?>

Vous devez maintenant autoriser votre serveur web à exécuter le script gammu-smsd-inject en éditant le fichier sudoers.

Pour cela, tapez

visudo

et ajoutez à la fin

www-data ALL=(ALL) NOPASSWD: /usr/bin/gammu-smsd-inject

Ça y est, vous pouvez envoyer des SMS à partir de l’URL (en vérifiant bien le chemin vers votre fichier sendsms.php) :

http://IP-RASPBERRY/sendsms.php?numero=06xxxxxxxx&texte=votremessage

 

Recevoir un SMS et lancer une action avec une URL

Pour déclencher une action à la réception d’un SMS, nous allons utiliser la fonction runonreceive. Celle-ci lancera, à la réception d’un SMS, le script que vous allez spécifier dans la configuration du daemon.

Dans mon exemple, le script récupère le texte du SMS pour l’inscrire, grâce à l’API eedomus, dans un état virtuel.
Exemple : j’envoie le SMS « alarme on ». L’état virtuel de ma box prend donc la valeur « alarme on ». Dans le moteur de règles je programme l’action à lancer à partir de cet état etc.

Tout d’abord, créez le fichier script receivesms.sh et uploadez-le où vous voulez. N’oubliez-pas de vérifier que tous les utilisateurs aient bien tous les droits sur ce script.

#!/bin/sh
PROGRAM=/bin/echo
for i in `seq $SMS_MESSAGES` ; do
wget ­O ­ ­q ­t 1 "http://IPEEDOMUS/api/set?action=periph.value&periph_id=XXXXX&api_user=XXX&api_secret=XXX&value=$SMS_1_TEXT" >/dev/null 2>&1
deleteallsms /var/spool/gammu/inbox/
done

Pour une question de sécurité, le script supprime automatiquement tous les SMS reçus.

Maintenant, configurez le daemon pour qu’il lance le script receivesms.sh à la réception d’un SMS en ajoutant à la fin du fichier /etc/gammu-smsdrc :

runonreceive = /dossieroùsetrouvevotrescript/receivesms.sh

Voici l’exemple de mon fichier gammu-smsdrc complet :

# Configuration file for Gammu SMS Daemon

# Gammu library configuration, see gammurc(5)

[gammu]
# Please configure this!
port = /dev/ttyUSB0
connection = at19200
# Debugging
#logformat = textall

# SMSD configuration, see gammu-smsdrc(5)
[smsd]
service = files
logfile = syslog
runonreceive = /var/www/receivesms.sh
# Increase for debugging information
debuglevel = 0

# Paths where messages are stored
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/

Voilà, vous pouvez maintenant envoyer un SMS à votre Raspberry qui exécutera le script receivesms.sh à la réception ! Dans cet exemple on récupère la valeur du texte mais on pourrait aussi récupérer le numéro de l’expéditeur etc.

Pour une question de sécurité, je vous suggère d’ajouter, aux commandes que vous allez enregistrer, un mot de passe. C’est une solution simpliste mais elle aura déjà le mérite d’éviter que n’importe qui, qui trouve le numéro de téléphone de votre Raspberry, puisse désactiver votre alarme avec le simple mot clef « alarme off ».

Vous pouvez donc envoyer un SMS de la forme « motdepasse alarme off ».

Si vous jetez un coup d’œil à la documentation gammu-smsdrc, vous pouvez limiter la réception de SMS à certains numéros de téléphone enregistrés. Avec l’inconvénient de ne plus pouvoir piloter votre installation à partir de n’importe quel téléphone qui vous tomberait sous la main.

Ca y est ! Votre box est autonome en cas de coupure internet (en termes de communication, évidemment). Vous pourrez connaître l’état de votre maison et lancer des commandes, à l’ancienne sur votre 3310 !
Le SMS n’est pas mort. Vive le SMS !

N’hésitez pas à poster vos retours dans les commentaires que je mette à jour la liste des clés 3G et distributions compatibles.