Skip to content

Commit 493c528

Browse files
feat(zigbee): Extend switch EPs with get Light methods (#11902)
* feat(zigbee): Extend swithc with get attribute methods * fix(zigbee): Fix -Wmissing-field-initializers warning * feat(zigbee): Update keywords.txt * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent e8cba09 commit 493c528

File tree

8 files changed

+679
-68
lines changed

8 files changed

+679
-68
lines changed

‎libraries/Zigbee/examples/Zigbee_On_Off_Switch/Zigbee_On_Off_Switch.ino‎

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ static SwitchData buttonFunctionPair[] ={{GPIO_INPUT_IO_TOGGLE_SWITCH, SWITCH_O
6666

6767
ZigbeeSwitch zbSwitch = ZigbeeSwitch(SWITCH_ENDPOINT_NUMBER);
6868

69+
staticbool light_state = false;
70+
6971
/********************* Zigbee functions **************************/
7072
staticvoidonZbButton(SwitchData *button_func_pair){
7173
if (button_func_pair->func == SWITCH_ONOFF_TOGGLE_CONTROL){
@@ -75,6 +77,33 @@ static void onZbButton(SwitchData *button_func_pair){
7577
}
7678
}
7779

80+
staticvoidonLightStateChange(bool state){
81+
if (state != light_state){
82+
light_state = state;
83+
Serial.printf("Light state changed to %d\r\n", state);
84+
}
85+
}
86+
87+
/********************* Periodic task ***************************/
88+
voidperiodicTask(void *arg){
89+
while (true){
90+
// print the bound lights every 10 seconds
91+
staticuint32_t lastPrint = 0;
92+
if (millis() - lastPrint > 10000){
93+
lastPrint = millis();
94+
zbSwitch.printBoundDevices(Serial);
95+
}
96+
97+
// Poll light state every second
98+
staticuint32_t lastPoll = 0;
99+
if (millis() - lastPoll > 1000){
100+
lastPoll = millis();
101+
zbSwitch.getLightState();
102+
}
103+
vTaskDelay(1000 / portTICK_PERIOD_MS);
104+
}
105+
}
106+
78107
/********************* GPIO functions **************************/
79108
static QueueHandle_t gpio_evt_queue = NULL;
80109

@@ -102,6 +131,8 @@ void setup(){
102131
//Optional to allow multiple light to bind to the switch
103132
zbSwitch.allowMultipleBinding(true);
104133

134+
zbSwitch.onLightStateChange(onLightStateChange);
135+
105136
//Add endpoint to Zigbee Core
106137
Serial.println("Adding ZigbeeSwitch endpoint to Zigbee Core");
107138
Zigbee.addEndpoint(&zbSwitch);
@@ -154,6 +185,8 @@ void setup(){
154185
}
155186

156187
Serial.println();
188+
189+
xTaskCreate(periodicTask, "periodicTask", 1024 * 4, NULL, 10, NULL);
157190
}
158191

159192
voidloop(){
@@ -188,11 +221,4 @@ void loop(){
188221
}
189222
vTaskDelay(10 / portTICK_PERIOD_MS);
190223
}
191-
192-
// print the bound lights every 10 seconds
193-
staticuint32_t lastPrint = 0;
194-
if (millis() - lastPrint > 10000){
195-
lastPrint = millis();
196-
zbSwitch.printBoundDevices(Serial);
197-
}
198224
}

‎libraries/Zigbee/keywords.txt‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ clearBoundDevices KEYWORD2
104104
onDefaultResponse KEYWORD2
105105

106106
# ZigbeeLight + ZigbeeColorDimmableLight
107-
onLightChange KEYWORD2
108107
restoreLight KEYWORD2
109108
setLight KEYWORD2
110109
setLightState KEYWORD2
@@ -115,6 +114,12 @@ getLightLevel KEYWORD2
115114
getLightRed KEYWORD2
116115
getLightGreen KEYWORD2
117116
getLightBlue KEYWORD2
117+
onLightChange KEYWORD2
118+
onLightColorChangeWithSource KEYWORD2
119+
onLightLevelChange KEYWORD2
120+
onLightLevelChangeWithSource KEYWORD2
121+
onLightStateChange KEYWORD2
122+
onLightStateChangeWithSource KEYWORD2
118123

119124
# ZigbeeSwitch + ZigbeeColorDimmerSwitch
120125
lightToggle KEYWORD2
@@ -125,6 +130,15 @@ lightOnWithTimedOff KEYWORD2
125130
lightOnWithSceneRecall KEYWORD2
126131
setLightLevel KEYWORD2
127132
setLightColor KEYWORD2
133+
getLightState KEYWORD2
134+
getLightLevel KEYWORD2
135+
getLightColor KEYWORD2
136+
onLightStateChange KEYWORD2
137+
onLightStateChangeWithSource KEYWORD2
138+
onLightLevelChange KEYWORD2
139+
onLightLevelChangeWithSource KEYWORD2
140+
onLightColorChange KEYWORD2
141+
onLightColorChangeWithSource KEYWORD2
128142

129143
# ZigbeeThermostat
130144
onTempRecieve KEYWORD2

‎libraries/Zigbee/src/ZigbeeEP.cpp‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ bool ZigbeeEP::setBatteryVoltage(uint8_t voltage){
160160

161161
boolZigbeeEP::reportBatteryPercentage(){
162162
/* Send report attributes command */
163-
esp_zb_zcl_report_attr_cmd_t report_attr_cmd ={0};
163+
esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
164+
memset(&report_attr_cmd, 0, sizeof(report_attr_cmd));
164165
report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
165166
report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID;
166167
report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI;
@@ -181,7 +182,8 @@ bool ZigbeeEP::reportBatteryPercentage(){
181182

182183
char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr){
183184
/* Read peer Manufacture Name & Model Identifier */
184-
esp_zb_zcl_read_attr_cmd_t read_req ={0};
185+
esp_zb_zcl_read_attr_cmd_t read_req;
186+
memset(&read_req, 0, sizeof(read_req));
185187

186188
if (short_addr != 0){
187189
read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT;
@@ -219,7 +221,8 @@ char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_i
219221

220222
char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr){
221223
/* Read peer Manufacture Name & Model Identifier */
222-
esp_zb_zcl_read_attr_cmd_t read_req ={0};
224+
esp_zb_zcl_read_attr_cmd_t read_req;
225+
memset(&read_req, 0, sizeof(read_req));
223226

224227
if (short_addr != 0){
225228
read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT;
@@ -396,7 +399,8 @@ bool ZigbeeEP::setTimezone(int32_t gmt_offset){
396399

397400
tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ieee_addr){
398401
/* Read peer time */
399-
esp_zb_zcl_read_attr_cmd_t read_req ={0};
402+
esp_zb_zcl_read_attr_cmd_t read_req;
403+
memset(&read_req, 0, sizeof(read_req));
400404

401405
if (short_addr >= 0){
402406
read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT;
@@ -448,7 +452,8 @@ tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ie
448452

449453
int32_tZigbeeEP::getTimezone(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ieee_addr){
450454
/* Read peer timezone */
451-
esp_zb_zcl_read_attr_cmd_t read_req ={0};
455+
esp_zb_zcl_read_attr_cmd_t read_req;
456+
memset(&read_req, 0, sizeof(read_req));
452457

453458
if (short_addr >= 0){
454459
read_req.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT;
@@ -564,7 +569,8 @@ static void findOTAServer(esp_zb_zdp_status_t zdo_status, uint16_t addr, uint8_t
564569
}
565570

566571
voidZigbeeEP::requestOTAUpdate(){
567-
esp_zb_zdo_match_desc_req_param_t req ={0};
572+
esp_zb_zdo_match_desc_req_param_t req;
573+
memset(&req, 0, sizeof(req));
568574
uint16_t cluster_list[] ={ESP_ZB_ZCL_CLUSTER_ID_OTA_UPGRADE};
569575

570576
/* Match the OTA server of coordinator */

0 commit comments

Comments
(0)