Ldfa Posté(e) le 30 décembre 2019 Partager Posté(e) le 30 décembre 2019 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: 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 sudo lsusb -v | more Noter les paramètres suivants: *idVendor *idProduct *iSerial (si c'est 0, vous pouvez l'ignorer) *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 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 sudo nano /etc/udev/rules.d/99-usb-serial.rules Ajouter la ligne suivante: SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", SYMLINK+="ttyUSB31" 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 sudo shutdown -r now Maintenant, le modem sera toujours sur le port USB /dev/ttyUSB31. 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 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 [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 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 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" sudo -u gammu gammu-smsd-inject TEXT 06xxxxxxxx -text "MESSAGE" En remplaçant « MESSAGE » par le message de votre choix. 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"] for number in phone_numbers: command = "sudo -u gammu gammu-smsd-inject TEXT "+number+" -text \""+text+"\"" os.system(command) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/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"] for number in phone_numbers: command = "sudo -u gammu gammu-smsd-inject TEXT "+number+" -text \""+text+"\"" os.system(command) On peut appeler ce script via un script lua par exemple: os.execute('/home/pi/domoticz/scripts/sendsms.py "Test SMS"') os.execute('/home/pi/domoticz/scripts/sendsms.py "Test 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.sh runonreceive = /root/gammu/receivesms.sh Puis relancer gammu: sudo /etc/init.d/gammu-smsd restart 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 $SMS_1_NUMBER -- c'est le numéro de l'expéditeur $SMS_1_TEXT -- c'est le contenu du message Voici un exemple de fichier receivesms.sh: #!/bin/bash from=$SMS_1_NUMBER message=$SMS_1_TEXT if [[ $from == "+336xxxxxxxx" ]] then reply="" if [[ $message == *"Ping"* ]] then reply="Pong!" gammu-smsd-inject TEXT $from -text "$reply" > /dev/null elif [[ $message == "Check" ]] then /root/gammu/check_domoticz.py else reply="???" gammu-smsd-inject TEXT $from -text "$reply" > /dev/null fi else reply="Message de $from - $message" gammu-smsd-inject TEXT "+336xxxxxxxx" -text "$reply" > /dev/null fi #Fin exit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #!/bin/bash from=$SMS_1_NUMBER message=$SMS_1_TEXT if [[ $from == "+336xxxxxxxx" ]] then reply="" if [[ $message == *"Ping"* ]] then reply="Pong!" gammu-smsd-inject TEXT $from -text "$reply" > /dev/null elif [[ $message == "Check" ]] then /root/gammu/check_domoticz.py else reply="???" gammu-smsd-inject TEXT $from -text "$reply" > /dev/null fi else reply="Message de $from - $message" gammu-smsd-inject TEXT "+336xxxxxxxx" -text "$reply" > /dev/null fi #Fin exit 0 Explications: Si le message vient de mon numéro personnel (+336xxxxxxxx), alors: Si le message est « Ping », Gammu va me répondre « Pong » Si le message est « Check », on va exécuter le script /root/gammu/check_domoticz.py Si c’est un autre message, Gammu va me répondre « ??? » Si le message vient d’un autre numéro, Gammu me renvoie sur mon téléphone le contenu de ce message Note: il faut rendre le fichier receivesms.sh exécutable: sudo chmod +x /root/gammu/receivesms.sh sudo chmod +x /root/gammu/receivesms.sh Toujours dans cet exemple, voici le script /root/gammu/check_domoticz.py: #!/usr/bin/python import urllib2 import json import subprocess import shlex urllib2.urlopen("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=56&switchcmd=On") #!/usr/bin/python import urllib2 import json import subprocess import shlex urllib2.urlopen("http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=56&switchcmd=On") Là aussi il faut le rendre exécutable: sudo chmod +x /root/gammu/check_domoticz.sh sudo chmod +x /root/gammu/check_domoticz.sh Grâce à une commande json, le fait d’envoyer « Check » à mon système va déclencher un interrupteur virtuel dans Domoticz. Note: ici, l’index 56 correspond à un interrupteur virtuel appelé « Check Domoticz »: Ce qui donne: Et voici le résultat sur le téléphone: La suite est facultative, mais je vais terminer mon exemple afin de faire une chaîne complète. J’ai créé un script lua qui réagit à cet interrupteur: commandArray = {} -- Check Domoticz if (devicechanged['Check Domoticz'] == 'On') then os.execute('/home/pi/domoticz/scripts/sendsms.py "Domoticz fonctionne correctement"') end return commandArray commandArray = {} -- Check Domoticz if (devicechanged['Check Domoticz'] == 'On') then os.execute('/home/pi/domoticz/scripts/sendsms.py "Domoticz fonctionne correctement"') end return commandArray Ainsi, si j’envoie le SMS « Check » depuis mon téléphone, cela va actionner un interrupteur dans Domoticz, ce qui aura pour conséquence de me renvoyer le message « Domoticz fonctionne correctement ». Et voilà, vous avez un Domoticz qui sait envoyer et recevoir des SMS! Pas de problème, voici un script sendsms.py un peu plus avancé: #!/usr/bin/python import sys import os import datetime now = datetime.datetime.now() text = "["+now.strftime("%d/%m/%Y @ %H:%M")+"] "+sys.argv[1] if len(sys.argv) > 2: destfilter = sys.argv[2] else: destfilter = "0" if destfilter == "0": #Par défaut, destinataire n° 1 phone_numbers = ["+336xxxxxxxx"] elif destfilter == "1": #Destinataire n° 2 phone_numbers = ["+336yyyyyyyy"] elif destfilter == "2": #Destinataires n° 1 et 2 phone_numbers = ["+336xxxxxxxx","+336yyyyyyyy"] for number in phone_numbers: command = "sudo -u gammu gammu-smsd-inject TEXT "+number+" -text \""+text+"\"" os.system(command) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #!/usr/bin/python import sys import os import datetime now = datetime.datetime.now() text = "["+now.strftime("%d/%m/%Y @ %H:%M")+"] "+sys.argv[1] if len(sys.argv) > 2: destfilter = sys.argv[2] else: destfilter = "0" if destfilter == "0": #Par défaut, destinataire n° 1 phone_numbers = ["+336xxxxxxxx"] elif destfilter == "1": #Destinataire n° 2 phone_numbers = ["+336yyyyyyyy"] elif destfilter == "2": #Destinataires n° 1 et 2 phone_numbers = ["+336xxxxxxxx","+336yyyyyyyy"] for number in phone_numbers: command = "sudo -u gammu gammu-smsd-inject TEXT "+number+" -text \""+text+"\"" os.system(command) Ainsi, il suffit d’appeler le script avec un paramètre en plus pour définir quels seront les destinataires, par exemple: sendsms.py "On sonne dans la rue" 2 sendsms.py "On sonne dans la rue" 2 Dans ce cas, les 2 destinataires recevront le message. Et si on n’indique pas le « 2 », c’est le choix 0 qui sera pris par défaut. 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 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 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 #!/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 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 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. Partager : Afficher l’article complet Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.