Over the Air (OTA) Flashing not working from PlatformIO


As the title suggests, I cannot get PlatformIO to upload my firmware OTA to my ESP32 regardless of the settings I have changed. I have, however, been able to flash the ESP32 OTA when I use the “OTAWebUpdater” example from the ArduinoOTA library. This leads me to believe something is wrong with the uploading/flashing process on my PC/PlatformIO side.

The error I get when uploading via the espota protocol is:

Configuring upload protocol...
AVAILABLE: cmsis-dap, esp-bridge, esp-builtin, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa     
CURRENT: upload_protocol = espota
Uploading .pio\build\esp32-s3-devkitc-1\firmware.bin
00:51:59 [DEBUG]: Options: {'esp_ip': '', 'host_ip': '', 'esp_port': 3232, 'host_port': 29312, 'auth': '', 'image': '.pio\\build\\esp32-s3-devkitc-1\\firmware.bin', 'spiffs': False, 'debug': True, 'progress': True, 'timeout': 10}
00:51:59 [INFO]: Starting on
00:51:59 [INFO]: Upload size: 762304
Sending invitation to ..........
00:53:39 [ERROR]: No response from the ESP
*** [upload] Error 1

I’ve dug through as many forum posts as I could to remedy this. I have disabled my firewall and tried many other changes to no avail. Are there some other settings I need to change/enable to make the OTA upload work? I’m surprised it works with the OTAWebUpdater example, but not with the BasicOTA example.

Modified BasicOTA (does not work):

#include <ESPmDNS.h>
#include <FastLED.h>
#include <WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "BenjaminWifi";
const char* password = "megafart";
CRGB leds[1];
bool LEDsOn = true;
unsigned long lastTime = millis();

void setup() {
    WiFi.begin(ssid, password);
    while (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.println("Connection Failed! Rebooting...");

    // Port defaults to 3232
    // ArduinoOTA.setPort(3232);

    // Hostname defaults to esp3232-[MAC]
    // ArduinoOTA.setHostname("myesp32");

    // No authentication by default
    // ArduinoOTA.setPassword("admin");

    // Password can be set with it's md5 value as well
    // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
    // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

        .onStart([]() {
            String type;
            if (ArduinoOTA.getCommand() == U_FLASH)
                type = "sketch";
            else  // U_SPIFFS
                type = "filesystem";

            // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
            Serial.println("Start updating " + type);
        .onEnd([]() {
        .onProgress([](unsigned int progress, unsigned int total) {
            Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
        .onError([](ota_error_t error) {
            Serial.printf("Error[%u]: ", error);
            if (error == OTA_AUTH_ERROR)
                Serial.println("Auth Failed");
            else if (error == OTA_BEGIN_ERROR)
                Serial.println("Begin Failed");
            else if (error == OTA_CONNECT_ERROR)
                Serial.println("Connect Failed");
            else if (error == OTA_RECEIVE_ERROR)
                Serial.println("Receive Failed");
            else if (error == OTA_END_ERROR)
                Serial.println("End Failed");


    Serial.print("IP address: ");

    FastLED.addLeds<NEOPIXEL, 38>(leds, 1);

void loop() {
    if(millis() - lastTime > 1000){
        lastTime = millis();
            leds[0] = CRGB(0x80, 0x00, 0x00);
            Serial.println("Led on");
            LEDsOn = false;
            leds[0] = CRGB(0x00, 0x00, 0x00);
            Serial.println("Led off");
            LEDsOn = true;

Platform.ini file:

;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting

platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
board_build.flash_mode = opi
lib_deps = 
upload_protocol = espota
upload_port =

Hi @benjamin.a.molnar
I made a test and have no issues.

Please check that the trailing ` is just a copy and paste error and is not inside your platformio.ini

Please also check that the IP address matches the address on the serial monitor.

Yes the ` was frome me messing with markdown and isn’t in the actial project. The IP is correct. I see the device on my wifi network with that IP and can ping it with my PC on the same network. However OTA flashing yields no response from the device. I have no idea why.

Pinging the ESP is not the problem.
The ESP must also be able to reach your PC!

The procedure is as follows:

  • The PC starts a service on a free port (here: 29312)
  • The PC sends an invitation to the ESP on port 3232 and submitts its address and the current download port
  • The ESP connects to the submitted address and port and starts downloading the new firmware.

It appears that something in the second/third step is not completing correctly. Is there a good way to troubleshoot these steps specifically so I can see where the process is dropped?

Maybe running wireshark and capturing the traffic could help to see what’s going on.

I suspect something on your PC is blocking traffic.