Skip to content

Commit 29f4e48

Browse files
committed
feat(zibgee): Add requestIASZoneEnroll + error check fixes
1 parent 21ddb09 commit 29f4e48

File tree

8 files changed

+118
-26
lines changed

8 files changed

+118
-26
lines changed

libraries/Zigbee/examples/Zigbee_Contact_Switch/Zigbee_Contact_Switch.ino

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#include "Zigbee.h"
3434

3535
/* Zigbee contact sensor configuration */
36-
#define CONTACT_SWITCH_ENDPOINT_NUMBER 10
36+
#define CONTACT_SWITCH_ENDPOINT_NUMBER 1
3737
uint8_t button = BOOT_PIN;
3838
uint8_t sensor_pin = 4;
3939

@@ -67,6 +67,21 @@ void setup() {
6767
delay(100);
6868
}
6969
Serial.println();
70+
71+
// Request IAS Zone enroll
72+
if (!zbContactSwitch.requestIASZoneEnroll()) {
73+
Serial.println("Failed to request IAS Zone enroll!");
74+
Serial.println("Rebooting...");
75+
ESP.restart();
76+
} else {
77+
Serial.println("IAS Zone enroll requested successfully!");
78+
}
79+
while (!zbContactSwitch.enrolled()) {
80+
Serial.print(".");
81+
delay(100);
82+
}
83+
Serial.println();
84+
Serial.println("Zigbee enrolled successfully!");
7085
}
7186

7287
void loop() {

libraries/Zigbee/examples/Zigbee_Vibration_Sensor/Zigbee_Vibration_Sensor.ino

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#include "Zigbee.h"
3434

3535
/* Zigbee vibration sensor configuration */
36-
#define VIBRATION_SENSOR_ENDPOINT_NUMBER 10
36+
#define VIBRATION_SENSOR_ENDPOINT_NUMBER 1
3737
uint8_t button = BOOT_PIN;
3838
uint8_t sensor_pin = 4;
3939

@@ -67,6 +67,20 @@ void setup() {
6767
delay(100);
6868
}
6969
Serial.println();
70+
// Request IAS Zone enroll
71+
if (!zbVibrationSensor.requestIASZoneEnroll()) {
72+
Serial.println("Failed to request IAS Zone enroll!");
73+
Serial.println("Rebooting...");
74+
ESP.restart();
75+
} else {
76+
Serial.println("IAS Zone enroll requested successfully!");
77+
}
78+
while (!zbVibrationSensor.enrolled()) {
79+
Serial.print(".");
80+
delay(100);
81+
}
82+
Serial.println();
83+
Serial.println("Zigbee enrolled successfully!");
7084
}
7185

7286
void loop() {

libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ ZigbeeContactSwitch::ZigbeeContactSwitch(uint8_t endpoint) : ZigbeeEP(endpoint)
3131
_zone_status = 0;
3232
_zone_id = 0xff;
3333
_ias_cie_endpoint = 1;
34+
_enrolled = false;
3435

3536
//Create custom contact switch configuration
3637
zigbee_contact_switch_cfg_t contact_switch_cfg = ZIGBEE_DEFAULT_CONTACT_SWITCH_CONFIG();
@@ -44,31 +45,33 @@ void ZigbeeContactSwitch::setIASClientEndpoint(uint8_t ep_number) {
4445
}
4546

4647
bool ZigbeeContactSwitch::setClosed() {
48+
esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS;
4749
log_v("Setting Contact switch to closed");
4850
uint8_t closed = 0; // ALARM1 = 0, ALARM2 = 0
4951
esp_zb_lock_acquire(portMAX_DELAY);
50-
esp_err_t ret = esp_zb_zcl_set_attribute_val(
52+
ret = esp_zb_zcl_set_attribute_val(
5153
_endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, &closed, false
5254
);
5355
esp_zb_lock_release();
54-
if (ret != ESP_OK) {
55-
log_e("Failed to set contact switch to closed: 0x%x: %s", ret, esp_err_to_name(ret));
56+
if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) {
57+
log_e("Failed to set contact switch to closed: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret));
5658
return false;
5759
}
5860
_zone_status = closed;
5961
return report();
6062
}
6163

6264
bool ZigbeeContactSwitch::setOpen() {
65+
esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS;
6366
log_v("Setting Contact switch to open");
6467
uint8_t open = ESP_ZB_ZCL_IAS_ZONE_ZONE_STATUS_ALARM1 | ESP_ZB_ZCL_IAS_ZONE_ZONE_STATUS_ALARM2; // ALARM1 = 1, ALARM2 = 1
6568
esp_zb_lock_acquire(portMAX_DELAY);
66-
esp_err_t ret = esp_zb_zcl_set_attribute_val(
69+
ret = esp_zb_zcl_set_attribute_val(
6770
_endpoint, ESP_ZB_ZCL_CLUSTER_ID_IAS_ZONE, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, &open, false
6871
);
6972
esp_zb_lock_release();
70-
if (ret != ESP_OK) {
71-
log_e("Failed to set contact switch to open: 0x%x: %s", ret, esp_err_to_name(ret));
73+
if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) {
74+
log_e("Failed to set contact switch to open: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret));
7275
return false;
7376
}
7477
_zone_status = open;
@@ -90,13 +93,9 @@ bool ZigbeeContactSwitch::report() {
9093
status_change_notif_cmd.delay = 0;
9194

9295
esp_zb_lock_acquire(portMAX_DELAY);
93-
esp_err_t ret = esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd);
96+
uint8_t tsn = esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd);
9497
esp_zb_lock_release();
95-
if (ret != ESP_OK) {
96-
log_e("Failed to send IAS Zone status changed notification: 0x%x: %s", ret, esp_err_to_name(ret));
97-
return false;
98-
}
99-
log_v("IAS Zone status changed notification sent");
98+
log_v("IAS Zone status changed notification sent with transaction sequence number: %u", tsn);
10099
return true;
101100
}
102101

@@ -115,11 +114,25 @@ void ZigbeeContactSwitch::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enro
115114
);
116115
esp_zb_lock_release();
117116
_zone_id = message->zone_id;
117+
_enrolled = true;
118118
}
119-
120119
} else {
121120
log_w("Received message ignored. Cluster ID: %d not supported for On/Off Light", message->info.cluster);
122121
}
123122
}
124123

124+
bool ZigbeeContactSwitch::requestIASZoneEnroll() {
125+
esp_zb_zcl_ias_zone_enroll_request_cmd_t enroll_request;
126+
enroll_request.zcl_basic_cmd.src_endpoint = _endpoint;
127+
enroll_request.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
128+
enroll_request.zone_type = ESP_ZB_ZCL_IAS_ZONE_ZONETYPE_CONTACT_SWITCH;
129+
enroll_request.manuf_code = 0;
130+
131+
esp_zb_lock_acquire(portMAX_DELAY);
132+
uint8_t tsn = esp_zb_zcl_ias_zone_enroll_cmd_req(&enroll_request);
133+
esp_zb_lock_release();
134+
log_v("IAS Zone enroll request send with transaction sequence number: %u", tsn);
135+
return true;
136+
}
137+
125138
#endif // CONFIG_ZB_ENABLED

libraries/Zigbee/src/ep/ZigbeeContactSwitch.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,19 @@ class ZigbeeContactSwitch : public ZigbeeEP {
7070
// Report the contact switch value, done automatically after setting the position
7171
bool report();
7272

73+
// Request a new IAS zone enroll, needed to be called after rebooting already configured device
74+
bool requestIASZoneEnroll();
75+
76+
// Check if the device is enrolled in the IAS Zone
77+
bool enrolled() { return _enrolled; }
78+
7379
private:
7480
void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) override;
7581
uint8_t _zone_status;
7682
uint8_t _zone_id;
7783
esp_zb_ieee_addr_t _ias_cie_addr;
7884
uint8_t _ias_cie_endpoint;
85+
bool _enrolled;
7986
};
8087

8188
#endif // CONFIG_ZB_ENABLED

libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ ZigbeeDoorWindowHandle::ZigbeeDoorWindowHandle(uint8_t endpoint) : ZigbeeEP(endp
3131
_zone_status = 0;
3232
_zone_id = 0xff;
3333
_ias_cie_endpoint = 1;
34+
_enrolled = false;
3435

3536
//Create custom door window handle configuration
3637
zigbee_door_window_handle_cfg_t door_window_handle_cfg = ZIGBEE_DEFAULT_DOOR_WINDOW_HANDLE_CONFIG();
@@ -108,11 +109,10 @@ bool ZigbeeDoorWindowHandle::report() {
108109
status_change_notif_cmd.zone_id = _zone_id;
109110
status_change_notif_cmd.delay = 0;
110111

111-
//NOTE: Check result of esp_zb_zcl_ias_zone_status_change_notif_cmd_req() and return true if success, false if failure
112112
esp_zb_lock_acquire(portMAX_DELAY);
113-
esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd);
113+
uint8_t tsn = esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd);
114114
esp_zb_lock_release();
115-
log_v("IAS Zone status changed notification sent");
115+
log_v("IAS Zone status changed notification sent with transaction sequence number: %u", tsn);
116116
return true;
117117
}
118118

@@ -131,11 +131,25 @@ void ZigbeeDoorWindowHandle::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_e
131131
);
132132
esp_zb_lock_release();
133133
_zone_id = message->zone_id;
134+
_enrolled = true;
134135
}
135-
136136
} else {
137137
log_w("Received message ignored. Cluster ID: %d not supported for On/Off Light", message->info.cluster);
138138
}
139139
}
140140

141+
bool ZigbeeDoorWindowHandle::requestIASZoneEnroll() {
142+
esp_zb_zcl_ias_zone_enroll_request_cmd_t enroll_request;
143+
enroll_request.zcl_basic_cmd.src_endpoint = _endpoint;
144+
enroll_request.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
145+
enroll_request.zone_type = ESP_ZB_ZCL_IAS_ZONE_ZONETYPE_DOOR_WINDOW_HANDLE;
146+
enroll_request.manuf_code = 0;
147+
148+
esp_zb_lock_acquire(portMAX_DELAY);
149+
uint8_t tsn = esp_zb_zcl_ias_zone_enroll_cmd_req(&enroll_request);
150+
esp_zb_lock_release();
151+
log_v("IAS Zone enroll request send with transaction sequence number: %u", tsn);
152+
return true;
153+
}
154+
141155
#endif // CONFIG_ZB_ENABLED

libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,19 @@ class ZigbeeDoorWindowHandle : public ZigbeeEP {
7474
// Report the door/window handle value, done automatically after setting the position
7575
bool report();
7676

77+
// Request a new IAS zone enroll, needed to be called after rebooting already configured device
78+
bool requestIASZoneEnroll();
79+
80+
// Check if the device is enrolled in the IAS Zone
81+
bool enrolled() { return _enrolled; }
82+
7783
private:
7884
void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) override;
7985
uint8_t _zone_status;
8086
uint8_t _zone_id;
8187
esp_zb_ieee_addr_t _ias_cie_addr;
8288
uint8_t _ias_cie_endpoint;
89+
bool _enrolled;
8390
};
8491

8592
#endif // CONFIG_ZB_ENABLED

libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ ZigbeeVibrationSensor::ZigbeeVibrationSensor(uint8_t endpoint) : ZigbeeEP(endpoi
3131
_zone_status = 0;
3232
_zone_id = 0xff;
3333
_ias_cie_endpoint = 1;
34+
_enrolled = false;
3435

3536
//Create custom vibration sensor configuration
3637
zigbee_vibration_sensor_cfg_t vibration_sensor_cfg = ZIGBEE_DEFAULT_VIBRATION_SENSOR_CONFIG();
@@ -57,11 +58,10 @@ bool ZigbeeVibrationSensor::setVibration(bool sensed) {
5758
return false;
5859
}
5960
_zone_status = vibration;
60-
report();
61-
return true;
61+
return report();
6262
}
6363

64-
void ZigbeeVibrationSensor::report() {
64+
bool ZigbeeVibrationSensor::report() {
6565
/* Send IAS Zone status changed notification command */
6666

6767
esp_zb_zcl_ias_zone_status_change_notif_cmd_t status_change_notif_cmd;
@@ -75,9 +75,10 @@ void ZigbeeVibrationSensor::report() {
7575
status_change_notif_cmd.delay = 0;
7676

7777
esp_zb_lock_acquire(portMAX_DELAY);
78-
esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd);
78+
uint8_t tsn = esp_zb_zcl_ias_zone_status_change_notif_cmd_req(&status_change_notif_cmd);
7979
esp_zb_lock_release();
80-
log_v("IAS Zone status changed notification sent");
80+
log_v("IAS Zone status changed notification sent with transaction sequence number: %u", tsn);
81+
return true;
8182
}
8283

8384
void ZigbeeVibrationSensor::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) {
@@ -95,11 +96,25 @@ void ZigbeeVibrationSensor::zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_en
9596
);
9697
esp_zb_lock_release();
9798
_zone_id = message->zone_id;
99+
_enrolled = true;
98100
}
99-
100101
} else {
101102
log_w("Received message ignored. Cluster ID: %d not supported for On/Off Light", message->info.cluster);
102103
}
103104
}
104105

106+
bool ZigbeeVibrationSensor::requestIASZoneEnroll() {
107+
esp_zb_zcl_ias_zone_enroll_request_cmd_t enroll_request;
108+
enroll_request.zcl_basic_cmd.src_endpoint = _endpoint;
109+
enroll_request.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
110+
enroll_request.zone_type = ESP_ZB_ZCL_IAS_ZONE_ZONETYPE_VIBRATION_MOVEMENT;
111+
enroll_request.manuf_code = 0;
112+
113+
esp_zb_lock_acquire(portMAX_DELAY);
114+
uint8_t tsn = esp_zb_zcl_ias_zone_enroll_cmd_req(&enroll_request);
115+
esp_zb_lock_release();
116+
log_v("IAS Zone enroll request send with transaction sequence number: %u", tsn);
117+
return true;
118+
}
119+
105120
#endif // CONFIG_ZB_ENABLED

libraries/Zigbee/src/ep/ZigbeeVibrationSensor.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,21 @@ class ZigbeeVibrationSensor : public ZigbeeEP {
6565
bool setVibration(bool sensed);
6666

6767
// Report the vibration sensor value, done automatically after setting the sensed value
68-
void report();
68+
bool report();
69+
70+
// Request a new IAS zone enroll, needed to be called after rebooting already configured device
71+
bool requestIASZoneEnroll();
72+
73+
// Check if the device is enrolled in the IAS Zone
74+
bool enrolled() { return _enrolled; }
6975

7076
private:
7177
void zbIASZoneEnrollResponse(const esp_zb_zcl_ias_zone_enroll_response_message_t *message) override;
7278
uint8_t _zone_status;
7379
uint8_t _zone_id;
7480
esp_zb_ieee_addr_t _ias_cie_addr;
7581
uint8_t _ias_cie_endpoint;
82+
bool _enrolled;
7683
};
7784

7885
#endif // CONFIG_ZB_ENABLED

0 commit comments

Comments
 (0)