Solution alternative au plugin SMS via Api Huawei et clé e8372

Bonjour,

Un retour d’expérience sur une solution alternative au plugin SMS.

Comme plusieurs personnes, j’avais une solution fonctionnelle depuis plusieurs années avec le plugin SMS, un abonnement Free mobile à 2€ et une clé Huawei e220. Depuis début octobre cette solution ne fonctionne plus (plus de 2G dans mon secteur).

J’ai cherché une solution sur la base d’un module USB GSM SIM800C (échec car il ne fait que de la 2G), puis sur la base d’une clé ASHATA Routeur (impossible d’avoir des ports USB exploitables sous RPI), puis d’une clé KSTE Routeur (envoi des SMS possible avec gammu-smsd mais pas de retour sur l’envoi donc envoi en continu du même SMS et pas de réception de SMS)…

J’ai tenté une autre piste : l’utilisation d’une clé HUAWEI e8372H-320 via son api qui peut être exploitée via la bibliothèque python huawei-modem-api-client (huawei-modem-api-client · PyPI). La solution doit être compatible avec d’autres clés Huawei (E5180, E8372, B315, B529s-23a, H122-373)

J’ai depuis dimanche une solution qui est fonctionnelle (envoi de SMS et réception de SMS exploités pour les interactions). Elle nécessite de mettre un peu les mains dans la machine, mais rien d’inaccessible. Je précise que je n’ai que quelques notions bash/python et autres. Il-y-a donc des choses peut-être pas très « propres » dans ce que j’ai fait.

Si quelqu’un est intéressé je peux détailler la marche à suivre, sachant qu’en cas de difficulté je risque de ne pas pouvoir vraiment aider au-delà de mes faibles connaissances.

5 « J'aime »

Bonjour,

Volontier, un tuto serait parfait

Bonjour,

ça serait top !!

Puis mettre un lien ici (je viens de le faire pour ton post) :

1 « J'aime »

Génial !
+1 très intéressé ici :wink:
Démon du plugin SMS en rade depuis Septembre chez moi :frowning:

Ton démon reste-t-il OK tout le temps depuis ?!
C’est le nerf de la guerre avec le plugin SMS…

J’avais réussi à l’époque à faire un tuto assez complexe pour faire fonctionner une Huawei e3372-153, qui a tourné comme une horloge depuis septembre dernier…

Je veux bien passer mon tour cette fois :stuck_out_tongue:

Je suis extrêmement intéressé par un tuto.
Quelles que soient tes connaissances sur ce sujet, elles sont déjà bien supérieur aux miennes.

1 « J'aime »

Je suis en déplacement pro, je détaillerai cela ce week-end.
Le script python tourne sous forme de démon et est toujours ok.

Super nouvelle, à ce weekend :+1:

Bonjour,

voici les éléments :

A - Principe :

Sous Jeedom, via le plugin script, un fichier contenant le message du SMS et le numéro de tel du destinataire est écrit dans un répertoire dédié sur le disque. Un script python vérifie régulièrement le contenu de ce répertoire. Si un fichier est présent sous le répertoire, un SMS est envoyé via la clé Huawei et le fichier est déplacé dans un autre répertoire. Le script python vérifie également la réception de SMS au niveau de la clé Huawei. Si un SMS est reçu venant du numéro autorisé, une interaction basée sur le contenu du message est envoyé à Jeedom ; les SMS reçus sont supprimés de la clé.

B - Mon installation

Elle est probablement un peu atypique car composée de 2 machines (une pour Jeedom et une pour la clé Huawei), mais je pense que cela n’a pas d’importance sur la solution proposée qui pourra être transposée facilement sur une seule machine.
Mon Jeedom est sur une VM Vmware et malheureusement la clé n’est pas reconnue ; je l’ai installée sur une VM Freebox et là elle est reconnue. J’ai également testé sur un RPI3B+ quelques jours et pas de pb.

C - Installation

Allons-y :

1 - Installation de la clé

1.1 - Brancher la clé sur la machine
Puis se connecter à l’interface d’administration de la clé selon le mode d’emploi et vérifier que tout est fonctionnel.
Si vous changez le mot de passe administrateur (ce qui est recommander), notez le, vous en aurez besoin dans le script python.

1.2 - Se connecter en SSH sur la machine recevant la clé Huawei.
Le travail se fera avec l’utilisateur « jeedom » sous son répertoire /home/jeedom, si vous choisissez un autre utilisateur certains éléments décrits ci-après seront à adapter.

1.3 - Identifier l’interface réseau créée par la clé afin de la configurer (Je crois me souvenir que sur RPI la configuration se fait toute seule) :

sudo dmesg

Identifier une ligne qui ressemble à ça :

Récupérer la référence de l’interface réseau : ici : enx824c1af6a789

1.4 - Vérifier qu’elle n’est pas déjà configurée :

ip a

Si elle apparait dans la liste, noter son adresse IP (a priori elle apparait toujours sous 192.168.8.100) et passer à l’étape 2 sinon étape suivante.

1.5 - Configurer cette interface réseau

sudo nano /etc/network/interfaces

Ajouter en fin de fichier les lignes suivantes en les adaptant au besoin avec la référence de votre interface réseau

allow-hotplug enx824c1af6a789
iface enx824c1af6a789 inet dhcp

Redémarrer

sudo reboot

Après redémarrage vérifier que l’interface est configurée

ip a

Si elle apparait dans la liste, noter son adresse IP (a priori : 192.168.8.100) et passer à l’étape 2 sinon je ne sais pas… mais d’autres membres du forum auront peut-être une piste.

2 - Script Python

2.1 - Intaller pip et les librairies nécessaires pour le script.
La librairie centrale est : huawei-modem-api-client : huawei-modem-api-client · PyPI

sudo apt install python3-pip
pip install huawei-modem-api-client
pip install daemonize

2.2 - Répertoires de fichiers SMS
Sous /home/jeedom créer les répertoires Outbox et Sentbox :

mkdir Outbox
mkdir Sentbox

2.3 - Le script lui-même
Créer le fichier SMS_Gestion.py

nano SMS_Gestion.py

Y coller le contenu suivant ci dessous en remplaçant les « X » par vos propres valeurs et sauvegarder :

#!/usr/bin/env python3
import glob
import huaweisms.api.user
import huaweisms.api.wlan
import huaweisms.api.sms
import sys
import os
import json
import requests
from time import sleep
from daemonize import Daemonize

pid = "/tmp/SMS_Huawei.pid"


def main():

    while True:
        ctx = huaweisms.api.user.quick_login("admin", "XXXX")

        # Réception des SMS
        SMSRecus = huaweisms.api.sms.get_sms(ctx)
        if (SMSRecus['response']['Count']) != '0':
                index = (SMSRecus['response']['Messages']['Message'][0]['Index'])
                SMSDelete = huaweisms.api.sms.delete_sms(ctx,index)

                numero = (SMSRecus['response']['Messages']['Message'][0]['Phone'])
                message = (SMSRecus['response']['Messages']['Message'][0]['Content'])

                if numero == "+33XXXXXXXXX":
                        reponse = requests.get('http://192.168.X.X/core/api/jeeApi.php?apikey=XXXX&type=interact&query='+message)
                        huaweisms.api.sms.send_sms(
                                ctx,
                                numero,
                                reponse.text
                                )

        # Envoi des SMS
        SMSaEnvoyer = []
        x = 0
        for NomFichier in glob.glob("/home/jeedom/Outbox/*.txt"):
                SMSaEnvoyer.append(NomFichier)
                x += 1

        if x >= 1:
                for fichier in SMSaEnvoyer:
                        file = open(fichier, 'r')
                        lines = file.readlines()
                        file.close()
                        numero = lines[1]
                        message = lines[0]
                        huaweisms.api.sms.send_sms(
                                ctx,
                                numero,
                                message
                        )
                        stream = os.popen('mv '+fichier+' /home/jeedom/Sentbox')
                        sleep(1)
                        
        huaweisms.api.user.logout(ctx)

        sleep(1)

daemon = Daemonize(app="/home/jeedom/SMS_Gestion.py", pid=pid, action=main)
daemon.start()

Plusieurs choses peuvent être adaptées comme l’attente entre chaque boucle de vérification, l’attente entre l’envoi de plusieurs SMS, la suppressions des SMS reçus etc…

2.4 - Rendre le script exécutable

chmod +x SMS_Gestion.py

2.5 - Lancer le script

./SMS_Gestion.py

2.6 - Exécuter le script au démarrage de la machine

Je le fais via Crontab

sudo nano /etc/crontab

à la fin du fichier ajouter et sauvegarder
@reboot jeedom /home/jeedom/./SMS_Gestion.py

3 - Coté Jeedom

3.1 - Créer via le plugin script un script nommé « SMS_Script_Huawei » (ne pas oublier de l’activer, de le rendre visible et d’éventuellement de l’associer à un objet parent)

3.2 - Dans ce script créer une commande script de type action message que vous pouvez nommer au nom du destinataire ex SMS_Test

3.3 - Dans cette commande créer un script « SMS_Test.sh » contant le code ci-dessous avec « XXXXXXXXXX » le numéro de téléphone destinataire du SMS :

sudo ssh jeedom@192.168.0.90 'echo -e '\"$1\"'"\nXXXXXXXXXX" > Outbox/$(date +%Y%m%d-%H%M%S)-XXXXXXXXXX.txt'

A noter que le début du code « sudo ssh jeedom@192.168.0.90 » est lié à ma configuration avec la clé déportée sur ma VM Freebox et pourra donc être simplifié si la clé et Jeedom sont sur une seule machine.

Toutefois la seconde partie du code devra alors être adaptée pour écrire le fichier au bon endroit (cf 2.2) et avec les droits utilisateurs adaptés. C’est à dire quelque chose comme cela :

echo "$1""\nXXXXXXXXXX" > /home/jeedom/Outbox/$(date +%Y%m%d-%H%M%S)-XXXXXXXXXX.txt

3.4 - ajouter "#message#" après le nom du script

3.5 - vérifier que cela fonctionne en tapant votre message depuis le widget du script.

Capture d'écran_20221125_231304

1 « J'aime »

Merci beaucoup pour ce tuto qui m’a l’air aux petits oignons, c’est vraiment sympa d’avoir partagé tout ça ! :clap:

Il n’y a que la simplification du point 3.3 où je ne suis pas certain d’avoir tout compris.
Mais déjà, il me faut rechercher une clé pour tester cela.

(Juste deux coquilles, une dans le titre du 1.2, tu as mis SHS au lieu de SSH et une dans le point 3.3 où il manque le n à configuration)

Merci, corrections apportées.

Pour ceux qui cherchent une clé Huawei E8372h-320, j’ai acheté celle-ci sans difficultés :
https://fr.shopping.rakuten.com/offer/buy/8095363356/huawei-e8372h-320-lte-4g-150-mbps-usb-mobile-wi-fi-dongle-blanc.html?t=7022&bbaid=10106865611

Je viens de la tester sur PC, elle fonctionne parfaitement, reste à mettre en pratique ce tuto.

Merci pour ton retour d’expérience à l’occasion quand tu le pourras :wink:

1 « J'aime »

Mais a ce prix on commence à ce rapprocher des modem de la marque, qui permettent bien plus (le backup 4G de tout le réseau, en le positionnant en amont du routeur principal)…!!
71 € ici
https://www.amazon.fr/TP-Link-TL-MR6400-Ethernet-amovibles-opérateur/dp/B07RM95YFC/ref=sr_1_4?keywords=modem+4g&qid=1669987184&qu=eyJxc2MiOiI1LjM4IiwicXNhIjoiNC43OCIsInFzcCI6IjQuMTQifQ%3D%3D&refinements=p_89%3ATP-Link&sr=8-4

C’est parti, je me lance.

Afin de partager mon expérience, je vais décrire mes manipulations et le résultat qui en découle.
Comme cela, on verra les différences et les éventuelles erreurs à éviter.

Contexte : Jeedom 4.3.11 sur RPI3 sous Débian Buster et une clé Huawei E8372h-320 avec carte sim Free forfait à 2€ (0€ avec la box internet).

Tout d’abord, préparation de la clé en la connectant sur un PC pour changement du mot de passe admin, coupure du wifi et coupure des données mobiles, car le forfait Free utilisé n’a que 50 Mo de data.

Les étapes :

1.3
J’ai ceci :

[   21.871895] cdc_ether 1-1.4:1.0 eth1: register 'cdc_ether' at usb-3f980000.us   b-1.4, CDC Ethernet Device, 00:1e:10:1f:00:00

1.4
La clé semble déjà configurée :

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group     default qlen 1000
    link/ether 00:1e:10:1f:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.101/24 brd 192.168.8.255 scope global dynamic noprefixroute eth1
       valid_lft 85050sec preferred_lft 74250sec
    inet6 fe80::a3a3:dd2c:4cc2:30da/64 scope link
       valid_lft forever preferred_lft forever

Go étape 2 !
2.1
RAS

2.2
Il faut juste copier les commandes pour créer les répertoires. La différence possible avait déjà été évoqué plus haut, c’est lorsqu’on est avec un autre utilisateur que jeedom, on crée les dossiers sous /home/nom de l’utilisateur.

2.3
Alors là, pour un moldu, il faut se poser 2 minutes.
On a tout d’abord les XXXX pour le mot de passe de la clé, puis le numéro de téléphone autorisé, puis l’ip Jeedom et sur la même ligne son API.
Attention à remplacer jeedom par le nom utilisateur (si celui-ci est différent) sur les lignes :

/home/jeedom/Outbox/*.txt
/home/jeedom/Sentbox
/home/jeedom/SMS_Gestion.py

Pour l’adaptation, on verra plus tard, on ne va pas courir avant de savoir marcher…

2.4 et 2.5
Rien n’a explosé, c’est bon.

2.6
Là aussi, il faut penser à modifier l’utilisateur dans /home/jeedom/./SMS_Gestion.py

3
C’est parti pour la config sur Jeedom !

3.1 et 3.2
RAS

3.3
J’ai utilisé la ligne echo "$1""\nXXXXXXXXXX" > /home/jeedom/Outbox/$(date +%Y%m%d-%H%M%S)-XXXXXXXXXX.txt où il faut là aussi penser, si beosin, à remplacer jeedom par l’utilisateur.

3.4
RAS

3.5
Je teste le script depuis le widget !
Arf…
J’ai une erreur :

Erreur sur /var/www/html/plugins/script/data/SMS_Aurelien.sh HELLO WORD 2>&1 valeur retournée : 2. Détails : /var/www/html/plugins/script/data/SMS_Aurelien.sh: 1: /var/www/html/plugins/script/data/SMS_Aurelien.sh: cannot create /home/pi3/Outbox/20221203-002822-0600000000.txt: Permission denied

Tiens une erreur de permission :thinking:

Vous l’aurez compris, mon utilisateur sur mon RPI3 c’est « pi3 » et voici le point sur les droits accordés :

drwxr-xr-x 2 pi3  pi3  4096 Dec  2 23:35 Outbox
drwxr-xr-x 2 pi3  pi3  4096 Dec  2 23:35 Sentbox
-rwxr-xr-x 1 pi3  pi3  2159 Dec  2 23:58 SMS_Gestion.py

Je suis certain que la gestion des droits pour un habitué, c’est du petit lait, mais pour un moldu comme moi, c’est une découverte. Si vous pouviez me guider, ça serait tip top. :blush:

Bonsoir ninouness,

suite à quelques recherches, je vois les solutions suivantes :

  • soit mettre les répertoires Outbox et Sentbox dans le répertoire des scripts de Jeedom (voir https://community.jeedom.com/t/pas-de-droit-en-ecriture/77572) et mettre à jour les liens en correspondance là où c’est nécessaire dans le script pyhon et les script sous Jeedom.
  • donner les droits en écriture sur les répertoires Outbox et Sentbox actuels à l’utilisateur www-data

Mais j’avoue ne pas savoir si l’une de ces solutions est meilleure que l’autre…

Un coup demain de spécialistes serait le bienvenu

Merci lguezennec pour ta recherche et réponse.

J’ai tenté la première solution, tout mettre dans le dossier plugins/script/data pour le moment se solde par une erreur.

Erreur sur /var/www/html/plugins/script/data/SMS_Aurelien.sh Hello word 2>&1 valeur retournée : 2. Détails : /var/www/html/plugins/script/data/SMS_Aurelien.sh: 1: /var/www/html/plugins/script/data/SMS_Aurelien.sh: cannot create http://127.0.0.1/plugins/script/data/Outbox/20221204-173020-0600000000.txt: Directory nonexistent

Je viens d’essayer. J’ai créé les répertoires Outbox et Sentbox sous /var/www/html/plugins/script/data avec l’éditeur intégré à Jeedom.

J’arrive bien à écrire le fichier de message sous les répertoires ainsi créés.

Le script d’envoi des SMS contient les éléments suivants :

echo "$1""\nXXXXXXXXXX" > /var/www/html/plugins/script/data/Outbox/$(date +%Y%m%d-%H%M%S)-XXXXXXXXXX.txt

Peux-tu tester ainsi.

Effectivement, avec le chemin /var/www/html/plugins/script/data, le fichier se créer dans Outbox, ça c’est ok.

J’avais eu l’idée de tenter, mais comme il ne se passait rien quand je cliquais, j’ai fait mon boulet, je n’ai pas eu l’idée d’ouvrir le dossier pour vérifier la création du fichier.

Maintenant reste à faire tourner SMS_Gestion.py.
Dedans j’ai modifié ces infos :
for NomFichier in glob.glob("/var/www/html/plugins/script/data/Outbox*.txt"):
et
stream = os.popen(‹ mv ‹ +fichier+ › /var/www/html/plugins/script/data/Sentbox ›)

Pour le moment ca fonctionne pas, il ne se passe rien. Je cherche…

Avec cette solution le mieux est de recréer le fichier SMS_Gestion.py sous /var/www/html/plugins/script/data avec l’éditeur de fichier de Jeedom.

Il faudra ensuite te connecter en SSH et le rendre exécutable

cd /var/www/html/plugins/script/data
sudo chmod +x SMS_Gestion.py

Il faut effectivement le lancer ensuite.
Il y a peut-être plus simple mais à ce stade je te propose de créer le script Start_SMS_Gestion.sh qui contient la ligne suivante :

/var/www/html/plugins/script/data/./SMS_Gestion.py

et ensuite le lancer en cliquant sur « Tester »

Je pense qu’il faudra penser à le lancer automatiquement au démarrage de Jeedom via un scénario, mais voyons déjà si ça fonctionne.

Merci de cette proposition.
Au début je m’étais effectivement dit qu’il était mieux de tout mettre dans le même dossier, mais je ne voyais pas comment le lancer.
J’ai donc suivi ta proposition et au lancemnet du Start_SMS_Gestion, j’ai cette erreur :

Erreur sur python /var/www/html/plugins/script/data/./SMS_Gestion.py 2>&1 valeur retournée : 1. Détails : File « /var/www/html/plugins/script/data/./SMS_Gestion.py », line 21 SyntaxError: Non-ASCII character ‹ \xc3 › in file /var/www/html/plugins/script/data/./SMS_Gestion.py on line 21, but no encoding declared; see PEP 263 – Defining Python Source Code Encodings | peps.python.org for details

Je suppose que dans le fichier c’est cette ligne là qui ne va pas : /var/www/html/plugins/script/data/SMS_Gestion.py

J’ai renommé le SMS_Gestion.py en SMSGestion.py mais idem.