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