From cd2e04b6dd494627ccbb12137717f94f386df4d1 Mon Sep 17 00:00:00 2001 From: krzychb Date: Fri, 2 Sep 2016 12:21:48 +0200 Subject: [PATCH] Extended troubleshooting section * Missing reset after serial upload, ref. #2438, #2465 * Port not visible in IDE, ref. #2415 * `[alt text]` added * Typo corrections --- ...external-serial-terminal-output-failed.png | Bin 0 -> 77057 bytes doc/ota_updates/readme.md | 141 ++++++++++-------- 2 files changed, 75 insertions(+), 66 deletions(-) create mode 100644 doc/ota_updates/a-ota-external-serial-terminal-output-failed.png diff --git a/doc/ota_updates/a-ota-external-serial-terminal-output-failed.png b/doc/ota_updates/a-ota-external-serial-terminal-output-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..01bb784100c6f542300114140052c71a3e4d5fa0 GIT binary patch literal 77057 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 literal 0 HcmV?d00001 diff --git a/doc/ota_updates/readme.md b/doc/ota_updates/readme.md index 39c5832589..8ccfb946de 100644 --- a/doc/ota_updates/readme.md +++ b/doc/ota_updates/readme.md @@ -59,16 +59,16 @@ void setPassword(const char* password); Certain protection functionality is already built in and do not require any additional coding by developer. [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) and espota.py use [Digest-MD5](https://en.wikipedia.org/wiki/Digest_access_authentication) to authenticate upload. Integrity of transferred data is verified on ESP side using [MD5](https://en.wikipedia.org/wiki/MD5) checksum. -Make your own risk analysis and depending on application decide what library functions to implement. If required consider implementation of other means of protection from being hacked, e.g. exposing module for uploads only according to specific schedule, trigger OTA only be user pressing dedicated “Update” button, etc. +Make your own risk analysis and depending on application decide what library functions to implement. If required, consider implementation of other means of protection from being hacked, e.g. exposing module for uploads only according to specific schedule, trigger OTA only be user pressing dedicated “Update” button wired to ESP, etc. ### Safety -OTA process takes ESP’s resources and bandwidth during upload. Then module is restarted and a new sketch executed. Analyse and test how it affects functionality of your existing and new sketch. +OTA process takes ESP’s resources and bandwidth during upload. Then module is restarted and a new sketch executed. Analyse and test how it affects functionality of existing and new sketch. -If ESP is placed in remote location and controlling some equipment, you should put additional attention what happens if operation of this equipment is suddenly interrupted by update process. Therefore decide how to put this equipment into safe state before starting the update. For instance your module may be controlling a garden watering system in a sequence. If this sequence is not properly shut down and a water valve left open, your garden may be flooded if this valve is not closed after OTA is finished and module restarts. +If ESP is placed in remote location and controlling some equipment, you should put additional attention what happens if operation of this equipment is suddenly interrupted by update process. Therefore, decide how to put this equipment into safe state before starting the update. For instance, your module may be controlling a garden watering system in a sequence. If this sequence is not properly shut down and a water valve left open, your garden may be flooded. -The following functions are provided with [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library and intended to handle functionality of your application during specific stages of OTA or on an OTA error: +The following functions are provided with [ArduinoOTA](https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA) library and intended to handle functionality of your application during specific stages of OTA, or on an OTA error: ```cpp void onStart(OTA_CALLBACK(fn)); @@ -79,15 +79,16 @@ void onError(OTA_CALLBACK_ERROR (fn)); ### Basic Requirements -Flash chip size needs a size that is able to hold the old sketch (currently running) and the new sketch (OTA) at the same time. +Flash chip size should be able to hold the old sketch (currently running) and the new sketch (OTA) at the same time. + Keep in mind that the File system and EEPROM for example needs space too (one time) see [flash layout](../filesystem.md#flash-layout). + ```cpp ESP.getFreeSketchSpace(); ``` can be used for checking the free space for the new sketch. -For overview of memory layout, where new sketch is stored and how it is copied during OTA process see [Update process - memory view](#update-process---memory-view). - +For overview of memory layout, where new sketch is stored and how it is copied during OTA process, see [Update process - memory view](#update-process---memory-view). The following chapters provide more details and specific methods of doing OTA. @@ -95,9 +96,9 @@ The following chapters provide more details and specific methods of doing OTA. ## Arduino IDE Uploading modules wirelessly from Arduino IDE is intended for the following typical scenarios: -- during firmware development as a quicker alternative to loading over a serial -- for updating small quantity of modules -- only if modules are available on the same network as the computer with Arduino IDE +- during firmware development as a quicker alternative to loading over a serial, +- for updating small quantity of modules, +- only if modules are available on the same network as the computer with Arduino IDE. ### Requirements @@ -106,7 +107,7 @@ Uploading modules wirelessly from Arduino IDE is intended for the following typi ### Application Example -Instructions below show configuration of OTA on NodeMCU 1.0 (ESP-12E Module) board. You can use any other board assuming that it meets [requirements](#basic-requirements) described above. This instruction is valid for all operating systems supported by Arduino IDE. Screen captures have been made on Windows 7 and you may see small differences (like name of serial port) if you are using Linux and MacOS. +Instructions below show configuration of OTA on NodeMCU 1.0 (ESP-12E Module) board. You can use any other board assuming that it meets [requirements](#basic-requirements) described above. This instruction is valid for all operating systems supported by Arduino IDE. Screen captures have been made on Windows 7 and you may see small differences (like name of serial port), if you are using Linux and MacOS. 1. Before you begin, please make sure that you have the following s/w installed: - Arduino IDE 1.6.7 or newer - https://www.arduino.cc/en/Main/Software @@ -115,39 +116,41 @@ Instructions below show configuration of OTA on NodeMCU 1.0 (ESP-12E Module) boa **Note:** Windows users should select “Add python.exe to Path” (see below – this option is not selected by default). - ![Python installation set up](a-ota-python-configuration.png) + ![alt text](a-ota-python-configuration.png "Python installation set up") 2. Now prepare the sketch and configuration for the upload over a serial port. - - Start Arduino IDE and load sketch BasicOTA.ino available under File > Examples > ArduinoOTA - ![selection of example OTA sketch](a-ota-sketch-selection.png) + - Start Arduino IDE and load sketch BasicOTA.ino available under File > Examples > ArduinoOTA + ![alt text](a-ota-sketch-selection.png "Selection of example OTA sketch") - - Update SSID and password in the sketch so the module can join your Wi-Fi network - ![SSID and password entry](a-ota-ssid-pass-entry.png) + - Update SSID and password in the sketch, so the module can join your Wi-Fi network + ![alt text](a-ota-ssid-pass-entry.png "SSID and password entry") - Configure upload parameters as below (you may need to adjust configuration if you are using a different module): - ![configuration of serial upload](a-ota-serial-upload-configuration.png) + ![alt text](a-ota-serial-upload-configuration.png "Configuration of serial upload") - **Note:** Depending on version of platform package and board you have, you may see ``` Upload Using: ``` in the menu above. This option is inactive and it does not matter what you select. It has been left for compatibility with older implementation of OTA and is targeted for removal in platform package version 2.2.0. + **Note:** Depending on version of platform package and board you have, you may see `Upload Using:` in the menu above. This option is inactive and it does not matter what you select. It has been left for compatibility with older implementation of OTA and finally removed in platform package version 2.2.0. 3. Upload the sketch (Ctrl+U). Once done, open Serial Monitor (Ctrl+Shift+M) and check if module has joined your Wi-Fi network: - ![check if module joined network](a-ota-upload-complete-and-joined-wifi.png) + ![alt text](a-ota-upload-complete-and-joined-wifi.png "Check if module joined network") + + **Note:** ESP module should be reset after serial upload. Otherwise subsequent steps will not work. Reset may be done automatically for you after opening serial monitor as visible on the screenshot above. It depends on how you have DTR and RTS wired from USB-Serial converter to the ESP. If reset is not done automatically, then do it by pressing reset button or manually cycling the power. For more details why this should be done please refer to [FAQ](../faq#i-have-observed-a-case-when-esprestart-doesnt-work-what-is-the-reason-for-that) regarding `ESP.restart()`. -4. Only if module is connected to network, after a couple of seconds, the esp8266-ota port will show up in Arduino IDE. Select port with IP adress shown in Serial Monitor in previus step: +4. Only if module is connected to network, after a couple of seconds, the esp8266-ota port will show up in Arduino IDE. Select port with IP address shown in the Serial Monitor window in previous step: - ![selection of OTA port](a-ota-ota-port-selection.png) + ![alt text](a-ota-ota-port-selection.png "Selection of OTA port") - **Note:** If OTA port does not show up, exit Arduino IDE, open it again and check if port is there. If it does not help check your firewall settings. + **Note:** If OTA port does not show up, exit Arduino IDE, open it again and check if port is there. If it does not help, check your firewall and router settings. OTA port is advertised using mDNS service. To check if port is visible by your PC, you can use application like Bonjour Browser. 5. Now get ready for your first OTA upload by selecting the OTA port: - ![configuration of OTA upload](a-ota-ota-upload-configuration.png) + ![alt text](a-ota-ota-upload-configuration.png "Configuration of OTA upload") - **Note:** The menu entry ``` Upload Speed: ``` does not matter at this point as it concerns the serial port. Just left it unchanged. + **Note:** The menu entry `Upload Speed:` does not matter at this point as it concerns the serial port. Just left it unchanged. 6. If you have successfully completed all the above steps, you can upload (Ctrl+U) the same (or any other) sketch over OTA: - ![OTA upload complete](a-ota-ota-upload-complete.png) + ![alt text](a-ota-ota-upload-complete.png "OTA upload complete") **Note:** To be able to upload your sketch over and over again using OTA, you need to embed OTA routines inside. Please use BasicOTA.ino as an example. @@ -158,39 +161,38 @@ Protecting your OTA uploads with password is really straightforward. All you nee ```cpp ArduinoOTA.setPassword((const char *)"123"); - ``` -Where ``` 123 ``` is a sample password that you should replace with your own. +Where `123` is a sample password that you should replace with your own. -Before implementing it in your sketch, it is a good idea to check how it works using *BasicOTA.ino* sketch available under *File > Examples > ArduinoOTA*. Go ahead, open *BasicOTA.ino*, uncomment the above statement that is already there, and upload the sketch. To make troubleshooting easier, do not modify example sketch besides what is absolutely required. This is including original simple ``` 123 ``` OTA password. Then attempt to upload sketch again (using OTA). After compilation is complete, once upload is about to begin, you should see prompt for password as follows: +Before implementing it in your sketch, it is a good idea to check how it works using *BasicOTA.ino* sketch available under *File > Examples > ArduinoOTA*. Go ahead, open *BasicOTA.ino*, uncomment the above statement that is already there, and upload the sketch. To make troubleshooting easier, do not modify example sketch besides what is absolutely required. This is including original simple `123` OTA password. Then attempt to upload sketch again (using OTA). After compilation is complete, once upload is about to begin, you should see prompt for password as follows: -![Password prompt for OTA upload](a-ota-upload-password-prompt.png) +![alt text](a-ota-upload-password-prompt.png "Password prompt for OTA upload") -Enter the password and upload should be initiated as usual with the only difference being ``` Authenticating...OK ``` message visible in upload log. +Enter the password and upload should be initiated as usual with the only difference being `Authenticating...OK` message visible in upload log. -![ Authenticating...OK during OTA upload](a-ota-upload-password-authenticating-ok.png) +![alt text](a-ota-upload-password-authenticating-ok.png "Authenticating...OK during OTA upload") You will not be prompted for a reentering the same password next time. Arduino IDE will remember it for you. You will see prompt for password only after reopening IDE, or if you change it in your sketch, upload the sketch and then try to upload it again. Please note, it is possible to reveal password entered previously in Arduino IDE, if IDE has not been closed since last upload. This can be done by enabling *Show verbose output during: upload* in *File > Preferences* and attempting to upload the module. -![Verbose upload output with password passing in plan text](a-ota-upload-password-passing-upload-ok.png) +![alt text](a-ota-upload-password-passing-upload-ok.png "Verbose upload output with password passing in plain text") -The picture above shows that the password is visible in log as it is passed to *espota.py* upload script. +The picture above shows that the password is visible in log, as it is passed to *espota.py* upload script. Another example below shows situation when password is changed between uploads. -![Verbose output when OTA password has been changed between uploads](a-ota-upload-password-passing-again-upload-ok.png) +![alt text](a-ota-upload-password-passing-again-upload-ok.png "Verbose output when OTA password has been changed between uploads") When uploading, Arduino IDE used previously entered password, so the upload failed and that has been clearly reported by IDE. Only then IDE prompted for a new password. That was entered correctly and second attempt to upload has been successful. #### Troubleshooting -If OTA update fails, first step is to check for error messages that may be shown in upload window of Arduino IDE. If this is not providing any useful hints try to upload again while checking what is shown by ESP on serial port. Serial Monitor from IDE will not be useful in that case. When attempting to open it, you will likely see the following: +If OTA update fails, first step is to check for error messages that may be shown in upload window of Arduino IDE. If this is not providing any useful hints, try to upload again while checking what is shown by ESP on serial port. Serial Monitor from IDE will not be useful in that case. When attempting to open it, you will likely see the following: -![Arduino IDE network terminal window](a-ota-network-terminal.png) +![alt text](a-ota-network-terminal.png "Arduino IDE network terminal window") This window is for Arduino Yún and not yet implemented for esp8266/Arduino. It shows up because IDE is attempting to open Serial Monitor using network port you have selected for OTA upload. @@ -198,20 +200,27 @@ Instead you need an external serial monitor. If you are a Windows user check out Select COM port and baud rate on external terminal program as if you were using Arduino Serial Monitor. Please see typical settings for [Termite](http://www.compuphase.com/software_termite.htm) below: -![Termite settings](termite-configuration.png) +![alt text](termite-configuration.png "Termite settings") Then run OTA from IDE and look what is displayed on terminal. Successful [ArduinoOTA](#arduinoota) process using BasicOTA.ino sketch looks like below (IP address depends on your network configuration): -![OTA upload successful - output on an external serial terminal](a-ota-external-serial-terminal-output.png) +![alt text](a-ota-external-serial-terminal-output.png "OTA upload successful - output on an external serial terminal") + +If upload fails you will likely see errors caught by the uploader, exception and the stack trace, or both. + +Instead of the log as on the above screen you may see the following: + +![alt text](a-ota-external-serial-terminal-output-failed.png "OTA upload failed - output on an external serial terminal") -If upload fails you will likely see errors caught by the uploader, exception and the stack dump, or both. +If this is the case, then most likely ESP module has not been reset after initial upload using serial port. The most common causes of OTA failure are as follows: * not enough physical memory on the chip (e.g. ESP01 with 512K flash memory is not enough for OTA), -* too much memory declared for SPIFFS so new sketch will not fit between existing sketch and SPIFFS – see [Update process - memory view](#update-process---memory-view), -* too little memory declared in Arduino IDE for your selected board (i.e. less than physical size). +* too much memory declared for SPIFFS so new sketch will not fit between existing sketch and SPIFFS – see [Update process - memory view](#update-process---memory-view), +* too little memory declared in Arduino IDE for your selected board (i.e. less than physical size), +* not resetting the ESP module after initial upload using serial port. -For more details regarding flash memory layout please check [File system]( https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md). +For more details regarding flash memory layout please check [File system](https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md). For overview where new sketch is stored, how it is copied and how memory is organized for the purpose of OTA see [Update process - memory view](#update-process---memory-view). @@ -219,9 +228,9 @@ For overview where new sketch is stored, how it is copied and how memory is orga Updates described in this chapter are done with a web browser that can be useful in the following typical scenarios: -- after application deployment if loading directly from Arduino IDE is inconvenient or not possible -- after deployment if user is unable to expose module for OTA from external update server -- to provide updates after deployment to small quantity of modules when setting an update server is not practicable +- after application deployment if loading directly from Arduino IDE is inconvenient or not possible, +- after deployment if user is unable to expose module for OTA from external update server, +- to provide updates after deployment to small quantity of modules when setting an update server is not practicable. ### Requirements @@ -231,7 +240,7 @@ Updates described in this chapter are done with a web browser that can be useful ### Implementation Overview -Updates with a web browser are implemented using ``` ESP8266HTTPUpdateServer ``` class together with ``` ESP8266WebServer ``` and ``` ESP8266mDNS ``` classes. The following code is required to get it work: +Updates with a web browser are implemented using `ESP8266HTTPUpdateServer` class together with `ESP8266WebServer` and `ESP8266mDNS` classes. The following code is required to get it work: setup() @@ -255,10 +264,10 @@ loop() The sample implementation provided below has been done using: -- example sketch WebUpdater.ino available in ``` ESP8266HTTPUpdateServer ``` library -- NodeMCU 1.0 (ESP-12E Module) +- example sketch WebUpdater.ino available in `ESP8266HTTPUpdateServer` library, +- NodeMCU 1.0 (ESP-12E Module). -You can use another module if it meets previously desribed [requirements](#basic-requirements). +You can use another module if it meets previously described [requirements](#basic-requirements). 1. Before you begin, please make sure that you have the following software installed: @@ -270,42 +279,42 @@ You can use another module if it meets previously desribed [requirements](#basic 2. Prepare the sketch and configuration for initial upload with a serial port. - Start Arduino IDE and load sketch WebUpdater.ino available under File > Examples > ESP8266HTTPUpdateServer. - - Update SSID and password in the sketch so the module can join your Wi-Fi network. + - Update SSID and password in the sketch, so the module can join your Wi-Fi network. - Open File > Preferences, look for “Show verbose output during:” and check out “compilation” option. - ![Preferences - enabling verbose output during compilation](ota-web-show-verbose-compilation.png) + ![alt text](ota-web-show-verbose-compilation.png "Preferences - enabling verbose output during compilation") **Note:** This setting will be required in step 5 below. You can uncheck this setting afterwards. -3. Upload sketch (Ctrl+U). Once done open Serial Monitor (Ctrl+Shift+M) and check if you see the following message displayed, that contains url for OTA update. +3. Upload sketch (Ctrl+U). Once done, open Serial Monitor (Ctrl+Shift+M) and check if you see the following message displayed, that contains url for OTA update. - ![Serial Monitor - after first load using serial](ota-web-serial-monitor-ready.png) + ![alt text](ota-web-serial-monitor-ready.png "Serial Monitor - after first load using serial") - **Note:** Such message will be shown only after module successfully joins network and is ready for an OTA upload. + **Note:** Such message will be shown only after module successfully joins network and is ready for an OTA upload. Please remember about resetting the module once after serial upload as discussed in chapter [Arduino IDE](#arduino-ide), step 3. -4. Now open web browser and enter the url provided on Serial Monitor, i.e. http://esp8266-webupdate.local/update. Once entered, browser should display a form like below that has been served by your module. The form invites you to choose a file for update. +4. Now open web browser and enter the url provided on Serial Monitor, i.e. `http://esp8266-webupdate.local/update`. Once entered, browser should display a form like below that has been served by your module. The form invites you to choose a file for update. - ![OTA update form in web browser](ota-web-browser-form.png) + ![alt text](ota-web-browser-form.png "OTA update form in web browser") - **Note:** If entering ``` http://esp8266-webupdate.local/update ``` does not work, try replacing ``` esp8266-webupdate ``` with module’s IP address. For example, if your module IP is ``` 192.168.1.100 ``` then url should be ``` http://192.168.1.100/update ```. This workaround is useful in case the host software installed in step 2 does not work. If still nothing works and there are no clues on Serial Monitor, try to diagnose issue by opening provided url in Google Chrome, pressing F12 and checking contents of “Console” and “Network” tabs. Chrome provides some advanced logging on these tabs. + **Note:** If entering `http://esp8266-webupdate.local/update` does not work, try replacing `esp8266-webupdate` with module’s IP address. For example, if your module IP is `192.168.1.100` then url should be `http://192.168.1.100/update`. This workaround is useful in case the host software installed in step 1 does not work. If still nothing works and there are no clues on the Serial Monitor, try to diagnose issue by opening provided url in Google Chrome, pressing F12 and checking contents of “Console” and “Network” tabs. Chrome provides some advanced logging on these tabs. -5. To obtain the file navigate to directory used by Arduino IDE to store results of compilation. You can check the path to this file in compilation log shown in IDE debug window as marked below. +5. To obtain the file, navigate to directory used by Arduino IDE to store results of compilation. You can check the path to this file in compilation log shown in IDE debug window as marked below. - ![Compilation complete - path to binary file](ota-web-path-to-binary.png) + ![alt text](ota-web-path-to-binary.png "Compilation complete - path to binary file") -6. Now press “Choose File” in web browser, go to directory identified in step 5 above, find the file “WebUpdater.cpp.bin” and upload it. If upload is successful you will see “OK” on web browser like below. +6. Now press “Choose File” in web browser, go to directory identified in step 5 above, find the file “WebUpdater.cpp.bin” and upload it. If upload is successful, you will see “OK” on web browser like below. - ![OTA update complete](ota-web-browser-form-ok.png) + ![alt text](ota-web-browser-form-ok.png "OTA update complete") Module will reboot that should be visible on Serial Monitor: - ![Serial Monitor - after OTA update](ota-web-serial-monitor-reboot.png) + ![alt text](ota-web-serial-monitor-reboot.png "Serial Monitor - after OTA update") - Just after reboot you should see exactly the same message ``` HTTPUpdateServer ready! Open http:// esp8266-webupdate.local /update in your browser``` like in step 3. This is because module has been loaded again with the same code – first using serial port, and then using OTA. + Just after reboot you should see exactly the same message `HTTPUpdateServer ready! Open http:// esp8266-webupdate.local /update in your browser` like in step 3. This is because module has been loaded again with the same code – first using serial port, and then using OTA. -Once you are comfortable with this procedure go ahead and modify WebUpdater.ino sketch to print some additional messages, compile it, locate new binary file and upload it using web browser to see entered changes on a Serial Monitor. +Once you are comfortable with this procedure, go ahead and modify WebUpdater.ino sketch to print some additional messages, compile it, locate new binary file and upload it using web browser to see entered changes on a Serial Monitor. -You can also add OTA routines to your own sketch following guidelines in [Implementation Overview](#implementation-overview) above. If this is done correctly you should be always able to upload new sketch over the previous one using a web browser. +You can also add OTA routines to your own sketch following guidelines in [Implementation Overview](#implementation-overview) above. If this is done correctly, you should be always able to upload new sketch over the previous one using a web browser. In case OTA update fails dead after entering modifications in your sketch, you can always recover module by loading it over a serial port. Then diagnose the issue with sketch using Serial Monitor. Once the issue is fixed try OTA again. @@ -470,5 +479,5 @@ checking its integrity and telling the bootloader to load the new firmware on th - the new sketch is now copied "over" the old one. - the new sketch is started. -![Memory Copy](update_memory_copy.png) +![alt text](update_memory_copy.png "Memory layout for OTA updates")