-
Notifications
You must be signed in to change notification settings - Fork 7.6k
Add Zigbee examples #9024
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Add Zigbee examples #9024
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
ac7c06b
feat: added zigbee light and switch examples
P-R-O-C-H-Y fbc827f
fix: added skip files for unsupported socs
P-R-O-C-H-Y 57d7c3f
Merge branch 'master' into Zigbee-examples
P-R-O-C-H-Y 282f2d0
fix(example): Removed Serial and updated readme.
P-R-O-C-H-Y bddb847
Merge branch 'master' into Zigbee-examples
P-R-O-C-H-Y 8a5dfd0
fix(): Simplify examples + fix zigbee partition table
P-R-O-C-H-Y 8169a43
Merge branch 'master' into Zigbee-examples
P-R-O-C-H-Y File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
70 changes: 70 additions & 0 deletions
70
libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/README.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
# Arduino-ESP32 Zigbee Light Bulb Example | ||
|
||
This example shows how to configure the Zigbee end device and use it as a HA on/off light bulb. | ||
|
||
**This example is based on ESP-Zigbee-SDK example esp_zigbee_HA_sample/HA_on_off_light.** | ||
|
||
# Supported Targets | ||
|
||
Currently, this example supports the following targets. | ||
|
||
| Supported Targets | ESP32-C6 | ESP32-H2 | | ||
| ----------------- | -------- | -------- | | ||
|
||
## Hardware Required | ||
|
||
* One development board (ESP32-H2 or ESP32-C6) acting as Zigbee coordinator (loaded with Zigbee_Light_switch example) | ||
* A USB cable for power supply and programming | ||
* Choose another board (ESP32-H2 or ESP32-C6) as Zigbee end device (loaded with Zigbee_Light_bulb example) | ||
|
||
### Configure the Project | ||
|
||
Set the LED GPIO by changing the `LED_PIN` definition. By default, the LED_PIN is `RGB_BUILTIN`. | ||
By default, the `neoPixelWrite` function is used to control the LED. You can change it to digitalWrite to control a simple LED. | ||
|
||
#### Using Arduino IDE | ||
|
||
To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). | ||
|
||
* Before Compile/Verify, select the correct board: `Tools -> Board`. | ||
* Select the End device Zigbee mode: `Tools -> Zigbee mode: Zigbee ED (end device)` | ||
* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs` | ||
* Select the COM port: `Tools -> Port: xxx` where the `xxx` is the detected COM port. | ||
|
||
## Troubleshooting | ||
|
||
If the End device flashed with this example is not connecting to the coordinator, erase the flash before flashing it to the board. It is recommended to do this if you did changes to the coordinator. | ||
You can do the following: | ||
|
||
* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled` | ||
* In the sketch uncomment function `esp_zb_nvram_erase_at_start(true);` located in `esp_zb_task` function. | ||
|
||
***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** | ||
|
||
* **LED not blinking:** Check the wiring connection and the IO selection. | ||
* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. | ||
* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. | ||
|
||
If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). | ||
|
||
## Contribute | ||
|
||
To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) | ||
|
||
If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! | ||
|
||
Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. | ||
|
||
## Resources | ||
|
||
The ESP Zigbee SDK provides more examples: | ||
* ESP Zigbee SDK Docs: [Link](https://docs.espressif.com/projects/esp-zigbee-sdk) | ||
* ESP Zigbee SDK Repo: [Link](https://github.com/espressif/esp-zigbee-sdk) | ||
|
||
* Official ESP32 Forum: [Link](https://esp32.com) | ||
* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) | ||
* ESP32 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf) | ||
* ESP32-S2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf) | ||
* ESP32-C3 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf) | ||
* ESP32-S3 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf) | ||
* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) |
191 changes: 191 additions & 0 deletions
191
libraries/ESP32/examples/Zigbee/Zigbee_Light_Bulb/Zigbee_Light_Bulb.ino
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,191 @@ | ||
// Copyright 2023 Espressif Systems (Shanghai) PTE LTD | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
|
||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
/** | ||
* @brief This example demonstrates simple Zigbee light bulb. | ||
* | ||
* The example demonstrates how to use ESP Zigbee stack to create a end device light bulb. | ||
* The light bulb is a Zigbee end device, which is controlled by a Zigbee coordinator. | ||
* | ||
* Proper Zigbee mode must be selected in Tools->Zigbee mode | ||
* and also the correct partition scheme must be selected in Tools->Partition Scheme. | ||
* | ||
* Please check the README.md for instructions and more detailed description. | ||
*/ | ||
|
||
#ifndef ZIGBEE_MODE_ED | ||
#error "Zigbee end device mode is not selected in Tools->Zigbee mode" | ||
#endif | ||
|
||
#include "esp_zigbee_core.h" | ||
#include "freertos/FreeRTOS.h" | ||
#include "freertos/task.h" | ||
#include "ha/esp_zigbee_ha_standard.h" | ||
|
||
#define LED_PIN RGB_BUILTIN | ||
|
||
/* Default End Device config */ | ||
#define ESP_ZB_ZED_CONFIG() \ | ||
{ \ | ||
.esp_zb_role = ESP_ZB_DEVICE_TYPE_ED, \ | ||
.install_code_policy = INSTALLCODE_POLICY_ENABLE, \ | ||
.nwk_cfg = { \ | ||
.zed_cfg = { \ | ||
.ed_timeout = ED_AGING_TIMEOUT, \ | ||
.keep_alive = ED_KEEP_ALIVE, \ | ||
}, \ | ||
}, \ | ||
} | ||
|
||
#define ESP_ZB_DEFAULT_RADIO_CONFIG() \ | ||
{ \ | ||
.radio_mode = RADIO_MODE_NATIVE, \ | ||
} | ||
|
||
#define ESP_ZB_DEFAULT_HOST_CONFIG() \ | ||
{ \ | ||
.host_connection_mode = HOST_CONNECTION_MODE_NONE, \ | ||
} | ||
|
||
/* Zigbee configuration */ | ||
#define INSTALLCODE_POLICY_ENABLE false /* enable the install code policy for security */ | ||
#define ED_AGING_TIMEOUT ESP_ZB_ED_AGING_TIMEOUT_64MIN | ||
#define ED_KEEP_ALIVE 3000 /* 3000 millisecond */ | ||
#define HA_ESP_LIGHT_ENDPOINT 10 /* esp light bulb device endpoint, used to process light controlling commands */ | ||
#define ESP_ZB_PRIMARY_CHANNEL_MASK ESP_ZB_TRANSCEIVER_ALL_CHANNELS_MASK /* Zigbee primary channel mask use in the example */ | ||
|
||
/********************* Zigbee functions **************************/ | ||
static void bdb_start_top_level_commissioning_cb(uint8_t mode_mask) | ||
{ | ||
ESP_ERROR_CHECK(esp_zb_bdb_start_top_level_commissioning(mode_mask)); | ||
} | ||
|
||
void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) | ||
{ | ||
uint32_t *p_sg_p = signal_struct->p_app_signal; | ||
esp_err_t err_status = signal_struct->esp_err_status; | ||
esp_zb_app_signal_type_t sig_type = (esp_zb_app_signal_type_t)*p_sg_p; | ||
switch (sig_type) { | ||
case ESP_ZB_ZDO_SIGNAL_SKIP_STARTUP: | ||
P-R-O-C-H-Y marked this conversation as resolved.
A36C
Show resolved
Hide resolved
|
||
log_i("Zigbee stack initialized"); | ||
esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_INITIALIZATION); | ||
break; | ||
case ESP_ZB_BDB_SIGNAL_DEVICE_FIRST_START: | ||
case ESP_ZB_BDB_SIGNAL_DEVICE_REBOOT: | ||
if (err_status == ESP_OK) { | ||
log_i("Start network steering"); | ||
esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_NETWORK_STEERING); | ||
} else { | ||
/* commissioning failed */ | ||
log_w("Failed to initialize Zigbee stack (status: %s)", esp_err_to_name(err_status)); | ||
} | ||
break; | ||
case ESP_ZB_BDB_SIGNAL_STEERING: | ||
if (err_status == ESP_OK) { | ||
esp_zb_ieee_addr_t extended_pan_id; | ||
esp_zb_get_extended_pan_id(extended_pan_id); | ||
log_i("Joined network successfully (Extended PAN ID: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x, PAN ID: 0x%04hx, Channel:%d, Short Address: 0x%04hx)", | ||
extended_pan_id[7], extended_pan_id[6], extended_pan_id[5], extended_pan_id[4], | ||
extended_pan_id[3], extended_pan_id[2], extended_pan_id[1], extended_pan_id[0], | ||
esp_zb_get_pan_id(), esp_zb_get_current_channel(), esp_zb_get_short_address()); | ||
} else { | ||
log_i("Network steering was not successful (status: %s)", esp_err_to_name(err_status)); | ||
esp_zb_scheduler_alarm((esp_zb_callback_t)bdb_start_top_level_commissioning_cb, ESP_ZB_BDB_MODE_NETWORK_STEERING, 1000); | ||
} | ||
break; | ||
default: | ||
log_i("ZDO signal: %s (0x%x), status: %s", esp_zb_zdo_signal_to_string(sig_type), sig_type, | ||
esp_err_to_name(err_status)); | ||
break; | ||
} | ||
} | ||
|
||
static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, const void *message) | ||
{ | ||
esp_err_t ret = ESP_OK; | ||
switch (callback_id) { | ||
case ESP_ZB_CORE_SET_ATTR_VALUE_CB_ID: | ||
ret = zb_attribute_handler((esp_zb_zcl_set_attr_value_message_t *)message); | ||
break; | ||
default: | ||
log_w("Receive Zigbee action(0x%x) callback", callback_id); | ||
break; | ||
} | ||
return ret; | ||
} | ||
|
||
static void esp_zb_task(void *pvParameters) | ||
{ | ||
esp_zb_cfg_t zb_nwk_cfg = ESP_ZB_ZED_CONFIG(); | ||
esp_zb_init(&zb_nwk_cfg); | ||
esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG(); | ||
esp_zb_ep_list_t *esp_zb_on_off_light_ep = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &light_cfg); | ||
esp_zb_device_register(esp_zb_on_off_light_ep); | ||
esp_zb_core_action_handler_register(zb_action_handler); | ||
esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK); | ||
|
||
//Erase NVRAM before creating connection to new Coordinator | ||
//esp_zb_nvram_erase_at_start(true); //Comment out this line to erase NVRAM data if you are conneting to new Coordinator | ||
|
||
ESP_ERROR_CHECK(esp_zb_start(false)); | ||
P-R-O-C-H-Y marked this conversation as resolved.
Show resolved
Hide resolved
|
||
esp_zb_main_loop_iteration(); | ||
} | ||
|
||
/* Handle the light attribute */ | ||
|
||
static esp_err_t zb_attribute_handler(const esp_zb_zcl_set_attr_value_message_t *message) | ||
{ | ||
esp_err_t ret = ESP_OK; | ||
bool light_state = 0; | ||
|
||
if(!message){ | ||
log_e("Empty message"); | ||
} | ||
if(message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS){ | ||
log_e("Received message: error status(%d)", message->info.status); | ||
} | ||
|
||
log_i("Received message: endpoint(%d), cluster(0x%x), attribute(0x%x), data size(%d)", message->info.dst_endpoint, message->info.cluster, | ||
message->attribute.id, message->attribute.data.size); | ||
if (message->info.dst_endpoint == HA_ESP_LIGHT_ENDPOINT) { | ||
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) { | ||
light_state = message->attribute.data.value ? *(bool *)message->attribute.data.value : light_state; | ||
log_i("Light sets to %s", light_state ? "On" : "Off"); | ||
neopixelWrite(LED_PIN,255*light_state,255*light_state,255*light_state); // Toggle light | ||
} | ||
} | ||
} | ||
return ret; | ||
} | ||
|
||
/********************* Arduino functions **************************/ | ||
void setup() { | ||
// Init Zigbee | ||
esp_zb_platform_config_t config = { | ||
.radio_config = ESP_ZB_DEFAULT_RADIO_CONFIG(), | ||
.host_config = ESP_ZB_DEFAULT_HOST_CONFIG(), | ||
}; | ||
P-R-O-C-H-Y marked this conversation as resolved.
Show resolved
Hide resolved
|
||
ESP_ERROR_CHECK(esp_zb_platform_config(&config)); | ||
|
||
// Init RMT and leave light OFF | ||
neopixelWrite(LED_PIN,0,0,0); | ||
|
||
// Start Zigbee task | ||
xTaskCreate(esp_zb_task, "Zigbee_main", 4096, NULL, 5, NULL); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this task looks like something that you can just execute here. |
||
} | ||
|
||
void loop() { | ||
//empty, zigbee running in task | ||
} |
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
70 changes: 70 additions & 0 deletions
70
libraries/ESP32/examples/Zigbee/Zigbee_Light_Switch/README.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
# Arduino-ESP32 Zigbee Light Switch Example | ||
|
||
This example shows how to configure Zigbee Coordinator and use it as an HA on/off light switch. | ||
|
||
**This example is based on ESP-Zigbee-SDK example esp_zigbee_HA_sample/HA_on_off_switch.** | ||
|
||
# Supported Targets | ||
|
||
Currently, this example supports the following targets. | ||
|
||
| Supported Targets | ESP32-C6 | ESP32-H2 | | ||
| ----------------- | -------- | -------- | | ||
|
||
## Hardware Required | ||
|
||
* One development board (ESP32-H2 or ESP32-C6) acting as Zigbee end device (loaded with Zigbee_Light_bulb example). | ||
* A USB cable for power supply and programming. | ||
* Choose another board (ESP32-H2 or ESP32-C6) as Zigbee coordinator (loaded with Zigbee_Light_switch example). | ||
|
||
### Configure the Project | ||
|
||
Set the Button Switch GPIO by changing the `GPIO_INPUT_IO_TOGGLE_SWITCH` definition. By default, the LED_PIN is `GPIO_NUM_9`. | ||
|
||
#### Using Arduino IDE | ||
|
||
To get more information about the Espressif boards see [Espressif Development Kits](https://www.espressif.com/en/products/devkits). | ||
|
||
* Before Compile/Verify, select the correct board: `Tools -> Board`. | ||
* Select the Coordinator Zigbee mode: `Tools -> Zigbee mode: Zigbee ZCZR (coordinator)`. | ||
* Select Partition Scheme for Zigbee: `Tools -> Partition Scheme: Zigbee 4MB with spiffs`. | ||
* Select the COM port: `Tools -> Port: xxx where the `xxx` is the detected COM port. | ||
* Optional: Set debug level to info to see logs from Zigbee stack: `Tools -> Core Debug Level: Info`. | ||
|
||
## Troubleshooting | ||
|
||
If the End device flashed with the example `Zigbee_Light_Bulb` is not connecting to the coordinator, erase the flash of the End device before flashing the example to the board. It is recommended to do this if you re-flash the coordinator. | ||
You can do the following: | ||
|
||
* In the Arduino IDE go to the Tools menu and set `Erase All Flash Before Sketch Upload` to `Enabled`. | ||
* In the `Zigbee_Light_Bulb` example sketch uncomment function `esp_zb_nvram_erase_at_start(true);` located in `esp_zb_task` function. | ||
|
||
***Important: Make sure you are using a good quality USB cable and that you have a reliable power source*** | ||
|
||
* **LED not blinking:** Check the wiring connection and the IO selection. | ||
* **Programming Fail:** If the programming/flash procedure fails, try reducing the serial connection speed. | ||
* **COM port not detected:** Check the USB cable and the USB to Serial driver installation. | ||
|
||
If the error persists, you can ask for help at the official [ESP32 forum](https://esp32.com) or see [Contribute](#contribute). | ||
|
||
## Contribute | ||
|
||
To know how to contribute to this project, see [How to contribute.](https://github.com/espressif/arduino-esp32/blob/master/CONTRIBUTING.rst) | ||
|
||
If you have any **feedback** or **issue** to report on this example/library, please open an issue or fix it by creating a new PR. Contributions are more than welcome! | ||
|
||
Before creating a new issue, be sure to try Troubleshooting and check if the same issue was already created by someone else. | ||
|
||
## Resources | ||
|
||
The ESP Zigbee SDK provides more examples: | ||
* ESP Zigbee SDK Docs: [Link](https://docs.espressif.com/projects/esp-zigbee-sdk) | ||
* ESP Zigbee SDK Repo: [Link](https://github.com/espressif/esp-zigbee-sdk) | ||
|
||
* Official ESP32 Forum: [Link](https://esp32.com) | ||
* Arduino-ESP32 Official Repository: [espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) | ||
* ESP32 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf) | ||
* ESP32-S2 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf) | ||
* ESP32-C3 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf) | ||
* ESP32-S3 Datasheet: [Link to datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf) | ||
* Official ESP-IDF documentation: [ESP-IDF](https://idf.espressif.com) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.