Piloter la LED RGB de la carte depuis un tableau de bord
Ajoutez trois commandes à votre firmware, mettez la carte à jour par le Wi-Fi, puis allumez, réglez et colorez sa LED embarquée depuis un tableau de bord sur téléphone, en passant par un flow
L'ESP32-C6-Zero porte une petite LED RGB (une WS2812, sur GPIO8) à côté de son connecteur USB. Dans ce tutoriel, vous l'allumez depuis le tableau de bord téléphone de La température d'une pièce sur un tableau de bord : marche/arrêt, luminosité et couleur.
Dans PNeX, un tableau de bord ne pilote jamais une carte directement. Un appui sur la carte écrit un contrôle. Un flow l'écoute et envoie la valeur à la carte. La carte exécute votre code : c'est elle qui décide de ce qu'une « couleur » veut dire.
Rien à câbler : la LED est déjà sur la carte.
Ajouter trois commandes au firmware

Ouvrez Edges → Firmware custom, projet Climate sensor. Remplacez tout le sketch par celui-ci : la partie capteur ne change pas, la partie lumière est nouvelle.
// Climate sensor + RGB light: AM2301 (DHT21) and the on-board WS2812 LED
// of 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
#define RGB_PIN 8 // on-board WS2812 LED (do not use GPIO8 for anything else)
PnexDevice pnex;
DHT dht(DHT_PIN, DHT_TYPE);
// Light state, changed by the commands, applied in loop().
bool light_on = false;
int light_level = 100; // brightness, 0..100 %
uint32_t light_color = 0xFFFFFF; // 0xRRGGBB
bool light_dirty = true;
// Commands sent by the flow's "Device (write)" node: the wired value is
// in args["value"]. Keep handlers short: store, then apply in loop().
bool on_power(JsonVariantConst args) {
light_on = args["value"].as<int>() != 0;
light_dirty = true;
return true;
}
bool on_level(JsonVariantConst args) {
light_level = constrain(args["value"].as<int>(), 0, 100);
light_dirty = true;
return true;
}
bool on_color(JsonVariantConst args) {
light_color = args["value"].as<uint32_t>() & 0xFFFFFF;
light_dirty = true;
return true;
}
void apply_light() {
uint8_t r = 0, g = 0, b = 0;
if (light_on) {
r = ((light_color >> 16) & 0xFF) * light_level / 100;
g = ((light_color >> 8) & 0xFF) * light_level / 100;
b = (light_color & 0xFF) * light_level / 100;
}
// The C6-Zero's LED takes red, green, blue in that order (not GRB).
rgbLedWriteOrdered(RGB_PIN, LED_COLOR_ORDER_RGB, r, g, b);
pnex.publish("light", light_on ? 1 : 0); // actual state, for the card
}
void setup() {
Serial.begin(115200);
dht.begin();
// Each metric becomes a telemetry series of this device.
pnex.addMetric("temperature", "°C");
pnex.addMetric("humidity", "%");
pnex.addMetric("light");
// Each command shows up in the flow's "Device (write)" node.
pnex.onCommand("power", on_power);
pnex.onCommand("level", on_level);
pnex.onCommand("color", on_color);
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
if (light_dirty) {
light_dirty = false;
apply_light();
}
// The AM2301 needs at least 2 s between two reads: read every 10 s.
if (millis() - last_read_ms >= 10000) {
last_read_ms = millis();
pnex.publish("light", light_on ? 1 : 0);
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);
}
}Trois points à remarquer :
pnex.onCommand("color", on_color)déclare une commande. La carte l'annonce au serveur, et elle apparaît ensuite dans vos flows.- La valeur envoyée par le flow est dans
args["value"]. Une couleur arrive sous la forme d'un seul nombre,0xRRGGBB(rouge =16711680). - Un handler ne fait que mémoriser la valeur. La LED est écrite dans
loop(), pour ne jamais bloquer la connexion.
Aucune bibliothèque à ajouter : rgbLedWriteOrdered fait partie du cœur Arduino ESP32.
Cliquez sur Enregistrer et vérifier.
Mettre la carte à jour par le Wi-Fi

Ouvrez Edges → Appareils / Agents, ligne climate-1 :
- Recompiler : le serveur compile la nouvelle révision pour cette carte ;
- Mettre à jour (OTA) → Déployer : la carte la télécharge, la vérifie, la flashe et redémarre. Sans câble USB.
La carte revient au bout d'une trentaine de secondes.
climate-1 est de nouveau connectée, avec la nouvelle version du firmware.Donner une couleur à la lampe de la Chambre

Ouvrez le tableau de bord Maison et cliquez sur Modifier. La Chambre du modèle
Maison a déjà une carte Lampe de chevet : cliquez dessus. Dans l'inspecteur :
- Commandes (sources pour les flows) : Marche / arrêt est toujours là. Cochez Luminosité et Couleur ;
- Valeurs lues → État réel :
lightsousclimate-1, l'état que publie le firmware.
Cliquez sur Enregistrer. Chaque commande devient un contrôle, avec une
référence comme #w-0009.color. Données → Contrôles les liste avec un badge
Sans effet : aucun flow ne les écoute encore.
Écouter les trois contrôles

Ouvrez Automation → Flux → Nouveau flow et nommez-le Bedroom – RGB LED.
- Le nouveau flow commence par un nœud Inject, inutile ici : c'est le tableau de bord qui déclenche ce flow. Sélectionnez-le, puis Supprimer le nœud.
- Ajoutez un nœud Source contrôle. Sous Tableau de bord · Maison, cochez les trois
contrôles de la Lampe de chevet, dans cet ordre :
power,level,color. Le nœud reçoit une sortie par contrôle. - Cochez Renvoyer la dernière valeur au démarrage.
Les envoyer au firmware

- Ajoutez un nœud Appareil (écriture) et choisissez
climate-1. Sous Commandes du firmware, cochezpower,leveletcolor: chacune reçoit une ligne d'entrée sur le nœud. - Reliez chaque sortie de la Source contrôle à la ligne du même nom.
| De (Source contrôle) | Vers (Appareil (écriture)) |
|---|---|
w-…power | power |
w-…level | level |
w-…color | color |
Déployer

Cliquez sur Enregistrer, puis Déployer.
L'allumer depuis le téléphone

Ouvrez le tableau de bord Maison sur votre téléphone. Dans la Chambre :
- activez l'interrupteur de la Lampe de chevet : la LED s'allume en blanc, et l'en-tête de la pièce indique « 1 allumée(s) » ;
- ouvrez Détail et historique (l'icône du coin) pour changer la luminosité et choisir une couleur.
La carte sur le banc, pilotée depuis le tableau de bord : blanc, rouge, vert, bleu, cyan, luminosité 20 → 60 → 100 %, orange, extinction.
Luminosité et couleur

Le panneau montre la lampe en grand : interrupteur, curseur de luminosité et couleur, puis l'état réel publié par la carte sur les dernières 24 heures.
Comment ça marche
Le flow ne sait pas ce qu'est une LED. Appareil (écriture) envoie chaque valeur à la commande qui porte le nom de sa ligne d'entrée, et votre firmware décide quoi en faire. Le même flow pourrait envoyer la couleur à plusieurs cartes, ou seulement après le coucher du soleil : ajoutez des nœuds entre les deux.
Dépannage
| Symptôme | Cause et solution |
|---|---|
| Pas de Commandes du firmware dans Appareil (écriture) | La carte exécute encore l'ancien firmware. Vérifiez Recompiler et Mettre à jour (OTA), puis rouvrez le flow. |
| Le rouge s'affiche en vert (ou l'inverse) | Votre LED utilise un autre ordre de couleurs. Remplacez LED_COLOR_ORDER_RGB par LED_COLOR_ORDER_GRB (la plupart des rubans WS2812), enregistrez, recompilez, mettez à jour. |
| La carte bascule mais la LED ne fait rien | Le flow est-il déployé ? Une erreur d'Appareil (écriture) s'affiche sur le nœud. |
| La LED est éteinte après un redémarrage de la carte (coupure, mise à jour) | La carte ne garde pas l'état de la lumière après un redémarrage. Appuyez de nouveau sur la carte. Renvoyer la dernière valeur au démarrage ne couvre que le redémarrage du flow. |
| Créer le flow… ne propose aucun pin pour la couleur | Normal : une couleur n'est pas une valeur de pin. Choisissez la commande color de la carte. |
| Les fils de la Source contrôle arrivent tous sur une seule ligne | Chaque fil doit être lâché sur sa propre ligne d'Appareil (écriture). Tirez-le de nouveau depuis la sortie jusqu'à la bonne ligne, puis déployez. |
Pour aller plus loin
- Passez la LED au rouge quand la pièce est trop chaude : dans le flow d'alerte du
tutoriel climat, envoyez
16711680à la commandecolorà côté de la notification. - Ajoutez une commande
effect(clignotement, arc-en-ciel) gérée dansloop(), et une carte Liste de choix pour la sélectionner.
Avant de commencer
Prérequis
Ces tutoriels doivent être faits d’abord.
Matériel & services
Ce qu’il vous faut pour ce tutoriel.
Cartes
Outils
- 1×Chrome ou Edge (Web Serial)Le flash depuis le navigateur exige Web Serial
Déjà couvert par les prérequis
- La température d'une pièce sur un tableau de bord
Waveshare ESP32-C6-Zero · Capteur température & humidité AM2301 (DHT21) · Chrome ou Edge (Web Serial)
- Alertes de température avec votre propre firmware
Raspberry Pi 5 (8 Go) / Raspberry Pi 4 (4 Go+) / VM ou serveur Linux (Debian/Ubuntu) · Waveshare ESP32-C6-Zero · Capteur température & humidité AM2301 (DHT21) · Résistance 10 kΩ · Platine d’essai (breadboard) · Fils Dupont (F-F, M-F) · Câble USB data (pas « charge seule ») · Réseau Wi-Fi 2,4 GHz · Chrome ou Edge (Web Serial) · Application ntfy sur le téléphone

