From 3481d043b2748b4f20a76f7e72e5d9853517f3d6 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Thu, 2 Jan 2025 18:45:19 +0100 Subject: [PATCH 01/24] Add menu option --- main/Kconfig.projbuild | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index b9190dd..477ca28 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -6,6 +6,7 @@ menu "XIAO Sensor Configuration" Choose the type of sensor connection to use. - **WiFi + MQTT**: WiFi and MQTT. - **ZigBee**: ZigBee. + - **Matter over Thread**: Matter over Thread. config SENSOR_CONNECTION_WIFI_MQTT bool "WiFi + MQTT" @@ -17,6 +18,11 @@ menu "XIAO Sensor Configuration" help Enable ZigBee connection. + config SENSOR_CONNECTION_MATTER_OVER_THREAD + bool "Matter over Thread" + help + Enable Matter over Thread connection. + endchoice menu "Wi-Fi Configuration" depends on SENSOR_CONNECTION_WIFI_MQTT From 883c0f10584a10a0f57eccdfdc58bb038819584a Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Fri, 3 Jan 2025 22:04:22 +0100 Subject: [PATCH 02/24] #13 WIP Add esp-matter dep Reorganize partitions table Add openthread Add matter init --- CMakeLists.txt | 5 ++ main/CMakeLists.txt | 18 ++-- main/Kconfig.projbuild | 16 ++++ main/idf_component.yml | 2 + main/main.c | 13 ++- main/sensor_gpio.c | 3 +- main/sensor_matter.cpp | 181 +++++++++++++++++++++++++++++++++++++++ main/sensor_matter.h | 33 +++++++ main/sensor_openthread.h | 32 +++++++ partitions.csv | 16 ++-- sdkconfig.defaults | 15 +++- 11 files changed, 317 insertions(+), 17 deletions(-) create mode 100644 main/sensor_matter.cpp create mode 100644 main/sensor_matter.h create mode 100644 main/sensor_openthread.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bc626d2..3caa560 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,3 +8,8 @@ add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(xiao_esp32c6_wifi_sensor) + +idf_build_set_property( + CXX_COMPILE_OPTIONS + "-std=gnu++17;-Os;-DCHIP_HAVE_CONFIG_H;-Wno-overloaded-virtual" APPEND) +idf_build_set_property(C_COMPILE_OPTIONS "-Os" APPEND) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 0234487..e6fb5ed 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,19 +1,20 @@ idf_component_register( SRCS "main.c" - "sensor_nvs.c" - "sensor_wifi.c" - "sensor_mqtt.c" - "sensor_gpio.c" "sensor_adc.c" "sensor_bme.c" - "sensor_zb.c" + "sensor_data.c" + "sensor_gpio.c" + "sensor_i2c.c" "sensor_id.c" "sensor_led.c" + "sensor_matter.cpp" + "sensor_mqtt.c" + "sensor_nvs.c" "sensor_sgp.c" "sensor_sleep.c" - "sensor_i2c.c" - "sensor_data.c" + "sensor_wifi.c" + "sensor_zb.c" "../vendor/embedded-i2c-sgp41/sgp41_i2c.c" "../vendor/embedded-i2c-sgp41/sensirion_i2c.c" "../vendor/embedded-i2c-sgp41/sensirion_common.c" @@ -26,3 +27,6 @@ idf_component_register( "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm" "../vendor/boschsensortec/BME280_SensorAPI" "../vendor/boschsensortec/BME68x_SensorAPI") + +set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17) +target_compile_options(${COMPONENT_LIB} PRIVATE "-DCHIP_HAVE_CONFIG_H") diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 477ca28..e23ede7 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -245,6 +245,22 @@ menu "XIAO Sensor Configuration" Use an external antenna for ZigBee connectivity. endmenu + menu "Matter over Thread Configuration" + depends on SENSOR_CONNECTION_MATTER_OVER_THREAD + config SENSOR_ID + string "Sensor ID" + default "" + help + Unique identifier for the sensor. + + If left empty, the device's MAC address will be used as the Sensor ID. + + config MATTER_OVER_THREAD_ANTENNA_EXTERNAL + bool "External Antenna" + help + Use an external antenna for ZigBee connectivity. + endmenu + menu "Sensor Configuration" config SENSOR_BME680 bool "BME680" diff --git a/main/idf_component.yml b/main/idf_component.yml index aca77ce..4a5137a 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,5 +1,7 @@ ## IDF Component Manager Manifest File dependencies: + espressif/esp_diag_data_store: "==1.0.1" + espressif/esp_matter: "^0.0.2" espressif/esp-zboss-lib: "~1.5.0" espressif/esp-zigbee-lib: "~1.5.0" ## Required IDF version diff --git a/main/main.c b/main/main.c index 7e864da..4f54895 100644 --- a/main/main.c +++ b/main/main.c @@ -48,6 +48,10 @@ #include "sensor_sgp.h" #endif +#ifdef CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD +#include "sensor_matter.h" +#endif + static const char *TAG = "sensor_main"; char sensor_id[SENSOR_ID_MAX_LEN] = {0}; @@ -55,11 +59,12 @@ SensorData sensor_data; void app_main(void) { init_sensor_data(&sensor_data); + ESP_LOGI(TAG, "FW version: %s", GIT_COMMIT_HASH); + #ifdef CONFIG_ENABLE_BATTERY_CHECK init_adc(); check_battery(&sensor_data); ESP_LOGI(TAG, "Battery Voltage: %.2f V", sensor_data.battery.voltage); - ESP_LOGI(TAG, "FW version: %s", GIT_COMMIT_HASH); deinit_adc(); #endif @@ -96,4 +101,8 @@ void app_main(void) { init_zb(); start_zb(); #endif -} \ No newline at end of file + +#ifdef CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD + init_matter(); +#endif +} diff --git a/main/sensor_gpio.c b/main/sensor_gpio.c index bacd2db..1b43812 100644 --- a/main/sensor_gpio.c +++ b/main/sensor_gpio.c @@ -16,7 +16,8 @@ void init_gpio(void) { #if defined(CONFIG_WIFI_ANTENNA_EXTERNAL) || \ - defined(CONFIG_ZIGBEE_ANTENNA_EXTERNAL) + defined(CONFIG_ZIGBEE_ANTENNA_EXTERNAL) || \ + defined(CONFIG_MATTER_OVER_THREAD_ANTENNA_EXTERNAL) gpio_reset_pin(GPIO_NUM_3); gpio_set_direction(GPIO_NUM_3, GPIO_MODE_OUTPUT); gpio_set_level(GPIO_NUM_3, LOW); diff --git a/main/sensor_matter.cpp b/main/sensor_matter.cpp new file mode 100644 index 0000000..b50bc48 --- /dev/null +++ b/main/sensor_matter.cpp @@ -0,0 +1,181 @@ +/** + * @file sensor_matter.cpp + * @author Alexander Begoon + * @date 03 January 2025 + * @brief //TODO + * + * @details //TODO + * + * @copyright Copyright (c) 2024 BegoonLab. + * All rights reserved. + */ + +#include "sensor_matter.h" + +#ifdef __cplusplus +extern "C" { +#endif + +static const char *TAG = "sensor_matter"; + +using namespace esp_matter; +using namespace esp_matter::attribute; +using namespace esp_matter::endpoint; +using namespace chip::app::Clusters; + +esp_err_t start_matter(void) { + /* Matter start */ + err = esp_matter::start(app_event_cb); + ABORT_APP_ON_FAILURE(err == ESP_OK, + ESP_LOGE(TAG, "Failed to start Matter, err:%d", err)); +} + +esp_err_t init_matter(void) { + /* Create a Matter node and add the mandatory Root Node device type on + * endpoint 0 */ + node::config_t node_config; + node_t *node = node::create(&node_config, app_attribute_update_cb, + app_identification_cb); + ABORT_APP_ON_FAILURE(node != nullptr, + ESP_LOGE(TAG, "Failed to create Matter node")); + + // add temperature sensor device + temperature_sensor::config_t temp_sensor_config; + endpoint_t *temp_sensor_ep = temperature_sensor::create( + node, &temp_sensor_config, ENDPOINT_FLAG_NONE, NULL); + ABORT_APP_ON_FAILURE( + temp_sensor_ep != nullptr, + ESP_LOGE(TAG, "Failed to create temperature_sensor endpoint")); + + // add the humidity sensor device + humidity_sensor::config_t humidity_sensor_config; + endpoint_t *humidity_sensor_ep = humidity_sensor::create( + node, &humidity_sensor_config, ENDPOINT_FLAG_NONE, NULL); + ABORT_APP_ON_FAILURE( + humidity_sensor_ep != nullptr, + ESP_LOGE(TAG, "Failed to create humidity_sensor endpoint")); + + esp_openthread_platform_config_t config = { + .radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(), + .host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(), + .port_config = ESP_OPENTHREAD_DEFAULT_PORT_CONFIG(), + }; + set_openthread_platform_config(&config); + + return ESP_OK; +} + +// Application cluster specification, 7.18.2.11. Temperature +// represents a temperature on the Celsius scale with a resolution of 0.01°C. +// temp = (temperature in °C) x 100 +static void temp_sensor_notification(uint16_t endpoint_id, float temp, + void *user_data) { + // schedule the attribute update so that we can report it from matter thread + chip::DeviceLayer::SystemLayer().ScheduleLambda([endpoint_id, temp]() { + attribute_t *attribute = + attribute::get(endpoint_id, TemperatureMeasurement::Id, + TemperatureMeasurement::Attributes::MeasuredValue::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + val.val.i16 = static_cast(temp * 100); + + attribute::update(endpoint_id, TemperatureMeasurement::Id, + TemperatureMeasurement::Attributes::MeasuredValue::Id, + &val); + }); +} + +// Application cluster specification, 2.6.4.1. MeasuredValue Attribute +// represents the humidity in percent. +// humidity = (humidity in %) x 100 +static void humidity_sensor_notification(uint16_t endpoint_id, float humidity, + void *user_data) { + // schedule the attribute update so that we can report it from matter thread + chip::DeviceLayer::SystemLayer().ScheduleLambda([endpoint_id, humidity]() { + attribute_t *attribute = attribute::get( + endpoint_id, RelativeHumidityMeasurement::Id, + RelativeHumidityMeasurement::Attributes::MeasuredValue::Id); + + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + attribute::get_val(attribute, &val); + val.val.u16 = static_cast(humidity * 100); + + attribute::update( + endpoint_id, RelativeHumidityMeasurement::Id, + RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, &val); + }); +} + +static void open_commissioning_window_if_necessary() { + VerifyOrReturn(chip::Server::GetInstance().GetFabricTable().FabricCount() == + 0); + + chip::CommissioningWindowManager &commissionMgr = + chip::Server::GetInstance().GetCommissioningWindowManager(); + VerifyOrReturn(commissionMgr.IsCommissioningWindowOpen() == false); + + // After removing last fabric, this example does not remove the Wi-Fi + // credentials and still has IP connectivity so, only advertising on DNS-SD. + CHIP_ERROR err = commissionMgr.OpenBasicCommissioningWindow( + chip::System::Clock::Seconds16(300), + chip::CommissioningWindowAdvertisement::kDnssdOnly); + if (err != CHIP_NO_ERROR) { + ESP_LOGE(TAG, + "Failed to open commissioning window, err:%" CHIP_ERROR_FORMAT, + err.Format()); + } +} + +static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { + switch (event->Type) { + case chip::DeviceLayer::DeviceEventType::kCommissioningComplete: + ESP_LOGI(TAG, "Commissioning complete"); + break; + + case chip::DeviceLayer::DeviceEventType::kFailSafeTimerExpired: + ESP_LOGI(TAG, "Commissioning failed, fail safe timer expired"); + break; + + case chip::DeviceLayer::DeviceEventType::kFabricRemoved: + ESP_LOGI(TAG, "Fabric removed successfully"); + open_commissioning_window_if_necessary(); + break; + + case chip::DeviceLayer::DeviceEventType::kBLEDeinitialized: + ESP_LOGI(TAG, "BLE deinitialized and memory reclaimed"); + break; + + default: + break; + } +} + +// This callback is invoked when clients interact with the Identify Cluster. +// In the callback implementation, an endpoint can identify itself. (e.g., by +// flashing an LED or light). +static esp_err_t app_identification_cb(identification::callback_type_t type, + uint16_t endpoint_id, uint8_t effect_id, + uint8_t effect_variant, + void *priv_data) { + ESP_LOGI(TAG, "Identification callback: type: %u, effect: %u, variant: %u", + type, effect_id, effect_variant); + return ESP_OK; +} + +// This callback is called for every attribute update. The callback +// implementation shall handle the desired attributes and return an appropriate +// error code. If the attribute is not of your interest, please do not return an +// error code and strictly return ESP_OK. +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) { + // Since this is just a sensor and we don't expect any writes on our + // temperature sensor, so, return success. + return ESP_OK; +} + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/main/sensor_matter.h b/main/sensor_matter.h new file mode 100644 index 0000000..5c3eb6c --- /dev/null +++ b/main/sensor_matter.h @@ -0,0 +1,33 @@ +/** + * @file sensor_matter.h + * @author Alexander Begoon + * @date 03 January 2025 + * @brief //TODO + * + * @details //TODO + * + * @copyright Copyright (c) 2024 BegoonLab. + * All rights reserved. + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "esp_err.h" +#include "esp_log.h" +#include "esp_matter.h" +#include "esp_matter_ota.h" +#include "sensor_openthread.h" +#include +#include + +esp_err_t init_matter(void); +esp_err_t start_matter(void); +esp_err_t stop_matter(void); + +#ifdef __cplusplus +} +#endif diff --git a/main/sensor_openthread.h b/main/sensor_openthread.h new file mode 100644 index 0000000..7307a8b --- /dev/null +++ b/main/sensor_openthread.h @@ -0,0 +1,32 @@ +/** + * @file sensor_openthread.h + * @author Alexander Begoon + * @date 03 January 2025 + * @brief //TODO + * + * @details //TODO + * + * @copyright Copyright (c) 2024 BegoonLab. + * All rights reserved. + */ + +#pragma once + +#ifdef CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD +#include "esp_openthread_types.h" +#include + +#if SOC_IEEE802154_SUPPORTED +#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \ + { .radio_mode = RADIO_MODE_NATIVE, } +#endif + +#define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \ + { .host_connection_mode = HOST_CONNECTION_MODE_NONE, } + +#define ESP_OPENTHREAD_DEFAULT_PORT_CONFIG() \ + { \ + .storage_partition_name = "nvs", .netif_queue_size = 10, \ + .task_queue_size = 10, \ + } +#endif // CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD \ No newline at end of file diff --git a/partitions.csv b/partitions.csv index cb78974..42cb75b 100644 --- a/partitions.csv +++ b/partitions.csv @@ -1,7 +1,11 @@ -# Name, Type, SubType, Offset, Size, Flags +# Name, Type, SubType, Offset, Size, Flags # Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap -nvs, data, nvs, 0x9000, 0x6000, -phy_init, data, phy, 0xf000, 0x1000, -factory, app, factory, 0x10000, 0x180000, -zb_storage, data, fat, 0x190000, 0x4000 -zb_fct, data, fat, 0x194000, 0x400 +nvs, data, nvs, 0x9000, 0x6000, +esp_secure_cert, data, 0x3F, 0xF000, 0x2000, encrypted +nvs_keys, data, nvs_keys, 0x11000, 0x1000, encrypted +phy_init, data, phy, 0x12000, 0x1000, +otadata, data, ota, 0x13000, 0x2000, +zb_storage, data, fat, 0x15000, 0x4000, +zb_fct, data, fat, 0x19000, 0x400, +ota_0, app, ota_0, 0x20000, 0x1E0000, +ota_1, app, ota_1, 0x200000, 0x1E0000, diff --git a/sdkconfig.defaults b/sdkconfig.defaults index ee9f518..8324f03 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -66,4 +66,17 @@ CONFIG_COMPILER_OPTIMIZATION_PERF=y # # PHY # -CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION=y \ No newline at end of file +CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION=y + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" \ No newline at end of file From 1e95c742129d09e71e9273fa06202e825bb2c0c5 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Fri, 3 Jan 2025 23:34:19 +0100 Subject: [PATCH 03/24] #13 WIP Add esp-matter Able to build here --- main/main.c | 10 +++ main/sensor_matter.cpp | 184 +++++++++++++++++++++-------------------- main/sensor_matter.h | 5 -- sdkconfig.defaults | 31 ++++++- 4 files changed, 134 insertions(+), 96 deletions(-) diff --git a/main/main.c b/main/main.c index 4f54895..06f675e 100644 --- a/main/main.c +++ b/main/main.c @@ -49,7 +49,17 @@ #endif #ifdef CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD + +#ifdef __cplusplus +extern "C" { +#endif + #include "sensor_matter.h" + +#ifdef __cplusplus +} +#endif + #endif static const char *TAG = "sensor_main"; diff --git a/main/sensor_matter.cpp b/main/sensor_matter.cpp index b50bc48..0f6ab0a 100644 --- a/main/sensor_matter.cpp +++ b/main/sensor_matter.cpp @@ -11,10 +11,12 @@ */ #include "sensor_matter.h" - -#ifdef __cplusplus -extern "C" { -#endif +#include "esp_matter.h" +#include "esp_matter_ota.h" +#include "sensor_openthread.h" +#include +#include +#include static const char *TAG = "sensor_matter"; @@ -23,90 +25,6 @@ using namespace esp_matter::attribute; using namespace esp_matter::endpoint; using namespace chip::app::Clusters; -esp_err_t start_matter(void) { - /* Matter start */ - err = esp_matter::start(app_event_cb); - ABORT_APP_ON_FAILURE(err == ESP_OK, - ESP_LOGE(TAG, "Failed to start Matter, err:%d", err)); -} - -esp_err_t init_matter(void) { - /* Create a Matter node and add the mandatory Root Node device type on - * endpoint 0 */ - node::config_t node_config; - node_t *node = node::create(&node_config, app_attribute_update_cb, - app_identification_cb); - ABORT_APP_ON_FAILURE(node != nullptr, - ESP_LOGE(TAG, "Failed to create Matter node")); - - // add temperature sensor device - temperature_sensor::config_t temp_sensor_config; - endpoint_t *temp_sensor_ep = temperature_sensor::create( - node, &temp_sensor_config, ENDPOINT_FLAG_NONE, NULL); - ABORT_APP_ON_FAILURE( - temp_sensor_ep != nullptr, - ESP_LOGE(TAG, "Failed to create temperature_sensor endpoint")); - - // add the humidity sensor device - humidity_sensor::config_t humidity_sensor_config; - endpoint_t *humidity_sensor_ep = humidity_sensor::create( - node, &humidity_sensor_config, ENDPOINT_FLAG_NONE, NULL); - ABORT_APP_ON_FAILURE( - humidity_sensor_ep != nullptr, - ESP_LOGE(TAG, "Failed to create humidity_sensor endpoint")); - - esp_openthread_platform_config_t config = { - .radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(), - .host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(), - .port_config = ESP_OPENTHREAD_DEFAULT_PORT_CONFIG(), - }; - set_openthread_platform_config(&config); - - return ESP_OK; -} - -// Application cluster specification, 7.18.2.11. Temperature -// represents a temperature on the Celsius scale with a resolution of 0.01°C. -// temp = (temperature in °C) x 100 -static void temp_sensor_notification(uint16_t endpoint_id, float temp, - void *user_data) { - // schedule the attribute update so that we can report it from matter thread - chip::DeviceLayer::SystemLayer().ScheduleLambda([endpoint_id, temp]() { - attribute_t *attribute = - attribute::get(endpoint_id, TemperatureMeasurement::Id, - TemperatureMeasurement::Attributes::MeasuredValue::Id); - - esp_matter_attr_val_t val = esp_matter_invalid(NULL); - attribute::get_val(attribute, &val); - val.val.i16 = static_cast(temp * 100); - - attribute::update(endpoint_id, TemperatureMeasurement::Id, - TemperatureMeasurement::Attributes::MeasuredValue::Id, - &val); - }); -} - -// Application cluster specification, 2.6.4.1. MeasuredValue Attribute -// represents the humidity in percent. -// humidity = (humidity in %) x 100 -static void humidity_sensor_notification(uint16_t endpoint_id, float humidity, - void *user_data) { - // schedule the attribute update so that we can report it from matter thread - chip::DeviceLayer::SystemLayer().ScheduleLambda([endpoint_id, humidity]() { - attribute_t *attribute = attribute::get( - endpoint_id, RelativeHumidityMeasurement::Id, - RelativeHumidityMeasurement::Attributes::MeasuredValue::Id); - - esp_matter_attr_val_t val = esp_matter_invalid(NULL); - attribute::get_val(attribute, &val); - val.val.u16 = static_cast(humidity * 100); - - attribute::update( - endpoint_id, RelativeHumidityMeasurement::Id, - RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, &val); - }); -} - static void open_commissioning_window_if_necessary() { VerifyOrReturn(chip::Server::GetInstance().GetFabricTable().FabricCount() == 0); @@ -151,6 +69,16 @@ static void app_event_cb(const ChipDeviceEvent *event, intptr_t arg) { } } +esp_err_t start_matter(void) { + /* Matter start */ + esp_err_t err = esp_matter::start(app_event_cb); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to start Matter, err:%d", err); + } + + return err; +} + // This callback is invoked when clients interact with the Identify Cluster. // In the callback implementation, an endpoint can identify itself. (e.g., by // flashing an LED or light). @@ -176,6 +104,82 @@ app_attribute_update_cb(attribute::callback_type_t type, uint16_t endpoint_id, return ESP_OK; } -#ifdef __cplusplus +esp_err_t init_matter(void) { + /* Create a Matter node and add the mandatory Root Node device type on + * endpoint 0 */ + node::config_t node_config; + node_t *node = node::create(&node_config, app_attribute_update_cb, + app_identification_cb); + + if (node == nullptr) { + ESP_LOGE(TAG, "Failed to create Matter node"); + } + + // add temperature sensor device + temperature_sensor::config_t temp_sensor_config; + endpoint_t *temp_sensor_ep = temperature_sensor::create( + node, &temp_sensor_config, ENDPOINT_FLAG_NONE, NULL); + if (temp_sensor_ep == nullptr) { + ESP_LOGE(TAG, "Failed to create temperature_sensor endpoint"); + } + + // add the humidity sensor device + humidity_sensor::config_t humidity_sensor_config; + endpoint_t *humidity_sensor_ep = humidity_sensor::create( + node, &humidity_sensor_config, ENDPOINT_FLAG_NONE, NULL); + if (humidity_sensor_ep == nullptr) { + ESP_LOGE(TAG, "Failed to create humidity_sensor endpoint"); + } + + esp_openthread_platform_config_t config = { + .radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(), + .host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(), + .port_config = ESP_OPENTHREAD_DEFAULT_PORT_CONFIG(), + }; + set_openthread_platform_config(&config); + + return ESP_OK; } -#endif \ No newline at end of file + +//// Application cluster specification, 7.18.2.11. Temperature +//// represents a temperature on the Celsius scale with a resolution of 0.01°C. +//// temp = (temperature in °C) x 100 +// static void temp_sensor_notification(uint16_t endpoint_id, float temp, +// void *user_data) { +// // schedule the attribute update so that we can report it from matter +// thread chip::DeviceLayer::SystemLayer().ScheduleLambda([endpoint_id, +// temp]() { +// attribute_t *attribute = +// attribute::get(endpoint_id, TemperatureMeasurement::Id); +// +// esp_matter_attr_val_t val = esp_matter_invalid(NULL); +// attribute::get_val(attribute, &val); +// val.val.i16 = static_cast(temp * 100); +// +// attribute::update(endpoint_id, TemperatureMeasurement::Id, +// TemperatureMeasurement::Attributes::MeasuredValue::Id, +// &val); +// }); +// } +// +//// Application cluster specification, 2.6.4.1. MeasuredValue Attribute +//// represents the humidity in percent. +//// humidity = (humidity in %) x 100 +// static void humidity_sensor_notification(uint16_t endpoint_id, float +// humidity, +// void *user_data) { +// // schedule the attribute update so that we can report it from matter +// thread chip::DeviceLayer::SystemLayer().ScheduleLambda([endpoint_id, +// humidity]() { +// attribute_t *attribute = attribute::get(endpoint_id, +// RelativeHumidityMeasurement::Id); +// +// esp_matter_attr_val_t val = esp_matter_invalid(NULL); +// attribute::get_val(attribute, &val); +// val.val.u16 = static_cast(humidity * 100); +// +// attribute::update( +// endpoint_id, RelativeHumidityMeasurement::Id, +// RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, &val); +// }); +// } diff --git a/main/sensor_matter.h b/main/sensor_matter.h index 5c3eb6c..1b621bb 100644 --- a/main/sensor_matter.h +++ b/main/sensor_matter.h @@ -18,11 +18,6 @@ extern "C" { #include "esp_err.h" #include "esp_log.h" -#include "esp_matter.h" -#include "esp_matter_ota.h" -#include "sensor_openthread.h" -#include -#include esp_err_t init_matter(void); esp_err_t start_matter(void); diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 8324f03..b0b949e 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -79,4 +79,33 @@ CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y # CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE="4MB" \ No newline at end of file +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" + +# +# OpenThread +# +CONFIG_OPENTHREAD_ENABLED=y +CONFIG_OPENTHREAD_BORDER_ROUTER=n +CONFIG_OPENTHREAD_DNS64_CLIENT=y +# end of OpenThread + +# +# lwIP +# +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096 +CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_ND6=n +# end of lwIP + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +# end of IEEE 802.15.4 + +# +# mbedTLS +# +CONFIG_MBEDTLS_HKDF_C=y +# end of mbedTLS \ No newline at end of file From dc2e3d84d6662981e6465b3012597d5c565c53dc Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Mon, 6 Jan 2025 23:03:03 +0100 Subject: [PATCH 04/24] #13 WIP Add BLE comissioning --- main/main.c | 1 + main/sensor_matter.cpp | 52 +++++++----------------------------------- sdkconfig.defaults | 41 +++++++++++++++++++++++++++++---- 3 files changed, 45 insertions(+), 49 deletions(-) diff --git a/main/main.c b/main/main.c index 06f675e..759810a 100644 --- a/main/main.c +++ b/main/main.c @@ -114,5 +114,6 @@ void app_main(void) { #ifdef CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD init_matter(); + start_matter(); #endif } diff --git a/main/sensor_matter.cpp b/main/sensor_matter.cpp index 0f6ab0a..7b57c9c 100644 --- a/main/sensor_matter.cpp +++ b/main/sensor_matter.cpp @@ -37,7 +37,7 @@ static void open_commissioning_window_if_necessary() { // credentials and still has IP connectivity so, only advertising on DNS-SD. CHIP_ERROR err = commissionMgr.OpenBasicCommissioningWindow( chip::System::Clock::Seconds16(300), - chip::CommissioningWindowAdvertisement::kDnssdOnly); + chip::CommissioningWindowAdvertisement::kAllSupported); if (err != CHIP_NO_ERROR) { ESP_LOGE(TAG, "Failed to open commissioning window, err:%" CHIP_ERROR_FORMAT, @@ -131,6 +131,13 @@ esp_err_t init_matter(void) { ESP_LOGE(TAG, "Failed to create humidity_sensor endpoint"); } + pressure_sensor::config_t pressure_sensor_config; + endpoint_t *pressure_sensor_ep = pressure_sensor::create( + node, &pressure_sensor_config, ENDPOINT_FLAG_NONE, NULL); + if (pressure_sensor_ep == nullptr) { + ESP_LOGE(TAG, "Failed to create pressure_sensor endpoint"); + } + esp_openthread_platform_config_t config = { .radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(), .host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(), @@ -140,46 +147,3 @@ esp_err_t init_matter(void) { return ESP_OK; } - -//// Application cluster specification, 7.18.2.11. Temperature -//// represents a temperature on the Celsius scale with a resolution of 0.01°C. -//// temp = (temperature in °C) x 100 -// static void temp_sensor_notification(uint16_t endpoint_id, float temp, -// void *user_data) { -// // schedule the attribute update so that we can report it from matter -// thread chip::DeviceLayer::SystemLayer().ScheduleLambda([endpoint_id, -// temp]() { -// attribute_t *attribute = -// attribute::get(endpoint_id, TemperatureMeasurement::Id); -// -// esp_matter_attr_val_t val = esp_matter_invalid(NULL); -// attribute::get_val(attribute, &val); -// val.val.i16 = static_cast(temp * 100); -// -// attribute::update(endpoint_id, TemperatureMeasurement::Id, -// TemperatureMeasurement::Attributes::MeasuredValue::Id, -// &val); -// }); -// } -// -//// Application cluster specification, 2.6.4.1. MeasuredValue Attribute -//// represents the humidity in percent. -//// humidity = (humidity in %) x 100 -// static void humidity_sensor_notification(uint16_t endpoint_id, float -// humidity, -// void *user_data) { -// // schedule the attribute update so that we can report it from matter -// thread chip::DeviceLayer::SystemLayer().ScheduleLambda([endpoint_id, -// humidity]() { -// attribute_t *attribute = attribute::get(endpoint_id, -// RelativeHumidityMeasurement::Id); -// -// esp_matter_attr_val_t val = esp_matter_invalid(NULL); -// attribute::get_val(attribute, &val); -// val.val.u16 = static_cast(humidity * 100); -// -// attribute::update( -// endpoint_id, RelativeHumidityMeasurement::Id, -// RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, &val); -// }); -// } diff --git a/sdkconfig.defaults b/sdkconfig.defaults index b0b949e..2ef1d14 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -8,6 +8,13 @@ CONFIG_PARTITION_TABLE_OFFSET=0x8000 CONFIG_PARTITION_TABLE_MD5=y # end of Partition Table +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +# end of Compiler options + # # mbedTLS # @@ -87,6 +94,7 @@ CONFIG_ESPTOOLPY_FLASHSIZE="4MB" CONFIG_OPENTHREAD_ENABLED=y CONFIG_OPENTHREAD_BORDER_ROUTER=n CONFIG_OPENTHREAD_DNS64_CLIENT=y +# CONFIG_OPENTHREAD_CLI is not set # end of OpenThread # @@ -95,7 +103,7 @@ CONFIG_OPENTHREAD_DNS64_CLIENT=y CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096 CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 CONFIG_LWIP_IPV4=y -CONFIG_LWIP_ND6=n +CONFIG_LWIP_ND6=y # end of lwIP # @@ -104,8 +112,31 @@ CONFIG_LWIP_ND6=n CONFIG_IEEE802154_ENABLED=y # end of IEEE 802.15.4 -# -# mbedTLS -# +#enable BT +CONFIG_BT_ENABLED=y +CONFIG_BT_NIMBLE_ENABLED=y + +#disable BT connection reattempt +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n + +#enable lwip ipv6 autoconfig +CONFIG_LWIP_IPV6_AUTOCONFIG=y + +#enable lwIP route hooks +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y + +# disable softap by default +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n + +CONFIG_ENABLE_WIFI_AP=n + +# Enable HKDF in mbedtls CONFIG_MBEDTLS_HKDF_C=y -# end of mbedTLS \ No newline at end of file + +# Increase LwIP IPv6 address number to 6 (MAX_FABRIC + 1) +# unique local addresses for fabrics(MAX_FABRIC), a link local address(1) +CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 + +# Enable OTA Requestor +CONFIG_ENABLE_OTA_REQUESTOR=y \ No newline at end of file From 9322e9a936724d976fba2054e536db2fcb199fbb Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Fri, 10 Jan 2025 14:36:16 +0100 Subject: [PATCH 05/24] #13 WIP --- main/sensor_matter.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/main/sensor_matter.cpp b/main/sensor_matter.cpp index 7b57c9c..e64c644 100644 --- a/main/sensor_matter.cpp +++ b/main/sensor_matter.cpp @@ -39,9 +39,7 @@ static void open_commissioning_window_if_necessary() { chip::System::Clock::Seconds16(300), chip::CommissioningWindowAdvertisement::kAllSupported); if (err != CHIP_NO_ERROR) { - ESP_LOGE(TAG, - "Failed to open commissioning window, err:%" CHIP_ERROR_FORMAT, - err.Format()); + ESP_LOGE(TAG, "Failed to open commissioning window, err:%", err.Format()); } } From 1685458eb01e2136d3ad9308e81423fb5c9dfe8f Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Tue, 14 Jan 2025 20:38:19 +0100 Subject: [PATCH 06/24] #13 Bump esp_matter WIP --- README.md | 14 +++++++++++++- assets/SensorXIAO_Matter_Pairing_QR.png | Bin 0 -> 2596 bytes main/idf_component.yml | 4 ++-- main/sensor_bme.c | 2 ++ main/sensor_i2c.c | 8 +++++++- main/sensor_matter.cpp | 3 ++- sdkconfig.defaults | 1 + 7 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 assets/SensorXIAO_Matter_Pairing_QR.png diff --git a/README.md b/README.md index fc6e3cd..f3bcb2d 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,14 @@ - [Hardware](#hardware) - [Software](#software) - [ZigBee](#zigbee) +- [Matter over Thread](#matter-over-thread) - [Contributing](#contributing) - [License](#license) - [TODO](#todo) ## Introduction -The Smart IoT Sensor is a power-efficient device built using the [XIAO ESP32C6](https://wiki.seeedstudio.com/xiao_esp32c6_getting_started/) tiny board. It integrates Wi-Fi connectivity, MQTT messaging, environmental sensing with BME280/BME680 sensors, and robust power management, making it an ideal solution for smart home and IoT applications. +The Smart IoT Sensor is a power-efficient device built using the [XIAO ESP32C6](https://wiki.seeedstudio.com/xiao_esp32c6_getting_started/) tiny board. It integrates Wi-Fi connectivity, MQTT messaging, ZigBee, Matter over Thread, environmental sensing with BME280/BME680 sensors, and robust power management, making it an ideal solution for smart home and IoT applications. ![introduction.jpg](assets/introduction.jpg) @@ -33,6 +34,7 @@ The Smart IoT Sensor is a power-efficient device built using the [XIAO ESP32C6]( - **Power Management**: Efficiently manages power using LiPo batteries with built-in charge management. - **Deep Sleep Mode**: Extends battery life by enabling deep sleep between data transmissions. - **ZigBee Connectivity**: Seamless integration with ZigBee networks. Supports standard ZigBee clusters, easily pair your sensor with ZigBee coordinators like Home Assistant. +- **Matter over Thread Connectivity**: Implements Matter protocol over Thread to enable seamless interoperability with other Matter-compliant devices. Supports smart home ecosystems like Apple HomeKit, Google Home, and Amazon Alexa. - **Optional Features**: - Battery voltage monitoring - Connection duration tracking @@ -360,6 +362,16 @@ To add the sensor to Home Assistant: go to `Settings` → `Devices & Services` _Note_: The SGP41 sensor is not currently supported because the ZigBee protocol does not include VOC and NOx clusters in its specification. +## Matter over Thread + +Pairing options: + +- Using manual code: `34970112332` +- Using QR code: `MT:Y.K9042C00KA0648G00` +- Or scan a QR code bellow: + + SensorXIAO_Matter_Pairing_QR.png + ## Contributing Contributions are welcome! Please follow these steps: diff --git a/assets/SensorXIAO_Matter_Pairing_QR.png b/assets/SensorXIAO_Matter_Pairing_QR.png new file mode 100644 index 0000000000000000000000000000000000000000..a783ae644fecbd6a5599eee1eca6331e27052868 GIT binary patch literal 2596 zcmb7Gc{H2p8jq#pRtKGqgQ%sg-cpLTi6|;Dh*+wvG*_Y&ZLW}UQ4twp>)bAuL~>k` zDpEDE)U{MBqllr?iW!>NimDPr8(T#!v0NHAX8x$->RdhN`_6aX_dDfIMdNRaB7eoO8ZCEBnYrAQAR}a)HjIY;o}7ITU4OL+u7M2I&?_(|0b+B2LRYx>*DwgD(cnD5GU+PAn?Xq|F7;KNT_i} zF@g0!^)JOw6oC6rPZmsRJa7x1*QO>k*J!RKa3vp*bYKWpoQ$Nyob-@5Q&Wnp5D|*9~>J3FO*%9ZR|8>;m_h<5yWK?3X=$b!` zH&dN`E)gYm<(T1gdZ6dwSuod*J|)!=RCM({GB5ny7;3_wcbdsjZN=Q+0I+gAdFmdm zeJ3^iPc(1e7)j$@&OJI3dUUk=aitbx$YlYSKlZZK$aOjlp+GHnlE1HqK=V@CzM6g7 z(;3{i@d=o1xF=0H0&}8|>d2@)NR!`KBl-|TB1jrXR-j1-9jdhWjJz=tn4Ra949?JC z6Rrk@!pX$7_u$2>fYPU@cDm*^{OhAwexVWnIb?k4QDG9X5*rs+SEs=+WM-q;R;&^j zh4?epHl7-A0;{|2B6mEt zHMe~)fbb5blJJV539l5KnKiUM9OUNlYeI!4K!|vcSr)_Pypj}otT-#>Wwb$_LX392 zAh<6NxN}vuUHZK<_KLRQ$hV7J8$5)4TH8{X2@Zn?;BsgreY#6&Q7hllkUxZ{{S^zG zZu(@Yw}9#-l+qzIWPWP3E~7}49SF(d2Q4j?35uLsE9i*Hf;H1vJ})V^@4mC zWKAU5T9{9FlRL{Jqt9~8-=-@^>WMnmMKzcUPxfxozdf^lbLm(Mbi_P3u6xcCT*PCP zq=UuLP~|TNTAQZT4o7Q~`Q)VkL##hiv>8KS{%l+v;`AGF7@O%u`B`ia4({?fi`I>* z`flXXU3TSu24&pfZ)2qS=9qm}s~gMOHuEWUWZpHDSw@Ev3z#H^#*$it`ws7}SFW#f zenbL5RRv|JM^0Jp7eXxtJq8Ai;ZvdbLOpcY@lK^%w3RYE!^9y1WE@!ko$noa?#(xd z6fVy8*>-W*vCIIhd(Eu5rSM+Jeed%1YeBx*WjPdZHh~up%M1~iq2n*>Md7UYg)*Z1 z)LRV3;)Tr4A(q&^sU99@5N3mntCpT2#Dtl^r)X)10kWC>yA6uT`)}j>g9om0HZXz zdauTl;CG`*uv;12hB1rjLw_Q-TQVx+V3EjV{D;bhu73#bLXi1%LS%!_hyGZZVm^;O zj{Kn6?@d0|8o~tKPc1*_peB8+mQXH|&rHkAZls$witrN_({g{R?H_|lTEL4wls2#V z*!|=$lDSs}e$1l0-Ppq>#Ae$6a2{bkKS;_f2}8WCT32eKh={iA;nsz;W-80)gK0u% zviGC_Lsg{SLB0Uh>)X%Es2I6_cQ@3-mr7jZ#ZLH~CEcj6W9=SFox8F<$hDSZ(){Sa z*K_tdPg!@_F{xKlVH1kJSj&|M>HVcjyOBDreVI(mxTdw4()IAXv65guOvBiZ(rw@2 zgCY@L#~69ew7cmFRYnHgbp5dq zR#4{OD@R($p>=fw4GRQvoqF<0HTPz9dPx%voPs}TbMQ8>A}h0z+a876m{Q-U)cbmO zzNI0vYA9wV%7DB{9KPXO?;fakh*XO&_*U&+_!r#y)Ry|%zB%8;6ZthnD0;jtd=^pF z(C2`AGZlZ=_A|JP(4Ou-BZpSN Date: Sat, 25 Jan 2025 17:12:41 +0100 Subject: [PATCH 07/24] add esp-matter --- .gitmodules | 3 +++ vendor/esp-matter | 1 + 2 files changed, 4 insertions(+) create mode 160000 vendor/esp-matter diff --git a/.gitmodules b/.gitmodules index cd7f7c4..6f3a451 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "vendor/boschsensortec/BME68x_SensorAPI"] path = vendor/boschsensortec/BME68x_SensorAPI url = https://github.com/boschsensortec/BME68x_SensorAPI +[submodule "vendor/esp-matter"] + path = vendor/esp-matter + url = https://github.com/espressif/esp-matter.git diff --git a/vendor/esp-matter b/vendor/esp-matter new file mode 160000 index 0000000..23a9466 --- /dev/null +++ b/vendor/esp-matter @@ -0,0 +1 @@ +Subproject commit 23a9466cd34ce8eafd0ebc56f16bdb0e27d7058e From 7e8d073d21e52d8e86b0c22e56a9373f45ed29b3 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Sat, 25 Jan 2025 17:13:18 +0100 Subject: [PATCH 08/24] add esp-matter --- .gitmodules | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitmodules b/.gitmodules index 6f3a451..2eaa112 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,4 @@ [submodule "vendor/esp-matter"] path = vendor/esp-matter url = https://github.com/espressif/esp-matter.git + branch = release/v1.4 From e4f44451e5cfd9398ac85e9626a3075f7f505309 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Sat, 25 Jan 2025 17:15:56 +0100 Subject: [PATCH 09/24] rm esp-matter --- .gitmodules | 4 ---- vendor/esp-matter | 1 - 2 files changed, 5 deletions(-) delete mode 160000 vendor/esp-matter diff --git a/.gitmodules b/.gitmodules index 2eaa112..cd7f7c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,7 +10,3 @@ [submodule "vendor/boschsensortec/BME68x_SensorAPI"] path = vendor/boschsensortec/BME68x_SensorAPI url = https://github.com/boschsensortec/BME68x_SensorAPI -[submodule "vendor/esp-matter"] - path = vendor/esp-matter - url = https://github.com/espressif/esp-matter.git - branch = release/v1.4 diff --git a/vendor/esp-matter b/vendor/esp-matter deleted file mode 160000 index 23a9466..0000000 --- a/vendor/esp-matter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 23a9466cd34ce8eafd0ebc56f16bdb0e27d7058e From e22bbdb4c18f184f88d18cf28c56bcda8d9d3b52 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Sat, 25 Jan 2025 17:29:47 +0100 Subject: [PATCH 10/24] add esp-matter --- .gitmodules | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitmodules b/.gitmodules index cd7f7c4..2eaa112 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,7 @@ [submodule "vendor/boschsensortec/BME68x_SensorAPI"] path = vendor/boschsensortec/BME68x_SensorAPI url = https://github.com/boschsensortec/BME68x_SensorAPI +[submodule "vendor/esp-matter"] + path = vendor/esp-matter + url = https://github.com/espressif/esp-matter.git + branch = release/v1.4 From 64d9370f45d2ae1a215d41e7d7bd2a2b309c3668 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Sat, 25 Jan 2025 17:51:42 +0100 Subject: [PATCH 11/24] add esp-matter --- vendor/esp-matter | 1 + 1 file changed, 1 insertion(+) create mode 160000 vendor/esp-matter diff --git a/vendor/esp-matter b/vendor/esp-matter new file mode 160000 index 0000000..78dfdaf --- /dev/null +++ b/vendor/esp-matter @@ -0,0 +1 @@ +Subproject commit 78dfdaf971bc2458fea5ded2cffb2945022aab8d From 20f2b5029edc77eb38771ddd0a13f493cdc73c5f Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Sat, 25 Jan 2025 17:52:35 +0100 Subject: [PATCH 12/24] rm esp-matter --- .gitmodules | 4 ---- vendor/esp-matter | 1 - 2 files changed, 5 deletions(-) delete mode 160000 vendor/esp-matter diff --git a/.gitmodules b/.gitmodules index 2eaa112..cd7f7c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,7 +10,3 @@ [submodule "vendor/boschsensortec/BME68x_SensorAPI"] path = vendor/boschsensortec/BME68x_SensorAPI url = https://github.com/boschsensortec/BME68x_SensorAPI -[submodule "vendor/esp-matter"] - path = vendor/esp-matter - url = https://github.com/espressif/esp-matter.git - branch = release/v1.4 diff --git a/vendor/esp-matter b/vendor/esp-matter deleted file mode 160000 index 78dfdaf..0000000 --- a/vendor/esp-matter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 78dfdaf971bc2458fea5ded2cffb2945022aab8d From 84465287313033ad0b666155225342cee0da4e3b Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Sat, 25 Jan 2025 20:53:56 +0100 Subject: [PATCH 13/24] add esp-matter --- .gitmodules | 4 ++++ scripts/install.py | 0 vendor/esp-matter | 1 + 3 files changed, 5 insertions(+) create mode 100644 scripts/install.py create mode 160000 vendor/esp-matter diff --git a/.gitmodules b/.gitmodules index cd7f7c4..2eaa112 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,7 @@ [submodule "vendor/boschsensortec/BME68x_SensorAPI"] path = vendor/boschsensortec/BME68x_SensorAPI url = https://github.com/boschsensortec/BME68x_SensorAPI +[submodule "vendor/esp-matter"] + path = vendor/esp-matter + url = https://github.com/espressif/esp-matter.git + branch = release/v1.4 diff --git a/scripts/install.py b/scripts/install.py new file mode 100644 index 0000000..e69de29 diff --git a/vendor/esp-matter b/vendor/esp-matter new file mode 160000 index 0000000..78dfdaf --- /dev/null +++ b/vendor/esp-matter @@ -0,0 +1 @@ +Subproject commit 78dfdaf971bc2458fea5ded2cffb2945022aab8d From e61a2de3c5c51c355476889271e06e5c195cd6d2 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Sat, 25 Jan 2025 22:12:09 +0100 Subject: [PATCH 14/24] wip --- CMakeLists.txt | 3 - README.md | 26 +- main/CMakeLists.txt | 593 +++++++++++++++++++++++++++++++++++++++-- main/idf_component.yml | 11 +- main/sensor_gpio.c | 2 + main/sensor_gpio.h | 1 + main/sensor_matter.cpp | 71 +++++ scripts/install.py | 86 ++++++ 8 files changed, 754 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3caa560..9c78e1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,4 @@ add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(xiao_esp32c6_wifi_sensor) -idf_build_set_property( - CXX_COMPILE_OPTIONS - "-std=gnu++17;-Os;-DCHIP_HAVE_CONFIG_H;-Wno-overloaded-virtual" APPEND) idf_build_set_property(C_COMPILE_OPTIONS "-Os" APPEND) diff --git a/README.md b/README.md index f3bcb2d..293c00a 100644 --- a/README.md +++ b/README.md @@ -51,18 +51,20 @@ The sensor publishes data to an MQTT broker in the following JSON format: ```json { "ID": "7i29r9k9ltaxmbev", - "RSSI": -54, - "battery_voltage": 4.13, - "temperature": "24.28", - "humidity": "29.32", - "pressure": "999.54", - "connection_duration_ms": 1672 + "RSSI": -61, + "battery_voltage": 3.96, + "battery_charge": 76, + "temperature": 4.72, + "humidity": 67.85, + "pressure": 1006.84, + "connection_duration_ms": 1411 } ``` - **ID**: Unique identifier of the sensor - **RSSI**: Wi-Fi signal strength in dBm - **battery_voltage**: Current battery voltage +- **battery_charge**: Current battery charge percentage - **temperature**: Temperature reading from the BME sensor - **humidity**: Humidity reading from the BME sensor - **pressure**: Pressure reading from the BME sensor @@ -250,9 +252,15 @@ Follow these steps to set up your Smart IoT Sensor: 1. **Clone the Repository** ```bash - git clone https://github.com/BegoonLab/xiao-esp32c6-wifi-sensor + git clone --depth 1 https://github.com/BegoonLab/xiao-esp32c6-wifi-sensor + ``` + + ```bash cd xiao-esp32c6-wifi-sensor - git submodule update --init --recursive + ``` + + ```bash + python scripts/install.py ``` 2. **Install Dependencies** @@ -372,6 +380,8 @@ Pairing options: SensorXIAO_Matter_Pairing_QR.png +For production use case see the information [here](https://docs.espressif.com/projects/esp-matter/en/latest/esp32c6/production.html#the-esp-matter-mfg-tool-example). + ## Contributing Contributions are welcome! Please follow these steps: diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index e6fb5ed..6dc3a4d 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,32 +1,577 @@ +if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) + set(ESP_MATTER_SDK_PATH "../vendor/esp-matter") + + get_filename_component( + MATTER_SDK_PATH ${ESP_MATTER_SDK_PATH}/connectedhomeip/connectedhomeip/ + REALPATH) + + get_filename_component( + CHIP_ROOT ${ESP_MATTER_SDK_PATH}/connectedhomeip/connectedhomeip/ REALPATH) + # include(${ESP_MATTER_SDK_PATH}/connectedhomeip/connectedhomeip/config/esp32/components/chip/ota-image.cmake) + + set(ESP_COMPONENTS_PATH ${ESP_MATTER_SDK_PATH}/components) + + set(REQUIRE_COMPONENTS + esp_eth + freertos + lwip + bt + mbedtls + fatfs + app_update + console + openthread + nvs_flash + spi_flash + esp_secure_cert_mgr + esp_system + esp_timer + json_parser + spiffs + esp_http_client + json_generator + esp_netif + vfs + json) + + if(NOT "${IDF_TARGET}" STREQUAL "esp32h2") + list(APPEND REQUIRE_COMPONENTS mdns) + endif() + + function(collect_exclude_files PATH INCLUDE_FILES EXCLUDE_LIST) + file(GLOB ALL_FILES ${PATH}/*.cpp ${PATH}/*.c) + set(EXCLUDE_FILES "") + foreach(FILE ${ALL_FILES}) + list(FIND INCLUDE_FILES ${FILE} EXCLUDE_INDEX) + if(EXCLUDE_INDEX LESS 0) + list(APPEND EXCLUDE_FILES ${FILE}) + endif() + endforeach() + set(${EXCLUDE_LIST} + ${EXCLUDE_FILES} + PARENT_SCOPE) + endfunction() + + set(SRC_DIRS_LIST + "${MATTER_SDK_PATH}/src/access" + "${MATTER_SDK_PATH}/src/access/examples" + "${MATTER_SDK_PATH}/src/app" + "${MATTER_SDK_PATH}/src/app/MessageDef" + "${MATTER_SDK_PATH}/src/app/reporting" + "${MATTER_SDK_PATH}/src/app/server" + "${MATTER_SDK_PATH}/src/ble" + "${MATTER_SDK_PATH}/src/credentials" + "${MATTER_SDK_PATH}/src/credentials/attestation_verifier" + "${MATTER_SDK_PATH}/src/credentials/examples" + "${MATTER_SDK_PATH}/src/credentials/tests" + "${MATTER_SDK_PATH}/src/crypto" + "${MATTER_SDK_PATH}/src/inet" + "${MATTER_SDK_PATH}/src/lib/address_resolve" + "${MATTER_SDK_PATH}/src/lib/asn1" + "${MATTER_SDK_PATH}/src/lib/core" + "${MATTER_SDK_PATH}/src/lib/dnssd" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/core" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/records" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/responders" + "${MATTER_SDK_PATH}/src/lib/support" + "${MATTER_SDK_PATH}/src/lib/support/logging" + "${MATTER_SDK_PATH}/src/lib/support/verhoeff" + "${MATTER_SDK_PATH}/src/messaging" + "${MATTER_SDK_PATH}/src/platform" + "${MATTER_SDK_PATH}/src/platform/OpenThread" + "${MATTER_SDK_PATH}/src/protocols" + "${MATTER_SDK_PATH}/src/protocols/bdx" + "${MATTER_SDK_PATH}/src/protocols/echo" + "${MATTER_SDK_PATH}/src/protocols/secure_channel" + "${MATTER_SDK_PATH}/src/protocols/user_directed_commissioning" + "${MATTER_SDK_PATH}/src/setup_payload" + "${MATTER_SDK_PATH}/src/system" + "${MATTER_SDK_PATH}/src/tracing" + "${MATTER_SDK_PATH}/src/transport" + "${MATTER_SDK_PATH}/src/transport/raw" + "${MATTER_SDK_PATH}/third_party/nlfaultinjection/src" + "${MATTER_SDK_PATH}/zzz_generated/app-common/app-common/zap-generated") + + set(INCLUDE_DIRS_LIST + "${MATTER_SDK_PATH}/src" + "${MATTER_SDK_PATH}/src/include" + "${MATTER_SDK_PATH}/src/lib" + "${MATTER_SDK_PATH}/src/platform/OpenThread" + "${MATTER_SDK_PATH}/third_party/nlfaultinjection/include" + "${MATTER_SDK_PATH}/third_party/nlassert/repo/include" + "${MATTER_SDK_PATH}/third_party/nlio/repo/include" + "${MATTER_SDK_PATH}/zzz_generated/app-common") + + set(EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/controller/ExamplePersistentStorage.cpp" + "${MATTER_SDK_PATH}/src/credentials/attestation_verifier/FileAttestationTrustStore.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/CHIPCert_error_test_vectors.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/CHIPCert_test_vectors.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/CHIPCert_unit_test_vectors.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/FuzzChipCert.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/TestCertificationDeclaration.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/TestChipCert.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/TestCommissionerDUTVectors.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/TestDeviceAttestationConstruction.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/TestDeviceAttestationCredentials.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/TestFabricTable.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/TestGroupDataProvider.cpp" + "${MATTER_SDK_PATH}/src/credentials/tests/TestPersistentStorageOpCertStore.cpp" + "${MATTER_SDK_PATH}/src/crypto/CHIPCryptoPALOpenSSL.cpp" + "${MATTER_SDK_PATH}/src/crypto/CHIPCryptoPALPSA.cpp" + "${MATTER_SDK_PATH}/src/crypto/PSAOperationalKeystore.cpp" + "${MATTER_SDK_PATH}/src/crypto/PSASessionKeystore.cpp" + "${MATTER_SDK_PATH}/src/inet/TCPEndPointImplOpenThread.cpp" + "${MATTER_SDK_PATH}/src/inet/TCPEndPointImplSockets.cpp" + "${MATTER_SDK_PATH}/src/inet/UDPEndPointImplNetworkFramework.cpp" + "${MATTER_SDK_PATH}/src/inet/UDPEndPointImplOpenThread.cpp" + "${MATTER_SDK_PATH}/src/inet/UDPEndPointImplSockets.cpp" + "${MATTER_SDK_PATH}/src/lib/address_resolve/tool.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/Advertiser_ImplNone.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/Resolver_ImplNone.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/AddressPolicy_LibNlImpl.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/Logging.cpp" + "${MATTER_SDK_PATH}/src/lib/support/UnitTestRegistration.cpp" + "${MATTER_SDK_PATH}/src/lib/support/UnitTest.cpp" + "${MATTER_SDK_PATH}/src/lib/support/UnitTestUtils.cpp" + "${MATTER_SDK_PATH}/src/lib/support/JniReferences.cpp" + "${MATTER_SDK_PATH}/src/lib/support/CHIPMem-Simple.cpp" + "${MATTER_SDK_PATH}/src/lib/shell/commands/NFC.cpp" + "${MATTER_SDK_PATH}/src/platform/DeviceSafeQueue.cpp" + "${MATTER_SDK_PATH}/src/platform/SyscallStubs.cpp" + "${MATTER_SDK_PATH}/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.cpp" + "${MATTER_SDK_PATH}/src/system/SystemLayerImplSelect.cpp" + "${MATTER_SDK_PATH}/src/transport/TraceMessage.cpp") + + list(APPEND INCLUDE_DIRS_LIST "${CMAKE_CURRENT_BINARY_DIR}") + + file(GLOB CLUSTER_DIR_LIST true ${MATTER_SDK_PATH}/src/app/clusters/*) + foreach(CLUSTER_DIR ${CLUSTER_DIR_LIST}) + file(GLOB_RECURSE C_CPP_FILES "${CLUSTER_DIR}/*.c" "${CLUSTER_DIR}/*.cpp") + if(C_CPP_FILES) + list(APPEND SRC_DIRS_LIST "${CLUSTER_DIR}") + endif() + endforeach() + + list( + APPEND + SRC_DIRS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter" + "${ESP_COMPONENTS_PATH}/esp_matter/private" + "${ESP_COMPONENTS_PATH}/esp_matter/utils" + "${MATTER_SDK_PATH}/zzz_generated/app-common/app-common/zap-generated/attributes" + "${MATTER_SDK_PATH}/src/app/util" + "${ESP_COMPONENTS_PATH}/esp_matter_bridge" + "${ESP_COMPONENTS_PATH}/esp_matter_console") + + list( + APPEND + INCLUDE_DIRS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter" + "${ESP_COMPONENTS_PATH}/esp_matter/utils" + "${ESP_COMPONENTS_PATH}/esp_matter_bridge" + "${ESP_COMPONENTS_PATH}/esp_matter_console") + + if(CONFIG_ESP_MATTER_ENABLE_DATA_MODEL) + list(APPEND SRC_DIRS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter/zap_common/app") + list(APPEND INCLUDE_DIRS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter/zap_common") + endif() + + set(PRIV_INCLUDE_DIRS_LIST "${ESP_COMPONENTS_PATH}/esp_matter/private") + + if(CONFIG_ESP_MATTER_CONTROLLER_ENABLE) + list(APPEND SRC_DIRS_LIST "${ESP_COMPONENTS_PATH}/esp_matter_controller" + "${ESP_COMPONENTS_PATH}/esp_matter_controller/logger/zap-generated") + list(APPEND INCLUDE_DIRS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter_controller" + "${ESP_COMPONENTS_PATH}/esp_matter_controller/logger") + + if(CONFIG_ESP_MATTER_CONTROLLER_CUSTOM_CLUSTER_ENABLE) + list( + APPEND SRC_DIRS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter_controller/controller_custom_cluster" + ) + list( + APPEND INCLUDE_DIRS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter_controller/controller_custom_cluster" + ) + endif() + if(NOT CONFIG_ESP_MATTER_COMMISSIONER_ENABLE) + list( + APPEND + EXCLUDE_SRCS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter_controller/esp_matter_commissioner.cpp" + "${ESP_COMPONENTS_PATH}/esp_matter_controller/esp_matter_controller_pairing_command.cpp" + "${ESP_COMPONENTS_PATH}/esp_matter_controller/esp_matter_attestation_trust_store.cpp" + "${ESP_COMPONENTS_PATH}/esp_matter_controller/esp_matter_controller_group_settings.cpp" + ) + endif() + endif() + + if(CONFIG_OPENTHREAD_BORDER_ROUTER) + list(APPEND INCLUDE_DIRS_LIST "${ESP_COMPONENTS_PATH}/esp_matter_thread_br") + list(APPEND SRC_DIRS_LIST "${ESP_COMPONENTS_PATH}/esp_matter_thread_br") + if((NOT CONFIG_ENABLE_CHIP_SHELL) OR (NOT CONFIG_OPENTHREAD_CLI)) + list( + APPEND + EXCLUDE_SRCS_LIST + "${ESP_COMPONENTS_PATH}/esp_matter_thread_br/esp_matter_thread_br_console.cpp" + ) + endif() + endif() + + # ESP-IDF lets user set software version string by two ways: 1. Project's + # CMakeLists.txt file and 2. Config option It depends on + # CONFIG_APP_PROJECT_VER_FROM_CONFIG option So, below makes the same provision + # for software version number + if(CONFIG_APP_PROJECT_VER_FROM_CONFIG) + set(chip_config_software_version_number + ${CONFIG_DEVICE_SOFTWARE_VERSION_NUMBER}) + elseif(DEFINED PROJECT_VER_NUMBER) + set(chip_config_software_version_number ${PROJECT_VER_NUMBER}) + else() + set(chip_config_software_version_number 0) + endif() + + if(CONFIG_DISABLE_READ_CLIENT) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/app/BufferedReadCallback.cpp" + "${MATTER_SDK_PATH}/src/app/ClusterStateCache.cpp" + "${MATTER_SDK_PATH}/src/app/ReadClient.cpp") + endif() + + if(NOT CONFIG_BUILD_CHIP_TESTS) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/inet/InetFaultInjection.cpp" + "${MATTER_SDK_PATH}/src/lib/support/CHIPFaultInjection.cpp" + "${MATTER_SDK_PATH}/src/system/SystemFaultInjection.cpp" + "${MATTER_SDK_PATH}/third_party/nlfaultinjection/src/nlfaultinjection.cpp" + ) + endif() + + if(NOT CONFIG_USE_MINIMAL_MDNS) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/lib/dnssd/ActiveResolveAttempts.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/IncrementalResolve.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/MinimalMdnsServer.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/Parser.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/RecordData.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/ResponseSender.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/Server.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/AddressPolicy.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/core/QName.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/core/QNameString.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/core/RecordWriter.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/responders/IP.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/responders/QueryResponder.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/records/IP.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/records/ResourceRecord.cpp" + "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/AddressPolicy_DefaultImpl.cpp" + ) + else() + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/lib/dnssd/Discovery_ImplPlatform.cpp") + endif() + + if(CONFIG_ENABLE_CHIP_SHELL) + list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/lib/shell") + list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/lib/shell/commands") + set(ESP_SHELL_FILES + "${MATTER_SDK_PATH}/src/lib/shell/MainLoopESP32.cpp" + "${MATTER_SDK_PATH}/src/lib/shell/streamer_esp32.cpp" + "${MATTER_SDK_PATH}/src/lib/shell/Engine.cpp" + "${MATTER_SDK_PATH}/src/lib/shell/streamer.cpp") + collect_exclude_files("${MATTER_SDK_PATH}/src/lib/shell" + "${ESP_SHELL_FILES}" SHELL_EXCLUDE_FILES) + list(APPEND EXCLUDE_SRCS_LIST "${SHELL_EXCLUDE_FILES}") + endif() + + if(CONFIG_ENABLE_CHIP_CONTROLLER_BUILD) + list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/controller") + if(CONFIG_DISABLE_READ_CLIENT) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/controller/CHIPDeviceController.cpp" + "${MATTER_SDK_PATH}/src/controller/CommissioningWindowOpener.cpp" + "${MATTER_SDK_PATH}/src/controller/CurrentFabricRemover.cpp") + endif() + endif() + + if((NOT CONFIG_ENABLE_WIFI_STATION) AND (NOT CONFIG_ENABLE_WIFI_AP)) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/lib/shell/commands/WiFi.cpp") + endif() + + if(NOT CONFIG_ENABLE_MATTER_OVER_THREAD) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/OpenThread/DnssdImpl.cpp" + "${MATTER_SDK_PATH}/src/platform/OpenThread/GenericNetworkCommissioningThreadDriver.cpp" + "${MATTER_SDK_PATH}/src/platform/OpenThread/OpenThreadUtils.cpp" + "${MATTER_SDK_PATH}/src/platform/OpenThread/OpenThreadDnssdImpl.cpp") + endif() + + # Set up CHIP project configuration file + if(CONFIG_CHIP_PROJECT_CONFIG) + get_filename_component(CHIP_PROJECT_CONFIG ${CONFIG_CHIP_PROJECT_CONFIG} + REALPATH BASE_DIR ${CMAKE_SOURCE_DIR}) + set(CHIP_PROJECT_CONFIG "<${CHIP_PROJECT_CONFIG}>") + else() + set(CHIP_PROJECT_CONFIG "") + endif() + + if(CONFIG_ENABLE_ESP_INSIGHTS_TRACE) + list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/tracing/esp32_trace") + list(APPEND INCLUDE_DIRS_LIST + "${MATTER_SDK_PATH}/src/tracing/esp32_trace/include") + endif() + + if(CONFIG_CHIP_ENABLE_EXTERNAL_PLATFORM) + # check the source file dir if external platform is enable + if((EXISTS ${CONFIG_CHIP_EXTERNAL_PLATFORM_DIR}/external_platform.cmake)) + include(${CONFIG_CHIP_EXTERNAL_PLATFORM_DIR}/external_platform.cmake) + list(APPEND SRC_DIRS_LIST ${EXPLANT_SRC_DIRS_LIST}) + list(APPEND INCLUDE_DIRS_LIST ${EXPLANT_INCLUDE_DIRS_LIST}) + list(APPEND EXCLUDE_SRCS_LIST ${EXPLANT_EXCLUDE_SRCS_LIST}) + else() + message( + FATAL_ERROR + "CONFIG_CHIP_ENABLE_EXTERNAL_PLATFORM is set, but CONFIG_CHIP_EXTERNAL_PLATFORM_DIR is not set correctly!" + ) + endif() + else() + list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/platform/ESP32" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook") + + list( + APPEND + INCLUDE_DIRS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32" + "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid" + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook") + + if(CONFIG_USE_MINIMAL_MDNS) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/DnssdImpl.cpp") + endif() + + if((CONFIG_USE_MINIMAL_MDNS) OR ((NOT CONFIG_ENABLE_WIFI_STATION) + AND (NOT CONFIG_ENABLE_WIFI_AP))) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/WiFiDnssdImpl.cpp") + endif() + + if((NOT CONFIG_ENABLE_WIFI_STATION) AND (NOT CONFIG_ENABLE_WIFI_AP)) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ConnectivityManagerImpl_WiFi.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/NetworkCommissioningDriver.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteHook.c" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteTable.c") + endif() + + if(NOT CONFIG_ENABLE_ROUTE_HOOK) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteHook.c" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteTable.c") + endif() + + if((CONFIG_BT_ENABLED) AND (CONFIG_ENABLE_CHIPOBLE)) + if(CONFIG_BT_NIMBLE_ENABLED) + list(APPEND SRC_DIRS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble") + list( + APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid/BLEManagerImpl.cpp") + if(NOT CONFIG_ENABLE_ESP32_BLE_CONTROLLER) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid/ChipDeviceScanner.cpp" + ) + endif() + else() + list(APPEND SRC_DIRS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid") + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/BLEManagerImpl.cpp") + if(NOT CONFIG_ENABLE_ESP32_BLE_CONTROLLER) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/ChipDeviceScanner.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/misc.c" + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/peer.c") + endif() + endif() + endif() + + if(NOT CONFIG_ENABLE_ETHERNET_TELEMETRY) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ConnectivityManagerImpl_Ethernet.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/NetworkCommissioningDriver_Ethernet.cpp" + ) + endif() + + if((NOT CONFIG_OPENTHREAD_ENABLED) OR (NOT CONFIG_ENABLE_MATTER_OVER_THREAD + )) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/OpenthreadLauncher.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/ThreadStackManagerImpl.cpp") + endif() + + if(NOT CONFIG_ENABLE_OTA_REQUESTOR) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/OTAImageProcessorImpl.cpp") + endif() + + if(NOT CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32FactoryDataProvider.cpp") + endif() + + if(NOT CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32DeviceInfoProvider.cpp") + endif() + + if(NOT CONFIG_SEC_CERT_DAC_PROVIDER) + list( + APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32SecureCertDACProvider.cpp") + endif() + + if(NOT CONFIG_USE_ESP32_ECDSA_PERIPHERAL) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32CHIPCryptoPAL.cpp") + endif() + endif() + + if(NOT CONFIG_ENABLE_CHIPOBLE) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/ble/BLEEndPoint.cpp" + "${MATTER_SDK_PATH}/src/ble/BleError.cpp" + "${MATTER_SDK_PATH}/src/ble/BleLayer.cpp" + "${MATTER_SDK_PATH}/src/ble/BleUUID.cpp" + "${MATTER_SDK_PATH}/src/ble/BtpEngine.cpp") + endif() + + if(CONFIG_ENABLE_ICD_SERVER) + list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/app/icd/server/") + endif() +endif() + idf_component_register( - SRCS - "main.c" - "sensor_adc.c" - "sensor_bme.c" - "sensor_data.c" - "sensor_gpio.c" - "sensor_i2c.c" - "sensor_id.c" - "sensor_led.c" - "sensor_matter.cpp" - "sensor_mqtt.c" - "sensor_nvs.c" - "sensor_sgp.c" - "sensor_sleep.c" - "sensor_wifi.c" - "sensor_zb.c" - "../vendor/embedded-i2c-sgp41/sgp41_i2c.c" - "../vendor/embedded-i2c-sgp41/sensirion_i2c.c" - "../vendor/embedded-i2c-sgp41/sensirion_common.c" - "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm/sensirion_gas_index_algorithm.c" - "../vendor/boschsensortec/BME280_SensorAPI/bme280.c" - "../vendor/boschsensortec/BME68x_SensorAPI/bme68x.c" INCLUDE_DIRS + ${INCLUDE_DIRS_LIST} + "." + "../vendor/embedded-i2c-sgp41" + "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm" + "../vendor/boschsensortec/BME280_SensorAPI" + "../vendor/boschsensortec/BME68x_SensorAPI" + SRC_DIRS + ${SRC_DIRS_LIST} "." "../vendor/embedded-i2c-sgp41" "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm" "../vendor/boschsensortec/BME280_SensorAPI" - "../vendor/boschsensortec/BME68x_SensorAPI") + "../vendor/boschsensortec/BME68x_SensorAPI" + EXCLUDE_SRCS + ${EXCLUDE_SRCS_LIST} + PRIV_INCLUDE_DIRS + ${PRIV_INCLUDE_DIRS_LIST} + REQUIRES + ${REQUIRE_COMPONENTS}) set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17) -target_compile_options(${COMPONENT_LIB} PRIVATE "-DCHIP_HAVE_CONFIG_H") + +if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) + target_compile_options( + ${COMPONENT_LIB} + PUBLIC + "-DCHIP_ADDRESS_RESOLVE_IMPL_INCLUDE_HEADER=" + "-DCHIP_CONFIG_SOFTWARE_VERSION_NUMBER=${chip_config_software_version_number}" + ) + + if(CHIP_PROJECT_CONFIG) + target_compile_options( + ${COMPONENT_LIB} + PUBLIC "-DCHIP_PROJECT_CONFIG_INCLUDE=${CHIP_PROJECT_CONFIG}" + "-DSYSTEM_PROJECT_CONFIG_INCLUDE=${CHIP_PROJECT_CONFIG}") + endif() + + idf_build_set_property( + COMPILE_OPTIONS + "-Wno-error=uninitialized;-Wno-error=maybe-uninitialized;-Wno-format-nonliteral;-Wno-missing-field-initializers;" + APPEND) + idf_build_set_property(COMPILE_OPTIONS "-Wno-error=array-bounds" APPEND) + idf_build_set_property(COMPILE_OPTIONS "-Wno-write-strings" APPEND) + + # Time sync client feature depends on read client, disable it when read client + # is disabled. + if(CONFIG_DISABLE_READ_CLIENT) + target_compile_options(${COMPONENT_LIB} + PUBLIC "-DTIME_SYNC_ENABLE_TSC_FEATURE=0") + endif() + + if(CONFIG_USE_MINIMAL_MDNS) + target_compile_options( + ${COMPONENT_LIB} + PUBLIC "-DCHIP_MINMDNS_DEFAULT_POLICY=1" + "-DCHIP_MINMDNS_USE_EPHEMERAL_UNICAST_PORT=0" + "-DCHIP_MINMDNS_HIGH_VERBOSITY=0") + endif() + + if(NOT CMAKE_BUILD_EARLY_EXPANSION) + if(CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE) + target_compile_options(${COMPONENT_LIB} PUBLIC "-DLWIP_DEBUG=1") + endif() + endif() + + if(NOT CONFIG_ESP_MATTER_ENABLE_DATA_MODEL) + target_include_directories( + ${COMPONENT_LIB} + PUBLIC "${CMAKE_BINARY_DIR}/gen/app-codegen/cpp-app" + "${CMAKE_BINARY_DIR}/gen/app-zapgen/zapgen/app-templates") + endif() + + idf_component_get_property(freertos_dir freertos COMPONENT_DIR) + target_include_directories( + ${COMPONENT_LIB} PRIVATE "${freertos_dir}/include/freertos" + "${freertos_dir}/FreeRTOS-Kernel/include/freertos") + + target_include_directories( + ${COMPONENT_LIB} INTERFACE "${MATTER_SDK_PATH}/examples/platform/esp32") + + # Generate some include files + include(${ESP_MATTER_SDK_PATH}/generate-include-files.cmake) + + idf_component_get_property(main_lib main COMPONENT_LIB) + set(chip_libraries $) + target_link_libraries( + ${COMPONENT_LIB} INTERFACE -Wl,--start-group ${chip_libraries} + -Wl,--end-group) + + idf_build_set_property( + CXX_COMPILE_OPTIONS + "-std=gnu++17;-Os;-DCHIP_HAVE_CONFIG_H;-Wno-overloaded-virtual" APPEND) +endif() diff --git a/main/idf_component.yml b/main/idf_component.yml index e99d97b..25b261b 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,9 +1,12 @@ ## IDF Component Manager Manifest File dependencies: - espressif/esp_diag_data_store: "==1.0.2" - espressif/esp_matter: "^1.3.1" - espressif/esp-zboss-lib: "~1.5.0" - espressif/esp-zigbee-lib: "~1.5.0" + espressif/esp_diag_data_store: ==1.0.2 + espressif/esp_secure_cert_mgr: "*" + espressif/esp-zboss-lib: ~1.5.0 + espressif/esp-zigbee-lib: ~1.5.0 ## Required IDF version idf: version: ">=5.3.1" + espressif/json_parser: "*" + espressif/json_generator: "*" + espressif/mdns: "*" diff --git a/main/sensor_gpio.c b/main/sensor_gpio.c index 1b43812..bee142c 100644 --- a/main/sensor_gpio.c +++ b/main/sensor_gpio.c @@ -22,6 +22,8 @@ void init_gpio(void) { gpio_set_direction(GPIO_NUM_3, GPIO_MODE_OUTPUT); gpio_set_level(GPIO_NUM_3, LOW); + vTaskDelay(pdMS_TO_TICKS(100)); + gpio_reset_pin(GPIO_NUM_14); gpio_set_direction(GPIO_NUM_14, GPIO_MODE_OUTPUT); gpio_set_level(GPIO_NUM_14, HIGH); diff --git a/main/sensor_gpio.h b/main/sensor_gpio.h index 9d47646..a415432 100644 --- a/main/sensor_gpio.h +++ b/main/sensor_gpio.h @@ -12,5 +12,6 @@ #pragma once #include "driver/gpio.h" +#include "freertos/FreeRTOS.h" void init_gpio(void); \ No newline at end of file diff --git a/main/sensor_matter.cpp b/main/sensor_matter.cpp index 682d398..3fb4e4b 100644 --- a/main/sensor_matter.cpp +++ b/main/sensor_matter.cpp @@ -130,6 +130,7 @@ esp_err_t init_matter(void) { ESP_LOGE(TAG, "Failed to create humidity_sensor endpoint"); } + // add the pressure sensor device pressure_sensor::config_t pressure_sensor_config; endpoint_t *pressure_sensor_ep = pressure_sensor::create( node, &pressure_sensor_config, ENDPOINT_FLAG_NONE, NULL); @@ -137,6 +138,76 @@ esp_err_t init_matter(void) { ESP_LOGE(TAG, "Failed to create pressure_sensor endpoint"); } + // Set temperature + double temperature = 21.03; + uint16_t temp_endpoint_id = endpoint::get_id(temp_sensor_ep); + // chip::DeviceLayer::SystemLayer().ScheduleLambda([temp_endpoint_id, + // temperature, temp_sensor_ep]() { + cluster_t *temp_cluster = + cluster::get(temp_sensor_ep, TemperatureMeasurement::Id); + attribute_t *temp_attribute = attribute::get( + temp_cluster, TemperatureMeasurement::Attributes::MeasuredValue::Id); + if (temp_attribute == nullptr) { + ESP_LOGE(TAG, "Failed to get temp_attribute"); + } + + esp_matter_attr_val_t temp_val = esp_matter_invalid(NULL); + attribute::get_val(temp_attribute, &temp_val); + temp_val.val.u16 = static_cast(temperature * 100); + ESP_LOGI(TAG, "temp_endpoint_id %hu", temp_endpoint_id); + ESP_LOGI(TAG, "temp_cluster_id %lu", TemperatureMeasurement::Id); + ESP_LOGI(TAG, "temp_attribute_id %lu", + TemperatureMeasurement::Attributes::MeasuredValue::Id); + attribute::update(temp_endpoint_id, TemperatureMeasurement::Id, + TemperatureMeasurement::Attributes::MeasuredValue::Id, + &temp_val); + // }); + + // Set humidity + double humidity = 47.56; + uint16_t humidity_endpoint_id = endpoint::get_id(humidity_sensor_ep); + // chip::DeviceLayer::SystemLayer().ScheduleLambda([humidity_endpoint_id, + // humidity, humidity_sensor_ep]() { + cluster_t *humidity_cluster = + cluster::get(humidity_sensor_ep, RelativeHumidityMeasurement::Id); + attribute_t *humidity_attribute = attribute::get( + humidity_cluster, + RelativeHumidityMeasurement::Attributes::MeasuredValue::Id); + if (humidity_attribute == nullptr) { + ESP_LOGE(TAG, "Failed to get humidity_attribute"); + } + + esp_matter_attr_val_t humidity_val = esp_matter_invalid(NULL); + attribute::get_val(humidity_attribute, &humidity_val); + humidity_val.val.u16 = static_cast(humidity * 100); + + attribute::update(humidity_endpoint_id, RelativeHumidityMeasurement::Id, + RelativeHumidityMeasurement::Attributes::MeasuredValue::Id, + &humidity_val); + // }); + + // Set pressure + double pressure = 1001.34; + uint16_t pressure_endpoint_id = endpoint::get_id(pressure_sensor_ep); + // chip::DeviceLayer::SystemLayer().ScheduleLambda([pressure_endpoint_id, + // pressure, pressure_sensor_ep]() { + cluster_t *pressure_cluster = + cluster::get(pressure_sensor_ep, PressureMeasurement::Id); + attribute_t *pressure_attribute = attribute::get( + pressure_cluster, PressureMeasurement::Attributes::MeasuredValue::Id); + if (pressure_attribute == nullptr) { + ESP_LOGE(TAG, "Failed to get pressure_attribute"); + } + + esp_matter_attr_val_t pressure_val = esp_matter_invalid(NULL); + attribute::get_val(pressure_attribute, &pressure_val); + pressure_val.val.u16 = static_cast(pressure * 10); + + attribute::update(pressure_endpoint_id, PressureMeasurement::Id, + PressureMeasurement::Attributes::MeasuredValue::Id, + &pressure_val); + // }); + esp_openthread_platform_config_t config = { .radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(), .host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(), diff --git a/scripts/install.py b/scripts/install.py index e69de29..569b2a8 100644 --- a/scripts/install.py +++ b/scripts/install.py @@ -0,0 +1,86 @@ +import os +import subprocess +import sys +from pathlib import Path + +import git + +current_dir = os.getcwd() + + +def initialize_git_submodule(repo_path): + """ + Initialize and update a git submodule in the given path using GitPython. + """ + if not Path(repo_path).is_dir(): + print(f"Error: Directory '{repo_path}' does not exist.") + sys.exit(1) + + print(f"Initializing submodules in {repo_path}...") + + # Initialize the repo object using GitPython + try: + repo = git.Repo(repo_path) + output = repo.git.submodule("update", "--init", "--depth=1") + print(f"Updating submodules: \n{output}") + except git.exc.InvalidGitRepositoryError: + sys.exit(1) + + +def checkout_submodules(script_path, platform_args): + """ + Run the submodule checkout Python script for the given platform. + """ + script_file = Path(script_path) + if not script_file.is_file(): + print(f"Error: Script '{script_path}' not found.") + sys.exit(1) + + print( + f"Running submodule checkout script: {script_file} with arguments {platform_args}" + ) + + try: + result = subprocess.run( + ["python", str(script_file)] + platform_args, + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + print(result.stdout) + except subprocess.CalledProcessError as e: + print(f"Error running the submodule checkout script: {e.stderr}") + sys.exit(e.returncode) + + +def main(): + """ + Main automation workflow. + """ + # Step 1: Initialize main repository's submodules + print("\nStep 1: Initializing main repository submodules...") + initialize_git_submodule(current_dir) + + # Step 2: Initialize submodules in the esp-matter vendor folder + esp_matter_sdk_path = os.path.join(current_dir, "vendor", "esp-matter") + print(f"\nStep 2: Initializing submodules in {esp_matter_sdk_path}...") + initialize_git_submodule(esp_matter_sdk_path) + + # Step 3: Checkout submodules for connectedhomeip + connectedhomeip_path = os.path.join( + esp_matter_sdk_path, "connectedhomeip", "connectedhomeip" + ) + script_path = os.path.join( + connectedhomeip_path, "scripts", "checkout_submodules.py" + ) + platform_args = ["--platform", "esp32", "linux", "--shallow"] + + print(f"\nStep 3: Checking out submodules for {script_path}...") + checkout_submodules(script_path, platform_args) + + print("\n✅ Installation complete!") + + +if __name__ == "__main__": + main() From 06f2183fd8613d68e172b22daf31a5c3a3c268a9 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Tue, 28 Jan 2025 23:01:55 +0100 Subject: [PATCH 15/24] Add matter over Thread Dockerize local environment --- .gitmodules | 4 ---- README.md | 23 +++++++++++++++------ ci/docker/Dockerfile | 44 +++++++++++++++++++++++++++++++++++++++++ ci/docker/entrypoint.sh | 7 +++++++ main/CMakeLists.txt | 28 ++++++++++++++++++-------- sdkconfig.defaults | 2 ++ vendor/esp-matter | 1 - 7 files changed, 90 insertions(+), 19 deletions(-) create mode 100644 ci/docker/Dockerfile create mode 100755 ci/docker/entrypoint.sh delete mode 160000 vendor/esp-matter diff --git a/.gitmodules b/.gitmodules index 2eaa112..cd7f7c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,7 +10,3 @@ [submodule "vendor/boschsensortec/BME68x_SensorAPI"] path = vendor/boschsensortec/BME68x_SensorAPI url = https://github.com/boschsensortec/BME68x_SensorAPI -[submodule "vendor/esp-matter"] - path = vendor/esp-matter - url = https://github.com/espressif/esp-matter.git - branch = release/v1.4 diff --git a/README.md b/README.md index 293c00a..b7c8509 100644 --- a/README.md +++ b/README.md @@ -315,14 +315,16 @@ Follow these steps to set up your Smart IoT Sensor: ### Building the Firmware -1. **Install ESP-IDF** - - Follow the [ESP-IDF Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/v5.3.1/esp32/get-started/index.html) to set up the development environment. - +1. **Build dockerized environment** + ```bash + docker build ./ci/docker/ -t esp_idf_xiao_esp32c6_sensor:latest + ``` 2. **Configure the Project** ```bash - idf.py menuconfig + docker run --rm -it -v $PWD:/opt/esp/project \ + -w /opt/esp/project \ + esp_idf_xiao_esp32c6_sensor:latest idf.py menuconfig ``` - Set Wi-Fi credentials @@ -332,7 +334,16 @@ Follow these steps to set up your Smart IoT Sensor: 3. **Build and Flash** ```bash - idf.py build + docker run --rm -t -v $PWD:/opt/esp/project \ + -w /opt/esp/project \ + esp_idf_xiao_esp32c6_sensor:latest idf.py build + ``` + + ```bash + docker run --device= \ + --rm -v $PWD:/opt/esp/project \ + -w /opt/esp/project \ + -it esp_idf_xiao_esp32c6_sensor:latest \ idf.py -p flash ``` diff --git a/ci/docker/Dockerfile b/ci/docker/Dockerfile new file mode 100644 index 0000000..4e68a50 --- /dev/null +++ b/ci/docker/Dockerfile @@ -0,0 +1,44 @@ +ARG IDF_VERSION="v5.3.1" +ARG IDF_INSTALL_TARGETS="esp32c6" +ARG DEBIAN_FRONTEND=noninteractive + +FROM espressif/idf:${IDF_VERSION} AS esp-idf + +ARG ESP_MATTER_CLONE_URL=https://github.com/espressif/esp-matter.git +ARG ESP_MATTER_CHECKOUT_REF=release/v1.4 + +RUN : \ + && apt-get update \ + && DEBIAN_FRONTEND=${DEBIAN_FRONTEND} apt-get install -fy --no-install-recommends \ + libgirepository1.0-dev \ + libssl-dev \ + pkg-config \ + python3 \ + python3-pip \ + && apt-get clean \ + && apt-get autoremove -y \ + && rm -rf /var/lib/apt/lists/* \ + && : # last line + +WORKDIR /opt/esp +ENV ESP_MATTER_PATH=/opt/esp/esp-matter + +RUN set -x \ + && mkdir -p $ESP_MATTER_PATH \ + && cd $ESP_MATTER_PATH \ + && git init \ + && git remote add origin $ESP_MATTER_CLONE_URL \ + && git fetch origin --depth=1 ${ESP_MATTER_CHECKOUT_REF} \ + && git checkout FETCH_HEAD \ + && git submodule update --init --depth 1 \ + && cd ./connectedhomeip/connectedhomeip \ + && ./scripts/checkout_submodules.py --platform esp32 linux --shallow \ + && cd ../.. \ + && ./install.sh \ + && : # last line + +COPY entrypoint.sh /opt/esp/entrypoint.sh +ENTRYPOINT [ "/opt/esp/entrypoint.sh" ] +CMD [ "/bin/bash" ] + +WORKDIR /opt/esp/esp-matter \ No newline at end of file diff --git a/ci/docker/entrypoint.sh b/ci/docker/entrypoint.sh new file mode 100755 index 0000000..aeff68f --- /dev/null +++ b/ci/docker/entrypoint.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -e + +source $IDF_PATH/export.sh +source $ESP_MATTER_PATH/export.sh + +exec "$@" diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 6dc3a4d..ecdb6c1 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,5 +1,5 @@ if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) - set(ESP_MATTER_SDK_PATH "../vendor/esp-matter") + set(ESP_MATTER_SDK_PATH "/opt/esp/esp-matter") get_filename_component( MATTER_SDK_PATH ${ESP_MATTER_SDK_PATH}/connectedhomeip/connectedhomeip/ @@ -480,21 +480,33 @@ if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) endif() endif() -idf_component_register( - INCLUDE_DIRS - ${INCLUDE_DIRS_LIST} +list(APPEND INCLUDE_DIRS_LIST "${ESP_MATTER_SDK_PATH}/examples/common" + "${MATTER_SDK_PATH}/config/esp32/components" + "${ESP_MATTER_SDK_PATH}/components") + +list( + APPEND + INCLUDE_DIRS_LIST "." "../vendor/embedded-i2c-sgp41" "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm" "../vendor/boschsensortec/BME280_SensorAPI" - "../vendor/boschsensortec/BME68x_SensorAPI" - SRC_DIRS - ${SRC_DIRS_LIST} + "../vendor/boschsensortec/BME68x_SensorAPI") + +list( + APPEND + SRC_DIRS_LIST "." "../vendor/embedded-i2c-sgp41" "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm" "../vendor/boschsensortec/BME280_SensorAPI" - "../vendor/boschsensortec/BME68x_SensorAPI" + "../vendor/boschsensortec/BME68x_SensorAPI") + +idf_component_register( + INCLUDE_DIRS + ${INCLUDE_DIRS_LIST} + SRC_DIRS + ${SRC_DIRS_LIST} EXCLUDE_SRCS ${EXCLUDE_SRCS_LIST} PRIV_INCLUDE_DIRS diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 739d396..8d8627f 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -1,3 +1,5 @@ +CONFIG_IDF_TARGET="esp32c6" + # # Partition Table # diff --git a/vendor/esp-matter b/vendor/esp-matter deleted file mode 160000 index 78dfdaf..0000000 --- a/vendor/esp-matter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 78dfdaf971bc2458fea5ded2cffb2945022aab8d From d6dd9b6e8daf421b77f9a80316034666182c0755 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Wed, 29 Jan 2025 18:48:14 +0100 Subject: [PATCH 16/24] Add Matter over Thread wip --- CMakeLists.txt | 2 - README.md | 3 +- ci/docker/Dockerfile | 5 + main/CMakeLists.txt | 256 +++++++++++++++++++++---------------------- 4 files changed, 131 insertions(+), 135 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c78e1c..bc626d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,5 +8,3 @@ add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(xiao_esp32c6_wifi_sensor) - -idf_build_set_property(C_COMPILE_OPTIONS "-Os" APPEND) diff --git a/README.md b/README.md index b7c8509..feb4495 100644 --- a/README.md +++ b/README.md @@ -334,7 +334,8 @@ Follow these steps to set up your Smart IoT Sensor: 3. **Build and Flash** ```bash - docker run --rm -t -v $PWD:/opt/esp/project \ + docker run --rm -t \ + -v $PWD:/opt/esp/project \ -w /opt/esp/project \ esp_idf_xiao_esp32c6_sensor:latest idf.py build ``` diff --git a/ci/docker/Dockerfile b/ci/docker/Dockerfile index 4e68a50..d6fd9c8 100644 --- a/ci/docker/Dockerfile +++ b/ci/docker/Dockerfile @@ -37,6 +37,11 @@ RUN set -x \ && ./install.sh \ && : # last line +RUN set -x \ + && git config --global --add safe.directory /opt/esp/project \ + && git config --global --add safe.directory /opt/esp/idf/components/openthread/openthread \ + && : # last line + COPY entrypoint.sh /opt/esp/entrypoint.sh ENTRYPOINT [ "/opt/esp/entrypoint.sh" ] CMD [ "/bin/bash" ] diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index ecdb6c1..a456d10 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -339,129 +339,110 @@ if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) "${MATTER_SDK_PATH}/src/tracing/esp32_trace/include") endif() - if(CONFIG_CHIP_ENABLE_EXTERNAL_PLATFORM) - # check the source file dir if external platform is enable - if((EXISTS ${CONFIG_CHIP_EXTERNAL_PLATFORM_DIR}/external_platform.cmake)) - include(${CONFIG_CHIP_EXTERNAL_PLATFORM_DIR}/external_platform.cmake) - list(APPEND SRC_DIRS_LIST ${EXPLANT_SRC_DIRS_LIST}) - list(APPEND INCLUDE_DIRS_LIST ${EXPLANT_INCLUDE_DIRS_LIST}) - list(APPEND EXCLUDE_SRCS_LIST ${EXPLANT_EXCLUDE_SRCS_LIST}) - else() - message( - FATAL_ERROR - "CONFIG_CHIP_ENABLE_EXTERNAL_PLATFORM is set, but CONFIG_CHIP_EXTERNAL_PLATFORM_DIR is not set correctly!" - ) - endif() - else() - list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/platform/ESP32" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook") + list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/platform/ESP32" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook") + list( + APPEND + INCLUDE_DIRS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32" + "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid" + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook") + + if(CONFIG_USE_MINIMAL_MDNS) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/DnssdImpl.cpp") + endif() + + if((CONFIG_USE_MINIMAL_MDNS) OR ((NOT CONFIG_ENABLE_WIFI_STATION) + AND (NOT CONFIG_ENABLE_WIFI_AP))) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/WiFiDnssdImpl.cpp") + endif() + + if((NOT CONFIG_ENABLE_WIFI_STATION) AND (NOT CONFIG_ENABLE_WIFI_AP)) list( APPEND - INCLUDE_DIRS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32" - "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid" - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook") + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ConnectivityManagerImpl_WiFi.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/NetworkCommissioningDriver.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteHook.c" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteTable.c") + endif() - if(CONFIG_USE_MINIMAL_MDNS) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/DnssdImpl.cpp") - endif() + if(NOT CONFIG_ENABLE_ROUTE_HOOK) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteHook.c" + "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteTable.c") + endif() - if((CONFIG_USE_MINIMAL_MDNS) OR ((NOT CONFIG_ENABLE_WIFI_STATION) - AND (NOT CONFIG_ENABLE_WIFI_AP))) + if((CONFIG_BT_ENABLED) AND (CONFIG_ENABLE_CHIPOBLE)) + if(CONFIG_BT_NIMBLE_ENABLED) + list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/platform/ESP32/nimble") list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/WiFiDnssdImpl.cpp") - endif() - - if((NOT CONFIG_ENABLE_WIFI_STATION) AND (NOT CONFIG_ENABLE_WIFI_AP)) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ConnectivityManagerImpl_WiFi.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/NetworkCommissioningDriver.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteHook.c" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteTable.c") - endif() - - if(NOT CONFIG_ENABLE_ROUTE_HOOK) + "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid/BLEManagerImpl.cpp") + if(NOT CONFIG_ENABLE_ESP32_BLE_CONTROLLER) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid/ChipDeviceScanner.cpp" + ) + endif() + else() + list(APPEND SRC_DIRS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid") list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteHook.c" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteTable.c") - endif() - - if((CONFIG_BT_ENABLED) AND (CONFIG_ENABLE_CHIPOBLE)) - if(CONFIG_BT_NIMBLE_ENABLED) - list(APPEND SRC_DIRS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble") + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/BLEManagerImpl.cpp") + if(NOT CONFIG_ENABLE_ESP32_BLE_CONTROLLER) list( - APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid/BLEManagerImpl.cpp") - if(NOT CONFIG_ENABLE_ESP32_BLE_CONTROLLER) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid/ChipDeviceScanner.cpp" - ) - endif() - else() - list(APPEND SRC_DIRS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid") - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/BLEManagerImpl.cpp") - if(NOT CONFIG_ENABLE_ESP32_BLE_CONTROLLER) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/ChipDeviceScanner.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/misc.c" - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/peer.c") - endif() + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/ChipDeviceScanner.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/misc.c" + "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/peer.c") endif() endif() + endif() - if(NOT CONFIG_ENABLE_ETHERNET_TELEMETRY) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ConnectivityManagerImpl_Ethernet.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/NetworkCommissioningDriver_Ethernet.cpp" - ) - endif() + if(NOT CONFIG_ENABLE_ETHERNET_TELEMETRY) + list( + APPEND + EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ConnectivityManagerImpl_Ethernet.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/NetworkCommissioningDriver_Ethernet.cpp" + ) + endif() - if((NOT CONFIG_OPENTHREAD_ENABLED) OR (NOT CONFIG_ENABLE_MATTER_OVER_THREAD - )) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/OpenthreadLauncher.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/ThreadStackManagerImpl.cpp") - endif() + if((NOT CONFIG_OPENTHREAD_ENABLED) OR (NOT CONFIG_ENABLE_MATTER_OVER_THREAD)) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/OpenthreadLauncher.cpp" + "${MATTER_SDK_PATH}/src/platform/ESP32/ThreadStackManagerImpl.cpp") + endif() - if(NOT CONFIG_ENABLE_OTA_REQUESTOR) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/OTAImageProcessorImpl.cpp") - endif() + if(NOT CONFIG_ENABLE_OTA_REQUESTOR) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/OTAImageProcessorImpl.cpp") + endif() - if(NOT CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32FactoryDataProvider.cpp") - endif() + if(NOT CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32FactoryDataProvider.cpp") + endif() - if(NOT CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32DeviceInfoProvider.cpp") - endif() + if(NOT CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32DeviceInfoProvider.cpp") + endif() - if(NOT CONFIG_SEC_CERT_DAC_PROVIDER) - list( - APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32SecureCertDACProvider.cpp") - endif() + if(NOT CONFIG_SEC_CERT_DAC_PROVIDER) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32SecureCertDACProvider.cpp") + endif() - if(NOT CONFIG_USE_ESP32_ECDSA_PERIPHERAL) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32CHIPCryptoPAL.cpp") - endif() + if(NOT CONFIG_USE_ESP32_ECDSA_PERIPHERAL) + list(APPEND EXCLUDE_SRCS_LIST + "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32CHIPCryptoPAL.cpp") endif() if(NOT CONFIG_ENABLE_CHIPOBLE) @@ -478,29 +459,37 @@ if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) if(CONFIG_ENABLE_ICD_SERVER) list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/app/icd/server/") endif() + + # list(APPEND INCLUDE_DIRS_LIST "${ESP_MATTER_SDK_PATH}/examples/common" + # "${MATTER_SDK_PATH}/config/esp32/components" + # "${ESP_MATTER_SDK_PATH}/components") + + set(EXTRA_COMPONENT_DIRS + "${ESP_MATTER_SDK_PATH}/examples/common" + "${MATTER_SDK_PATH}/config/esp32/components" + "${ESP_MATTER_SDK_PATH}/components" ${extra_components_dirs_append}) + +endif() + +if(CONFIG_SENSOR_SGP41) + list(APPEND INCLUDE_DIRS_LIST "../vendor/embedded-i2c-sgp41" + "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm") + + list(APPEND SRC_DIRS_LIST "../vendor/embedded-i2c-sgp41" + "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm") +endif() + +if(CONFIG_SENSOR_BME280 OR CONFIG_SENSOR_BME680) + list(APPEND INCLUDE_DIRS_LIST "../vendor/boschsensortec/BME280_SensorAPI" + "../vendor/boschsensortec/BME68x_SensorAPI") + + list(APPEND SRC_DIRS_LIST "../vendor/boschsensortec/BME280_SensorAPI" + "../vendor/boschsensortec/BME68x_SensorAPI") endif() -list(APPEND INCLUDE_DIRS_LIST "${ESP_MATTER_SDK_PATH}/examples/common" - "${MATTER_SDK_PATH}/config/esp32/components" - "${ESP_MATTER_SDK_PATH}/components") - -list( - APPEND - INCLUDE_DIRS_LIST - "." - "../vendor/embedded-i2c-sgp41" - "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm" - "../vendor/boschsensortec/BME280_SensorAPI" - "../vendor/boschsensortec/BME68x_SensorAPI") - -list( - APPEND - SRC_DIRS_LIST - "." - "../vendor/embedded-i2c-sgp41" - "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm" - "../vendor/boschsensortec/BME280_SensorAPI" - "../vendor/boschsensortec/BME68x_SensorAPI") +list(APPEND INCLUDE_DIRS_LIST ".") + +list(APPEND SRC_DIRS_LIST ".") idf_component_register( INCLUDE_DIRS @@ -514,8 +503,6 @@ idf_component_register( REQUIRES ${REQUIRE_COMPONENTS}) -set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17) - if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) target_compile_options( ${COMPONENT_LIB} @@ -538,6 +525,14 @@ if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) idf_build_set_property(COMPILE_OPTIONS "-Wno-error=array-bounds" APPEND) idf_build_set_property(COMPILE_OPTIONS "-Wno-write-strings" APPEND) + # For Xtensa chips, uint32_t was defined as 'unsigned' before v5.0, and after + # IDF v5.0 it is defined as 'unsigned long', same as RISC-V. add this compile + # option to avoid format errors. + # https://github.com/espressif/esp-idf/issues/6906#issuecomment-1207373706 + if(CONFIG_IDF_TARGET_ARCH_XTENSA AND (${IDF_VERSION_MAJOR} LESS 5)) + idf_build_set_property(COMPILE_OPTIONS "-Wno-format" APPEND) + endif() + # Time sync client feature depends on read client, disable it when read client # is disabled. if(CONFIG_DISABLE_READ_CLIENT) @@ -583,7 +578,4 @@ if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) ${COMPONENT_LIB} INTERFACE -Wl,--start-group ${chip_libraries} -Wl,--end-group) - idf_build_set_property( - CXX_COMPILE_OPTIONS - "-std=gnu++17;-Os;-DCHIP_HAVE_CONFIG_H;-Wno-overloaded-virtual" APPEND) endif() From df70c62fa9af3ce46e31cac4c3cd8a7463e8bfce Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Wed, 29 Jan 2025 20:30:35 +0100 Subject: [PATCH 17/24] Add matter over Thread dockerized, here we can build using docker only --- CMakeLists.txt | 21 ++ main/CMakeLists.txt | 608 +++-------------------------------------- main/idf_component.yml | 1 + sdkconfig.defaults | 5 +- 4 files changed, 61 insertions(+), 574 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc626d2..1d17f50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,5 +6,26 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE) add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") +set(PROJECT_VER "1.0") +set(PROJECT_VER_NUMBER 1) + +set(ESP_MATTER_PATH "/opt/esp/esp-matter") +set(MATTER_SDK_PATH ${ESP_MATTER_PATH}/connectedhomeip/connectedhomeip) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +set(EXTRA_COMPONENT_DIRS + "${ESP_MATTER_PATH}/examples/common" + "${MATTER_SDK_PATH}/config/esp32/components" + "${ESP_MATTER_PATH}/components" ${extra_components_dirs_append}) + project(xiao_esp32c6_wifi_sensor) + +idf_build_set_property( + CXX_COMPILE_OPTIONS + "-std=gnu++17;-Os;-DCHIP_HAVE_CONFIG_H;-Wno-overloaded-virtual" APPEND) +idf_build_set_property(C_COMPILE_OPTIONS "-Os" APPEND) +# For RISCV chips, project_include.cmake sets -Wno-format, but does not clear +# various flags that depend on -Wformat +idf_build_set_property(COMPILE_OPTIONS + "-Wno-format-nonliteral;-Wno-format-security" APPEND) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index a456d10..f209187 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,581 +1,43 @@ -if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) - set(ESP_MATTER_SDK_PATH "/opt/esp/esp-matter") - - get_filename_component( - MATTER_SDK_PATH ${ESP_MATTER_SDK_PATH}/connectedhomeip/connectedhomeip/ - REALPATH) - - get_filename_component( - CHIP_ROOT ${ESP_MATTER_SDK_PATH}/connectedhomeip/connectedhomeip/ REALPATH) - # include(${ESP_MATTER_SDK_PATH}/connectedhomeip/connectedhomeip/config/esp32/components/chip/ota-image.cmake) - - set(ESP_COMPONENTS_PATH ${ESP_MATTER_SDK_PATH}/components) - - set(REQUIRE_COMPONENTS - esp_eth - freertos - lwip - bt - mbedtls - fatfs - app_update - console - openthread - nvs_flash - spi_flash - esp_secure_cert_mgr - esp_system - esp_timer - json_parser - spiffs - esp_http_client - json_generator - esp_netif - vfs - json) - - if(NOT "${IDF_TARGET}" STREQUAL "esp32h2") - list(APPEND REQUIRE_COMPONENTS mdns) - endif() - - function(collect_exclude_files PATH INCLUDE_FILES EXCLUDE_LIST) - file(GLOB ALL_FILES ${PATH}/*.cpp ${PATH}/*.c) - set(EXCLUDE_FILES "") - foreach(FILE ${ALL_FILES}) - list(FIND INCLUDE_FILES ${FILE} EXCLUDE_INDEX) - if(EXCLUDE_INDEX LESS 0) - list(APPEND EXCLUDE_FILES ${FILE}) - endif() - endforeach() - set(${EXCLUDE_LIST} - ${EXCLUDE_FILES} - PARENT_SCOPE) - endfunction() - - set(SRC_DIRS_LIST - "${MATTER_SDK_PATH}/src/access" - "${MATTER_SDK_PATH}/src/access/examples" - "${MATTER_SDK_PATH}/src/app" - "${MATTER_SDK_PATH}/src/app/MessageDef" - "${MATTER_SDK_PATH}/src/app/reporting" - "${MATTER_SDK_PATH}/src/app/server" - "${MATTER_SDK_PATH}/src/ble" - "${MATTER_SDK_PATH}/src/credentials" - "${MATTER_SDK_PATH}/src/credentials/attestation_verifier" - "${MATTER_SDK_PATH}/src/credentials/examples" - "${MATTER_SDK_PATH}/src/credentials/tests" - "${MATTER_SDK_PATH}/src/crypto" - "${MATTER_SDK_PATH}/src/inet" - "${MATTER_SDK_PATH}/src/lib/address_resolve" - "${MATTER_SDK_PATH}/src/lib/asn1" - "${MATTER_SDK_PATH}/src/lib/core" - "${MATTER_SDK_PATH}/src/lib/dnssd" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/core" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/records" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/responders" - "${MATTER_SDK_PATH}/src/lib/support" - "${MATTER_SDK_PATH}/src/lib/support/logging" - "${MATTER_SDK_PATH}/src/lib/support/verhoeff" - "${MATTER_SDK_PATH}/src/messaging" - "${MATTER_SDK_PATH}/src/platform" - "${MATTER_SDK_PATH}/src/platform/OpenThread" - "${MATTER_SDK_PATH}/src/protocols" - "${MATTER_SDK_PATH}/src/protocols/bdx" - "${MATTER_SDK_PATH}/src/protocols/echo" - "${MATTER_SDK_PATH}/src/protocols/secure_channel" - "${MATTER_SDK_PATH}/src/protocols/user_directed_commissioning" - "${MATTER_SDK_PATH}/src/setup_payload" - "${MATTER_SDK_PATH}/src/system" - "${MATTER_SDK_PATH}/src/tracing" - "${MATTER_SDK_PATH}/src/transport" - "${MATTER_SDK_PATH}/src/transport/raw" - "${MATTER_SDK_PATH}/third_party/nlfaultinjection/src" - "${MATTER_SDK_PATH}/zzz_generated/app-common/app-common/zap-generated") - - set(INCLUDE_DIRS_LIST - "${MATTER_SDK_PATH}/src" - "${MATTER_SDK_PATH}/src/include" - "${MATTER_SDK_PATH}/src/lib" - "${MATTER_SDK_PATH}/src/platform/OpenThread" - "${MATTER_SDK_PATH}/third_party/nlfaultinjection/include" - "${MATTER_SDK_PATH}/third_party/nlassert/repo/include" - "${MATTER_SDK_PATH}/third_party/nlio/repo/include" - "${MATTER_SDK_PATH}/zzz_generated/app-common") - - set(EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/controller/ExamplePersistentStorage.cpp" - "${MATTER_SDK_PATH}/src/credentials/attestation_verifier/FileAttestationTrustStore.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/CHIPCert_error_test_vectors.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/CHIPCert_test_vectors.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/CHIPCert_unit_test_vectors.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/FuzzChipCert.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/TestCertificationDeclaration.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/TestChipCert.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/TestCommissionerDUTVectors.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/TestDeviceAttestationConstruction.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/TestDeviceAttestationCredentials.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/TestFabricTable.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/TestGroupDataProvider.cpp" - "${MATTER_SDK_PATH}/src/credentials/tests/TestPersistentStorageOpCertStore.cpp" - "${MATTER_SDK_PATH}/src/crypto/CHIPCryptoPALOpenSSL.cpp" - "${MATTER_SDK_PATH}/src/crypto/CHIPCryptoPALPSA.cpp" - "${MATTER_SDK_PATH}/src/crypto/PSAOperationalKeystore.cpp" - "${MATTER_SDK_PATH}/src/crypto/PSASessionKeystore.cpp" - "${MATTER_SDK_PATH}/src/inet/TCPEndPointImplOpenThread.cpp" - "${MATTER_SDK_PATH}/src/inet/TCPEndPointImplSockets.cpp" - "${MATTER_SDK_PATH}/src/inet/UDPEndPointImplNetworkFramework.cpp" - "${MATTER_SDK_PATH}/src/inet/UDPEndPointImplOpenThread.cpp" - "${MATTER_SDK_PATH}/src/inet/UDPEndPointImplSockets.cpp" - "${MATTER_SDK_PATH}/src/lib/address_resolve/tool.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/Advertiser_ImplNone.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/Resolver_ImplNone.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/AddressPolicy_LibNlImpl.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/Logging.cpp" - "${MATTER_SDK_PATH}/src/lib/support/UnitTestRegistration.cpp" - "${MATTER_SDK_PATH}/src/lib/support/UnitTest.cpp" - "${MATTER_SDK_PATH}/src/lib/support/UnitTestUtils.cpp" - "${MATTER_SDK_PATH}/src/lib/support/JniReferences.cpp" - "${MATTER_SDK_PATH}/src/lib/support/CHIPMem-Simple.cpp" - "${MATTER_SDK_PATH}/src/lib/shell/commands/NFC.cpp" - "${MATTER_SDK_PATH}/src/platform/DeviceSafeQueue.cpp" - "${MATTER_SDK_PATH}/src/platform/SyscallStubs.cpp" - "${MATTER_SDK_PATH}/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread_LwIP.cpp" - "${MATTER_SDK_PATH}/src/system/SystemLayerImplSelect.cpp" - "${MATTER_SDK_PATH}/src/transport/TraceMessage.cpp") - - list(APPEND INCLUDE_DIRS_LIST "${CMAKE_CURRENT_BINARY_DIR}") - - file(GLOB CLUSTER_DIR_LIST true ${MATTER_SDK_PATH}/src/app/clusters/*) - foreach(CLUSTER_DIR ${CLUSTER_DIR_LIST}) - file(GLOB_RECURSE C_CPP_FILES "${CLUSTER_DIR}/*.c" "${CLUSTER_DIR}/*.cpp") - if(C_CPP_FILES) - list(APPEND SRC_DIRS_LIST "${CLUSTER_DIR}") - endif() - endforeach() - - list( - APPEND - SRC_DIRS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter" - "${ESP_COMPONENTS_PATH}/esp_matter/private" - "${ESP_COMPONENTS_PATH}/esp_matter/utils" - "${MATTER_SDK_PATH}/zzz_generated/app-common/app-common/zap-generated/attributes" - "${MATTER_SDK_PATH}/src/app/util" - "${ESP_COMPONENTS_PATH}/esp_matter_bridge" - "${ESP_COMPONENTS_PATH}/esp_matter_console") - - list( - APPEND - INCLUDE_DIRS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter" - "${ESP_COMPONENTS_PATH}/esp_matter/utils" - "${ESP_COMPONENTS_PATH}/esp_matter_bridge" - "${ESP_COMPONENTS_PATH}/esp_matter_console") - - if(CONFIG_ESP_MATTER_ENABLE_DATA_MODEL) - list(APPEND SRC_DIRS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter/zap_common/app") - list(APPEND INCLUDE_DIRS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter/zap_common") - endif() - - set(PRIV_INCLUDE_DIRS_LIST "${ESP_COMPONENTS_PATH}/esp_matter/private") - - if(CONFIG_ESP_MATTER_CONTROLLER_ENABLE) - list(APPEND SRC_DIRS_LIST "${ESP_COMPONENTS_PATH}/esp_matter_controller" - "${ESP_COMPONENTS_PATH}/esp_matter_controller/logger/zap-generated") - list(APPEND INCLUDE_DIRS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter_controller" - "${ESP_COMPONENTS_PATH}/esp_matter_controller/logger") - - if(CONFIG_ESP_MATTER_CONTROLLER_CUSTOM_CLUSTER_ENABLE) - list( - APPEND SRC_DIRS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter_controller/controller_custom_cluster" - ) - list( - APPEND INCLUDE_DIRS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter_controller/controller_custom_cluster" - ) - endif() - if(NOT CONFIG_ESP_MATTER_COMMISSIONER_ENABLE) - list( - APPEND - EXCLUDE_SRCS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter_controller/esp_matter_commissioner.cpp" - "${ESP_COMPONENTS_PATH}/esp_matter_controller/esp_matter_controller_pairing_command.cpp" - "${ESP_COMPONENTS_PATH}/esp_matter_controller/esp_matter_attestation_trust_store.cpp" - "${ESP_COMPONENTS_PATH}/esp_matter_controller/esp_matter_controller_group_settings.cpp" - ) - endif() - endif() - - if(CONFIG_OPENTHREAD_BORDER_ROUTER) - list(APPEND INCLUDE_DIRS_LIST "${ESP_COMPONENTS_PATH}/esp_matter_thread_br") - list(APPEND SRC_DIRS_LIST "${ESP_COMPONENTS_PATH}/esp_matter_thread_br") - if((NOT CONFIG_ENABLE_CHIP_SHELL) OR (NOT CONFIG_OPENTHREAD_CLI)) - list( - APPEND - EXCLUDE_SRCS_LIST - "${ESP_COMPONENTS_PATH}/esp_matter_thread_br/esp_matter_thread_br_console.cpp" - ) - endif() - endif() - - # ESP-IDF lets user set software version string by two ways: 1. Project's - # CMakeLists.txt file and 2. Config option It depends on - # CONFIG_APP_PROJECT_VER_FROM_CONFIG option So, below makes the same provision - # for software version number - if(CONFIG_APP_PROJECT_VER_FROM_CONFIG) - set(chip_config_software_version_number - ${CONFIG_DEVICE_SOFTWARE_VERSION_NUMBER}) - elseif(DEFINED PROJECT_VER_NUMBER) - set(chip_config_software_version_number ${PROJECT_VER_NUMBER}) - else() - set(chip_config_software_version_number 0) - endif() - - if(CONFIG_DISABLE_READ_CLIENT) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/app/BufferedReadCallback.cpp" - "${MATTER_SDK_PATH}/src/app/ClusterStateCache.cpp" - "${MATTER_SDK_PATH}/src/app/ReadClient.cpp") - endif() - - if(NOT CONFIG_BUILD_CHIP_TESTS) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/inet/InetFaultInjection.cpp" - "${MATTER_SDK_PATH}/src/lib/support/CHIPFaultInjection.cpp" - "${MATTER_SDK_PATH}/src/system/SystemFaultInjection.cpp" - "${MATTER_SDK_PATH}/third_party/nlfaultinjection/src/nlfaultinjection.cpp" - ) - endif() - - if(NOT CONFIG_USE_MINIMAL_MDNS) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/lib/dnssd/ActiveResolveAttempts.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/IncrementalResolve.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/MinimalMdnsServer.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/Parser.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/RecordData.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/ResponseSender.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/Server.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/AddressPolicy.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/core/QName.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/core/QNameString.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/core/RecordWriter.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/responders/IP.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/responders/QueryResponder.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/records/IP.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/records/ResourceRecord.cpp" - "${MATTER_SDK_PATH}/src/lib/dnssd/minimal_mdns/AddressPolicy_DefaultImpl.cpp" - ) - else() - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/lib/dnssd/Discovery_ImplPlatform.cpp") - endif() - - if(CONFIG_ENABLE_CHIP_SHELL) - list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/lib/shell") - list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/lib/shell/commands") - set(ESP_SHELL_FILES - "${MATTER_SDK_PATH}/src/lib/shell/MainLoopESP32.cpp" - "${MATTER_SDK_PATH}/src/lib/shell/streamer_esp32.cpp" - "${MATTER_SDK_PATH}/src/lib/shell/Engine.cpp" - "${MATTER_SDK_PATH}/src/lib/shell/streamer.cpp") - collect_exclude_files("${MATTER_SDK_PATH}/src/lib/shell" - "${ESP_SHELL_FILES}" SHELL_EXCLUDE_FILES) - list(APPEND EXCLUDE_SRCS_LIST "${SHELL_EXCLUDE_FILES}") - endif() - - if(CONFIG_ENABLE_CHIP_CONTROLLER_BUILD) - list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/controller") - if(CONFIG_DISABLE_READ_CLIENT) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/controller/CHIPDeviceController.cpp" - "${MATTER_SDK_PATH}/src/controller/CommissioningWindowOpener.cpp" - "${MATTER_SDK_PATH}/src/controller/CurrentFabricRemover.cpp") - endif() - endif() - - if((NOT CONFIG_ENABLE_WIFI_STATION) AND (NOT CONFIG_ENABLE_WIFI_AP)) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/lib/shell/commands/WiFi.cpp") - endif() - - if(NOT CONFIG_ENABLE_MATTER_OVER_THREAD) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/OpenThread/DnssdImpl.cpp" - "${MATTER_SDK_PATH}/src/platform/OpenThread/GenericNetworkCommissioningThreadDriver.cpp" - "${MATTER_SDK_PATH}/src/platform/OpenThread/OpenThreadUtils.cpp" - "${MATTER_SDK_PATH}/src/platform/OpenThread/OpenThreadDnssdImpl.cpp") - endif() - - # Set up CHIP project configuration file - if(CONFIG_CHIP_PROJECT_CONFIG) - get_filename_component(CHIP_PROJECT_CONFIG ${CONFIG_CHIP_PROJECT_CONFIG} - REALPATH BASE_DIR ${CMAKE_SOURCE_DIR}) - set(CHIP_PROJECT_CONFIG "<${CHIP_PROJECT_CONFIG}>") - else() - set(CHIP_PROJECT_CONFIG "") - endif() - - if(CONFIG_ENABLE_ESP_INSIGHTS_TRACE) - list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/tracing/esp32_trace") - list(APPEND INCLUDE_DIRS_LIST - "${MATTER_SDK_PATH}/src/tracing/esp32_trace/include") - endif() - - list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/platform/ESP32" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook") - - list( - APPEND - INCLUDE_DIRS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32" - "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid" - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook") - - if(CONFIG_USE_MINIMAL_MDNS) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/DnssdImpl.cpp") - endif() - - if((CONFIG_USE_MINIMAL_MDNS) OR ((NOT CONFIG_ENABLE_WIFI_STATION) - AND (NOT CONFIG_ENABLE_WIFI_AP))) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/WiFiDnssdImpl.cpp") - endif() - - if((NOT CONFIG_ENABLE_WIFI_STATION) AND (NOT CONFIG_ENABLE_WIFI_AP)) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ConnectivityManagerImpl_WiFi.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/NetworkCommissioningDriver.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteHook.c" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteTable.c") - endif() - - if(NOT CONFIG_ENABLE_ROUTE_HOOK) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteHook.c" - "${MATTER_SDK_PATH}/src/platform/ESP32/route_hook/ESP32RouteTable.c") - endif() - - if((CONFIG_BT_ENABLED) AND (CONFIG_ENABLE_CHIPOBLE)) - if(CONFIG_BT_NIMBLE_ENABLED) - list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/platform/ESP32/nimble") - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid/BLEManagerImpl.cpp") - if(NOT CONFIG_ENABLE_ESP32_BLE_CONTROLLER) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid/ChipDeviceScanner.cpp" - ) - endif() - else() - list(APPEND SRC_DIRS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/bluedroid") - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/BLEManagerImpl.cpp") - if(NOT CONFIG_ENABLE_ESP32_BLE_CONTROLLER) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/ChipDeviceScanner.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/misc.c" - "${MATTER_SDK_PATH}/src/platform/ESP32/nimble/peer.c") - endif() - endif() - endif() - - if(NOT CONFIG_ENABLE_ETHERNET_TELEMETRY) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ConnectivityManagerImpl_Ethernet.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/NetworkCommissioningDriver_Ethernet.cpp" - ) - endif() - - if((NOT CONFIG_OPENTHREAD_ENABLED) OR (NOT CONFIG_ENABLE_MATTER_OVER_THREAD)) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/OpenthreadLauncher.cpp" - "${MATTER_SDK_PATH}/src/platform/ESP32/ThreadStackManagerImpl.cpp") - endif() - - if(NOT CONFIG_ENABLE_OTA_REQUESTOR) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/OTAImageProcessorImpl.cpp") - endif() - - if(NOT CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32FactoryDataProvider.cpp") - endif() - - if(NOT CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32DeviceInfoProvider.cpp") - endif() - - if(NOT CONFIG_SEC_CERT_DAC_PROVIDER) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32SecureCertDACProvider.cpp") - endif() - - if(NOT CONFIG_USE_ESP32_ECDSA_PERIPHERAL) - list(APPEND EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/platform/ESP32/ESP32CHIPCryptoPAL.cpp") - endif() - - if(NOT CONFIG_ENABLE_CHIPOBLE) - list( - APPEND - EXCLUDE_SRCS_LIST - "${MATTER_SDK_PATH}/src/ble/BLEEndPoint.cpp" - "${MATTER_SDK_PATH}/src/ble/BleError.cpp" - "${MATTER_SDK_PATH}/src/ble/BleLayer.cpp" - "${MATTER_SDK_PATH}/src/ble/BleUUID.cpp" - "${MATTER_SDK_PATH}/src/ble/BtpEngine.cpp") - endif() - - if(CONFIG_ENABLE_ICD_SERVER) - list(APPEND SRC_DIRS_LIST "${MATTER_SDK_PATH}/src/app/icd/server/") - endif() - - # list(APPEND INCLUDE_DIRS_LIST "${ESP_MATTER_SDK_PATH}/examples/common" - # "${MATTER_SDK_PATH}/config/esp32/components" - # "${ESP_MATTER_SDK_PATH}/components") - - set(EXTRA_COMPONENT_DIRS - "${ESP_MATTER_SDK_PATH}/examples/common" - "${MATTER_SDK_PATH}/config/esp32/components" - "${ESP_MATTER_SDK_PATH}/components" ${extra_components_dirs_append}) +idf_build_get_property(matter_enabled + CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) +if(${matter_enabled}) + set(PRIV_INCLUDE_DIRS_LIST "${ESP_MATTER_PATH}/examples/common/utils") endif() -if(CONFIG_SENSOR_SGP41) - list(APPEND INCLUDE_DIRS_LIST "../vendor/embedded-i2c-sgp41" - "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm") - - list(APPEND SRC_DIRS_LIST "../vendor/embedded-i2c-sgp41" - "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm") -endif() - -if(CONFIG_SENSOR_BME280 OR CONFIG_SENSOR_BME680) - list(APPEND INCLUDE_DIRS_LIST "../vendor/boschsensortec/BME280_SensorAPI" - "../vendor/boschsensortec/BME68x_SensorAPI") - - list(APPEND SRC_DIRS_LIST "../vendor/boschsensortec/BME280_SensorAPI" - "../vendor/boschsensortec/BME68x_SensorAPI") -endif() - -list(APPEND INCLUDE_DIRS_LIST ".") - -list(APPEND SRC_DIRS_LIST ".") - idf_component_register( + SRCS + "main.c" + "sensor_nvs.c" + "sensor_wifi.c" + "sensor_mqtt.c" + "sensor_gpio.c" + "sensor_adc.c" + "sensor_bme.c" + "sensor_zb.c" + "sensor_id.c" + "sensor_led.c" + "sensor_sgp.c" + "sensor_sleep.c" + "sensor_i2c.c" + "sensor_matter.cpp" + "sensor_data.c" + "../vendor/embedded-i2c-sgp41/sgp41_i2c.c" + "../vendor/embedded-i2c-sgp41/sensirion_i2c.c" + "../vendor/embedded-i2c-sgp41/sensirion_common.c" + "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm/sensirion_gas_index_algorithm.c" + "../vendor/boschsensortec/BME280_SensorAPI/bme280.c" + "../vendor/boschsensortec/BME68x_SensorAPI/bme68x.c" INCLUDE_DIRS - ${INCLUDE_DIRS_LIST} - SRC_DIRS - ${SRC_DIRS_LIST} - EXCLUDE_SRCS - ${EXCLUDE_SRCS_LIST} + "." + "../vendor/embedded-i2c-sgp41" + "../vendor/gas-index-algorithm/sensirion_gas_index_algorithm" + "../vendor/boschsensortec/BME280_SensorAPI" + "../vendor/boschsensortec/BME68x_SensorAPI" PRIV_INCLUDE_DIRS - ${PRIV_INCLUDE_DIRS_LIST} - REQUIRES - ${REQUIRE_COMPONENTS}) - -if(CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD) - target_compile_options( - ${COMPONENT_LIB} - PUBLIC - "-DCHIP_ADDRESS_RESOLVE_IMPL_INCLUDE_HEADER=" - "-DCHIP_CONFIG_SOFTWARE_VERSION_NUMBER=${chip_config_software_version_number}" - ) - - if(CHIP_PROJECT_CONFIG) - target_compile_options( - ${COMPONENT_LIB} - PUBLIC "-DCHIP_PROJECT_CONFIG_INCLUDE=${CHIP_PROJECT_CONFIG}" - "-DSYSTEM_PROJECT_CONFIG_INCLUDE=${CHIP_PROJECT_CONFIG}") - endif() - - idf_build_set_property( - COMPILE_OPTIONS - "-Wno-error=uninitialized;-Wno-error=maybe-uninitialized;-Wno-format-nonliteral;-Wno-missing-field-initializers;" - APPEND) - idf_build_set_property(COMPILE_OPTIONS "-Wno-error=array-bounds" APPEND) - idf_build_set_property(COMPILE_OPTIONS "-Wno-write-strings" APPEND) - - # For Xtensa chips, uint32_t was defined as 'unsigned' before v5.0, and after - # IDF v5.0 it is defined as 'unsigned long', same as RISC-V. add this compile - # option to avoid format errors. - # https://github.com/espressif/esp-idf/issues/6906#issuecomment-1207373706 - if(CONFIG_IDF_TARGET_ARCH_XTENSA AND (${IDF_VERSION_MAJOR} LESS 5)) - idf_build_set_property(COMPILE_OPTIONS "-Wno-format" APPEND) - endif() - - # Time sync client feature depends on read client, disable it when read client - # is disabled. - if(CONFIG_DISABLE_READ_CLIENT) - target_compile_options(${COMPONENT_LIB} - PUBLIC "-DTIME_SYNC_ENABLE_TSC_FEATURE=0") - endif() - - if(CONFIG_USE_MINIMAL_MDNS) - target_compile_options( - ${COMPONENT_LIB} - PUBLIC "-DCHIP_MINMDNS_DEFAULT_POLICY=1" - "-DCHIP_MINMDNS_USE_EPHEMERAL_UNICAST_PORT=0" - "-DCHIP_MINMDNS_HIGH_VERBOSITY=0") - endif() - - if(NOT CMAKE_BUILD_EARLY_EXPANSION) - if(CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE) - target_compile_options(${COMPONENT_LIB} PUBLIC "-DLWIP_DEBUG=1") - endif() - endif() - - if(NOT CONFIG_ESP_MATTER_ENABLE_DATA_MODEL) - target_include_directories( - ${COMPONENT_LIB} - PUBLIC "${CMAKE_BINARY_DIR}/gen/app-codegen/cpp-app" - "${CMAKE_BINARY_DIR}/gen/app-zapgen/zapgen/app-templates") - endif() - - idf_component_get_property(freertos_dir freertos COMPONENT_DIR) - target_include_directories( - ${COMPONENT_LIB} PRIVATE "${freertos_dir}/include/freertos" - "${freertos_dir}/FreeRTOS-Kernel/include/freertos") - - target_include_directories( - ${COMPONENT_LIB} INTERFACE "${MATTER_SDK_PATH}/examples/platform/esp32") - - # Generate some include files - include(${ESP_MATTER_SDK_PATH}/generate-include-files.cmake) - - idf_component_get_property(main_lib main COMPONENT_LIB) - set(chip_libraries $) - target_link_libraries( - ${COMPONENT_LIB} INTERFACE -Wl,--start-group ${chip_libraries} - -Wl,--end-group) + ${PRIV_INCLUDE_DIRS_LIST}) +if(${matter_enabled}) + set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17) + target_compile_options(${COMPONENT_LIB} PRIVATE "-DCHIP_HAVE_CONFIG_H") endif() diff --git a/main/idf_component.yml b/main/idf_component.yml index 25b261b..f920e18 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,5 +1,6 @@ ## IDF Component Manager Manifest File dependencies: + espressif/button: "=2.5.0" espressif/esp_diag_data_store: ==1.0.2 espressif/esp_secure_cert_mgr: "*" espressif/esp-zboss-lib: ~1.5.0 diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 8d8627f..853d0df 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -142,4 +142,7 @@ CONFIG_MBEDTLS_HKDF_C=y CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 # Enable OTA Requestor -CONFIG_ENABLE_OTA_REQUESTOR=y \ No newline at end of file +CONFIG_ENABLE_OTA_REQUESTOR=y + +CONFIG_THREAD_NETWORK_ENDPOINT_ID=0 +CONFIG_WIFI_NETWORK_ENDPOINT_ID=2 \ No newline at end of file From ca8dc0b3aae86961f1b99a72377e4ab031851afc Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Thu, 30 Jan 2025 17:32:12 +0100 Subject: [PATCH 18/24] Add matter over Thread add ci build test --- .github/workflows/build.yml | 20 +++++ README.md | 3 +- ci/docker/Dockerfile | 2 + main/sensor_matter.cpp | 4 + sdkconfig.ci.matter | 151 ++++++++++++++++++++++++++++++++++++ sdkconfig.ci.wifi | 151 ++++++++++++++++++++++++++++++++++++ sdkconfig.ci.zigbee | 151 ++++++++++++++++++++++++++++++++++++ 7 files changed, 481 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build.yml create mode 100644 sdkconfig.ci.matter create mode 100644 sdkconfig.ci.wifi create mode 100644 sdkconfig.ci.zigbee diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..05a3f56 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,20 @@ +name: Build + +on: + push: + branches: + - "main" + - "feature/*" + + workflow_dispatch: + +jobs: + build-docker-image: + runs-on: ubuntu-latest + steps: + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ secrets.GITHUB_USERNAME }} + password: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index feb4495..b425836 100644 --- a/README.md +++ b/README.md @@ -322,7 +322,8 @@ Follow these steps to set up your Smart IoT Sensor: 2. **Configure the Project** ```bash - docker run --rm -it -v $PWD:/opt/esp/project \ + docker run --rm -it \ + -v $PWD:/opt/esp/project \ -w /opt/esp/project \ esp_idf_xiao_esp32c6_sensor:latest idf.py menuconfig ``` diff --git a/ci/docker/Dockerfile b/ci/docker/Dockerfile index d6fd9c8..2cd193c 100644 --- a/ci/docker/Dockerfile +++ b/ci/docker/Dockerfile @@ -40,6 +40,8 @@ RUN set -x \ RUN set -x \ && git config --global --add safe.directory /opt/esp/project \ && git config --global --add safe.directory /opt/esp/idf/components/openthread/openthread \ + && mkdir -p /.cache/Espressif/ComponentManager \ + && chmod -R 755 /.cache/Espressif/ComponentManager \ && : # last line COPY entrypoint.sh /opt/esp/entrypoint.sh diff --git a/main/sensor_matter.cpp b/main/sensor_matter.cpp index 3fb4e4b..584079f 100644 --- a/main/sensor_matter.cpp +++ b/main/sensor_matter.cpp @@ -10,6 +10,8 @@ * All rights reserved. */ +#ifdef CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD + #include "sensor_matter.h" #include "esp_matter.h" #include "esp_matter_ota.h" @@ -217,3 +219,5 @@ esp_err_t init_matter(void) { return ESP_OK; } + +#endif \ No newline at end of file diff --git a/sdkconfig.ci.matter b/sdkconfig.ci.matter new file mode 100644 index 0000000..40a9d83 --- /dev/null +++ b/sdkconfig.ci.matter @@ -0,0 +1,151 @@ +CONFIG_IDF_TARGET="esp32c6" +CONFIG_SENSOR_CONNECTION_MATTER_OVER_THREAD=y +CONFIG_SENSOR_BME280=y +CONFIG_ENABLE_BATTERY_CHECK=y + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +# end of Compiler options + +# +# mbedTLS +# +CONFIG_MBEDTLS_HARDWARE_AES=n +CONFIG_MBEDTLS_HARDWARE_MPI=n +CONFIG_MBEDTLS_HARDWARE_SHA=n +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_SSL_PROTO_DTLS=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECJPAKE=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_ECJPAKE_C=y +# end of mbedTLS + +# +# Zboss +# +CONFIG_ZB_ENABLED=y +CONFIG_ZB_ZED=y +# end of Zboss +# end of Component config + +# +# Log output +# +CONFIG_LOG_DEFAULT_LEVEL_NONE=y +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=0 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_ERROR is not set +# CONFIG_LOG_MAXIMUM_LEVEL_WARN is not set +# CONFIG_LOG_MAXIMUM_LEVEL_INFO is not set +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=0 +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set + +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_PERF=y + +# +# PHY +# +CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION=y + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" + +# +# OpenThread +# +CONFIG_OPENTHREAD_ENABLED=y +CONFIG_OPENTHREAD_BORDER_ROUTER=n +CONFIG_OPENTHREAD_DNS64_CLIENT=y +# CONFIG_OPENTHREAD_CLI is not set +# end of OpenThread + +# +# lwIP +# +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096 +CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_ND6=y +# end of lwIP + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +# end of IEEE 802.15.4 + +#enable BT +CONFIG_BT_ENABLED=y +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=y + +#disable BT connection reattempt +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n + +#enable lwip ipv6 autoconfig +CONFIG_LWIP_IPV6_AUTOCONFIG=y + +#enable lwIP route hooks +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y + +# disable softap by default +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n + +CONFIG_ENABLE_WIFI_AP=n + +# Enable HKDF in mbedtls +CONFIG_MBEDTLS_HKDF_C=y + +# Increase LwIP IPv6 address number to 6 (MAX_FABRIC + 1) +# unique local addresses for fabrics(MAX_FABRIC), a link local address(1) +CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 + +# Enable OTA Requestor +CONFIG_ENABLE_OTA_REQUESTOR=y + +CONFIG_THREAD_NETWORK_ENDPOINT_ID=0 +CONFIG_WIFI_NETWORK_ENDPOINT_ID=2 \ No newline at end of file diff --git a/sdkconfig.ci.wifi b/sdkconfig.ci.wifi new file mode 100644 index 0000000..dd13ee9 --- /dev/null +++ b/sdkconfig.ci.wifi @@ -0,0 +1,151 @@ +CONFIG_IDF_TARGET="esp32c6" +CONFIG_SENSOR_CONNECTION_WIFI_MQTT=y +CONFIG_SENSOR_BME280=y +CONFIG_ENABLE_BATTERY_CHECK=y + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +# end of Compiler options + +# +# mbedTLS +# +CONFIG_MBEDTLS_HARDWARE_AES=n +CONFIG_MBEDTLS_HARDWARE_MPI=n +CONFIG_MBEDTLS_HARDWARE_SHA=n +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_SSL_PROTO_DTLS=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECJPAKE=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_ECJPAKE_C=y +# end of mbedTLS + +# +# Zboss +# +CONFIG_ZB_ENABLED=y +CONFIG_ZB_ZED=y +# end of Zboss +# end of Component config + +# +# Log output +# +CONFIG_LOG_DEFAULT_LEVEL_NONE=y +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=0 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_ERROR is not set +# CONFIG_LOG_MAXIMUM_LEVEL_WARN is not set +# CONFIG_LOG_MAXIMUM_LEVEL_INFO is not set +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=0 +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set + +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_PERF=y + +# +# PHY +# +CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION=y + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" + +# +# OpenThread +# +CONFIG_OPENTHREAD_ENABLED=y +CONFIG_OPENTHREAD_BORDER_ROUTER=n +CONFIG_OPENTHREAD_DNS64_CLIENT=y +# CONFIG_OPENTHREAD_CLI is not set +# end of OpenThread + +# +# lwIP +# +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096 +CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_ND6=y +# end of lwIP + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +# end of IEEE 802.15.4 + +#enable BT +CONFIG_BT_ENABLED=y +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=y + +#disable BT connection reattempt +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n + +#enable lwip ipv6 autoconfig +CONFIG_LWIP_IPV6_AUTOCONFIG=y + +#enable lwIP route hooks +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y + +# disable softap by default +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n + +CONFIG_ENABLE_WIFI_AP=n + +# Enable HKDF in mbedtls +CONFIG_MBEDTLS_HKDF_C=y + +# Increase LwIP IPv6 address number to 6 (MAX_FABRIC + 1) +# unique local addresses for fabrics(MAX_FABRIC), a link local address(1) +CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 + +# Enable OTA Requestor +CONFIG_ENABLE_OTA_REQUESTOR=y + +CONFIG_THREAD_NETWORK_ENDPOINT_ID=0 +CONFIG_WIFI_NETWORK_ENDPOINT_ID=2 \ No newline at end of file diff --git a/sdkconfig.ci.zigbee b/sdkconfig.ci.zigbee new file mode 100644 index 0000000..1321d5c --- /dev/null +++ b/sdkconfig.ci.zigbee @@ -0,0 +1,151 @@ +CONFIG_IDF_TARGET="esp32c6" +CONFIG_SENSOR_CONNECTION_ZIGBEE=y +CONFIG_SENSOR_BME280=y +CONFIG_ENABLE_BATTERY_CHECK=y + +# +# Partition Table +# +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +# end of Compiler options + +# +# mbedTLS +# +CONFIG_MBEDTLS_HARDWARE_AES=n +CONFIG_MBEDTLS_HARDWARE_MPI=n +CONFIG_MBEDTLS_HARDWARE_SHA=n +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_SSL_PROTO_DTLS=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECJPAKE=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_ECJPAKE_C=y +# end of mbedTLS + +# +# Zboss +# +CONFIG_ZB_ENABLED=y +CONFIG_ZB_ZED=y +# end of Zboss +# end of Component config + +# +# Log output +# +CONFIG_LOG_DEFAULT_LEVEL_NONE=y +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=0 +CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_ERROR is not set +# CONFIG_LOG_MAXIMUM_LEVEL_WARN is not set +# CONFIG_LOG_MAXIMUM_LEVEL_INFO is not set +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=0 +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_COLORS=y +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Log output + +# CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set + +# +# Compiler options +# +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_PERF=y + +# +# PHY +# +CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION=y + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" + +# +# OpenThread +# +CONFIG_OPENTHREAD_ENABLED=y +CONFIG_OPENTHREAD_BORDER_ROUTER=n +CONFIG_OPENTHREAD_DNS64_CLIENT=y +# CONFIG_OPENTHREAD_CLI is not set +# end of OpenThread + +# +# lwIP +# +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096 +CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_ND6=y +# end of lwIP + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +# end of IEEE 802.15.4 + +#enable BT +CONFIG_BT_ENABLED=y +CONFIG_BT_NIMBLE_ENABLED=y +CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=y + +#disable BT connection reattempt +CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n + +#enable lwip ipv6 autoconfig +CONFIG_LWIP_IPV6_AUTOCONFIG=y + +#enable lwIP route hooks +CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y +CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y + +# disable softap by default +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n + +CONFIG_ENABLE_WIFI_AP=n + +# Enable HKDF in mbedtls +CONFIG_MBEDTLS_HKDF_C=y + +# Increase LwIP IPv6 address number to 6 (MAX_FABRIC + 1) +# unique local addresses for fabrics(MAX_FABRIC), a link local address(1) +CONFIG_LWIP_IPV6_NUM_ADDRESSES=6 + +# Enable OTA Requestor +CONFIG_ENABLE_OTA_REQUESTOR=y + +CONFIG_THREAD_NETWORK_ENDPOINT_ID=0 +CONFIG_WIFI_NETWORK_ENDPOINT_ID=2 \ No newline at end of file From 47d51eb6f222693c185ad8b50d6b80e8916c9ad6 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Thu, 30 Jan 2025 18:13:40 +0100 Subject: [PATCH 19/24] Add matter over Thread add ci build test --- .github/workflows/build.yml | 28 ++++++++++-- .trunk/configs/.hadolint.yaml | 4 ++ .trunk/configs/.shellcheckrc | 7 +++ .trunk/trunk.yaml | 24 ++++++---- README.md | 17 +++++-- ci/docker/entrypoint.sh | 4 +- main/idf_component.yml | 2 +- scripts/install.py | 86 ----------------------------------- 8 files changed, 65 insertions(+), 107 deletions(-) create mode 100644 .trunk/configs/.hadolint.yaml create mode 100644 .trunk/configs/.shellcheckrc delete mode 100644 scripts/install.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 05a3f56..c3499ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,18 +3,36 @@ name: Build on: push: branches: - - "main" - - "feature/*" + - main + - feature/* workflow_dispatch: +permissions: read-all + jobs: - build-docker-image: + trunk_check: + name: Trunk Check + runs-on: ubuntu-latest + permissions: + checks: write # For trunk to post annotations + contents: read # For repo checkout + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Trunk Check + uses: trunk-io/trunk-action@v1 + + build_docker_image: + name: Build docker image runs-on: ubuntu-latest + needs: trunk_check steps: - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io - username: ${{ secrets.GITHUB_USERNAME }} - password: ${{ secrets.GITHUB_TOKEN }} + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.trunk/configs/.hadolint.yaml b/.trunk/configs/.hadolint.yaml new file mode 100644 index 0000000..98bf0cd --- /dev/null +++ b/.trunk/configs/.hadolint.yaml @@ -0,0 +1,4 @@ +# Following source doesn't work in most setups +ignored: + - SC1090 + - SC1091 diff --git a/.trunk/configs/.shellcheckrc b/.trunk/configs/.shellcheckrc new file mode 100644 index 0000000..8c7b1ad --- /dev/null +++ b/.trunk/configs/.shellcheckrc @@ -0,0 +1,7 @@ +enable=all +source-path=SCRIPTDIR +disable=SC2154 + +# If you're having issues with shellcheck following source, disable the errors via: +# disable=SC1090 +# disable=SC1091 diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 766e798..c617f0a 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -2,35 +2,40 @@ # To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml version: 0.1 cli: - version: 1.22.8 + version: 1.22.9 # Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins) plugins: sources: - id: trunk - ref: v1.6.6 + ref: v1.6.7 uri: https://github.com/trunk-io/plugins # Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes) runtimes: enabled: + - go@1.21.0 - node@18.20.5 - python@3.10.8 # This is the section where you manage your linters. (https://docs.trunk.io/check/configuration) lint: enabled: + - actionlint@1.7.7 + - hadolint@2.12.1-beta + - shellcheck@0.10.0 + - shfmt@3.6.0 - taplo@0.9.3 - clang-format@16.0.3 - cmake-format@0.6.13 - clang-tidy@16.0.3 - - bandit@1.8.0 - - black@24.10.0 - - checkov@3.2.344 + - bandit@1.8.2 + - black@25.1.0 + - checkov@3.2.358 - git-diff-check - - isort@5.13.2 - - markdownlint@0.43.0 + - isort@6.0.0 + - markdownlint@0.44.0 - oxipng@9.1.3 - prettier@3.4.2 - - ruff@0.8.4 - - trufflehog@3.88.0 + - ruff@0.9.3 + - trufflehog@3.88.3 - yamllint@1.35.1 ignore: - linters: [ALL] @@ -40,6 +45,7 @@ lint: - venv/** - cmake-*/** - vendor/** + - ci/docker/Dockerfile actions: enabled: - trunk-announce diff --git a/README.md b/README.md index b425836..15fdd23 100644 --- a/README.md +++ b/README.md @@ -311,7 +311,7 @@ Follow these steps to set up your Smart IoT Sensor: ### Dependencies -- **ESP-IDF**: [Official development framework](https://docs.espressif.com/projects/esp-idf/en/v5.3.1/esp32/get-started/index.html#software) for Espressif chips. +- **Docker**: [Install docker](https://docs.docker.com/engine/install/). ### Building the Firmware @@ -353,14 +353,20 @@ When a sensor misbehaves, it's helpful to output logs to diagnose the issue. By 1. Open the configuration menu: ```bash - idf.py menuconfig + docker run --rm -it \ + -v $PWD:/opt/esp/project \ + -w /opt/esp/project \ + esp_idf_xiao_esp32c6_sensor:latest idf.py menuconfig ``` 2. Navigate to: `Component config` → `Log output` → `Default log verbosity`. 3. Set the verbosity level to `Info`. 4. Save the changes, and then execute the following command to build, flash, and monitor: ```bash - idf.py -p build flash monitor + docker run --device= \ + --rm -v $PWD:/opt/esp/project \ + -w /opt/esp/project \ + -it esp_idf_xiao_esp32c6_sensor:latest idf.py -p build flash monitor ``` ## ZigBee @@ -368,7 +374,10 @@ When a sensor misbehaves, it's helpful to output logs to diagnose the issue. By ZigBee can be activated in the menu: ```bash -idf.py menuconfig +docker run --rm -it \ + -v $PWD:/opt/esp/project \ + -w /opt/esp/project \ + esp_idf_xiao_esp32c6_sensor:latest idf.py menuconfig ``` Navigate to `XIAO Sensor Configuration` → `Select Sensor Connection Type` → `ZigBee`. diff --git a/ci/docker/entrypoint.sh b/ci/docker/entrypoint.sh index aeff68f..fe9532b 100755 --- a/ci/docker/entrypoint.sh +++ b/ci/docker/entrypoint.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -e -source $IDF_PATH/export.sh -source $ESP_MATTER_PATH/export.sh +source "${IDF_PATH}"/export.sh +source "${ESP_MATTER_PATH}"/export.sh exec "$@" diff --git a/main/idf_component.yml b/main/idf_component.yml index f920e18..4e1b3b5 100644 --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,6 +1,6 @@ ## IDF Component Manager Manifest File dependencies: - espressif/button: "=2.5.0" + espressif/button: =2.5.0 espressif/esp_diag_data_store: ==1.0.2 espressif/esp_secure_cert_mgr: "*" espressif/esp-zboss-lib: ~1.5.0 diff --git a/scripts/install.py b/scripts/install.py deleted file mode 100644 index 569b2a8..0000000 --- a/scripts/install.py +++ /dev/null @@ -1,86 +0,0 @@ -import os -import subprocess -import sys -from pathlib import Path - -import git - -current_dir = os.getcwd() - - -def initialize_git_submodule(repo_path): - """ - Initialize and update a git submodule in the given path using GitPython. - """ - if not Path(repo_path).is_dir(): - print(f"Error: Directory '{repo_path}' does not exist.") - sys.exit(1) - - print(f"Initializing submodules in {repo_path}...") - - # Initialize the repo object using GitPython - try: - repo = git.Repo(repo_path) - output = repo.git.submodule("update", "--init", "--depth=1") - print(f"Updating submodules: \n{output}") - except git.exc.InvalidGitRepositoryError: - sys.exit(1) - - -def checkout_submodules(script_path, platform_args): - """ - Run the submodule checkout Python script for the given platform. - """ - script_file = Path(script_path) - if not script_file.is_file(): - print(f"Error: Script '{script_path}' not found.") - sys.exit(1) - - print( - f"Running submodule checkout script: {script_file} with arguments {platform_args}" - ) - - try: - result = subprocess.run( - ["python", str(script_file)] + platform_args, - check=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - text=True, - ) - print(result.stdout) - except subprocess.CalledProcessError as e: - print(f"Error running the submodule checkout script: {e.stderr}") - sys.exit(e.returncode) - - -def main(): - """ - Main automation workflow. - """ - # Step 1: Initialize main repository's submodules - print("\nStep 1: Initializing main repository submodules...") - initialize_git_submodule(current_dir) - - # Step 2: Initialize submodules in the esp-matter vendor folder - esp_matter_sdk_path = os.path.join(current_dir, "vendor", "esp-matter") - print(f"\nStep 2: Initializing submodules in {esp_matter_sdk_path}...") - initialize_git_submodule(esp_matter_sdk_path) - - # Step 3: Checkout submodules for connectedhomeip - connectedhomeip_path = os.path.join( - esp_matter_sdk_path, "connectedhomeip", "connectedhomeip" - ) - script_path = os.path.join( - connectedhomeip_path, "scripts", "checkout_submodules.py" - ) - platform_args = ["--platform", "esp32", "linux", "--shallow"] - - print(f"\nStep 3: Checking out submodules for {script_path}...") - checkout_submodules(script_path, platform_args) - - print("\n✅ Installation complete!") - - -if __name__ == "__main__": - main() From 5c3db3ca20ab9ae224fdd1e69ed9ad00c0d05b0d Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Thu, 30 Jan 2025 18:32:56 +0100 Subject: [PATCH 20/24] Add matter over Thread add ci build test --- .github/workflows/build.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c3499ae..dd30a6b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,9 +30,27 @@ jobs: runs-on: ubuntu-latest needs: trunk_check steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push + uses: docker/build-push-action@v6 + with: + push: true + context: ./ci/docker/ + tags: esp_idf_xiao_esp32c6_sensor:latest + cache-from: type=gha + cache-to: type=gha,mode=max From 8a5557023a6bacee348ef8ac77209f9985ee1973 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Thu, 30 Jan 2025 19:25:47 +0100 Subject: [PATCH 21/24] Add matter over Thread add ci build test --- .github/workflows/build.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dd30a6b..97b0e70 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,6 +51,21 @@ jobs: with: push: true context: ./ci/docker/ - tags: esp_idf_xiao_esp32c6_sensor:latest + tags: ghcr.io/BegoonLab/esp_idf_xiao_esp32c6_sensor:latest cache-from: type=gha cache-to: type=gha,mode=max + + build_for_wifi: + name: Build firmware for WiFi setup + runs-on: ubuntu-latest + needs: build_docker_image + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Build firmware + run: | + docker run --rm -t \ + -v $PWD:/opt/esp/project \ + -w /opt/esp/project \ + ghcr.io/BegoonLab/esp_idf_xiao_esp32c6_sensor:latest idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.ci.wifi" build From 3f9f0d03b3b3467351e220861a2c367bd2e63c1e Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Thu, 30 Jan 2025 19:28:33 +0100 Subject: [PATCH 22/24] Add matter over Thread add ci build test --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 97b0e70..f18d6aa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,7 +51,7 @@ jobs: with: push: true context: ./ci/docker/ - tags: ghcr.io/BegoonLab/esp_idf_xiao_esp32c6_sensor:latest + tags: ghcr.io/begoonlab/esp_idf_xiao_esp32c6_sensor:latest cache-from: type=gha cache-to: type=gha,mode=max @@ -68,4 +68,4 @@ jobs: docker run --rm -t \ -v $PWD:/opt/esp/project \ -w /opt/esp/project \ - ghcr.io/BegoonLab/esp_idf_xiao_esp32c6_sensor:latest idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.ci.wifi" build + ghcr.io/begoonlab/esp_idf_xiao_esp32c6_sensor:latest idf.py -D SDKCONFIG_DEFAULTS="sdkconfig.ci.wifi" build From d7a29315af80ad7b297f2b03c06070ca9b0cf9e7 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Thu, 30 Jan 2025 19:28:52 +0100 Subject: [PATCH 23/24] Add matter over Thread add ci build test From eeeab841c8b89ac4921c9136049f7a68e25ac585 Mon Sep 17 00:00:00 2001 From: Alexander Begoon Date: Thu, 30 Jan 2025 19:45:22 +0100 Subject: [PATCH 24/24] Add matter over Thread add ci build test --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f18d6aa..f17402c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,6 +29,10 @@ jobs: name: Build docker image runs-on: ubuntu-latest needs: trunk_check + permissions: + contents: read + packages: write + steps: - name: Checkout uses: actions/checkout@v4