From 447e0b1c78b272b2f1c230ae027e7090d7c54c32 Mon Sep 17 00:00:00 2001 From: Rohit Jadhav Date: Fri, 20 Sep 2024 16:51:53 +0530 Subject: [PATCH] examples/generic_switch: Update generic switch wrt spec change Added momentary_switch, action_switch and momentary_switch_multi_press features and respective features. Removed fixed and user labels from example because these are removed from spec. Removed mfg_binary as it's not needed anymore. --- components/esp_matter/esp_matter_feature.cpp | 69 +++++++++--- components/esp_matter/esp_matter_feature.h | 9 +- examples/generic_switch/README.md | 56 +--------- examples/generic_switch/main/app_driver.cpp | 104 ++++++++++-------- examples/generic_switch/main/app_main.cpp | 28 +---- .../mfg_binaries/20202020_3841.bin | Bin 24576 -> 0 bytes .../matter_qrcode_20202020_3841.png | Bin 31865 -> 0 bytes examples/generic_switch/sdkconfig.defaults | 9 -- 8 files changed, 129 insertions(+), 146 deletions(-) delete mode 100644 examples/generic_switch/mfg_binaries/20202020_3841.bin delete mode 100644 examples/generic_switch/mfg_binaries/matter_qrcode_20202020_3841.png diff --git a/components/esp_matter/esp_matter_feature.cpp b/components/esp_matter/esp_matter_feature.cpp index 3ccae2b37..f456a077a 100644 --- a/components/esp_matter/esp_matter_feature.cpp +++ b/components/esp_matter/esp_matter_feature.cpp @@ -2580,9 +2580,7 @@ namespace latching_switch { uint32_t get_id() { - // The SwitchFeature enum class is not added in the upstream code. - // Return the code according to the SPEC - return (uint32_t)0x01; + return (uint32_t)Switch::Feature::kLatchingSwitch; } esp_err_t add(cluster_t *cluster) @@ -2590,6 +2588,7 @@ esp_err_t add(cluster_t *cluster) VerifyOrReturnError((get_feature_map_value(cluster) & feature::momentary_switch::get_id()) != feature::momentary_switch::get_id(), ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Latching switch is not supported because momentary switch is present")); update_feature_map(cluster, get_id()); + event::create_switch_latched(cluster); return ESP_OK; } @@ -2599,9 +2598,7 @@ namespace momentary_switch { uint32_t get_id() { - // The SwitchFeature enum class is not added in the upstream code. - // Return the code according to the SPEC - return (uint32_t)0x02; + return (uint32_t)Switch::Feature::kMomentarySwitch; } esp_err_t add(cluster_t *cluster) @@ -2609,6 +2606,7 @@ esp_err_t add(cluster_t *cluster) VerifyOrReturnError((get_feature_map_value(cluster) & feature::latching_switch::get_id()) != feature::latching_switch::get_id(), ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Momentary switch is not supported because latching switch is present")); update_feature_map(cluster, get_id()); + event::create_initial_press(cluster); return ESP_OK; } @@ -2618,16 +2616,19 @@ namespace momentary_switch_release { uint32_t get_id() { - // The SwitchFeature enum class is not added in the upstream code. - // Return the code according to the SPEC - return (uint32_t)0x04; + return (uint32_t)Switch::Feature::kMomentarySwitchRelease; } esp_err_t add(cluster_t *cluster) { VerifyOrReturnError((get_feature_map_value(cluster) & feature::momentary_switch::get_id()) == feature::momentary_switch::get_id(), ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Momentary switch release is not supported because momentary is absent")); + uint32_t as_feature_map = feature::action_switch::get_id(); + uint32_t ms_feature_map = feature::momentary_switch::get_id(); + uint32_t feature_map = get_feature_map_value(cluster); + VerifyOrReturnError(((feature_map & ms_feature_map) != ms_feature_map) || ((feature_map & as_feature_map) == as_feature_map), ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Momentary switch release is not supported.")); update_feature_map(cluster, get_id()); + event::create_short_release(cluster); return ESP_OK; } @@ -2637,17 +2638,23 @@ namespace momentary_switch_long_press { uint32_t get_id() { - // The SwitchFeature enum class is not added in the upstream code. - // Return the code according to the SPEC - return (uint32_t)0x08; + return (uint32_t)Switch::Feature::kMomentarySwitchLongPress; } esp_err_t add(cluster_t *cluster) { uint32_t momentary_and_momentart_switch_release_feature_map = feature::momentary_switch::get_id() | feature::momentary_switch_release::get_id(); VerifyOrReturnError((get_feature_map_value(cluster) & momentary_and_momentart_switch_release_feature_map) == momentary_and_momentart_switch_release_feature_map, ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Momentary switch long press is not supported because momentary switch and/or momentary switch release is absent")); + uint32_t msr_feature_map = feature::momentary_switch_release::get_id(); + uint32_t as_feature_map = feature::action_switch::get_id(); + uint32_t ms_feature_map = feature::momentary_switch::get_id(); + uint32_t feature_map = get_feature_map_value(cluster); + VerifyOrReturnError((feature_map & ms_feature_map) != ms_feature_map, ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Momentary switch long press is not supported.")); + VerifyOrReturnError(((feature_map & msr_feature_map) != msr_feature_map) && ((feature_map & as_feature_map) != as_feature_map), ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Momentary switch long press is not supported.")); update_feature_map(cluster, get_id()); + event::create_long_press(cluster); + event::create_long_release(cluster); return ESP_OK; } @@ -2657,23 +2664,55 @@ namespace momentary_switch_multi_press { uint32_t get_id() { - // The SwitchFeature enum class is not added in the upstream code. - // Return the code according to the SPEC - return (uint32_t)0x10; + return (uint32_t)Switch::Feature::kMomentarySwitchMultiPress; } esp_err_t add(cluster_t *cluster, config_t *config) { uint32_t momentary_and_momentart_switch_release_feature_map = feature::momentary_switch::get_id() | feature::momentary_switch_release::get_id(); VerifyOrReturnError((get_feature_map_value(cluster) & momentary_and_momentart_switch_release_feature_map) == momentary_and_momentart_switch_release_feature_map, ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Momentary switch multi press is not supported because momentary switch and/or momentary switch releaseis absent")); + uint32_t as_feature_map = feature::action_switch::get_id(); + VerifyOrReturnError((get_feature_map_value(cluster) & as_feature_map) != as_feature_map, ESP_ERR_NOT_SUPPORTED, ESP_LOGE(TAG, "Momentary switch multi press is not supported because action switch is absent")); + uint32_t ms_feature_map = feature::momentary_switch::get_id(); + uint32_t msr_feature_map = feature::momentary_switch_release::get_id(); + uint32_t ms_and_msr = ms_feature_map | msr_feature_map; + if ((get_feature_map_value(cluster) & as_feature_map) != as_feature_map) { + if ((get_feature_map_value(cluster) & ms_and_msr) != ms_and_msr) { + ESP_LOGE(TAG, "Momentary switch multi press is not supported."); + return ESP_ERR_NOT_SUPPORTED; + } + event::create_multi_press_ongoing(cluster); + } update_feature_map(cluster, get_id()); attribute::create_multi_press_max(cluster, config->multi_press_max); + event::create_multi_press_complete(cluster); return ESP_OK; } } /* momentary_switch_multi_press */ + +namespace action_switch { + +uint32_t get_id() +{ + return (uint32_t)Switch::Feature::kActionSwitch; +} + +esp_err_t add(cluster_t *cluster) +{ + if ((get_feature_map_value(cluster) & feature::momentary_switch::get_id()) != feature::momentary_switch::get_id()) { + ESP_LOGE(TAG, "Momentary switch is present"); + return ESP_ERR_NOT_SUPPORTED; + } + update_feature_map(cluster, get_id()); + + return ESP_OK; +} + +} /* action_switch */ + } /* feature */ } /* switch_cluster */ diff --git a/components/esp_matter/esp_matter_feature.h b/components/esp_matter/esp_matter_feature.h index 4772b7ad6..e390b7a75 100644 --- a/components/esp_matter/esp_matter_feature.h +++ b/components/esp_matter/esp_matter_feature.h @@ -1465,7 +1465,14 @@ typedef struct config { uint32_t get_id(); esp_err_t add(cluster_t *cluster, config_t *config); -} /* momentary_switch_multi_pressy */ +} /* momentary_switch_multi_press */ + +namespace action_switch { + +uint32_t get_id(); +esp_err_t add(cluster_t *cluster); + +} /* action_switch */ } /* feature */ } /* switch_cluster */ diff --git a/examples/generic_switch/README.md b/examples/generic_switch/README.md index 479e57bc2..760f99c12 100644 --- a/examples/generic_switch/README.md +++ b/examples/generic_switch/README.md @@ -3,16 +3,10 @@ This example creates a Generic Switch device using the ESP Matter data model. This example demonstrates the use of few optional data model elements like : -- Fixed Label Cluster : provides a feature for the device to tag an endpoint with zero or more read only labels (demonstrated through nvs). -- User Label Cluster : This cluster provides a feature to tag an endpoint with zero or more labels. - Taglist Feature of Descriptor Cluster : used to disambiguate sibling endpoints where two or more sibling endpoints have an overlap in the supported device types with each such endpoint having a unique TagList. -Note: - In order to retrieve the label-list from the fixed-label cluster the two options: - ``CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER`` and ``CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER`` have been set through sdkconfig.defaults. - See the [docs](https://docs.espressif.com/projects/esp-matter/en/latest/esp32/developing.html) for more information about building and flashing the firmware. ## 1. Additional Environment Setup @@ -31,51 +25,13 @@ through menuconfig: Follow the steps mentioned [here](https://docs.espressif.com/projects/esp-matter/en/latest/esp32/insights.html) -### 1.3 Flash the factory partition - -The steps below should be followed in order to access the fixed-labels. -- If monitoring the device using ``idf.py monitor``,press `` Ctrl + ]`` to stop the process. -- The following command must be executed to flash the mfg partition: - -``` -esptool.py -p [port-name] write_flash 0x10000 mfg_binaries/20202020_3841.bin -``` - -- Execute the command ``idf.py monitor`` - ## 2.Commissioning and Control -- Commission the device with ``discriminator: 3841``and `` passcode: 20202020`` +- Commission the device with ``discriminator: 3840``and `` passcode: 20202021`` ``` - chip-tool pairing ble-wifi 0x7283 [ssid] [password] 20202020 3841 - ``` - -- Alternatively, below QR Code or Manual pairing code can be used for commissioning - - Manualcode : 34970012334 - - QRCode : - - ![QRCode](mfg_binaries/matter_qrcode_20202020_3841.png) - -### 2.1 Fixed-Labels -- To read the fixed-labels, use chip-tool. - + chip-tool pairing ble-wifi 0x7283 [ssid] [password] 20202021 3840 ``` - chip-tool fixedlabel read label-list 0x7283 1 - ``` - -### 2.2 User-Labels -- The example command given below should be executed to write to the label-list of User Label Cluster. - -``` -chip-tool userlabel write label-list '[{"label":"room", "value":"bedroom 1"}, {"label":"orientation", "value":"east"}]' 0x7283 1 -``` - -- To read label-list of User Label Cluster execute the command given below. - -``` -chip-tool userlabel read label-list 0x7283 1 -``` - -### 2.3 Using the TagList Feature +### 2.1 Using the TagList Feature To read the taglist of the Descriptor cluster execute the command given below. @@ -83,7 +39,7 @@ To read the taglist of the Descriptor cluster execute the command given below. chip-tool descriptor read tag-list 0x7283 1 ``` -## 2. Post Commissioning Setup +## 3. Post Commissioning Setup This should be followed by: Commission the generic switch device - Turn on chip-tool interactive mode. ``./chip-tool interactive start`` @@ -91,13 +47,13 @@ This should be followed by: Commission the generic switch device ``switch subscribe-event long-press `` - `Double press the boot button` on device so that client will receive event after max-interval. -### 2.1 Latching switch +### 3.1 Latching switch Following are latching switch events mapped with boot button on device. - `Double Press` -----------> `switch-latched` -### 2.2 Momentary switch +### 3.2 Momentary switch Following are momentary switch events mapped with boot button on device. diff --git a/examples/generic_switch/main/app_driver.cpp b/examples/generic_switch/main/app_driver.cpp index 803d5cabf..5be7f458d 100644 --- a/examples/generic_switch/main/app_driver.cpp +++ b/examples/generic_switch/main/app_driver.cpp @@ -36,13 +36,15 @@ esp_err_t app_driver_attribute_update(app_driver_handle_t driver_handle, uint16_ } #if CONFIG_GENERIC_SWITCH_TYPE_LATCHING +static uint8_t latching_switch_previous_position = 0; static void app_driver_button_switch_latched(void *arg, void *data) { ESP_LOGI(TAG, "Switch lached pressed"); gpio_button * button = (gpio_button*)data; int switch_endpoint_id = (button != NULL) ? get_endpoint(button) : 1; - // Press moves Position from 0 (idle) to 1 (press) - uint8_t newPosition = 1; + // Press moves Position from 0 (idle) to 1 (press) and vice versa + uint8_t newPosition = (latching_switch_previous_position == 1) ? 0 : 1; + latching_switch_previous_position = newPosition; chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, newPosition]() { chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, newPosition); // SwitchLatched event takes newPosition as event data @@ -51,18 +53,25 @@ static void app_driver_button_switch_latched(void *arg, void *data) } #endif #if CONFIG_GENERIC_SWITCH_TYPE_MOMENTARY +static int current_number_of_presses_counted = 1; +static bool is_multipress = 0; +static uint8_t idlePosition = 0; + static void app_driver_button_initial_pressed(void *arg, void *data) { - ESP_LOGI(TAG, "Initial button pressed"); - gpio_button * button = (gpio_button*)data; - int switch_endpoint_id = (button != NULL) ? get_endpoint(button) : 1; - // Press moves Position from 0 (idle) to 1 (press) - uint8_t newPosition = 1; - chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, newPosition]() { - chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, newPosition); - // InitialPress event takes newPosition as event data - switch_cluster::event::send_initial_press(switch_endpoint_id, newPosition); - }); + if(!is_multipress) { + ESP_LOGI(TAG, "Initial button pressed"); + gpio_button * button = (gpio_button*)data; + int switch_endpoint_id = (button != NULL) ? get_endpoint(button) : 1; + // Press moves Position from 0 (idle) to 1 (press) + uint8_t newPosition = 1; + chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, newPosition]() { + chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, newPosition); + // InitialPress event takes newPosition as event data + switch_cluster::event::send_initial_press(switch_endpoint_id, newPosition); + }); + is_multipress = 1; + } } static void app_driver_button_release(void *arg, void *data) @@ -70,28 +79,9 @@ static void app_driver_button_release(void *arg, void *data) gpio_button *button = (gpio_button *)data; int switch_endpoint_id = (button != NULL) ? get_endpoint(button) : 1; - - if (iot_button_get_ticks_time((button_handle_t)arg) < 5000) { - ESP_LOGI(TAG, "Short button release"); - // Release moves Position from 1 (press) to 0 (idle) - uint8_t previousPosition = 1; - uint8_t newPosition = 0; - chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, previousPosition, newPosition]() { - chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, newPosition); - // ShortRelease event takes previousPosition as event data - switch_cluster::event::send_short_release(switch_endpoint_id, previousPosition); - }); - } else { - ESP_LOGI(TAG, "Long button release"); - // Release moves Position from 1 (press) to 0 (idle) - uint8_t previousPosition = 1; - uint8_t newPosition = 0; - chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, previousPosition, newPosition]() { - chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, newPosition); - // LongRelease event takes previousPositionPosition as event data - switch_cluster::event::send_long_release(switch_endpoint_id, previousPosition); - }); - } + chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id]() { + chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, idlePosition); + }); } static void app_driver_button_long_pressed(void *arg, void *data) @@ -108,8 +98,6 @@ static void app_driver_button_long_pressed(void *arg, void *data) }); } -static int current_number_of_presses_counted = 1; - static void app_driver_button_multipress_ongoing(void *arg, void *data) { ESP_LOGI(TAG, "Multipress Ongoing"); @@ -118,11 +106,25 @@ static void app_driver_button_multipress_ongoing(void *arg, void *data) // Press moves Position from 0 (idle) to 1 (press) uint8_t newPosition = 1; current_number_of_presses_counted++; - chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, newPosition]() { - chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, newPosition); - // MultiPress Ongoing event takes newPosition and current_number_of_presses_counted as event data - switch_cluster::event::send_multi_press_ongoing(switch_endpoint_id, newPosition, current_number_of_presses_counted); - }); + uint16_t endpoint_id = switch_endpoint_id; + uint32_t cluster_id = Switch::Id; + uint32_t attribute_id = Switch::Attributes::FeatureMap::Id; + + attribute_t *attribute = attribute::get(endpoint_id, cluster_id, attribute_id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + + uint32_t feature_map = val.val.u32; + uint32_t msm_feature_map = switch_cluster::feature::momentary_switch_multi_press::get_id(); + uint32_t as_feature_map = switch_cluster::feature::action_switch::get_id(); + if(((feature_map & msm_feature_map) == msm_feature_map) && ((feature_map & as_feature_map) != as_feature_map)) { + chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, newPosition]() { + chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, newPosition); + // MultiPress Ongoing event takes newPosition and current_number_of_presses_counted as event data + switch_cluster::event::send_multi_press_ongoing(switch_endpoint_id, newPosition, current_number_of_presses_counted); + }); + } } static void app_driver_button_multipress_complete(void *arg, void *data) @@ -132,15 +134,24 @@ static void app_driver_button_multipress_complete(void *arg, void *data) int switch_endpoint_id = (button != NULL) ? get_endpoint(button) : 1; // Press moves Position from 0 (idle) to 1 (press) uint8_t previousPosition = 1; - uint8_t newPosition = 0; - static int total_number_of_presses_counted = current_number_of_presses_counted; - chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, previousPosition, newPosition]() { - chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, newPosition); + uint16_t endpoint_id = switch_endpoint_id; + uint32_t cluster_id = Switch::Id; + uint32_t attribute_id = Switch::Attributes::MultiPressMax::Id; + + attribute_t *attribute = attribute::get(endpoint_id, cluster_id, attribute_id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + uint8_t multipress_max = val.val.u8; + int total_number_of_presses_counted = (current_number_of_presses_counted > multipress_max)? 0:current_number_of_presses_counted; + chip::DeviceLayer::SystemLayer().ScheduleLambda([switch_endpoint_id, previousPosition, total_number_of_presses_counted]() { + chip::app::Clusters::Switch::Attributes::CurrentPosition::Set(switch_endpoint_id, idlePosition); // MultiPress Complete event takes previousPosition and total_number_of_presses_counted as event data switch_cluster::event::send_multi_press_complete(switch_endpoint_id, previousPosition, total_number_of_presses_counted); // Reset current_number_of_presses_counted to initial value current_number_of_presses_counted = 1; }); + is_multipress = 0; } #endif @@ -162,13 +173,12 @@ app_driver_handle_t app_driver_button_init(gpio_button * button) #if CONFIG_GENERIC_SWITCH_TYPE_LATCHING - iot_button_register_cb(handle, BUTTON_DOUBLE_CLICK, app_driver_button_switch_latched, button); + iot_button_register_cb(handle, BUTTON_PRESS_DOWN, app_driver_button_switch_latched, button); #endif #if CONFIG_GENERIC_SWITCH_TYPE_MOMENTARY iot_button_register_cb(handle, BUTTON_PRESS_DOWN, app_driver_button_initial_pressed, button); iot_button_register_cb(handle, BUTTON_PRESS_UP, app_driver_button_release, button); - iot_button_register_cb(handle, BUTTON_LONG_PRESS_START, app_driver_button_long_pressed, button); iot_button_register_cb(handle, BUTTON_PRESS_REPEAT, app_driver_button_multipress_ongoing, button); iot_button_register_cb(handle, BUTTON_PRESS_REPEAT_DONE, app_driver_button_multipress_complete, button); #endif diff --git a/examples/generic_switch/main/app_main.cpp b/examples/generic_switch/main/app_main.cpp index 38dfe871b..c2ef5d4e5 100644 --- a/examples/generic_switch/main/app_main.cpp +++ b/examples/generic_switch/main/app_main.cpp @@ -170,12 +170,6 @@ static esp_err_t create_button(struct gpio_button* button, node_t* node) generic_switch_endpoint_id = endpoint::get_id(endpoint); ESP_LOGI(TAG, "Generic Switch created with endpoint_id %d", generic_switch_endpoint_id); - cluster::fixed_label::config_t fl_config; - cluster_t *fl_cluster = cluster::fixed_label::create(endpoint, &fl_config, CLUSTER_FLAG_SERVER); - - cluster::user_label::config_t ul_config; - cluster_t *ul_cluster = cluster::user_label::create(endpoint, &ul_config, CLUSTER_FLAG_SERVER); - /* Add additional features to the node */ cluster_t *cluster = cluster::get(endpoint, Switch::Id); @@ -185,6 +179,10 @@ static esp_err_t create_button(struct gpio_button* button, node_t* node) #if CONFIG_GENERIC_SWITCH_TYPE_MOMENTARY cluster::switch_cluster::feature::momentary_switch::add(cluster); + cluster::switch_cluster::feature::action_switch::add(cluster); + cluster::switch_cluster::feature::momentary_switch_multi_press::config_t msm; + msm.multi_press_max = 5; + cluster::switch_cluster::feature::momentary_switch_multi_press::add(cluster, &msm); #endif return err; @@ -244,24 +242,6 @@ extern "C" void app_main() SetTagList(1, chip::Span(gEp1TagList)); SetTagList(2, chip::Span(gEp2TagList)); - nvs_handle_t handle; - nvs_open_from_partition(CONFIG_CHIP_FACTORY_NAMESPACE_PARTITION_LABEL, "chip-factory", NVS_READWRITE, &handle); - ABORT_APP_ON_FAILURE(err == ESP_OK, ESP_LOGE(TAG, "Failed to open namespace:chip-factory from partition:" - CONFIG_CHIP_FACTORY_NAMESPACE_PARTITION_LABEL ", err:%d", err)); - - int32_t out_value = 0; - if (nvs_get_i32(handle, "fl-sz/1", &out_value) == ESP_ERR_NVS_NOT_FOUND) - { - nvs_set_i32(handle, "fl-sz/1", 2); - nvs_set_str(handle, "fl-k/1/0", "myEP1LBL1"); - nvs_set_str(handle, "fl-v/1/0", "valEP1LBL1"); - nvs_set_str(handle, "fl-k/1/1", "myEP1LBL2"); - nvs_set_str(handle, "fl-v/1/1", "valEP1LBL2"); - } - - nvs_commit(handle); - nvs_close(handle); - #if CONFIG_ENABLE_CHIP_SHELL esp_matter::console::diagnostics_register_commands(); esp_matter::console::wifi_register_commands(); diff --git a/examples/generic_switch/mfg_binaries/20202020_3841.bin b/examples/generic_switch/mfg_binaries/20202020_3841.bin deleted file mode 100644 index d0e7ffc469caf40b9ebd5801712c26d3809213f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 zcmeH~dr(x@9mnszd)Wm91zC`mIxMRs2D5PPF06}>HH!-@C=2)i#Xi^yHsUj%_U|N7n-N-#Dkq-XXA9~OARQq*0gq0 zK}N1LMQ2K0pPQv|ZBbY&>_t^ZJDa~*YgJ@xb8FJm^^R(lMj^{)v(qg$TMgsLl&9sd zN!nheDU)dtswq{cr7N7$HBzL`O4e-1wO6PVE`!dXt}SA+i&&;QsnTUH$g!=@FUvJm zA#+~!I<{onsu|<K( z8DDqn$^(p4mYgDArbwM7O)@Q<`1!kS-A0{3Vlc6fH1Y)&;OmmiSky!g;b(6Pk0L25 zaN$H(r#Aen7!=G8Ola18u!`nUD1(VcQGDJenin!JN9Vvw6isfMDvJ@K`TXFee7sFf zukE175IQ3xgPHO#6+$ZzZlVRDQW=sXYPrT@Af7O*UlC|R{xw@b! zsbfxY&+2^p!k2pGVeRGo9DzV7AZ35PmVI==>9ynQzI*tMzkC=KbF3Ks5QShE3nTE! zMpKADbGfg1+!ux=Xg~|O@40joE!_Wy?zd$Z5N#j5^oxSyA4%8m_D9dlB2WeuN1XdUeW-I$skUsp`bgi(zPl}l;$!AY zE=2xXm{2(uaqB!DGVx|@L1=9-tI=sU8(NPfgefzxro3#fUb^JDH#A%KWlSwRzxuOm zO;Ap+4{!b9`riFZ@;+zZZt@)6p86Bv+RXaf!6Ei?U)`qteM??Hdn3BNrL47%>`j~B zVrpx+efw0x9(^QN-^X8|_fDVh^G_40zyE9nXD@f^AFZLn{+FE_V!!o<&62n8Z!W%A z^?P4VU*8vB7%~6Tnw8}`^Aq~%$NCxk`hgQ`=O%t?z4}pFKFvGa|3Z)dCL%PeepEA8 zwMQuorxYd`>s$6;l=5vfIlEFCJ{gG-?^iOTE3Oy5^083A{O-G-C*G_6vaPFq|KQ0F zm>WO2d4^AST)T4X+*pUUelVnS?VSZzha;l`tmR+z%n=_eK}LKy_>>Ze_*fzoIYlod z-%l?y%E4bRW#eL3Y<}!;SCs1Dwy=Q#=2sOz_D9Xr5GWms;lS13T~8!;7YFp;zsSB< z=Nvy=XfC?^vv4M2-`{yFhj^4Ie&fq4hUz!`@v`$lud?g<`#ekUkrS!P?tixJ5}vGR z`i_5nSoyNi>HF`ik07F~r}!Xuwn~f!3v2VpgBZs3EBtrQ9@O{+KM0>h%@0CJ0oBrY z8#VS*B##M2bNE5U%^K3gqbU-lKORK3C}?@)VuFk(N8EBMfM|%0=Oxd7o{m_vK_!(k zXjzVGV=}_MM4G%ffLP2Y;ssT&EDj{2nR--*oi_;eV@SN~LbNae>y0>IHpGkiHW8obL00AHX1papj zJj9`JcP;-ry)U|BnpYLRcj$ot5C8%|00;m9AOHk_01yBIKmZ5;fv1-McmJnmx&QAQ zY%G3yGlR&101yBIKmZ5;0U!VbfB+Bx0zd!=00AEX?*7l4<^F%_#p8p%anJ(+AOHk_ z01yBIKmZ5;0U!VbfB+Bx0#7di?*32Da{s@5_Tr7FH#3MF2mk>f00e*l5C8%|00;m9 nAOHk_01yBIKmZ5;0U!VbfB+Bx0zd!=00AHX1c1Q*4}t#xy7EvB diff --git a/examples/generic_switch/mfg_binaries/matter_qrcode_20202020_3841.png b/examples/generic_switch/mfg_binaries/matter_qrcode_20202020_3841.png deleted file mode 100644 index bc5cd7ac37e9ececed2104628d37580fb49f3247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31865 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 A{Qv*} diff --git a/examples/generic_switch/sdkconfig.defaults b/examples/generic_switch/sdkconfig.defaults index 4baf067bd..3ae04eac1 100644 --- a/examples/generic_switch/sdkconfig.defaults +++ b/examples/generic_switch/sdkconfig.defaults @@ -37,15 +37,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n # Disable DS Peripheral CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n -# Enable for fixed-label -CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER=y -CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER=y -CONFIG_ENABLE_ESP32_DEVICE_INSTANCE_INFO_PROVIDER=y -CONFIG_FACTORY_PARTITION_DAC_PROVIDER=y -CONFIG_FACTORY_DEVICE_INFO_PROVIDER=y -CONFIG_FACTORY_DEVICE_INSTANCE_INFO_PROVIDER=y -CONFIG_FACTORY_COMMISSIONABLE_DATA_PROVIDER=y - # Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y