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.
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.
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
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 :
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 :
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
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 :
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.
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 :
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)
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.
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 :
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
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