Comment créer un serveur de SMS en deux clics avec Node-Red ?
Vous avez un Raspberry Pi sous la main ainsi qu'un modem 3G équipé d'une SIM Free à 0 euro avec SMS illimités ?
Voici en quelques clics comment fabriquer une gateway SMS.
Installation de Node-Red
La première étape consiste à installer NodeJS et Node-Red sur votre Raspberry Pi. Pour cela vous pouvez suivre le tutoriel suivant qui a très bien fonctionné sur mon environnement :
https://nodered.org/docs/hardware/raspberrypi.html
Installation de Gammu
Ensuite, installez Gammu SMS pour pouvoir transmettre très simplement des commandes d'envoi de SMS à votre modem :
$ sudo apt-get install gammu
$ sudo apt-get install gammu-smsd
Identifiez sur quel port fonctionne votre modem :
$ sudo gammu --identify
Si vous souhaitez donner un petit nom à votre modem dans le "/dev" pour pouvoir l'identifier plus facilement, vous pouvez configurer une entrée dans le fichier "/etc/udev/rules.d/99-com.rules".
Utiliser la commande "lsusb" pour obtenir les détails du périphérique (idVendor / idProduct).
ACTION=="add", ENV{ID_BUS}=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", SYMLINK+="tty3GModem"
Modifiez la configuration de votre démon Gammu-sms "/etc/gammu-smsdrc" en n'oubliant pas de préciser terminal USB qui correspond à votre modem :
# Gammu library configuration, see gammurc(5)
[gammu]
port = /dev/tty3GModem
connection = at19200
model = at
# Debugging
#logformat = textall
# SMSD configuration, see gammu-smsdrc(5)
[smsd]
service = files
logfile = syslog
# Increase for debugging information
debuglevel = 0
# PIN code
pin = 0000
# 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/
Redémarrer votre démon Gammu :
sudo /etc/init.d/gammu-smsd restart
Testez l'envoi d'un SMS :
$ sudo gammu-smsd-inject TEXT 0666666666 -text "Test"
En cas de non réception du SMS, vérifiez le syslog du système :
$ sudo less /var/log/syslog
Maintenant que votre modem SMS fonctionne, offrez les droits en lecture à votre pool SMS à l'utilisateur exécutant NodeRed :
$ sudo usermod -a -G gammu pi
Allez ensuite sur votre Interface Node-Red pour configurer de nouveaux flows.
Détecter la réception de nouveaux SMS
La réalisation d'un "flow" Node-Red capable de détecter la présence d'un nouveau fichier (ici un SMS), de lire son contenu et d'en extraire le numéro de téléphone de l'émetteur est très simple à réaliser :
- Node "SMS Inbox" : Vérifie la présence de nouveaux fichiers dans le répertoire "/var/spool/gammu/inbox"
- Node "Set msg.filename" : Positionne la variable msg.filename dans la variable msg.payload pour le noeud file.
- Node "SMS content" : Lit le contenu du fichier SMS reçu, le chemin du fichier provient du msg.payload fourni en entrée du noeud.
- La fonction spécifique extrait du fichier le numéro de téléphone de l'envoyeur et supprime les propriétés inutiles.
msg.phone = msg.filename.match(/(\+[0-9]*)/)[1];
delete msg.filename;
delete msg.topic;
delete msg.file;
delete msg.type;
return msg;
A chaque nouveau SMS reçu vous pouvez ensuite déclencher un événement spécifique : envoi d'email, de SMS, réaliser une action sur un Karotz, ouverture de volets, de portails ....
Webservice d'envoi de SMS
Une fois Gammu fonctionnel sur votre Raspberry Pi, la réalisation d'un Webservice REST pouvant transmettre rapidement des messages est aussi très simple à réaliser :
- Node "get /sendsms" : Ce noeud expose un Webservice de type GET prenant un paramètre "phone" et un paramètre "msg".
- Node "Prepare command" : Ce nœud prépare la commande Gammu-inject-sms à partir des arguments en entrée du service. Attention aux injections de shell possibles, une vérification du contenu doit être réalisé pour éviter toute possibilité d'injecter du shell.
gammu-smsd-inject TEXT "{{payload.phone}}" -text "{{payload.msg}}"
- Node "Exec Gammu" : Exécute la commande préparée par le template injectée dans le msg.payload.
- Node "Check result" : vérifie la présence de la chaîne suivante : "Created outbox message"
- Node "OK / KO / HTTP Response" : Retourne en réponse HTTP de type 204 ou 501 en fonction du bon envoi du message par Gammu.
Vous voilà en possession d'un Webservice que vous allez pouvoir intégrer à d'autres scénario de domotique plus complexes. Si vous souhaitez enregistrer le contenu des SMS, vous pouvez utiliser une base MongoDB, le connecteur Node-Red est extrêmement simple à utiliser.