Notification par SMS

Pour les abonnés français du réseau Free mobile, vous disposez d'une fonction de notification par SMS d’événements incluse à l'abonnement. Elle permet d'envoyer un message SMS sur votre téléphone (uniquement sur votre ligne d'abonné Free, pas vers d'autres destinataires). Voici quelques idées d'application de cette fonction d'alerte pour votre relais radio :

  • Une hausse anormale de température de la carte (mesurée par le capteur 1 Wire ou mesurée par le Raspberry Pi lui-même)
  • Redémarrage du relais (redémarrage automatique par le watchdog)
  • Une ouverture de la porte de votre relais radio
  • Une commande DTMF à droit Sysop (gestionnaire de relais) est exécutée

Prérequis

  • Il vous faut un abonnement Free Mobile (fonction également incluse dans l'offre 2 heures à 2 EUR)
  • Le relais doit être connecté à internet (au moment de l'envoi de l’événement)

Paramétrage

Développons à présent la façon de paramétrer cette fonction de notification par SMS.

Compte Free mobile

  1. Connectez-vous à votre espace abonné (Mon compte) sur Free mobile
  2. Dans le menu Gérer mon compte, dans Mes options, activer la dernière option Notification par SMS.
  3. Une fois activée noter la clé générée par Free est affichée.

Votre clé d'identification au service : XXXXXXXXXXXXXX

Un essai

L'envoi du SMS se fait en appelant le lien suivant : https://smsapi.free-mobile.fr/sendmsg avec les paramètres suivants :

  • user : votre login
  • pass : votre clé d'identification générée automatiquement par notre service (notée préalablement XXXXXXXXXXXXXX)
  • msg : le contenu du SMS encodé sous forme d'url (Percent-encoding)

Exemple : Envoyer le message “Hello World !” sur votre mobile : https://smsapi.free-mobile.fr/sendmsg?user=98765432&pass=XXXXXXXXXXXXXX&msg=Hello%20World%20!

Script d'envoi de SMS

/home/pi/sms/sms.py

#!/usr/bin/python2.7
 
import json
import sys
import urllib
 
class FreeMobileSMS():
 
    def __init__(self, config="config.json"):
        self.baseURL = "https://smsapi.free-mobile.fr"
        self.route = "/sendmsg"
        self.file = config
        self.codes = [200, 400, 402, 403, 500]
        self.messages = ["Message send", "Missing parameter", "Too much messages send", "Service not enable", "Server not available"]
        try:
            configFile = open(self.file)
            dataFile = json.load(configFile)
            self.login = dataFile["login"]
            self.token = dataFile["token"]
        except:
            raise Exception("Error with file " + self.file + "\n")
 
    def makeRoute(self, message):
        route = self.baseURL + self.route
        route += "?user=" + self.login
        route += "&pass=" + self.token
        route += "&msg=" + urllib.quote(message)
        return route
 
    def checkCode(self, code):
        index = self.codes.index(code)
        if index >= 0:
            return self.messages[index]
        else:
            return "Error message not found"
 
    def send(self, message):
        route = self.makeRoute(message)
        res = urllib.urlopen(route)
        code = int(res.getcode())
        message = self.checkCode(code)
        return code, message
 
def usage():
    print("Usage :")
    print("./sms.py [--config=file] message")
 
if __name__ == '__main__':
    if len(sys.argv) > 1:
        config = "config.json"
        for arg in sys.argv:
            if arg.startswith("--config="):
                tab = arg.split("=")
                if (len(tab) > 1 and len(tab[1])):
                    config = tab[1]
                    sys.argv.remove(arg)
                else:
                    usage()
                    sys.exit(1)
        sms = FreeMobileSMS(config)
        code, message = sms.send(sys.argv[1])
        print (str(code) + " " + message)
    else:
        usage()
        sys.exit(1)

Fichier de configuration de votre ligne

/home/pi/sms/config.json

{
    "login": "98765432",
    "token": "XXXXXXXXXXXXXX"
}

Pour lancer un message SMS, la commande est alors la suivante :

python /home/pi/sms/sms.py "Message SMS de notification"
Pour spécifier un fichier de configuration particulier. Cela peut être le utile pour sélectionner une destination, si vous avez plusieurs lignes téléphoniques.
python /home/pi/sms/sms.py --config=/home/pi/sms/my_config.json "Message SMS de notification avec un chemin de fichier de configuration"

Applications

Notification par SMS d'une commande DTMF

Pour avoir un message lors de la réceptions des commandes DTMF par le relais (par exemple 123#), nous allons insérer dans le fichier Logic.tcl la ligne d'exécution du script d'envoi de sms.

Création de la copie de la logique de relais

Copier le fichier Logic.tcl dans un sous-répertoire local. Cela nous permet de ne jamais modifier le fichier Local.tcl livré à l'installation de SvxLink (qui reste disponible à la consultation dans /usr/share/svxlink/events.d/.)

cd /usr/share/svxlink/events.d/
sudo mkdir local
cp Logic.tcl ./local/Logic.tcl

Modification du fichier Logic.tcl

Dans le fichier Logic.tcl, rechercher la fonction qui va traiter nos commandes distantes lors de la réception de codes DTMF dtmf_cmd_received, puis intégrer y le bout de code suivant.

proc dtmf_cmd_received {cmd} {
....
exec python /home/pi/sms/sms.py --config=/home/pi/test/config.json "Commande DTMF : $cmd";
....
  return 0
}

La valeur du code DTMF reçu sera intégrée dans le message SMS (variable $cmd).

Notification par SMS du redémarrage du relais

Pour être notifié du redémarrage du relais (causé par une action manuelle ou par le chien de garde en automatique), il vous faut ajouter ces deux lignes de commandes /usr/share/svxlink/events.d/local/Logic.tcl.

proc startup {} {
...
set heure [clock format [clock seconds] -format "%H%M"]
exec python /home/pi/sms/sms.py --config=/home/pi/test/config.json "Redemarrage du relais à $heure"; #permet de préciser l'heure de redémarrage
...
 
}