Skip to content

Commit 2f423af

Browse files
P-R-O-C-H-Ylucasssvazpre-commit-ci-lite[bot]
authored
fix(zigbee): Fixes of timeout, example, warnings and bounding + add a 2MB part scheme for Zigbee ED (#10817)
* feat(zigbee): Add 2MB partition scheme for ED * fix(example): Check if readings are not null * fix(zigbee): Add a 10s timeout for temp sensor settings read * fix(example): Remove duplicated read * fix(zigbee): Check if device is not bound before bounding again * fix(zigbee): Revert zigbee partitions name * fix(zigbee): Fix warnings of missing initializer for member * fix(zigbee): Fix typo in the comment Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent c23c786 commit 2f423af

11 files changed

+108
-143
lines changed

boards.txt

+6
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,9 @@ esp32h2.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728
453453
esp32h2.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs
454454
esp32h2.menu.PartitionScheme.zigbee.build.partitions=zigbee
455455
esp32h2.menu.PartitionScheme.zigbee.upload.maximum_size=1310720
456+
esp32h2.menu.PartitionScheme.zigbee_2MB=Zigbee 2MB with spiffs
457+
esp32h2.menu.PartitionScheme.zigbee_2MB.build.partitions=zigbee_2MB
458+
esp32h2.menu.PartitionScheme.zigbee_2MB.upload.maximum_size=1310720
456459
esp32h2.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs
457460
esp32h2.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr
458461
esp32h2.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720
@@ -645,6 +648,9 @@ esp32c6.menu.PartitionScheme.rainmaker_8MB.upload.maximum_size=4116480
645648
esp32c6.menu.PartitionScheme.zigbee=Zigbee 4MB with spiffs
646649
esp32c6.menu.PartitionScheme.zigbee.build.partitions=zigbee
647650
esp32c6.menu.PartitionScheme.zigbee.upload.maximum_size=1310720
651+
esp32c6.menu.PartitionScheme.zigbee_2MB=Zigbee 2MB with spiffs
652+
esp32c6.menu.PartitionScheme.zigbee_2MB.build.partitions=zigbee_2MB
653+
esp32c6.menu.PartitionScheme.zigbee_2MB.upload.maximum_size=1310720
648654
esp32c6.menu.PartitionScheme.zigbee_zczr=Zigbee ZCZR 4MB with spiffs
649655
esp32c6.menu.PartitionScheme.zigbee_zczr.build.partitions=zigbee_zczr
650656
esp32c6.menu.PartitionScheme.zigbee_zczr.upload.maximum_size=1310720

libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino

+8-2
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,14 @@ void setup() {
143143
"IEEE Address: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\r\n", device->ieee_addr[7], device->ieee_addr[6], device->ieee_addr[5], device->ieee_addr[4],
144144
device->ieee_addr[3], device->ieee_addr[2], device->ieee_addr[1], device->ieee_addr[0]
145145
);
146-
Serial.printf("Light manufacturer: %s\r\n", zbSwitch.readManufacturer(device->endpoint, device->short_addr, device->ieee_addr));
147-
Serial.printf("Light model: %s\r\n", zbSwitch.readModel(device->endpoint, device->short_addr, device->ieee_addr));
146+
char *manufacturer = zbSwitch.readManufacturer(device->endpoint, device->short_addr, device->ieee_addr);
147+
char *model = zbSwitch.readModel(device->endpoint, device->short_addr, device->ieee_addr);
148+
if (manufacturer != nullptr) {
149+
Serial.printf("Light manufacturer: %s\r\n", manufacturer);
150+
}
151+
if (model != nullptr) {
152+
Serial.printf("Light model: %s\r\n", model);
153+
}
148154
}
149155

150156
Serial.println();

libraries/Zigbee/src/ZigbeeCore.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,20 @@ void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) {
314314
// for each endpoint in the list call the findEndpoint function if not bounded or allowed to bind multiple devices
315315
for (std::list<ZigbeeEP *>::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) {
316316
if (!(*it)->bound() || (*it)->epAllowMultipleBinding()) {
317-
(*it)->findEndpoint(&cmd_req);
317+
// Check if the device is already bound
318+
bool found = false;
319+
// Get the list of devices bound to the EP
320+
std::list<zb_device_params_t *> bound_devices = (*it)->getBoundDevices();
321+
for (std::list<zb_device_params_t *>::iterator device = bound_devices.begin(); device != bound_devices.end(); ++device) {
322+
if (((*device)->short_addr == dev_annce_params->device_short_addr) || (memcmp((*device)->ieee_addr, dev_annce_params->ieee_addr, 8) == 0)) {
323+
found = true;
324+
log_d("Device already bound to endpoint %d", (*it)->getEndpoint());
325+
break;
326+
}
327+
}
328+
if (!found) {
329+
(*it)->findEndpoint(&cmd_req);
330+
}
318331
}
319332
}
320333
}

libraries/Zigbee/src/ZigbeeEP.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
#include "esp_zigbee_cluster.h"
88
#include "zcl/esp_zigbee_zcl_power_config.h"
99

10-
#define ZB_CMD_TIMEOUT 10000 // 10 seconds
11-
1210
bool ZigbeeEP::_is_bound = false;
1311
bool ZigbeeEP::_allow_multiple_binding = false;
1412

libraries/Zigbee/src/ZigbeeEP.h

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include <Arduino.h>
99

1010
/* Useful defines */
11+
#define ZB_CMD_TIMEOUT 10000 // 10 seconds
12+
1113
#define ZB_ARRAY_LENTH(arr) (sizeof(arr) / sizeof(arr[0]))
1214
#define XYZ_TO_RGB(X, Y, Z, r, g, b) \
1315
{ \

libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp

+14-28
Original file line numberDiff line numberDiff line change
@@ -45,34 +45,20 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max
4545
if (delta > 0) {
4646
log_e("Delta reporting is currently not supported by the carbon dioxide sensor");
4747
}
48-
// clang-format off
49-
esp_zb_zcl_reporting_info_t reporting_info = {
50-
.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV,
51-
.ep = _endpoint,
52-
.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT,
53-
.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE,
54-
.attr_id = ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID,
55-
.u =
56-
{
57-
.send_info =
58-
{
59-
.min_interval = min_interval,
60-
.max_interval = max_interval,
61-
.delta =
62-
{
63-
.u16 = delta,
64-
},
65-
.def_min_interval = min_interval,
66-
.def_max_interval = max_interval,
67-
},
68-
},
69-
.dst =
70-
{
71-
.profile_id = ESP_ZB_AF_HA_PROFILE_ID,
72-
},
73-
.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC,
74-
};
75-
// clang-format on
48+
esp_zb_zcl_reporting_info_t reporting_info;
49+
memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t));
50+
reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV;
51+
reporting_info.ep = _endpoint;
52+
reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_CARBON_DIOXIDE_MEASUREMENT;
53+
reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE;
54+
reporting_info.attr_id = ESP_ZB_ZCL_ATTR_CARBON_DIOXIDE_MEASUREMENT_MEASURED_VALUE_ID;
55+
reporting_info.u.send_info.min_interval = min_interval;
56+
reporting_info.u.send_info.max_interval = max_interval;
57+
reporting_info.u.send_info.def_min_interval = min_interval;
58+
reporting_info.u.send_info.def_max_interval = max_interval;
59+
reporting_info.u.send_info.delta.u16 = delta;
60+
reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID;
61+
reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
7662
esp_zb_lock_acquire(portMAX_DELAY);
7763
esp_zb_zcl_update_reporting_info(&reporting_info);
7864
esp_zb_lock_release();

libraries/Zigbee/src/ep/ZigbeeFlowSensor.cpp

+14-28
Original file line numberDiff line numberDiff line change
@@ -41,34 +41,20 @@ void ZigbeeFlowSensor::setTolerance(float tolerance) {
4141
}
4242

4343
void ZigbeeFlowSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) {
44-
// clang-format off
45-
esp_zb_zcl_reporting_info_t reporting_info = {
46-
.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV,
47-
.ep = _endpoint,
48-
.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT,
49-
.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE,
50-
.attr_id = ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_VALUE_ID,
51-
.u =
52-
{
53-
.send_info =
54-
{
55-
.min_interval = min_interval,
56-
.max_interval = max_interval,
57-
.delta =
58-
{
59-
.u16 = (uint16_t)(delta * 10), // Convert delta to ZCL uint16_t
60-
},
61-
.def_min_interval = min_interval,
62-
.def_max_interval = max_interval,
63-
},
64-
},
65-
.dst =
66-
{
67-
.profile_id = ESP_ZB_AF_HA_PROFILE_ID,
68-
},
69-
.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC,
70-
};
71-
// clang-format on
44+
esp_zb_zcl_reporting_info_t reporting_info;
45+
memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t));
46+
reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV;
47+
reporting_info.ep = _endpoint;
48+
reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_FLOW_MEASUREMENT;
49+
reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE;
50+
reporting_info.attr_id = ESP_ZB_ZCL_ATTR_FLOW_MEASUREMENT_VALUE_ID;
51+
reporting_info.u.send_info.min_interval = min_interval;
52+
reporting_info.u.send_info.max_interval = max_interval;
53+
reporting_info.u.send_info.def_min_interval = min_interval;
54+
reporting_info.u.send_info.def_max_interval = max_interval;
55+
reporting_info.u.send_info.delta.u16 = (uint16_t)(delta * 10); // Convert delta to ZCL uint16_t
56+
reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID;
57+
reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
7258
esp_zb_lock_acquire(portMAX_DELAY);
7359
esp_zb_zcl_update_reporting_info(&reporting_info);
7460
esp_zb_lock_release();

libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp

+14-28
Original file line numberDiff line numberDiff line change
@@ -38,34 +38,20 @@ void ZigbeePressureSensor::setTolerance(uint16_t tolerance) {
3838
}
3939

4040
void ZigbeePressureSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) {
41-
// clang-format off
42-
esp_zb_zcl_reporting_info_t reporting_info = {
43-
.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV,
44-
.ep = _endpoint,
45-
.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT,
46-
.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE,
47-
.attr_id = ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_ID,
48-
.u =
49-
{
50-
.send_info =
51-
{
52-
.min_interval = min_interval,
53-
.max_interval = max_interval,
54-
.delta =
55-
{
56-
.u16 = delta, // x hPa
57-
},
58-
.def_min_interval = min_interval,
59-
.def_max_interval = max_interval,
60-
},
61-
},
62-
.dst =
63-
{
64-
.profile_id = ESP_ZB_AF_HA_PROFILE_ID,
65-
},
66-
.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC,
67-
};
68-
// clang-format on
41+
esp_zb_zcl_reporting_info_t reporting_info;
42+
memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t));
43+
reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV;
44+
reporting_info.ep = _endpoint;
45+
reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_PRESSURE_MEASUREMENT;
46+
reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE;
47+
reporting_info.attr_id = ESP_ZB_ZCL_ATTR_PRESSURE_MEASUREMENT_VALUE_ID;
48+
reporting_info.u.send_info.min_interval = min_interval;
49+
reporting_info.u.send_info.max_interval = max_interval;
50+
reporting_info.u.send_info.def_min_interval = min_interval;
51+
reporting_info.u.send_info.def_max_interval = max_interval;
52+
reporting_info.u.send_info.delta.u16 = delta; // x hPa
53+
reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID;
54+
reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
6955
esp_zb_lock_acquire(portMAX_DELAY);
7056
esp_zb_zcl_update_reporting_info(&reporting_info);
7157
esp_zb_lock_release();

libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp

+28-53
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,20 @@ void ZigbeeTempSensor::setTolerance(float tolerance) {
3535
}
3636

3737
void ZigbeeTempSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) {
38-
esp_zb_zcl_reporting_info_t reporting_info = {
39-
.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV,
40-
.ep = _endpoint,
41-
.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT,
42-
.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE,
43-
.attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID,
44-
.u =
45-
{
46-
.send_info =
47-
{
48-
.min_interval = min_interval,
49-
.max_interval = max_interval,
50-
.delta =
51-
{
52-
.u16 = (uint16_t)(delta * 100), // Convert delta to ZCL uint16_t
53-
},
54-
.def_min_interval = min_interval,
55-
.def_max_interval = max_interval,
56-
},
57-
},
58-
.dst =
59-
{
60-
.profile_id = ESP_ZB_AF_HA_PROFILE_ID,
61-
},
62-
.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC,
63-
};
64-
esp_zb_lock_acquire(portMAX_DELAY);
38+
esp_zb_zcl_reporting_info_t reporting_info;
39+
memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t));
40+
reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV;
41+
reporting_info.ep = _endpoint;
42+
reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT;
43+
reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE;
44+
reporting_info.attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID;
45+
reporting_info.u.send_info.min_interval = min_interval;
46+
reporting_info.u.send_info.max_interval = max_interval;
47+
reporting_info.u.send_info.def_min_interval = min_interval;
48+
reporting_info.u.send_info.def_max_interval = max_interval;
49+
reporting_info.u.send_info.delta.u16 = (uint16_t)(delta * 100); // Convert delta to ZCL uint16_t
50+
reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID;
51+
reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, esp_zb_lock_acquire(portMAX_DELAY);
6552
esp_zb_zcl_update_reporting_info(&reporting_info);
6653
esp_zb_lock_release();
6754
}
@@ -136,32 +123,20 @@ void ZigbeeTempSensor::reportHumidity() {
136123
}
137124

138125
void ZigbeeTempSensor::setHumidityReporting(uint16_t min_interval, uint16_t max_interval, float delta) {
139-
esp_zb_zcl_reporting_info_t reporting_info = {
140-
.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV,
141-
.ep = _endpoint,
142-
.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT,
143-
.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE,
144-
.attr_id = ESP_ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID,
145-
.u =
146-
{
147-
.send_info =
148-
{
149-
.min_interval = min_interval,
150-
.max_interval = max_interval,
151-
.delta =
152-
{
153-
.u16 = (uint16_t)(delta * 100), // Convert delta to ZCL uint16_t
154-
},
155-
.def_min_interval = min_interval,
156-
.def_max_interval = max_interval,
157-
},
158-
},
159-
.dst =
160-
{
161-
.profile_id = ESP_ZB_AF_HA_PROFILE_ID,
162-
},
163-
.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC,
164-
};
126+
esp_zb_zcl_reporting_info_t reporting_info;
127+
memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t));
128+
reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV;
129+
reporting_info.ep = _endpoint;
130+
reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT;
131+
reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE;
132+
reporting_info.attr_id = ESP_ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID;
133+
reporting_info.u.send_info.min_interval = min_interval;
134+
reporting_info.u.send_info.max_interval = max_interval;
135+
reporting_info.u.send_info.def_min_interval = min_interval;
136+
reporting_info.u.send_info.def_max_interval = max_interval;
137+
reporting_info.u.send_info.delta.u16 = (uint16_t)(delta * 100); // Convert delta to ZCL uint16_t
138+
reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID;
139+
reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
165140
esp_zb_lock_acquire(portMAX_DELAY);
166141
esp_zb_zcl_update_reporting_info(&reporting_info);
167142
esp_zb_lock_release();

libraries/Zigbee/src/ep/ZigbeeThermostat.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void ZigbeeThermostat::getSensorSettings() {
166166
esp_zb_lock_release();
167167

168168
//Take semaphore to wait for response of all attributes
169-
if (xSemaphoreTake(lock, portMAX_DELAY) != pdTRUE) {
169+
if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) {
170170
log_e("Error while reading attributes");
171171
return;
172172
} else {

tools/partitions/zigbee_2MB.csv

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Name, Type, SubType, Offset, Size, Flags
2+
nvs, data, nvs, 0x9000, 0x5000,
3+
factory, app, factory, 0x10000, 0x140000,
4+
spiffs, data, spiffs, 0x150000,0x9B000,
5+
zb_storage, data, fat, 0x1EB000,0x4000,
6+
zb_fct, data, fat, 0x1EF000,0x1000,
7+
coredump, data, coredump,0x1F0000,0x10000,

0 commit comments

Comments
 (0)