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
 
    