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+
static bool light_state = false;
70+
6971
/********************* Zigbee functions **************************/
7072
static void onZbButton(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+
static void onLightStateChange(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+
void periodicTask(void *arg) {
89+
while (true) {
90+
// print the bound lights every 10 seconds
91+
static uint32_t lastPrint = 0;
92+
if (millis() - lastPrint > 10000) {
93+
lastPrint = millis();
94+
zbSwitch.printBoundDevices(Serial);
95+
}
96+
97+
// Poll light state every second
98+
static uint32_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
void loop() {
@@ -188,11 +221,4 @@ void loop() {
188221
}
189222
vTaskDelay(10 / portTICK_PERIOD_MS);
190223
}
191-
192-
// print the bound lights every 10 seconds
193-
static uint32_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
bool ZigbeeEP::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_t ZigbeeEP::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
void ZigbeeEP::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)