Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ static SwitchData buttonFunctionPair[] = {{GPIO_INPUT_IO_TOGGLE_SWITCH, SWITCH_O

ZigbeeSwitch zbSwitch = ZigbeeSwitch(SWITCH_ENDPOINT_NUMBER);

static bool light_state = false;

/********************* Zigbee functions **************************/
static void onZbButton(SwitchData *button_func_pair) {
if (button_func_pair->func == SWITCH_ONOFF_TOGGLE_CONTROL) {
Expand All @@ -75,6 +77,33 @@ static void onZbButton(SwitchData *button_func_pair) {
}
}

static void onLightStateChange(bool state) {
if (state != light_state) {
light_state = state;
Serial.printf("Light state changed to %d\r\n", state);
}
}

/********************* Periodic task ***************************/
void periodicTask(void *arg) {
while (true) {
// print the bound lights every 10 seconds
static uint32_t lastPrint = 0;
if (millis() - lastPrint > 10000) {
lastPrint = millis();
zbSwitch.printBoundDevices(Serial);
}

// Poll light state every second
static uint32_t lastPoll = 0;
if (millis() - lastPoll > 1000) {
lastPoll = millis();
zbSwitch.getLightState();
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}

/********************* GPIO functions **************************/
static QueueHandle_t gpio_evt_queue = NULL;

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

zbSwitch.onLightStateChange(onLightStateChange);

//Add endpoint to Zigbee Core
Serial.println("Adding ZigbeeSwitch endpoint to Zigbee Core");
Zigbee.addEndpoint(&zbSwitch);
Expand Down Expand Up @@ -154,6 +185,8 @@ void setup() {
}

Serial.println();

xTaskCreate(periodicTask, "periodicTask", 1024 * 4, NULL, 10, NULL);
}

void loop() {
Expand Down Expand Up @@ -188,11 +221,4 @@ void loop() {
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}

// print the bound lights every 10 seconds
static uint32_t lastPrint = 0;
if (millis() - lastPrint > 10000) {
lastPrint = millis();
zbSwitch.printBoundDevices(Serial);
}
}
16 changes: 15 additions & 1 deletion libraries/Zigbee/keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ clearBoundDevices KEYWORD2
onDefaultResponse KEYWORD2

# ZigbeeLight + ZigbeeColorDimmableLight
onLightChange KEYWORD2
restoreLight KEYWORD2
setLight KEYWORD2
setLightState KEYWORD2
Expand All @@ -115,6 +114,12 @@ getLightLevel KEYWORD2
getLightRed KEYWORD2
getLightGreen KEYWORD2
getLightBlue KEYWORD2
onLightChange KEYWORD2
onLightColorChangeWithSource KEYWORD2
onLightLevelChange KEYWORD2
onLightLevelChangeWithSource KEYWORD2
onLightStateChange KEYWORD2
onLightStateChangeWithSource KEYWORD2

# ZigbeeSwitch + ZigbeeColorDimmerSwitch
lightToggle KEYWORD2
Expand All @@ -125,6 +130,15 @@ lightOnWithTimedOff KEYWORD2
lightOnWithSceneRecall KEYWORD2
setLightLevel KEYWORD2
setLightColor KEYWORD2
getLightState KEYWORD2
getLightLevel KEYWORD2
getLightColor KEYWORD2
onLightStateChange KEYWORD2
onLightStateChangeWithSource KEYWORD2
onLightLevelChange KEYWORD2
onLightLevelChangeWithSource KEYWORD2
onLightColorChange KEYWORD2
onLightColorChangeWithSource KEYWORD2

# ZigbeeThermostat
onTempRecieve KEYWORD2
Expand Down
18 changes: 12 additions & 6 deletions libraries/Zigbee/src/ZigbeeEP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,8 @@ bool ZigbeeEP::setBatteryVoltage(uint8_t voltage) {

bool ZigbeeEP::reportBatteryPercentage() {
/* Send report attributes command */
esp_zb_zcl_report_attr_cmd_t report_attr_cmd = {0};
esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
memset(&report_attr_cmd, 0, sizeof(report_attr_cmd));
report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID;
report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI;
Expand All @@ -181,7 +182,8 @@ bool ZigbeeEP::reportBatteryPercentage() {

char *ZigbeeEP::readManufacturer(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr) {
/* Read peer Manufacture Name & Model Identifier */
esp_zb_zcl_read_attr_cmd_t read_req = {0};
esp_zb_zcl_read_attr_cmd_t read_req;
memset(&read_req, 0, sizeof(read_req));

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

char *ZigbeeEP::readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr) {
/* Read peer Manufacture Name & Model Identifier */
esp_zb_zcl_read_attr_cmd_t read_req = {0};
esp_zb_zcl_read_attr_cmd_t read_req;
memset(&read_req, 0, sizeof(read_req));

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

tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ieee_addr) {
/* Read peer time */
esp_zb_zcl_read_attr_cmd_t read_req = {0};
esp_zb_zcl_read_attr_cmd_t read_req;
memset(&read_req, 0, sizeof(read_req));

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

int32_t ZigbeeEP::getTimezone(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ieee_addr) {
/* Read peer timezone */
esp_zb_zcl_read_attr_cmd_t read_req = {0};
esp_zb_zcl_read_attr_cmd_t read_req;
memset(&read_req, 0, sizeof(read_req));

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

void ZigbeeEP::requestOTAUpdate() {
esp_zb_zdo_match_desc_req_param_t req = {0};
esp_zb_zdo_match_desc_req_param_t req;
memset(&req, 0, sizeof(req));
uint16_t cluster_list[] = {ESP_ZB_ZCL_CLUSTER_ID_OTA_UPGRADE};

/* Match the OTA server of coordinator */
Expand Down
Loading
Loading