From a72d640d9391122a4018218df6e2adfdcb877d94 Mon Sep 17 00:00:00 2001 From: Piyush Shah Date: Mon, 6 Jun 2022 16:09:39 +0530 Subject: [PATCH 1/7] json: Update the json parser and generator submodules Also remove the logic to upload them to idf component manager, because that is now managed from idf-extra-components --- .github/workflows/upload_components.yml | 21 --------------------- components/json_generator/upstream | 2 +- components/json_parser/upstream | 2 +- 3 files changed, 2 insertions(+), 23 deletions(-) delete mode 100644 .github/workflows/upload_components.yml diff --git a/.github/workflows/upload_components.yml b/.github/workflows/upload_components.yml deleted file mode 100644 index 49abab8..0000000 --- a/.github/workflows/upload_components.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Push components to Espressif Component Service - -on: - push: - branches: - - master - -jobs: - upload_components: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - with: - submodules: "recursive" - - - name: Upload components to compoent service - uses: espressif/github-actions/upload_components@master - with: - directories: "components/json_generator;components/json_parser" - namespace: "espressif" - api_token: ${{ secrets.IDF_COMPONENT_API_TOKEN }} diff --git a/components/json_generator/upstream b/components/json_generator/upstream index adc1cb0..17507cc 160000 --- a/components/json_generator/upstream +++ b/components/json_generator/upstream @@ -1 +1 @@ -Subproject commit adc1cb0cd037eb089d12088f2eabf4ce7c5043d8 +Subproject commit 17507cce331e8e2056593dc01f5adf0a8b6f63ef diff --git a/components/json_parser/upstream b/components/json_parser/upstream index d049e71..8a60b7a 160000 --- a/components/json_parser/upstream +++ b/components/json_parser/upstream @@ -1 +1 @@ -Subproject commit d049e7103f667c53a45bee5d27b7c15cb13b48c7 +Subproject commit 8a60b7aa5e9b790686a73c4f992bf0b988a45b7f From cd124239127d88037c23ea7a4401210516d66e21 Mon Sep 17 00:00:00 2001 From: Piyush Shah Date: Thu, 2 Jun 2022 15:29:08 +0530 Subject: [PATCH 2/7] bugfix: Compilation fixes for different idf versions and targets --- components/esp-insights | 2 +- components/esp_rainmaker/CMakeLists.txt | 3 +-- .../esp_rainmaker/src/ota/esp_rmaker_ota.c | 2 +- .../esp_schedule/src/esp_schedule_nvs.c | 21 +++++++++++++++++++ examples/homekit_switch/CMakeLists.txt | 2 +- examples/homekit_switch/main/app_homekit.c | 2 +- examples/homekit_switch/main/app_main.c | 2 +- examples/multi_device/main/app_driver.c | 2 +- 8 files changed, 28 insertions(+), 8 deletions(-) diff --git a/components/esp-insights b/components/esp-insights index 3d8b5d4..1d6bb17 160000 --- a/components/esp-insights +++ b/components/esp-insights @@ -1 +1 @@ -Subproject commit 3d8b5d44dc6a94b9c35faf7a8e75d06a059c2364 +Subproject commit 1d6bb172ef5308073f59260c1ed25078f33521f3 diff --git a/components/esp_rainmaker/CMakeLists.txt b/components/esp_rainmaker/CMakeLists.txt index c36bb23..2af9e66 100644 --- a/components/esp_rainmaker/CMakeLists.txt +++ b/components/esp_rainmaker/CMakeLists.txt @@ -12,8 +12,7 @@ set(core_srcs "src/core/esp_rmaker_core.c" "src/core/esp_rmaker_schedule.c" "src/core/esp_rmaker_scenes.c") -set(priv_req protobuf-c json_parser json_generator wifi_provisioning nvs_flash esp_http_client app_update esp-tls mbedtls esp_https_ota console esp_local_ctrl esp_https_server mdns esp_schedule) - +set(priv_req protobuf-c json_parser json_generator wifi_provisioning nvs_flash esp_http_client app_update esp-tls mbedtls esp_https_ota console esp_local_ctrl esp_https_server mdns esp_schedule efuse) if(CONFIG_ESP_RMAKER_ASSISTED_CLAIM) list(APPEND core_srcs diff --git a/components/esp_rainmaker/src/ota/esp_rmaker_ota.c b/components/esp_rainmaker/src/ota/esp_rmaker_ota.c index 8129734..42734c4 100644 --- a/components/esp_rainmaker/src/ota/esp_rmaker_ota.c +++ b/components/esp_rainmaker/src/ota/esp_rmaker_ota.c @@ -161,7 +161,7 @@ esp_err_t esp_rmaker_ota_default_cb(esp_rmaker_ota_handle_t ota_handle, esp_rmak esp_err_t ota_finish_err = ESP_OK; esp_http_client_config_t config = { .url = ota_data->url, -#ifdef CONFIG_ESP_RMAKER_USE_CERT_BUNDLE +#ifdef ESP_RMAKER_USE_CERT_BUNDLE .crt_bundle_attach = esp_crt_bundle_attach, #else .cert_pem = ota_data->server_cert, diff --git a/components/esp_schedule/src/esp_schedule_nvs.c b/components/esp_schedule/src/esp_schedule_nvs.c index 26b8049..ec13413 100644 --- a/components/esp_schedule/src/esp_schedule_nvs.c +++ b/components/esp_schedule/src/esp_schedule_nvs.c @@ -227,7 +227,27 @@ esp_schedule_handle_t *esp_schedule_nvs_get_all(uint8_t *schedule_count) return NULL; } int handle_count = 0; + nvs_entry_info_t nvs_entry; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) + nvs_iterator_t nvs_iterator = NULL; + esp_err_t err = nvs_entry_find(esp_schedule_nvs_partition, ESP_SCHEDULE_NVS_NAMESPACE, NVS_TYPE_BLOB, &nvs_iterator); + if (err != ESP_OK) { + ESP_LOGE(TAG, "No entry found in NVS"); + return NULL;; + } + while (err == ESP_OK) { + nvs_entry_info(nvs_iterator, &nvs_entry); + ESP_LOGI(TAG, "Found schedule in NVS with key: %s", nvs_entry.key); + handle_list[handle_count] = esp_schedule_nvs_get(nvs_entry.key); + if (handle_list[handle_count] != NULL) { + /* Increase count only if nvs_get was successful */ + handle_count++; + } + err = nvs_entry_next(&nvs_iterator); + } + nvs_release_iterator(nvs_iterator); +#else nvs_iterator_t nvs_iterator = nvs_entry_find(esp_schedule_nvs_partition, ESP_SCHEDULE_NVS_NAMESPACE, NVS_TYPE_BLOB); if (nvs_iterator == NULL) { ESP_LOGE(TAG, "No entry found in NVS"); @@ -243,6 +263,7 @@ esp_schedule_handle_t *esp_schedule_nvs_get_all(uint8_t *schedule_count) } nvs_iterator = nvs_entry_next(nvs_iterator); } +#endif *schedule_count = handle_count; ESP_LOGI(TAG, "Found %d schedules in NVS", *schedule_count); return handle_list; diff --git a/examples/homekit_switch/CMakeLists.txt b/examples/homekit_switch/CMakeLists.txt index 7a7c0d3..b099468 100644 --- a/examples/homekit_switch/CMakeLists.txt +++ b/examples/homekit_switch/CMakeLists.txt @@ -13,7 +13,7 @@ else() endif(DEFINED ENV{RMAKER_PATH}) # Add RainMaker components and other common application components -set(EXTRA_COMPONENT_DIRS $ENV{HOMEKIT_PATH}/components/homekit ${RMAKER_PATH}/components/esp-insights/components ${RMAKER_PATH}/components ${RMAKER_PATH}/examples/common) +set(EXTRA_COMPONENT_DIRS $ENV{HOMEKIT_PATH}/components/homekit ${RMAKER_PATH}/components/esp-insights/components ${RMAKER_PATH}/components ${RMAKER_PATH}/examples/common components) set(PROJECT_VER "1.0") include($ENV{IDF_PATH}/tools/cmake/project.cmake) diff --git a/examples/homekit_switch/main/app_homekit.c b/examples/homekit_switch/main/app_homekit.c index 0787624..05c017d 100644 --- a/examples/homekit_switch/main/app_homekit.c +++ b/examples/homekit_switch/main/app_homekit.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include diff --git a/examples/homekit_switch/main/app_main.c b/examples/homekit_switch/main/app_main.c index ccbfae0..519e40c 100644 --- a/examples/homekit_switch/main/app_main.c +++ b/examples/homekit_switch/main/app_main.c @@ -49,7 +49,7 @@ static esp_err_t write_cb(const esp_rmaker_device_t *device, const esp_rmaker_pa } /* Event handler for catching RainMaker events */ static void event_handler(void* arg, esp_event_base_t event_base, - int event_id, void* event_data) + int32_t event_id, void* event_data) { if (event_base == RMAKER_EVENT) { switch (event_id) { diff --git a/examples/multi_device/main/app_driver.c b/examples/multi_device/main/app_driver.c index b5a9e44..10e893f 100644 --- a/examples/multi_device/main/app_driver.c +++ b/examples/multi_device/main/app_driver.c @@ -37,7 +37,7 @@ static bool g_power_state = DEFAULT_SWITCH_POWER; static float g_temperature = DEFAULT_TEMPERATURE; static TimerHandle_t sensor_timer; -static void app_sensor_update(void *priv) +static void app_sensor_update(TimerHandle_t handle) { static float delta = 0.5; g_temperature += delta; From 42101c0601724195ca1dc37669c70a964f13262b Mon Sep 17 00:00:00 2001 From: Piyush Shah Date: Thu, 2 Jun 2022 15:36:00 +0530 Subject: [PATCH 3/7] gitlab-ci: Compile for all supported esp-idf versions and targets --- .gitlab-ci.yml | 215 ++++++++++++++----------------------------------- 1 file changed, 59 insertions(+), 156 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 429c1f0..5d66a43 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,7 +5,6 @@ stages: variables: V: "0" MAKEFLAGS: "-j8 --no-keep-going" - IDF_PATH: "$CI_PROJECT_DIR/esp-idf" APP_BUILD: "all" GIT_SUBMODULE_STRATEGY: recursive @@ -20,173 +19,77 @@ before_script: # Create esp-rainmaker-bins-${CI_JOB_ID}/ dir (to copy binaries into for artifacts) - mkdir -p $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID} -.setup_idf: &setup_idf -# Checking git version -- echo Checking git version -- git --version -# Cloning esp-idf - Started -- echo Cloning esp-idf - Started -- git clone --recursive --branch ${IDF_GIT_BRANCH} --depth 1 ${IDF_GIT_PATH}/esp-idf.git -- cd esp-idf -- echo Cloning esp-idf - Done -# Cloning esp-idf - Done -# Running install.sh - Started -- echo Running install.sh - Started -- ./install.sh -- echo Running install.sh - Done -# Running install.sh - Done -# Running export.sh - Started -- echo Running export.sh - Started -- . export.sh -- echo Running export.sh - Done -# Running export.sh - Done - -.build_switch: &build_switch -# Building switch app - Started -- echo Building switch app - Started -- ls -- cd $CI_PROJECT_DIR/examples/switch -- echo Building for esp32 -- idf.py set-target esp32 -- idf.py build -- rm -rf build/ sdkconfig -- echo Building for esp32s2 -- idf.py set-target esp32s2 -- idf.py build -- rm -rf build/ sdkconfig -- echo Building for esp32c3 -- idf.py set-target esp32c3 -- idf.py build -- rm -rf build/ sdkconfig -- echo Building for esp32s3 -- idf.py set-target esp32s3 -- idf.py build -- echo Building switch app - Done -# Building switch app - Done -# Copying switch.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- echo Copy switch.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- cp $CI_PROJECT_DIR/examples/switch/build/switch.bin $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/ - -.build_led_light: &build_led_light -# Building led_light app - Started -- echo Building led_light app - Started -- echo Running idf.py -- cd $CI_PROJECT_DIR/examples/led_light -- idf.py build -- echo Building led_light app - Done -# Building led_light app - Done -# Copying led_light.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- echo Copy led_light.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- cp $CI_PROJECT_DIR/examples/led_light/build/led_light.bin $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/ - -.build_fan: &build_fan -# Building fan app - Started -- echo Building fan app - Started -- echo Running idf.py -- cd $CI_PROJECT_DIR/examples/fan -- idf.py build -- echo Building fan app - Done -# Building fan app - Done -# Copying fan.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- echo Copy fan.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- cp $CI_PROJECT_DIR/examples/fan/build/fan.bin $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/ - -.build_temperature_sensor: &build_temperature_sensor -# Building temperature_sensor app - Started -- echo Building temperature_sensor app - Started -- echo Running idf.py -- cd $CI_PROJECT_DIR/examples/temperature_sensor -- idf.py build -- echo Building temperature_sensor app - Done -# Building temperature_sensor app - Done -# Copying temperature_sensor.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- echo Copy temperature_sensor.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- cp $CI_PROJECT_DIR/examples/temperature_sensor/build/temperature_sensor.bin $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/ - -.build_multi_device: &build_multi_device -# Building multi_device app - Started -- echo Building multi_device app - Started -- echo Running idf.py -- cd $CI_PROJECT_DIR/examples/multi_device -- idf.py build -- echo Building multi_device app - Done -# Building multi_device app - Done -# Copying multi_device.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- echo Copy multi_device.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- cp $CI_PROJECT_DIR/examples/multi_device/build/multi_device.bin $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/ - -.build_gpio: &build_gpio -# Building gpio app - Started -- echo Building gpio app - Started -- echo Running idf.py -- cd $CI_PROJECT_DIR/examples/gpio -- idf.py build -- echo Building gpio app - Done -# Building gpio app - Done -# Copying gpio.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- echo Copy gpio.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- cp $CI_PROJECT_DIR/examples/gpio/build/gpio.bin $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/ - -.build_homekit_switch: &build_homekit_switch -# Building homekit_switch app - Started -- cd $CI_PROJECT_DIR/examples/homekit_switch +.build_all_examples: &build_all_examples +- pip install --upgrade idf-component-manager +- for EXAMPLE in $EXAMPLES; do +- cd $CI_PROJECT_DIR/examples/$EXAMPLE +- echo Building $EXAMPLE +- if [[ "$EXAMPLE" == "homekit_switch" ]]; then - cd components - echo Cloning esp-homekit-sdk - git clone --recursive --branch master --depth 1 https://github.com/espressif/esp-homekit-sdk.git - cd .. - export HOMEKIT_PATH=$PWD/components/esp-homekit-sdk -- echo Building homekit_switch app - Started -- echo Running idf.py +- fi +- for TARGET in $EXAMPLE_TARGETS; do +- echo Building for $TARGET +- idf.py set-target $TARGET - idf.py build -- echo Building homekit_switch app - Done -# Building homekit_switch app - Done -# Copying homekit_switch.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- echo Copy homekit_switch.bin to esp-rainmaker-bins-${CI_JOB_ID}/ -- cp $CI_PROJECT_DIR/examples/homekit_switch/build/homekit_switch.bin $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/ +- mkdir -p $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/$EXAMPLE/$TARGET/ +- cp $CI_PROJECT_DIR/examples/$EXAMPLE/build/*.bin $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}/$EXAMPLE/$TARGET/ +- done +- echo Build Complete for $EXAMPLE +- done +# Generating zip file for binaries generated +- cd $CI_PROJECT_DIR +- echo Generating zip file for binaries generated +- tar -zcvf esp-rainmaker-bins-${CI_JOB_ID}.zip esp-rainmaker-bins-${CI_JOB_ID}/ -build_app: +.build_template: stage: build - image: $CI_DOCKER_REGISTRY/esp32-ci-env:rainmaker + image: espressif/idf:latest tags: - build - artifacts: - paths: - - $CI_PROJECT_DIR/esp-rainmaker-bins-${CI_JOB_ID}.zip - expire_in: 6 mos + variables: + PEDANTIC_FLAGS: "-Werror -Werror=deprecated-declarations -Wno-error=cpp -Werror=unused-variable -Werror=unused-but-set-variable -Werror=unused-function" + EXTRA_CFLAGS: "${PEDANTIC_FLAGS}" + EXTRA_CXXFLAGS: "${PEDANTIC_FLAGS}" + EXAMPLE_TARGETS: "esp32" + EXAMPLES: "switch led_light fan temperature_sensor multi_device gpio homekit_switch" script: - - *setup_idf - - for APP in $APP_BUILD; do - - if [[ "$APP_BUILD" == "all" || "$APP" == "switch" ]]; then - - *build_switch - - fi - - if [[ "$APP_BUILD" == "all" || "$APP" == "led_light" ]]; then - - *build_led_light - - fi - - if [[ "$APP_BUILD" == "all" || "$APP" == "fan" ]]; then - - *build_fan - - fi - - if [[ "$APP_BUILD" == "all" || "$APP" == "temperature_sensor" ]]; then - - *build_temperature_sensor - - fi - - if [[ "$APP_BUILD" == "all" || "$APP" == "multi_device" ]]; then - - *build_multi_device - - fi - - if [[ "$APP_BUILD" == "all" || "$APP" == "gpio" ]]; then - - *build_gpio - - fi - - if [[ "$APP_BUILD" == "all" || "$APP" == "homekit_switch" ]]; then - - *build_homekit_switch - - fi - - done - - echo Build Complete for $APP_BUILD - # Generating zip file for binaries generated - - cd $CI_PROJECT_DIR - - echo Generating zip file for binaries generated - - tar -zcvf esp-rainmaker-bins-${CI_JOB_ID}.zip esp-rainmaker-bins-${CI_JOB_ID}/ - + - *build_all_examples + +build_idf_v4.1: + extends: .build_template + image: espressif/idf:release-v4.1 + +build_idf_v4.2: + extends: .build_template + image: espressif/idf:release-v4.2 + variables: + EXAMPLE_TARGETS: "esp32 esp32s2" + +build_idf_v4.3: + extends: .build_template + image: espressif/idf:release-v4.3 + variables: + EXAMPLE_TARGETS: "esp32 esp32s2 esp32c3" + +build_idf_v4.4: + extends: .build_template + image: espressif/idf:release-v4.4 + variables: + EXAMPLE_TARGETS: "esp32 esp32s2 esp32c3 esp32s3" + +build_idf_master: + extends: .build_template + image: espressif/idf:latest + variables: + EXAMPLE_TARGETS: "esp32 esp32s2 esp32c3 esp32s3" + build_docs: stage: build - image: $CI_DOCKER_REGISTRY/esp32-ci-env:rainmaker + image: $CI_DOCKER_REGISTRY/esp32-ci-env tags: - build artifacts: @@ -213,7 +116,7 @@ build_docs: push_master_to_github: stage: deploy - image: $CI_DOCKER_REGISTRY/esp32-ci-env:rainmaker + image: espressif/idf:latest tags: - build when: on_success From e385522bcb90fb55d75c3977deda1c3fc482c0bc Mon Sep 17 00:00:00 2001 From: Piyush Shah Date: Fri, 25 Feb 2022 15:24:26 +0530 Subject: [PATCH 4/7] esp_param_name: Give an option to handle name param in application callback --- components/esp_rainmaker/Kconfig.projbuild | 8 ++++++++ components/esp_rainmaker/src/core/esp_rmaker_param.c | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/components/esp_rainmaker/Kconfig.projbuild b/components/esp_rainmaker/Kconfig.projbuild index cb5a52b..df0210b 100644 --- a/components/esp_rainmaker/Kconfig.projbuild +++ b/components/esp_rainmaker/Kconfig.projbuild @@ -79,6 +79,14 @@ menu "ESP RainMaker Config" can take appropriate action w.r.t user permissions. It is recommended to enable this option for security reasons. + config RMAKER_NAME_PARAM_CB + bool "Call device callback for Name param" + default n + help + By default, the "Name" parameter (esp.param.name) changes are handled internally. If Applications + want to handle this themselves, this config option can be enabled. Please ensure that you update + and report the name parameter in your callback so that it reflects correctly everywhere. + If no device callback is registered, the name paramater will be handled internally. config ESP_RMAKER_LOCAL_CTRL_ENABLE bool "ESP RainMaker Local Control" diff --git a/components/esp_rainmaker/src/core/esp_rmaker_param.c b/components/esp_rainmaker/src/core/esp_rmaker_param.c index 994ce62..540aa1a 100644 --- a/components/esp_rainmaker/src/core/esp_rmaker_param.c +++ b/components/esp_rainmaker/src/core/esp_rmaker_param.c @@ -357,7 +357,19 @@ static esp_err_t esp_rmaker_device_set_params(_esp_rmaker_device_t *device, jpar * of calling the registered callback. */ if (param->type && (strcmp(param->type, ESP_RMAKER_PARAM_NAME) == 0)) { +#ifdef CONFIG_RMAKER_NAME_PARAM_CB + if (device->write_cb) { + esp_rmaker_write_ctx_t ctx = { + .src = src, + }; + device->write_cb((esp_rmaker_device_t *)device, (esp_rmaker_param_t *)param, + new_val, device->priv_data, &ctx); + } else { + esp_rmaker_param_update_and_report((esp_rmaker_param_t *)param, new_val); + } +#else esp_rmaker_param_update_and_report((esp_rmaker_param_t *)param, new_val); +#endif } else if (device->write_cb) { esp_rmaker_write_ctx_t ctx = { .src = src, From ef410e14b044aef62fa891bb79ac19f5a99ebb79 Mon Sep 17 00:00:00 2001 From: Piyush Shah Date: Thu, 26 May 2022 18:37:41 +0530 Subject: [PATCH 5/7] ota: Make "OTA using Topics" as default and provide a simplified API for that - OTA using topics is now enabled in all examples - esp_rmaker_ota_enable_default() is the simplified API that enables OTA using Topics with the default server certificates --- components/esp_rainmaker/include/esp_rmaker_core.h | 14 ++++++++++++++ .../src/core/esp_rmaker_node_config.c | 2 +- components/esp_rainmaker/src/ota/esp_rmaker_ota.c | 13 ++++++++++++- examples/fan/main/app_main.c | 3 +++ examples/gpio/main/app_main.c | 3 +++ examples/homekit_switch/main/app_main.c | 5 +---- examples/led_light/main/app_main.c | 6 +----- examples/multi_device/main/app_main.c | 3 +++ examples/switch/main/app_main.c | 6 +----- examples/temperature_sensor/main/app_main.c | 3 +++ 10 files changed, 42 insertions(+), 16 deletions(-) diff --git a/components/esp_rainmaker/include/esp_rmaker_core.h b/components/esp_rainmaker/include/esp_rmaker_core.h index ad83011..eb01e6d 100644 --- a/components/esp_rainmaker/include/esp_rmaker_core.h +++ b/components/esp_rainmaker/include/esp_rmaker_core.h @@ -917,6 +917,20 @@ esp_err_t esp_rmaker_system_service_enable(esp_rmaker_system_serv_config_t *conf */ bool esp_rmaker_local_ctrl_service_started(void); +/** + * Enable Default RainMaker OTA Firmware Upgrade + * + * This enables the default recommended RainMaker OTA Firmware Upgrade, which is + * "Using the Topics", which allows performing OTA from Dashboard. + * This OTA can be triggered by Admin Users only. + * On Public RainMaker deployment, for nodes using "Self Claiming", since there + * is no associated admin user, the Primary user will automatically become the admin + * and can perform OTA from dashboard. + * + * @return ESP_OK on success + * @return error on failure + */ +esp_err_t esp_rmaker_ota_enable_default(void); #ifdef __cplusplus } #endif diff --git a/components/esp_rainmaker/src/core/esp_rmaker_node_config.c b/components/esp_rainmaker/src/core/esp_rmaker_node_config.c index aa53ce3..47458d4 100644 --- a/components/esp_rainmaker/src/core/esp_rmaker_node_config.c +++ b/components/esp_rainmaker/src/core/esp_rmaker_node_config.c @@ -38,7 +38,7 @@ static esp_err_t esp_rmaker_report_info(json_gen_str_t *jptr) } json_gen_obj_set_string(jptr, "model", info->model); const esp_app_desc_t *app_desc = esp_ota_get_app_description(); - json_gen_obj_set_string(jptr, "project_name", app_desc->project_name); + json_gen_obj_set_string(jptr, "project_name", (char *)app_desc->project_name); json_gen_obj_set_string(jptr, "platform", CONFIG_IDF_TARGET); json_gen_pop_object(jptr); return ESP_OK; diff --git a/components/esp_rainmaker/src/ota/esp_rmaker_ota.c b/components/esp_rainmaker/src/ota/esp_rmaker_ota.c index 42734c4..6c293f7 100644 --- a/components/esp_rainmaker/src/ota/esp_rmaker_ota.c +++ b/components/esp_rainmaker/src/ota/esp_rmaker_ota.c @@ -284,10 +284,16 @@ ota_end: return ESP_FAIL; } +static const esp_rmaker_ota_config_t ota_default_config = { + .server_cert = esp_rmaker_ota_def_cert, +}; /* Enable the ESP RainMaker specific OTA */ esp_err_t esp_rmaker_ota_enable(esp_rmaker_ota_config_t *ota_config, esp_rmaker_ota_type_t type) { - if (!ota_config || ((type != OTA_USING_PARAMS) && (type != OTA_USING_TOPICS))) { + if (ota_config == NULL) { + ota_config = (esp_rmaker_ota_config_t *)&ota_default_config; + } + if ((type != OTA_USING_PARAMS) && (type != OTA_USING_TOPICS)) { ESP_LOGE(TAG,"Invalid arguments for esp_rmaker_ota_enable()"); return ESP_ERR_INVALID_ARG; } @@ -343,3 +349,8 @@ esp_err_t esp_rmaker_ota_enable(esp_rmaker_ota_config_t *ota_config, esp_rmaker_ } return err; } + +esp_err_t esp_rmaker_ota_enable_default(void) +{ + return esp_rmaker_ota_enable(NULL, OTA_USING_TOPICS); +} diff --git a/examples/fan/main/app_main.c b/examples/fan/main/app_main.c index 136b106..d57fbbe 100644 --- a/examples/fan/main/app_main.c +++ b/examples/fan/main/app_main.c @@ -91,6 +91,9 @@ void app_main() esp_rmaker_device_add_param(fan_device, esp_rmaker_speed_param_create(ESP_RMAKER_DEF_SPEED_NAME, DEFAULT_SPEED)); esp_rmaker_node_add_device(node, fan_device); + /* Enable OTA */ + esp_rmaker_ota_enable_default(); + /* Enable timezone service which will be require for setting appropriate timezone * from the phone apps for scheduling to work correctly. * For more information on the various ways of setting timezone, please check diff --git a/examples/gpio/main/app_main.c b/examples/gpio/main/app_main.c index ca512ac..c3cef0a 100644 --- a/examples/gpio/main/app_main.c +++ b/examples/gpio/main/app_main.c @@ -86,6 +86,9 @@ void app_main() esp_rmaker_node_add_device(node, gpio_device); + /* Enable OTA */ + esp_rmaker_ota_enable_default(); + /* Enable Insights. Requires CONFIG_ESP_INSIGHTS_ENABLED=y */ app_insights_enable(); diff --git a/examples/homekit_switch/main/app_main.c b/examples/homekit_switch/main/app_main.c index 519e40c..a6a64a5 100644 --- a/examples/homekit_switch/main/app_main.c +++ b/examples/homekit_switch/main/app_main.c @@ -182,10 +182,7 @@ void app_main() esp_rmaker_node_add_device(node, switch_device); /* Enable OTA */ - esp_rmaker_ota_config_t ota_config = { - .server_cert = ESP_RMAKER_OTA_DEFAULT_SERVER_CERT, - }; - esp_rmaker_ota_enable(&ota_config, OTA_USING_PARAMS); + esp_rmaker_ota_enable_default(); /* Enable Insights. Requires CONFIG_ESP_INSIGHTS_ENABLED=y */ app_insights_enable(); diff --git a/examples/led_light/main/app_main.c b/examples/led_light/main/app_main.c index e44451e..be08aac 100644 --- a/examples/led_light/main/app_main.c +++ b/examples/led_light/main/app_main.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include @@ -105,10 +104,7 @@ void app_main() esp_rmaker_node_add_device(node, light_device); /* Enable OTA */ - esp_rmaker_ota_config_t ota_config = { - .server_cert = ESP_RMAKER_OTA_DEFAULT_SERVER_CERT, - }; - esp_rmaker_ota_enable(&ota_config, OTA_USING_PARAMS); + esp_rmaker_ota_enable_default(); /* Enable timezone service which will be require for setting appropriate timezone * from the phone apps for scheduling to work correctly. diff --git a/examples/multi_device/main/app_main.c b/examples/multi_device/main/app_main.c index bc42426..99ae28e 100644 --- a/examples/multi_device/main/app_main.c +++ b/examples/multi_device/main/app_main.c @@ -120,6 +120,9 @@ void app_main() temp_sensor_device = esp_rmaker_temp_sensor_device_create("Temperature Sensor", NULL, app_get_current_temperature()); esp_rmaker_node_add_device(node, temp_sensor_device); + /* Enable OTA */ + esp_rmaker_ota_enable_default(); + /* Enable timezone service which will be require for setting appropriate timezone * from the phone apps for scheduling to work correctly. * For more information on the various ways of setting timezone, please check diff --git a/examples/switch/main/app_main.c b/examples/switch/main/app_main.c index 2c9886b..4db7f56 100644 --- a/examples/switch/main/app_main.c +++ b/examples/switch/main/app_main.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -184,10 +183,7 @@ void app_main() esp_rmaker_node_add_device(node, switch_device); /* Enable OTA */ - esp_rmaker_ota_config_t ota_config = { - .server_cert = ESP_RMAKER_OTA_DEFAULT_SERVER_CERT, - }; - esp_rmaker_ota_enable(&ota_config, OTA_USING_PARAMS); + esp_rmaker_ota_enable_default(); /* Enable timezone service which will be require for setting appropriate timezone * from the phone apps for scheduling to work correctly. diff --git a/examples/temperature_sensor/main/app_main.c b/examples/temperature_sensor/main/app_main.c index a7990c8..5ade3f6 100644 --- a/examples/temperature_sensor/main/app_main.c +++ b/examples/temperature_sensor/main/app_main.c @@ -62,6 +62,9 @@ void app_main() temp_sensor_device = esp_rmaker_temp_sensor_device_create("Temperature Sensor", NULL, app_get_current_temperature()); esp_rmaker_node_add_device(node, temp_sensor_device); + /* Enable OTA */ + esp_rmaker_ota_enable_default(); + /* Enable Insights. Requires CONFIG_ESP_INSIGHTS_ENABLED=y */ app_insights_enable(); From b73f9e1e636890570dabd563014f2980ccccbc12 Mon Sep 17 00:00:00 2001 From: Piyush Shah Date: Thu, 26 May 2022 23:25:15 +0530 Subject: [PATCH 6/7] claiming: Make self claiming as the default for esp32s3 and esp32c3 It was already the default for esp32s2. So, only esp32 will have assisted claiming as default. This change was made because RainMaker now supports admin roles even for Self Claimed nodes. Please check CHANGES.md for details --- CHANGES.md | 27 ++++++++++++++++++++++ components/esp_rainmaker/Kconfig.projbuild | 4 ++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 00bd211..6c95677 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,32 @@ # Changes +## 26-May-2022 (claiming and ota) + +- claiming: Make self claiming as the default for esp32s3 and esp32c3 +- ota: Make "OTA using Topics" as default and provide a simplified API for that + +Self claiming is much more convenient and fast since the node directly gets the +credentials from the claiming service over HTTPS, instead of using the slower BLE based +Assisted claiming, wherein the phone app acts as a proxy between the node and the +claiming service. However, with self claiming, there was no concept of +[Admin Role](https://rainmaker.espressif.com/docs/user-roles.html#admin-users) and so, it was +not possible to access the node via the RainMaker or Insights dashboards. This was one +reason why Assisted Claiming was kept as a default for esp32c3 and esp32s3 even though +they support self claiming. + +With recent changes in the Public RainMaker backend, the primary user (the user who performs the [user-node +mapping](https://rainmaker.espressif.com/docs/user-node-mapping.html)) for a self claimed +node is now made as the admin. This gives the primary user the access to the node for OTA and Insights. +So, self claiming has now been made as the default for all chips (except esp32) and the OTA Using Topics +has also been made as the default, since it is convenient and also the correct option for +production devices. A simpler API `esp_rmaker_ota_enable_default()` as also been added in esp_rmaker_core.h. + +Note: Nodes that are already claimed via Assisted/Host Claiming will not have any effect, even if the +new firmware is enabled with self claiming. The self claiming will take effect only if the flash is +erased. **This will result in a change of node_id, since mac address is the node_id for self claimed nodes.** +If you want to contine using Assisted Claiming (probably because there is quite some data associated +with the node_id), please set is explicitly in your sdkconfig. + ## 25-Jan-2022 (app_wifi: Minor feature additions to provisioning workflow) Added a 30 minute timeout for Wi-Fi provisioning as a security measure. A device reboot will be diff --git a/components/esp_rainmaker/Kconfig.projbuild b/components/esp_rainmaker/Kconfig.projbuild index cb5a52b..1bd69c2 100644 --- a/components/esp_rainmaker/Kconfig.projbuild +++ b/components/esp_rainmaker/Kconfig.projbuild @@ -2,8 +2,8 @@ menu "ESP RainMaker Config" choice ESP_RMAKER_CLAIM_TYPE bool "Claiming Type" - default ESP_RMAKER_SELF_CLAIM if IDF_TARGET_ESP32S2 - default ESP_RMAKER_ASSISTED_CLAIM if !IDF_TARGET_ESP32S2 + default ESP_RMAKER_SELF_CLAIM + default ESP_RMAKER_ASSISTED_CLAIM if IDF_TARGET_ESP32 help Claiming type to be used. From 082a91672060c482a5469305e705738c526d29f3 Mon Sep 17 00:00:00 2001 From: shixinke Date: Mon, 30 May 2022 12:56:56 +0800 Subject: [PATCH 7/7] example: Update IO for all examples to work with all ESP devkits and provide options in menuconfig --- .gitignore | 4 ++++ .../esp_rmaker_standard_params.c | 3 +++ examples/fan/main/app_driver.c | 2 -- examples/gpio/main/Kconfig.projbuild | 18 ++++++++++++++++++ examples/gpio/main/app_driver.c | 6 +++--- examples/homekit_switch/main/Kconfig.projbuild | 7 +++++++ examples/homekit_switch/main/app_driver.c | 2 +- examples/multi_device/main/Kconfig.projbuild | 7 +++++++ examples/multi_device/main/app_driver.c | 2 +- examples/switch/main/Kconfig.projbuild | 7 +++++++ examples/switch/main/app_driver.c | 2 +- 11 files changed, 52 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 594e11c..249046e 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,7 @@ docs/docusaurus/website/node_modules # cli logs **/logs + +# IDF package manager +**/managed_components/ +*.lock diff --git a/components/esp_rainmaker/src/standard_types/esp_rmaker_standard_params.c b/components/esp_rainmaker/src/standard_types/esp_rmaker_standard_params.c index e3a7d04..80da312 100644 --- a/components/esp_rainmaker/src/standard_types/esp_rmaker_standard_params.c +++ b/components/esp_rainmaker/src/standard_types/esp_rmaker_standard_params.c @@ -115,6 +115,9 @@ esp_rmaker_param_t *esp_rmaker_temperature_param_create(const char *param_name, { esp_rmaker_param_t *param = esp_rmaker_param_create(param_name, ESP_RMAKER_PARAM_TEMPERATURE, esp_rmaker_float(val), PROP_FLAG_READ); + if (param) { + esp_rmaker_param_add_ui_type(param, ESP_RMAKER_UI_TEXT); + } return param; } diff --git a/examples/fan/main/app_driver.c b/examples/fan/main/app_driver.c index f8525ea..277ebb7 100644 --- a/examples/fan/main/app_driver.c +++ b/examples/fan/main/app_driver.c @@ -21,8 +21,6 @@ /* This is the button that is used for toggling the power */ #define BUTTON_GPIO CONFIG_EXAMPLE_BOARD_BUTTON_GPIO #define BUTTON_ACTIVE_LEVEL 0 -/* This is the GPIO on which the power will be set */ -#define OUTPUT_GPIO 19 #define DEFAULT_HUE 180 #define DEFAULT_SATURATION 100 diff --git a/examples/gpio/main/Kconfig.projbuild b/examples/gpio/main/Kconfig.projbuild index dfedefb..3465820 100644 --- a/examples/gpio/main/Kconfig.projbuild +++ b/examples/gpio/main/Kconfig.projbuild @@ -8,4 +8,22 @@ menu "Example Configuration" GPIO number on which the "Boot" button is connected. This is generally used by the application for custom operations like toggling states, resetting to defaults, etc. + config EXAMPLE_OUTPUT_GPIO_RED + int "Red GPIO" + default 2 + help + Control digital RGB LEDs. Need to connect this GPIO to the red pin of the LED. + + config EXAMPLE_OUTPUT_GPIO_GREEN + int "Green GPIO" + default 4 + help + Control digital RGB LEDs. Need to connect this GPIO to the green pin of the LED. + + config EXAMPLE_OUTPUT_GPIO_BLUE + int "Blue GPIO" + default 5 + help + Control digital RGB LEDs. Need to connect this GPIO to the blue pin of the LED. + endmenu diff --git a/examples/gpio/main/app_driver.c b/examples/gpio/main/app_driver.c index f67e948..2b3e148 100644 --- a/examples/gpio/main/app_driver.c +++ b/examples/gpio/main/app_driver.c @@ -20,9 +20,9 @@ #define BUTTON_ACTIVE_LEVEL 0 /* This is the GPIO on which the power will be set */ -#define OUTPUT_GPIO_RED 16ULL -#define OUTPUT_GPIO_GREEN 14ULL -#define OUTPUT_GPIO_BLUE 15ULL +#define OUTPUT_GPIO_RED CONFIG_EXAMPLE_OUTPUT_GPIO_RED +#define OUTPUT_GPIO_GREEN CONFIG_EXAMPLE_OUTPUT_GPIO_GREEN +#define OUTPUT_GPIO_BLUE CONFIG_EXAMPLE_OUTPUT_GPIO_BLUE #define WIFI_RESET_BUTTON_TIMEOUT 3 #define FACTORY_RESET_BUTTON_TIMEOUT 10 diff --git a/examples/homekit_switch/main/Kconfig.projbuild b/examples/homekit_switch/main/Kconfig.projbuild index 4b47035..63f0340 100644 --- a/examples/homekit_switch/main/Kconfig.projbuild +++ b/examples/homekit_switch/main/Kconfig.projbuild @@ -32,4 +32,11 @@ menu "Example Configuration" GPIO number on which the "Boot" button is connected. This is generally used by the application for custom operations like toggling states, resetting to defaults, etc. + config EXAMPLE_OUTPUT_GPIO + int "Output GPIO" + default 19 + help + This is an output GPIO that will be connected to a relay or other driver circuit in most cases. + If the power changes, this GPIO output level will also change. + endmenu diff --git a/examples/homekit_switch/main/app_driver.c b/examples/homekit_switch/main/app_driver.c index 4204d8d..04a18ec 100644 --- a/examples/homekit_switch/main/app_driver.c +++ b/examples/homekit_switch/main/app_driver.c @@ -22,7 +22,7 @@ #define BUTTON_ACTIVE_LEVEL 0 /* This is the GPIO on which the power will be set */ -#define OUTPUT_GPIO 19 +#define OUTPUT_GPIO CONFIG_EXAMPLE_OUTPUT_GPIO static bool g_power_state = DEFAULT_POWER; /* These values correspoind to H,S,V = 120,100,10 */ diff --git a/examples/multi_device/main/Kconfig.projbuild b/examples/multi_device/main/Kconfig.projbuild index dfedefb..3f83b73 100644 --- a/examples/multi_device/main/Kconfig.projbuild +++ b/examples/multi_device/main/Kconfig.projbuild @@ -8,4 +8,11 @@ menu "Example Configuration" GPIO number on which the "Boot" button is connected. This is generally used by the application for custom operations like toggling states, resetting to defaults, etc. + config EXAMPLE_OUTPUT_GPIO + int "Output GPIO" + default 19 + help + This is an output GPIO that will be connected to a relay or other driver circuit in most cases. + If the power changes, this GPIO output level will also change. + endmenu diff --git a/examples/multi_device/main/app_driver.c b/examples/multi_device/main/app_driver.c index 10e893f..89c6ebe 100644 --- a/examples/multi_device/main/app_driver.c +++ b/examples/multi_device/main/app_driver.c @@ -23,7 +23,7 @@ #define BUTTON_GPIO CONFIG_EXAMPLE_BOARD_BUTTON_GPIO #define BUTTON_ACTIVE_LEVEL 0 /* This is the GPIO on which the power will be set */ -#define OUTPUT_GPIO 19 +#define OUTPUT_GPIO CONFIG_EXAMPLE_OUTPUT_GPIO /* These values correspoind to H,S,V = 120,100,10 */ #define DEFAULT_RED 0 diff --git a/examples/switch/main/Kconfig.projbuild b/examples/switch/main/Kconfig.projbuild index c9b0610..cd319b2 100644 --- a/examples/switch/main/Kconfig.projbuild +++ b/examples/switch/main/Kconfig.projbuild @@ -15,5 +15,12 @@ menu "Example Configuration" Enable this option to test mobile push notifications. When enabled, turning on the switch using push button will trigger a parameter notification {"Switch":{"Power":true}} and turning off will trigger an alert "Switch was turned off". + + config EXAMPLE_OUTPUT_GPIO + int "Output GPIO" + default 19 + help + This is an output GPIO that will be connected to a relay or other driver circuit in most cases. + If the power changes, this GPIO output level will also change. endmenu diff --git a/examples/switch/main/app_driver.c b/examples/switch/main/app_driver.c index b6e4acb..e62e99a 100644 --- a/examples/switch/main/app_driver.c +++ b/examples/switch/main/app_driver.c @@ -22,7 +22,7 @@ #define BUTTON_ACTIVE_LEVEL 0 /* This is the GPIO on which the power will be set */ -#define OUTPUT_GPIO 19 +#define OUTPUT_GPIO CONFIG_EXAMPLE_OUTPUT_GPIO static bool g_power_state = DEFAULT_POWER; /* These values correspoind to H,S,V = 120,100,10 */