Tester l'OTA sur Espressif ESP32

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

Configuration de l'environnement de compilation

Commencez par cloner le SDK Matter.

Dans cet exemple, nous vérifions la quantité minimale d'engagement acceptée pour la version 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

Nous vérifions ensuite 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 options permettant d'installer le SDK Matter dans le conteneur et de fournir l'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. Cette opération entraîne la perte de vos anciennes données, qui ont été enregistrées sur une instance de conteneur précédente. C'est parfois ce que vous voulez faire, car cela vous permet de démarrer avec une nouvelle installation. Toutefois, dans cet exemple, vous souhaiterez probablement enregistrer la configuration de votre travail et 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 conteneur 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 racine à 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 prochaine tâche consiste à compiler 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 d'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 le VID attribué par 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 de demandeur OTA:

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

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

  5. Appuyez deux fois sur ESC 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.

Compiler votre appareil

À présent, exécutez 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, mettez à jour 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 appuyez sur q pour quitter menuconfig.

Créez et récupérez l'image. L'exemple ci-dessous montre à la fois l'emplacement de l'image pour l'OTA et le résultat lors de l'analyse avec 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

Comme le SDK Matter est installé à partir de votre hôte de conteneur, l'image OTA est disponible sur votre hôte de conteneur.

Importez l'image OTA dans 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 à l'aide d'un câble USB. L'exemple suivant montre comment utiliser GNU screen pour lire les journaux de l'appareil:

screen -L /dev/ttyUSB0 115200

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

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

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

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

[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

Vérifiez que votre Nest Hub est connecté à Internet chez vous.

Mettez l'appareil en service avec le Google Home app (GHA) en utilisant le code QR à partir du lien qui apparaît dans le fichier journal.

Laissez l'appareil fonctionner sans interruption pendant plusieurs minutes après la mise en service. La sortie du journal doit s'afficher pour le demandeur OTA, le téléchargement d'image OTA et OTAImageProcessor.

Une fois l'image installée, notez que son moment de compilation correspond à celui de l'image importée dans la console, et qu'il est ultérieur à l'heure de compilation indiquée au premier démarrage. Exécuter 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
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, rétablissez les versions sur 1.

Exécutez menuconfig et, dans les options du menu interactif, exécutez la commande suivante:

  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 la GHA.

Si ce n'est pas déjà fait, créez l'image:

idf.py build

Flashez-le:

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

Si nécessaire, répétez la procédure décrite dans la section Mettre en service Google Home et suivez la mise à jour OTA.

Valider la mise à jour logicielle OTA

Vous pouvez vérifier la version logicielle de l'appareil à l'aide de l'application Google Home (GHA). Une fois l'appareil mis en service, procédez comme suit:

  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 logicielle