3g-modem-huawei.jpg

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 :

http://nodered.org/docs/hardware/raspberrypi.html

node red screenshot

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 :

sms inbox nodered

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

webservice sms nodered

  • 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.

1. Le , 11:27 par Nekloth
e7d2b4839bee2000c4ad0dc254979b9d

"en deux clics" ? Un peu optimiste, non ? ;-)

Merci pour le tuto, ça pourra sûrement me servir bientôt !

2. Le , 12:34 par Nekloth
e7d2b4839bee2000c4ad0dc254979b9d

Allez, je t'embête avec Node-Red (qui semble vraiment génial).

J'essaye de faire un flux simple : requête HTTP pour avoir la météo, et affichage (dans un debug) du temps.

API utilisée : api.openweathermap.org/data/2.5/weather?q=London (JSONParsed dans node-red).

Quand, dans ma fonction, je mets "return msg.payload.coord;", ça me renvoir bien un JSON avec les valeurs des coordonnées.

Par contre, quand je mets "return msg.payload.coord.lon;" (pour n'avoir que la longitude), j'ai une belle erreur : TypeError: Cannot assign to read only property '_msgid' of -0.13 (oui, oui ... -0.13 est la valeur que je cherche à avoir !!)

Merci pour ton aide

3. Le , 22:44 par ltoinel
9ab09dd3e305f924f8930e20e1a35843

Le titre est aguicheur, c'est en 5 clics, le reste ce sont des commandes unis ;-)

Pour le debug du msg.payload le mieux est d'utiliser le noeud de debug et d'activer l'option object sur ce noeud.

4. Le , 15:25 par Willou
a29b0c21f5302ce28e5d45f42d0922af

Tu recommandes un modem 3G en particulier ?

5. Le , 21:12 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

@Willou : En parcourant plusieurs sites Internet, j'ai cru comprendre que Huawei est un classique ! Mon modèle, le E220 n'est cependant plus commercialisé.

6. Le , 10:43 par fotopaca
8d47324c2826767027c723d2557c763c

Je suis de prés tout ce qui touche aux forfaits gsm...je pense que le jour ou tu te sers d'une puce Free pour faire du mailing sms...dommage ! il est prévu une restriction la dessus, donc même si on ne trouve pas l'info, au mieux ils te bloquent la puce, au pire, ils te font un bon prélèvement sur compte bancaire ! en tout cas je pense...si qqn a déjà fait su sms mailing, qu'ils nous donne son retour d’expérience.

7. Le , 18:57 par sultan87
38231f43edf575a9bbcd2fa85849afec

bonsoir
Merci pour le tuto
j'essaye en vain de créer un flow pour détecter la réception de nouveaux SMS
je ne sais pas comment faire
pouvez m'aider en m'envoyant un exemple (import) qui me servira de base pour d'autres flows
cordialement
pierre chevalier

8. Le , 18:23 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

Bonjour,

Le voici :

[{"id":"a1fcaa86.5e0358","type":"watch","name":"SMS Inbox","files":"/var/spool/gammu/inbox","x":96,"y":170,"z":"ee7214e7.118de8","wires":[["4ce086f6.b31f78"]]},{"id":"dd3e6af1.22c198","type":"file in","name":"SMS Content","filename":"","format":"utf8","x":472,"y":169,"z":"ee7214e7.118de8","wires":[["e5779ac9.1a8868"]]},{"id":"4ce086f6.b31f78","type":"change","name":"","rules":[{"t":"set","p":"filename","to":"msg.payload"}],"action":"","property":"","from":"","to":"","reg":false,"x":276,"y":170,"z":"ee7214e7.118de8","wires":[["dd3e6af1.22c198"]]},{"id":"e5779ac9.1a8868","type":"function","name":"","func":"msg.phone = msg.filename.match(/(\\+[0-9]*)/)[1];\ndelete msg.filename;\ndelete msg.topic;\ndelete msg.file;\ndelete msg.type;\nreturn msg;","outputs":1,"noerr":0,"x":664,"y":169,"z":"ee7214e7.118de8","wires":[["c3e15cc0.3c1ea"]]},{"id":"c3e15cc0.3c1ea","type":"debug","name":"","active":true,"console":"false","complete":"true","x":827,"y":169,"z":"ee7214e7.118de8","wires":[]}]

Il faut faire attention à ce que l'utilisateur Node-Red puisse accéder au répertoire de stockage des SMS géré par Gammu

9. Le , 18:09 par sultan87
38231f43edf575a9bbcd2fa85849afec

Bonsoir
merci pour votre exemple
j'ai bien compris le fonctionnement de la réception d'un message
je viens de compléter par l'analyse du contenu
je voudrais suite à l'analyse exécuter une commande par exemple
sudo /home/pi/3g/sakis3g connect
et renvoyé un message

pouvez vous me donner un exemple ?

comment sauvegarder le workspace ?

cordialement

pierre chevalier

10. Le , 00:09 par Ludovic
9ab09dd3e305f924f8930e20e1a35843

Bonjour,

Pour cela il faut ajouter des neuds "Exec" après la réception du message.

11. Le , 10:01 par sultan87
38231f43edf575a9bbcd2fa85849afec

bonjour
merci pour la réponse
ok pour exécuter une commande
comment faire pour répondre (envoyer un sms) au numéro appelant ?
j'ai bien compris la façon de construire un flow, de le déployer et de faire les tests en mode debug.
comment sont sauvegardés et où, les flows ?
j'ai fait un export dans la library
mais quand j'ouvre à nouveau http://mon ip :1880 et que je veux faire un import à partir de la library, je ne retrouve pas ce que j'avais exporté.
cordialement
pierre chevalier

12. Le , 12:14 par sultan87
38231f43edf575a9bbcd2fa85849afec

Bonjour,
j'ai réussi à créer un flow qui interprète les sms entrant, qui exécute des commandes et renvoi un sms de confirmation.
voici le contenu
[{"id":"5ebe90e7.2adc4","type":"watch","z":"653769ec.2715a8","name":"SMS Inbox"$
Est ce bien optimisé?
si je veux faire un autre flow pour interpréter d'autres types de sms, comment faut il faire?
peut on sécuriser les sms entrants avec je pense à si c'est possible des sms interactifs ou autres solutions?
cordialement
Pierre Chevalier

13. Le , 12:21 par sultan87
38231f43edf575a9bbcd2fa85849afec

Bonjour,
le contenu de mon flow ne s'est pas affiché correctement, le voici
[{"id":"5ebe90e7.2adc4","type":"watch","z":"653769ec.2715a8","name":"SMS Inbox","files":"/var/spool/gammu/inbox","x":113,"y":71,"wires":[["6c416340.5d1be4"]]},{"id":"593e9c75.7ff094","type":"file in","z":"653769ec.2715a8","name":"SMS Content","filename":"","format":"utf8","x":489,"y":70,"wires":[["97318053.49b1"]]},{"id":"6c416340.5d1be4","type":"change","z":"653769ec.2715a8","name":"","rules":[{"t":"set","p":"filename","to":"msg.payload"}],"action":"","property":"","from":"","to":"","reg":false,"x":293,"y":71,"wires":[["593e9c75.7ff094"]]},{"id":"97318053.49b1","type":"switch","z":"653769ec.2715a8","name":"Test SMS","property":"payload","rules":[{"t":"regex","v":"box3g-start","case":true},{"t":"regex","v":"box3g-stop","case":true},{"t":"regex","v":"therm","case":true},{"t":"regex","v":"temp","case":true},{"t":"else"}],"checkall":"true","outputs":5,"x":97,"y":245,"wires":[["fafe68ff.d986c8"],["50c2f740.919348"],["2d11871c.847328"],["4f62820.7206a8"],["8c5578be.c7744"]]},{"id":"fafe68ff.d986c8","type":"exec","z":"653769ec.2715a8","command":"box3g start","addpay":false,"append":"","useSpawn":"","name":"Démarrage de la box 3g","x":312,"y":156,"wires":[["13b944b9.0e4313"],[],[]]},{"id":"50c2f740.919348","type":"exec","z":"653769ec.2715a8","command":"box3g stop","addpay":false,"append":"","useSpawn":"","name":"Arrêt de la box 3g","x":321,"y":239,"wires":[["49cef82f.a13ad"],[],[]]},{"id":"43da8d73.237d4c","type":"exec","z":"653769ec.2715a8","command":"envoi-sms ","addpay":true,"append":"","useSpawn":"","name":"Box 3g arretée","x":719,"y":237,"wires":[[],[],[]]},{"id":"2d11871c.847328","type":"function","z":"653769ec.2715a8","name":"Thermostat","func":"msg.phone = msg.filename.match(/(\\+[0-9]*)/)[1];\ndelete msg.filename;\ndelete msg.topic;\ndelete msg.file;\ndelete msg.type;\nmsg.payload = \"'\" + msg.phone + \"' '\" + \"Vous avez demandé la Gestion du thermostat'\"\nreturn msg;","outputs":1,"noerr":0,"x":373,"y":365,"wires":[["7e0cca0e.2d5ce4"]]},{"id":"4f62820.7206a8","type":"function","z":"653769ec.2715a8","name":"Température","func":"msg.phone = msg.filename.match(/(\\+[0-9]*)/)[1];\ndelete msg.filename;\ndelete msg.topic;\ndelete msg.file;\ndelete msg.type;\nmsg.payload = \"'\" + msg.phone + \"' '\" + \"Vous avez demandé l'affichage de la température'\"\nreturn msg;","outputs":1,"noerr":0,"x":375,"y":428,"wires":[["7e0cca0e.2d5ce4"]]},{"id":"8c5578be.c7744","type":"function","z":"653769ec.2715a8","name":"Commande inconnue","func":"msg.payload = \"Commande inconnue --> \" + msg.payload + \"(box3g-start, box3g stop, therm, temp)\"\nreturn msg;","outputs":1,"noerr":0,"x":394,"y":489,"wires":[["7e0cca0e.2d5ce4"]]},{"id":"632b022e.f7dccc","type":"exec","z":"653769ec.2715a8","command":"envoi-sms","addpay":true,"append":"","useSpawn":"","name":"La Box3g est démarrée","x":749,"y":157,"wires":[[],[],[]]},{"id":"13b944b9.0e4313","type":"function","z":"653769ec.2715a8","name":"","func":"msg.phone = msg.filename.match(/(\\+[0-9]*)/)[1];\ndelete msg.filename;\ndelete msg.topic;\ndelete msg.file;\ndelete msg.type;\nmsg.payload = \"'\" + msg.phone + \"' '\" + \"La Box3g est démarrée'\"\nreturn msg;","outputs":1,"noerr":0,"x":538,"y":154,"wires":[["632b022e.f7dccc"]]},{"id":"49cef82f.a13ad","type":"function","z":"653769ec.2715a8","name":"","func":"msg.phone = msg.filename.match(/(\\+[0-9]*)/)[1];\ndelete msg.filename;\ndelete msg.topic;\ndelete msg.file;\ndelete msg.type;\nmsg.payload = \"'\" + msg.phone + \"' '\" + \"La Box3g est arretée'\"\nreturn msg;","outputs":1,"noerr":0,"x":531,"y":241,"wires":[["43da8d73.237d4c"]]},{"id":"7e0cca0e.2d5ce4","type":"exec","z":"653769ec.2715a8","command":"envoi-sms ","addpay":true,"append":"","useSpawn":"","name":"Commande OK","x":622,"y":389,"wires":[[],[],[]]}]
cordialement
Pierre chevalier

14. Le , 21:30 par 38domo
e237aefd1c5a945a852602ab54c18b53

Bonsoir,
le flow pour envoyer un sms n'est pas tres clair a mes yeux. pouvez-vous envoyer le flow complet ?
cdlt

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.