
Sommaire
Introduction
Aujourd’hui je vous propose de communiquer par SMS avec Domoticz via un modem USB 3G. D’autres tutoriaux existent, utilisant un téléphone comme passerelle. Ici, nul besoin d’un téléphone. En revanche nous allons utiliser un modem USB 3G, qui aura l’avantage de servir exclusivement aux échanges SMS.
Le gros avantage du SMS par rapport aux autres notifications, c’est que cela ne dépend pas de la connexion internet. Ainsi, même si votre box internet tombe en panne, Domoticz sera toujours en mesure de communiquer.
Voici les pré-requis:
- Avoir Domoticz installé sur une distribution Linux. Dans mon cas il tourne sur un Raspberry Pi 3.
- Avoir un modem USB. J’utilise un Huawei E220. Il date un peu, mais en principe n’importe quel modem USB 3G devrait faire l’affaire.
- Avoir une carte SIM dédiée à cet usage.
Voici à quoi ressemble le Huawei E220:
Installation
Il faut donc dans un premier temps insérer la carte SIM dans le modem, puis connecter celui-ci en USB sur la machine hébergeant Domoticz. Ceci n’est pas obligatoire, le modem pourrait très bien être sur une autre machine, mais c’est plus simple à réaliser.
Nous allons ensuite passer par des commandes Linux, afin d’utiliser ce modem et l’interfacer avec Domoticz.
La commande dmesg
devrait vous retourner le port sur lequel est branché le modem, du type ttyUSB0
, ttyUSB1
…
Le problème, c’est qu’au redémarrage, le port peut changer. Nous allons devoir utiliser un périphérique USB persistant.
Taper la commande suivante:
sudo lsusb -v | more
Noter les paramètres suivants:
*idVendor *idProduct *iSerial (si c'est 0, vous pouvez l'ignorer)
Par exemple, pour le Huawei E220, nous avons:
idVendor 0x12d1 Huawei Technologies Co., Ltd. idProduct 0x1003 E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem iSerial 0
Ensuite créer (ou modifier s’il existe) le fichier /etc/udev/rules.d/99-usb-serial.rules
:
sudo nano /etc/udev/rules.d/99-usb-serial.rules
Ajouter la ligne suivante:
SUBSYSTEM== »tty », ATTRS{idVendor}== »12d1″, ATTRS{idProduct}== »1003″, SYMLINK+= »ttyUSB31″
En prenant soin évidemment de remplacer le valeurs par celles retournées par la commande précédente.
Ensuite redémarrer le système! Sous Linux:
sudo shutdown -r now
Maintenant, le modem sera toujours sur le port USB /dev/ttyUSB31.
Envoyer des SMS
Pour envoyer et recevoir des SMS, nous utiliserons Gammu. Ce logiciel permet d’envoyer des SMS, et de déclencher des scripts lors de la réception de SMS.
Connectez-vous dessus avec un terminal et mettez à jour la liste des paquets. Ensuite installez gammu et gammu-smsd:
sudo apt-get update sudo apt-get -y install gammu gammu-smsd
Il faut ensuite indiquer à Gammu quel port USB utiliser en éditant le fichier /etc/gammu-smsdrc
:
[gammu] #Please configure this! port = /dev/ttyUSB31 connection = at # Debugging #logformat = textall
Si vous n’avez pas désactivé le code PIN, vous devrez rajouter la ligne suivante :
pin = XXXX
Il faut bien entendu démarrer le service pour la prise en compte des paramètres modifiés :
sudo service gammu-smsd start
Vous pouvez maintenant tester l’envoi de SMS avec la commande :
sudo -u gammu gammu-smsd-inject TEXT 06xxxxxxxx -text « MESSAGE »
En remplaçant « MESSAGE » par le message de votre choix.
Si cela ne fonctionne pas, vérifiez que l’utilisateur linux sous lequel vous êtes peut faire un « sudo -u gammu ».
Pour tester l’envoi d’un SMS depuis Domoticz, vous pouvez mettre ceci dans un script LUA:
os.execute ('sudo -u gammu gammu-smsd-inject TEXT "+336xxxxxxxx" -text "TEST"')
Recevoir des SMS
Voilà, Domoticz sait vous envoyer des SMS. Passons maintenant à la réception des SMS. Pour cela il faut revenir au fichier /etc/gammu-smsdrc
. A la fin du fichier, placer:
runonreceive = /root/gammu/receivesms.py
Puis relancer gammu:
sudo /etc/init.d/gammu-smsd restart
Ce fichier sera exécuté à chaque réception de SMS, avec 2 variables:
$SMS_1_NUMBER -- c'est le numéro de l'expéditeur $SMS_1_TEXT -- c'est le contenu du message
Avant tout, dans Domoticz, créer une variable « sms » de type « chaîne » et noter son index.
Voici un exemple de fichier receivesms.py
:
!/usr/bin/python import os import sys import urllib #Mise a jour dans Domoticz DOMO_IP="127.0.0.1" # Addresse IP de Domoticz DOMO_PORT="8080" # Port de Domoticz IDX="11" # Index de la variable "sms" urllib.urlopen("http://"+DOMO_IP+":"+DOMO_PORT+"/json.htm?type=command¶m=updateuservariable&idx="+IDX+"&vname=sms&vtype=2&vvalue="+urllib.quote(os.environ['SMS_1_TEXT'])+";"+urllib.quote(os.environ['SMS_1_NUMBER']))
Explications: à chaque réception de sms, le script va mettre à jour une variable « sms » dans Domoticz. Ensuite nous créerons un script qui réagira au changement de cette variable.
Note: il faut rendre le fichier receivesms.py
exécutable:
sudo chmod +x /root/gammu/receivesms.py
Je vous invite à lire cette page qui vous donnera un exemple de script LUA pour la réception de sms et l’interaction avec Domoticz.
Voici un exemple simplifié:
-- script_variable_sms.lua -- -- un smartphone connecté au réseau wifi de la maison -- avec l'application 'sms gateway ultimate' installée -- https://play.google.com/store/apps/details?id=com.icecoldapps.smsgatewayultimate -- -- dès qu'un sms est reçu, l'application met à jour une variable utilisateur nommée 'sms' via la requette json suivante -- http://USER:PASS@IP:PORT/json.htm?type=command¶m=updateuservariable&idx=IDX&vname=sms&vtype=2&vvalue=%body%;%from% -- -- dès que la variable 'sms' est modifiée, ce script est exécuté. -- suivant une correspondance avec l'un des messages de la liste ci dessous, -- si la personne y est autorisée, -- l'action associée est lancée -- -- un message de réponse est retourné -- -- la commande 'Help' retourne un SMS contenant la liste -- -------------------------------- ------ Tableau à éditer ------ -------------------------------- -- liste des messages à comprendre et leurs actions associées local liste={} --liste['message'] = "action" liste['Help'] = [[ reponse = 'Je comprend: '..sendAll() ]] -- ne pas toucher cette ligne liste['Ping'] = [[ reponse = 'Pong!' ]] -- liste des utilisateurs autorisés local user={} user['Toto'] = '+336xxxxxxxx' user['Tata'] = '+336yyyyyyyy' -- réponses par défaut local good = 'Ok..' -- réponse en cas de commande correcte local notGood = 'Je ne comprends pas, essayez \'Help\'' -- réponse en cas de commande non comprise local guess = 'Je ne vous connais pas !' -- réponse aux utilisateurs non autorisés -------------------------------- -- Fin du tableau à éditer -- -------------------------------- function spairs(t) local keys = {} for k in pairs(t) do keys[#keys+1] = k end table.sort(keys) local i = 0 return function() i = i + 1 if keys[i] then return keys[i], t[keys[i]] end end end function url_encode(str) if (str) then str = string.gsub (str, "\n", "\r\n") str = string.gsub (str, "([^%w %-%_%.%~])", function (c) return string.format ("%%%02X", string.byte(c)) end) str = string.gsub (str, " ", "+") end return str end function sendAll() for message, action in spairs(liste) do if message ~= 'Help' then if rst == nil then rst = message else rst = rst..'\n'..message end end end return rst end commandArray = {} if(uservariablechanged['sms']) then sms,from = uservariables['sms']:match("([^;]+);([^;]+)") local msg = "print('SMS reçu du N° '..from..' : \"'..sms..'\"')" for name, number in pairs(user) do reponse = guess if number == from then print('SMS reçu de '..name..' : \"'..sms..'\"') reponse = notGood msg = "print('SMS, commande invalide')" for message, action in pairs(liste) do if sms == message then reponse = good msg = "print('SMS, commande correcte')" load(action)() break end end break end end load(msg)() print('SMS : reponse -> '..reponse) os.execute ('sudo -u gammu gammu-smsd-inject TEXT "'..from..'" -text "'..reponse..'"') end return commandArray
Grâce à ce script, lorsque la variable « sms » sera mise à jour, Domoticz saura la lire et répondre en conséquence, s’il connaît le numéro ou non.
Et voilà, vous avez un Domoticz qui sait envoyer et recevoir des SMS!
Recevoir toutes les notifications de Domoticz par SMS
Si vous voulez recevoir toutes les notifications de Domoticz par SMS, rien de plus simple!
Je vous propose un exemple de script qui peut être appelé par Domoticz pour envoyer un SMS:
#!/usr/bin/python import sys import os import datetime now = datetime.datetime.now() text = "["+now.strftime("%d/%m/%Y @ %H:%M")+"] "+sys.argv[1] phone_numbers = ["+336xxxxxxxx"],["+336yyyyyyyy"] for number in phone_numbers: command = "sudo -u gammu gammu-smsd-inject TEXT "+number+" -text \""+text+"\"" os.system(command)
Dans Domoticz, allez dans Réglages, Paramètres, puis sur l’onglet Notifications.
Dans la partie « HTTP personnalisé/Action », cochez « Activé » et renseignez le script sendsms.py dans « URL/Action »:
Sauvegardez, et Domoticz vous enverra toutes les notifications par SMS!
Reset du modem
Dernier point: comme je l’ai dit plus haut, cela devrait fonctionner avec n’importe quel modem USB. Ceci dit, je n’ai testé qu’avec le Huawei E220. Avec ce modem, j’ai rencontré quelques difficultés au début. En effet, au bout de quelques jours, il perdait la connexion, m’obligeant à le débrancher puis le rebrancher physiquement pour le réinitialiser (un redémarrage du système ne solutionnait pas le problème). J’ai trouvé une autre solution par un script de réinitialisation que je lance chaque nuit. Cela fonctionne pour ce modem, je ne sais pas si c’est utile et si ça fonctionne pour d’autres.
Tout d’abord, il faut installer minicom:
sudo apt-get install minicom
Ensuite créer un script pour minicom qui va envoyer les commandes de réinitialisation au modem. Je l’ai appelé modem_reset.minicom :
send AT+CFUN=0 sleep 3 send AT+CFUN=0 sleep 3 send AT+CFUN=1 sleep 3 ! killall -9 minicom
Puis créer un script shell qui va appeler ce script, en prenant soin de stopper puis relancer gammu-smsd. Je l’ai appelé modem_reset:
#!/bin/bash TERM=vt100 export TERM sudo /etc/init.d/gammu-smsd stop sleep 5 /usr/bin/minicom -D /dev/ttyUSB31 -S /root/modem_reset.minicom sleep 5 sudo /etc/init.d/gammu-smsd start
Ne pas oublier de rendre ce script exécutable:
chmod +x modem_reset
Enfin mettre un cron qui va lancer cette tâches toutes les nuits, par exemple à 4h25 du matin (sudo crontab -e
):
25 4 * * * /root/modem_reset > /root/modem_reset.log
Explications:
Ce script va arrêter gammu-smsd (qui prend le contrôle exclusif du modem), envoyer au modem des commandes de réinitialisation, puis relancer gammu-smsd.
Merci pour ce tuto, malheuresement blocage pour moi à l’envoi de sms.
Ce que j’ai réussi : désimlocker mon modem Huawei E5832 Orange (envoi de sms réussi via l’interface d’administration)
Enlever code pin de ma carte, avec (j’ai rajouté et pas de message) et sans ne change rien.
J’ai ceci et pas de sms :
pi@raspberrypi:~ $ sudo -u gammu gammu-smsd-inject TEXT 06xxxxxxxx -text « Gateway »
gammu-smsd-inject[1705]: Warning: No PIN code in /etc/gammu-smsdrc file
gammu-smsd-inject[1705]: Created outbox message OUTC20170412_161614_00_0663584169_sms0.smsbackup
Written message with ID /var/spool/gammu/outbox/OUTC20170412_161614_00_0663584169_sms0.smsbackup
Une idée ?
tu as bien remplacer : 06xxxxxxxx par ton numero ?
Oui j’ai mis mon numero à la place : 06XXXXXXXX et aussi avec +336XXXXXXXX
Le message « Warning: No PIN code in /etc/gammu-smsdrc file » n’est pas grave. Il indique juste que tu n’as pas spécifié de code PIN dans le fichier de paramètres, ce qui est normal si tu as désactivé le code PIN de la carte SIM. C’est ce que j’ai fait aussi, et j’ai moi aussi ce message. En revanche, tu dois avoir un problème autre part. Il faudrait regarder ce qui se passe dans /var/log/syslog lorsque tu envoies un SMS.
Merci de l’aide
J’ai regardé dans /var/log/syslog
J’ai ceci :
Apr 12 18:56:41 raspberrypi gammu-smsd[455]: Starting phone communication…
Apr 12 18:56:41 raspberrypi gammu-smsd[455]: Error at init connection: Error opening device, it doesn’t exist. (DEVICENOTEXIST[4])
Apr 12 18:56:41 raspberrypi gammu-smsd[455]: Going to 30 seconds sleep because of too much connection errors
Apr 12 18:56:41 raspberrypi rsyslogd-2007: action ‘action 17’ suspended, next retry is Wed Apr 12 18:58:11 2017 [try http://www.rsyslog.com/e/2007 ]
Je pense à un problème de driver !Je fais mes essais sous raspberry, quand j’aurais un autre moment j’essayerais sous mon ubuntu.
Bonjour,
J’utilise Domoticz et j’en suis pleinement satisfait.
J’arrive à piloter ma maison par « SMS » (chauffage et volets) .
J’y suis arrivé grâce au partage généreux de Vil1driver.
Le principe est celui que vous décrivez, par la modification d’une variable, un script lua se déclenche.
Actuellement j’arrive à modifier la variable « sms » en idx « 1 » via un tel Android en utilisant SMS gateway =
« http://USER:PASS@IP:PORT/json.htm?type=command¶m=updateuservariable&idx=IDX&vname=sms&vtype=2&vvalue=%body%;%from% ».
Mon Rp3 est équipé du même modem que le votre et je m’en sers comme serveur sms via Raspisms.
gammu et gammu-smsd sont installés et fonctionnels.
Je voudrais faire évoluer mon installation pour ne plus dépendre du tel Android.
J’ai suivi vous instruction mais il y a un « truc » que je ne comprend pas c’est comment $SMS_1_NUMBER et $SMS_1_TEXT sont maj à chaque réception de sms.
J’ai suivi vos explications mais ma variable sms en idx 1 dans domoticz ne change pas.
Pour info la structure de la réception de gammu est /var/spool/gammu/inbox,
A chaque réception de sms j’ai un fichier qui se créer de la façon suivante :
INAAAMMJJ_HHMMSS_00_+33xxxxxxx donc cela me donne
IN20170526_104732_00_+33xxxxxxxx_00
et dans le « corps » du fichier j’ai bien le message envoyé.
Dans le répertoire « root » je n’avais pas de sous répertoire « Gammu », je l’ai créé en y plaçant le fichier Python.
Avez-vous une idée du pb.
Merci et bravo pour le travail et ce blog.
Lebsana.
Bonjour,
« J’ai suivi vous instruction mais il y a un « truc » que je ne comprend pas c’est comment $SMS_1_NUMBER et $SMS_1_TEXT sont maj à chaque réception de sms. »
C’est simple, chaque fois que Gammu reçoit un SMS, il appelle le script configuré et place dans les variables d’environnement le numéro ainsi que le contenu du message.
Dans le script, os.environ[‘SMS_1_TEXT’] fait appelle à la variable d’environnement qui contient le message. Idem pour os.environ[‘SMS_1_NUMBER’] qui contient le numéro de l’expéditeur.
Me-revoici,
C’est bon j’ai trouvé une autre méthode.
Sur mon Raspberry j’y avais déjà installé un serveur sms (Raspisms).
J’ai modifié le script parseSMS.sh de RaspiSMS et ça marche.
Pour info voici les modif’s, que j’ai réalisé (je ne maitrise pas du tout les differents langages en informatique..)
#!/bin/sh
# Script a placer dans /var/www/html/RaspiSMS parseSMS.sh
date=$(date +%Y%m%d%H%M%S%N)
first_time=1
for i in `seq $SMS_MESSAGES` ; do
eval « sms_number=\ »\${SMS_${i}_NUMBER}\ » »
eval « sms_text=\ »\${SMS_${i}_TEXT}\ » »
if [ $first_time -eq 1 ]
then
sms= »$sms_number: »
first_time=0
fi
sms= »$sms$sms_text »
done
echo « $sms » >> /var/www/html/RaspiSMS/receiveds/ »$date ».txt
# Partie modifiée par moi-même
# renseigne repertoire où le fichier à traiter se trouve
cd /var/spool/gammu/inbox
# Extraction du numéro de tel du dernier fichier créé et stockage de celui-ci dans la variable numero
numero=$(ls -t | grep \.txt$ | head -1| awk ‘BEGIN{FS= »_ »} {print $4}’)
# renseigne le nom du dernier fichier créé pour extraire le contenu
text=$(ls -t | grep \.txt$ | head -1)
# Recuperation du contenu dans la variable sms
sms1=$(cat $text)
# Envoi dans domoticz le sms et le numero à la variable smsnew
# Raspisms renvoie un accusé de reception, dans ce cas je ne l’envoie pas à domoticz
if [ $sms1 = « Delivered » ]
then
echo « »
else curl « http://192.168.1.4:8080/json.htm?type=command¶m=updateuservariable&idx=14&vname=smsnew&vtype=2&vvalue=$sms1;$numero »
fi
Merci pour votre réponse.
Lebsana.
Hello,
I hope that you speak english 🙂
I found this tutorial very useful but I can only send SMS, when I receive SMS this is the result:
Sun 2017/11/19 03:08:25 gammu-smsd[4254]: Process failed with exit status 2
Sun 2017/11/19 03:10:53 gammu-smsd[4254]: Read 1 messages
Sun 2017/11/19 03:10:53 gammu-smsd[4254]: Received IN20171119_031050_00_+39yyyyy_00.txt
Sun 2017/11/19 03:10:53 gammu-smsd[4547]: Starting run on receive: /home/pi/domoticz/scripts/python/receivesms/receivesms.py IN20171119_031050_00_+39yyyy_00.txt
Sun 2017/11/19 03:10:53 gammu-smsd[4254]: Process failed with exit status 2
4 -rwxr-xr-x 1 root root 134 Nov 18 23:02 echosms.sh
4 -rwxrwxrwx 1 gammu gammu 427 Nov 18 22:10 receivesms.py
4 -rwxrwxrwx 1 gammu gammu 169 Nov 19 03:29 test.sh
I tried different scripts but I have the same problem, maybe there is a permission problem, do you run the gammu-smsd process as « root » user?
thanks
Bonjour,
Le principe à l’air sympa mais le tuto a besoin d’être rafraîchis.
En effet les ligne de commande à taper sont devenues des « [crayon-5dde822a797d4388486698-i/] par exemple.
Merci par avance