From 7dbb04c4a7e82f2a26724bcb19eea550887d1db6 Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 21:47:56 -0300
Subject: [PATCH 01/13] feat(matter): extended color light example

---
 .../MatterExtendedColorLight.ino              | 205 ++++++++++++++++++
 1 file changed, 205 insertions(+)
 create mode 100644 libraries/Matter/examples/MatterExtendedColorLight/MatterExtendedColorLight.ino

diff --git a/libraries/Matter/examples/MatterExtendedColorLight/MatterExtendedColorLight.ino b/libraries/Matter/examples/MatterExtendedColorLight/MatterExtendedColorLight.ino
new file mode 100644
index 00000000000..031d3b15be5
--- /dev/null
+++ b/libraries/Matter/examples/MatterExtendedColorLight/MatterExtendedColorLight.ino
@@ -0,0 +1,205 @@
+// Copyright 2024 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Matter Manager
+#include <Matter.h>
+#include <WiFi.h>
+#include <Preferences.h>
+
+// List of Matter Endpoints for this Node
+// Color Light Endpoint
+MatterEnhancedColorLight EnhancedColorLight;
+
+// It will use HSV color to control all Matter Attribute Changes
+HsvColor_t currentHSVColor = {0, 0, 0};
+
+// it will keep last OnOff & HSV Color state stored, using Preferences
+Preferences matterPref;
+const char *onOffPrefKey = "OnOff";
+const char *hsvColorPrefKey = "HSV";
+
+// set your board RGB LED pin here
+#ifdef RGB_BUILTIN
+const uint8_t ledPin = RGB_BUILTIN;
+#else
+const uint8_t ledPin = 2;  // Set your pin here if your board has not defined LED_BUILTIN
+#warning "Do not forget to set the RGB LED pin"
+#endif
+
+// set your board USER BUTTON pin here
+const uint8_t buttonPin = 0;  // Set your pin here. Using BOOT Button. C6/C3 use GPIO9.
+
+// WiFi is manually set and started
+const char *ssid = "your-ssid";          // Change this to your WiFi SSID
+const char *password = "your-password";  // Change this to your WiFi password
+
+// Set the RGB LED Light based on the current state of the Enhanced Color Light
+bool setLightState(bool state, espHsvColor_t colorHSV, uint8_t brighteness, uint16_t temperature_Mireds) {
+
+  if (state) {
+#ifdef RGB_BUILTIN
+    // currentHSVColor keeps final color result
+    espRgbColor_t rgbColor = espHsvColorToRgbColor(currentHSVColor);
+    // set the RGB LED
+    rgbLedWrite(ledPin, rgbColor.r, rgbColor.g, rgbColor.b);
+#else
+    // No Color RGB LED, just use the HSV value (brightness) to control the LED
+    analogWrite(ledPin, colorHSV.v);
+#endif
+  } else {
+    digitalWrite(ledPin, LOW);
+  }
+  // store last HSV Color and OnOff state for when the Light is restarted / power goes off
+  matterPref.putBool(onOffPrefKey, state);
+  matterPref.putUInt(hsvColorPrefKey, currentHSVColor.h << 16 | currentHSVColor.s << 8 | currentHSVColor.v);
+  // This callback must return the success state to Matter core
+  return true;
+}
+
+void setup() {
+  // Initialize the USER BUTTON (Boot button) GPIO that will act as a toggle switch
+  pinMode(buttonPin, INPUT_PULLUP);
+  // Initialize the LED (light) GPIO and Matter End Point
+  pinMode(ledPin, OUTPUT);
+
+  Serial.begin(115200);
+  while (!Serial) {
+    delay(100);
+  }
+
+  // We start by connecting to a WiFi network
+  Serial.print("Connecting to ");
+  Serial.println(ssid);
+  // enable IPv6
+  WiFi.enableIPv6(true);
+  // Manually connect to WiFi
+  WiFi.begin(ssid, password);
+  // Wait for connection
+  while (WiFi.status() != WL_CONNECTED) {
+    delay(500);
+    Serial.print(".");
+  }
+  Serial.println("\r\nWiFi connected");
+  Serial.println("IP address: ");
+  Serial.println(WiFi.localIP());
+  delay(500);
+
+  // Initialize Matter EndPoint
+  matterPref.begin("MatterPrefs", false);
+  // default OnOff state is ON if not stored before
+  bool lastOnOffState = matterPref.getBool(onOffPrefKey, true);
+  // default HSV color is (21, 216, 25) - Warm White Color at 10% intensity
+  uint32_t prefHsvColor = matterPref.getUInt(hsvColorPrefKey, 21 << 16 | 216 << 8 | 25);
+  currentHSVColor = {uint8_t(prefHsvColor >> 16), uint8_t(prefHsvColor >> 8), uint8_t(prefHsvColor)};
+  EnhancedColorLight.begin(lastOnOffState, currentHSVColor);
+  // set the callback function to handle the Light state change
+  EnhancedColorLight.onChange(setLightState);
+
+  // lambda functions are used to set the attribute change callbacks
+  EnhancedColorLight.onChangeOnOff([](bool state) {
+    Serial.printf("Light OnOff changed to %s\r\n", state ? "ON" : "OFF");
+    return true;
+  });
+  EnhancedColorLight.onChangeColorTemperature([](uint16_t colorTemperature) {
+    Serial.printf("Light Color Temperature changed to %d\r\n", colorTemperature);
+    // get correspondent Hue and Saturation of the color temperature
+    HsvColor_t hsvTemperature = espRgbColorToHsvColor(espCTToRgbColor(colorTemperature));
+    // keep previous the brightness and just change the Hue and Saturation 
+    currentHSVColor.h = hsvTemperature.h;
+    currentHSVColor.s = hsvTemperature.s;
+    return true;
+  });
+  EnhancedColorLight.onChangeBrightness([](uint8_t brightness) {
+    Serial.printf("Light brightness changed to %d\r\n", brightness);
+    // change current brightness (HSV value)
+    currentHSVColor.v = brightness;
+    return true;
+  });
+  EnhancedColorLight.onChangeColorHSV([](HsvColor_t hsvColor) {
+    Serial.printf("Light HSV Color changed to (%d,%d,%d)\r\n", hsvColor.h, hsvColor.s, hsvColor.v);
+    // keep the current brightness and just change Hue and Saturation 
+    currentHSVColor.h = hsvColor.h;
+    currentHSVColor.s = hsvColor.s;
+    return true;
+  });
+
+  // Matter beginning - Last step, after all EndPoints are initialized
+  Matter.begin();
+  // This may be a restart of a already commissioned Matter accessory
+  if (Matter.isDeviceCommissioned()) {
+    Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use.");
+    Serial.printf(
+      "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", EnhancedColorLight ? "ON" : "OFF",
+      EnhancedColorLight.getColorRGB().r, EnhancedColorLight.getColorRGB().g, EnhancedColorLight.getColorRGB().b
+    );
+    // configure the Light based on initial on-off state and its color
+    EnhancedColorLight.updateAccessory();
+  }
+}
+// Button control
+uint32_t button_time_stamp = 0;                 // debouncing control
+bool button_state = false;                      // false = released | true = pressed
+const uint32_t debouceTime = 250;               // button debouncing time (ms)
+const uint32_t decommissioningTimeout = 10000;  // keep the button pressed for 10s to decommission the light
+
+void loop() {
+  // Check Matter Light Commissioning state, which may change during execution of loop()
+  if (!Matter.isDeviceCommissioned()) {
+    Serial.println("");
+    Serial.println("Matter Node is not commissioned yet.");
+    Serial.println("Initiate the device discovery in your Matter environment.");
+    Serial.println("Commission it to your Matter hub with the manual pairing code or QR code");
+    Serial.printf("Manual pairing code: %s\r\n", Matter.getManualPairingCode().c_str());
+    Serial.printf("QR code URL: %s\r\n", Matter.getOnboardingQRCodeUrl().c_str());
+    // waits for Matter Light Commissioning.
+    uint32_t timeCount = 0;
+    while (!Matter.isDeviceCommissioned()) {
+      delay(100);
+      if ((timeCount++ % 50) == 0) {  // 50*100ms = 5 sec
+        Serial.println("Matter Node not commissioned yet. Waiting for commissioning.");
+      }
+    }
+    Serial.printf(
+      "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", EnhancedColorLight ? "ON" : "OFF",
+      EnhancedColorLight.getColorRGB().r, EnhancedColorLight.getColorRGB().g, EnhancedColorLight.getColorRGB().b
+    );
+    // configure the Light based on initial on-off state and its color
+    EnhancedColorLight.updateAccessory();
+    Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use.");
+  }
+
+  // A button is also used to control the light
+  // Check if the button has been pressed
+  if (digitalRead(buttonPin) == LOW && !button_state) {
+    // deals with button debouncing
+    button_time_stamp = millis();  // record the time while the button is pressed.
+    button_state = true;           // pressed.
+  }
+
+  // Onboard User Button is used as a Light toggle switch or to decommission it
+  uint32_t time_diff = millis() - button_time_stamp;
+  if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) {
+    button_state = false;  // released
+    // Toggle button is released - toggle the light
+    Serial.println("User button released. Toggling Light!");
+    EnhancedColorLight.toggle();  // Matter Controller also can see the change
+
+    // Factory reset is triggered if the button is pressed longer than 10 seconds
+    if (time_diff > decommissioningTimeout) {
+      Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
+      EnhancedColorLight = false;  // turn the light off
+      Matter.decommission();
+    }
+  }
+}

From 79903fc3761b36e489a1e643dc2580fb36f6bd2b Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 21:49:15 -0300
Subject: [PATCH 02/13] feat(matter): example ci json file descriptor

---
 .../Matter/examples/MatterExtendedColorLight/ci.json      | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 libraries/Matter/examples/MatterExtendedColorLight/ci.json

diff --git a/libraries/Matter/examples/MatterExtendedColorLight/ci.json b/libraries/Matter/examples/MatterExtendedColorLight/ci.json
new file mode 100644
index 00000000000..340cd06c3d7
--- /dev/null
+++ b/libraries/Matter/examples/MatterExtendedColorLight/ci.json
@@ -0,0 +1,8 @@
+{
+    "fqbn_append": "PartitionScheme=huge_app",
+    "requires": [
+      "CONFIG_SOC_WIFI_SUPPORTED=y",
+      "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y"
+    ]
+}
+  

From b384d0b6e48da3461943b879092480d06b05a0bb Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 21:51:13 -0300
Subject: [PATCH 03/13] feat(matter): adds matter extended color light keyword

---
 libraries/Matter/keywords.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt
index 39a74e76583..663cc2e8327 100644
--- a/libraries/Matter/keywords.txt
+++ b/libraries/Matter/keywords.txt
@@ -12,6 +12,7 @@ MatterOnOffLight	KEYWORD1
 MatterDimmableLight	KEYWORD1
 MatterColorTemperatureLight	KEYWORD1
 MatterColorLight	KEYWORD1
+MatterEnhancedColorLight	KEYWORD1
 MatterEndPoint	KEYWORD1
 
 #######################################

From f4c3f8a7bb468b726caea45c5eaa23e769551fb4 Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 21:52:38 -0300
Subject: [PATCH 04/13] feat(matter): adds extended color light endpoint code

---
 CMakeLists.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8ab001c2d09..e2e8cca16d0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -172,6 +172,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS
   libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp
   libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp
   libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp
+  libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.cpp
   libraries/Matter/src/Matter.cpp)
 
 set(ARDUINO_LIBRARY_PPP_SRCS

From fcdfab445103501ccb404002ef6f2988f043b742 Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 21:57:11 -0300
Subject: [PATCH 05/13] feat(matter): a few formatting changes to this endpoint
 code

---
 .../Matter/src/MatterEndpoints/MatterColorTemperatureLight.h     | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h
index 723849e354a..522f9ed7b09 100644
--- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h
+++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h
@@ -57,6 +57,7 @@ class MatterColorTemperatureLight : public MatterEndPoint {
   void onChangeOnOff(EndPointOnOffCB onChangeCB) {
     _onChangeOnOffCB = onChangeCB;
   }
+ 
   // User Callback for whenever the Light brightness value [0..255] is changed by the Matter Controller
   using EndPointBrightnessCB = std::function<bool(uint8_t)>;
   void onChangeBrightness(EndPointBrightnessCB onChangeCB) {

From a0ce8958132461e81c6612db7586316677476537 Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 21:58:22 -0300
Subject: [PATCH 06/13] feat(matter): adds extended color light endpoint to
 matter.h

---
 libraries/Matter/src/Matter.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h
index 4d269474187..5c68572640a 100644
--- a/libraries/Matter/src/Matter.h
+++ b/libraries/Matter/src/Matter.h
@@ -23,6 +23,7 @@
 #include <MatterEndpoints/MatterDimmableLight.h>
 #include <MatterEndpoints/MatterColorTemperatureLight.h>
 #include <MatterEndpoints/MatterColorLight.h>
+#include <MatterEndpoints/MatterEnhancedColorLight.h>
 
 using namespace esp_matter;
 
@@ -52,6 +53,7 @@ class ArduinoMatter {
   friend class MatterDimmableLight;
   friend class MatterColorTemperatureLight;
   friend class MatterColorLight;
+  friend class MatterEnhancedColorLight;
 
 protected:
   static void _init();

From 157d0a073f045801dc1413888636afbde1199a9a Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 22:00:22 -0300
Subject: [PATCH 07/13] feat(matter): adds matter extended color light header
 file

---
 .../MatterExtendedColorLight.h                | 103 ++++++++++++++++++
 1 file changed, 103 insertions(+)
 create mode 100644 libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.h

diff --git a/libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.h
new file mode 100644
index 00000000000..a8180652609
--- /dev/null
+++ b/libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.h
@@ -0,0 +1,103 @@
+// Copyright 2024 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+#include <sdkconfig.h>
+#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL
+
+#include <Matter.h>
+#include <MatterEndPoint.h>
+
+class MatterEnhancedColorLight : public MatterEndPoint {
+public:
+  static const uint8_t MAX_BRIGHTNESS = 255;
+  static const uint16_t MAX_COLOR_TEMPERATURE = 500;
+  static const uint16_t MIN_COLOR_TEMPERATURE = 100;
+
+  MatterEnhancedColorLight();
+  ~MatterEnhancedColorLight();
+  // default initial state is off, brigthness = 25 (10%), HSV(21, 216, 25), color temperature is 454 (Warm White)
+  virtual bool begin(bool initialState = false, espHsvColor_t colorHSV = { 21, 216, 25}, uint8_t newBrightness = 25, uint16_t colorTemperature = 454);
+  // this will just stop processing Light Matter events
+  void end();
+
+  bool setOnOff(bool newState);  // returns true if successful
+  bool getOnOff();               // returns current light state
+  bool toggle();                 // returns true if successful
+
+  bool setColorTemperature(uint16_t newTemperature);  // returns true if successful
+  uint16_t getColorTemperature();                     // returns current temperature
+
+  bool setBrightness(uint8_t newBrightness);  // returns true if successful
+  uint8_t getBrightness();                    // returns current brightness
+
+  bool setColorRGB(espRgbColor_t rgbColor);  // returns true if successful
+  espRgbColor_t getColorRGB();               // returns current RGB Color
+  bool setColorHSV(espHsvColor_t hsvColor);  // returns true if successful
+  espHsvColor_t getColorHSV();               // returns current HSV Color
+
+
+  // used to update the state of the light using the current Matter Light internal state
+  // It is necessary to set a user callback function using onChange() to handle the physical light state
+  void updateAccessory();
+
+  operator bool();             // returns current on/off light state
+  void operator=(bool state);  // turns light on or off
+
+  // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary.
+  bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val);
+
+  // User Callback for whenever the Light On/Off state is changed by the Matter Controller
+  using EndPointOnOffCB = std::function<bool(bool)>;
+  void onChangeOnOff(EndPointOnOffCB onChangeCB) {
+    _onChangeOnOffCB = onChangeCB;
+  }
+
+  // User Callback for whenever the Light brightness value [0..255] is changed by the Matter Controller
+  using EndPointBrightnessCB = std::function<bool(uint8_t)>;
+  void onChangeBrightness(EndPointBrightnessCB onChangeCB) {
+    _onChangeBrightnessCB = onChangeCB;
+  }
+
+  // User Callback for whenever the HSV Color value is changed by the Matter Controller
+  using EndPointRGBColorCB = std::function<bool(espHsvColor_t)>;
+  void onChangeColorHSV(EndPointRGBColorCB onChangeCB) {
+    _onChangeColorCB = onChangeCB;
+  }
+
+  // User Callbqck for whenever the Light temperature value is changed by the Matter Controller
+  using EndPointTemperatureCB = std::function<bool(uint16_t)>;
+  void onChangeColorTemperature(EndPointTemperatureCB onChangeCB) {
+    _onChangeTemperatureCB = onChangeCB;
+  }
+
+  // User Callback for whenever any parameter is changed by the Matter Controller
+  using EndPointCB = std::function<bool(bool, espHsvColor_t, uint8_t, uint16_t)>;
+  void onChange(EndPointCB onChangeCB) {
+    _onChangeCB = onChangeCB;
+  }
+
+protected:
+  bool started = false;
+  bool onOffState = false;                // default initial state is off, but it can be changed by begin(bool)
+  uint8_t brightnessLevel = 0;            // default initial brightness is 0, but it can be changed by begin(bool, uint8_t)
+  espHsvColor_t colorHSV = { 0 };         // default initial color HSV is black, but it can be changed by begin(bool, uint8_t, espHsvColor_t)
+  uint16_t colorTemperatureLevel = 0;     // default initial color temperature is 0, but it can be changed by begin(bool, uint8_t, espHsvColor_t, uint16_t)
+  EndPointOnOffCB _onChangeOnOffCB = NULL;
+  EndPointBrightnessCB _onChangeBrightnessCB = NULL;
+  EndPointRGBColorCB _onChangeColorCB = NULL;
+  EndPointTemperatureCB _onChangeTemperatureCB = NULL;
+  EndPointCB _onChangeCB = NULL;
+};
+#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */

From 6cbdbecfd2502f38bc5901973966964616f71929 Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 22:01:57 -0300
Subject: [PATCH 08/13] feat(matter): adds matter extended color light code
 file

---
 .../MatterExtendedColorLight.cpp              | 384 ++++++++++++++++++
 1 file changed, 384 insertions(+)
 create mode 100644 libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.cpp

diff --git a/libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.cpp
new file mode 100644
index 00000000000..b6aa293c5f1
--- /dev/null
+++ b/libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.cpp
@@ -0,0 +1,384 @@
+// Copyright 2024 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <sdkconfig.h>
+#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL
+
+#include <Matter.h>
+#include <app/server/Server.h>
+#include <MatterEndpoints/MatterEnhancedColorLight.h>
+
+using namespace esp_matter;
+using namespace esp_matter::endpoint;
+using namespace chip::app::Clusters;
+
+// endpoint for enhanced color light device
+namespace esp_matter {
+  using namespace cluster;
+namespace endpoint { 
+namespace enhanced_color_light {
+typedef struct config {
+    cluster::descriptor::config_t descriptor;
+    cluster::identify::config_t identify;
+    cluster::groups::config_t groups;
+    cluster::scenes_management::config_t scenes_management;
+    cluster::on_off::config_t on_off;
+    cluster::level_control::config_t level_control;
+    cluster::color_control::config_t color_control;
+} config_t;
+
+uint32_t get_device_type_id() {
+    return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_ID;
+}
+
+uint8_t get_device_type_version() {
+    return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_VERSION;
+}
+
+esp_err_t add(endpoint_t *endpoint, config_t *config) {
+    if (!endpoint) {
+        log_e("Endpoint cannot be NULL");
+        return ESP_ERR_INVALID_ARG;
+    }
+    esp_err_t err = add_device_type(endpoint, get_device_type_id(), get_device_type_version());
+    if (err != ESP_OK) {
+        log_e("Failed to add device type id:%" PRIu32 ",err: %d", get_device_type_id(), err);
+        return err;
+    }
+
+    descriptor::create(endpoint, &(config->descriptor), CLUSTER_FLAG_SERVER);
+    cluster_t *identify_cluster = identify::create(endpoint, &(config->identify), CLUSTER_FLAG_SERVER);
+    identify::command::create_trigger_effect(identify_cluster);
+    groups::create(endpoint, &(config->groups), CLUSTER_FLAG_SERVER);
+    cluster_t *scenes_cluster = scenes_management::create(endpoint, &(config->scenes_management), CLUSTER_FLAG_SERVER);
+    scenes_management::command::create_copy_scene(scenes_cluster);
+    scenes_management::command::create_copy_scene_response(scenes_cluster);
+
+    on_off::create(endpoint, &(config->on_off), CLUSTER_FLAG_SERVER, on_off::feature::lighting::get_id());
+    level_control::create(endpoint, &(config->level_control), CLUSTER_FLAG_SERVER,
+                          level_control::feature::on_off::get_id() | level_control::feature::lighting::get_id());
+    color_control::create(endpoint, &(config->color_control), CLUSTER_FLAG_SERVER,
+                          color_control::feature::hue_saturation::get_id() | color_control::feature::color_temperature::get_id());
+    return ESP_OK;
+}
+
+endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data) {
+    endpoint_t *endpoint = endpoint::create(node, flags, priv_data);
+    add(endpoint, config);
+    return endpoint;
+}
+} /* enhanced_color_light */
+} /* endpoint */
+} /* esp_matter */
+
+
+bool MatterEnhancedColorLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) {
+  bool ret = true;
+  if (!started) {
+    log_e("Matter Enhanced ColorLight device has not begun.");
+    return false;
+  }
+
+  log_d("Enhanced ColorAttr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u, type: %u", endpoint_id, cluster_id, attribute_id, val->val.u32, val->type);
+
+  if (endpoint_id == getEndPointId()) {
+    switch (cluster_id) {
+      case OnOff::Id:
+        if (attribute_id == OnOff::Attributes::OnOff::Id) {
+          log_d("Enhanced ColorLight On/Off State changed to %d", val->val.b);
+          if (_onChangeOnOffCB != NULL) {
+            ret &= _onChangeOnOffCB(val->val.b);
+          }
+          if (_onChangeCB != NULL) {
+            ret &= _onChangeCB(val->val.b, colorHSV,  brightnessLevel, colorTemperatureLevel);
+          }
+          if (ret == true) {
+            onOffState = val->val.b;
+          }
+        }
+        break;
+      case LevelControl::Id:
+        if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) {
+          log_d("Enhanced ColorLight Brightness changed to %d", val->val.u8);
+          if (_onChangeBrightnessCB != NULL) {
+            ret &= _onChangeBrightnessCB(val->val.u8);
+          }
+          if (_onChangeCB != NULL) {
+            ret &= _onChangeCB(onOffState, colorHSV, val->val.u8, colorTemperatureLevel);
+          }
+          if (ret == true) {
+            colorHSV.v = val->val.u8;
+          }
+        }
+        break;
+      case ColorControl::Id:
+      {
+        if (attribute_id == ColorControl::Attributes::ColorTemperatureMireds::Id) {
+          log_d("Enhanced ColorLight Temperature changed to %d", val->val.u16);
+          if (_onChangeTemperatureCB != NULL) {
+            ret &= _onChangeTemperatureCB(val->val.u16);
+          }
+          if (_onChangeCB != NULL) {
+            ret &= _onChangeCB(onOffState, colorHSV, brightnessLevel, val->val.u16);
+          }
+          if (ret == true) {
+            colorTemperatureLevel = val->val.u16;
+          }
+          break;
+        }
+        if (attribute_id != ColorControl::Attributes::CurrentHue::Id && attribute_id != ColorControl::Attributes::CurrentSaturation::Id) {
+          log_i("Color Control Attribute ID [%x] not processed.", attribute_id);
+          break;
+        }
+        espHsvColor_t hsvColor = {colorHSV.h, colorHSV.s, colorHSV.v};
+        if (attribute_id == ColorControl::Attributes::CurrentHue::Id) {
+          log_d("Enhanced ColorLight Hue changed to %d", val->val.u8);
+          hsvColor.h = val->val.u8;
+        } else { // attribute_id == ColorControl::Attributes::CurrentSaturation::Id)
+          log_d("Enhanced ColorLight Saturation changed to %d", val->val.u8);
+          hsvColor.s = val->val.u8;
+        }
+        if (_onChangeColorCB != NULL) {
+          ret &= _onChangeColorCB(hsvColor);
+        }  
+        if (_onChangeCB != NULL) {
+          ret &= _onChangeCB(onOffState, hsvColor, brightnessLevel, colorTemperatureLevel);
+        }
+        if (ret == true) {
+          colorHSV = {hsvColor.h, hsvColor.s, hsvColor.v};
+        }
+        break;
+      }
+    }
+  }
+  return ret;
+}
+
+MatterEnhancedColorLight::MatterEnhancedColorLight() {}
+
+MatterEnhancedColorLight::~MatterEnhancedColorLight() {
+  end();
+}
+
+bool MatterEnhancedColorLight::begin(bool initialState, espHsvColor_t _colorHSV, uint8_t brightness, uint16_t ColorTemperature) {
+  ArduinoMatter::_init();
+  enhanced_color_light::config_t light_config;
+
+  light_config.on_off.on_off = initialState;
+  light_config.on_off.lighting.start_up_on_off = nullptr;
+  onOffState = initialState;
+
+  light_config.level_control.current_level = brightness;
+  light_config.level_control.lighting.start_up_current_level = nullptr;
+
+  light_config.color_control.enhanced_color_mode = (uint8_t)ColorControl::ColorMode::kColorTemperature;
+  light_config.color_control.color_temperature.color_temperature_mireds = ColorTemperature;
+  light_config.color_control.color_temperature.startup_color_temperature_mireds = nullptr;
+  colorTemperatureLevel = ColorTemperature;
+
+  light_config.color_control.color_mode = (uint8_t)ColorControl::ColorMode::kCurrentHueAndCurrentSaturation;
+  light_config.color_control.hue_saturation.current_hue = _colorHSV.h;
+  light_config.color_control.hue_saturation.current_saturation = _colorHSV.s;
+  colorHSV = {_colorHSV.h, _colorHSV.s, _colorHSV.v};
+
+  // endpoint handles can be used to add/modify clusters.
+  endpoint_t *endpoint = enhanced_color_light::create(node::get(), &light_config, ENDPOINT_FLAG_NONE, (void *)this);
+  if (endpoint == nullptr) {
+    log_e("Failed to create Enhanced ColorLight endpoint");
+    return false;
+  }
+
+  setEndPointId(endpoint::get_id(endpoint));
+  log_i("Enhanced ColorLight created with endpoint_id %d", getEndPointId());
+
+  /* Mark deferred persistence for some attributes that might be changed rapidly */
+  cluster_t *level_control_cluster = cluster::get(endpoint, LevelControl::Id);
+  attribute_t *current_level_attribute = attribute::get(level_control_cluster, LevelControl::Attributes::CurrentLevel::Id);
+  attribute::set_deferred_persistence(current_level_attribute);
+
+  started = true;
+  return true;
+}
+
+void MatterEnhancedColorLight::end() {
+  started = false;
+}
+
+bool MatterEnhancedColorLight::setOnOff(bool newState) {
+  if (!started) {
+    log_e("Matter Enhanced ColorLight device has not begun.");
+    return false;
+  }
+
+  // avoid processing the a "no-change"
+  if (onOffState == newState) {
+    return true;
+  }
+
+  onOffState = newState;
+
+  endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id);
+  cluster_t *cluster = cluster::get(endpoint, OnOff::Id);
+  attribute_t *attribute = attribute::get(cluster, OnOff::Attributes::OnOff::Id);
+
+  esp_matter_attr_val_t val = esp_matter_invalid(NULL);
+  attribute::get_val(attribute, &val);
+
+  if (val.val.b != onOffState) {
+    val.val.b = onOffState;
+    attribute::update(endpoint_id, OnOff::Id, OnOff::Attributes::OnOff::Id, &val);
+  }
+  return true;
+}
+
+void MatterEnhancedColorLight::updateAccessory() {
+  if (_onChangeCB != NULL) {
+    _onChangeCB(onOffState, colorHSV, brightnessLevel, colorTemperatureLevel);
+  }
+}
+
+bool MatterEnhancedColorLight::getOnOff() {
+  return onOffState;
+}
+
+bool MatterEnhancedColorLight::toggle() {
+  return setOnOff(!onOffState);
+}
+
+bool MatterEnhancedColorLight::setBrightness(uint8_t newBrightness) {
+  if (!started) {
+    log_w("Matter Enhanced ColorLight device has not begun.");
+    return false;
+  }
+
+  // avoid processing the a "no-change"
+  if (brightnessLevel == newBrightness) {
+    return true;
+  }
+
+  brightnessLevel = newBrightness;
+
+  endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id);
+  cluster_t *cluster = cluster::get(endpoint, LevelControl::Id);
+  attribute_t *attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id);
+
+  esp_matter_attr_val_t val = esp_matter_invalid(NULL);
+  attribute::get_val(attribute, &val);
+
+  if (val.val.u8 != brightnessLevel) {
+    val.val.u8 = brightnessLevel;
+    attribute::update(endpoint_id, LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, &val);
+  }
+  return true;
+}
+
+uint8_t MatterEnhancedColorLight::getBrightness() {
+  return brightnessLevel;
+}
+
+bool MatterEnhancedColorLight::setColorTemperature(uint16_t newTemperature) {
+  if (!started) {
+    log_w("Matter Enhanced ColorLight device has not begun.");
+    return false;
+  }
+
+  // avoid processing the a "no-change"
+  if (colorTemperatureLevel == newTemperature) {
+    return true;
+  }
+
+  colorTemperatureLevel = newTemperature;
+
+  endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id);
+  cluster_t *cluster = cluster::get(endpoint, ColorControl::Id);
+  attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::ColorTemperatureMireds::Id);
+
+  esp_matter_attr_val_t val = esp_matter_invalid(NULL);
+  attribute::get_val(attribute, &val);
+
+  if (val.val.u16 != colorTemperatureLevel) {
+    val.val.u16 = colorTemperatureLevel;
+    attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::ColorTemperatureMireds::Id, &val);
+  }
+  return true;
+}
+
+uint16_t MatterEnhancedColorLight::getColorTemperature() {
+  return colorTemperatureLevel;
+}
+
+bool MatterEnhancedColorLight::setColorRGB(espRgbColor_t _rgbColor) {
+  return setColorHSV(espRgbColorToHsvColor(_rgbColor));
+}
+
+espRgbColor_t MatterEnhancedColorLight::getColorRGB() {
+  return espHsvColorToRgbColor(colorHSV);
+}
+
+bool MatterEnhancedColorLight::setColorHSV(espHsvColor_t _hsvColor) {
+
+  if (!started) {
+    log_w("Matter Enhanced ColorLight device has not begun.");
+    return false;
+  }
+
+  // avoid processing the a "no-change"
+  if (colorHSV.h == _hsvColor.h && colorHSV.s == _hsvColor.s && colorHSV.v == _hsvColor.v) {
+    return true;
+  }
+
+  colorHSV = { _hsvColor.h, _hsvColor.s, _hsvColor.v };
+
+  endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id);
+  cluster_t *cluster = cluster::get(endpoint, ColorControl::Id);
+  // update hue
+  attribute_t *attribute = attribute::get(cluster, ColorControl::Attributes::CurrentHue::Id);
+  esp_matter_attr_val_t val = esp_matter_invalid(NULL);
+  attribute::get_val(attribute, &val);
+  if (val.val.u8 != colorHSV.h) {
+    val.val.u8 = colorHSV.h;
+    attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::CurrentHue::Id, &val);
+  }
+  // update saturation
+  attribute = attribute::get(cluster, ColorControl::Attributes::CurrentSaturation::Id);
+  val = esp_matter_invalid(NULL);
+  attribute::get_val(attribute, &val);
+  if (val.val.u8 != colorHSV.s) {
+    val.val.u8 = colorHSV.s;
+    attribute::update(endpoint_id, ColorControl::Id, ColorControl::Attributes::CurrentSaturation::Id, &val);
+  }
+  // update value (brightness)
+  cluster = cluster::get(endpoint, LevelControl::Id);
+  attribute = attribute::get(cluster, LevelControl::Attributes::CurrentLevel::Id);
+  val = esp_matter_invalid(NULL);
+  attribute::get_val(attribute, &val);
+  if (val.val.u8 != colorHSV.v) {
+    val.val.u8 = colorHSV.v;
+    attribute::update(endpoint_id, LevelControl::Id, LevelControl::Attributes::CurrentLevel::Id, &val);
+  }
+  return true;
+}
+
+espHsvColor_t MatterEnhancedColorLight::getColorHSV() {
+  return colorHSV;
+}
+
+MatterEnhancedColorLight::operator bool() {
+  return getOnOff();
+}
+
+void MatterEnhancedColorLight::operator=(bool newState) {
+  setOnOff(newState);
+}
+#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */

From 7d6cc8a24875c228b3f16f29b5117d7a47ce88cd Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 23:18:14 -0300
Subject: [PATCH 09/13] fix(matter): matter enpoint rename to enhanced color
 light

---
 .../MatterEnhancedColorLight.ino}                                 | 0
 .../ci.json                                                       | 0
 ...{MatterExtendedColorLight.cpp => MatterEnhancedColorLight.cpp} | 0
 .../{MatterExtendedColorLight.h => MatterEnhancedColorLight.h}    | 0
 4 files changed, 0 insertions(+), 0 deletions(-)
 rename libraries/Matter/examples/{MatterExtendedColorLight/MatterExtendedColorLight.ino => MatterEnhancedColorLight/MatterEnhancedColorLight.ino} (100%)
 rename libraries/Matter/examples/{MatterExtendedColorLight => MatterEnhancedColorLight}/ci.json (100%)
 rename libraries/Matter/src/MatterEndpoints/{MatterExtendedColorLight.cpp => MatterEnhancedColorLight.cpp} (100%)
 rename libraries/Matter/src/MatterEndpoints/{MatterExtendedColorLight.h => MatterEnhancedColorLight.h} (100%)

diff --git a/libraries/Matter/examples/MatterExtendedColorLight/MatterExtendedColorLight.ino b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino
similarity index 100%
rename from libraries/Matter/examples/MatterExtendedColorLight/MatterExtendedColorLight.ino
rename to libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino
diff --git a/libraries/Matter/examples/MatterExtendedColorLight/ci.json b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json
similarity index 100%
rename from libraries/Matter/examples/MatterExtendedColorLight/ci.json
rename to libraries/Matter/examples/MatterEnhancedColorLight/ci.json
diff --git a/libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp
similarity index 100%
rename from libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.cpp
rename to libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp
diff --git a/libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h
similarity index 100%
rename from libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.h
rename to libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h

From b356cefa9c1e82732352d04287aeb56e6cd067fe Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Tue, 26 Nov 2024 23:27:50 -0300
Subject: [PATCH 10/13] fix(matter): cmakefiles.txt updated with correct files

---
 CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e2e8cca16d0..9bbef502143 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -172,7 +172,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS
   libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp
   libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.cpp
   libraries/Matter/src/MatterEndpoints/MatterColorLight.cpp
-  libraries/Matter/src/MatterEndpoints/MatterExtendedColorLight.cpp
+  libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp
   libraries/Matter/src/Matter.cpp)
 
 set(ARDUINO_LIBRARY_PPP_SRCS

From 12f6a43e01eae0162563a87b563ca2fd84cabbc7 Mon Sep 17 00:00:00 2001
From: "pre-commit-ci-lite[bot]"
 <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
Date: Mon, 2 Dec 2024 12:51:45 +0000
Subject: [PATCH 11/13] ci(pre-commit): Apply automatic fixes

---
 .../MatterEnhancedColorLight.ino              | 12 +--
 .../examples/MatterEnhancedColorLight/ci.json |  2 +-
 .../MatterColorTemperatureLight.h             |  2 +-
 .../MatterEnhancedColorLight.cpp              | 97 ++++++++++---------
 .../MatterEnhancedColorLight.h                | 11 +--
 5 files changed, 64 insertions(+), 60 deletions(-)

diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino
index 031d3b15be5..afba203b708 100644
--- a/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino
+++ b/libraries/Matter/examples/MatterEnhancedColorLight/MatterEnhancedColorLight.ino
@@ -115,7 +115,7 @@ void setup() {
     Serial.printf("Light Color Temperature changed to %d\r\n", colorTemperature);
     // get correspondent Hue and Saturation of the color temperature
     HsvColor_t hsvTemperature = espRgbColorToHsvColor(espCTToRgbColor(colorTemperature));
-    // keep previous the brightness and just change the Hue and Saturation 
+    // keep previous the brightness and just change the Hue and Saturation
     currentHSVColor.h = hsvTemperature.h;
     currentHSVColor.s = hsvTemperature.s;
     return true;
@@ -128,7 +128,7 @@ void setup() {
   });
   EnhancedColorLight.onChangeColorHSV([](HsvColor_t hsvColor) {
     Serial.printf("Light HSV Color changed to (%d,%d,%d)\r\n", hsvColor.h, hsvColor.s, hsvColor.v);
-    // keep the current brightness and just change Hue and Saturation 
+    // keep the current brightness and just change Hue and Saturation
     currentHSVColor.h = hsvColor.h;
     currentHSVColor.s = hsvColor.s;
     return true;
@@ -140,8 +140,8 @@ void setup() {
   if (Matter.isDeviceCommissioned()) {
     Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use.");
     Serial.printf(
-      "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", EnhancedColorLight ? "ON" : "OFF",
-      EnhancedColorLight.getColorRGB().r, EnhancedColorLight.getColorRGB().g, EnhancedColorLight.getColorRGB().b
+      "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", EnhancedColorLight ? "ON" : "OFF", EnhancedColorLight.getColorRGB().r,
+      EnhancedColorLight.getColorRGB().g, EnhancedColorLight.getColorRGB().b
     );
     // configure the Light based on initial on-off state and its color
     EnhancedColorLight.updateAccessory();
@@ -171,8 +171,8 @@ void loop() {
       }
     }
     Serial.printf(
-      "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", EnhancedColorLight ? "ON" : "OFF",
-      EnhancedColorLight.getColorRGB().r, EnhancedColorLight.getColorRGB().g, EnhancedColorLight.getColorRGB().b
+      "Initial state: %s | RGB Color: (%d,%d,%d) \r\n", EnhancedColorLight ? "ON" : "OFF", EnhancedColorLight.getColorRGB().r,
+      EnhancedColorLight.getColorRGB().g, EnhancedColorLight.getColorRGB().b
     );
     // configure the Light based on initial on-off state and its color
     EnhancedColorLight.updateAccessory();
diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/ci.json b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json
index 340cd06c3d7..157f2a0eca2 100644
--- a/libraries/Matter/examples/MatterEnhancedColorLight/ci.json
+++ b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json
@@ -5,4 +5,4 @@
       "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y"
     ]
 }
-  
+
diff --git a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h
index 522f9ed7b09..e886a184182 100644
--- a/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h
+++ b/libraries/Matter/src/MatterEndpoints/MatterColorTemperatureLight.h
@@ -57,7 +57,7 @@ class MatterColorTemperatureLight : public MatterEndPoint {
   void onChangeOnOff(EndPointOnOffCB onChangeCB) {
     _onChangeOnOffCB = onChangeCB;
   }
- 
+
   // User Callback for whenever the Light brightness value [0..255] is changed by the Matter Controller
   using EndPointBrightnessCB = std::function<bool(uint8_t)>;
   void onChangeBrightness(EndPointBrightnessCB onChangeCB) {
diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp
index b6aa293c5f1..423a6a7d2ef 100644
--- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp
+++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.cpp
@@ -25,63 +25,65 @@ using namespace chip::app::Clusters;
 
 // endpoint for enhanced color light device
 namespace esp_matter {
-  using namespace cluster;
-namespace endpoint { 
+using namespace cluster;
+namespace endpoint {
 namespace enhanced_color_light {
 typedef struct config {
-    cluster::descriptor::config_t descriptor;
-    cluster::identify::config_t identify;
-    cluster::groups::config_t groups;
-    cluster::scenes_management::config_t scenes_management;
-    cluster::on_off::config_t on_off;
-    cluster::level_control::config_t level_control;
-    cluster::color_control::config_t color_control;
+  cluster::descriptor::config_t descriptor;
+  cluster::identify::config_t identify;
+  cluster::groups::config_t groups;
+  cluster::scenes_management::config_t scenes_management;
+  cluster::on_off::config_t on_off;
+  cluster::level_control::config_t level_control;
+  cluster::color_control::config_t color_control;
 } config_t;
 
 uint32_t get_device_type_id() {
-    return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_ID;
+  return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_ID;
 }
 
 uint8_t get_device_type_version() {
-    return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_VERSION;
+  return ESP_MATTER_EXTENDED_COLOR_LIGHT_DEVICE_TYPE_VERSION;
 }
 
 esp_err_t add(endpoint_t *endpoint, config_t *config) {
-    if (!endpoint) {
-        log_e("Endpoint cannot be NULL");
-        return ESP_ERR_INVALID_ARG;
-    }
-    esp_err_t err = add_device_type(endpoint, get_device_type_id(), get_device_type_version());
-    if (err != ESP_OK) {
-        log_e("Failed to add device type id:%" PRIu32 ",err: %d", get_device_type_id(), err);
-        return err;
-    }
+  if (!endpoint) {
+    log_e("Endpoint cannot be NULL");
+    return ESP_ERR_INVALID_ARG;
+  }
+  esp_err_t err = add_device_type(endpoint, get_device_type_id(), get_device_type_version());
+  if (err != ESP_OK) {
+    log_e("Failed to add device type id:%" PRIu32 ",err: %d", get_device_type_id(), err);
+    return err;
+  }
 
-    descriptor::create(endpoint, &(config->descriptor), CLUSTER_FLAG_SERVER);
-    cluster_t *identify_cluster = identify::create(endpoint, &(config->identify), CLUSTER_FLAG_SERVER);
-    identify::command::create_trigger_effect(identify_cluster);
-    groups::create(endpoint, &(config->groups), CLUSTER_FLAG_SERVER);
-    cluster_t *scenes_cluster = scenes_management::create(endpoint, &(config->scenes_management), CLUSTER_FLAG_SERVER);
-    scenes_management::command::create_copy_scene(scenes_cluster);
-    scenes_management::command::create_copy_scene_response(scenes_cluster);
-
-    on_off::create(endpoint, &(config->on_off), CLUSTER_FLAG_SERVER, on_off::feature::lighting::get_id());
-    level_control::create(endpoint, &(config->level_control), CLUSTER_FLAG_SERVER,
-                          level_control::feature::on_off::get_id() | level_control::feature::lighting::get_id());
-    color_control::create(endpoint, &(config->color_control), CLUSTER_FLAG_SERVER,
-                          color_control::feature::hue_saturation::get_id() | color_control::feature::color_temperature::get_id());
-    return ESP_OK;
+  descriptor::create(endpoint, &(config->descriptor), CLUSTER_FLAG_SERVER);
+  cluster_t *identify_cluster = identify::create(endpoint, &(config->identify), CLUSTER_FLAG_SERVER);
+  identify::command::create_trigger_effect(identify_cluster);
+  groups::create(endpoint, &(config->groups), CLUSTER_FLAG_SERVER);
+  cluster_t *scenes_cluster = scenes_management::create(endpoint, &(config->scenes_management), CLUSTER_FLAG_SERVER);
+  scenes_management::command::create_copy_scene(scenes_cluster);
+  scenes_management::command::create_copy_scene_response(scenes_cluster);
+
+  on_off::create(endpoint, &(config->on_off), CLUSTER_FLAG_SERVER, on_off::feature::lighting::get_id());
+  level_control::create(
+    endpoint, &(config->level_control), CLUSTER_FLAG_SERVER, level_control::feature::on_off::get_id() | level_control::feature::lighting::get_id()
+  );
+  color_control::create(
+    endpoint, &(config->color_control), CLUSTER_FLAG_SERVER,
+    color_control::feature::hue_saturation::get_id() | color_control::feature::color_temperature::get_id()
+  );
+  return ESP_OK;
 }
 
 endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data) {
-    endpoint_t *endpoint = endpoint::create(node, flags, priv_data);
-    add(endpoint, config);
-    return endpoint;
+  endpoint_t *endpoint = endpoint::create(node, flags, priv_data);
+  add(endpoint, config);
+  return endpoint;
 }
-} /* enhanced_color_light */
-} /* endpoint */
-} /* esp_matter */
-
+}  // namespace enhanced_color_light
+}  // namespace endpoint
+}  // namespace esp_matter
 
 bool MatterEnhancedColorLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) {
   bool ret = true;
@@ -90,7 +92,10 @@ bool MatterEnhancedColorLight::attributeChangeCB(uint16_t endpoint_id, uint32_t
     return false;
   }
 
-  log_d("Enhanced ColorAttr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u, type: %u", endpoint_id, cluster_id, attribute_id, val->val.u32, val->type);
+  log_d(
+    "Enhanced ColorAttr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u, type: %u", endpoint_id, cluster_id, attribute_id, val->val.u32,
+    val->type
+  );
 
   if (endpoint_id == getEndPointId()) {
     switch (cluster_id) {
@@ -101,7 +106,7 @@ bool MatterEnhancedColorLight::attributeChangeCB(uint16_t endpoint_id, uint32_t
             ret &= _onChangeOnOffCB(val->val.b);
           }
           if (_onChangeCB != NULL) {
-            ret &= _onChangeCB(val->val.b, colorHSV,  brightnessLevel, colorTemperatureLevel);
+            ret &= _onChangeCB(val->val.b, colorHSV, brightnessLevel, colorTemperatureLevel);
           }
           if (ret == true) {
             onOffState = val->val.b;
@@ -145,13 +150,13 @@ bool MatterEnhancedColorLight::attributeChangeCB(uint16_t endpoint_id, uint32_t
         if (attribute_id == ColorControl::Attributes::CurrentHue::Id) {
           log_d("Enhanced ColorLight Hue changed to %d", val->val.u8);
           hsvColor.h = val->val.u8;
-        } else { // attribute_id == ColorControl::Attributes::CurrentSaturation::Id)
+        } else {  // attribute_id == ColorControl::Attributes::CurrentSaturation::Id)
           log_d("Enhanced ColorLight Saturation changed to %d", val->val.u8);
           hsvColor.s = val->val.u8;
         }
         if (_onChangeColorCB != NULL) {
           ret &= _onChangeColorCB(hsvColor);
-        }  
+        }
         if (_onChangeCB != NULL) {
           ret &= _onChangeCB(onOffState, hsvColor, brightnessLevel, colorTemperatureLevel);
         }
@@ -338,7 +343,7 @@ bool MatterEnhancedColorLight::setColorHSV(espHsvColor_t _hsvColor) {
     return true;
   }
 
-  colorHSV = { _hsvColor.h, _hsvColor.s, _hsvColor.v };
+  colorHSV = {_hsvColor.h, _hsvColor.s, _hsvColor.v};
 
   endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id);
   cluster_t *cluster = cluster::get(endpoint, ColorControl::Id);
diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h
index a8180652609..cd4d53f4fea 100644
--- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h
+++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h
@@ -28,7 +28,7 @@ class MatterEnhancedColorLight : public MatterEndPoint {
   MatterEnhancedColorLight();
   ~MatterEnhancedColorLight();
   // default initial state is off, brigthness = 25 (10%), HSV(21, 216, 25), color temperature is 454 (Warm White)
-  virtual bool begin(bool initialState = false, espHsvColor_t colorHSV = { 21, 216, 25}, uint8_t newBrightness = 25, uint16_t colorTemperature = 454);
+  virtual bool begin(bool initialState = false, espHsvColor_t colorHSV = {21, 216, 25}, uint8_t newBrightness = 25, uint16_t colorTemperature = 454);
   // this will just stop processing Light Matter events
   void end();
 
@@ -47,7 +47,6 @@ class MatterEnhancedColorLight : public MatterEndPoint {
   bool setColorHSV(espHsvColor_t hsvColor);  // returns true if successful
   espHsvColor_t getColorHSV();               // returns current HSV Color
 
-
   // used to update the state of the light using the current Matter Light internal state
   // It is necessary to set a user callback function using onChange() to handle the physical light state
   void updateAccessory();
@@ -90,10 +89,10 @@ class MatterEnhancedColorLight : public MatterEndPoint {
 
 protected:
   bool started = false;
-  bool onOffState = false;                // default initial state is off, but it can be changed by begin(bool)
-  uint8_t brightnessLevel = 0;            // default initial brightness is 0, but it can be changed by begin(bool, uint8_t)
-  espHsvColor_t colorHSV = { 0 };         // default initial color HSV is black, but it can be changed by begin(bool, uint8_t, espHsvColor_t)
-  uint16_t colorTemperatureLevel = 0;     // default initial color temperature is 0, but it can be changed by begin(bool, uint8_t, espHsvColor_t, uint16_t)
+  bool onOffState = false;             // default initial state is off, but it can be changed by begin(bool)
+  uint8_t brightnessLevel = 0;         // default initial brightness is 0, but it can be changed by begin(bool, uint8_t)
+  espHsvColor_t colorHSV = {0};        // default initial color HSV is black, but it can be changed by begin(bool, uint8_t, espHsvColor_t)
+  uint16_t colorTemperatureLevel = 0;  // default initial color temperature is 0, but it can be changed by begin(bool, uint8_t, espHsvColor_t, uint16_t)
   EndPointOnOffCB _onChangeOnOffCB = NULL;
   EndPointBrightnessCB _onChangeBrightnessCB = NULL;
   EndPointRGBColorCB _onChangeColorCB = NULL;

From 064ee133671496eac5dc9a21b4c05a36f0c28a2c Mon Sep 17 00:00:00 2001
From: Rodrigo Garcia <rodrigo.garcia@espressif.com>
Date: Mon, 2 Dec 2024 19:15:07 -0300
Subject: [PATCH 12/13] fix(matter): codespell ci commentary fixed

---
 libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h
index cd4d53f4fea..66ed1943b8d 100644
--- a/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h
+++ b/libraries/Matter/src/MatterEndpoints/MatterEnhancedColorLight.h
@@ -27,7 +27,7 @@ class MatterEnhancedColorLight : public MatterEndPoint {
 
   MatterEnhancedColorLight();
   ~MatterEnhancedColorLight();
-  // default initial state is off, brigthness = 25 (10%), HSV(21, 216, 25), color temperature is 454 (Warm White)
+  // default initial state is off, brightness = 25 (10%), HSV(21, 216, 25), color temperature is 454 (Warm White)
   virtual bool begin(bool initialState = false, espHsvColor_t colorHSV = {21, 216, 25}, uint8_t newBrightness = 25, uint16_t colorTemperature = 454);
   // this will just stop processing Light Matter events
   void end();

From 8091fd7fece301dbafdc511ec1cd77832eb30de9 Mon Sep 17 00:00:00 2001
From: "pre-commit-ci-lite[bot]"
 <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
Date: Mon, 2 Dec 2024 22:15:49 +0000
Subject: [PATCH 13/13] ci(pre-commit): Apply automatic fixes

---
 libraries/Matter/examples/MatterEnhancedColorLight/ci.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/libraries/Matter/examples/MatterEnhancedColorLight/ci.json b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json
index 157f2a0eca2..0665800b12b 100644
--- a/libraries/Matter/examples/MatterEnhancedColorLight/ci.json
+++ b/libraries/Matter/examples/MatterEnhancedColorLight/ci.json
@@ -5,4 +5,3 @@
       "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y"
     ]
 }
-