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...
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 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 les microcontrôleurs ESP8266 et ESP32 programmés 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.
En marge d'une solution Python, les objets ESP et le broker MQTT peuvent également être réutilisés avec InfluxDB et Grafana. Le lecteur découvrira alors InfluxDB, une base de données TimeSeries optimisée pour la capture de gros volumes de données en temps réel. Le greffon Telegraph permettra de capturer les données envoyées sur le broker MQTT pour les injecter dans InfluxDB. Enfin, l'outil Grafana permettra de consulter ces données sous forme de graphiques et visualisations attrayants.
À 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.
6.9 BME280 et BMP280 - Pression, humidité, température
6.10 TSL2561 - Luminosité
6.11 ADS1115 - Lecture analogique
6.12 TMP36 - Température
6.13 Photorésistance - Luminosité
6.14 PIR - Détection de mouvement
6.15 Contact magnétique
6.16 Capteur à effet Hall numérique
6.17 CCS811 - Mesure de CO2
6.18 Capteur de courant non invasif
7. Code source
7.1 Téléchargement
7.2 GitHub
8. Configuration
8.1 Installation du Raspberry Pi
8.2 Utilitaires : des outils pour travailler
8.2.1 Connexion SSH
8.2.2 Éditeur de texte Nano
8.2.3 Transfert de fichiers via SSH (sftp)
8.2.4 Système de fichiers SSH
8.2.5 Bureau à distance
9. Type de données collectées
Le broker MQTT
1. Présentation et concepts
1.1 Le broker MQTT, élément central du réseau MQTT
1.2 Les éléments de MQTT
1.3 Le broker MQTT
1.4 Les topics
1.5 Les publishers
1.6 Les subscribers
1.7 Le ClientId
2. Révisions de MQTT
3. Les topics en détail
3.1 Contenu du message
3.1.1 Le message selon MQTT
3.1.2 En marge du standard
3.2 Création de topic et bonnes pratiques
3.3 Les topics système
4. Souscription et expression de filtrage
4.1 Expression de filtrage sans joker
4.2 Le joker de niveau
4.3 Le joker multiniveau
5. Les qualités de service MQTT
5.1 Les niveaux de qualité
5.1.1 QoS 0 : une fois maximum
5.1.2 QoS 1 : au moins une fois
5.1.3 QoS 2 : exactement une fois
5.2 Rétrogradation de QoS
5.3 Quel QoS utiliser et quand ?
6. La rétention de messages
7. Les clients persistants
8. Message testament
9. Quel broker MQTT ?
10. Installation de Mosquitto
10.1 Mise à jour
10.2 Installation
11. Test avec Mosquitto.org
11.1 La souscription
11.2 La publication
11.3 Tester le broker MQTT du Raspberry Pi
12. Topics du projet
13. QoS du projet
14. Sécurité
15. Configurer le login du broker MQTT
15.1 Modifier la configuration
15.2 Tester la configuration
16. MQTT en Python
16.1 test-mqtt-client-sub.py
16.2 test-mqtt-client-pub.py
16.3 Documentation complémentaire
17. MQTT en MicroPython
ESP8266 et ESP32 sous MicroPython
1. Présentation des ESP
1.1 Les possibilités offertes par ESP
1.2 Les plateformes ESP populaires
1.2.1 Les plateformes ESP8266
1.2.2 Les plateformes ESP32
1.3 Programmer un ESP
1.4 Feather Huzzah ESP8266 et ESP32 en détail
1.5 Brochage des Feather Huzzah ESP8266 et ESP32
1.5.1 Alimentation
1.5.2 Port série
1.5.3 Broches d'entrée/sortie
1.5.4 Les autres broches
2. Charger le firmware MicroPython
2.1 Identifier le firmware MicroPython
2.2 Préparatifs
2.3 Reflasher un ESP
3. Prise de contrôle
3.1 Communiquer avec MicroPython
3.2 Communiquer avec un ESP sous MicroPython
3.3 REPL : l'invite de commandes MicroPython
3.4 RShell
3.5 Ampy
4. WebREPL
4.1 Le démon WebREPL
4.1.1 Activer WebREPL sur l'ESP
4.1.2 Le mot de passe WebREPL
4.2 Le client WebREPL
5. Nom d'hôte et adresse MAC
6. Le mode point d'accès (AP)
7. Le mode station (STA)
7.1 Mode STA et scan réseau
7.2 Réseau Wi-Fi visible ou masqué
7.3 Connexion en mode STA
7.4 WebREPL en mode STA
7.5 Désactivation du point d'accès
7.6 Rechercher l'adresse IP d'un ESP
8. Séquence de démarrage MicroPython
8.1 Fichier boot.py
8.2 Fichier main.py
8.3 Un fichier boot.py pour ESP
8.3.1 Script trop optimiste et conséquences
8.3.2 RunApp - Activation de l'application
8.3.3 Un script de boot avancé
9. Programmer
9.1 Création d'une bibliothèque
9.2 Les bibliothèques MicroPython
9.2.1 Bibliothèques standards et microbibliothèques
9.2.2 Bibliothèques spécifiques à MicroPython
9.2.3 Bibliothèque spécifique à l'ESP
9.2.4 Autres bibliothèques MicroPython
9.2.5 Mécanisme de chargement d'une bibliothèque
9.3 Charger et exécuter un script à la volée
9.4 RunApp : exécution conditionnelle de main.py
9.5 Entrées/sorties sur ESP
9.5.1 Entrée numérique
9.5.2 Entrée numérique (pull-up interne)
9.5.3 Entrée numérique et déparasitage logiciel
9.5.4 Sortie numérique
9.5.5 Entrée analogique sur ESP8266
9.5.6 Entrées analogiques sur ESP32
9.5.7 Ajout d'entrée/sortie avec MCP23017
9.5.8 Lecture analogique avec l'ADS1115
9.6 Capteur et interface sur ESP
9.6.1 Capteur PIR - capteur de proximité
9.6.2 Contact magnétique
9.6.3 DHT11 - humidité
9.6.4 Capteur à effet Hall
9.6.5 TSL2561 - luminosité
9.6.6 TSL2591 - luminosité
9.6.7 BME280 - température, humidité et pression barométrique
9.6.8 CCS811 - capteur de qualité d’air
9.6.9 MOD-ENV - capteur environnemental
9.6.10 Module relais
9.6.11 OLED FeatherWing - afficheur OLED
10. MQTT sous ESP
10.1 Publication MQTT sous MicroPython
10.2 Souscription MQTT sous MicroPython
11. Asyncio sur ESP
11.1 Asyncio en quelques mots
11.2 Installer Asyncio
11.3 Asyncio par l'exemple
11.4 Fonction run_every pour Asyncio
11.5 Plus d'informations sur Asyncio
12. Abstraction matérielle ESP8266/ESP32
12.1 Abstraction du bus I2C
12.2 Abstraction de la LED utilisateur
Les objets ESP
1. Informations pratiques
1.1 Prérequis et configurations
1.2 LED de statut
1.3 Les topics MQTT
1.4 Télécharger et préparer le code des objets IoT
2. Fonctionnement général d’un objet IoT
2.1 Principales sections
2.2 Paramètres d’un objet IoT
2.3 RunApp et LED d'activité
2.4 La fonction led_error()
2.5 Les tâches et fonctions asynchrones des objets IoT
3. Objet 1 : Météo cabane de jardin
3.1 Schéma de raccordement
3.2 Téléverser les scripts
3.3 Fonctionnement du script
3.4 Tester l'objet
4. Objet 1a : Cabane complément
4.1 Schéma de raccordement
4.2 Téléverser les scripts
4.3 Fonctionnement du script
5. Objet 2 : Surveillance salon
5.1 Téléverser les scripts
5.2 Fonctionnement du script
5.3 La fonction capture_1h()
5.4 Capteur PIR - variables et utilisation
5.5 Senseur PIR - la fonction pir_activated
5.6 Capteur PIR - la fonction pir_alert
5.7 Capteur PIR - la fonction pir_update
5.8 Problèmes de concurrence
5.9 Tester l'objet
6. Objet 3 : Surveillance de la véranda
6.1 Téléverser les scripts
6.2 Fonctionnement du script
6.3 La fonction capture_1h()
6.4 La fonction check_contact()
6.5 La fonction check_ldr()
6.6 Tester l'objet
7. Objet 4 : Chaufferie
7.1 Téléverser les scripts
7.2 Fonctionnement du script
7.3 La fonction capture_1h()
7.4 La fonction capture_10m()
7.5 La fonction check_mqtt_sub()
7.6 La fonction sub_cb()
7.7 La fonction chaud_exec_cmd()
7.8 Tester l'objet
8. Objet 5 : Commande de chaufferie
8.1 Téléverser les scripts
8.2 Fonctionnement du script
8.3 Gestion du changement d’état
8.4 Réception des données MQTT
9. Objet 5 : Surveillance environnementale
9.1 Téléverser les scripts
9.2 Fonctionnement du script
9.3 La fonction capture_5min()
9.4 Tester l’objet
10. Dépannage d’un objet IoT
Persistance des données
1. Introduction
1.1 Pourquoi utiliser une base de données ?
1.2 Quel moteur de base de données ?
1.3 Principe de fonctionnement de push-to-db
2. SQLite 3
2.1 Présentation
2.2 Classe de stockage, type de données et affinité
2.2.1 Classe de stockage
2.2.2 Stockage des date et heure
2.2.3 Affinité de type pour les colonnes
2.2.4 Résolution de l'affinité de type
2.3 Affinité, expressions, comparaison et tri
2.3.1 Affinité des expressions
2.3.2 Comparaison, tri et groupage
2.4 Clé primaire et auto-incrément
2.4.1 Définir une clé primaire
2.4.2 Table rowid et clé primaire
2.5 SQLite 3 et accès concurrents
2.6 Installation
2.6.1 Installer SQLite 3
2.6.2 Installer le support Python
2.7 Premiers pas avec SQLite 3
2.7.1 Documentation SQL pour SQLite
2.7.2 Commandes de l'interpréteur SQLite
2.8 SQLite et Python
2.8.1 Opération de lecture SQLite
2.8.2 Opération d'insertion SQLite
2.8.3 Row Factory de SQLite
3. Approches techniques de push-to-db
3.1 Approche base de données de push-to-db
3.1.1 topicmsg - dernier message reçu
3.1.2 ts_xxx - historique de messages
3.2 Approche logicielle de push-to-db
3.2.1 Diagramme des classes (partie 1)
3.2.2 Fichier de configuration de push-to-db
3.2.3 Diagramme des classes (partie 2)
4. Configuration de push-to-db
4.1 Les répertoires de stockage de push-to-db
4.2 Création des tables de push-to-db
4.3 push-to-db.ini
4.4 Le script d'installation de push-to-db
5. Logger Python
5.1 Logger et fichier de configuration
5.2 Configuration du logger
5.3 Utilisation du logger
6. Exécution du script push-to-db
7. Service systemd pour push-to-db
7.1 Quand démarrer le service ?
7.2 Créer le fichier Unit
7.3 Configurer, démarrer, contrôler
7.4 Documentation sur systemd
8. Améliorations
Développement web en Python
1. Présentation de Flask
1.1 Pourquoi Flask ?
1.2 La flexibilité de Flask
1.3 Les nombreuses extensions Flask
1.4 Flask plus en détail
1.4.1 Werkzeug
1.4.2 WSGI
1.4.3 Application Flask
1.4.4 Jinja
1.4.5 Base de données
1.5 Documentations
2. Anatomie d'un projet Flask
3. Installation et prise en main
3.1 L'utilitaire flask
3.2 Prise en main avancée
3.3 Déboguer avec Flask
3.4 Application Flask en production
4. Les fondamentaux de Flask
4.1 Routes et paramètres
4.2 Retourner une erreur
4.3 Utilisation de template
4.4 Création d'URL
4.5 Redirection
4.6 Requêtes GET et POST
4.7 Contexte applicatif
4.7.1 L'objet g
4.7.2 Connexion à la base de données
4.8 Les cookies
4.9 Les sessions
4.10 Journalisation
4.11 Mini-projet Fruits
4.11.1 Sources du mini-projet
4.11.2 La connexion SQLite 3
4.11.3 Organisation du mini-projet
4.11.4 Détails du mini-projet
4.12 Ressources et documentations
5. Templates Jinja
5.1 Exécution d'un template
5.2 Tester un template
5.2.1 Créer une application Flask
5.2.2 Test avec serveur web Flask et string Python
5.2.3 Test en console et string Python
5.2.4 Utiliser le projet Jinja Live Parser
5.3 Évaluation des balises
5.3.1 {{ ... }} : évaluation d'expression
5.3.2 {% ... %} : instructions de contrôle de flux
5.3.3 {# ... #} : insertion de commentaire
5.3.4 # ... : ligne d'instruction
5.4 Variables et expressions
5.4.1 Variables spéciales
5.4.2 Séquence d'échappement
5.4.3 Assignation
5.5 Branchement
5.6 Itération
5.7 Les macros
5.8 Contrôle des espaces
5.9 Filtres Jinja
5.10 Inclusion de template
5.11 Importer des macros
5.12 Héritage de template
5.12.1 Les éléments de l'héritage
5.12.2 Heritage-app : l'héritage Jinja par la pratique
5.12.3 Template de base et blocs
5.13 Template enfant
5.13.1 Superbloc
5.13.2 Ressources
5.14 Message Flash
Le tableau de bord
1. Présentation
1.1 Préambule
1.2 Dépôt du projet Dashboard
1.3 Éléments principaux
1.4 Fonctionnalités du projet Dashboard
2. Structure HTML
2.1 Disposition de la page
2.2 Les blocs d'informations
2.3 La liste
3. Template Jinja
3.1 Le template de base
3.2 Utilisation du template de base
4. Configuration
4.1 Base de données dashboard.db
4.1.1 Schéma de la base de données
4.1.2 Répertoire de stockage
4.1.3 Création des tables de Dashboard
4.1.4 Copie de la base de données
4.2 Fichier de configuration de Dashboard
5. Détails de l'application Flask
5.1 Répertoires et fichiers
5.2 Les routes de Dashboard
5.3 Accès aux données
5.3.1 La fonction get_db( db_key ) multibases de données
5.3.2 Les classes DBHelper de Dashboard
5.3.3 Exemple : liste des topics disponibles pour Dashboard
5.3.4 Exemple : extraction de l'historique dans Dashboard
5.3.5 Affichage d'un tableau de bord
5.4 Les filtres Jinja personnalisés
5.5 Affichage du tableau de bord
5.6 Les macros Jinja
5.6.1 La macro make_block
5.6.2 La macro block_icon
5.6.3 La macro block_big_text
5.6.4 La macro select_color (édition d'un bloc)
6. Bloc SWITCH (marche/arrêt)
6.1 Développements complémentaires
6.1.1 MQTT sources
6.1.2 Bloc et paramètres additionnels
6.2 Ajout du bloc SWITCH
6.2.1 Block_config du switch
6.2.2 Ajouter le nouveau type de bloc
6.3 Le switch et MQTT
6.3.1 Client MQTT JavaScript
6.3.2 MQTT en JavaScript et WebSocket
6.3.3 Activer le support WebSocket sur Mosquitto
6.3.4 Tester le client MQTT JavaScript
6.3.5 Alternative à MQTT en JavaScript
6.3.6 La route MqttProxyPublish
6.3.7 Événement on_switch_change
6.4 Tester le bloc SWITCH
7. Améliorations
InfluxDB
1. Introduction
2. InfluxDB
2.1 Présentation
2.2 Concepts InfluxDB
3. Installation
4. Premiers pas avec InfluxDB
4.1 Quelques commandes utiles
4.2 Autocritique
5. Commandes de l’interpréteur
5.1 Commandes InfluxDB
5.2 Paramètres de l’utilitaire influx
6. La commande SELECT
6.1 Multiple sources
6.2 Nom de table qualifié
6.3 La clause WHERE
6.4 Expressions régulières
6.5 Casting de type
7. Importer des données
8. Règles de rétention
8.1 Accès aux données
8.2 Requêtes continues
8.3 Rétention et requêtes continues par la pratique
8.4 Bonnes pratiques de conception
8.5 Documentation pour InfluxDB
9. InfluxDB API
9.1 Créer un utilisateur
9.2 Activer l’authentification sur InfluxDB
9.3 Tester l’authentification
9.4 Tester InfluxDB API
10. Capture des données MQTT
11. Greffon Telegraf MQTT pour InfluxDB
11.1 Installation
11.1.1 Mise à jour des dépôts
11.1.2 Installation de telegraf
11.2 Configuration
11.2.1 Configuration du service Telegraf
11.2.2 Configuration telegraf avancée
12. InfluxDB et Python
12.1 Installation
12.2 Opération de lecture
12.3 Opération d’écriture
13. Duplicata de champs
14. Ensuite
Grafana
1. Introduction
2. Les concepts fondamentaux
2.1 Les sources de données
2.2 Éditeur de requêtes
2.3 Organisation
2.4 Utilisateur
2.5 Panneau
2.6 Ligne
2.7 Tableau de bord
3. Installer Grafana
3.1 Installation du dépot
3.2 Première connexion et mot de passe
4. Les données InfluxDB
4.1 Collecter rapidement des données
4.2 Améliorer la fiabilité des mesures
4.3 Contrôler la capture de données
5. Afficher les données InfluxDB
5.1 Source de données InfluxDB
5.2 Créer un tableau de bord
5.2.1 Ajouter un panneau
5.2.2 Sélectionner la série pour la cabane
5.3 Ajouter une seconde série dans le graphique
5.4 Exploration des données
5.5 Autre visualisation
5.6 Quelques astuces Grafana
5.6.1 Redimensionner un panneau
5.6.2 Glisser/déposer un panneau
5.6.3 Transformer en ligne
5.6.4 Enregistrer le tableau de bord
6. Limites de Grafana
6.1 Liens Internet sur un panneau
6.2 Lien vers MqttProxyPublish
6.3 Liens Grafana et méthode GET
Conclusion
1. Introduction
2. Remerciements
3. Retour sur client MQTT JavaScript
Annexes
1. Installation rapide
1.1 Prérequis
1.2 Début de l'installation
1.3 Récupération des sources
1.4 Poursuivre l'installation
Index
Version en ligne
C'est ce que je cherchais.
Thierry BVersion papier
Je dois affirmer mon avis sur un livre que je viens de recevoir et que je n'ai pas encore lu.
Anonyme
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 (MC Hobby SPRL). Fort de cet enthousiasme, il poursuit le partage de son savoir avec l'écriture de ses livres dédiés au langage Python sur microcontrôleur.