Table des matières

Matériel utilisé

1. Raspberry Pi

2. Feather ESP8266 Huzzah

3. Module relais

4. DHT11 - Humidité

5. AM2315 - Température et humidité

6. DS18B20 - Température

7. BME280 et BMP280 - Pression, humidité, température

8. TSL2561 - Luminosité

9. ADS1115 - Lecture analogique

10. TMP36 - Température

11. Photorésistance - luminosité

12. PIR - Détection de mouvement

13. Contact magnétique

14. Senseur à effet Hall numérique

Code source

1. Téléchargement

2. GitHub

Configuration

1. Installation du Raspberry Pi

2. Utilitaires : des outils pour travailler

a. Connexion SSH

b. Éditeur de texte Nano

c. Transfert de fichiers via SSH (sftp)

d. Système de fichiers SSH

e. Bureau à distance

Type de données collectées

Présentation et concepts

1. Le broker MQTT, élément central du réseau MQTT

2. Les éléments de MQTT

3. Le broker MQTT

4. Les topics

5. Les publishers

6. Les subscribers

7. Le ClientId

Les topics en détail

1. Contenu du message

a. Le message selon MQTT

b. En marge du standard

2. Création de topic et bonnes pratiques

3. Les topics système

Topics du projet

QoS du projet

Sécurité

Configurer le login du broker MQTT

1. Modifier la configuration

2. Tester la configuration

MQTT en Python

1. test-mqtt-client-sub.py

2. test-mqtt-client-pub.py

3. Documentation complémentaire

MQTT en MicroPython

Présentation de l’ESP8266

1. Les possibilités offertes par l’ESP8266

2. Les plateformes ESP8266 populaires

3. Programmer un ESP8266

4. Feather Huzzah ESP8266 en détail

5. Brochage du Feather Huzzah ESP8266

a. Alimentation

b. Port série

c. Broches d’entrée/sortie

d. Entrée analogique

e. Les autres broches

Charger le firmware MicroPython

1. Identifier le firmware MicroPython

2. Préparatifs

3. Reflasher l’ESP8266

Prise de contrôle

1. Communiquer avec MicroPython

2. Communiquer avec un ESP8266 sous MicroPython

3. REPL : l’invite de commandes MicroPython

4. RShell

5. Ampy

WebREPL

1. Le démon WebREPL

a. Activer WebREPL sur l’ESP8266

b. Le mot de passe WebREPL

2. Client WebREPL

Nom d’hôte et adresse MAC

Le mode point d’accès (AP)

Le mode station (STA)

1. Mode STA et scan réseau

2. Réseau Wi-Fi visible ou masqué

3. Connexion en mode STA

4. WebREPL en mode STA

5. Désactivation du point d’accès

6. Rechercher l’adresse IP d’un ESP8266

Séquence de démarrage MicroPython

1. Fichier boot.py

2. Fichier main.py

3. Un fichier boot.py pour ESP8266

a. Script trop optimiste et conséquences

b. RunApp - Activation de l’application

c. Un script de boot avancé

Programmer

1. Création d’une bibliothèque

2. Les bibliothèques MicroPython

a. Bibliothèques standards et microbibliothèques

b. Bibliothèques spécifiques à MicroPython

c. Bibliothèque spécifique à l’ESP8266

d. Autres bibliothèques MicroPython

e. Mécanisme de chargement d’une bibliothèque

3. Charger et exécuter un script à la volée

4. RunApp : exécution conditionnelle de main.py

5. Entrées/sorties sur ESP8266

a. Entrée numérique

b. Entrée numérique (pull-up interne)

c. Entrée numérique et déparasitage logiciel

d. Sortie numérique

e. Entrée analogique

f. Ajout d’entrée/sortie avec MCP23017

g. Lecture analogique avec l’ADS1115

6. Senseur et interface sur ESP8266

a. Senseur PIR - senseur de proximité

b. Contact magnétique

c. DHT11 - humidité

d. Senseur à effet Hall

e. TSL2561 - luminosité

f. BME280 - température, humidité et pression barométrique

g. Module relais

MQTT sous ESP8266

1. Publication MQTT sous MicroPython

2. Souscription MQTT sous MicroPython

Asyncio sur ESP8266

1. Asyncio en quelques mots

2. Asyncio par l’exemple

3. Fonction run_every pour Asyncio

4. Plus d’informations sur Asyncio

Informations pratiques

1. Prérequis et configurations

2. LED de statut

3. Les topics MQTT

4. Télécharger et préparer le code des objets IoT

Fonctionnement général d’un objet IoT

1. Principales sections

2. Paramètres d’un objet IoT

3. RunApp et la LED d’activité

4. La fonction led_error()

5. Les tâches et fonctions asynchrones des objets IoT

Objet 1 : Météo cabane de jardin

1. Schéma de raccordement

2. Téléverser les scripts

3. Fonctionnement du script

4. Tester l’objet

Objet 2 : Surveillance salon

1. Téléverser les scripts

2. Fonctionnement du script

3. La fonction capture_1h()

4. Senseur PIR - variables et utilisation

5. Senseur PIR - la fonction pir_activated

6. Senseur PIR - la fonction pir_alert

7. Senseur PIR - la fonction pir_update

8. Problèmes de concurrence

9. Tester l’objet

Objet 3 : Surveillance de la véranda

1. Téléverser les scripts

2. Fonctionnement du script

3. La fonction capture_1h()

4. La fonction check_contact()

5. La fonction check_ldr()

6. Tester l’objet

Objet 4 : Chaufferie

1. Téléverser les scripts

2. Fonctionnement du script

3. La fonction capture_1h()

4. La fonction capture_10m()

5. La fonction check_mqtt_sub()

6. La fonction sub_cb()

7. La fonction chaud_exec_cmd()

8. Tester l’objet

Dépannage d’un objet IoT

Introduction

1. Pourquoi utiliser une base de données ?

2. Quel moteur de base de données ?

3. Principe de fonctionnement de push-to-db

SQLite 3

1. Présentation

2. Classe de stockage, type de données et affinité

a. Classe de stockage

b. Stockage des date et heure

c. Affinité de type pour les colonnes

d. Résolution de l’affinité de type

3. Affinité, expressions, comparaison et tri

a. Affinité des expressions

b. Comparaison, tri et groupage

4. Clé primaire et auto-incrément

a. Définir une clé primaire

b. Table rowid et clé primaire

5. SQLite3 et accès concurrents

6. Installation

a. Installer SQLite 3

b. Installer le support Python

7. Premiers pas avec SQLite3

a. Documentation SQL pour SQLite

b. Commandes de l’interpréteur SQLite

8. SQLite et Python

a. Opération de lecture SQLite

b. Opération d’insertion SQLite

c. Row Factory de SQLite

Approches techniques de push-to-db

1. Approche base de données de push-to-db

a. topicmsg - dernier message reçu

b. ts_xxx - historique de messages

2. Approche logicielle de push-to-db

a. Diagramme des classes (partie 1)

b. Fichier de configuration de push-to-db

c. Diagramme des classes (partie 2)

Configuration de push-to-db

1. Les répertoires de stockage de push-to-db

2. Création des tables de push-to-db

3. push-to-db.ini

4. Le script d’installation de push-to-db

Logger Python

1. Logger et fichier de configuration

2. Configuration du logger

3. Utilisation du logger

Exécution du script push-to-db

Service systemd pour push-to-db

1. Quand démarrer le service ?

2. Créer le fichier Unit

3. Configurer, démarrer, contrôler

4. Documentation sur systemd

Améliorations

Présentation de Flask

1. Pourquoi Flask ?

2. La flexibilité de Flask

3. Les nombreuses extensions Flask

4. Flask plus en détails

a. Werkzeug

b. WSGI

c. Application Flask

d. Jinja

e. Base de données

5. Documentations

Anatomie d’un projet Flask

Installation et prise en main

1. L’utilitaire flask

2. Prise en main avancée

3. Déboguer avec Flask

4. Application Flask en production

Les fondamentaux de Flask

1. Routes et paramètres

2. Retourner une erreur

3. Utilisation de template

4. Création d’URL

5. Redirection

6. Requêtes GET et POST

7. Contexte applicatif

a. L’objet g

b. Connexion à la base de données

8. Les cookies

9. Les sessions

10. Journalisation

11. Mini-projet Fruits

a. Sources du mini-projet

b. La connexion SQLite 3

c. Organisation du mini-projet

d. Détails du mini-projet

12. Ressources et documentations

Templates Jinja

1. Exécution d’un template

2. Tester un template

a. Créer une application Flask

b. Test avec serveur web Flask et string Python

c. Test en console et string Python

d. Utiliser le projet Jinja Live Parser

3. Évaluation des balises

a. {{ … }} : évaluation d’expression

b. {% … %} : instructions de contrôle de flux

c. {# … #} : insertion de commentaire

d. # …  : ligne d’instruction

4. Variables et expressions

a. Variables spéciales

b. Séquence d’échappement

c. Assignation

5. Branchement

6. Itération

7. Les macros

8. Contrôle des espaces

9. Filtres Jinja

10. Inclusion de template

11. Importer des macros

12. Héritage de template

a. Les éléments de l’héritage

b. Heritage-app : l’héritage Jinja par la pratique

c. Template de base et block

13. Template enfant

a. Super bloc

b. Ressources

14. Message Flash

Présentation

1. Préambule

2. Dépôt du projet Dashboard

3. Éléments principaux

4. Fonctionnalités du projet Dashboard

Structure HTML

1. Disposition de la page

2. Les blocs d’informations

3. La liste

Template Jinja

1. Le template de base

2. Utilisation du template de base

Configuration

1. Base de données dashboard.db

a. Schéma de la base de données

b. Répertoire de stockage

c. Création des tables de Dashboard

d. Copie de la base de données

2. Fichier de configuration de Dashboard

Détails de l’application Flask

1. Répertoires et fichiers

2. Les routes de Dashboard

3. Accès aux données

a. La fonction get_db( db_key ) multi bases de données

b. Les classes DBHelper de Dashboard

c. Exemple : liste des topics disponibles pour Dashboard

d. Exemple : extraction de l’historique dans Dashboard

e. Affichage d’un tableau de bord

4. Les filtres Jinja personnalisés

5. Affichage du tableau de bord

6. Les macros Jinja

a. La macro make_block

b. La macro block_icon

c. La macro block_big_text

d. La macro select_color (édition d’un bloc)

Bloc switch (marche/arrêt)

1. Développements complémentaires

a. MQTT sources

b. Bloc et paramètres additionnels

2. Ajout du bloc SWITCH

a. Block_config du switch

b. Ajouter le nouveau type de bloc

3. Le switch et MQTT

a. Client MQTT JavaScript

b. MQTT en JavaScript et WebSocket

c. Activer le support WebSocket sur Mosquitto

d. Tester le client MQTT JavaScript

e. Mille milliards de mille sabords !

f. La route MqttProxyPublish

g. Événement on_switch_change

4. Tester le bloc switch

Améliorations

Installation rapide

1. Prérequis

2. Début de l’installation

3. Récupération des sources

4. Poursuivre l’installation

 

Matériel utilisé

La liste ci-dessous reprend différents éléments exploités dans le projet ou dans l’ouvrage. Chaque élément est accompagné d’une petite description.

1. Raspberry Pi

images/01RI03.pngimages/01RI03.png
 

Raspberry Pi 3

Le Raspberry Pi est certainement le nano-ordinateur le plus célèbre du monde.

À peine plus grand qu’une carte de crédit, le Raspberry Pi est un formidable outil d’apprentissage et une excellente base pour le développement de solutions amateur et semi-professionnelles.

Propulsé par 4 cœurs à 1 GHz, 1 gigaoctet de RAM et Linux, le Raspberry Pi dispose d’interfaces Wi-Fi et Bluetooth, de 4 ports USB, d’une interface Ethernet et d’un GPIO à 40 broches permettant de brancher une multitude de périphériques et de matériels électroniques.

2. Feather ESP8266 Huzzah

images/01RI04.pngimages/01RI04.png
 

Feather ESP8266 Huzzah

L’ESP8266 est un microcontrôleur Wi-Fi et probablement la plateforme la plus célèbre après l’Arduino UNO (la référence en programmation de microcontrôleurs dans le monde des makers). 

L’ESP8266 basé sur le module ESP12S se retrouve sur de nombreuses plateformes de développement comme Feather, Wemos, NodeMCU. C’est la version Feather ESP8266 d’Adafruit Industries qui a été sélectionnée dans cet ouvrage. Adafruit Industries dispose d’un large réseau de distribution et de produits fiables. Le module Feather exploite un module ESP certifié et les cartes restent identiques d’une livraison à l’autre (ce qui n’est pas forcément le cas des produits directement commandés en Chine). Autre point important, cette version Feather de l’ESP8266 dispose d’un auto-reset pour activer le mode flash sans avoir à manipuler de bouton.

Feather est également un écosystème de cartes et d’extensions plus intéressantes les unes que les autres. La gamme Feather d’Adafruit est accessible directement sur : https://www.adafruit.com/category/943

Hormis des produits de qualité, Adafruit Industries dispose d’une grande communauté et d’un excellent support technique.

3. Module relais

images/01RI05.pngimages/01RI05.png
 

Les modules relais pré-assemblés permettent de commander facilement des objets de notre quotidien. Ils agissent comme des interrupteurs commandés par un microcontrôleur ou un nano-ordinateur.

 

Si le module relais permet de travailler facilement avec des appareils connectés sur le réseau domestique, il est important de mentionner que l’utilisation d’une tension supérieure à 30 V peut devenir extrêmement dangereuse. Les risques d’électrocution sont réels et peuvent, dans certains cas, conduire à un arrêt cardiaque ! La manipulation de circuits haute tension, y compris du réseau domestique, doit être réservée aux personnes disposant du savoir-faire adéquat.

4. DHT11 - Humidité

images/01RI06.pngimages/01RI06.png
 

Senseur d’humidité DHT11

Le DHT11 est un senseur d’humidité très bon marché souvent utilisé par les makers. Il permet de relever l’humidité relative entre 20 et 80 %. Le senseur mesure la température pour ajuster les mesures effectuées, information également fournie par le senseur. À noter que l’humidité relative dépend de la température, car l’air peut emmagasiner plus d’humidité si la température augmente.

 

Le vieillissement de ce type de senseur est une caractéristique méconnue par ses utilisateurs. En effet, la mesure de l’humidité est réalisée par un effet capacitif, ce qui implique qu’une partie du senseur doit être en contact avec l’air ambiant. Il y a donc des phénomènes d’oxydation qui entrent en compte et qui provoquent le vieillissement du senseur.

5. AM2315 - Température et humidité

images/01RI07.pngimages/01RI07.png
 

Senseur AM2315

Le senseur AM2315 fonctionne de façon similaire au DHT11 à la différence que celui-ci offre un relevé entre 0 et 100 % d’humidité relative et embarque également un senseur de température numérique. À placer à l’abri des intempéries (il n’est pas weather proof), ce senseur peut effectuer des relevés en extérieur.

6. DS18B20 - Température

images/01RI08.pngimages/01RI08.png
 

Senseur DS18B20

Le senseur DS18B20 est un senseur numérique utilisant un bus de données 1-Wire qui permet de placer plusieurs senseurs sur un même bus. Le DS18B20 est populaire dans le monde des makers et régulièrement exploité dans le monde professionnel. Ce composant est utilisé sur une grande variété de plateformes. Disponible sous forme d’un composant brut ressemblant à un transistor, le DS18B20 est également distribué sous forme de sonde (dans un capuchon en inox) permettant de relever la température en de nombreux endroits.

7. BME280 et BMP280 - Pression, humidité, température

images/01RI90.pngimages/01RI90.png
 

Senseur BME280 en breakout

images/01RI91.pngimages/01RI91.png
 

Senseur BMP280 en breakout

Le BMP280 est un senseur environnemental permettant de relever la température et la pression atmosphérique. C’est donc un composant idéal pour réaliser des relevés météorologiques.

Le BME280 est une évolution du BMP280 permettant, en plus, de faire un relevé d’humidité relative.

8. TSL2561 - Luminosité

images/01RI93.pngimages/01RI93.png
 

Senseur TSL2561 en breakout

Le TSL2561 permet d’effectuer un relevé de luminosité mesuré en Lux. Le TSL2561 utilise un double senseur interne autorisant un relevé du spectre entier et du spectre infrarouge. Ce senseur dispose donc des informations adéquates pour être capable de fournir une réponse proche de celle de l’œil humain.

9. ADS1115 - Lecture analogique

images/01RI94.pngimages/01RI94.png
 

Convertisseur ADC ADS1115 en breakout

L’ADS1115 est un convertisseur analogique vers numérique, ce qui lui permet de lire des tensions analogiques. L’ADS1115 dispose d’un amplificateur à gain programmable, ce qui permet à la carte de lire de très faibles tensions. L’ADS1115 propose des relevés d’une excellente précision et supporte également un mode différentiel permettant de lire la différence de tension entre deux broches du convertisseur.

L’ADS1115 est un composant idéal pour offrir des entrées analogiques à un Raspberry Pi ou un ESP8266. Sur un Arduino, il offrira des entrées analogiques avec une bien meilleure précision que celle offerte par le microcontrôleur Atmel.

10. TMP36 - Température

images/01RI96.pngimages/01RI96.png
 

Senseur TMP36

Le TMP36 est un senseur de température analogique bon marché et très populaire dans le monde Arduino. Ce composant fournit une tension analogique proportionnelle à la température. Le TMP36 s’utilise conjointement avec un ADS1115 sur un Raspberry Pi ou un ESP8266.

11. Photorésistance - luminosité

images/01RI97.pngimages/01RI97.png
 

Photorésistance

La photorésistance, également appelée LDR, est un composant dont la résistance varie en fonction des conditions de luminosité. Un tel composant n’offre pas de mesure précise, mais permet de relever des conditions de luminosité relatives. Il peut être utilisé pour savoir si la lumière est allumée dans une pièce, s’il fait jour ou nuit ou toute autre mesure impliquant une forte modification des conditions de luminosité.

12. PIR - Détection de mouvement

images/01RI98.pngimages/01RI98.png
 

Senseur PIR

Le senseur PIR est utilisé pour réaliser la détection de mouvement. Celui employé dans cet ouvrage est un senseur autonome avec sortie numérique. Ce modèle est très simple à utiliser, il active une sortie pendant plusieurs secondes lorsqu’un mouvement est détecté. Un tel senseur est généralement équipé de deux potentiomètres : un premier potentiomètre permet de régler la sensibilité du senseur tandis que le deuxième potentiomètre règle le temps d’activation de la sortie numérique.

13. Contact magnétique

images/01RI99.pngimages/01RI99.png
 

Contact magnétique

Le contact magnétique est composé de deux éléments : un interrupteur reed (sensible au champ magnétique) et un aimant. Lorsque l’aimant s’éloigne, l’interrupteur magnétique s’ouvre, ce qui permet d’interrompre un circuit électrique. Lorsque l’aimant revient près de l’interrupteur alors celui-ci se referme.

Les contacts magnétiques sont utilisés pour détecter l’ouverture d’une porte, d’un tiroir, d’une cache secrète, etc.

14. Senseur à effet Hall numérique

images/01RI95.pngimages/01RI95.png
 

Senseur à effet Hall

Le senseur à effet Hall permet de détecter la présence d’un champ magnétique. Ce senseur existe avec une sortie analogique ou une sortie numérique. Un senseur analogique permet de faire des relevés d’intensité de champ magnétique (hors cadre du présent ouvrage) tandis que le senseur numérique permet de relever la présence (ou l’absence) du champ magnétique.

Le senseur à effet Hall numérique s’utilise généralement avec un aimant et permet de réaliser des interrupteurs sans contact. Il est ainsi possible de réaliser une fin de course avec un aimant, un compte tour, un détecteur de niveau d’eau en plaçant l’aimant sur un flotteur, un détecteur sans contact (très pratique pour détecter l’ouverture d’une poubelle) ou un interrupteur masqué. 

Code source

1. Téléchargement

Le code source du projet est disponible sous forme d’une archive depuis la page Informations générales.

Cette archive contient une version figée du projet dans l’état où il était au moment de l’édition du présent ouvrage.

images/01RI09.pngimages/01RI09.png
 

L’archive contenant le code source

Cette version correspond scrupuleusement aux explications disponibles dans l’ouvrage.

L’archive peut être extraite dans le répertoire utilisateur du Raspberry Pi (soit /home/pi/) à l’aide de la commande :

unzip -e LFPYRASPFL.zip

2. GitHub

Le projet a entièrement été développé dans le dépôt la-maison-pythonic disponible sur GitHub. Ce projet connaîtra certainement d’autres évolutions après la parution de l’ouvrage.

Durant la lecture de l’ouvrage, il est recommandé d’utiliser l’archive disponible depuis la page Informations générales.

Après la lecture de l’ouvrage, le lecteur pourra profiter des dernières avancées en téléchargeant la version disponible sur GitHub.

La version GitHub est disponible ici : https://github.com/mchobby/la-maison-pythonic

images/01RI10.pngimages/01RI10.png
 

GitHub du projet « la-maison-pythonic »

Le contenu du GitHub peut être cloné sur le Raspberry Pi avec la commande :

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

images/01RI11.pngimages/01RI11.png
 

Clonage du projet GitHub sur le Raspberry Pi

Configuration

Ce livre utilise un Raspberry Pi comme élément central du développement. Sa configuration est donc un point important.

Pour simplifier les étapes de configuration, le Raspberry Pi sera démarré avec un système d’exploitation Raspbian (Linux) pleinement fonctionnel et donc avec un environnement de bureau, ce qui est plus confortable pour les nouveaux venus.

Cela étant, tout au long du livre, la ligne de commande et la connexion SSH seront surtout exploitées. SSH permet de disposer d’une ligne de commande sur le Raspberry Pi depuis un ordinateur distant.

1. Installation du Raspberry Pi

Préparer la carte micro SD

Flasher la carte micro SD avec le système d’exploitation Raspbian Stretch (ou plus récent). Le système d’exploitation peut être téléchargé depuis le site de la fondation Raspberry Pi (https://www.raspberrypi.org). Pour flasher la carte SD, le logiciel Etcher (https://etcher.io/) est un excellent outil libre fonctionnant sur les systèmes d’exploitation Linux, Windows et macOS.