Un détecteur de fumée connecté

  • Sylvain Nicolet

Le Device Lab de Fribourg possĂšde une trentaine d’appareils utilisĂ©s pour tester nos applications sur mobiles. Afin de se protĂ©ger d’un risque d’incendie, nous avons dĂ©cidĂ© d’installer un dĂ©tecteur de fumĂ©e.

Le projet que je vais te prĂ©senter a pour but de mettre en place un systĂšme de dĂ©tection de fumĂ©e connectĂ©. Une notification doit ĂȘtre envoyĂ©e sur Slack, notre systĂšme de communication interne, en cas d'Ă©vĂ©nement important (fumĂ©e, batterie faible, perte du wifi, etc.).

Choisissons notre détecteur

La premiĂšre Ă©tape est de choisir un dĂ©tecteur de fumĂ©e pour notre projet. Mon choix s’est tournĂ© vers un dĂ©tecteur de la marque “Netatmo” qui a la particularitĂ© d’avoir une API ouverte disponible ici.

Préparons Slack

Une fois le dĂ©tecteur correctement configurĂ©, il nous faut configurer Slack afin qu’un channel puisse recevoir les Ă©vĂ©nements de notre dĂ©tecteur. Je crĂ©e donc un nouveau channel (fr-smoke-detector) et configure un bot (nom et avatar) qui affichera nos Ă©vĂšnements. Slack me gĂ©nĂšre une URL WebHook oĂč l’on enverra nos futurs Ă©vĂšnements.
Pour tester ma configuration, j’ai utilisĂ© Postman qui me permet d’envoyer des requĂȘtes HTTP vers mon WebHook.

Faisons parler Slack et l’API Netatmo ensemble à l’aide d’une application

Slack Ă©tant correctement configurĂ©, la prochaine Ă©tape est de lire la documentation de l’API Netatmo afin de comprendre comment accĂ©der aux Ă©vĂšnements du dĂ©tecteur.
Je dĂ©cide donc d’écrire mon application en Python en utilisant le framework Flask. Elle devra remplir ces deux fonctions : s’authentifier auprĂšs de l’API Netatmo et gĂ©rer les diffĂ©rents Ă©vĂšnements que l'on recevra.
Une premiùre fonction permet de s’authentifier :

@app.route('/netatmoOAuth', methods=['GET'])
def netatmoOAuth():

   # GET USER CODE
   code_user = request.args.get('code')

   # CALL NETATMO TO RETRIEVE TOKEN
   host_url = 'https://api.netatmo.com/oauth2/token'
   request_datas = {
       'grant_type' : 'authorization_code',
       'client_id' : CLIENT_ID,
       'client_secret' : CLIENT_SECRET,
       'code' : code_user,
       'redirect_uri' : APP_URL + '/netatmoOAuth',
       'scope' : SCOPE
   }

   # GET ACCESS TOKEN
   json_return = requests.post(host_url, data = request_datas)
   access_token = json_return.json()['access_token']

   # ADD WEB HOOK
   add_web_hook_url = 'https://api.netatmo.com/api/addwebhook?url=' + APP_URL + '/webhook'
   json_return = requests.get(add_web_hook_url, headers = {'Authorization' : 'Bearer ' + access_token})
   web_hook_status = json_return.json()['status']

   # VERIFY WEB HOOK
   if web_hook_status == "ok":
       return render_template('success.html')

   return render_template('error.html')

Une deuxiÚme fonction permet de gérer les évÚnements :

@app.route('/webhook', methods=['GET', 'POST'])
def webhook():

   # VERIFY JSON
   json_file = request.json
   if json_file == None:
       return "JSON is null."

   # SHOW JSON IN LOG
   app.logger.info('request json : %s', request.json)

   # GET JSON
   json_event_type = json_file['event_type']
   event_type = json.dumps(json_event_type).strip('"')
   sub_type = json_file['sub_type']

   # HUSHED
   if event_type == "hush":
       slackMessage("Alarm hushed for 15 min !")
       return "Alarm hushed for 15 min !"

   # WIFI
   if event_type == "wifi_status":
       if sub_type == 0:
           slackMessage("Wifi Error !")
           return "Wifi Error !"
       if sub_type == 1:
           slackMessage("Wifi Ok !")
           return "Wifi Ok !"

   # 


DĂ©ployons notre application sur Heroku

Notre application Ă©tant fonctionnelle, il est temps de la mettre sur un serveur afin que l’API Netatmo puisse y accĂ©der Ă  n’importe quel moment. Je vais utiliser Heroku qui est une plateforme permettant de dĂ©ployer des applications.
Avant de mettre mon application sur Heroku, je mets mon projet sur un dĂ©pĂŽt distant. Je vais utiliser GitHub (dĂ©pĂŽt disponible ici). Il ne me reste plus qu’à dĂ©ployer mon application sur Heroku.
AprĂšs un ultime test d’incendie fictif, le Device Lab de Fribourg est maintenant Ă©quipĂ© d’un dĂ©tecteur de fumĂ©e connectĂ©.

Et aprÚs ça?

Cette solution étant fonctionnelle, il reste cependant des fonctionnalités à ajouter pour améliorer ce projet comme :

  • Recevoir l’état du dĂ©tecteur chaque jour
  • Recevoir un appel lorsque la fumĂ©e est dĂ©tectĂ©e Ă  l'aide de Twilio

Sag uns was du denkst