UE1.4 · 4 ECTS

Python pour l'IoT

25h CM + 25h TP — 6 séances. Traitez, analysez et visualisez les données IoT avec Python.

6 Séances 25h CM 25h TP 4 ECTS
1

Python pour acquisition de données IoT

Semaine 1CM+TP · 2h
Comprendre le rôle de pyserial pour la communication série
Savoir expliquer
Lire des données depuis Arduino/ESP32 avec Python
Savoir faire
Utiliser asyncio pour lire plusieurs ports simultanément
Savoir analyser
Stocker des time-series en CSV avec timestamp
Savoir produire

1. pyserial — Interface Python vers port série

La bibliothèque pyserial permet à Python de communiquer avec l'Arduino/ESP32 via le port USB-COM. Installation : pip install pyserial.

ConceptDescription
pyserialInterface Python → port série USB/COM. Lit les données Arduino/ESP32
asyncioProgrammation asynchrone Python. Permet de lire plusieurs capteurs "simultanément"
Time-seriesDonnées horodatées. Stockage optimal : InfluxDB, TimescaleDB ou CSV avec timestamp Unix
lecture_serie.pyPython
import serial
import csv
from datetime import datetime

ser = serial.Serial("/dev/ttyUSB0", 9600, timeout=1)

with open("donnees_iot.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["timestamp", "temperature", "humidite"])

    for _ in range(100):
        ligne = ser.readline().decode("utf-8").strip()
        if "," in ligne:
            temp, hum = ligne.split(",")
            ts = datetime.now().isoformat()
            writer.writerow([ts, temp, hum])
            print(f"{ts} — {temp}°C, {hum}%")

ser.close()
Exercice 1 — Acquisition série

a) Écrivez un script Python qui lit les données de l'Arduino sur 60 secondes.

b) Sauvegardez les données dans un fichier CSV avec timestamp.

c) BONUS : Utilisez asyncio pour lire 2 ports série simultanément.

2

Analyse et visualisation de données IoT avec Pandas

Semaine 2CM+TP · 2h
Charger un fichier CSV de données capteurs dans Pandas
Savoir expliquer
Effectuer un resample (secondes → minutes → heures)
Savoir faire
Détecter des anomalies avec z-score et IQR
Savoir analyser
Appliquer une moving average pour lisser les données
Savoir produire

1. Analyse de séries temporelles IoT

Les données IoT sont des séries temporelles. Pandas permet de les manipuler efficacement : chargement, nettoyage, agrégation et visualisation.

analyse_iot.pyPython
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("donnees_iot.csv", parse_dates=["timestamp"])
df.set_index("timestamp", inplace=True)

# Resample : moyenne par minute
df_min = df.resample("1min").mean()

# Moving average sur 5 points
df["temp_lisse"] = df["temperature"].rolling(window=5).mean()

# Détection anomalies (z-score > 3)
from scipy import stats
z_scores = stats.zscore(df["temperature"].dropna())
anomalies = df[abs(z_scores) > 3]

print(f"Anomalies détectées : {len(anomalies)}")

plt.plot(df.index, df["temperature"], label="Brut")
plt.plot(df.index, df["temp_lisse"], label="Lissé")
plt.scatter(anomalies.index, anomalies["temperature"], color="red")
plt.legend()
plt.show()
Exercice 2 — Analyse Pandas

a) Chargez un fichier CSV de données capteurs dans Pandas.

b) Calculez la moyenne, min, max par heure.

c) Détectez les anomalies avec la méthode IQR.

d) BONUS : Créez un dashboard avec 3 graphiques.

3

Flask API — Recevoir et stocker les données IoT

Semaine 3CM+TP · 2h
Créer une API REST avec Flask
Savoir expliquer
Recevoir des données en POST au format JSON
Savoir faire
Stocker les données dans SQLite ou InfluxDB
Savoir analyser
Mettre en place un webhook pour ESP32
Savoir produire
app.pyPython (Flask)
from flask import Flask, request, jsonify
import sqlite3
from datetime import datetime

app = Flask(__name__)

def init_db():
    conn = sqlite3.connect("iot.db")
    conn.execute("""CREATE TABLE IF NOT EXISTS mesures (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        timestamp TEXT,
        device TEXT,
        temperature REAL,
        humidite REAL
    )""")
    conn.close()

@app.route("/api/mesures", methods=["POST"])
def recevoir_mesure():
    data = request.get_json()
    conn = sqlite3.connect("iot.db")
    conn.execute("INSERT INTO mesures (timestamp, device, temperature, humidite) VALUES (?, ?, ?, ?)",
                 (datetime.now().isoformat(), data.get("device"),
                  data.get("temp"), data.get("hum")))
    conn.commit()
    conn.close()
    return jsonify({"status": "ok"}), 201

@app.route("/api/mesures", methods=["GET"])
def lister_mesures():
    conn = sqlite3.connect("iot.db")
    rows = conn.execute("SELECT * FROM mesures ORDER BY id DESC LIMIT 100").fetchall()
    conn.close()
    return jsonify(rows)

if __name__ == "__main__":
    init_db()
    app.run(host="0.0.0.0", port=5000)
Exercice 3 — Flask API

a) Créez une API Flask qui reçoit les données IoT en POST.

b) Configurez l'ESP32 pour envoyer les données à cette API.

c) BONUS : Ajoutez une route GET avec filtre par date.

4

Dashboard Grafana — Visualisation en temps réel

Semaine 4CM+TP · 2h
Comprendre l'architecture Grafana + InfluxDB
Savoir expliquer
Configurer une source de données InfluxDB
Savoir faire
Créer des panels (graphique, jauge, stat)
Savoir analyser
Utiliser des variables Grafana pour filtrer
Savoir produire

1. Stack de monitoring IoT

Grafana est la plateforme de visualisation open-source la plus utilisée pour l'IoT. Elle se connecte à InfluxDB (base de données time-series) pour afficher des dashboards en temps réel.

docker-compose.ymlYAML
version: "3"
services:
  influxdb:
    image: influxdb:2
    ports:
      - "8086:8086"

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    depends_on:
      - influxdb
Exercice 4 — Dashboard Grafana

a) Installez Grafana et InfluxDB avec Docker.

b) Créez un dashboard avec température et humidité.

c) BONUS : Ajoutez une alerte par email si température > 40°C.

5

Machine Learning IoT — Détection d'anomalies en temps réel

Semaine 5CM+TP · 2h
Comprendre le concept d'anomaly detection pour IoT
Savoir expliquer
Utiliser Isolation Forest pour détecter des anomalies
Savoir faire
Comprendre TinyML et TensorFlow Lite Micro
Savoir analyser
Déployer un modèle léger sur Arduino
Savoir produire
ConceptDescription
Anomaly detectionIdentifier des comportements anormaux dans une série de données capteur
Isolation ForestAlgorithme non supervisé qui isole les points aberrants par divisions aléatoires
TinyMLMachine Learning sur microcontrôleur. Modèles compressés < 100KB
anomaly_detection.pyPython
import pandas as pd
from sklearn.ensemble import IsolationForest
import matplotlib.pyplot as plt

df = pd.read_csv("donnees_iot.csv")
X = df[["temperature", "humidite"]].values

model = IsolationForest(contamination=0.05, random_state=42)
df["anomalie"] = model.fit_predict(X)

# -1 = anomalie, 1 = normal
anomalies = df[df["anomalie"] == -1]
normaux   = df[df["anomalie"] == 1]

plt.scatter(normaux.index, normaux["temperature"], c="blue", label="Normal")
plt.scatter(anomalies.index, anomalies["temperature"], c="red", label="Anomalie")
plt.legend()
plt.title("Détection d'anomalies — Isolation Forest")
plt.show()
Exercice 5 — ML pour IoT

a) Appliquez Isolation Forest sur un jeu de données capteur.

b) Visualisez les anomalies détectées.

c) BONUS : Déployez un modèle TF Lite sur ESP32.

6

Raspberry Pi — Linux embarqué et Node-RED

Semaine 6CM+TP · 2h
Comprendre l'architecture du Raspberry Pi
Savoir expliquer
Utiliser les GPIO du Raspberry Pi
Savoir faire
Créer un flux Node-RED pour IoT
Savoir analyser
Connecter capteurs et API avec Node-RED
Savoir produire
ConceptDescription
Raspberry PiMini-ordinateur Linux ARM. 4 cœurs, WiFi/BT, 40 pins GPIO. Idéal hub IoT
Node-REDOutil de programmation par flux visuel. Connecte dispositifs IoT sans code
GPIOBroches du RPi pour capteurs/actionneurs. Contrôle via RPi.GPIO ou pigpio
clignote_led.pyPython (RPi.GPIO)
import RPi.GPIO as GPIO
import time

LED_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)

try:
    while True:
        GPIO.output(LED_PIN, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(LED_PIN, GPIO.LOW)
        time.sleep(1)
except KeyboardInterrupt:
    GPIO.cleanup()
Exercice 6 — Raspberry Pi

a) Installez Node-RED sur Raspberry Pi.

b) Créez un flux qui lit un capteur MQTT et l'affiche.

c) BONUS : Connectez Node-RED à Grafana via HTTP.