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:

Par exemple, pour le Huawei E220, nous avons:

 

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:

Il faut ensuite indiquer à Gammu quel port USB utiliser en éditant le fichier /etc/gammu-smsdrc :

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:

 

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:

Avant tout, dans Domoticz, créer une variable « sms » de type « chaîne » et noter son index.

Voici un exemple de fichier receivesms.py:

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

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:

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 :

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:

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.

14 Replies to “Communiquer par SMS avec Domoticz via un modem USB 3G”

  1. 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 ?

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

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

             
  2. 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&param=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.

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

       
      1. 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&param=updateuservariable&idx=14&vname=smsnew&vtype=2&vvalue=$sms1;$numero »
        fi
        Merci pour votre réponse.

        Lebsana.

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

     

Laisser un commentaire