Skip to content

Commit

Permalink
feat(Zigbee): Update Zigbee Dimmable light example to 3.1.x features
Browse files Browse the repository at this point in the history
  • Loading branch information
FaBjE committed Dec 13, 2024
1 parent aa0c3da commit 538c57a
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,22 @@

#include "Zigbee.h"

#define LED_PIN RGB_BUILTIN
#define BUTTON_PIN 9 // C6/H2 Boot button
/* Zigbee dimmable light configuration */
#define ZIGBEE_LIGHT_ENDPOINT 10
uint8_t led = RGB_BUILTIN;
uint8_t button = BOOT_PIN;

ZigbeeDimmableLight zbDimmableLight = ZigbeeDimmableLight(ZIGBEE_LIGHT_ENDPOINT);

/********************* LED functions **************************/
/********************* RGB LED functions **************************/
void setLight(bool state, uint8_t level)
{
rgbLedWrite(LED_PIN, level, level, level);
if (!state)
{
rgbLedWrite(led, 0, 0, 0);
return;
}
rgbLedWrite(led, level, level, level);
}

// Create a task on identify call to handle the identify function
Expand All @@ -56,18 +62,20 @@ void identify(uint16_t time)
zbDimmableLight.restoreLight();
return;
}
rgbLedWrite(LED_PIN, 255 * blink, 255 * blink, 255 * blink);
rgbLedWrite(led, 255 * blink, 255 * blink, 255 * blink);
blink = !blink;
}

/********************* Arduino functions **************************/
void setup()
{
Serial.begin(115200);

// Init RMT and leave light OFF
rgbLedWrite(LED_PIN, 0, 0, 0);
rgbLedWrite(led, 0, 0, 0);

// Init button for factory reset
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(button, INPUT_PULLUP);

// Set callback function for light change
zbDimmableLight.onLightChange(setLight);
Expand All @@ -79,32 +87,46 @@ void setup()
zbDimmableLight.setManufacturerAndModel("Espressif", "ZBLightBulb");

// Add endpoint to Zigbee Core
log_d("Adding ZigbeeLight endpoint to Zigbee Core");
Serial.println("Adding ZigbeeLight endpoint to Zigbee Core");
Zigbee.addEndpoint(&zbDimmableLight);

// When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE
log_d("Calling Zigbee.begin()");
Zigbee.begin();
// When all EPs are registered, start Zigbee in End Device mode
if (!Zigbee.begin())
{
Serial.println("Zigbee failed to start!");
Serial.println("Rebooting...");
ESP.restart();
}
Serial.println("Connecting to network");
while (!Zigbee.connected())
{
Serial.print(".");
delay(100);
}
Serial.println();
}

void loop()
{
// Checking button for factory reset
if (digitalRead(BUTTON_PIN) == LOW)
if (digitalRead(button) == LOW)
{ // Push button pressed
// Key debounce handling
delay(100);
int startTime = millis();
while (digitalRead(BUTTON_PIN) == LOW)
while (digitalRead(button) == LOW)
{
delay(50);
if ((millis() - startTime) > 3000)
{
// If key pressed for more than 3secs, factory reset Zigbee and reboot
Serial.printf("Resetting Zigbee to factory settings, reboot.\n");
Serial.println("Resetting Zigbee to factory and rebooting in 1s.");
delay(1000);
Zigbee.factoryReset();
}
}
// Increase blightness by 50 every time the button is pressed
zbDimmableLight.setLightLevel(zbDimmableLight.getLightLevel() + 50);
}
delay(100);
}
31 changes: 30 additions & 1 deletion libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ void ZigbeeDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_message
}
else
{
log_w("Received message ignored. Cluster ID: %d not supported for Color dimmable Light", message->info.cluster);
log_w("Received message ignored. Cluster ID: %d not supported for dimmable Light", message->info.cluster);
}
}

Expand All @@ -69,6 +69,35 @@ void ZigbeeDimmableLight::lightChanged()
}
}

void ZigbeeDimmableLight::setLight(bool state, uint8_t level)
{
// Update all attributes
_current_state = state;
_current_level = level;
lightChanged();

log_v("Updating on/off light state to %d", state);
/* Update light clusters */
esp_zb_lock_acquire(portMAX_DELAY);
// set on/off state
esp_zb_zcl_set_attribute_val(
_endpoint, ESP_ZB_ZCL_CLUSTER_ID_ON_OFF, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID, &_current_state, false);
// set level
esp_zb_zcl_set_attribute_val(
_endpoint, ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID, &_current_level, false);
esp_zb_lock_release();
}

void ZigbeeDimmableLight::setLightState(bool state)
{
setLight(state, _current_level);
}

void ZigbeeDimmableLight::setLightLevel(uint8_t level)
{
setLight(_current_state, level);
}

esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg)
{
esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&light_cfg->basic_cfg);
Expand Down
16 changes: 15 additions & 1 deletion libraries/Zigbee/src/ep/ZigbeeDimmableLight.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
#pragma once

#include "soc/soc_caps.h"
#if SOC_IEEE802154_SUPPORTED
#include "sdkconfig.h"
#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED

#include "ZigbeeEP.h"
#include "ha/esp_zigbee_ha_standard.h"
Expand Down Expand Up @@ -77,6 +78,19 @@ class ZigbeeDimmableLight : public ZigbeeEP
lightChanged();
}

void setLightState(bool state);
void setLightLevel(uint8_t level);
void setLight(bool state, uint8_t level);

bool getLightState()
{
return _current_state;
}
uint8_t getLightLevel()
{
return _current_level;
}

private:
void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override;

Expand Down

0 comments on commit 538c57a

Please sign in to comment.