Node-RED - Envoie de SMS
Textos, Textos, qui veut mes Textos ?
Nous avons, dans un précédent article, installé et configuré un serveur (passerelle) SMS : sms3tools. Utilisons Node-RED pour envoyer un SMS via le dashboard à une tierce personne.
Objectif:
- Créer un dashboard avec le formulaire suivant:
- Téléphone (destinataire)
- Message à envoyer
- SUBMIT CANCEL
- Créer le flow ; la réponse à l’algorithme suivant:
- Récupérer les informations téléphone + texte à envoyer
- Envoyer l’objet json à NODE-RED
{ "payload":"Ceci est le message", "topic":"33612345678", "_msgid":"6eb2943f.7ab59c" }
- Envoyer le SMS au destinataire
Prérequis
- Une plateforme avec Node-RED installé
- smstools3 installé
- Avoir installé le set de noeuds node-red-dashboard
- Avoir installé le set de noeuds node-red-contrib-smstools
Implémentation
Difficulté appréhendée
Lorsque l’on débute avec Node-RED, la manipulation d’un objet json, n’est pas forcemment simple. Ici nous sommes face à la difficultée suivante :
Objet retourné par le formulaire:
{
"payload":
{
"topic":"33612345678",
"payload":"Ceci est le message"
},
"socketid":"Blz2Pm_yeZQp5YwOAAAB",
"_msgid":"3d93fb0b.857094"
}
Soit un objet de 3 propriétés, dont la première (payload), est, elle même, un objet de deux propriétés : payload et topic.
Objet attendu par le noeud sms out:
{
"payload":"Ceci est le message",
"topic":"33612345678",
"_msgid":"3d93fb0b.857094"
}
Solution implémentée
Après moults tergiversations, le noeud “function” semble le plus approprié, pour manipuler et transformer les données, fonction de la cible (objet) attendue.
Voici le flux complet proposé:
Explications:
- Le premier noeud form, crée le formulaire sur le dashboard
- Le second noeud change retire la propriété : socketid
- Le noeud function extrait les valeures msg.payload.payload et msg.payload.topic, pour les réaffecter sur deux propriétés distinctes dans la réécriture du nouveau message
- Le noeud debug permet de vérifier le résultat en sortie
- Le noeud sms out permet de transmettre l’objet au daemon smstools3
Remarque la propriété _msgid n’est pas retirée, cet id, permet une tracabilitée dans la chaine de traitement. Ne vaut-il pas mieux garder cette propriété de bout en bout ?
Code de la fonction 2to1:
var payload=msg.payload.payload
var topic=msg.payload.topic
msg.payload=payload
msg.topic=topic
return msg;
Code complet du flow:
[{"id":"754604fc.a77ec4","type":"sms-out","z":"602114bc.b2e564","name":"@téléphone","topic":"","x":720,"y":220,"wires":[]},{"id":"ec87386c.d9a0e8","type":"ui_form","z":"602114bc.b2e564","name":"","label":"","group":"ae419132.f7df58","order":2,"width":0,"height":0,"options":[{"label":"Telephone","value":"topic","type":"text","required":true,"rows":null},{"label":"SMS","value":"payload","type":"text","required":true,"rows":null}],"formValue":{"topic":"","payload":""},"payload":"","submit":"submit","cancel":"cancel","topic":"","x":130,"y":160,"wires":[["f46f0597.38f7c8"]]},{"id":"70e9d2b7.7859c4","type":"debug","z":"602114bc.b2e564","name":"SMS - Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":720,"y":160,"wires":[]},{"id":"7f9646e7.83431","type":"function","z":"602114bc.b2e564","name":"2to1","func":"var payload=msg.payload.payload\nvar topic=msg.payload.topic\nmsg.payload=payload\nmsg.topic=topic\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":160,"wires":[["70e9d2b7.7859c4","754604fc.a77ec4"]]},{"id":"f46f0597.38f7c8","type":"change","z":"602114bc.b2e564","name":"","rules":[{"t":"delete","p":"socketid","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":320,"y":160,"wires":[["7f9646e7.83431"]]},{"id":"ae419132.f7df58","type":"ui_group","z":"","name":"Form","tab":"4b84c940.7f1fe8","order":1,"disp":true,"width":"6","collapse":false},{"id":"4b84c940.7f1fe8","type":"ui_tab","z":"","name":"SMS","icon":"dashboard","disabled":false,"hidden":false}]
le dashboard obtenu: