Tester l'OTA sur Espressif ESP32

Les instructions suivantes utilisent l'exemple d'application d'éclairage du SDK Matter avec une carte de développement M5Stack ESP32.

Configurer l'environnement de compilation

Commencez par cloner le SDK Matter.

Dans cet exemple, nous vérifions le commit minimal pris en charge pour la version 5 de Matter 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

Ensuite, nous vérifions la version utilisée dans le workflow GitHub ESP32 pour déterminer l'image Docker la mieux adaptée à notre build :

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

Nous exécutons un conteneur à partir de l'image Docker, en transmettant des indicateurs pour monter le SDK Matter dans le conteneur et pour fournir un accès à l'appareil 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

Arrêter et démarrer le conteneur Docker Matter

Chaque fois que vous exécutez une commande docker run, vous créez un conteneur avec l'image spécifiée. Dans ce cas, vos anciennes données, qui ont été enregistrées sur une instance de conteneur précédente, sont perdues. C'est parfois ce que vous souhaitez, car cela vous permet de commencer avec une nouvelle installation. Toutefois, dans cet exemple, vous souhaitez probablement enregistrer votre travail et la configuration de votre environnement entre les sessions.

user@host> docker stop container_name

Lorsque vous êtes prêt à exécuter à nouveau le conteneur, démarrez-le et ouvrez une fenêtre de terminal :

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

Vous pouvez ouvrir des sessions de terminal supplémentaires dans votre conteneur avec :

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

Vous pouvez également démarrer une session root à l'aide de la commande suivante :

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

Initialiser le SDK

Dans le conteneur, nous initialisons le SDK Matter et ESP-IDF :

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

Compiler et flasher

La tâche suivante consiste à créer l'image et à flasher le kit de développement pour recevoir la mise à jour du micrologiciel OTA Matter.

Pour ce faire, vous devez créer une image.

Commencez par configurer la compilation à l'aide de l'utilitaire menuconfig de l'ESP-IDF.

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

Dans le menu interactif, configurez les paramètres suivants :

  1. Component config --->

  2. CHIP Device Layer --->

  3. Device Identification Options --->

  4. Définissez Vendor ID sur l'ID de fournisseur de contenu attribué à votre Connectivity Standards Alliance (Alliance).

  5. Définissez Product ID sur le PID que vous avez défini sur l'intégration Matter dans Google Home Developer Console.

Activez l'indicateur "OTA Requestor" :

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. Activer l'indicateur de demandeur OTA [*] Enable OTA Requestor

  5. Appuyez deux fois sur ÉCHAP pour revenir au menu de premier niveau.

Activez l'indicateur de création d'image OTA Matter :

  1. Component config -->

  2. CHIP Device Layer --->

  3. Matter OTA Image --->

  4. [*] Generate OTA IMAGE

Définissez le numéro de version :

  1. Application manager --->

  2. Sélectionner [*] Get the project version from Kconfig

  3. Définissez Project version (NEW) sur 1.0

  4. Appuyez sur s pour enregistrer la configuration, appuyez deux fois sur Entrée, puis sur q pour quitter menuconfig.

Configurer des certificats de test

Suivez la procédure décrite dans Créer des certificats de test d'appareils Matter pour créer des certificats CD, DAC et PAI.

Créer votre appareil

Exécutez maintenant la compilation et flashez l'appareil :

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

Créer et importer l'image OTA

Modifiez à nouveau les paramètres de compilation pour créer une image OTA. Utilisez la même image, mais avec un numéro de version incrémenté.

Exécutez menuconfig.

idf.py menuconfig

Dans le menu interactif, modifiez les éléments suivants :

  1. Application manager --->
  2. Sélectionner [*] Get the project version from Kconfig
  3. Définissez Project version (NEW) sur 2.0
  4. Appuyez sur s pour enregistrer la configuration, appuyez deux fois sur Entrée, puis sur q pour quitter menuconfig.

Créez et récupérez l'image. L'exemple montre à la fois l'emplacement de l'image pour la mise à jour OTA et la sortie lors de l'analyse avec ota_image_tool.py.

cd build && /workspace/src/app/ota_image_tool.py show ./chip-lighting-app-ota.bin

Voici le résultat :

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

Étant donné que le SDK Matter est monté à partir de l'hôte de votre conteneur, l'image OTA est disponible sur l'hôte de votre conteneur.

Importez l'image OTA sur le Developer Console en suivant les instructions d'importation OTA.

Mettre en service Google Home et observer l'OTA

Assurez-vous que votre appareil est connecté à la machine Linux hôte via USB. L'exemple suivant montre l'utilisation de GNU screen pour lire les journaux de l'appareil :

screen -L /dev/ttyUSB0 115200

Cela affiche la sortie de l'appareil dans votre terminal et écrit la même sortie dans le fichier journal d'écran par défaut nommé screenlog.0.

Vous pouvez ouvrir le fichier screenlog.0 dans un autre éditeur de texte ou l'afficher dans un autre shell avec cat, tail, more ou grep.

Appuyez sur le bouton de réinitialisation rouge situé sur le côté de l'appareil pour afficher les journaux de démarrage.

Dans la sortie de l'appareil, vous devriez voir le VID et le PID que vous avez définis précédemment, ainsi qu'une URL vers l'image du code QR que vous utiliserez pour mettre en service l'appareil.

[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

Assurez-vous que votre hub est connecté à Internet dans votre maison.

Mettez en service l'appareil avec Google Home app (GHA) à l'aide du code QR du lien qui s'affiche dans le fichier journal.

Laissez l'appareil fonctionner sans interruption pendant plusieurs minutes après la mise en service. Vous devriez observer la sortie du journal liée au demandeur OTA, au téléchargement de l'image OTA et à OTAImageProcessor.

Une fois l'image installée, vérifiez que le temps de compilation de l'image correspond à celui de l'image importée dans la console et qu'il est postérieur au temps de compilation indiqué lors du premier démarrage. L'exécution de grep avec le modèle suivant en mode expression régulière sur screenlog.0 peut illustrer le processus OTA :

grep -E "(Compile time|OTA)" screenlog.0

Voici le résultat :

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

Après l'exécution initiale, vous pouvez répéter les étapes de la section Créer et importer une image OTA sans importer de nouvelle image. Cette fois-ci, redéfinissez les versions sur 1.

Exécutez menuconfig, puis dans les options du menu interactif :

  1. Component config -->

  2. CHIP Device Layer --->

  3. Device Identification Options

  4. Définissez Version String sur v1.0.

  5. Définissez Device Software Version Number sur 1.

  6. Appuyez sur s pour enregistrer la configuration, puis sur q pour quitter menuconfig.

Supprimez l'appareil de votre maison dans GHA.

Créez l'image si ce n'est pas déjà fait :

idf.py build

Flashez-le :

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

Répétez les étapes de la section Mise en service sur Google Home et observation de la mise à jour OTA si nécessaire.

Valider la mise à jour logicielle OTA

Vous pouvez vérifier la version du logiciel de l'appareil à l'aide de l'application Google Home. Une fois un appareil mis en service, suivez ces procédures :

  1. Appuyez de manière prolongée sur la tuile de l'appareil sur l'écran principal de GHA.
  2. Appuyez sur l'icône  en haut à droite.
  3. Appuyez sur Informations techniques.
  4. Vérifiez le champ Version logicielle.

Écran de l'application Google Home affichant le champ de la version du logiciel