Skip to content

Commit 65b9383

Browse files
committed
fix(zigbee): Add error checks to Illuminance EP
1 parent 382073a commit 65b9383

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp

+49-11
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,40 @@ ZigbeeIlluminanceSensor::ZigbeeIlluminanceSensor(uint8_t endpoint) : ZigbeeEP(en
1010
_ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_LIGHT_SENSOR_DEVICE_ID, .app_device_version = 0};
1111
}
1212

13-
void ZigbeeIlluminanceSensor::setMinMaxValue(uint16_t min, uint16_t max) {
13+
bool ZigbeeIlluminanceSensor::setMinMaxValue(uint16_t min, uint16_t max) {
1414
esp_zb_attribute_list_t *light_measure_cluster =
1515
esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
16-
esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&min);
17-
esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&max);
16+
if (!light_measure_cluster) {
17+
log_e("Failed to get illuminance measurement cluster");
18+
return false;
19+
}
20+
esp_err_t ret_min = esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&min);
21+
if (ret_min != ESP_OK) {
22+
log_e("Failed to set min value: 0x%x: %s", ret_min, esp_err_to_name(ret_min));
23+
}
24+
esp_err_t ret_max = esp_zb_cluster_update_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&max);
25+
if (ret_max != ESP_OK) {
26+
log_e("Failed to set max value: 0x%x: %s", ret_max, esp_err_to_name(ret_max));
27+
}
28+
return ret_min == ESP_OK && ret_max == ESP_OK;
1829
}
1930

20-
void ZigbeeIlluminanceSensor::setTolerance(uint16_t tolerance) {
31+
bool ZigbeeIlluminanceSensor::setTolerance(uint16_t tolerance) {
2132
esp_zb_attribute_list_t *light_measure_cluster =
2233
esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
23-
esp_zb_illuminance_meas_cluster_add_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance);
34+
if (!light_measure_cluster) {
35+
log_e("Failed to get illuminance measurement cluster");
36+
return false;
37+
}
38+
esp_err_t ret = esp_zb_illuminance_meas_cluster_add_attr(light_measure_cluster, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_TOLERANCE_ID, (void *)&tolerance);
39+
if (ret != ESP_OK) {
40+
log_e("Failed to set tolerance: 0x%x: %s", ret, esp_err_to_name(ret));
41+
return false;
42+
}
43+
return true;
2444
}
2545

26-
void ZigbeeIlluminanceSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) {
46+
bool ZigbeeIlluminanceSensor::setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta) {
2747
esp_zb_zcl_reporting_info_t reporting_info;
2848
memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t));
2949
reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV;
@@ -38,24 +58,37 @@ void ZigbeeIlluminanceSensor::setReporting(uint16_t min_interval, uint16_t max_i
3858
reporting_info.u.send_info.delta.u16 = delta;
3959
reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID;
4060
reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
61+
4162
esp_zb_lock_acquire(portMAX_DELAY);
42-
esp_zb_zcl_update_reporting_info(&reporting_info);
63+
esp_err_t ret = esp_zb_zcl_update_reporting_info(&reporting_info);
4364
esp_zb_lock_release();
65+
66+
if (ret != ESP_OK) {
67+
log_e("Failed to set reporting: 0x%x: %s", ret, esp_err_to_name(ret));
68+
return false;
69+
}
70+
return true;
4471
}
4572

46-
void ZigbeeIlluminanceSensor::setIlluminance(uint16_t illuminanceValue) {
73+
bool ZigbeeIlluminanceSensor::setIlluminance(uint16_t illuminanceValue) {
74+
esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS;
4775
log_v("Updating Illuminance...");
4876
/* Update illuminance sensor measured illuminance */
4977
log_d("Setting Illuminance to %d", illuminanceValue);
5078
esp_zb_lock_acquire(portMAX_DELAY);
51-
esp_zb_zcl_set_attribute_val(
79+
ret = esp_zb_zcl_set_attribute_val(
5280
_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID,
5381
&illuminanceValue, false
5482
);
5583
esp_zb_lock_release();
84+
if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) {
85+
log_e("Failed to set illuminance: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret));
86+
return false;
87+
}
88+
return true;
5689
}
5790

58-
void ZigbeeIlluminanceSensor::report() {
91+
bool ZigbeeIlluminanceSensor::report() {
5992
/* Send report attributes command */
6093
esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
6194
report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
@@ -66,9 +99,14 @@ void ZigbeeIlluminanceSensor::report() {
6699
report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
67100

68101
esp_zb_lock_acquire(portMAX_DELAY);
69-
esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd);
102+
esp_err_t ret = esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd);
70103
esp_zb_lock_release();
104+
if (ret != ESP_OK) {
105+
log_e("Failed to send illuminance report: 0x%x: %s", ret, esp_err_to_name(ret));
106+
return false;
107+
}
71108
log_v("Illuminance report sent");
109+
return true;
72110
}
73111

74112
#endif // CONFIG_ZB_ENABLED

libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,19 @@ class ZigbeeIlluminanceSensor : public ZigbeeEP {
3333
~ZigbeeIlluminanceSensor() {}
3434

3535
// Set the illuminance value
36-
void setIlluminance(uint16_t value);
36+
bool setIlluminance(uint16_t value);
3737

3838
// Set the min and max value for the illuminance sensor
39-
void setMinMaxValue(uint16_t min, uint16_t max);
39+
bool setMinMaxValue(uint16_t min, uint16_t max);
4040

4141
// Set the tolerance value for the illuminance sensor
42-
void setTolerance(uint16_t tolerance);
42+
bool setTolerance(uint16_t tolerance);
4343

4444
// Set the reporting interval for illuminance measurement in seconds and delta
45-
void setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta);
45+
bool setReporting(uint16_t min_interval, uint16_t max_interval, uint16_t delta);
4646

4747
// Report the illuminance value
48-
void report();
48+
bool report();
4949
};
5050

5151
#endif // CONFIG_ZB_ENABLED

0 commit comments

Comments
 (0)