From 1346c9c95efc5ab8875f06b83535dd9a308367e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:56:43 +0100 Subject: [PATCH 1/3] fix(zigbee): Fix co2 sensor delta in reporting --- libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp index eabc3c7c194..5def43f4199 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp @@ -56,9 +56,11 @@ void ZigbeeCarbonDioxideSensor::setReporting(uint16_t min_interval, uint16_t max reporting_info.u.send_info.max_interval = max_interval; reporting_info.u.send_info.def_min_interval = min_interval; reporting_info.u.send_info.def_max_interval = max_interval; - reporting_info.u.send_info.delta.u16 = delta; reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID; reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + float delta_f = delta / 1000000.0f; + memcpy(&reporting_info.u.send_info.delta.s32, &delta_f, sizeof(float)); + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_lock_release(); From ae99d088a9e48847a8d282be3c680d5af4f56e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:49:40 +0100 Subject: [PATCH 2/3] fix(zigbee): Declare default empty destructors --- libraries/Zigbee/src/ZigbeeCore.cpp | 1 - libraries/Zigbee/src/ZigbeeCore.h | 2 +- libraries/Zigbee/src/ZigbeeEP.cpp | 2 -- libraries/Zigbee/src/ZigbeeEP.h | 2 +- libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h | 2 +- libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h | 2 +- libraries/Zigbee/src/ep/ZigbeeDimmableLight.h | 2 +- libraries/Zigbee/src/ep/ZigbeeFlowSensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeeLight.h | 2 +- libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeePressureSensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeeSwitch.h | 2 +- libraries/Zigbee/src/ep/ZigbeeTempSensor.h | 2 +- libraries/Zigbee/src/ep/ZigbeeThermostat.h | 2 +- 15 files changed, 13 insertions(+), 16 deletions(-) diff --git a/libraries/Zigbee/src/ZigbeeCore.cpp b/libraries/Zigbee/src/ZigbeeCore.cpp index 0a3177919da..19f4d0872b8 100644 --- a/libraries/Zigbee/src/ZigbeeCore.cpp +++ b/libraries/Zigbee/src/ZigbeeCore.cpp @@ -29,7 +29,6 @@ ZigbeeCore::ZigbeeCore() { } } } -ZigbeeCore::~ZigbeeCore() {} //forward declaration static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, const void *message); diff --git a/libraries/Zigbee/src/ZigbeeCore.h b/libraries/Zigbee/src/ZigbeeCore.h index c72a60d81c4..02dce54e5ff 100644 --- a/libraries/Zigbee/src/ZigbeeCore.h +++ b/libraries/Zigbee/src/ZigbeeCore.h @@ -86,7 +86,7 @@ class ZigbeeCore { public: ZigbeeCore(); - ~ZigbeeCore(); + ~ZigbeeCore() {} std::list ep_objects; diff --git a/libraries/Zigbee/src/ZigbeeEP.cpp b/libraries/Zigbee/src/ZigbeeEP.cpp index 61f2fa8d2de..adc87540b83 100644 --- a/libraries/Zigbee/src/ZigbeeEP.cpp +++ b/libraries/Zigbee/src/ZigbeeEP.cpp @@ -27,8 +27,6 @@ ZigbeeEP::ZigbeeEP(uint8_t endpoint) { } } -ZigbeeEP::~ZigbeeEP() {} - void ZigbeeEP::setVersion(uint8_t version) { _ep_config.app_device_version = version; } diff --git a/libraries/Zigbee/src/ZigbeeEP.h b/libraries/Zigbee/src/ZigbeeEP.h index a5e9efa4283..d8ed900a7e6 100644 --- a/libraries/Zigbee/src/ZigbeeEP.h +++ b/libraries/Zigbee/src/ZigbeeEP.h @@ -55,7 +55,7 @@ typedef enum { class ZigbeeEP { public: ZigbeeEP(uint8_t endpoint = 10); - ~ZigbeeEP(); + ~ZigbeeEP() {} // Set ep config and cluster list void setEpConfig(esp_zb_endpoint_config_t ep_config, esp_zb_cluster_list_t *cluster_list) { diff --git a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h index 71c353d4695..7744fd02f00 100644 --- a/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.h @@ -39,7 +39,7 @@ typedef struct zigbee_carbon_dioxide_sensor_cfg_s { class ZigbeeCarbonDioxideSensor : public ZigbeeEP { public: ZigbeeCarbonDioxideSensor(uint8_t endpoint); - ~ZigbeeCarbonDioxideSensor(); + ~ZigbeeCarbonDioxideSensor() {} // Set the carbon dioxide value in ppm void setCarbonDioxide(float carbon_dioxide); diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h index 9fa59dcfffc..dad267c7b39 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmableLight.h @@ -12,7 +12,7 @@ class ZigbeeColorDimmableLight : public ZigbeeEP { public: ZigbeeColorDimmableLight(uint8_t endpoint); - ~ZigbeeColorDimmableLight(); + ~ZigbeeColorDimmableLight() {} void onLightChange(void (*callback)(bool, uint8_t, uint8_t, uint8_t, uint8_t)) { _on_light_change = callback; diff --git a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h index 8e2a4d9e1a3..ca67fb4ba62 100644 --- a/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeColorDimmerSwitch.h @@ -12,7 +12,7 @@ class ZigbeeColorDimmerSwitch : public ZigbeeEP { public: ZigbeeColorDimmerSwitch(uint8_t endpoint); - ~ZigbeeColorDimmerSwitch(); + ~ZigbeeColorDimmerSwitch() {} // methods to control the color dimmable light void lightToggle(); diff --git a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h index 034c34899b4..6f92c3315e4 100644 --- a/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeDimmableLight.h @@ -67,7 +67,7 @@ typedef struct zigbee_dimmable_light_cfg_s { class ZigbeeDimmableLight : public ZigbeeEP { public: ZigbeeDimmableLight(uint8_t endpoint); - ~ZigbeeDimmableLight(); + ~ZigbeeDimmableLight() {} void onLightChange(void (*callback)(bool, uint8_t)) { _on_light_change = callback; diff --git a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h index 3514e2fcc1b..7d5ec26f7ec 100644 --- a/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeFlowSensor.h @@ -39,7 +39,7 @@ typedef struct zigbee_flow_sensor_cfg_s { class ZigbeeFlowSensor : public ZigbeeEP { public: ZigbeeFlowSensor(uint8_t endpoint); - ~ZigbeeFlowSensor(); + ~ZigbeeFlowSensor() {} // Set the flow value in 0,1 m3/h void setFlow(float value); diff --git a/libraries/Zigbee/src/ep/ZigbeeLight.h b/libraries/Zigbee/src/ep/ZigbeeLight.h index 9b8fc409d4a..8cf8c35f781 100644 --- a/libraries/Zigbee/src/ep/ZigbeeLight.h +++ b/libraries/Zigbee/src/ep/ZigbeeLight.h @@ -12,7 +12,7 @@ class ZigbeeLight : public ZigbeeEP { public: ZigbeeLight(uint8_t endpoint); - ~ZigbeeLight(); + ~ZigbeeLight() {} // Use to set a cb function to be called on light change void onLightChange(void (*callback)(bool)) { diff --git a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h index e4b25c063e5..40c5eddbbdd 100644 --- a/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeOccupancySensor.h @@ -39,7 +39,7 @@ typedef struct zigbee_occupancy_sensor_cfg_s { class ZigbeeOccupancySensor : public ZigbeeEP { public: ZigbeeOccupancySensor(uint8_t endpoint); - ~ZigbeeOccupancySensor(); + ~ZigbeeOccupancySensor() {} // Set the occupancy value. True for occupied, false for unoccupied void setOccupancy(bool occupied); diff --git a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h index f088c033bb9..2d72ef04c06 100644 --- a/libraries/Zigbee/src/ep/ZigbeePressureSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeePressureSensor.h @@ -39,7 +39,7 @@ typedef struct zigbee_pressure_sensor_cfg_s { class ZigbeePressureSensor : public ZigbeeEP { public: ZigbeePressureSensor(uint8_t endpoint); - ~ZigbeePressureSensor(); + ~ZigbeePressureSensor() {} // Set the pressure value in 1 hPa void setPressure(int16_t value); diff --git a/libraries/Zigbee/src/ep/ZigbeeSwitch.h b/libraries/Zigbee/src/ep/ZigbeeSwitch.h index 62264641378..b638bfe823a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeSwitch.h +++ b/libraries/Zigbee/src/ep/ZigbeeSwitch.h @@ -12,7 +12,7 @@ class ZigbeeSwitch : public ZigbeeEP { public: ZigbeeSwitch(uint8_t endpoint); - ~ZigbeeSwitch(); + ~ZigbeeSwitch() {} // methods to control the on/off light void lightToggle(); diff --git a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h index 2951d4b7628..e610ff8d356 100644 --- a/libraries/Zigbee/src/ep/ZigbeeTempSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeTempSensor.h @@ -12,7 +12,7 @@ class ZigbeeTempSensor : public ZigbeeEP { public: ZigbeeTempSensor(uint8_t endpoint); - ~ZigbeeTempSensor(); + ~ZigbeeTempSensor() {} // Set the temperature value in 0,01°C void setTemperature(float value); diff --git a/libraries/Zigbee/src/ep/ZigbeeThermostat.h b/libraries/Zigbee/src/ep/ZigbeeThermostat.h index fe797ffd7b6..669ed9ab50a 100644 --- a/libraries/Zigbee/src/ep/ZigbeeThermostat.h +++ b/libraries/Zigbee/src/ep/ZigbeeThermostat.h @@ -32,7 +32,7 @@ class ZigbeeThermostat : public ZigbeeEP { public: ZigbeeThermostat(uint8_t endpoint); - ~ZigbeeThermostat(); + ~ZigbeeThermostat() {} void onTempRecieve(void (*callback)(float)) { _on_temp_recieve = callback; From 99448db53de16740c78c0ec1fe0698e08faccdbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:52:51 +0100 Subject: [PATCH 3/3] fix(zigbee): Return on error in zigbee handlers --- libraries/Zigbee/src/ZigbeeHandlers.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libraries/Zigbee/src/ZigbeeHandlers.cpp b/libraries/Zigbee/src/ZigbeeHandlers.cpp index 881d7ca0c37..e387b7ce432 100644 --- a/libraries/Zigbee/src/ZigbeeHandlers.cpp +++ b/libraries/Zigbee/src/ZigbeeHandlers.cpp @@ -29,9 +29,11 @@ static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id, static esp_err_t zb_attribute_set_handler(const esp_zb_zcl_set_attr_value_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; } log_v( @@ -55,9 +57,11 @@ static esp_err_t zb_attribute_set_handler(const esp_zb_zcl_set_attr_value_messag static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->status); + return ESP_ERR_INVALID_ARG; } log_v( "Received report from address(0x%x) src endpoint(%d) to dst endpoint(%d) cluster(0x%x)", message->src_address.u.short_addr, message->src_endpoint, @@ -75,9 +79,11 @@ static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_mes static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_resp_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; } log_v( "Read attribute response: from address(0x%x) src endpoint(%d) to dst endpoint(%d) cluster(0x%x)", message->info.src_address.u.short_addr, @@ -109,9 +115,11 @@ static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_re static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_report_resp_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; } esp_zb_zcl_config_report_resp_variable_t *variable = message->variables; while (variable) { @@ -127,9 +135,11 @@ static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_re static esp_err_t zb_cmd_default_resp_handler(const esp_zb_zcl_cmd_default_resp_message_t *message) { if (!message) { log_e("Empty message"); + return ESP_FAIL; } if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) { log_e("Received message: error status(%d)", message->info.status); + return ESP_ERR_INVALID_ARG; } log_v( "Received default response: from address(0x%x), src_endpoint(%d) to dst_endpoint(%d), cluster(0x%x) with status 0x%x",