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.
Mise à 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.
mars 03, 2014
Je n’ai pas l’occasion de tester car pas la clé 3G mais je garde ça en favoris.
Pour info, je galère aussi avec l’editeur vi. Pour éviter ça et te prendre la tête avec winscp… tu peux installer l’editeur nano, beaucoup plus simple à utiliser ;)
Et merci pour le tuto
avril 04, 2014
Bonjour,
Merci pour ce super tuto.
Il se trouve que j’ai un Raspberry PI et aussi une clé Huawei E220, donc j’ai essayé de mettre tout ça en pratique. (la différence avec toi, c’est que j’ai une box Fibaro)
L’envoi de SMS fonctionne super bien.
Mais lorsque j’envoie des SMS, ils sont bien stockés dans le répertoire « /var/spool/gammu/inbox », mais rien ne se déclenche à la réception.
J’ai bien ajouté le « runonreceive » dans le fichier « gammu-smsdrc ».
J’ai bien changé le CHMOD pour le script sensé être lancé:
-rwxrwxrwx 1 pi pi 283 receivesms.sh
De plus, la commande « deleteallsms /var/spool/gammu/inbox/ » me retourne le message suivant:
-bash: deleteallsms: command not found
J’ai raté un truc ?
avril 04, 2014
Hello,
Sûrement ! Il faut que le serveur web ait bien tous les droits. Chez moi ça n’a jamais marché avec un simple CHMOD…
Bonne journée
mai 05, 2014
Hello,
Je n’arrive toujours pas à déclencher un script à la réception d’un SMS.
J’ai fait l’essai avec un script tout bête qui lance un « ls -rtl »
J’envoie mon SMS, et rien ne se passe.
Le SMS est bien reçu et stocké dans le répertoire /var/spool/gammu/inbox
Peut-tu m’expliquer ce que tu entends par « Il faut que le serveur web ait bien tous les droits » ?
Merci d’avance de ton aide
mai 05, 2014
C’est le fameux
visudo
puis
www-data ALL=(ALL) NOPASSWD: /usr/bin/gammu-smsd-inject
Je ne sais pas pourquoi mais avec un simple chmod ça n’a jamais fonctionné.
mai 05, 2014
Bonjour,§
Super tuto, vraiment intéressant!
Sachant que mon raspberry est connecté à internet via un dongle wifi h24, on peut envoyer/recevoir des sms par internet ?
mai 05, 2014
Bonjour,
Tu peux, sous réserve que ton Raspberry soit accessible depuis l’extérieur.
mai 05, 2014
Bonsoir,
J’ai suivi le tuto, et l’envoie de sms ne fonctionne pas.
pi@raspberrypi ~ $ sudo gammu-smsd-inject TEXT 0600000000 -text « MESSAGE »
gammu-smsd-inject[2356]: Created outbox message OUTC20140421_225423_00_0600000000_sms0.smsbackup
Written message with ID /var/spool/gammu/outbox/OUTC20140421_225423_00_0600000000_sms0.smsbackup
et je ne reçois rien sur mon téléphone.
une idée ?
mai 05, 2014
Le numéro est bon ? gammu a tous les droits utilisateurs ?
avril 04, 2015
Est-ce que t’as trouvé la solution? Je bloque ici aussi… :'(
mai 05, 2014
le numéro est bon.
pour les droits, que dois je faire ?
mai 05, 2014
J’ai essayé en root (via sudo), et ça ne fonctionne pas.
Le numéro est bon.
D’après ton tuto ça a l’air simple…
juin 06, 2014
Bonjour,
J’ai moi aussi suivi ton tuto à la lettre et j’ai la même erreur que Fred : l’envoi de sms ne fonctionne pas.
root@raspberrypi:/var/spool/gammu/sent# gammu-smsd-inject TEXT 06xxxxxxxx -text « MESSAGE »
gammu-smsd-inject[7489]: Created outbox message OUTC20140501_090216_00_06xxxxxxxx_sms0.smsbackup
Written message with ID /var/spool/gammu/outbox/OUTC20140501_090216_00_06xxxxxxxx_sms0.smsbackup
et je ne reçois pas de sms sur mon téléphone.
Je précise que le numéro est bon (testé avec et sans l’indicatif pour être sur) et que le gammu a tous les droits utilisateurs.
J’ai même recommencé 2 fois le tuto en partant de zéro après avoir formaté la SD à chaque fois.
As-tu une idée sur la provenance de cette erreur stp?
Merci.
juin 06, 2014
Vous avez testé avec visudo ?
juin 06, 2014
C’est à dire ? Il faut faire quoi avec visudo ?
juin 06, 2014
Bonjour,
super tuto, je cherchait justement une solution de notification quand ma connexion internet ne marche plus!
Y a t’il une alternative (moins chère) à la clé Huawei E220 qui soit compatible linux/gammu ?
juillet 07, 2014
Alors pour avoir eu le meme soucis, chez moi c’est la clé 3G qui était locker, je vous invite a voir ce tuto pour la desim :
http://elwan7.wordpress.com/2012/05/29/debloquer-la-cle-huawei-e1552-fournie-par-orange/
Sinon il y a des commandes sympa pour identifier le port…etc :
gammu identify : pour avoir le numéro IMEI
gammu-detect : pour voir le port et ça vous donne la conf a coller dans /etc/gammurc
Autre point, chez moi la ligne de commande d’envoi de sms passe pas par contre ces deux :
#gammu sendsms TEXT -text « »
Ou
#echo « » | gammu sendsms TEXT
marche….
A tester
juillet 07, 2014
J’ai effectivement oublié de préciser qu’il faut vérifier que la clé 3G n’est pas simlockée en fonction d’un opérateur. C’est corrigé !
août 08, 2014
Alors,
pour ceux qui galèrent à envoyer un sms avec gammu-smsd-inject essayer ça :
sudo service gammu-smsd restart
puis dans un autre terminal
tail -f /var/log/syslog
pour vérifier ce qui se passe pendant l’envoi.
Ensuite pour le runonreceive, j’ai lu sur un groupe google que c’est un problème de droit. vérifier les droits de l’utilisateur gammu.
personnellement j’ai remplacé gammu par root dans le fichier /etc/init.d/gammu-smsd , c’est très crade mais ça marche :x .
ptite question : dans ton script on voit que $SMS_1_TEXT correspond au corps du message, c’est quoi la variable qui contient le numéro de téléphone de l’envoyeur ?
août 08, 2014
Je n’ai pas cherché à la récupérer car je n’en avais pas besoin ;)
Mais tu l’auras dans la notice gammu.
août 08, 2014
SMS_1_NUMBER
Tout simplement.
novembre 11, 2014
Bonjour,
merci pour le tuto.
J’ai un problème , je ne trouve aucune trace de sms dans les repertoires :
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/
un problème de config ?
Je précise que je n’ai pas mis en place de serveur web.
novembre 11, 2014
Bonjour,
Merci pour ce tuto qui m’a permis de connecter avec succès ma vielle clé 3G+ SFR ZTE Q78-K3565-Z et ainsi échanger par sms avec mon raspberry….
Pour que cette clé fonctionne j’ai du…
1) la débloquer pour utiliser une puce free à 2€ par mois ….
2) créer le fichier 19d2:2000 dans /etc/usb_modeswitch.d
cat /etc/usb_modeswitch.d/19d2:2000
########################################################
# ZTE devices
DefaultVendor= 0x19d2
DefaultProduct= 0x2000
TargetVendor= 0x19d2
TargetProductList= »0001,0002,0015,0016,0017,0031,0037,0052,0055,0063,0064,0128″
MessageContent= »5553424312345678000000000000061b000000020000000000000000000000″
MessageContent2= »55534243123456782000000080000c85010101180101010101000000000000″
NeedResponse=1
CheckSuccess=20
et plouf c’est parti……
Voili voilou…
novembre 11, 2014
Hello, magnifique ce tuto !
L’envoi de SMS fonctionne merveilleusement bien.
Par contre, je recherche des infos pour créer un receivesms.sh personnalisé. du style
je recois OUVREPORTAIL ca envoie une requete http
je recois ALLUME1 ca envoie une autre requete http
etc
merci pour votre aide !
novembre 11, 2014
Merci.
C’est justement l’objet de la fin du tuto et du script receivesms.sh. Tu remplaces la commande http par celle qui va bien.
novembre 11, 2014
super tuto :D mais pour la réception de sms comment on défini quelle action est a effectué pour un mot défini ?
parce que la je ne vois pas :s
#!/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
est ce compatible avec domoticz ? parce que j’ai juste à remplacer la commande http
« http://IPEEDOMUS/api/set?action=periph.value&periph_id=XXXXX&api_user=XXX&api_secret=XXX&value=$SMS_1_TEXT »
par
http://ipduraspi:8080/json.htm?type=command¶m=switchlight&idx=9&switchcmd=On&level=0
novembre 11, 2014
Oui, il faut juste remplacer l’url mais en conservant la variable $SMS_1_TEXT qui reprend le contenu du SMS. Après c’est Domoticz qui doit traiter cette variable.
Donc plutôt un truc du genre (je ne connais pas Domoticz) :
http://ipduraspi:8080/json.htm?type=command¶m=switchlight&idx=9&switchcmd=On&level=$SMS_1_TEXT
novembre 11, 2014
Bonsoir,
J’arrive bien à envoyer des sms en faisant gammu-smsd-inject… etc
mais cela ne marche pas avec le serveur web (alors qu’il est bien présent sur l’adresse ip (puisque j’ai le message « placeholder page »)
la syntaxe est bien ? :
http://192.168.1.61/sendsms.php?numero=06XXXXXXXX&texte=test4
merci
novembre 11, 2014
Oui. Il faut donner les bons droits au serveur web (cf. le tuto).
novembre 11, 2014
J’ai bien suivi le tuto mais à chaque fois j’obtiens
« 404-Not found » et rien ….
ne sais plus quoi faire
décembre 12, 2014
Bonjour, moi de mon coté, je suis coincé au départ !
En tapant
#dmesg
Je me retrouve avec un centaine de lignes… je trouve à plusieurs reprises « usb1 » mais pas de « ttyUSB1 »
Du coup dans mon fichier de config j’ai mis « usb1 »
et pas de code pin, car ma carte SIM n’a pas de code pin, sauf que quand j’essaye d’envoyer un SMS en ligne de commande, il me met
« Warning no PIN code enter in /etc/gammu-drc file »
Et même si j’en met un (1234 par exemple), j’ai toujours le même message d’erreur.
Le fichier se créé correctement, mais je ne reçoit aucun SMS évidement…
Alors est-ce un problème de device ? (usb1 ou ttyUSB1), est-ce que je doit mettre un code pin absolument quand même ?
D’autre part, impossible d’ouvrir les dossier /var/spool/gammu/outbox, sent, inbox … accès refusé !
Merci de me venir en aide :(
janvier 01, 2015
Bonjour
J’ai un problème. lorsque j’installe lighttpd j’ai une erreur car il me dit que le port 80 est déjà utilisé.
Savez vous pourquoi ?
Comment résoudre ce pb ?
Merci