| # CHIP ESP32 All Clusters Example |
| |
| A prototype application that demonstrates device commissioning and cluster |
| control. |
| |
| --- |
| |
| - [CHIP ESP32 All Clusters Example](#chip-esp32-all-clusters-example) |
| - [Supported Devices](#supported-devices) |
| - [Building the Example Application](#building-the-example-application) |
| - [Commissioning and cluster control](#commissioning-and-cluster-control) |
| - [Setting up chip-tool](#setting-up-chip-tool) |
| - [Commissioning over BLE](#commissioning-over-ble) |
| - [Cluster control](#cluster-control) |
| - [Flashing app using script](#flashing-app-using-script) |
| - [Note](#note) |
| - [Using the RPC console](#using-the-rpc-console) |
| - [Device Tracing](#device-tracing) |
| |
| --- |
| |
| ## Supported Devices |
| |
| The CHIP demo application is intended to work on three categories of ESP32 |
| devices: the |
| [ESP32-DevKitC](https://www.espressif.com/en/products/hardware/esp32-devkitc/overview), |
| the |
| [ESP32-WROVER-KIT_V4.1](https://www.espressif.com/en/products/hardware/esp-wrover-kit/overview), |
| the [M5Stack](http://m5stack.com), and the |
| [ESP32C3-DevKitM](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html). |
| |
| Note: M5Stack Core 2 display is not supported in the tft component, while other |
| functionality can still work fine. |
| |
| ## VCP Drivers |
| |
| Some users might have to install the |
| [VCP driver](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) |
| before the device shows up on `/dev/tty`. |
| |
| In addition, if the following error is encountered during M5Stack flashing, the |
| [CH9102 VCP driver](https://docs.m5stack.com/en/download) would also need to be |
| installed: |
| |
| ``` |
| Failed to write to target RAM (result was 01070000) |
| ``` |
| |
| ## Building the Example Application |
| |
| Building the example application requires the use of the Espressif ESP32 IoT |
| Development Framework and the xtensa-esp32-elf toolchain for ESP32 modules or |
| the riscv-esp32-elf toolchain for ESP32C3 modules. |
| |
| The VSCode devcontainer has these components pre-installed, so you can skip this |
| step. To install these components manually, follow these steps: |
| |
| - Clone the Espressif ESP-IDF and checkout |
| [v4.4.1 release](https://github.com/espressif/esp-idf/releases/tag/v4.4.1) |
| |
| ``` |
| $ mkdir ${HOME}/tools |
| $ cd ${HOME}/tools |
| $ git clone https://github.com/espressif/esp-idf.git |
| $ cd esp-idf |
| $ git checkout v4.4.1 |
| $ git submodule update --init |
| $ ./install.sh |
| $ . ./export.sh |
| ``` |
| |
| To update an existing esp-idf toolchain to v4.4.1: |
| |
| ``` |
| $ cd ~/tools/esp-idf |
| $ git fetch origin |
| $ git checkout v4.4.1 |
| $ git reset --hard origin/v4.4.1 |
| $ git submodule update --init |
| $ git clean -fdx |
| $ ./install.sh |
| $ . ./export.sh |
| ``` |
| |
| - Install ninja-build |
| |
| ``` |
| $ sudo apt-get install ninja-build |
| ``` |
| |
| Currently building in VSCode _and_ deploying from native is not supported, so |
| make sure the IDF_PATH has been exported(See the manual setup steps above). |
| |
| - Setting up the environment |
| |
| ``` |
| $ cd ${HOME}/tools/esp-idf |
| $ ./install.sh |
| $ . ./export.sh |
| $ cd {path-to-connectedhomeip} |
| ``` |
| |
| To download and install packages. |
| |
| ``` |
| $ source ./scripts/bootstrap.sh |
| $ source ./scripts/activate.sh |
| ``` |
| |
| If packages are already installed then simply activate them. |
| |
| ``` |
| $ source ./scripts/activate.sh |
| ``` |
| |
| - Target Set |
| |
| To set IDF target, first: |
| |
| ``` |
| $ cd {path-to-connectedhomeip}/examples/all-clusters-app/esp32/ |
| ``` |
| |
| Then run set-target with one of the commands. |
| |
| ``` |
| $ idf.py set-target esp32 |
| $ idf.py set-target esp32c3 |
| ``` |
| |
| - Configuration Options |
| |
| To build the default configuration (`sdkconfig.defaults`) skip to building the |
| demo application. |
| |
| To build a specific configuration (as an example `m5stack`): |
| |
| ``` |
| $ rm sdkconfig |
| $ idf.py -D 'SDKCONFIG_DEFAULTS=sdkconfig_m5stack.defaults' build |
| ``` |
| |
| Note: If using a specific device configuration, it is highly recommended to |
| start off with one of the defaults and customize on top of that. Certain |
| configurations have different constraints that are customized within the |
| device specific configuration (eg: main app stack size). |
| |
| To customize the configuration, run menuconfig. |
| |
| ``` |
| $ idf.py menuconfig |
| ``` |
| |
| Select ESP32 based `Device Type` through `Demo`->`Device Type`. The device types |
| that are currently supported include `ESP32-DevKitC` (default), |
| `ESP32-WROVER-KIT_V4.1`, `M5Stack` and `ESP32C3-DevKitM`. |
| |
| - To build the demo application. |
| |
| ``` |
| $ idf.py build |
| ``` |
| |
| - After building the application, to flash it outside of VSCode, connect your |
| device via USB. Then run the following command to flash the demo application |
| onto the device and then monitor its output. If necessary, replace |
| `/dev/tty.SLAB_USBtoUART` with the correct USB device name for your system |
| (like `/dev/ttyUSB0` on Linux or `/dev/tty.usbserial-01CDEEDC` on Mac). Note |
| that sometimes you might have to press and hold the `boot` button on the |
| device while it's trying to connect before flashing. For ESP32-DevKitC |
| devices this is labeled in the |
| [functional description diagram](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/get-started-devkitc.html#functional-description). |
| |
| ``` |
| $ idf.py -p /dev/tty.SLAB_USBtoUART flash monitor |
| ``` |
| |
| - Quit the monitor by hitting `Ctrl+]`. |
| |
| Note: You can see a menu of various monitor commands by hitting |
| `Ctrl+t Ctrl+h` while the monitor is running. |
| |
| - If desired, the monitor can be run again like so: |
| |
| ``` |
| $ idf.py -p /dev/tty.SLAB_USBtoUART monitor |
| ``` |
| |
| ## Commissioning and cluster control |
| |
| Commissioning can be carried out using WiFi or BLE. |
| |
| 1. Set the `Rendezvous Mode` for commissioning using menuconfig; the default |
| Rendezvous mode is BLE. |
| |
| ``` |
| $ idf.py menuconfig |
| ``` |
| |
| Select the Rendezvous Mode via `Demo -> Rendezvous Mode`. |
| |
| NOTE: to avoid build error |
| `undefined reference to 'chip::DevelopmentCerts::kDacPublicKey'`, set VID to |
| `0xFFF1` and PID in range `0x8000..0x8005`. |
| |
| `idf.py menuconfig -> Component config -> CHIP Device Layer -> Device Identification Options` |
| |
| 2. Now flash the device with the same command as before. (Use the right `/dev` |
| device) |
| |
| ``` |
| $ idf.py -p /dev/tty.SLAB_USBtoUART flash monitor |
| ``` |
| |
| 3. The device should boot up. When device connects to your network, you will |
| see a log like this on the device console. |
| |
| ``` |
| I (5524) chip[DL]: SYSTEM_EVENT_STA_GOT_IP |
| I (5524) chip[DL]: IPv4 address changed on WiFi station interface: <IP_ADDRESS>... |
| ``` |
| |
| 4. Use |
| [python based device controller](https://github.com/project-chip/connectedhomeip/tree/master/src/controller/python) |
| or |
| [standalone chip-tool](https://github.com/project-chip/connectedhomeip/tree/master/examples/chip-tool) |
| or |
| [iOS chip-tool app](https://github.com/project-chip/connectedhomeip/tree/master/src/darwin/CHIPTool) |
| or |
| [Android chip-tool app](https://github.com/project-chip/connectedhomeip/tree/master/src/android/CHIPTool) |
| to communicate with the device. |
| |
| Note: The ESP32 does not support 5GHz networks. Also, the Device will persist |
| your network configuration. To erase it, simply run. |
| |
| ``` |
| $ idf.py -p /dev/tty.SLAB_USBtoUART erase_flash |
| ``` |
| |
| - Once ESP32 is up and running, we need to set up a device controller to |
| perform commissioning and cluster control. |
| |
| ### Setting up chip-tool |
| |
| See [the build guide](../../../docs/guides/BUILDING.md#prerequisites) for |
| general background on build prerequisites. |
| |
| Building the example: |
| |
| ``` |
| $ cd examples/chip-tool |
| |
| $ rm -rf out |
| |
| $ gn gen out/debug |
| |
| $ ninja -C out/debug |
| ``` |
| |
| which puts the binary at `out/debug/chip-tool` |
| |
| ### Commission a device using chip-tool |
| |
| To initiate a client commissioning request to a device, run the built executable |
| and choose the pairing mode. |
| |
| #### Commissioning over BLE |
| |
| Run the built executable and pass it the discriminator and pairing code of the |
| remote device, as well as the network credentials to use. |
| |
| The command below uses the default values hard-coded into the debug versions of |
| the ESP32 all-clusters-app to commission it onto a Wi-Fi network: |
| |
| ``` |
| $ ./out/debug/chip-tool pairing ble-wifi 12344321 ${SSID} ${PASSWORD} 20202021 3840 |
| ``` |
| |
| Parameters: |
| |
| 1. Discriminator: 3840 (configurable through menuconfig) |
| 2. Setup-pin-code: 20202021 (configurable through menuconfig) |
| 3. Node-id: 12344321 (you can assign any node id) |
| |
| ### Cluster control |
| |
| #### onoff |
| |
| To use the Client to send Matter commands, run the built executable and pass it |
| the target cluster name, the target command name as well as an endpoint id. |
| |
| ``` |
| $ ./out/debug/chip-tool onoff on 12344321 1 |
| ``` |
| |
| The client will send a single command packet and then exit. |
| |
| #### levelcontrol |
| |
| ```bash |
| Usage: |
| $ ./out/debug/chip-tool levelcontrol move-to-level Level=10 TransitionTime=0 OptionMask=0 OptionOverride=0 12344321 1 |
| ``` |
| |
| ### Flashing app using script |
| |
| - Follow these steps to use `${app_name}.flash.py`. |
| |
| - First set IDF target, run set-target with one of the commands. |
| |
| ``` |
| $ idf.py set-target esp32 |
| $ idf.py set-target esp32c3 |
| ``` |
| |
| - Execute below sequence of commands |
| |
| ``` |
| $ export ESPPORT=/dev/tty.SLAB_USBtoUART |
| $ idf.py build |
| $ idf.py flashing_script |
| $ python ${app_name}.flash.py |
| ``` |
| |
| ### Note |
| |
| This demo app illustrates controlling OnOff cluster (Server) attributes of an |
| endpoint. For `ESP32-DevKitC`, `ESP32-WROVER-KIT_V4.1` and `ESP32C3-DevKitM`, a |
| GPIO (configurable through `STATUS_LED_GPIO_NUM` in `main/main.cpp`) is updated |
| through the on/off/toggle commands from the `python-controller`. For `M5Stack`, |
| a virtual Green LED on the display is used for the same. |
| |
| If you wish to see the actual effect of the commands on `ESP32-DevKitC`, |
| `ESP32-WROVER-KIT_V4.1`, you will have to connect an external LED to GPIO |
| `STATUS_LED_GPIO_NUM`. For `ESP32C3-DevKitM`, the on-board LED will show the |
| actual effect of the commands. |
| |
| ## Using the RPC console |
| |
| You can use the rpc default config to setup everything correctly for RPCs: |
| |
| ``` |
| $ export SDKCONFIG_DEFAULTS=$PROJECT_ROOT/examples/all-clusters-app/esp32/sdkconfig_m5stack_rpc.defaults |
| $ rm sdkconfig |
| $ idf.py fullclean |
| ``` |
| |
| Alternatively, Enable RPCs in the build using menuconfig: |
| |
| - Enable the RPC library and Disable ENABLE_CHIP_SHELL |
| |
| ``` |
| Component config → CHIP Core → General Options → Enable Pigweed PRC library |
| Component config → CHIP Core → General Options → Disable CHIP Shell |
| ``` |
| |
| - Ensure the UART is correctly configured for your board, for m5stack: |
| |
| ``` |
| PW RPC Debug channel → UART port number → 0 |
| PW RPC Debug channel → UART communication speed → 115200 |
| PW RPC Debug channel → UART RXD pin number → 3 |
| PW RPC Debug channel → UART TXD pin number → 1 |
| ``` |
| |
| After configuring you can build and flash normally: |
| |
| ``` |
| $ idf.py build |
| $ idf.py flash |
| ``` |
| |
| After flashing a build with RPCs enabled you can use the rpc console to send |
| commands to the device. |
| |
| Build or install the [rpc console](../../common/pigweed/rpc_console/README.md) |
| |
| Start the console |
| |
| ``` |
| chip-console --device /dev/ttyUSB0 |
| ``` |
| |
| From within the console you can then invoke rpcs: |
| |
| ```python |
| rpcs.chip.rpc.WiFi.Connect(ssid=b"MySSID", secret=b"MyPASSWORD") |
| rpcs.chip.rpc.WiFi.GetIP6Address() |
| |
| rpcs.chip.rpc.Lighting.Get() |
| rpcs.chip.rpc.Lighting.Set(on=True, level=128, color=protos.chip.rpc.LightingColor(hue=5, saturation=5)) |
| ``` |
| |
| ## Device Tracing |
| |
| Device tracing is available to analyze the device performance. To turn on |
| tracing, build with RPC enabled. See |
| [Using the RPC console](#using-the-rpc-console). |
| |
| Obtain tracing json file. |
| |
| ``` |
| $ ./{PIGWEED_REPO}/pw_trace_tokenized/py/pw_trace_tokenized/get_trace.py -d {PORT} -o {OUTPUT_FILE} \ |
| -t {ELF_FILE} {PIGWEED_REPO}/pw_trace_tokenized/pw_trace_protos/trace_rpc.proto |
| ``` |