Skip to content

Commit 111e35d

Browse files
committed
feat(zigbee): Add cmd_write_attr_resp handler
1 parent 56842da commit 111e35d

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

libraries/Zigbee/src/ZigbeeEP.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ class ZigbeeEP {
149149
// list of all handlers function calls, to be override by EPs implementation
150150
virtual void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) {};
151151
virtual void zbAttributeRead(uint16_t cluster_id, const esp_zb_zcl_attribute_t *attribute, uint8_t src_endpoint, esp_zb_zcl_addr_t src_address) {};
152+
virtual void zbWriteAttributeResponse(uint16_t cluster_id, uint16_t attribute_id, esp_zb_zcl_status_t status, uint8_t src_endpoint, esp_zb_zcl_addr_t src_address) {};
152153
virtual void zbReadBasicCluster(const esp_zb_zcl_attribute_t *attribute); //already implemented
153154
virtual void zbIdentify(const esp_zb_zcl_set_attr_value_message_t *message);
154155
virtual void zbWindowCoveringMovementCmd(const esp_zb_zcl_window_covering_movement_message_t *message) {};

libraries/Zigbee/src/ZigbeeHandlers.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ static bool s_tagid_received = false;
4242
static esp_err_t zb_attribute_set_handler(const esp_zb_zcl_set_attr_value_message_t *message);
4343
static esp_err_t zb_attribute_reporting_handler(const esp_zb_zcl_report_attr_message_t *message);
4444
static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_resp_message_t *message);
45+
static esp_err_t zb_cmd_write_attr_resp_handler(const esp_zb_zcl_cmd_write_attr_resp_message_t *message);
4546
static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_report_resp_message_t *message);
4647
static esp_err_t zb_cmd_ias_zone_status_change_handler(const esp_zb_zcl_ias_zone_status_change_notification_message_t *message);
4748
static esp_err_t zb_cmd_ias_zone_enroll_response_handler(const esp_zb_zcl_ias_zone_enroll_response_message_t *message);
@@ -73,6 +74,7 @@ static esp_err_t zb_action_handler(esp_zb_core_action_callback_id_t callback_id,
7374
ret = zb_ota_upgrade_query_image_resp_handler((esp_zb_zcl_ota_upgrade_query_image_resp_message_t *)message);
7475
break;
7576
case ESP_ZB_CORE_CMD_DEFAULT_RESP_CB_ID: ret = zb_cmd_default_resp_handler((esp_zb_zcl_cmd_default_resp_message_t *)message); break;
77+
case ESP_ZB_CORE_CMD_WRITE_ATTR_RESP_CB_ID: ret = zb_cmd_write_attr_resp_handler((esp_zb_zcl_cmd_write_attr_resp_message_t *)message); break;
7678
default: log_w("Receive unhandled Zigbee action(0x%x) callback", callback_id); break;
7779
}
7880
return ret;
@@ -170,6 +172,37 @@ static esp_err_t zb_cmd_read_attr_resp_handler(const esp_zb_zcl_cmd_read_attr_re
170172
return ESP_OK;
171173
}
172174

175+
static esp_err_t zb_cmd_write_attr_resp_handler(const esp_zb_zcl_cmd_write_attr_resp_message_t *message) {
176+
if (!message) {
177+
log_e("Empty message");
178+
return ESP_FAIL;
179+
}
180+
if (message->info.status != ESP_ZB_ZCL_STATUS_SUCCESS) {
181+
log_e("Received message: error status(%d)", message->info.status);
182+
return ESP_ERR_INVALID_ARG;
183+
}
184+
log_v(
185+
"Write attribute response: from address(0x%x) src endpoint(%d) to dst endpoint(%d) cluster(0x%x)", message->info.src_address.u.short_addr,
186+
message->info.src_endpoint, message->info.dst_endpoint, message->info.cluster
187+
);
188+
for (std::list<ZigbeeEP *>::iterator it = Zigbee.ep_objects.begin(); it != Zigbee.ep_objects.end(); ++it) {
189+
if (message->info.dst_endpoint == (*it)->getEndpoint()) {
190+
esp_zb_zcl_write_attr_resp_variable_t *variable = message->variables;
191+
while (variable) {
192+
log_v(
193+
"Write attribute response: status(%d), cluster(0x%x), attribute(0x%x)", variable->status, message->info.cluster, variable->attribute_id
194+
);
195+
if (variable->status == ESP_ZB_ZCL_STATUS_SUCCESS) {
196+
(*it)->zbWriteAttributeResponse(message->info.cluster, variable->attribute_id, variable->status, message->info.src_endpoint, message->info.src_address);
197+
}
198+
variable = variable->next;
199+
}
200+
}
201+
}
202+
return ESP_OK;
203+
}
204+
205+
173206
static esp_err_t zb_configure_report_resp_handler(const esp_zb_zcl_cmd_config_report_resp_message_t *message) {
174207
if (!message) {
175208
log_e("Empty message");

0 commit comments

Comments
 (0)