20
Dominique MEURISSE Fichiers complémentaires à télécharger Python, Raspberry Pi et Flask Capturez des données télémétriques et réalisez des tableaux de bord web (MicroPython, ESP8266, MQTT, SQLite 3…)

Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

  • Upload
    others

  • View
    129

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

Pyth

on, R

aspb

erry

Pi e

t Fla

sk

Donn

ées t

élém

étriq

ues e

t tab

leau

x de

bor

d w

eb

Ce livre s’adresse à toute personne qui souhaite découvrir comment capturer des données télémétriques d’une maison (température, humidité, pression atmosphérique, luminosité) et les présenter dans une interface web sous forme de tableaux de bord. L’auteur s’appuie pour cela sur les possibilités offertes par le langage Python, le nano-ordinateur Raspberry Pi et le framework Flask. Bien qu’appliqué au Raspberry Pi, le contenu du livre est suffisamment universel pour être exploité sur d’autres plateformes telles que des ordinateurs.Pour tirer le meilleur profit de la lecture de ce livre, des notions de programmation orientée objet et quelques rudiments sur le langage Python et en électronique sont nécessaires. Une première expérience avec le Raspberry Pi et est également souhaitée. Les points technologiques du livre sont isolés et vulgarisés avant d’être intégrés dans un projet global qui sert de fil conducteur à la prise en main et l’exploitation des différentes technologies étudiées. L’auteur commence par présenter la collecte de données à l’aide de composants basés sur un microcontrôleur ESP8266 programmé avec MicroPython. Il détaille ensuite la centralisation de ces données à l’aide d’un broker MQTT fonctionnant sur un Raspberry Pi. Dans la suite du livre, le lecteur découvre comment une base de données SQLite 3 permet d’offrir un stockage persistant des données et comment elle peut être exploitée par une application Flask pour produire des tableaux de bord sur mesure.A l’issue de ce livre, le lecteur disposera de bases solides pour créer sereinement une grande variété de solutions, plus ou moins sophistiquées, en fonction de ses besoins.Des éléments complémentaires sont en téléchargement sur le site www.editions-eni.fr.

Python, Raspberry Pi et FlaskCapturez des données télémétriques et réalisez des tableaux de bord web (MicroPython, ESP8266, MQTT, SQLite 3…)

ISBN

: 978

-2-4

09-0

1631

-834 €

A télécharger sur www.editions-eni.fr : - Le code source des projets du livre (Dashboard,

Push-to-db).- Le code Python des exemples (Flask, MQTT, SQLite).

Dominique MEURISSE Ingénieur de formation et ancien architecte logiciel, Dominique MEURISSE se passionne pour la programmation des nano-ordinateurs (Raspberry Pi, Odroid, OlinuXino) et des microcontrôleurs (Arduino, Feather, ESP, PyBoard, etc.). Ardent défenseur de Python, MicroPython ou Open-Hardware (Adafruit Industries), sa passion le pousse à participer activement à la rédaction du wiki, du blog et des fiches produits documentées du site de vente en ligne de sa société Microcontrôleur Hobby. Fort de cet enthousiasme, il poursuit le partage de son savoir avec l’écriture de ce livre sur la capture de données télémétriques avec Python, Raspberry Pi et Flask.

Dominique MEURISSE

Fichiers complémentairesà télécharger

Python, Raspberry Pi et FlaskCapturez des données télémétriques et réalisez des tableaux de bord web (MicroPython, ESP8266, MQTT, SQLite 3…)

Page 2: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

1Table des matières

Préface

Chapitre 1Présentation

1. Avant-propos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2. Motivations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3. Présentation du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4. Objectifs de l'ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

5. Prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

6. Matériel utilisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216.1 Raspberry Pi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216.2 Feather ESP8266 Huzzah . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226.3 Module relais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236.4 DHT11 - Humidité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246.5 AM2315 – Température et humidité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.6 DS18B20 - Température. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.7 BME280 et BMP280 - Pression, humidité, température. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266.8 TSL2561 - Luminosité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276.9 ADS1115 – Lecture analogique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276.10 TMP36 – Température . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286.11 Photorésistance - luminosité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286.12 PIR – Détection de mouvement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296.13 Contact magnétique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296.14 Senseur à effet Hall numérique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Les éléments à télécharger sont disponibles à l'adresse suivante : http://www.editions-eni.fr 

Saisissez la référence ENI de l'ouvrage LFPYRASPFL dans la zone de recherche et validez. Cliquez sur le titre du livre puis sur le bouton de téléchargement.

lcroise
Tampon
Page 3: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

2 Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

7. Code source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317.1 Téléchargement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317.2 GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

8. Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338.1 Installation du Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338.2 Utilitaires : des outils pour travailler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

8.2.1 Connexion SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488.2.2 Éditeur de texte Nano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498.2.3 Transfert de fichiers via SSH (sftp) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518.2.4 Système de fichiers SSH. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538.2.5 Bureau à distance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

9. Type de données collectées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Chapitre 2Le broker MQTT

1. Présentation et concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591.1 Le broker MQTT, élément central du réseau MQTT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611.2 Les éléments de MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631.3 Le broker MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631.4 Les topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641.5 Les publishers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641.6 Les subscribers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651.7 Le ClientId. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

2. Les topics en détail. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662.1 Contenu du message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

2.1.1 Le message selon MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682.1.2 En marge du standard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

2.2 Création de topic et bonnes pratiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692.3 Les topics système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

3. Souscription et expression de filtrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .723.1 Expression de filtrage sans joker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733.2 Le joker de niveau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733.3 Le joker multiniveau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

Page 4: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

3Table des matières

4. Les qualités de service MQTT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .744.1 Les niveaux de qualités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

4.1.1 QoS 0 : une fois max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754.1.2 QoS 1 : au moins une fois. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754.1.3 QoS 2 : exactement une fois . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

4.2 Rétrogradation de QoS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .774.3 Quel QoS utiliser et quand ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

5. La rétention de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

6. Les clients persistants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

7. Quel broker MQTT ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

8. Installation de Mosquitto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858.1 Mise à jour. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

9. Test avec Mosquitto.org . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879.1 La souscription . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889.2 La publication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889.3 Tester le broker MQTT du Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

10. Topics du projet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

11. QoS du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

12. Sécurité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

13. Configurer le login du broker MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9413.1 Modifier la configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9413.2 Tester la configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

14. MQTT en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9714.1 test-mqtt-client-sub.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9814.2 test-mqtt-client-pub.py. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10114.3 Documentation complémentaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103

15. MQTT en MicroPython. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Page 5: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

4 Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

Chapitre 3ESP8266 sous MicroPython

1. Présentation de l'ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1051.1 Les possibilités offertes par l'ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1061.2 Les plateformes ESP8266 populaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071.3 Programmer un ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1101.4 Feather Huzzah ESP8266 en détail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1111.5 Brochage du Feather Huzzah ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

1.5.1 Alimentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1131.5.2 Port série. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1141.5.3 Broches d'entrée/sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151.5.4 Entrée analogique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1171.5.5 Les autres broches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

2. Charger le firmware MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1182.1 Identifier le firmware MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192.2 Préparatifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1202.3 Reflasher l'ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

3. Prise de contrôle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1253.1 Communiquer avec MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1253.2 Communiquer avec un ESP8266 sous MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1263.3 REPL : l'invite de commandes MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1263.4 RShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1293.5 Ampy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

4. WebREPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1434.1 Le démon WebREPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

4.1.1 Activer WebREPL sur l'ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1444.1.2 Le mot de passe WebREPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

4.2 Client WebREPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

5. Nom d'hôte et adresse MAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

6. Le mode point d'accès (AP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

7. Le mode station (STA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1517.1 Mode STA et scan réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1527.2 Réseau Wi-Fi visible ou masqué . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1537.3 Connexion en mode STA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1537.4 WebREPL en mode STA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

Page 6: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

5Table des matières

7.5 Désactivation du point d'accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1567.6 Rechercher l'adresse IP d'un ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

8. Séquence de démarrage MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1588.1 Fichier boot.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1588.2 Fichier main.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1588.3 Un fichier boot.py pour ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159

8.3.1 Script trop optimiste et conséquences. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1608.3.2 RunApp - Activation de l'application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1618.3.3 Un script de boot avancé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162

9. Programmer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1649.1 Création d'une bibliothèque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1659.2 Les bibliothèques MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

9.2.1 Bibliothèques standards et microbibliothèques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1679.2.2 Bibliothèques spécifiques à MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1699.2.3 Bibliothèque spécifique à l'ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1699.2.4 Autres bibliothèques MicroPython. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1699.2.5 Mécanisme de chargement d'une bibliothèque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170

9.3 Charger et exécuter un script à la volée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1709.4 RunApp : exécution conditionnelle de main.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1729.5 Entrées/sorties sur ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

9.5.1 Entrée numérique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1749.5.2 Entrée numérique (pull-up interne) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1769.5.3 Entrée numérique et déparasitage logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1789.5.4 Sortie numérique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1809.5.5 Entrée analogique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1829.5.6 Ajout d'entrée/sortie avec MCP23017. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1859.5.7 Lecture analogique avec l'ADS1115. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189

9.6 Senseur et interface sur ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1929.6.1 Senseur PIR - senseur de proximité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1929.6.2 Contact magnétique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1939.6.3 DHT11 - humidité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1959.6.4 Senseur à effet Hall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1979.6.5 TSL2561 - luminosité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1999.6.6 BME280 - température, humidité et pression barométrique . . . . . . . . . . . . . . . . . . 2039.6.7 Module relais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

Page 7: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

6 Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

10. MQTT sous ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20810.1 Publication MQTT sous MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20910.2 Souscription MQTT sous MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

11. Asyncio sur ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21711.1 Asyncio en quelques mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21711.2 Asyncio par l'exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21811.3 Fonction run_every pour Asyncio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22211.4 Plus d'informations sur Asyncio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

Chapitre 4Les objets ESP8266

1. Informations pratiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2251.1 Prérequis et configurations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2251.2 LED de statut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2261.3 Les topics MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2271.4 Télécharger et préparer le code des objets IoT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228

2. Fonctionnement général d’un objet IoT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2302.1 Principales sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2332.2 Paramètres d’un objet IoT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2342.3 RunApp et la LED d'activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2342.4 La fonction led_error(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2342.5 Les tâches et fonctions asynchrones des objets IoT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236

3. Objet 1 : Météo cabane de jardin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2383.1 Schéma de raccordement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2393.2 Téléverser les scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2403.3 Fonctionnement du script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2413.4 Tester l'objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

4. Objet 2 : Surveillance salon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2464.1 Téléverser les scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2474.2 Fonctionnement du script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2484.3 La fonction capture_1h() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2534.4 Senseur PIR – variables et utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2534.5 Senseur PIR - la fonction pir_activated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2544.6 Senseur PIR - la fonction pir_alert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

Page 8: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

7Table des matières

4.7 Senseur PIR - la fonction pir_update. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2554.8 Problèmes de concurrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2564.9 Tester l'objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

5. Objet 3 : Surveillance de la véranda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2575.1 Téléverser les scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2585.2 Fonctionnement du script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2595.3 La fonction capture_1h() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2635.4 La fonction check_contact() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2645.5 La fonction check_ldr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2655.6 Tester l'objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268

6. Objet 4 : Chaufferie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2686.1 Téléverser les scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2706.2 Fonctionnement du script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2716.3 La fonction capture_1h() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2776.4 La fonction capture_10m() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2786.5 La fonction check_mqtt_sub() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2786.6 La fonction sub_cb() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2796.7 La fonction chaud_exec_cmd(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2806.8 Tester l'objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .281

7. Dépannage d’un objet IoT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

Chapitre 5Persistance des données

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2851.1 Pourquoi utiliser une base de données ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2851.2 Quel moteur de base de données ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2861.3 Principe de fonctionnement de push-to-db . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

2. SQLite 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2882.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2882.2 Classe de stockage, type de données et affinité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

2.2.1 Classe de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2902.2.2 Stockage des date et heure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2912.2.3 Affinité de type pour les colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2912.2.4 Résolution de l'affinité de type. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293

Page 9: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

8 Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

2.3 Affinité, expressions, comparaison et tri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2932.3.1 Affinité des expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2932.3.2 Comparaison, tri et groupage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

2.4 Clé primaire et auto-incrément. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2972.4.1 Définir une clé primaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2972.4.2 Table rowid et clé primaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

2.5 SQLite3 et accès concurrents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2992.6 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .301

2.6.1 Installer SQLite 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3012.6.2 Installer le support Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302

2.7 Premiers pas avec SQLite3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3022.7.1 Documentation SQL pour SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3042.7.2 Commandes de l'interpréteur SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304

2.8 SQLite et Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3072.8.1 Opération de lecture SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3072.8.2 Opération d'insertion SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3102.8.3 Row Factory de SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

3. Approches techniques de push-to-db. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3133.1 Approche base de données de push-to-db . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314

3.1.1 topicmsg – dernier message reçu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3143.1.2 ts_xxx – historique de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315

3.2 Approche logicielle de push-to-db. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3173.2.1 Diagramme des classes (partie 1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3183.2.2 Fichier de configuration de push-to-db. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3243.2.3 Diagramme des classes (partie 2). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

4. Configuration de push-to-db . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3494.1 Les répertoires de stockage de push-to-db. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3514.2 Création des tables de push-to-db . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3524.3 push-to-db.ini. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3534.4 Le script d'installation de push-to-db. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356

5. Logger Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3595.1 Logger et fichier de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3595.2 Configuration du logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3595.3 Utilisation du logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .361

6. Exécution du script push-to-db . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362

Page 10: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

9Table des matières

7. Service systemd pour push-to-db . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3637.1 Quand démarrer le service ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3637.2 Créer le fichier Unit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3647.3 Configurer, démarrer, contrôler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3657.4 Documentation sur systemd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365

8. Améliorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366

Chapitre 6Développement web en Python

1. Présentation de Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3671.1 Pourquoi Flask ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3681.2 La flexibilité de Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3691.3 Les nombreuses extensions Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3691.4 Flask plus en détails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .371

1.4.1 Werkzeug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3721.4.2 WSGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3731.4.3 Application Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3741.4.4 Jinja. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3741.4.5 Base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375

1.5 Documentations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375

2. Anatomie d'un projet Flask. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376

3. Installation et prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3773.1 L'utilitaire flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3793.2 Prise en main avancée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3803.3 Déboguer avec Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3843.4 Application Flask en production . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388

4. Les fondamentaux de Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3894.1 Routes et paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3894.2 Retourner une erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3984.3 Utilisation de template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3994.4 Création d'URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4024.5 Redirection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4034.6 Requêtes GET et POST. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406

Page 11: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

10 Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

4.7 Contexte applicatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4104.7.1 L'objet g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4104.7.2 Connexion à la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .411

4.8 Les cookies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4114.9 Les sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4134.10 Journalisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4144.11 Mini-projet Fruits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417

4.11.1 Sources du mini-projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4184.11.2 La connexion SQLite 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4194.11.3 Organisation du mini-projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4204.11.4 Détails du mini-projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420

4.12 Ressources et documentations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435

5. Templates Jinja. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4355.1 Exécution d'un template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4365.2 Tester un template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436

5.2.1 Créer une application Flask. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4365.2.2 Test avec serveur web Flask et string Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4375.2.3 Test en console et string Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4385.2.4 Utiliser le projet Jinja Live Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438

5.3 Évaluation des balises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4405.3.1 {{ … }} : évaluation d'expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4415.3.2 {% … %} : instructions de contrôle de flux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4415.3.3 {# … #} : insertion de commentaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4415.3.4 # … : ligne d'instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442

5.4 Variables et expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4425.4.1 Variables spéciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4445.4.2 Séquence d'échappement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4455.4.3 Assignation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446

5.5 Branchement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4465.6 Itération. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4475.7 Les macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4515.8 Contrôle des espaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4535.9 Filtres Jinja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4555.10 Inclusion de template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4615.11 Importer des macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464

Page 12: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

11Table des matières

5.12 Héritage de template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4655.12.1 Les éléments de l'héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4685.12.2 Heritage-app : l'héritage Jinja par la pratique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4685.12.3 Template de base et block. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469

5.13 Template enfant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4715.13.1 Super bloc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4725.13.2 Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474

5.14 Message Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474

Chapitre 7Le tableau de bord

1. Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4851.1 Préambule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4851.2 Dépôt du projet Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4871.3 Éléments principaux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4881.4 Fonctionnalités du projet Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493

2. Structure HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5052.1 Disposition de la page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5052.2 Les blocs d'informations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5102.3 La liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .512

3. Template Jinja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5133.1 Le template de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5133.2 Utilisation du template de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .519

4. Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5224.1 Base de données dashboard.db. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522

4.1.1 Schéma de la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5234.1.2 Répertoire de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5264.1.3 Création des tables de Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5264.1.4 Copie de la base de données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527

4.2 Fichier de configuration de Dashboard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527

5. Détails de l'application Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5305.1 Répertoires et fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5305.2 Les routes de Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536

Page 13: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

12 Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

5.3 Accès aux données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5375.3.1 La fonction get_db( db_key ) multi bases de données . . . . . . . . . . . . . . . . . . . . . . . . . 5375.3.2 Les classes DBHelper de Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5415.3.3 Exemple : liste des topics disponibles pour Dashboard . . . . . . . . . . . . . . . . . . . . . . . . 5455.3.4 Exemple : extraction de l'historique dans Dashboard. . . . . . . . . . . . . . . . . . . . . . . . . . 5465.3.5 Affichage d'un tableau de bord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549

5.4 Les filtres Jinja personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5565.5 Affichage du tableau de bord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5595.6 Les macros Jinja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564

5.6.1 La macro make_block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5645.6.2 La macro block_icon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5665.6.3 La macro block_big_text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5685.6.4 La macro select_color (édition d'un bloc) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569

6. Bloc switch (marche/arrêt) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5746.1 Développements complémentaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577

6.1.1 MQTT sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5776.1.2 Bloc et paramètres additionnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580

6.2 Ajout du bloc SWITCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5836.2.1 Block_config du switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5836.2.2 Ajouter le nouveau type de bloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584

6.3 Le switch et MQTT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5876.3.1 Client MQTT JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5896.3.2 MQTT en Javascript et WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5906.3.3 Activer le support WebSocket sur Mosquitto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5916.3.4 Tester le client MQTT JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5916.3.5 Mille milliards de mille sabords ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5936.3.6 La route MqttProxyPublish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5956.3.7 Événement on_switch_change. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596

6.4 Tester le bloc switch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598

7. Améliorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602

Page 14: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

13

Conclusion

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603

2. Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604

3. Retour sur client MQTT JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604

Annexes

1. Installation rapide. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6071.1 Prérequis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6071.2 Début de l'installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6071.3 Récupération des sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6081.4 Poursuivre l'installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .609

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .613

Page 15: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

Chapitre 4

Les objets ESP8266

225

Les objets ESP8266Pyt hon, Ra spb erry Pi e t F lask

1. Informations pratiques

1.1 Prérequis et configurationsCe chapitre se concentre sur le développement des objets IoT et nécessite quelques prérequisabordés dans les précédents chapitres avant de se lancer dans l'aventure.

1. Les ESP8266 sont reflashés avec MicroPython pour ESP8266 (version 1.9.1 minimum, elleapporte le support de uasyncio utilisé dans les objets), cf. ESP8266 sous MicroPython –Charger le firmware MicroPython.

2. La copie de scripts Python sur l'ESP8266 à l'aide d'un utilitaire comme RShell (ou équiva-lent) est un point maîtrisé, cf. ESP8266 sous MicroPython – Prise de contrôle.

3. La mise en place du fichier boot.py avec authentification sur le réseau Wi-Fi domestiqueainsi que la fonctionnalité RunApp, cf. ESP8266 sous MicroPython – Séquence de démar-rage MicroPython.

4. Le broker MQTT Eclipse Mosquitto est installé sur le Raspberry Pi et configuré avec uneauthentification avec le login pusr103 et le mot de passe 21052017, cf. Le broker MQTT –Installation de Mosquitto, cf. Le broker MQTT - Configurer le login du broker MQTT.

5- Le Raspberry Pi exécutant le broker MQTT est configuré avec l'adresse IP fixe 192.168.1.210dans le cadre de cet ouvrage. Toute modification d'adresse IP du Raspberry Pi implique unemodification des scripts Python avant de les téléverser sur les objets.

lcroise
Tampon
Page 16: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

226

© E

diti

ons

EN

I - A

ll ri

ghts

res

erve

d

Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

1.2 LED de statutUn élément important de tout projet est la possibilité d'informer l'utilisateur sur son état defonctionnement. La LED #0 disponible sur le feather ESP8266 est utilisée pour indiquer cestatut.

Utilisation de la LED #0 comme LED de statut

La LED de statut utilise plusieurs motifs de clignotement pour informer l'utilisateur sur lefonctionnement interne de la plateforme.

Motif de la LED Description

Éteinte À l'arrêt. Vérifier interrupteur RunApp (ou le fichierboot.py) puis presser Reset pour redémarrer.À noter que la LED est également éteinte après l'arrêt del'objet.

Allumée (après démarrage) Début d'exécution (dans le script main.py, juste après letest RunApp).

Heartbeat Allumée fixe avec une extinction de 200 ms toutes les 10secondes.En cours de fonctionnement.

Erreur Successions de clignotements rapides entrecoupés deséquences de clignotements lents.Le nombre de clignotements lents (de 1 à 6) indique un coded'erreur.En cas d'erreur, l'ESP8266 est redémarré automatiquement(machine.reset()) après une heure.Voir détail des codes d'erreurs ci-dessous.

Erreur 1 MQTTClient retourne un code d'erreur, code renvoyé par lebroker MQTT.

Page 17: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

227Les objets ESP8266

1.3 Les topics MQTTLes topics MQTT et publications des informations sont détaillés dans le chapitre de la mise enplace du broker MQTT, cf. Le broker MQTT – Topics du projet.

Erreur 2 Erreur lors de la connexion MQTT. Vérifier les constantesMQTT_SERVER, MQTT_USE, MQTT_PSWD.Le contenu du message d'exception est renvoyé sur laconsole REPL.

Erreur 3 Erreur durant le chargement des bibliothèques senseurs.Vérifier la présence des différentes bibliothèques néces-saires et le fait qu'elles se chargent en mémoire sans erreur(par ex. en chargeant la bibliothèque dans une sessionREPL).Le contenu du message d'exception est renvoyé sur laconsole REPL.

Erreur 4 Erreur durant la création des objets destinés à la lecture desdifférents senseurs.Le contenu du message d'exception est renvoyé sur laconsole REPL.

Erreur 5 Erreur durant la publication de l'adresse MAC sur le topicconnect/<clientID> lors du démarrage de l'objet.Le contenu du message d'exception est renvoyé sur laconsole REPL.

Erreur 6 Erreur durant le traitement des tâches (capture de donnéessur les senseurs et publication MQTT).Le contenu du message d'exception est renvoyé sur laconsole REPL.

Motif de la LED Description

Page 18: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

228

© E

diti

ons

EN

I - A

ll ri

ghts

res

erve

d

Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

1.4 Télécharger et préparer le code des objets IoTLe code source des différents objets IoT est disponible sur le dépôt GitHub du projet : https://github.com/mchobby/la-maison-pythonic

Une copie des sources est également disponible dans les ressources de cet ouvrage.

Les sources peuvent être facilement téléchargées sur le Raspberry Pi à l'aide de l'utilitaire git.

cd ~git clone https://github.com/mchobby/la-maison-pythonic.git

Un nouveau répertoire la-maison-pythonic est disponible dans le répertoire utilisateur(/home/pi). Ce dernier contient les sources des différents objets dans le sous-répertoireesp8266. Le répertoire esp8266 contient lui-même un sous-répertoire par objet.

Par exemple, le code destiné à la cabane est disponible dans le répertoire /home/pi/la-maison-pythonic/esp8266/cabane/.

Code source de l'objet Cabane tel que disponible sur GitHub

Le script principal est bien entendu main.py, mais d'autres versions sont également dispo-nibles comme test.py permettant de tester les senseurs et main_simple.py proposantune version intermédiaire, mais simplifiée, du code.

Bootstrap.shLe fichier bootstrap.sh permet de télécharger les dépendances (les bibliothèques Python)de l'objet cabane. Les bibliothèques des senseurs sont publiées sur un autre dépôt GitHub, lefichier bootstrap.sh fait le nécessaire pour les rapatrier dans le répertoire courant. Cesfichiers devront aussi être copiés sur l'ESP8266.

Page 19: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

229Les objets ESP8266

Contenu du fichier bootstrap de l'objet cabane

Pour télécharger les dépendances :

Si le dépôt GitHub a été cloné dans le répertoire utilisateur alors les dépendances (biblio-thèques) peuvent être téléchargées comme suit :

cd ~/la-maison-pythonic/esp8266/cabane/./bootstrap.sh

1. Ouvrir un terminal.

2. Se placer dans le répertoire cabane.

3. Exécuter le script boostrap.sh.

Page 20: Python, Raspberry Pi Flask - fnac-static.com€¦ · Python, Raspberry Pi et Flask quelques rudiments sur le langage Python et en Données télémétriques et tableaux de bord web

230

© E

diti

ons

EN

I - A

ll ri

ghts

res

erve

d

Python, Raspberry Pi et Flask - Données télémétriques et tableaux de bord web

Téléchargement des bibliothèques

2. Fonctionnement général d’un objet IoT

Tous les scripts des différents objets développés dans ce chapitre suivent une même structurede code.

Le code ci-dessous reprend la structure générale d'un objet.

01: # coding: utf8 02: """ La Maison Pythonic - Object Cabane v0.2 03: 04: Envoi des données toutes les heures + 30 minutes 05: vers serveur MQTT 06: """ 07: 08: from machine import Pin, I2C, reset 09: from time import sleep, time 10: from ubinascii import hexlify 11: from network import WLAN 12: 13: CLIENT_ID = 'cabane' 14: MQTT_SERVER = "192.168.1.210" 15: 16: # Mettre à None si pas utile 17: MQTT_USER = 'pusr103' 18: MQTT_PSWD = '21052017' 19: 20: # redémarrage auto après erreur 21: ERROR_REBOOT_TIME = 3600 # 1 h = 3600 sec 22: 23: # --- Démarrage conditionnel --- 24: runapp = Pin( 12, Pin.IN, Pin.PULL_UP )