@@ -13,9 +13,7 @@ ZigbeeColorDimmableLight::ZigbeeColorDimmableLight(uint8_t endpoint) : ZigbeeEP(
1313 // set default values
1414 _current_state = false ;
1515 _current_level = 255 ;
16- _current_red = 255 ;
17- _current_green = 255 ;
18- _current_blue = 255 ;
16+ _current_color = {255 , 255 , 255 };
1917}
2018
2119uint16_t ZigbeeColorDimmableLight::getCurrentColorX () {
@@ -32,37 +30,18 @@ uint16_t ZigbeeColorDimmableLight::getCurrentColorY() {
3230 ->data_p );
3331}
3432
35- void ZigbeeColorDimmableLight::calculateRGB (uint16_t x, uint16_t y, uint8_t &red, uint8_t &green, uint8_t &blue) {
36- float r, g, b, color_x, color_y;
37- color_x = (float )x / 65535 ;
38- color_y = (float )y / 65535 ;
39-
40- float color_X = color_x / color_y;
41- float color_Z = (1 - color_x - color_y) / color_y;
42-
43- XYZ_TO_RGB (color_X, 1 , color_Z, r, g, b);
44-
45- red = (uint8_t )(r * (float )255 );
46- green = (uint8_t )(g * (float )255 );
47- blue = (uint8_t )(b * (float )255 );
33+ uint16_t ZigbeeColorDimmableLight::getCurrentColorHue () {
34+ return (*(uint16_t *)esp_zb_zcl_get_attribute (
35+ _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_HUE_ID
36+ )
37+ ->data_p );
4838}
4939
50- void ZigbeeColorDimmableLight::calculateXY (uint8_t red, uint8_t green, uint8_t blue, uint16_t &x, uint16_t &y) {
51- // Convert RGB to XYZ
52- float r = (float )red / 255 .0f ;
53- float g = (float )green / 255 .0f ;
54- float b = (float )blue / 255 .0f ;
55-
56- float X, Y, Z;
57- RGB_TO_XYZ (r, g, b, X, Y, Z);
58-
59- // Convert XYZ to xy chromaticity coordinates
60- float color_x = X / (X + Y + Z);
61- float color_y = Y / (X + Y + Z);
62-
63- // Convert normalized xy to 16-bit values
64- x = (uint16_t )(color_x * 65535 .0f );
65- y = (uint16_t )(color_y * 65535 .0f );
40+ uint8_t ZigbeeColorDimmableLight::getCurrentColorSaturation () {
41+ return (*(uint16_t *)esp_zb_zcl_get_attribute (
42+ _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_SATURATION_ID
43+ )
44+ ->data_p );
6645}
6746
6847// set attribute method -> method overridden in child class
@@ -94,23 +73,25 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me
9473 uint16_t light_color_x = (*(uint16_t *)message->attribute .data .value );
9574 uint16_t light_color_y = getCurrentColorY ();
9675 // calculate RGB from XY and call setColor()
97- uint8_t red, green, blue;
98- calculateRGB (light_color_x, light_color_y, red, green, blue);
99- _current_blue = blue;
100- _current_green = green;
101- _current_red = red;
76+ _current_color = espXYToRgbColor (255 , light_color_x, light_color_y); // TODO: Check if level is correct
10277 lightChanged ();
10378 return ;
10479
10580 } else if (message->attribute .id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_Y_ID && message->attribute .data .type == ESP_ZB_ZCL_ATTR_TYPE_U16) {
10681 uint16_t light_color_x = getCurrentColorX ();
10782 uint16_t light_color_y = (*(uint16_t *)message->attribute .data .value );
10883 // calculate RGB from XY and call setColor()
109- uint8_t red, green, blue;
110- calculateRGB (light_color_x, light_color_y, red, green, blue);
111- _current_blue = blue;
112- _current_green = green;
113- _current_red = red;
84+ _current_color = espXYToRgbColor (255 , light_color_x, light_color_y); // TODO: Check if level is correct
85+ lightChanged ();
86+ return ;
87+ } else if (message->attribute .id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_HUE_ID && message->attribute .data .type == ESP_ZB_ZCL_ATTR_TYPE_U16) {
88+ uint16_t light_color_hue = (*(uint16_t *)message->attribute .data .value );
89+ _current_color = espHsvToRgbColor (light_color_hue, getCurrentColorSaturation (), 255 );
90+ lightChanged ();
91+ return ;
92+ } else if (message->attribute .id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_SATURATION_ID && message->attribute .data .type == ESP_ZB_ZCL_ATTR_TYPE_U8) {
93+ uint8_t light_color_saturation = (*(uint8_t *)message->attribute .data .value );
94+ _current_color = espHsvToRgbColor (getCurrentColorHue (), light_color_saturation, 255 );
11495 lightChanged ();
11596 return ;
11697 } else {
@@ -123,20 +104,21 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me
123104
124105void ZigbeeColorDimmableLight::lightChanged () {
125106 if (_on_light_change) {
126- _on_light_change (_current_state, _current_red, _current_green, _current_blue , _current_level);
107+ _on_light_change (_current_state, _current_color. r , _current_color. g , _current_color. b , _current_level);
127108 }
128109}
129110
130111void ZigbeeColorDimmableLight::setLight (bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue) {
131112 // Update all attributes
132113 _current_state = state;
133114 _current_level = level;
134- _current_red = red;
135- _current_green = green;
136- _current_blue = blue;
115+ _current_color = {red, green, blue};
137116 lightChanged ();
138117
139- log_v (" Updating on/off light state to %d" , state);
118+ espXyColor_t xy_color = espRgbColorToXYColor (_current_color);
119+ espHsvColor_t hsv_color = espRgbColorToHsvColor (_current_color);
120+
121+ log_v (" Updating light state: %d, level: %d, color: %d, %d, %d" , state, level, red, green, blue);
140122 /* Update light clusters */
141123 esp_zb_lock_acquire (portMAX_DELAY);
142124 // set on/off state
@@ -147,28 +129,42 @@ void ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red,
147129 esp_zb_zcl_set_attribute_val (
148130 _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
149131 );
150- // set color
151- uint16_t color_x, color_y;
152- calculateXY (red, green, blue, color_x, color_y);
132+ // set xy color
133+ esp_zb_zcl_set_attribute_val (
134+ _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_X_ID, &xy_color.x , false
135+ );
153136 esp_zb_zcl_set_attribute_val (
154- _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_X_ID , &color_x , false
137+ _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_Y_ID , &xy_color. y , false
155138 );
139+ // set hsv color
156140 esp_zb_zcl_set_attribute_val (
157- _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_Y_ID, &color_y, false
141+ _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_HUE_ID, &hsv_color.h , false
142+ );
143+ esp_zb_zcl_set_attribute_val (
144+ _endpoint, ESP_ZB_ZCL_CLUSTER_ID_COLOR_CONTROL, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_SATURATION_ID, &hsv_color.s , false
158145 );
159146 esp_zb_lock_release ();
160147}
161148
162149void ZigbeeColorDimmableLight::setLightState (bool state) {
163- setLight (state, _current_level, _current_red, _current_green, _current_blue );
150+ setLight (state, _current_level, _current_color. r , _current_color. g , _current_color. b );
164151}
165152
166153void ZigbeeColorDimmableLight::setLightLevel (uint8_t level) {
167- setLight (_current_state, level, _current_red, _current_green, _current_blue );
154+ setLight (_current_state, level, _current_color. r , _current_color. g , _current_color. b );
168155}
169156
170157void ZigbeeColorDimmableLight::setLightColor (uint8_t red, uint8_t green, uint8_t blue) {
171158 setLight (_current_state, _current_level, red, green, blue);
172159}
173160
161+ void ZigbeeColorDimmableLight::setLightColor (espRgbColor_t rgb_color) {
162+ setLight (_current_state, _current_level, rgb_color.r , rgb_color.g , rgb_color.b );
163+ }
164+
165+ void ZigbeeColorDimmableLight::setLightColor (espHsvColor_t hsv_color) {
166+ espRgbColor_t rgb_color = espHsvColorToRgbColor (hsv_color);
167+ setLight (_current_state, _current_level, rgb_color.r , rgb_color.g , rgb_color.b );
168+ }
169+
174170#endif // SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED
0 commit comments