[Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Répondre
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

[Tuto] Communiquer avec DomoticZ en SMS en utilisant RaspiSMS 3

Message par Keros »

Ce tutoriel a objectif de présenter une solution pour envoyer et recevoir des SMS depuis un Raspberry Pi en utilisant un modem 3G USB via une carte SIM d'un opérateur et le logiciel RaspiSMS version 3 sorti le 14 fev 2021.

Pour la petite histoire, j'utilisais depuis deux ans la solution d'envoi de SMS via un téléphone Android et l'application SMS Gateway Ultimate : ça fonctionne très bien, mais j'avais des soucis de déconnexion certainement liés à mon Wifi. J'ai décidé de passer avec un modem directement relié en USB au Pi.


Information : Je ne vais pas ré-expliquer certaines parties pour lesquelles il y a déjà des tutos sur internet. Je vais vous donner des liens vers les différents sites dont je me suis servi. Il y a néanmoins des petites choses sur lesquelles j'ai été bloqué et c'est cela que je souhaite vous partager dans ce tuto.

Edit au 10/12/2023 : RaspiSMS a développé une application pour qu'un téléphone serve de relay pour les SMS. cela voudrait dire : plus besoin de modem, ni d'installer Gammu. Plus d'infos

Edit au 31/03/2024 : L'application mobile n'est pas compatible avec la version gratuite / autohébergée de RaspiSMS. Cela n'a donc pas vraiment d'intérêts.



Important : Ce tutoriel s'appuie sur les applications Gammu et RaspiSMS et n'a pas pour finalité de répondre aux problématiques d'installation / paramétrage / utilisation de ces logiciels. Si vous rencontrez des soucis avec ces éléments, merci de consulter le Web et d'ouvrir des discussions spécifiques.



Merci de réserver les échanges de ce sujet à l'utilisation de DomoticZ avec RaspiSMS.
;)

Bonne lecture

Sommaire
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Présentation

Message par Keros »

Présentation

Pour arriver à communiquer avec DomoticZ avec des SMS via RaspiSMS, il faut procéder par étapes :
  • Envoyer des SMS depuis le Raspberry Pi
Pré-requis : avoir le matériel
Étape Installation et configuration de Gammu
Validation : envoyer un SMS via une ligne de commande

  • Envoyer des SMS depuis RaspiSMS
Pré-requis : Pouvoir envoyer des SMS avec une ligne de commande
Étape Installation et configuration de RaspiSMS
Validation : envoyer et recevoir des SMS via l'interface de RapsiSMS

  • Envoyer des SMS via DomoticZ
Pré-requis : Pouvoir envoyer et recevoir des SMS via l'interface de RapsiSMS
Étape Configuration de DomoticZ
Validation : envoyer des commandes vers DomoticZ
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Le matériel utilisé

Message par Keros »

Le matériel utilisé

Pour réaliser mon projet voici les éléments que j'utilise :
  • Raspberry 3B+
  • Un modem Huawei E160X USB 3G
  • Une carte SIM d'un opérateur de téléphonie mobile.
  • Une rallonge usb pour éloigner le modem du Raspberry. Je n'ai pas rencontré de difficultés : c'est une précaution que j'ai prise
Les configurations des logiciels utilisés :
  • Raspberry Pi OS Buster Edit ; fonctionne avec Bullseye
  • Gammu : version 1.42 du 3 octobre 2020
  • RapsiSMS : version 3.0 du 14 février 2021
La version de RapsiSMS est importante, car il y a des gros changements entre les versions 2.X et 3.0 au niveau de l'utilisation du daemon Gammu et de l'appel via l'API. J'y reviendrai plus loin dans ce tutoriel.
Ayant galéré avec cette nouvelle version, j'ai décidé de vous partager ce que j'ai fait pour avoir un système fonctionnel.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Installation de Gammu

Message par Keros »

Installation de Gammu

Pour cela, il y a plein d'infos sur internet :
Quelques explications :
  • Gammu et gammu-smsd : le logiciel et son daemon
Le logiciel pour envoyer des SMS c'est Gammu.
L'application en arrière-plan qui permet d'envoyer et recevoir les SMS est gammu-smsd. Il stocke les SMS dans /var/spool/gammu/

A savoir : quand le daemon gammu-smsd est actif, il n'est plus possible d'envoyer un SMS via la commande gammu : il faut utiliser la commande gammu-smsd
  • Pourquoi ne pas utiliser directement gammu-smsd avec DomoticZ ?
Il est tout à fait possible d'utiliser gammu-smsd avec DomoticZ directement. Je l'ai d'ailleurs fait au départ mais j'ai rencontré deux "défauts" :
  • les SMS reçus sont stockés sous forme de fichiers. Pas super facile à consulter si besoin
  • Surtout, je ne suis pas arrivé à envoyer des SMS avec des retours à la ligne. \n était mal interprété et j'étais habitué à avoir mes infos sur plusieurs lignes.
Rappel : en cas de difficultés, merci de consulter le WEB et / ou ouvrir une demande séparée.
Ceci afin de garder ce sujet consacré à l'utilisation de DomoticZ avec RaspiSMS. ;)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Installation de RaspiSMS

Message par Keros »

Installation de RaspiSMS

Là aussi, il y a plein d'infos sur internet :
Note du 18 mai 2023 : RapiSMS n'est pas compatible avec Bullseye 64 bits, car il s'appuie sur des librairies Buster 32 bits. J'ai pu l'installer sur un Bullseye 32 bits.

Normalement, vous devez pouvoir envoyer et recevoir des SMS depuis l'interface WEB de RaspiSMS.

Rappel : en cas de difficultés, merci de consulter le WEB et / ou ouvrir une demande séparée.
Ceci afin de garder ce sujet consacré à l'utilisation de DomoticZ avec RaspiSMS. ;)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Configuration de Gammu et RaspiSMS

Message par Keros »

Configuration de Gammu et RaspiSMS
  • Fonctionnement
Important pour utiliser RapiSMS V3.0 :

Pour fonctionner, RaspiSMS v3.0 utilise Gammu. Donc si gammu-smsd fonctionne, RaspiSMS ne fonctionnera pas.

Lorsque vous lancez la commande

Code : Tout sélectionner

gammu identify
Vous devez avoir un retour qui ressemble à ceci :
Device : /dev/modem
Manufacturer : Huawei
Model : E160X (E160X)
Firmware : 11.604.20.00.00
IMEI : XXXXXXXXXXXXXXXXXXXXXXXXXXX
SIM IMSI : XXXXXXXXXXXXXXXXXXXXXXXXXXX
Si vous avez l'erreur :
Erreur à l'ouverture du périphérique : périphérique inconnu, occupé ou problème de permissions.
C'est certainement que le daemon gammu-smsd est toujours actif. Pour cela essayer la commande : sudo service gammu-smsd stop.
Ne pas oublier que le daemon se relancera tout seul au prochain redémarrage. J'ai désinstallé gammu-smsd.

  • Paramétrage
Gammu :

Mon fichier de paramètre de Gammu : /home/pi/.gammurc (je l'ai lu à d'autres endroits dans les tutos).

Code : Tout sélectionner

[gammu]

port = /dev/ttyUSB20
model = at
connection = at19200
synchronizetime = yes
logfile = textalldate
logformat = nothing
use_locking = nothing
gammuloc = /var/log/gammu
gammucoding = utf8
gammuloc = en_GB.utf8
RaspiSMS - Téléphone :

Ajouter un nouveau téléphone en sélectionnant le type Gammu et indiquer le chemin vers votre fichier de configuration Gammu.
Note : Je n'ai pas trouvé le moyen d'éditer un téléphone créé. Je supprime et je refais si j'ai besoin de modifier.
RaspiSMS - Config Tel.png
RaspiSMS - Config Tel.png (148.54 Kio) Consulté 6653 fois

Rien de bien compliqué ;)

Et normalement, si vous rédigiez un nouveau SMS, il devrait arriver :D

Note : même si le SMS est envoyé correctement, il reste à l'état Inconnu. S'il y a un souci, c'est indiqué Échec.


Rappel : en cas de difficultés, merci de consulter le WEB et / ou ouvrir une demande séparée.
Ceci afin de garder ce sujet consacré à l'utilisation de DomoticZ avec RaspiSMS. ;)



RaspiSMS - Clé API :

Pour dialoguer avec RaspiSMS version 3, il est nécessaire d'avoir une clé API. Chaque utilisateur dispose d'une clé API qui est visible dans son profil (accès par le bouton en haut à droite).
RaspiSMS - Config User.png
RaspiSMS - Config User.png (132.75 Kio) Consulté 6645 fois
Pour info, les informations sensibles comme le login, le code PIN, la clé API, mes paramètres de configuration, etc... sont factices.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Le coeur du toto

Message par Keros »

Le cœur du toto

Avant d'aller plus loin, vous devez avoir :
  • RaspiSMS fonctionnel en envoi et en réception
  • Une clé API
À partir de maintenant, on rentre dans le vif du sujet, car on va commencer à parler de DomoticZ :mrgreen:



Alors, pour échanger avec RaspiSMS, on utilise l'API de RaspiSMS Documentation de l'API.
La commande suivante est à adapter selon vos paramètres (adresse web, Clé API, Message et Téléphone) :

Code : Tout sélectionner

curl -X POST http://127.0.0.1/raspisms/api/scheduled/ -H 'X-Api-Key: 4d4a00210bc5ed4b9b0e16dc6bfd5d4a' -d 'text=Mon SMS d%27exemple' -d 'numbers=%2B33612345678' )
Le retour de cette commande est :
{"error":0,"message":null,"response":193,"next":null,"prev":null}

Remarquez les caractères %27 dans le texte du message. Les valeurs envoyées via la commande curl sont très sensibles aux caractères spéciaux. :arrow: Essayez avec le texte Mon SMS d'exemple, cela ne fonctionnera pas très bien. Oui je sais ce sont les ' ' qui définissent les champs de textes et que si on les remplace par des " ", le ' passe.

:idea: Pour éviter de se retrouver avec des SMS qui ne passent pas, il est préférable d'encoder le texte pour obtenir : Mon%20SMS%20d%27exemple. Je vous rassure tout de suite, vous recevrez bien Mon SMS d'exemple.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Configurer les notifications de DomoticZ

Message par Keros »

Configurer les notifications de DomoticZ

Pour envoyer des notifications depuis DomoticZ, nous allons passer par un fichier script sendsms.sh.
  • Le fichier de script
Placer le fichier sendsms.sh dans le répertoire domoticz/scripts et appliquer un sudo chmod +x sendsms.sh

Le script récupère les infos Numéro, Message et Clé API via les paramètres $1, $2 et $3. Il convertit la chaine de caractère Message et il envoie les infos à RaspiSMS.

Code : Tout sélectionner

#!/bin/bash

rawurlencode() {
  local string="${1}"
  local strlen=${#string}
  encoded=""
  local pos c o

  for (( pos=0 ; pos<strlen ; pos++ )); do
     c=${string:$pos:1}
     case "$c" in
        [-_.~a-zA-Z0-9] ) o="${c}" ;;
        * )               printf -v o '%%%02x' "'$c"
     esac
     encoded+="${o}"
  done
  echo "${encoded}"    # You can either set a return variable (FASTER) 
  REPLY="${encoded}"   #+or echo the result (EASIER)... or both... :p
}

rawurlencode "$2"

error=$(curl -X POST http://127.0.0.1/raspisms/api/scheduled/ -H 'X-Api-Key: '$3 -d text=$encoded -d numbers=%2B$1 )

echo $error #affichage du retour d'info
Pour tester le fichier de script, lancer la commande :

Code : Tout sélectionner

./sendsms.sh "+33612345678" "Mon message d%27exemple" "4d4a00210bc5ed4b9b0e16dc6bfd5d4a"
  • Le paramétrage de DomoticZ
Configuration à faire dans DomoticZ / Configuration / Paramètres / Notifications :
#TO :

Code : Tout sélectionner

33612345678
URL/Action :

Code : Tout sélectionner

script://sendsms.sh "#TO" "#MESSAGE" "4d4a00210bc5ed4b9b0e16dc6bfd5d4a"
RaspiSMS - Config DomoticZ.png
RaspiSMS - Config DomoticZ.png (193.63 Kio) Consulté 6643 fois
Et cliquer sur Tester.

Si le message est bien arrivé, cliquer sur Appliquer les paramètres pour sauvegarder.

Ajout 10/12/2023 :
Les notifications de DomoticZ ne partent pas par SMS s'il y a un caractère spécial dedans. Evitez les accents !!
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Envoyer des SMS depuis un script DzVents

Message par Keros »

Envoyer des SMS depuis un script DzVents

Les notifications DomoticZ sont bien, mais j'ai eu besoin d'aller plus loin et de gérer l'envoi de SMS depuis mes scripts. Et comme j'ai tout passé en DzVents, c'est ce langage que j'explique en premier :mrgreen:
  • Le code de base
On reprend notre exemple précédent, et on l'adapte à DzVents, ce qui donne :

Code : Tout sélectionner

os.execute("curl -X POST http://127.0.0.1/raspisms/api/scheduled/ -H 'X-Api-Key: '4d4a00210bc5ed4b9b0e16dc6bfd5d4a -d text=Mon message d%27exemple -d numbers=%2B33612345678")
Note : le %2B correspond au + du numéro.
  • La fonction URLencode
J'avais deux problématiques :
  1. l'envoi de caractères spéciaux
  2. l'envoi de message avec des retours à la ligne
Voici les fonctions que j'utilise :

Code : Tout sélectionner

function urlencode(url)
	if url == nil then
		return
	end
	url = url:gsub("([^%w ])", char_to_hex)
	url = url:gsub(" ","%%20")
	return url
end

local char_to_hex = function(c)
	return string.format("%%%02X", string.byte(c))
end
  • J'ai 20 scripts comment je fais ???
Réponse : le global_data

Les fonctions et variables définies dans ce script particulier peuvent être appelées depuis n'importe quel autre script. Voilà ce que j'ai dedans :

Code : Tout sélectionner

return {
	-- global persistent data
	data = {
	},
    
	-- global helper functions
	helpers = {
	    sendsms = function(domoticz, smsto, smsbody)
	        
	        smsbody = domoticz.helpers.urlencode(domoticz, smsbody)

          os.execute("curl -X POST http://127.0.0.1/raspisms/api/scheduled/ -H 'X-Api-Key: '4d4a00210bc5ed4b9b0e16dc6bfd5d4a -d text="..smsbody.." -d numbers=%2B"..smsto)

        end,
        
        char_to_hex = function(c)
          return string.format("%%%02X", string.byte(c))
        end,
        
        urlencode = function(domoticz, url)
          if url == nil then
            return
          end
          url = url:gsub("([^%w ])", domoticz.helpers.char_to_hex)
          url = url:gsub(" ","%%20")
          return url
        end,
        
	}
}
Et j'ai juste besoin de cette ligne pour envoyer mon message :

Code : Tout sélectionner

local sms = domoticz.helpers.sendsms(domoticz, "33612345678", "Mon SMS d'exemple")
Note : Le + du numéro est déjà intégré dans la fonction.

Info : La variable domoticz est nécessaire, car les fonctions présentent dans le global_data n'ont pas accès directement à domoticz : il faut le passer en même temps que la fonction.


À vous les SMS à plusieurs personnes, toutes les infos que vous voulez sur des lignes différentes :mrgreen:
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Envoyer des SMS depuis un script LUA

Message par Keros »

Envoyer des SMS depuis un script LUA

La base est identique au Script en LUA puisque le DzVents est basé sur du LUA.

La fonction est identique :

Code : Tout sélectionner

function sendsms(smsto, smsbody)
	        
	        smsbody = urlencode(smsbody)

          os.execute("curl -X POST http://127.0.0.1/raspisms/api/scheduled/ -H 'X-Api-Key: '4d4a00210bc5ed4b9b0e16dc6bfd5d4a -d text="..smsbody.." -d numbers=%2B"..smsto)

        end
        
        function char_to_hex(c)
          return string.format("%%%02X", string.byte(c))
        end
        
         function urlencode(url)
          if url == nil then
            return
          end
          url = url:gsub("([^%w ])", char_to_hex)
          url = url:gsub(" ","%%20")
          return url
        end
La ligne d'appel est un peu différente :

Code : Tout sélectionner

local sms = sendsms("33612345678", "Mon SMS d'exemple")
Et pour l'utiliser dans tous vos scripts, mettez cette fonction dans le modules.lua, la bibliothèque de fonctions de Vil1driver ;)
Répondre