Files
ESPDocs/public/exemplos/zh-CN/esp-zigbee.c
T
Lucas RayanandClaude Sonnet 5.5 5a9fe676fc
CI / Lint e auditorias (push) Successful in 1m10s
CI / Trivy (dependências e segredos) (push) Successful in 12s
CI / Imagem Docker (linux/arm64) (push) Successful in 2m39s
Release / Plano (reaproveitar a imagem?) (push) Successful in 6s
Release / ci (push) Skipped
Release / Publica a imagem (linux/arm64) (push) Successful in 18s
Release / Cria a release no Gitea (push) Successful in 5s
feat(i18n): Simplified Chinese (zh-CN), search answers per locale, fr/de/es data fixes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 23:28:39 -03:00

98 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 面向 ESP32-H2 和 ESP32-C6 的 ESP-Zigbee-SDK 示例(IEEE 802.15.4)
* 设备:Zigbee 3.0 智能灯(Home Automation End Device)
*
* 依赖(idf_component.yml):
* espressif/esp-zigbee-lib: "^1.6.0"
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_zigbee_core.h"
static const char *TAG = "zigbee_light_device";
#define HA_ESP_LIGHT_ENDPOINT 1
#define ESP_ZB_PRIMARY_CHANNEL_MASK (1l << 15) // Zigbee 默认信道 15
/* Zigbee 属性写入回调(例如通过 Home Assistant 开关) */
static esp_err_t zb_attribute_handler(const esp_zb_zcl_set_attr_value_message_t *message)
{
if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) {
if (message->attribute.id == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID &&
message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) {
bool on_off_state = message->attribute.data.value ? *(bool *)message->attribute.data.value : false;
ESP_LOGW(TAG, ">>> ZIGBEE COMMAND RECEIVED: Lamp %s", on_off_state ? "ON" : "OFF");
}
}
return ESP_OK;
}
/* Zigbee 协议栈事件回调 */
void esp_zb_app_signal_handler(esp_zb_app_signal_msg_t *signal_msg)
{
uint32_t *p_sg_p = signal_msg->p_app_signal;
esp_err_t err_status = signal_msg->esp_err_status;
esp_zb_app_signal_type_t sig_type = *p_sg_p;
switch (sig_type) {
case ESP_ZB_ZDO_SIGNAL_SKIP_STARTUP:
ESP_LOGI(TAG, "Starting commissioning on the Zigbee network...");
esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_NETWORK_STEERING);
break;
case ESP_ZB_BDB_SIGNAL_STEERING:
if (err_status == ESP_OK) {
ESP_LOGI(TAG, "Connected to the Zigbee 3.0 network!");
} else {
ESP_LOGW(TAG, "Searching for the Zigbee coordinator again...");
esp_zb_scheduler_alarm((esp_zb_callback_t)esp_zb_bdb_start_top_level_commissioning, ESP_ZB_BDB_MODE_NETWORK_STEERING, 1000);
}
break;
default:
break;
}
}
static void esp_zb_task(void *pvParameters)
{
// 将 Zigbee 节点配置为 End Device
esp_zb_cfg_t zb_nwk_cfg = {
.esp_zb_role = ESP_ZB_DEVICE_TYPE_ED,
.install_code_policy = false,
.nwk_cfg.zed_cfg = {
.ed_timeout = ESP_ZB_ED_0_5_MIN,
.keep_alive = 3000,
},
};
esp_zb_init(&zb_nwk_cfg);
// 创建住宅照明 On/Off 集群
esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG();
esp_zb_ep_list_t *ep_list = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &light_cfg);
// 注册端点和属性处理程序
esp_zb_device_register(ep_list);
esp_zb_core_action_handler_register(zb_attribute_handler);
esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK);
ESP_ERROR_CHECK(esp_zb_start(false));
esp_zb_main_loop_iteration();
}
void app_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());
// 初始化 IEEE 802.15.4 射频协议栈
esp_zb_platform_config_t config = {
.radio_config = { .radio_mode = ZB_RADIO_MODE_NATIVE },
.host_config = { .host_connection_mode = ZB_HOST_CONNECTION_MODE_NONE },
};
ESP_ERROR_CHECK(esp_zb_platform_config(&config));
xTaskCreate(esp_zb_task, "Zigbee_main", 4096, NULL, 5, NULL);
}