1

Réaliser une mise à jour sans fil (OTA) avec un ESP8266

Commençant à utiliser de plus en plus de produits basés sur des ESP8266, je vais vous décrire ici la manière générique de réaliser des mise à jour sans fil dite OTA pour les produits sur lequels j’écris le micrologiciel. Attention, je parle ici des produits tels que WifInfo ou Remora. Même si la méthode peut s’appliquer sur d’autres produits il n’est pas certain qu’elle fonctionne puisqu’elle dépend d’une partie de code embarqué dans le micro-logiciel.

D’une manière générale, si le code a été fait et et basé sur l’environnement Arduino ESP8266 cela devrait fonctionner. 

Cet article sera enrichi en fonction des évolutions logicielles que je ferai sur les modules concernés et à venir.

pré requis

Matériel

Afin de fonctionner, bien entendu votre module ESP8266 doit être visible et accessible sur votre réseau, et doit par conséquent avoir été configuré :

  • soit dans le logiciel source avant un télé-déversement par une liaison série pour se connecter directement à votre Wifi.
  • soit configuré dans l’interface WEB quand elle est disponible pour faire connecter le module sur votre réseau Wifi.
  • soit votre module fonctionne en point d’accès et vous devez vous connecter dessus.

Logiciel

Coté logiciel, à ce jour il vous faut l’environnement Arduino 1.6.5 ainsi que les outils de développement ESP8266. La procédure d’installation pour ces deux produits est décrite sur le site ESP8266-Arduino ici. Je vous préconise l’installation Installing with Boards Manager, ça reste la plus simple.

Ensuite il va vous falloir Python pour exécuter le script d’upload. Il faut installer la Version 2.x mais pas 3.x (elle n’est pas supportée). Pour les utilisateurs de Windows il faudra bien faire attention à sélectionner l’option “Add python.exe to Path” lors de l’installation pour que l’interpréteur puisse être exécuté correctement.

Add Python to path

Add Python to path

Procédure

Arduino IDE

Vous trouverez la description complète ici avec les exemples et notamment comment le faire depuis l’environnement Arduino IDE. Seul hic, parfois depuis windows votre device ESP8266 n’apparaîtra pas dans le menu “port” disponibles depuis l’environnement IDE Arduino comme ci dessous.

OTA port

ESP8266 listé dans les “ports”

 

Afin de pallier ce problème, j’utilise la méthode manuelle, un peu plus “lourde” mais 100% efficace. Tout cela se déroule en ligne de commande, et, une fois n’est pas coutume, afin de simplifier la chose nous allons travailler avec l’interpréteur issu d’unix, bash. Ce n’est absolument pas obligatoire sous windows, vous pouvez le faire depuis une invite de commande classique, il faudra juste mettre tous les chemins en dur, et comme je fais OTA très souvent, je me suis installé bash via cygwin C’est donc cette méthode que je vais décrire, car en plus je pense qu’elle est fonctionnelle sous Linux et sous Mac.

Pour installer bash sous windows il suffit d’installer cygwin, choisissez la version x86 ou x64 en fonction de votre OS. Vous lancez le setup, choisissez un miroir les packages par défaut et laissez dérouler l’installation en choisissant d’installer une icone terminal sur votre bureau par exemple. Chez moi c’est installé sur c:\cygwin64  (notez le chemin c’est important pour plus tard)

Vous devriez avoir l’icone suivant sur votre bureau

cygwin bash terminal

cygwin bash

Ouvir maintenant un terminal bash. Attention sous windows avec cygwin les lecteurs de disques locaux ont une notation différente, par exemple pour aller sur C: la commande est cd /cygdrive/c  sur S: cd /cygdrive/s

 

Le script permettant d’effectuer l’OTA se nomme espota.py il va falloir le trouver car il n’est pas dans le chemin. Pour ma part je travaille avec le current build d’ESP8266-Arduino alors mes fichiers risquent de ne pas être situés au même endroit que vous, ce n’est pas gênant, il faudra adapter avec vos résultats. Chez moi tout l’environnement Arduino-ESP8266 se trouve dans S:\Skydrive\devt\Arduino  donc le ficher espota.py  pour bash dans ma configuration se trouve :

/cygdrive/s/Skydrive/devt/Arduino/hardware/esp8266com/esp8266/tools/espota.py

Normalement, chez vous, ce fichier va se trouver dans le dossier ou vous avez installé l’environnement Arduino dans le sous-dossier hardware\esp8266com\esp8266\tools , au pire faites une recherche de ce fichier depuis l’explorateur windows.

L’avantage de bash est de pouvoir faire des alias pour nous simplifier la vie, et nous allons nous en servir, vous trouverez dans votre dossier d’installation cygwin un sous dossier home/votre_user_name soit chez moi c:\cygwin64\home\charles  contenant un fichier .bashrc que vous allez éditer avec un éditeur de texte. Ce fichier sera lu par bash à chaque lancement d’un terminal (ouais, pratique!!)

Allons, y, j’ai ajouté en fin de fichier les alias pour changer de lecteur, un alias ota  qui va lancer en direct le fameux script OTA espota.py  et enfin un alias build  qui va me positionner directement dans le dossier de compilation temporaire créé par l’environnement Arduino. La fin de mon fichier est la suivante :

PYTHONPATH="/cygdrive/c/Python27/"
alias l='ls -al'
alias "c:"='cd /cygdrive/c'
alias "d:"='cd /cygdrive/d'
alias "s:"='cd /cygdrive/s'
alias "nano"='/cygdrive/s/Skydrive/PortableApps/Notepad++Portable/App/Notepad++/notepad++.exe' 
alias "ota"='/cygdrive/s/Skydrive/devt/Arduino/hardware/esp8266com/esp8266/tools/espota.py' 
alias build='cd $USERPROFILE/AppData/Local/Temp; cd $(ls -td -- ./build*/ | head -n1 | cut -d"/" -f2)'

Attention à bien mettre vos chemin sur l’alias ota, j’ai aussi crée l’alias nano qui me lance un notepad++.

une fois le fichier modifié et enregistré, fermez votre fenêtre bash (Ctrl-D) puis relancer là pour que les modifications soient prises en compte. Tester l’alias ota comme suit :

~ # ota --help
Usage: espota.py [options]

Transmit image over the air to the esp8266 module with OTA support.

Options:
  -h, --help            show this help message and exit

  Destination:
    -i ESP_IP, --ip=ESP_IP
                        ESP8266 IP Address.
    -p ESP_PORT, --port=ESP_PORT
                        ESP8266 ota Port. Default 8266

  Authentication:
    -a AUTH, --auth=AUTH
                        Set authentication password.

  Image:
    -f FILE, --file=FILE
                        Image file.
    -s, --spiffs        Use this option to transmit a SPIFFS image and do not
                        flash the module.

  Output:
    -d, --debug         Show debug output. And override loglevel with debug.
    -r, --progress      Show progress output. Does not work for ArduinoIDE
~ #

Parfait çà fonctionne!

Vous noterez aussi que vos commandes sont mémorisées d’une session à l’autre c’est à dire qu’en ouvrant un terminal bash et en tapant sur la flèche haut du clavier vous avez vos dernières commandes, inutile de les saisir à nouveau. De même vous pouvez afficher et rechercher dans l’historique de vos commandes (si tenté que vous ayez fermé le terminal bash correctement avec un Ctrl-D)

~ # history | grep ota
   54  history | grep ota
   57  ota -i 192.168.1.215 -s -f ESP8266_WifInfo.spiffs.bin --auth=OTA_WifInfo -r
   60  ota -i 192.168.4.1 -s -f ESP8266_WifInfo.spiffs.bin --auth=OTA_WifInfo -r
   61  ota -i 192.168.4.1 -f ESP8266_WifInfo.cpp.bin --auth=OTA_WifInfo -r
   62  ota -i 192.168.4.1 -f ESP8266_WifInfo.cpp.bin --auth= -r
   63  ota -i 192.168.4.1 -f ESP8266_WifInfo.cpp.bin --auth=OTA_WifInfo -r
   65  ota -i 192.168.4.1 -f ESP8266_WifInfo.spiffs.bin --auth=OTA_WifInfo -r
   75   ota -i 192.168.4.1 -f ESP8266_WifInfo.cpp.bin --auth=OTA_WifInfo -r
   76   ota -i 192.168.4.1 -f ESP8266_WifInfo.cpp.
   79   ota -i 192.168.1.215 -f ESP8266_WifInfo.cpp.bin --auth=OTA_WifInfo -r
   80   ota -i 192.168.1.215 s- -f ESP8266_WifInfo.spiffs.bin --auth=OTA_WifInfo -r
   81   ota -i 192.168.1.215 -f ESP8266_WifInfo.cpp.bin --auth=OTA_WifInfo -r
  210   ota -i 192.168.1.215 -f ESP8266_WifInfo.cpp.bin --auth=OTA_WifInfo -r
  211   ota -i 192.168.1.215 -f ESP8266_WifInfo.cpp.bin --auth=OTA_WifInfo -r
  212   ota -i 192.168.1.215 -f Wifinfo.cpp.bin --auth=OTA_WifInfo -r
  231   ota -i 192.168.1.215 -f Wifinfo.cpp.bin --auth=OTA_WifInfo -r
  232   ota -i 192.168.1.215 -s -f Wifinfo.spiffs.bin --auth=OTA_WifInfo -r
  233   ota -i 192.168.1.215 -s -f Wifinfo.spiffs.bin --auth=OTA_WifInfo -r
  424  ota -i 192.168.1.205 -s -f Wifinfo.spiffs.bin --auth=OTA_WifInfo -r
  425  ota -i 192.168.1.205 -f Wifinfo.cpp.bin --auth=OTA_WifInfo -r
  426  ota -i 192.168.1.205 -s -f Wifinfo.spiffs.bin --auth=OTA_WifInfo -r
  427  ota -i 192.168.1.205 -f Wifinfo.cpp.bin --auth=OTA_WifInfo -r
  436  ota -i 192.168.1.205 -s -f Wifinfo.spiffs.bin --auth=OTA_WifInfo -r
  501  ota --help
~ #

Si c’est pas du bonheur ça 😉

En ligne de commande pour Remora

Voila, tout est prêt, maintenant passons à la mise à jour par exemple pour Remora. Vous trouverez plus de détail sur la préparation et la compilation de Remora sur le repo dédié ici.

Une fois chargé le sketch remora_soft.ino  dans l’environnement Arduino IDE et avoir choisi la board cible ESP12 . Il faut cliquer sur la flèche “Verify” et pas sur “upload” (ceci dit, si aucun cable n’est branché, upload ne fera pas de mal). Une fois la vérification terminée vous devez avoir une sortie comme ceci :

ESP8266 Arduino IDE Sketch Location

ESP8266 Arduino IDE Sketch Location

J’ai surligné en jaune le dossier cible ou est généré le fichier binaire à télécharger, allons maintenant ouvrir un terminal bash et lancer la commande build pour nous positionner dans ce dossier :

ESP8266 bash build

ESP8266 bash build

 

Parfait, c’est le même dossier. Nous allons pouvoir uploader le programme, il nous reste un chose à faire, c’est connaitre l’IP de notre Remora, si vous ne la connaissez pas, allez dans la config de votre Box ou sur votre serveur DHCP, ou perso j’utilise l’excellente application fing de mon smartphone pour lister les périphériques réseau. Tout dépend de votre configuration réseau et de vos préférences. L’adresse MAC des ESP8266 doit commencer par 18:FE:34

Fing scan

Fing scan

Dans mon cas, Remora est en IP 192.168.1.201 (qu’il faudra indiquer avec le paramètre -i) . Le fichier binaire ne nomme toujours avec le nom du sketch principal suivi de .cpp.bin , dans notre cas c’est donc remora_soft.cpp.bin qui est positionné avec le paramètre -f, mais il faut aussi indiquer l’authentification (paramètre –auth) définie dans remora.h que je vous conseille de changer pour plus de sécurité, et enfin de paramètre -r pour avoir un bargraphe sympa. La commande devient donc :

ota -i 192.168.1.201 -f remora_soft.cpp.bin --auth=Remora_OTA -r

alors allons y :

ESP8266 OTA Command line

ESP8266 OTA Command line

Et voilà, super simple, c’est terminé !

J’avais laissé la console série sur le NodeMCU pour vous montrer ce qu’elle donne lors d’un OTA, vous voyez, bien l’indication du démarrage de la mise à jour et après le redémarrage de l’ESP8266. De plus la Led de la carte Remora doit clignoter en violet durant la mise à jour.

HCHC=000429496 Updated
PAPP=00170 Updated

Update Started..Update finished restarting
-u.========== SDK Saved parameters StartMode: STA
PHY mode: G
Channel: 1
AP id: 0
Status: 1
Auto connect: 1
SSID (12): HOME-HOTSPOT
Passphrase (13): Wireless@Home
BSSID set: 0
========== SDK Saved parameters End
Connection Wifi avec les parametres sauvegardes connecte!
IP address   : 192.168.1.201
MAC address  : 18:FE:34:F2:02:DC
HTTP server started
Remora Version 1.3.0
Compile avec les fonctions : BOARD V1.3 MCP23017 TELEINFO 
Initializing MCP23017...Searching...Setup...OK!

Ce n’est pas la méthode la plus simple mais elle fonctionne à tous les coups et avec bash installé franchement ça prend 5 secondes d’ouvrir le terminal et de lancer la commande. Il doit même y avoir moyen de fournir automatiquement le nom de fichier.cpp.bin du dossier courant.

L’interface WEB de Remora à l’aide du système de Fichiers SPIFFS

Le fichier binaire contenant le système SPIFFS ne nomme toujours avec le nom du sketch principal suivi de .spiffs.bin , dans notre cas c’est donc remora_soft.spiffs.bin.

Mais nous devons générer ce fichier depuis l’environnement Arduino (ce doit aussi être possible depuis la ligne de commande mais là c’est plus simple depuis l’IDE). Dans le dossier du sketch Remora, vous trouverez un sous-dossier data qui contient tous les fichiers devant être intégrés au système SPIFFS.

Génération fichier SPIFFS

Après il faut générer le fichier binaire correspondant au SPIFFS grace au menu tools/ESP8266 Sketch Data Upload

Si ce menu n’apparaît pas, il faut installer le plugins nécessaire via la procédure décrite ici.

WifInfo génération SPIFFS via l'IDE

Remora génération SPIFFS via l’IDE

Le menu génère le fichier remora.spiffs.bin et il essai ensuite de le télécharger, mais comme vous n’êtes certainement pas connecté par la liaison série, il va y avoir une erreur “Upload Failed”, c’est donc normal aucune inquietude, je rappelle que l’on voulait juste  générer ce fichier, ce qui est fait.

Upload SPIFFS en ligne de commande Remora

Lors du téléchargement OTA, la différence avec le fichier firmware, c’est qu’il faut préciser que c’est un système de fichier SPIFFS, ce qui est positionné en ajoutant le paramètre -s  le nom du fichier devient remora.spiffs.bin  au lieu de remora.cpp.bin Ce qui nous donne la commande suivante :

ota -i 192.168.1.201 -s -f remora.spiffs.bin --auth=OTA_Remora -r

En ligne de commande pour WifInfo

Même si on utilise la ligne de commande, il faut bien compiler les fichiers depuis l’IDE avant, pour cela voici les paramètres.

Choix de la board cible dans l’IDE

Depuis l’IDE allez dans le menu tools/board puis choisissez WifInfo (oui, oui c’est maintenant intégré grace à ce pull request), ensuite en fonction du module ESP8266 installé sur votre carte WifInfo, ESP12 (le noir) ou ESP07 (le bleu qui possède le connecteur pour une antenne Wifi externe) il faudra l’indiquer comme suit attention à ne pas vous tromper de module :

WifInfo choix du module dans l'IDE

WifInfo choix du module dans l’IDE

Attention, le module fonctionne à 160MHz, bien l’indiquer aussi dans le menu CPU Frequency (ce sera positionné par défaut lors de la prochaine MAJ)

WifInfo IDE 160MHz

Selection carte WifInfo à 160MHz

Upload Firmware en ligne de commande

Pour WifInfo c’est exactement le même principe qu’avec Remora, pour le firmware mais il y a une phase supplémentaire qui est le télé-déversement du système de fichier SPIFFS qui contient toutes les pages de l’interface WEB, c’est donc 2 upload qu’il faut faire. Je ne reviens pas sur l’update du firmware qui va ressembler à ceci (après compilation depuis l’IDE bien sûr) :

ota -i ip_wifinfo -f wifinfo.cpp.bin --auth=OTA_WifInfo -r

Le fichier binaire contenant le système SPIFFS ne nomme toujours avec le nom du sketch principal suivi de .spiffs.bin , dans notre cas c’est donc  Wifinfo.spiffs.bin.

Mais nous devons générer ce fichier depuis l’environnement Arduino (ce doit aussi être possible depuis la ligne de commande mais là c’est plus simple depuis l’IDE). Dans le dossier du sketch Wifinfo, vous trouverez un sous-dossier data qui contient tous les fichiers devant être intégrés au système SPIFFS.

Génération fichier SPIFFS

Après il faut générer le fichier binaire correspondant au SPIFFS grace au menu tools/ESP8266 Sketch Data Upload

Si ce menu n’apparaît pas, il faut installer le plugins nécessaire via la procédure décrite ici.

WifInfo génération SPIFFS via l'IDE

WifInfo génération SPIFFS via l’IDE

Le menu génère le fichier Wifinfo.spiffs.bin et il essai ensuite de le télécharger, mais comme vous n’êtes certainement pas connecté par la liaison série, il va y avoir une erreur “Upload Failed”, c’est donc normal aucune inquietude, je rappelle que l’on voulait juste  générer ce fichier, ce qui est fait.

Upload SPIFFS en ligne de commande

Lors du téléchargement OTA, la différence avec le fichier firmware, c’est qu’il faut préciser que c’est un système de fichier SPIFFS, ce qui est positionné en ajoutant le paramètre -s  le nom du fichier devient Wifinfo.spiffs.bin  au lieu de Wifinfo.cpp.bin Ce qui nous donne la commande suivante :

ota -i 192.168.1.205 -s -f Wifinfo.spiffs.bin --auth=OTA_WifInfo -r

Et enfin voici ce que cela donne après quelques vérifications :

ESP8266 OTA SPIFFS command line

ESP8266 OTA SPIFFS command line

Comme vous le voyez, rien de bien compliqué par rapport à l’update du firmware, mais à l’avenir il sera possible de faire encore plus rapide…

Via l’interface WEB de WifInfo

Et oui, avec les joies des interfaces Web il va être possible de faire encore plus simplement, il suffira de faire un glisser/déposer du fichier .cpp.bin  ou .spiffs.bin  directement depuis l’interface Web comme ceci

ESP8266 WifInfo OTA Web Interface

ESP8266 WifInfo OTA Web Interface

J’espère avoir fait le tour de ce dont vous allez avoir besoin pour faire des mise à jour via Wifi. Cet article sera en évolution constante en fonction des nouveautés et des changements à venir, donc, restez connectés

Cet article sera très certainement le dernier avant 2016, alors je vous souhaite à tous de passer de joyeuses fêtes de fin d’année.

Charles

Charles

You can discuss about this article or other project using the community forum