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
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
98 lines
3.3 KiB
C
98 lines
3.3 KiB
C
/*
|
||
* 面向 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);
|
||
}
|