Prueba inalámbrica en Espressif ESP32

En las siguientes instrucciones, se usa el ejemplo de la app de iluminación del SDK de Matter junto con una placa de desarrollo M5Stack ESP32.

Configuración del entorno de compilación

Primero, clona el SDK de Matter.

En este ejemplo, consultamos la confirmación mínima admitida para la versión 5 de Matter de Google Home:

$ mkdir otaprep
$ cd otaprep
git clone https://github.com/project-chip/connectedhomeip.git
cd connectedhomeip
git fetch origin v1.0-branch
git checkout FETCH_HEAD
git submodule update --init --recursive
source ./scripts/activate.sh

A continuación, verificamos la versión que se usó en el flujo de trabajo de GitHub del ESP32 para determinar qué imagen de Docker se adapta mejor a nuestra compilación:

$ cat .github/workflows/examples-esp32.yaml | grep chip-build | head -n 1
            image: connectedhomeip/chip-build-esp32:0.5.99

Ejecutamos un contenedor desde la imagen de Docker y pasamos marcas para activar el SDK de Matter en el contenedor y proporcionar acceso al dispositivo ESP32.

$ docker run --name container_name -it --user $(id -u):$(id -g) --mount source=$(pwd),target=/workspace,type=bind --device=/dev/ttyUSB0 connectedhomeip/chip-build-esp32:0.5.99 /bin/bash

Detén e inicia el contenedor de Docker de Matter

Cada vez que ejecutes un comando docker run, crearás un contenedor nuevo con la imagen especificada. Cuando haces esto, se pierden los datos antiguos, que se guardaron en una instancia de contenedor anterior. A veces, esto es lo que quieres que suceda, porque te permite comenzar con una instalación nueva. Sin embargo, en este ejemplo, lo más probable es que desees guardar la configuración del trabajo y del entorno entre sesiones.

user@host> docker stop container_name

Cuando esté todo listo para volver a ejecutar, inicia el contenedor y abre una ventana de terminal:

user@host> docker start container_name
user@host> docker exec -it container_name /bin/bash

Puedes abrir sesiones de terminal adicionales en tu contenedor con el siguiente comando:

user@host> docker exec -it container_name /bin/bash

También puedes iniciar una sesión raíz mediante el siguiente comando:

user@host> docker exec -u 0 -it container_name /bin/bash

Inicializa el SDK

En el contenedor, inicializamos el SDK de Matter y el IDF del ESP:

cd /workspace
git submodule update --init --recursive
source ./scripts/activate.sh
source /opt/espressif/esp-idf/export.sh

Compila y escribe en la memoria flash

La siguiente tarea es compilar la imagen y escribir en la memoria flash del kit de desarrollo para recibir la actualización del firmware Matter inalámbrico.

Para ello, debes crear una imagen.

Primero, configura la compilación con la utilidad menuconfig del IDF de ESP.

cd examples/lighting-app/esp32
idf.py menuconfig

En el menú interactivo, establece la siguiente configuración:

  1. Component config --->

  2. CHIP Device Layer --->

  3. Device Identification Options --->

  4. Configura Vendor ID con el VID que asignaste a Connectivity Standards Alliance (Alliance).

  5. Establece Product ID en el PID que estableciste en la integración de Matter en Google Home Developer Console.

Habilita la marca del solicitante de OTA:

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. Habilitar la marca del solicitante de OTA [*] Enable OTA Requestor

  5. Presiona ESC dos veces para volver al menú de nivel superior.

Habilita la marca de creación de imágenes OTA Matter:

  1. Component config -->

  2. CHIP Device Layer --->

  3. Matter OTA Image --->

  4. [*] Generate OTA IMAGE

Establece el número de versión:

  1. Application manager --->

  2. Seleccionar [*] Get the project version from Kconfig

  3. Configura Project version (NEW) en 1.0.

  4. Presiona s para guardar la configuración, presiona Intro dos veces y, luego, q para salir de menuconfig.

Configura certificados de prueba

Sigue los pasos que se indican en Cómo crear certificados de prueba de dispositivos de Matter para crear certificados de CD, DAC y PAI.

Compila tu dispositivo

Ahora ejecuta la compilación y escribe en la memoria flash del dispositivo:

idf.py build
idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash

Crea y sube la imagen OTA

Ahora vuelve a cambiar la configuración de compilación para crear una imagen inalámbrica. Usa la misma imagen, pero con un número de versión incrementado.

Ejecuta menuconfig.

idf.py menuconfig

En el menú interactivo, actualiza lo siguiente:

  1. Application manager --->
  2. Seleccionar [*] Get the project version from Kconfig
  3. Configura Project version (NEW) en 2.0.
  4. Presiona s para guardar la configuración, presiona Intro dos veces y, luego, q para salir de menuconfig.

Compila y recupera la imagen. En el siguiente ejemplo, se muestra la ubicación de la imagen de manera inalámbrica y el resultado cuando se analiza con ota_image_tool.py.

cd build
/workspace/src/app/ota_image_tool.py show ./chip-lighting-app-ota.bin
Magic: 1beef11e
Total Size: 1243360
Header Size: 64
Header TLV:
  [0] Vendor Id: XXXXX (0x000)
  [1] Product Id: XXXXX (0x000)
  [2] Version: 2 (0x2)
  [3] Version String: v2.0
  [4] Payload Size: 1243280 (0x12f890)
  [8] Digest Type: 1 (0x1)
  [9] Digest: e367f4d71e2ccd554b9a399c864abbf2c039382ef1def1b986fb2f59a99923a8

Debido a que el SDK de Matter se activa desde el host de tu contenedor, la imagen inalámbrica está disponible en el host de tu contenedor.

Para subir la imagen inalámbrica a Developer Console, sigue las instrucciones de carga inalámbrica.

Envía las comisiones a Google Home y observa las actualizaciones inalámbricas

Asegúrate de que tu dispositivo esté conectado a la máquina Linux host mediante USB. En el siguiente ejemplo, se muestra el uso de screen de GNU para leer los registros del dispositivo:

screen -L /dev/ttyUSB0 115200

Se mostrará el resultado del dispositivo en tu terminal y se escribirá el mismo resultado en el archivo de registro de pantalla predeterminado llamado screenlog.0.

Puedes abrir el archivo screenlog.0 en otro editor de texto o mostrarlo en otra shell con cat, tail, more o grep.

Presiona el botón rojo de restablecimiento ubicado en el lateral del dispositivo para ver los registros del inicio.

En el resultado del dispositivo, deberías ver el VID y el PID que configuraste antes, así como una URL a la imagen del código QR que usarás para poner en marcha el dispositivo.

[0;32mI (2388) chip[DIS]: Advertise commission parameter vendorID=XXXXX productID=XXXX discriminator=3840/15 cm=1[0m

[0;32mI (1928) chip[SVR]: SetupQRCode: [MT:E59-000000000000000][0m

https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3AE59-000000000000000

Asegúrate de que el Hub esté en línea en tu casa.

Envía el Google Home app (GHA) al dispositivo mediante el código QR del vínculo que aparece en el archivo de registro.

Deja que el dispositivo se ejecute sin interrupciones durante varios minutos después de la puesta en marcha. Deberías observar el resultado del registro relacionado con el solicitante de OTA, la descarga de imágenes OTA y OTAImageProcessor.

Después de instalar la imagen, observa que el tiempo de compilación de la imagen coincide con el que se subió a la consola y es posterior al tiempo de compilación que se informó en el primer inicio. Ejecutar grep con el siguiente patrón en el modo de regex en screenlog.0 puede ilustrar el proceso inalámbrico:

$ grep -E "(Compile time|OTA)" screenlog.0
I (76) boot:  1 otadata          OTA data         01 00 0000f000 00002000
I (91) boot:  3 ota_0            OTA app          00 10 00020000 00177000
I (99) boot:  4 ota_1            OTA app          00 11 001a0000 00177000
I (645) cpu_start: Compile time:     Oct 15 2022 06:21:59
I (135558) chip[SWU]: OTA Requestor received AnnounceOTAProvider
I (540658) chip[SWU]: OTA image downloaded to offset 0x1a0000
I (541348) OTAImageProcessor: Applying, Boot partition set offset:0x1a0000
I (76) boot:  1 otadata          OTA data         01 00 0000f000 00002000
I (91) boot:  3 ota_0            OTA app          00 10 00020000 00177000
I (99) boot:  4 ota_1            OTA app          00 11 001a0000 00177000
I (645) cpu_start: Compile time:     Oct 15 2022 07:35:31
I (76) boot:  1 otadata          OTA data         01 00 0000f000 00002000
I (91) boot:  3 ota_0            OTA app          00 10 00020000 00177000
I (99) boot:  4 ota_1            OTA app          00 11 001a0000 00177000
I (645) cpu_start: Compile time:     Oct 15 2022 07:35:31

Después de la ejecución inicial, puedes repetir los pasos de la sección Cómo crear y subir una imagen inalámbrica sin subir una imagen nueva. Esta vez, vuelve a configurar las versiones en 1.

Ejecuta menuconfig y, en las opciones del menú interactivo, haz lo siguiente:

  1. Component config -->

  2. CHIP Device Layer --->

  3. Device Identification Options

  4. Establece Version String en v1.0.

  5. Establece Device Software Version Number en 1.

  6. Presiona s para guardar la configuración y, luego, q para salir de menuconfig.

Quita el dispositivo de tu casa en el GHA.

Compila la imagen si aún no está compilada:

idf.py build

Escribe en la memoria flash:

idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash

Repite los pasos que se indican en Comisión a Google Home y observa el proceso inalámbrico según sea necesario.

Valida la actualización de software de OTA

Puedes consultar la versión de software del dispositivo con la app de Google Home (GHA). Una vez que se ponga un dispositivo, sigue estos procedimientos:

  1. Mantén presionada la tarjeta del dispositivo en la pantalla principal de GHA
  2. Presiona el ícono en la parte superior derecha.
  3. Presiona Información técnica.
  4. Comprueba el campo Versión de software.

Pantalla de la app de Google Home que muestra el campo de versión de software