From 65078c9b0cb0a8e218686c9de97c356cdc54bfe8 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 29 Oct 2024 06:50:44 -0300 Subject: [PATCH 01/17] feat(matter): source code folder organization --- .../examples/MatterCommissionTest/MatterCommissionTest.ino | 2 +- .../examples/MatterComposedLights/MatterComposedLights.ino | 2 +- libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino | 2 +- libraries/Matter/src/{ => MatterEndpoints}/MatterOnOffLight.cpp | 2 +- libraries/Matter/src/{ => MatterEndpoints}/MatterOnOffLight.h | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename libraries/Matter/src/{ => MatterEndpoints}/MatterOnOffLight.cpp (98%) rename libraries/Matter/src/{ => MatterEndpoints}/MatterOnOffLight.h (100%) diff --git a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino index 48ec0355092..94cd962cc4a 100644 --- a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino +++ b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino @@ -4,7 +4,7 @@ // List of Matter Endpoints for this Node // On/Off Light Endpoint -#include +#include MatterOnOffLight OnOffLight; // WiFi is manually set and started diff --git a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino index 5d4acb557f5..5f690746ba3 100644 --- a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino +++ b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino @@ -4,7 +4,7 @@ // List of Matter Endpoints for this Node // There will be 3 On/Off Light Endpoints in the same Node -#include +#include MatterOnOffLight OnOffLight1; MatterOnOffLight OnOffLight2; MatterOnOffLight OnOffLight3; diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index 751bcb3d99e..ad068a4a571 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -5,7 +5,7 @@ // List of Matter Endpoints for this Node // On/Off Light Endpoint -#include +#include MatterOnOffLight OnOffLight; // it will keep last OnOff state stored, using Preferences diff --git a/libraries/Matter/src/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp similarity index 98% rename from libraries/Matter/src/MatterOnOffLight.cpp rename to libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index 7e8926ffdef..f125d52c370 100644 --- a/libraries/Matter/src/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -3,7 +3,7 @@ #include #include -#include +#include using namespace esp_matter; using namespace esp_matter::endpoint; diff --git a/libraries/Matter/src/MatterOnOffLight.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h similarity index 100% rename from libraries/Matter/src/MatterOnOffLight.h rename to libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h From 8c44945abde605b5b0897c4c995673da20f52d45 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 29 Oct 2024 18:45:05 -0300 Subject: [PATCH 02/17] feat(matter): new matter endpoint dimmable light --- .../MatterDimmableLight.ino | 157 +++++++++++++++++ .../examples/MatterDimmableLight/ci.json | 7 + .../MatterEndpoints/MatterDimmableLight.cpp | 158 ++++++++++++++++++ .../src/MatterEndpoints/MatterDimmableLight.h | 48 ++++++ .../src/MatterEndpoints/MatterOnOffLight.cpp | 9 +- 5 files changed, 376 insertions(+), 3 deletions(-) create mode 100644 libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino create mode 100644 libraries/Matter/examples/MatterDimmableLight/ci.json create mode 100644 libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp create mode 100644 libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino new file mode 100644 index 00000000000..16ff17a8572 --- /dev/null +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -0,0 +1,157 @@ +// Matter Manager +#include +#include +#include + +// List of Matter Endpoints for this Node +// Dimmable Light Endpoint +#include +MatterDimmableLight DimmableLight; + +// it will keep last OnOff & Brightness state stored, using Preferences +Preferences lastStatePref; + +// 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 Dimmable Light +void setRGBLight(bool state, uint8_t brightness) { + Serial.printf("Setting Light to State: %s and Brightness: %d\r\n", DimmableLight ? "ON" : "OFF", brightness); + if (state) { + rgbLedWrite(ledPin, brightness, brightness, brightness); + } else { + digitalWrite(ledPin, LOW); + } +} + +// Matter Protocol Endpoint On-Off Change Callback +bool setLightOnOff(bool state) { + Serial.printf("User Callback :: New Light State = %s\r\n", state ? "ON" : "OFF"); + setRGBLight(state, DimmableLight.getBrightness()); + // store last OnOff state for when the Light is restarted / power goes off + lastStatePref.putBool("lastOnOffState", state); + // This callback must return the success state to Matter core + return true; +} + +// Matter Protocol Endpoint Brightness Change Callback +bool setLightBrightness(uint8_t brightness) { + Serial.printf("User Callback :: New Light Brigthness = %.2f%% [Val = %d]\r\n", ((float) brightness * 100) / MatterDimmableLight::MAX_BRIGHTNESS, brightness); + setRGBLight(DimmableLight.getOnOff(), brightness); + // store last Brightness for when the Light is restarted / power goes off + lastStatePref.putUChar("lastBrightness", brightness); + // 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 + lastStatePref.begin("matterLight", false); + bool lastOnOffState = lastStatePref.getBool("lastOnOffState", true); + uint8_t lastBrightness = lastStatePref.getUChar("lastBrightness", 15); // default brightness = 12% + DimmableLight.begin(lastOnOffState, lastBrightness); + DimmableLight.onChangeOnOff(setLightOnOff); + DimmableLight.onChangeBrightness(setLightBrightness); + + // 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 | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); + setLightOnOff(DimmableLight.getOnOff()); // configure the Light based on initial state + setLightBrightness(DimmableLight.getBrightness()); // configure the Light based on initial brightness + } +} +// 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 | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); + setLightOnOff(DimmableLight.getOnOff()); // configure the Light based on initial state + setLightBrightness(DimmableLight.getBrightness()); // configure the Light based on initial brightness + 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!"); + DimmableLight.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."); + DimmableLight = false; // turn the light off + Matter.decommission(); + } + } +} diff --git a/libraries/Matter/examples/MatterDimmableLight/ci.json b/libraries/Matter/examples/MatterDimmableLight/ci.json new file mode 100644 index 00000000000..556a8a9ee6b --- /dev/null +++ b/libraries/Matter/examples/MatterDimmableLight/ci.json @@ -0,0 +1,7 @@ +{ + "fqbn_append": "PartitionScheme=huge_app", + "requires": [ + "CONFIG_SOC_WIFI_SUPPORTED=y", + "CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y" + ] +} diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp new file mode 100644 index 00000000000..71566972804 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -0,0 +1,158 @@ +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include +#include + +using namespace esp_matter; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +bool MatterDimmableLight::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 DimmableLight device has not begun."); + return false; + } + + log_d("Dimmable Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); + + if (endpoint_id == getEndPointId()) { + switch(cluster_id) { + case OnOff::Id: + if (attribute_id == OnOff::Attributes::OnOff::Id) { + if (_onChangeOnOffCB != NULL) { + ret = _onChangeOnOffCB(val->val.b); + log_d("DimmableLight On/Off State changed to %d", val->val.b); + if (ret == true) { + onOffState = val->val.b; + } + } + } + break; + case LevelControl::Id: + if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) { + if (_onChangeBrightnessCB != NULL) { + ret = _onChangeBrightnessCB(val->val.u8); + log_d("DimmableLight Brightness changed to %d", val->val.u8); + if (ret == true) { + brightnessLevel = val->val.u8; + } + } + } + break; + } + } + return ret; +} + +MatterDimmableLight::MatterDimmableLight() {} + +MatterDimmableLight::~MatterDimmableLight() { + end(); +} + +bool MatterDimmableLight::begin(bool initialState, uint8_t brightness) { + ArduinoMatter::_init(); + dimmable_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; + brightnessLevel = brightness; + + // endpoint handles can be used to add/modify clusters. + endpoint_t *endpoint = dimmable_light::create(node::get(), &light_config, ENDPOINT_FLAG_NONE, (void *)this); + if (endpoint == nullptr) { + log_e("Failed to create dimmable light endpoint"); + return false; + } + + setEndPointId(endpoint::get_id(endpoint)); + log_i("Dimmable Light created with endpoint_id %d", getEndPointId()); + started = true; + return true; +} + +void MatterDimmableLight::end() { + started = false; +} + +bool MatterDimmableLight::setOnOff(bool newState) { + if (!started) { + log_e("Matter Dimmable Light 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; +} + +bool MatterDimmableLight::getOnOff() { + return onOffState; +} + +bool MatterDimmableLight::toggle() { + return setOnOff(!onOffState); +} + +bool MatterDimmableLight::setBrightness(uint8_t newBrightness) { + if (!started) { + log_w("Matter Dimmable Light 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 MatterDimmableLight::getBrightness() { + return brightnessLevel; +} + +MatterDimmableLight::operator bool() { + return getOnOff(); +} + +void MatterDimmableLight::operator=(bool newState) { + setOnOff(newState); +} +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h new file mode 100644 index 00000000000..f43abe09e04 --- /dev/null +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -0,0 +1,48 @@ +#pragma once +#include +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + +#include +#include + +class MatterDimmableLight : public MatterEndPoint { +public: + static const uint8_t MAX_BRIGHTNESS = 255; + + MatterDimmableLight(); + ~MatterDimmableLight(); + // default initial state is off and brightness is 0 + virtual bool begin(bool initialState = false, uint8_t brightness = 0); + // 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 setBrightness(uint8_t newBrightness); // returns true if successful + uint8_t getBrightness(); // returns current brightness + + 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; + 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; + void onChangeBrightness(EndPointBrightnessCB onChangeCB) { + _onChangeBrightnessCB = 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) + EndPointOnOffCB _onChangeOnOffCB = NULL; + EndPointBrightnessCB _onChangeBrightnessCB = NULL; +}; +#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index f125d52c370..04ba219f3f9 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -12,9 +12,11 @@ using namespace chip::app::Clusters; bool MatterOnOffLight::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_w("Matter On-Off Light device has not begun."); + log_e("Matter On-Off Light device has not begun."); return false; } + + log_d("OnOff Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); if (endpoint_id == getEndPointId()) { if (cluster_id == OnOff::Id) { @@ -41,9 +43,10 @@ MatterOnOffLight::~MatterOnOffLight() { bool MatterOnOffLight::begin(bool initialState) { ArduinoMatter::_init(); on_off_light::config_t light_config; + light_config.on_off.on_off = initialState; - state = initialState; light_config.on_off.lighting.start_up_on_off = nullptr; + state = initialState; // endpoint handles can be used to add/modify clusters. endpoint_t *endpoint = on_off_light::create(node::get(), &light_config, ENDPOINT_FLAG_NONE, (void *)this); @@ -64,7 +67,7 @@ void MatterOnOffLight::end() { bool MatterOnOffLight::setOnOff(bool newState) { if (!started) { - log_w("Matter On-Off Light device has not begun."); + log_e("Matter On-Off Light device has not begun."); return false; } From a58b5509733f401812ad700dc0407d26a355814e Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 29 Oct 2024 18:47:44 -0300 Subject: [PATCH 03/17] feat(matter): dimmable friend class and adjusts log levels --- libraries/Matter/src/Matter.cpp | 13 +++++++------ libraries/Matter/src/Matter.h | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index 49504babac0..8128caa80c6 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -27,25 +27,26 @@ esp_err_t matter_light_attribute_update( static esp_err_t app_attribute_update_cb( attribute::callback_type_t type, uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val, void *priv_data ) { + log_d("Attribute update callback: type: %u, endpoint: %u, cluster: %u, attribute: %u, val: %u", type, endpoint_id, cluster_id, attribute_id, val->val.u32); esp_err_t err = ESP_OK; MatterEndPoint *ep = (MatterEndPoint *)priv_data; // endpoint pointer to base class switch (type) { case PRE_UPDATE: // Callback before updating the value in the database - log_i("Attribute update callback: PRE_UPDATE"); + log_v("Attribute update callback: PRE_UPDATE"); if (ep != NULL) { err = ep->attributeChangeCB(endpoint_id, cluster_id, attribute_id, val) ? ESP_OK : ESP_FAIL; } break; case POST_UPDATE: // Callback after updating the value in the database - log_i("Attribute update callback: POST_UPDATE"); + log_v("Attribute update callback: POST_UPDATE"); break; case READ: // Callback for reading the attribute value. This is used when the `ATTRIBUTE_FLAG_OVERRIDE` is set. - log_i("Attribute update callback: READ"); + log_v("Attribute update callback: READ"); break; case WRITE: // Callback for writing the attribute value. This is used when the `ATTRIBUTE_FLAG_OVERRIDE` is set. - log_i("Attribute update callback: WRITE"); + log_v("Attribute update callback: WRITE"); break; - default: log_i("Attribute update callback: Unknown type %d", type); + default: log_v("Attribute update callback: Unknown type %d", type); } return err; } @@ -114,7 +115,7 @@ void ArduinoMatter::_init() { void ArduinoMatter::begin() { if (!_matter_has_started) { - log_w("No Matter endpoint has been created. Please create an endpoint first."); + log_e("No Matter endpoint has been created. Please create an endpoint first."); return; } diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index a1ce0f2f644..9073ef1b4e4 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -30,6 +30,7 @@ class ArduinoMatter { // list of Matter EndPoints Friend Classes friend class MatterOnOffLight; + friend class MatterDimmableLight; protected: static void _init(); From 7921e8c71f61840198bed2085f01e493ab4e2282 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 29 Oct 2024 19:01:19 -0300 Subject: [PATCH 04/17] feat(matter): adds new folder and source code to cmakelists.txt --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 591b0b31568..9b72f50094e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,7 +169,8 @@ set(ARDUINO_LIBRARY_OpenThread_SRCS libraries/OpenThread/src/OThreadCLI_Util.cpp) set(ARDUINO_LIBRARY_Matter_SRCS - libraries/Matter/src/MatterOnOffLight.cpp +libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS From 848f4337021ff3a996cb88ef1cacb37255cd8dcb Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 30 Oct 2024 12:25:17 -0300 Subject: [PATCH 05/17] fix(matter): identation in cmakelists.txt --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b72f50094e..1fd6274f9bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,8 +169,8 @@ set(ARDUINO_LIBRARY_OpenThread_SRCS libraries/OpenThread/src/OThreadCLI_Util.cpp) set(ARDUINO_LIBRARY_Matter_SRCS -libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp -libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp + libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp + libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp libraries/Matter/src/Matter.cpp) set(ARDUINO_LIBRARY_PPP_SRCS From 025e01cc184e05f46f086ac4849df836a7b695e9 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Wed, 30 Oct 2024 15:13:24 -0300 Subject: [PATCH 06/17] feat(matter): adds license disclaimer to all source code --- .../MatterCommissionTest/MatterCommissionTest.ino | 14 ++++++++++++++ .../MatterComposedLights/MatterComposedLights.ino | 14 ++++++++++++++ .../MatterDimmableLight/MatterDimmableLight.ino | 14 ++++++++++++++ .../examples/MatterOnOffLight/MatterOnOffLight.ino | 14 ++++++++++++++ libraries/Matter/src/Matter.cpp | 14 ++++++++++++++ libraries/Matter/src/Matter.h | 14 ++++++++++++++ libraries/Matter/src/MatterEndPoint.h | 14 ++++++++++++++ .../src/MatterEndpoints/MatterDimmableLight.cpp | 14 ++++++++++++++ .../src/MatterEndpoints/MatterDimmableLight.h | 14 ++++++++++++++ .../src/MatterEndpoints/MatterOnOffLight.cpp | 14 ++++++++++++++ .../Matter/src/MatterEndpoints/MatterOnOffLight.h | 14 ++++++++++++++ 11 files changed, 154 insertions(+) diff --git a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino index 94cd962cc4a..a17c2886395 100644 --- a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino +++ b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino @@ -1,3 +1,17 @@ +// 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 #include diff --git a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino index 5f690746ba3..2a48745bf9a 100644 --- a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino +++ b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino @@ -1,3 +1,17 @@ +// 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 #include diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 16ff17a8572..372464d49b9 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -1,3 +1,17 @@ +// 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 #include diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index ad068a4a571..85255f78aa4 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -1,3 +1,17 @@ +// 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 #include diff --git a/libraries/Matter/src/Matter.cpp b/libraries/Matter/src/Matter.cpp index 8128caa80c6..857438cce03 100644 --- a/libraries/Matter/src/Matter.cpp +++ b/libraries/Matter/src/Matter.cpp @@ -1,3 +1,17 @@ +// 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 #ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL diff --git a/libraries/Matter/src/Matter.h b/libraries/Matter/src/Matter.h index 9073ef1b4e4..40a055fb489 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -1,3 +1,17 @@ +// 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 #ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 2be5bf5bb5d..3c5e033bbb3 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -1,3 +1,17 @@ +// 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 #ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index 71566972804..f75b460f1b9 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -1,3 +1,17 @@ +// 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 #ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h index f43abe09e04..4f5867b731f 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -1,3 +1,17 @@ +// 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 #ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index 04ba219f3f9..9c527f641e6 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -1,3 +1,17 @@ +// 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 #ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h index 39220652e21..c804b0f1335 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h @@ -1,3 +1,17 @@ +// 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 #ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL From afbcfe6087bcb71b2e97376f51aecf334ecd6dbc Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Thu, 31 Oct 2024 10:20:27 -0300 Subject: [PATCH 07/17] feat(matter): example code simplification --- .../MatterDimmableLight.ino | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 372464d49b9..db89e16f359 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -41,33 +41,28 @@ 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 Dimmable Light -void setRGBLight(bool state, uint8_t brightness) { +bool setRGBLight(bool state, uint8_t brightness) { Serial.printf("Setting Light to State: %s and Brightness: %d\r\n", DimmableLight ? "ON" : "OFF", brightness); if (state) { rgbLedWrite(ledPin, brightness, brightness, brightness); } else { digitalWrite(ledPin, LOW); } + // store last Brightness and OnOff state for when the Light is restarted / power goes off + lastStatePref.putUChar("lastBrightness", brightness); + lastStatePref.putBool("lastOnOffState", state); + // This callback must return the success state to Matter core + return true; } // Matter Protocol Endpoint On-Off Change Callback bool setLightOnOff(bool state) { - Serial.printf("User Callback :: New Light State = %s\r\n", state ? "ON" : "OFF"); - setRGBLight(state, DimmableLight.getBrightness()); - // store last OnOff state for when the Light is restarted / power goes off - lastStatePref.putBool("lastOnOffState", state); - // This callback must return the success state to Matter core - return true; + return setRGBLight(state, DimmableLight.getBrightness()); } // Matter Protocol Endpoint Brightness Change Callback bool setLightBrightness(uint8_t brightness) { - Serial.printf("User Callback :: New Light Brigthness = %.2f%% [Val = %d]\r\n", ((float) brightness * 100) / MatterDimmableLight::MAX_BRIGHTNESS, brightness); - setRGBLight(DimmableLight.getOnOff(), brightness); - // store last Brightness for when the Light is restarted / power goes off - lastStatePref.putUChar("lastBrightness", brightness); - // This callback must return the success state to Matter core - return true; + return setRGBLight(DimmableLight.getOnOff(), brightness); } void setup() { From 72851eb1272913bab272e4e8100d12071197548d Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Thu, 31 Oct 2024 10:28:42 -0300 Subject: [PATCH 08/17] feat(matter): make it work with rgb and analog led --- .../examples/MatterDimmableLight/MatterDimmableLight.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index db89e16f359..394809a885b 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -44,7 +44,11 @@ const char *password = "your-password"; // Change this to your WiFi password bool setRGBLight(bool state, uint8_t brightness) { Serial.printf("Setting Light to State: %s and Brightness: %d\r\n", DimmableLight ? "ON" : "OFF", brightness); if (state) { +#ifdef RGB_BUILTIN rgbLedWrite(ledPin, brightness, brightness, brightness); +#else + analogWrite(ledPin, brightness); +#endif } else { digitalWrite(ledPin, LOW); } From fb3a5ea63c422b970b20bb9a17cb7c46e0b9a4b8 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Thu, 31 Oct 2024 13:52:19 -0300 Subject: [PATCH 09/17] feat(matter): single user callback based on lambda function --- .../MatterDimmableLight.ino | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 394809a885b..98370217aaa 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -41,8 +41,8 @@ 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 Dimmable Light -bool setRGBLight(bool state, uint8_t brightness) { - Serial.printf("Setting Light to State: %s and Brightness: %d\r\n", DimmableLight ? "ON" : "OFF", brightness); +bool setLightState(bool state, uint8_t brightness) { + Serial.printf("Changing Light: old[%s,%d]->new[%s,%d]\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness(), state ? "ON" : "OFF", brightness); if (state) { #ifdef RGB_BUILTIN rgbLedWrite(ledPin, brightness, brightness, brightness); @@ -59,16 +59,6 @@ bool setRGBLight(bool state, uint8_t brightness) { return true; } -// Matter Protocol Endpoint On-Off Change Callback -bool setLightOnOff(bool state) { - return setRGBLight(state, DimmableLight.getBrightness()); -} - -// Matter Protocol Endpoint Brightness Change Callback -bool setLightBrightness(uint8_t brightness) { - return setRGBLight(DimmableLight.getOnOff(), brightness); -} - void setup() { // Initialize the USER BUTTON (Boot button) GPIO that will act as a toggle switch pinMode(buttonPin, INPUT_PULLUP); @@ -102,8 +92,14 @@ void setup() { bool lastOnOffState = lastStatePref.getBool("lastOnOffState", true); uint8_t lastBrightness = lastStatePref.getUChar("lastBrightness", 15); // default brightness = 12% DimmableLight.begin(lastOnOffState, lastBrightness); - DimmableLight.onChangeOnOff(setLightOnOff); - DimmableLight.onChangeBrightness(setLightBrightness); + + // lambda functions are used to set the attribute change callbacks + DimmableLight.onChangeOnOff([](bool state) { + return setLightState(state, DimmableLight.getBrightness()); + }); + DimmableLight.onChangeBrightness([](uint8_t level) { + return setLightState(DimmableLight.getOnOff(), level); + }); // Matter beginning - Last step, after all EndPoints are initialized Matter.begin(); @@ -111,8 +107,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 | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); - setLightOnOff(DimmableLight.getOnOff()); // configure the Light based on initial state - setLightBrightness(DimmableLight.getBrightness()); // configure the Light based on initial brightness + // configure the Light based on initial on-off state and brightness + setLightState(DimmableLight.getOnOff(), DimmableLight.getBrightness()); } } // Button control @@ -139,8 +135,8 @@ void loop() { } } Serial.printf("Initial state: %s | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); - setLightOnOff(DimmableLight.getOnOff()); // configure the Light based on initial state - setLightBrightness(DimmableLight.getBrightness()); // configure the Light based on initial brightness + // configure the Light based on initial on-off state and brightness + setLightState(DimmableLight.getOnOff(), DimmableLight.getBrightness()); Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); } From 193916d9542822d2adcdb851b6fd7e580fe08ca1 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 4 Nov 2024 12:45:22 -0300 Subject: [PATCH 10/17] feat(matter): commentaries and code improvement. update() and callbacks added. --- libraries/Matter/src/MatterEndPoint.h | 3 +- .../MatterEndpoints/MatterDimmableLight.cpp | 33 +++++++++++++------ .../src/MatterEndpoints/MatterDimmableLight.h | 11 +++++++ .../src/MatterEndpoints/MatterOnOffLight.cpp | 22 ++++++++----- .../src/MatterEndpoints/MatterOnOffLight.h | 8 +++-- 5 files changed, 55 insertions(+), 22 deletions(-) diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 3c5e033bbb3..0b2b74aa8eb 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -28,9 +28,8 @@ class MatterEndPoint { void setEndPointId(uint16_t ep) { endpoint_id = ep; } - + // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. virtual bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) = 0; - protected: uint16_t endpoint_id = 0; }; diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index f75b460f1b9..f30c01b078e 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -33,26 +33,33 @@ bool MatterDimmableLight::attributeChangeCB(uint16_t endpoint_id, uint32_t clust log_d("Dimmable Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); if (endpoint_id == getEndPointId()) { + bool ret = false; switch(cluster_id) { case OnOff::Id: if (attribute_id == OnOff::Attributes::OnOff::Id) { + log_d("DimmableLight On/Off State changed to %d", val->val.b); if (_onChangeOnOffCB != NULL) { - ret = _onChangeOnOffCB(val->val.b); - log_d("DimmableLight On/Off State changed to %d", val->val.b); - if (ret == true) { - onOffState = val->val.b; - } + ret |= _onChangeOnOffCB(val->val.b); + } + if (_onChangeCB != NULL) { + ret |= _onChangeCB(val->val.b, brightnessLevel); + } + if (ret == true) { + onOffState = val->val.b; } } break; case LevelControl::Id: if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) { + log_d("DimmableLight Brightness changed to %d", val->val.u8); if (_onChangeBrightnessCB != NULL) { - ret = _onChangeBrightnessCB(val->val.u8); - log_d("DimmableLight Brightness changed to %d", val->val.u8); - if (ret == true) { - brightnessLevel = val->val.u8; - } + ret |= _onChangeBrightnessCB(val->val.u8); + } + if (_onChangeCB != NULL) { + ret |= _onChangeCB(onOffState, val->val.u8); + } + if (ret == true) { + brightnessLevel = val->val.u8; } } break; @@ -123,6 +130,12 @@ bool MatterDimmableLight::setOnOff(bool newState) { return true; } +void MatterDimmableLight::updateAccessory() { + if (_onChangeCB != NULL) { + _onChangeCB(onOffState, brightnessLevel); + } +} + bool MatterDimmableLight::getOnOff() { return onOffState; } diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h index 4f5867b731f..fbfccde6105 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.h @@ -37,6 +37,10 @@ class MatterDimmableLight : public MatterEndPoint { bool setBrightness(uint8_t newBrightness); // returns true if successful uint8_t getBrightness(); // returns current brightness + // 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. @@ -52,11 +56,18 @@ class MatterDimmableLight : public MatterEndPoint { _onChangeBrightnessCB = onChangeCB; } + // User Callback for whenever any parameter is changed by the Matter Controller + using EndPointCB = std::function; + 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) EndPointOnOffCB _onChangeOnOffCB = NULL; EndPointBrightnessCB _onChangeBrightnessCB = NULL; + EndPointCB _onChangeCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index 9c527f641e6..e25fa5f8072 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -39,7 +39,7 @@ bool MatterOnOffLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_ ret = _onChangeCB(val->val.b); log_d("OnOffLight state changed to %d", val->val.b); if (ret == true) { - state = val->val.b; + onOffState = val->val.b; } } } @@ -60,7 +60,7 @@ bool MatterOnOffLight::begin(bool initialState) { light_config.on_off.on_off = initialState; light_config.on_off.lighting.start_up_on_off = nullptr; - state = initialState; + onOffState = initialState; // endpoint handles can be used to add/modify clusters. endpoint_t *endpoint = on_off_light::create(node::get(), &light_config, ENDPOINT_FLAG_NONE, (void *)this); @@ -79,6 +79,12 @@ void MatterOnOffLight::end() { started = false; } +void MatterOnOffLight::updateAccessory() { + if (_onChangeCB != NULL) { + _onChangeCB(onOffState); + } +} + bool MatterOnOffLight::setOnOff(bool newState) { if (!started) { log_e("Matter On-Off Light device has not begun."); @@ -86,11 +92,11 @@ bool MatterOnOffLight::setOnOff(bool newState) { } // avoid processing the a "no-change" - if (state == newState) { + if (onOffState == newState) { return true; } - state = newState; + onOffState = newState; endpoint_t *endpoint = endpoint::get(node::get(), endpoint_id); cluster_t *cluster = cluster::get(endpoint, OnOff::Id); @@ -99,19 +105,19 @@ bool MatterOnOffLight::setOnOff(bool newState) { esp_matter_attr_val_t val = esp_matter_invalid(NULL); attribute::get_val(attribute, &val); - if (val.val.b != state) { - val.val.b = state; + if (val.val.b != onOffState) { + val.val.b = onOffState; attribute::update(endpoint_id, OnOff::Id, OnOff::Attributes::OnOff::Id, &val); } return true; } bool MatterOnOffLight::getOnOff() { - return state; + return onOffState; } bool MatterOnOffLight::toggle() { - return setOnOff(!state); + return setOnOff(!onOffState); } MatterOnOffLight::operator bool() { diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h index c804b0f1335..eb3e8a48bb5 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h @@ -30,19 +30,23 @@ class MatterOnOffLight : public MatterEndPoint { bool getOnOff(); // returns current light state bool toggle(); // returns true if successful + // 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 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 state is changed by the Matter Controller using EndPointCB = std::function; - void onChangeOnOff(EndPointCB onChangeCB) { + void onChange(EndPointCB onChangeCB) { _onChangeCB = onChangeCB; } protected: bool started = false; - bool state = false; // default initial state is off, but it can be changed by begin(bool) + bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) EndPointCB _onChangeCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From b08e951322a026e8002249e049b0a3604def623c Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 4 Nov 2024 12:46:15 -0300 Subject: [PATCH 11/17] feat(matter): adde new keywords to arduino settings --- libraries/Matter/keywords.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/Matter/keywords.txt b/libraries/Matter/keywords.txt index 7ff3e90f3b4..98abce410b1 100644 --- a/libraries/Matter/keywords.txt +++ b/libraries/Matter/keywords.txt @@ -7,7 +7,9 @@ ####################################### Matter KEYWORD1 +ArduinoMatter KEYWORD1 MatterOnOffLight KEYWORD1 +MatterDimmableLight KEYWORD1 MatterEndPoint KEYWORD1 ####################################### @@ -16,7 +18,6 @@ MatterEndPoint KEYWORD1 begin KEYWORD2 end KEYWORD2 -start KEYWORD2 getManualPairingCode KEYWORD2 getOnboardingQRCodeUrl KEYWORD2 isDeviceCommissioned KEYWORD2 @@ -27,8 +28,13 @@ decommission KEYWORD2 attributeChangeCB KEYWORD2 setOnOff KEYWORD2 getOnOff KEYWORD2 +setBrightness KEYWORD2 +getBrightness KEYWORD2 toggle KEYWORD2 +updateAccessory KEYWORD2 +onChange KEYWORD2 onChangeOnOff KEYWORD2 +onChangeBrightness KEYWORD2 ####################################### # Constants (LITERAL1) From 0a99d692860b8d85c809563c581b12c896393331 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 4 Nov 2024 12:47:21 -0300 Subject: [PATCH 12/17] feat(matter): example code adjustment to use improved api --- .../MatterComposedLights/MatterComposedLights.ino | 6 +++--- .../MatterDimmableLight/MatterDimmableLight.ino | 13 ++++++++----- .../examples/MatterOnOffLight/MatterOnOffLight.ino | 6 +++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino index 2a48745bf9a..91b4d26bcb1 100644 --- a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino +++ b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino @@ -70,9 +70,9 @@ void setup() { OnOffLight1.begin(); OnOffLight2.begin(); OnOffLight3.begin(); - OnOffLight1.onChangeOnOff(setLightOnOff1); - OnOffLight2.onChangeOnOff(setLightOnOff2); - OnOffLight3.onChangeOnOff(setLightOnOff3); + OnOffLight1.onChange(setLightOnOff1); + OnOffLight2.onChange(setLightOnOff2); + OnOffLight3.onChange(setLightOnOff3); // Matter beginning - Last step, after all EndPoints are initialized Matter.begin(); diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 98370217aaa..4803a565607 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -42,7 +42,6 @@ const char *password = "your-password"; // Change this to your WiFi password // Set the RGB LED Light based on the current state of the Dimmable Light bool setLightState(bool state, uint8_t brightness) { - Serial.printf("Changing Light: old[%s,%d]->new[%s,%d]\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness(), state ? "ON" : "OFF", brightness); if (state) { #ifdef RGB_BUILTIN rgbLedWrite(ledPin, brightness, brightness, brightness); @@ -92,13 +91,17 @@ void setup() { bool lastOnOffState = lastStatePref.getBool("lastOnOffState", true); uint8_t lastBrightness = lastStatePref.getUChar("lastBrightness", 15); // default brightness = 12% DimmableLight.begin(lastOnOffState, lastBrightness); + // set the callback function to handle the Light state change + DimmableLight.onChange(setLightState); // lambda functions are used to set the attribute change callbacks DimmableLight.onChangeOnOff([](bool state) { - return setLightState(state, DimmableLight.getBrightness()); + Serial.printf("Light OnOff changed to %s\r\n", state ? "ON" : "OFF"); + return true; }); DimmableLight.onChangeBrightness([](uint8_t level) { - return setLightState(DimmableLight.getOnOff(), level); + Serial.printf("Light Brightness changed to %d\r\n", level); + return true; }); // Matter beginning - Last step, after all EndPoints are initialized @@ -108,7 +111,7 @@ void setup() { Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); Serial.printf("Initial state: %s | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); // configure the Light based on initial on-off state and brightness - setLightState(DimmableLight.getOnOff(), DimmableLight.getBrightness()); + DimmableLight.updateAccessory(); } } // Button control @@ -136,7 +139,7 @@ void loop() { } Serial.printf("Initial state: %s | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); // configure the Light based on initial on-off state and brightness - setLightState(DimmableLight.getOnOff(), DimmableLight.getBrightness()); + DimmableLight.updateAccessory(); Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); } diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index 85255f78aa4..20c8034e53e 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -86,7 +86,7 @@ void setup() { lastStatePref.begin("matterLight", false); bool lastOnOffState = lastStatePref.getBool("lastOnOffState", true); OnOffLight.begin(lastOnOffState); - OnOffLight.onChangeOnOff(setLightOnOff); + OnOffLight.onChange(setLightOnOff); // Matter beginning - Last step, after all EndPoints are initialized Matter.begin(); @@ -94,7 +94,7 @@ void setup() { if (Matter.isDeviceCommissioned()) { Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); Serial.printf("Initial state: %s\r\n", OnOffLight.getOnOff() ? "ON" : "OFF"); - setLightOnOff(OnOffLight.getOnOff()); // configure the Light based on initial state + OnOffLight.updateAccessory(); // configure the Light based on initial state } } // Button control @@ -121,7 +121,7 @@ void loop() { } } Serial.printf("Initial state: %s\r\n", OnOffLight.getOnOff() ? "ON" : "OFF"); - setLightOnOff(OnOffLight.getOnOff()); // configure the Light based on initial state + OnOffLight.updateAccessory(); // configure the Light based on initial state Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); } From 46d35f5f2f28d6b11f039bcc2cc3e9f73c482684 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Mon, 4 Nov 2024 16:21:58 -0300 Subject: [PATCH 13/17] fix(matter): it shuold work even when no callback is set --- .../src/MatterEndpoints/MatterDimmableLight.cpp | 10 +++++----- .../src/MatterEndpoints/MatterOnOffLight.cpp | 14 +++++++++----- .../Matter/src/MatterEndpoints/MatterOnOffLight.h | 4 ++++ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index f30c01b078e..3fde5de00d1 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -33,16 +33,16 @@ bool MatterDimmableLight::attributeChangeCB(uint16_t endpoint_id, uint32_t clust log_d("Dimmable Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); if (endpoint_id == getEndPointId()) { - bool ret = false; + bool ret = true; switch(cluster_id) { case OnOff::Id: if (attribute_id == OnOff::Attributes::OnOff::Id) { log_d("DimmableLight On/Off State changed to %d", val->val.b); if (_onChangeOnOffCB != NULL) { - ret |= _onChangeOnOffCB(val->val.b); + ret &= _onChangeOnOffCB(val->val.b); } if (_onChangeCB != NULL) { - ret |= _onChangeCB(val->val.b, brightnessLevel); + ret &= _onChangeCB(val->val.b, brightnessLevel); } if (ret == true) { onOffState = val->val.b; @@ -53,10 +53,10 @@ bool MatterDimmableLight::attributeChangeCB(uint16_t endpoint_id, uint32_t clust if (attribute_id == LevelControl::Attributes::CurrentLevel::Id) { log_d("DimmableLight Brightness changed to %d", val->val.u8); if (_onChangeBrightnessCB != NULL) { - ret |= _onChangeBrightnessCB(val->val.u8); + ret &= _onChangeBrightnessCB(val->val.u8); } if (_onChangeCB != NULL) { - ret |= _onChangeCB(onOffState, val->val.u8); + ret &= _onChangeCB(onOffState, val->val.u8); } if (ret == true) { brightnessLevel = val->val.u8; diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index e25fa5f8072..6607d21d82e 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -33,14 +33,18 @@ bool MatterOnOffLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_ log_d("OnOff Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); if (endpoint_id == getEndPointId()) { + log_d("OnOffLight state changed to %d", val->val.b); + bool ret = true; if (cluster_id == OnOff::Id) { if (attribute_id == OnOff::Attributes::OnOff::Id) { + if (_onChangeOnOffCB != NULL) { + ret &= _onChangeOnOffCB(val->val.b); + } if (_onChangeCB != NULL) { - ret = _onChangeCB(val->val.b); - log_d("OnOffLight state changed to %d", val->val.b); - if (ret == true) { - onOffState = val->val.b; - } + ret &= _onChangeCB(val->val.b); + } + if (ret == true) { + onOffState = val->val.b; } } } diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h index eb3e8a48bb5..6d140a9948e 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.h @@ -43,10 +43,14 @@ class MatterOnOffLight : public MatterEndPoint { void onChange(EndPointCB onChangeCB) { _onChangeCB = onChangeCB; } + void onChangeOnOff(EndPointCB onChangeCB) { + _onChangeOnOffCB = onChangeCB; + } protected: bool started = false; bool onOffState = false; // default initial state is off, but it can be changed by begin(bool) EndPointCB _onChangeCB = NULL; + EndPointCB _onChangeOnOffCB = NULL; }; #endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */ From b740654081c29108f12e48576ced136cf5355b15 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 5 Nov 2024 12:24:42 -0300 Subject: [PATCH 14/17] feat(matter): matter.h includes all possible endpoint header files --- 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 40a055fb489..f88b7788016 100644 --- a/libraries/Matter/src/Matter.h +++ b/libraries/Matter/src/Matter.h @@ -18,6 +18,8 @@ #include #include +#include +#include using namespace esp_matter; From 8a66c9a1908871169498f8472497eb425006f659 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 5 Nov 2024 12:25:57 -0300 Subject: [PATCH 15/17] feat(matter): adjusts all examples to only include matter.h --- .../examples/MatterCommissionTest/MatterCommissionTest.ino | 1 - .../examples/MatterComposedLights/MatterComposedLights.ino | 1 - .../examples/MatterDimmableLight/MatterDimmableLight.ino | 5 +++-- .../Matter/examples/MatterOnOffLight/MatterOnOffLight.ino | 1 - 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino index a17c2886395..9024479c881 100644 --- a/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino +++ b/libraries/Matter/examples/MatterCommissionTest/MatterCommissionTest.ino @@ -18,7 +18,6 @@ // List of Matter Endpoints for this Node // On/Off Light Endpoint -#include MatterOnOffLight OnOffLight; // WiFi is manually set and started diff --git a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino index 91b4d26bcb1..85fcd9e8973 100644 --- a/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino +++ b/libraries/Matter/examples/MatterComposedLights/MatterComposedLights.ino @@ -18,7 +18,6 @@ // List of Matter Endpoints for this Node // There will be 3 On/Off Light Endpoints in the same Node -#include MatterOnOffLight OnOffLight1; MatterOnOffLight OnOffLight2; MatterOnOffLight OnOffLight3; diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 4803a565607..63d93dacbf7 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -19,7 +19,6 @@ // List of Matter Endpoints for this Node // Dimmable Light Endpoint -#include MatterDimmableLight DimmableLight; // it will keep last OnOff & Brightness state stored, using Preferences @@ -88,8 +87,10 @@ void setup() { // Initialize Matter EndPoint lastStatePref.begin("matterLight", false); + // default OnOff state is ON if not stored before bool lastOnOffState = lastStatePref.getBool("lastOnOffState", true); - uint8_t lastBrightness = lastStatePref.getUChar("lastBrightness", 15); // default brightness = 12% + // default brightness ~= 6% (15/255) + uint8_t lastBrightness = lastStatePref.getUChar("lastBrightness", 15); DimmableLight.begin(lastOnOffState, lastBrightness); // set the callback function to handle the Light state change DimmableLight.onChange(setLightState); diff --git a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino index 20c8034e53e..675e9e989f2 100644 --- a/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino +++ b/libraries/Matter/examples/MatterOnOffLight/MatterOnOffLight.ino @@ -19,7 +19,6 @@ // List of Matter Endpoints for this Node // On/Off Light Endpoint -#include MatterOnOffLight OnOffLight; // it will keep last OnOff state stored, using Preferences From 0d6ec1be178b5653d06aed65b4a9f15a48e21393 Mon Sep 17 00:00:00 2001 From: Rodrigo Garcia Date: Tue, 5 Nov 2024 12:33:18 -0300 Subject: [PATCH 16/17] fix(matter): double declaration of ret - var scope issue --- libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp | 1 - libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index 3fde5de00d1..9dd81cf8009 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -33,7 +33,6 @@ bool MatterDimmableLight::attributeChangeCB(uint16_t endpoint_id, uint32_t clust log_d("Dimmable Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); if (endpoint_id == getEndPointId()) { - bool ret = true; switch(cluster_id) { case OnOff::Id: if (attribute_id == OnOff::Attributes::OnOff::Id) { diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index 6607d21d82e..a61c179ce69 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -34,7 +34,6 @@ bool MatterOnOffLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_ if (endpoint_id == getEndPointId()) { log_d("OnOffLight state changed to %d", val->val.b); - bool ret = true; if (cluster_id == OnOff::Id) { if (attribute_id == OnOff::Attributes::OnOff::Id) { if (_onChangeOnOffCB != NULL) { From 6e87b0d56474aa1aafcef8e16b6b7a9cd0aaac1e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 15:44:26 +0000 Subject: [PATCH 17/17] ci(pre-commit): Apply automatic fixes --- .../MatterDimmableLight/MatterDimmableLight.ino | 10 +++++----- libraries/Matter/src/MatterEndPoint.h | 1 + .../Matter/src/MatterEndpoints/MatterDimmableLight.cpp | 4 ++-- .../Matter/src/MatterEndpoints/MatterOnOffLight.cpp | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino index 63d93dacbf7..ded0118b7d1 100644 --- a/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino +++ b/libraries/Matter/examples/MatterDimmableLight/MatterDimmableLight.ino @@ -96,11 +96,11 @@ void setup() { DimmableLight.onChange(setLightState); // lambda functions are used to set the attribute change callbacks - DimmableLight.onChangeOnOff([](bool state) { - Serial.printf("Light OnOff changed to %s\r\n", state ? "ON" : "OFF"); + DimmableLight.onChangeOnOff([](bool state) { + Serial.printf("Light OnOff changed to %s\r\n", state ? "ON" : "OFF"); return true; }); - DimmableLight.onChangeBrightness([](uint8_t level) { + DimmableLight.onChangeBrightness([](uint8_t level) { Serial.printf("Light Brightness changed to %d\r\n", level); return true; }); @@ -111,7 +111,7 @@ void setup() { if (Matter.isDeviceCommissioned()) { Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); Serial.printf("Initial state: %s | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); - // configure the Light based on initial on-off state and brightness + // configure the Light based on initial on-off state and brightness DimmableLight.updateAccessory(); } } @@ -139,7 +139,7 @@ void loop() { } } Serial.printf("Initial state: %s | brightness: %d\r\n", DimmableLight ? "ON" : "OFF", DimmableLight.getBrightness()); - // configure the Light based on initial on-off state and brightness + // configure the Light based on initial on-off state and brightness DimmableLight.updateAccessory(); Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use."); } diff --git a/libraries/Matter/src/MatterEndPoint.h b/libraries/Matter/src/MatterEndPoint.h index 0b2b74aa8eb..02577957e8e 100644 --- a/libraries/Matter/src/MatterEndPoint.h +++ b/libraries/Matter/src/MatterEndPoint.h @@ -30,6 +30,7 @@ class MatterEndPoint { } // this function is called by Matter internal event processor. It could be overwritten by the application, if necessary. virtual bool attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_id, uint32_t attribute_id, esp_matter_attr_val_t *val) = 0; + protected: uint16_t endpoint_id = 0; }; diff --git a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp index 9dd81cf8009..7907ae3a90a 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterDimmableLight.cpp @@ -33,7 +33,7 @@ bool MatterDimmableLight::attributeChangeCB(uint16_t endpoint_id, uint32_t clust log_d("Dimmable Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); if (endpoint_id == getEndPointId()) { - switch(cluster_id) { + switch (cluster_id) { case OnOff::Id: if (attribute_id == OnOff::Attributes::OnOff::Id) { log_d("DimmableLight On/Off State changed to %d", val->val.b); @@ -61,7 +61,7 @@ bool MatterDimmableLight::attributeChangeCB(uint16_t endpoint_id, uint32_t clust brightnessLevel = val->val.u8; } } - break; + break; } } return ret; diff --git a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp index a61c179ce69..3f71ff1eb76 100644 --- a/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp +++ b/libraries/Matter/src/MatterEndpoints/MatterOnOffLight.cpp @@ -29,7 +29,7 @@ bool MatterOnOffLight::attributeChangeCB(uint16_t endpoint_id, uint32_t cluster_ log_e("Matter On-Off Light device has not begun."); return false; } - + log_d("OnOff Attr update callback: endpoint: %u, cluster: %u, attribute: %u, val: %u", endpoint_id, cluster_id, attribute_id, val->val.u32); if (endpoint_id == getEndPointId()) {