Skip to content

Commit a3b6fe6

Browse files
feat(zigbee): Add check, boolean returns, fix Analog, add optional reset on factoryReset (espressif#11153)
* feat(zigbee): Add checks on setting attrs and commands * feat(zigbee): Add error info in the logs * fix(zigbee): Fix memory leak, print esp_zb_zcl_status_t error, remove analogValue from analog EP * feat(example): Update factoryResetoption in sleepy example * fix(zigbee): Add error checks to Illuminance EP * fix(zigbee): Return false on first error hit * fix(zigbee): Apply same formatting on all returns * fix(zigbee): Add check when adding a OTA cluster * fix(zigbee): release locks before returning * fix(zigbee): use correct return in doorWindowHandle * fix/zigbee): Add missing return in WindowCovering * fix(zigbee): Added a note of future task * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent bbaabb1 commit a3b6fe6

35 files changed

+889
-377
lines changed

Diff for: libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino

+5-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,11 @@ void loop() {
133133
// If key pressed for more than 10secs, factory reset Zigbee and reboot
134134
Serial.println("Resetting Zigbee to factory and rebooting in 1s.");
135135
delay(1000);
136-
Zigbee.factoryReset();
136+
// Optional set reset in factoryReset to false, to not restart device after erasing nvram, but set it to endless sleep manually instead
137+
Zigbee.factoryReset(false);
138+
Serial.println("Going to endless sleep, press RESET button or power off/on the device to wake up");
139+
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER);
140+
esp_deep_sleep_start();
137141
}
138142
}
139143
}

Diff for: libraries/Zigbee/src/ZigbeeCore.cpp

+20-9
Original file line numberDiff line numberDiff line change
@@ -91,21 +91,26 @@ bool ZigbeeCore::begin(zigbee_role_t role, bool erase_nvs) {
9191
return started();
9292
}
9393

94-
void ZigbeeCore::addEndpoint(ZigbeeEP *ep) {
94+
bool ZigbeeCore::addEndpoint(ZigbeeEP *ep) {
9595
ep_objects.push_back(ep);
9696

9797
log_d("Endpoint: %d, Device ID: 0x%04x", ep->_endpoint, ep->_device_id);
9898
//Register clusters and ep_list to the ZigbeeCore class's ep_list
9999
if (ep->_ep_config.endpoint == 0 || ep->_cluster_list == nullptr) {
100100
log_e("Endpoint config or Cluster list is not initialized, EP not added to ZigbeeCore's EP list");
101-
return;
101+
return false;
102102
}
103-
103+
esp_err_t ret = ESP_OK;
104104
if (ep->_device_id == ESP_ZB_HA_HOME_GATEWAY_DEVICE_ID) {
105-
esp_zb_ep_list_add_gateway_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config);
105+
ret = esp_zb_ep_list_add_gateway_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config);
106106
} else {
107-
esp_zb_ep_list_add_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config);
107+
ret = esp_zb_ep_list_add_ep(_zb_ep_list, ep->_cluster_list, ep->_ep_config);
108+
}
109+
if (ret != ESP_OK) {
110+
log_e("Failed to add endpoint: 0x%x: %s", ret, esp_err_to_name(ret));
111+
return false;
108112
}
113+
return true;
109114
}
110115

111116
static void esp_zb_task(void *pvParameters) {
@@ -368,16 +373,22 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) {
368373
case ESP_ZB_ZDO_SIGNAL_LEAVE: // End Device + Router
369374
// Device was removed from the network, factory reset the device
370375
if ((zigbee_role_t)Zigbee.getRole() != ZIGBEE_COORDINATOR) {
371-
Zigbee.factoryReset();
376+
Zigbee.factoryReset(true);
372377
}
373378
break;
374379
default: log_v("ZDO signal: %s (0x%x), status: %s", esp_zb_zdo_signal_to_string(sig_type), sig_type, esp_err_to_name(err_status)); break;
375380
}
376381
}
377382

378-
void ZigbeeCore::factoryReset() {
379-
log_v("Factory resetting Zigbee stack, device will reboot");
380-
esp_zb_factory_reset();
383+
void ZigbeeCore::factoryReset(bool restart) {
384+
if (restart) {
385+
log_v("Factory resetting Zigbee stack, device will reboot");
386+
esp_zb_factory_reset();
387+
} else {
388+
log_v("Factory resetting Zigbee NVRAM to factory default");
389+
log_w("The device will not reboot, to take effect please reboot the device manually");
390+
esp_zb_zcl_reset_nvram_to_factory_default();
391+
}
381392
}
382393

383394
void ZigbeeCore::scanCompleteCallback(esp_zb_zdp_status_t zdo_status, uint8_t count, esp_zb_network_descriptor_t *nwk_descriptor) {

Diff for: libraries/Zigbee/src/ZigbeeCore.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ class ZigbeeCore {
129129
return _role;
130130
}
131131

132-
void addEndpoint(ZigbeeEP *ep);
132+
bool addEndpoint(ZigbeeEP *ep);
133133
//void removeEndpoint(ZigbeeEP *ep);
134134

135135
void setRadioConfig(esp_zb_radio_config_t config);
@@ -164,7 +164,7 @@ class ZigbeeCore {
164164
zigbee_scan_result_t *getScanResult();
165165
void scanDelete();
166166

167-
void factoryReset();
167+
void factoryReset(bool restart = true);
168168

169169
// Friend function declaration to allow access to private members
170170
friend void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct);

0 commit comments

Comments
 (0)