Alertes de température avec votre propre firmware
Un capteur AM2301 sur une ESP32-C6-Zero, quelques lignes de C++ écrites dans le navigateur, une fonction en syntaxe Python et une alerte sur votre téléphone, le tout auto-hébergé
Vous allez construire un petit capteur qui envoie la température et l'humidité de la pièce à votre propre serveur PNeX, et qui vous prévient sur votre téléphone quand il fait trop chaud. Pas de compte cloud, pas d'abonnement IoT : les données restent chez vous.
Au passage, vous utiliserez trois briques de PNeX :
- l'IDE de firmware custom : vous écrivez le code de la carte dans le navigateur, PNeX le compile et y ajoute le Wi-Fi, le chiffrement et les mises à jour à distance ;
- une fonction écrite en Starlark, un langage isolé (sandbox) à la syntaxe Python ;
- un flow qui lit le capteur, exécute la fonction et envoie l'alerte.
Installer le serveur PNeX
PNeX tourne sur un Raspberry Pi 4 ou 5 (Raspberry Pi OS Lite 64 bits) ou sur
n'importe quelle machine Linux avec Docker. Sur le Pi, ouvrez un terminal
(ssh [email protected]) et lancez :
curl -fsSL https://raw.githubusercontent.com/Pnex/pnex-deploy/main/install.sh \
| sudo bash -s -- --admin-user [email protected] --admin-password 'un-mot-de-passe-solide'Ouvrez ensuite https://pnex.local/ dans votre navigateur, faites confiance au
certificat du serveur et connectez-vous. Le guide pas à pas avec captures est dans
Installer PNeX sur un Raspberry Pi.
Câbler le capteur
Enfichez l'ESP32-C6-Zero à cheval sur le milieu de la breadboard. L'AM2301 a trois fils :
| Fil de l'AM2301 | Va sur |
|---|---|
| Rouge (VCC) | broche 3V3 (ou 5V : le capteur accepte les deux) |
| Noir (GND) | broche GND |
| Jaune (DATA) | broche GP0 |
Ajoutez une résistance de 10 kΩ entre la colonne du fil jaune et 3V3. Elle maintient la ligne de données à l'état haut entre deux lectures.
Comptez les broches avec soin. Du côté du connecteur USB, l'ordre est : 5V, GND, 3V3, GP0. GP0 est la quatrième broche, pas la troisième.
La plupart des cartes Zero sont livrées avec leurs barrettes non soudées. Soudez-les, sinon les broches ne touchent pas la breadboard. La carte s'allume quand même par l'USB, donc rien ne paraît anormal avant la lecture du capteur.
Créer le projet firmware

Ouvrez Edges → Firmware custom → Nouveau projet. Nommez-le Climate sensor,
choisissez la famille de puce ESP32-C6 et créez-le.
L'éditeur s'ouvre sur un sketch de départ. Tout ce dont PNeX a besoin (Wi-Fi, liaison chiffrée avec le serveur, mises à jour à distance) est dans la bibliothèque PNeX. Votre fichier ne contient que votre logique.
Ajouter la bibliothèque du capteur

Cliquez sur + Lib et choisissez DHT sensor library. L'AM2301 est de la même
famille que le DHT21. La bibliothèque apparaît en pastille à côté de src/main.cpp.
Seules les bibliothèques de cette liste sont utilisables. Leurs versions sont figées, donc le build est identique à chaque fois.
Coller le code, enregistrer et vérifier

Remplacez tout le contenu de l'éditeur par ce sketch :
// Climate sensor: AM2301 (DHT21) on a Waveshare ESP32-C6-Zero.
// WiFi, device token and encryption key are injected by PneX at build time.
#include <Pnex.h>
#include <DHT.h>
#define DHT_PIN 0 // GP0, yellow wire
#define DHT_TYPE DHT21 // AM2301 = DHT21
PnexDevice pnex;
DHT dht(DHT_PIN, DHT_TYPE);
void setup() {
Serial.begin(115200);
dht.begin();
// Each metric becomes a telemetry series of this device.
pnex.addMetric("temperature", "°C");
pnex.addMetric("humidity", "%");
pnex.begin(); // WiFi + connection to your PneX server
}
unsigned long last_read_ms = 0;
void loop() {
pnex.loop(); // call it on every iteration, never block with long delays
// The AM2301 needs at least 2 s between two reads: read every 10 s.
if (millis() - last_read_ms >= 10000) {
last_read_ms = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("[APP] AM2301 read failed (check wiring)");
return;
}
pnex.publish("temperature", t);
pnex.publish("humidity", h);
Serial.printf("[APP] %.1f °C %.1f %%\n", t, h);
}
}Cliquez sur Enregistrer et vérifier. Le serveur compile le code pour l'ESP32-C6 (le premier build prend quelques minutes).
Remarquez ce qui n'est pas dans le code : ni mot de passe Wi-Fi, ni adresse du serveur, ni clé. PNeX les injecte quand il compile le firmware de votre carte.
Enregistrer la carte

Ouvrez Edges → Appareils / Agents → Enregistrer. Donnez un nom à la carte, par
exemple climate-1. Ce nom identifie le device partout dans PNeX, y compris dans les
flows.
Choisir le modèle et votre firmware

Choisissez Generic ESP32-C6 (Waveshare C6-Zero). Sous Firmware, choisissez Climate sensor à la place du firmware PNeX générique.
Réseau Wi-Fi

Choisissez votre réseau Wi-Fi, ou cliquez sur + pour en ajouter un : SSID et mot de passe. Prenez un réseau 2,4 GHz : les cartes ESP ne voient pas les réseaux 5 GHz.
Les réseaux ajoutés sont enregistrés dans Edges → Référentiels et reproposés pour vos prochaines cartes. Le mot de passe ne sert qu'à compiler le firmware.
Adresse du serveur PNeX

La carte a besoin de l'adresse de votre serveur PNeX. Si le champ Serveur PNeX est vide, cliquez sur le + à côté : le champ est pré-rempli avec l'adresse que vous utilisez en ce moment. Cliquez sur Ajouter. Détecter les serveurs PNeX sur le LAN trouve le serveur pour vous en cas de doute.
Avec une installation en pnex.local, la carte se connecte à l'adresse IP du Pi
(par exemple 192.168.1.20) : les cartes ESP ne savent pas résoudre les noms en
.local. Si vous avez installé PNeX avec un vrai nom de domaine, ce champ est imposé
et il n'y a rien à choisir.
Créer et compiler

Vérifiez le récapitulatif et cliquez sur Créer & compiler. PNeX compile un firmware pour cette carte : votre code, plus son Wi-Fi, l'adresse du serveur et ses clés.
Flasher depuis le navigateur

Branchez la carte à votre ordinateur avec un câble USB data. Sur la ligne du device, cliquez sur Flasher, puis encore sur Flasher, et choisissez le port de la carte. Il apparaît comme un port série USB ou « USB JTAG/serial debug unit ».
Utilisez Chrome, Edge ou un autre navigateur Chromium : le flash passe par Web Serial. Si aucun port n'apparaît, maintenez le bouton BOOT, appuyez puis relâchez RESET, relâchez BOOT et recommencez.
Le flash par USB ne se fait qu'une fois. Les versions suivantes de votre code s'installent à distance avec Mettre à jour (OTA).
Suivre les mesures

Ouvrez Visualisation → Graphiques rapides. Choisissez la métrique temperature,
le capteur climate-1, cliquez sur Ajouter, puis faites de même pour humidity.
Un nouveau point arrive toutes les 10 secondes. Soufflez sur le capteur : l'humidité grimpe en quelques mesures.
Écrire la fonction (syntaxe Python)

Ouvrez Automation → Fonctions → Nouvelle fonction, nommez-la
Climate – comfort check, choisissez Starlark et créez-la.
Starlark est un petit langage à la syntaxe Python : def, if, dictionnaires,
commentaires #. Il s'exécute dans un bac à sable, il ne peut donc que calculer : ni
fichiers, ni réseau. Collez :
# Comfort check for the AM2301: converts the temperature and decides
# when it is too hot. Starlark = Python syntax, sandboxed.
# @input temperature number "Temperature from the sensor, in °C"
# @output too_hot bool "True above the threshold (wire it to the notification trigger)"
# @output celsius string "Temperature in °C, rounded"
# @output fahrenheit string "Temperature in °F, rounded"
THRESHOLD_C = 28.0 # send an alert above this temperature
def one_decimal(x):
return str(int(x * 10 + 0.5) / 10.0)
def handle(inputs, msg):
c = inputs["temperature"]
f = c * 9 / 5 + 32
return {
"too_hot": c > THRESHOLD_C,
"celsius": one_decimal(c),
"fahrenheit": one_decimal(f),
}Les lignes @input et @output ne sont pas de simples commentaires. Chaque @input
devient une entrée du nœud fonction dans le flow, et chaque @output une sortie.
handle renvoie une valeur par sortie, sous le même nom.
Cliquez sur Enregistrer.
Tester la fonction

Cliquez sur Tester, saisissez 31.4 pour temperature et cliquez sur
Exécuter.
too_hot = true, celsius = « 31.4 » et fahrenheit = « 88.5 ».Réglez THRESHOLD_C sur la température qui compte pour vous (une serre, un placard
serveur, une chambre de bébé) et enregistrez à nouveau.
Ajouter votre téléphone comme canal

Installez l'application ntfy sur votre téléphone et abonnez-vous à un sujet au nom
difficile à deviner : pnex-climate- suivi de quelques lettres et chiffres choisis au
hasard. Quiconque connaît le nom du sujet peut le lire : ne reprenez jamais celui d'un
tutoriel.
Dans PNeX, ouvrez Automation → Notifications → Nouveau canal → ntfy : serveur
https://ntfy.sh, le même sujet, puis Créer. Utilisez le bouton Test du
canal : un message de test arrive sur votre téléphone.
E-mail, Telegram, Slack ou Discord fonctionnent de la même façon. Voir Recevoir des alertes par e-mail ou sur le téléphone.
Écrire le message

Ouvrez l'onglet Modèles, puis Nouveau modèle :
- Nom :
Climate – too hot - Sujet :
[climate-1] Too hot - Corps :
🌡️ It is {{ celsius }} °C ({{ fahrenheit }} °F) in the room, above your alert threshold.Déclarez les deux variables celsius et fahrenheit (Ajouter une variable),
donnez-leur des valeurs d'exemple et cliquez sur Aperçu.
Envoyer un message de test

En bas du modèle, Test d'envoi sur un canal rend le modèle avec les valeurs d'exemple et l'envoie aussitôt. Choisissez votre canal ntfy et cliquez sur Test : le message arrive sur votre téléphone. Enregistrez ensuite le modèle.
Lire le capteur dans un flow

Ouvrez Automation → Flux → Nouveau flow et nommez-le Climate – too hot alert.
- Sélectionnez le nœud Inject déjà présent et réglez son intervalle sur
300secondes : le flow tourne toutes les 5 minutes. - Ajoutez un nœud Device (read), choisissez
climate-1et cochez temperature (métrique). Réglez la fenêtre de fraîcheur sur120secondes : un capteur débranché ne déclenche jamais d'alerte avec une vieille valeur.
Ajouter la fonction et la notification

- Ajoutez un nœud Function et choisissez
Climate – comfort check. - Ajoutez un nœud Notification, ajoutez votre canal ntfy (et in-app si
vous voulez) et choisissez le modèle
Climate – too hot.
Câbler et déployer

Tirez les fils :
| De | Vers |
|---|---|
| Inject | Device (read) |
Device (read) · temperature | Function · temperature |
Function · too_hot | Notification · trigger |
Function · celsius | Notification · celsius |
Function · fahrenheit | Notification · fahrenheit |
La notification n'est envoyée que tant que trigger est vrai. Enregistrez, puis
cliquez sur Déployer.
Tester l'alerte

Inutile d'attendre la canicule :
- baissez
THRESHOLD_Csous la température actuelle dans la fonction, enregistrez, choisissez la nouvelle version dans le nœud Function du flow et déployez à nouveau ; - ou gardez le capteur dans votre main pendant une minute.
Au prochain passage (5 minutes au plus), votre téléphone vibre.
Vérifier le journal des envois

Chaque message est listé dans Automation → Notifications → Événements (ou Journal sur la ligne du canal) : date, canal, statut (Envoyé, Échec, Bloqué (anti-spam)) et le flow qui l'a envoyé. Cliquez sur une ligne pour voir le détail de l'erreur d'un envoi en échec.
Sur votre téléphone

L'application ntfy (ou la page web ntfy de votre sujet) affiche l'alerte avec les valeurs rendues par le modèle.
Tant qu'il fait trop chaud, vous recevez un message toutes les 5 minutes. Changez l'intervalle de l'Inject pour en recevoir moins.
Dépannage
| Symptôme | Cause et solution |
|---|---|
La console série affiche AM2301 read failed | Le fil jaune n'est pas sur GP0 (recomptez : 5V, GND, 3V3, GP0), la résistance de 10 kΩ manque, ou les barrettes ne sont pas soudées. |
| Le device reste « Inactive » après le flash | Mauvais mot de passe Wi-Fi ou réseau 5 GHz. Vérifiez le Wi-Fi dans Référentiels, puis Recompiler et flashez à nouveau. |
| « La révision ne compile pas » | L'erreur s'affiche sous l'éditeur, avec son numéro de ligne. Un #include <DHT.h> en erreur veut dire que la bibliothèque n'a pas été ajoutée (+ Lib). |
Pas de case temperature (métrique) dans Device (read) | Le device n'a encore rien publié : vérifiez d'abord les Graphiques rapides. |
| Le flow est déployé mais aucun message n'arrive | La température est sous THRESHOLD_C, ou le canal a échoué : voir Automation → Événements. |
Pour aller plus loin
- Ajoutez une alerte d'humidité : une deuxième entrée dans la fonction et une sortie de plus.
- Mettez les courbes sur un tableau de bord pour votre téléphone.
- Modifiez le code, Enregistrez, puis Recompiler et Mettre à jour (OTA) : plus besoin de câble USB.
Avant de commencer
Prérequis
Aucun prérequis : c’est un point de départ.
Matériel & services
Ce qu’il vous faut pour ce tutoriel.
Serveur
Cartes
Capteurs
- 1×Capteur température & humidité AM2301 (DHT21)Boîtier filaire, trois fils : rouge, noir, jaune
Câblage
- 1×Résistance 10 kΩPull-up sur la ligne de données du capteur
- 1×Platine d’essai (breadboard)
- 3×Fils Dupont (F-F, M-F)
- 1×Câble USB data (pas « charge seule »)
Services & comptes
- 1×Réseau Wi-Fi 2,4 GHzLes ESP ne voient pas les réseaux 5 GHz
Outils
- 1×Chrome ou Edge (Web Serial)Le flash depuis le navigateur exige Web Serial
Et ensuite ?
Ces tutoriels s’appuient sur celui-ci.

