zigbee_switch.c
Le H2 est la puce Zigbee d'Espressif : avec esp-zigbee-sdk, ce squelette démarre la pile ZBOSS en client On/Off qui envoie des ordres toggle vers les ampoules du réseau. rx-on-when-idle=false : le device dort entre deux appuis.
Matériel requis
Une carte ESP32-H2 (RISC-V 96 MHz, radio IEEE 802.15.4 uniquement — pas de Wi-Fi) type DevKitM-1, alimentée par USB. Une ampoule/prise Zigbee 3.0 appairable et un réseau existant (coordinateur type Home Assistant ZHA/Z2M).
Branchement
Aucun câblage pour le test ; bouton sur GPIO9 pour la version complète. Antenne dégagée, à 1-2 m du coordinateur pour l'appairage.
Fonctionnement
zigbee_role_init lance la pile sans fil ; le device envoie un toggle ZCL On/Off vers le groupe « all ». Les réponses arrivent au callback app avec le statut d'acquitter. Programmez avec ESP-IDF (idf.py set-target esp32h2) ; le port USB-Serial/JTAG (GPIO26/27) sert de console et de port de flash. Maintenez Boot + Reset pour le mode download si besoin.
Pour aller plus loin
Complétez avec l'exemple officiel light_switch (bouton + rejoin), puis remplacez le broadcast par une adresse IEEE découverte par match descriptor.
zigbee_switch.c
// zigbee_switch.c — squelette esp-zigbee-sdk : client On/Off.
// Compile avec la composante esp-zigbee-sdk (idf.py add-dependency).
#include "zigbee.h"
#include "zboss_api.h"
#include "zboss_api_addons.h"
static const char *TAG = "zswitch";
static uint8_t canal = 0;
// Reponse d'une commande envoyee au reseau
static void cb_app(zb_bufid_t bufid, uint16_t src_addr,
zb_zcl_parsed_status_t status,
zb_zcl_command_id_t command_id)
{
ESP_LOGI(TAG, "reponse status=%d cmd=%d", status, command_id);
}
void app_main(void)
{
zigbee_erase_persistent_storage(true); // 1re fois : reseau propre
zb_set_rx_on_when_idle(ZB_FALSE); // device « sleepystuff » eco
zigbee_role_init(); // demarre ZBOSS en coord... ici client
// A l'appui bouton : broadcast On/Off toggle sur le canal courant
// (le switch rejoint le reseau existant via le rejoin automatique)
ESP_LOGI(TAG, "Switch Zigbee pret — canal %d", canal);
while (1) {
vTaskDelay(pdMS_TO_TICKS(1000));
// zb_zcl_start_hci... : voir exemple light_switch de esp-zigbee-sdk
}
}