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

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.

:confetti_ball:Victoire, SMS reçu !

Après de multiples tripatouillages pour tenter de comprendre et résoudre cette erreur python, j’ai fini par déduire que le module script n’est tout simplement pas copain avec python.

Dans une dernière tentative, j’ai tenté d’appliqué la deuxième méthode que tu m’as proposé :

Bon, je l’ai fait à me sauce, ne sachant pas appliquer des droits en écriture à un utilisateur précis (si tu as la ligne de commande à me proposer ça m’intéresse), j’ai mis les deux dossiers en 777. J’ai ensuite rétabli le script et le fichier python selon ton tuto.

=> Je ne supprime pas encore ce qu’on a fait par rapport à la première méthode au cas où tu me dises qu’elle est préférable et tu sais traiter l’erreur. J’attends donc ton retour sur ce point.

Autre sujet :

Pour autoriser un autre numéro à écrire à Jeedom, on est d’accord qu’il suffit de copier ce bloc sous le précédent ?

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

Chouette pour la réussite de l’envoi !
En espérant que ce soit aussi stable chez toi que chez moi.

Je confirme pour la copie du bloc pour le 2ème numéro.

Une fois que tu jugeras ta solution stabilisée, est-ce que ça te dirait qu’on voit ensemble pour la solution sous le répertoire des scripts Jeedom et qu’à la suite on écrive une solution complète comme dans mon post du 25/11 pour ceux qui comme toi sont en direct sous Jeedom ?

2 « J'aime »

En premier ressenti, je trouve ça beaucoup plus réactif.

Merci pour ton tuto et ton assistance.

Et, bien sûr que je suis partant, si pour une fois, je peux aider la communauté.
Comme je t’ai dit, je sens un problème d’incompatibilité avec python. A voir…

Salut lguezennec,

Je viens de découvrir que la procédure que tu proposes pour que le script se lance au redémarrage du Raspberry, ne fonctionne pas. Il me faut le relancer manuellement.
J’ai fouillé sur le net et ça parle pas mal d’un dossier init mais je n’y connais rien.

Aurais-tu une proposition pour moi ?

Merci

Salut,

As-tu bien changé ton utilisateur et le nom du fichier de script pour correspondre à ta config ? je crois que chez toi c’est pi3 et non jeedom :

@reboot pi3 /home/pi3/./SMS_Gestion.py

Merci pour ta réponse, j’avais fait mon boulet en ne remplaçant pas de premier jeedom. C’était sous mon nez… :face_with_hand_over_mouth:
Je ne peux pas tester le redémarrage tout de suite, mais ce n’était surement que ça.

A bientôt.
Bonnes fêtes ! :confetti_ball: