Skip to content

Commit 538c57a

Browse files
committed
feat(Zigbee): Update Zigbee Dimmable light example to 3.1.x features
1 parent aa0c3da commit 538c57a

File tree

3 files changed

+81
-16
lines changed

3 files changed

+81
-16
lines changed

libraries/Zigbee/examples/Zigbee_Dimmable_Light/Zigbee_Dimmable_Light.ino

+36-14
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,22 @@
3333

3434
#include "Zigbee.h"
3535

36-
#define LED_PIN RGB_BUILTIN
37-
#define BUTTON_PIN 9 // C6/H2 Boot button
36+
/* Zigbee dimmable light configuration */
3837
#define ZIGBEE_LIGHT_ENDPOINT 10
38+
uint8_t led = RGB_BUILTIN;
39+
uint8_t button = BOOT_PIN;
3940

4041
ZigbeeDimmableLight zbDimmableLight = ZigbeeDimmableLight(ZIGBEE_LIGHT_ENDPOINT);
4142

42-
/********************* LED functions **************************/
43+
/********************* RGB LED functions **************************/
4344
void setLight(bool state, uint8_t level)
4445
{
45-
rgbLedWrite(LED_PIN, level, level, level);
46+
if (!state)
47+
{
48+
rgbLedWrite(led, 0, 0, 0);
49+
return;
50+
}
51+
rgbLedWrite(led, level, level, level);
4652
}
4753

4854
// Create a task on identify call to handle the identify function
@@ -56,18 +62,20 @@ void identify(uint16_t time)
5662
zbDimmableLight.restoreLight();
5763
return;
5864
}
59-
rgbLedWrite(LED_PIN, 255 * blink, 255 * blink, 255 * blink);
65+
rgbLedWrite(led, 255 * blink, 255 * blink, 255 * blink);
6066
blink = !blink;
6167
}
6268

6369
/********************* Arduino functions **************************/
6470
void setup()
6571
{
72+
Serial.begin(115200);
73+
6674
// Init RMT and leave light OFF
67-
rgbLedWrite(LED_PIN, 0, 0, 0);
75+
rgbLedWrite(led, 0, 0, 0);
6876

6977
// Init button for factory reset
70-
pinMode(BUTTON_PIN, INPUT_PULLUP);
78+
pinMode(button, INPUT_PULLUP);
7179

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

8189
// Add endpoint to Zigbee Core
82-
log_d("Adding ZigbeeLight endpoint to Zigbee Core");
90+
Serial.println("Adding ZigbeeLight endpoint to Zigbee Core");
8391
Zigbee.addEndpoint(&zbDimmableLight);
8492

85-
// When all EPs are registered, start Zigbee. By default acts as ZIGBEE_END_DEVICE
86-
log_d("Calling Zigbee.begin()");
87-
Zigbee.begin();
93+
// When all EPs are registered, start Zigbee in End Device mode
94+
if (!Zigbee.begin())
95+
{
96+
Serial.println("Zigbee failed to start!");
97+
Serial.println("Rebooting...");
98+
ESP.restart();
99+
}
100+
Serial.println("Connecting to network");
101+
while (!Zigbee.connected())
102+
{
103+
Serial.print(".");
104+
delay(100);
105+
}
106+
Serial.println();
88107
}
89108

90109
void loop()
91110
{
92111
// Checking button for factory reset
93-
if (digitalRead(BUTTON_PIN) == LOW)
112+
if (digitalRead(button) == LOW)
94113
{ // Push button pressed
95114
// Key debounce handling
96115
delay(100);
97116
int startTime = millis();
98-
while (digitalRead(BUTTON_PIN) == LOW)
117+
while (digitalRead(button) == LOW)
99118
{
100119
delay(50);
101120
if ((millis() - startTime) > 3000)
102121
{
103122
// If key pressed for more than 3secs, factory reset Zigbee and reboot
104-
Serial.printf("Resetting Zigbee to factory settings, reboot.\n");
123+
Serial.println("Resetting Zigbee to factory and rebooting in 1s.");
124+
delay(1000);
105125
Zigbee.factoryReset();
106126
}
107127
}
128+
// Increase blightness by 50 every time the button is pressed
129+
zbDimmableLight.setLightLevel(zbDimmableLight.getLightLevel() + 50);
108130
}
109131
delay(100);
110132
}

libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp

+30-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void ZigbeeDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_message
5757
}
5858
else
5959
{
60-
log_w("Received message ignored. Cluster ID: %d not supported for Color dimmable Light", message->info.cluster);
60+
log_w("Received message ignored. Cluster ID: %d not supported for dimmable Light", message->info.cluster);
6161
}
6262
}
6363

@@ -69,6 +69,35 @@ void ZigbeeDimmableLight::lightChanged()
6969
}
7070
}
7171

72+
void ZigbeeDimmableLight::setLight(bool state, uint8_t level)
73+
{
74+
// Update all attributes
75+
_current_state = state;
76+
_current_level = level;
77+
lightChanged();
78+
79+
log_v("Updating on/off light state to %d", state);
80+
/* Update light clusters */
81+
esp_zb_lock_acquire(portMAX_DELAY);
82+
// set on/off state
83+
esp_zb_zcl_set_attribute_val(
84+
_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);
85+
// set level
86+
esp_zb_zcl_set_attribute_val(
87+
_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);
88+
esp_zb_lock_release();
89+
}
90+
91+
void ZigbeeDimmableLight::setLightState(bool state)
92+
{
93+
setLight(state, _current_level);
94+
}
95+
96+
void ZigbeeDimmableLight::setLightLevel(uint8_t level)
97+
{
98+
setLight(_current_state, level);
99+
}
100+
72101
esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg)
73102
{
74103
esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&light_cfg->basic_cfg);

libraries/Zigbee/src/ep/ZigbeeDimmableLight.h

+15-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
#pragma once
44

55
#include "soc/soc_caps.h"
6-
#if SOC_IEEE802154_SUPPORTED
6+
#include "sdkconfig.h"
7+
#if SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED
78

89
#include "ZigbeeEP.h"
910
#include "ha/esp_zigbee_ha_standard.h"
@@ -77,6 +78,19 @@ class ZigbeeDimmableLight : public ZigbeeEP
7778
lightChanged();
7879
}
7980

81+
void setLightState(bool state);
82+
void setLightLevel(uint8_t level);
83+
void setLight(bool state, uint8_t level);
84+
85+
bool getLightState()
86+
{
87+
return _current_state;
88+
}
89+
uint8_t getLightLevel()
90+
{
91+
return _current_level;
92+
}
93+
8094
private:
8195
void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override;
8296

0 commit comments

Comments
 (0)