7
7
#include " esp_zigbee_cluster.h"
8
8
#include " zcl/esp_zigbee_zcl_power_config.h"
9
9
10
+ #define ZB_CMD_TIMEOUT 10000 // 10 seconds
11
+
10
12
bool ZigbeeEP::_is_bound = false ;
11
13
bool ZigbeeEP::_allow_multiple_binding = false ;
12
14
@@ -112,13 +114,20 @@ void ZigbeeEP::reportBatteryPercentage() {
112
114
log_v (" Battery percentage reported" );
113
115
}
114
116
115
- char *ZigbeeEP::readManufacturer (uint8_t endpoint, uint16_t short_addr) {
117
+ char *ZigbeeEP::readManufacturer (uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr ) {
116
118
/* Read peer Manufacture Name & Model Identifier */
117
119
esp_zb_zcl_read_attr_cmd_t read_req;
118
- read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT;
120
+
121
+ if (short_addr != 0 ) {
122
+ read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT;
123
+ read_req.zcl_basic_cmd .dst_addr_u .addr_short = short_addr;
124
+ } else {
125
+ read_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT;
126
+ memcpy (read_req.zcl_basic_cmd .dst_addr_u .addr_long , ieee_addr, sizeof (esp_zb_ieee_addr_t ));
127
+ }
128
+
119
129
read_req.zcl_basic_cmd .src_endpoint = _endpoint;
120
130
read_req.zcl_basic_cmd .dst_endpoint = endpoint;
121
- read_req.zcl_basic_cmd .dst_addr_u .addr_short = short_addr;
122
131
read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_BASIC;
123
132
124
133
uint16_t attributes[] = {
@@ -130,22 +139,31 @@ char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr) {
130
139
// clear read manufacturer
131
140
_read_manufacturer = nullptr ;
132
141
142
+ esp_zb_lock_acquire (portMAX_DELAY);
133
143
esp_zb_zcl_read_attr_cmd_req (&read_req);
144
+ esp_zb_lock_release ();
134
145
135
146
// Wait for response or timeout
136
- if (xSemaphoreTake (lock, portMAX_DELAY ) != pdTRUE) {
147
+ if (xSemaphoreTake (lock, ZB_CMD_TIMEOUT ) != pdTRUE) {
137
148
log_e (" Error while reading manufacturer" );
138
149
}
139
150
return _read_manufacturer;
140
151
}
141
152
142
- char *ZigbeeEP::readModel (uint8_t endpoint, uint16_t short_addr) {
153
+ char *ZigbeeEP::readModel (uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr ) {
143
154
/* Read peer Manufacture Name & Model Identifier */
144
155
esp_zb_zcl_read_attr_cmd_t read_req;
145
- read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT;
156
+
157
+ if (short_addr != 0 ) {
158
+ read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT;
159
+ read_req.zcl_basic_cmd .dst_addr_u .addr_short = short_addr;
160
+ } else {
161
+ read_req.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT;
162
+ memcpy (read_req.zcl_basic_cmd .dst_addr_u .addr_long , ieee_addr, sizeof (esp_zb_ieee_addr_t ));
163
+ }
164
+
146
165
read_req.zcl_basic_cmd .src_endpoint = _endpoint;
147
166
read_req.zcl_basic_cmd .dst_endpoint = endpoint;
148
- read_req.zcl_basic_cmd .dst_addr_u .addr_short = short_addr;
149
167
read_req.clusterID = ESP_ZB_ZCL_CLUSTER_ID_BASIC;
150
168
151
169
uint16_t attributes[] = {
@@ -157,11 +175,12 @@ char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr) {
157
175
// clear read model
158
176
_read_model = nullptr ;
159
177
178
+ esp_zb_lock_acquire (portMAX_DELAY);
160
179
esp_zb_zcl_read_attr_cmd_req (&read_req);
180
+ esp_zb_lock_release ();
161
181
162
182
// Wait for response or timeout
163
- // Semaphore take
164
- if (xSemaphoreTake (lock, portMAX_DELAY) != pdTRUE) {
183
+ if (xSemaphoreTake (lock, ZB_CMD_TIMEOUT) != pdTRUE) {
165
184
log_e (" Error while reading model" );
166
185
}
167
186
return _read_model;
@@ -171,8 +190,23 @@ void ZigbeeEP::printBoundDevices() {
171
190
log_i (" Bound devices:" );
172
191
for ([[maybe_unused]]
173
192
const auto &device : _bound_devices) {
174
- log_i (" Device on endpoint %d, short address: 0x%x" , device->endpoint , device->short_addr );
175
- print_ieee_addr (device->ieee_addr );
193
+ log_i (
194
+ " Device on endpoint %d, short address: 0x%x, ieee address: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x" , device->endpoint , device->short_addr ,
195
+ device->ieee_addr [7 ], device->ieee_addr [6 ], device->ieee_addr [5 ], device->ieee_addr [4 ], device->ieee_addr [3 ], device->ieee_addr [2 ], device->ieee_addr [1 ],
196
+ device->ieee_addr [0 ]
197
+ );
198
+ }
199
+ }
200
+
201
+ void ZigbeeEP::printBoundDevices (Print &print) {
202
+ print.println (" Bound devices:" );
203
+ for ([[maybe_unused]]
204
+ const auto &device : _bound_devices) {
205
+ print.printf (
206
+ " Device on endpoint %d, short address: 0x%x, ieee address: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\r\n " , device->endpoint , device->short_addr ,
207
+ device->ieee_addr [7 ], device->ieee_addr [6 ], device->ieee_addr [5 ], device->ieee_addr [4 ], device->ieee_addr [3 ], device->ieee_addr [2 ], device->ieee_addr [1 ],
208
+ device->ieee_addr [0 ]
209
+ );
176
210
}
177
211
}
178
212
0 commit comments