@@ -13,9 +13,7 @@ ZigbeeColorDimmableLight::ZigbeeColorDimmableLight(uint8_t endpoint) : ZigbeeEP(
13
13
// set default values
14
14
_current_state = false ;
15
15
_current_level = 255 ;
16
- _current_red = 255 ;
17
- _current_green = 255 ;
18
- _current_blue = 255 ;
16
+ _current_color = {255 , 255 , 255 };
19
17
}
20
18
21
19
uint16_t ZigbeeColorDimmableLight::getCurrentColorX () {
@@ -32,37 +30,18 @@ uint16_t ZigbeeColorDimmableLight::getCurrentColorY() {
32
30
->data_p );
33
31
}
34
32
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 );
48
38
}
49
39
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 );
66
45
}
67
46
68
47
// set attribute method -> method overridden in child class
@@ -94,23 +73,25 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me
94
73
uint16_t light_color_x = (*(uint16_t *)message->attribute .data .value );
95
74
uint16_t light_color_y = getCurrentColorY ();
96
75
// 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
102
77
lightChanged ();
103
78
return ;
104
79
105
80
} else if (message->attribute .id == ESP_ZB_ZCL_ATTR_COLOR_CONTROL_CURRENT_Y_ID && message->attribute .data .type == ESP_ZB_ZCL_ATTR_TYPE_U16) {
106
81
uint16_t light_color_x = getCurrentColorX ();
107
82
uint16_t light_color_y = (*(uint16_t *)message->attribute .data .value );
108
83
// 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 );
114
95
lightChanged ();
115
96
return ;
116
97
} else {
@@ -123,20 +104,21 @@ void ZigbeeColorDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_me
123
104
124
105
void ZigbeeColorDimmableLight::lightChanged () {
125
106
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);
127
108
}
128
109
}
129
110
130
111
void ZigbeeColorDimmableLight::setLight (bool state, uint8_t level, uint8_t red, uint8_t green, uint8_t blue) {
131
112
// Update all attributes
132
113
_current_state = state;
133
114
_current_level = level;
134
- _current_red = red;
135
- _current_green = green;
136
- _current_blue = blue;
115
+ _current_color = {red, green, blue};
137
116
lightChanged ();
138
117
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);
140
122
/* Update light clusters */
141
123
esp_zb_lock_acquire (portMAX_DELAY);
142
124
// set on/off state
@@ -147,28 +129,42 @@ void ZigbeeColorDimmableLight::setLight(bool state, uint8_t level, uint8_t red,
147
129
esp_zb_zcl_set_attribute_val (
148
130
_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
149
131
);
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
+ );
153
136
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
155
138
);
139
+ // set hsv color
156
140
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
158
145
);
159
146
esp_zb_lock_release ();
160
147
}
161
148
162
149
void 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 );
164
151
}
165
152
166
153
void 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 );
168
155
}
169
156
170
157
void ZigbeeColorDimmableLight::setLightColor (uint8_t red, uint8_t green, uint8_t blue) {
171
158
setLight (_current_state, _current_level, red, green, blue);
172
159
}
173
160
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
+
174
170
#endif // SOC_IEEE802154_SUPPORTED && CONFIG_ZB_ENABLED
0 commit comments