ESPHome Wi-Fi Disconnects: Fix Reconnect Loops and Offline ESP32 Nodes

Fix ESPHome Wi-Fi disconnects, reconnect loops and offline ESP32 nodes. Diagnose RSSI, power save, API reboot timeouts, DHCP/static IP, fast_connect, fallback APs, power problems and router issues.

When an ESPHome node keeps going offline, the Wi-Fi signal is only one possible cause. A device can have excellent RSSI and still disappear because Home Assistant cannot reach the native API, DHCP is failing, the ESP32 is rebooting from a weak power supply, fast_connect has latched onto the wrong access point, or Wi-Fi power saving is too aggressive for the router.

The fastest way to fix an unreliable ESPHome node is to stop treating every dropout as “bad Wi-Fi” and identify which layer is actually failing:

ESP32 power
   ↓
Wi-Fi association
   ↓
IP / DHCP / DNS
   ↓
ESPHome native API
   ↓
Home Assistant

This guide works through that chain from the bottom up and includes a diagnostic ESPHome configuration you can add temporarily to expose RSSI, IP address, BSSID, uptime and connection state.

First: Is the ESP32 Rebooting or Only Disconnecting?

This is the first thing to determine because the fixes are completely different.

SymptomMore likely cause
Uptime resets to zeroActual ESP32 reboot/crash/power issue/reboot timeout
Uptime continues but HA shows unavailableWi-Fi, IP, API or routing issue
Wi-Fi RSSI sensor disappears with uptime resetBoard rebooting
Device remains pingable but HA unavailableNative API problem
Device not pingable but uptime later remains highWi-Fi/IP reconnection problem
Device reboots on a regular ~15-minute patternCheck ESPHome Wi-Fi/API reboot timeouts

Add an uptime sensor before changing anything else:

sensor:
  - platform: uptime
    name: "ESP Uptime"
    update_interval: 60s
    entity_category: diagnostic

If uptime repeatedly returns to a small number, you are diagnosing resets, not merely a weak wireless connection.

ESPHome Has Two Different Reboot Timeouts

This catches a lot of people because both default to 15 minutes.

Wi-Fi reboot timeout

wifi:
  reboot_timeout: 15min

If the device cannot establish a Wi-Fi connection for that period, ESPHome reboots it. ESPHome documents this as a recovery mechanism because the low-level network stack can sometimes become stuck and only a full reboot restores it.

Native API reboot timeout

api:
  reboot_timeout: 15min

This is different. The ESP32 can be connected to Wi-Fi perfectly, have an IP address and still reboot if no native API client connects within the timeout.

That means a Home Assistant server outage, VLAN/firewall mistake or API routing problem can produce a regular reboot loop that looks like Wi-Fi instability.

Test the API Timeout Separately

For a device that must continue operating even while Home Assistant is offline, temporarily disable the API reboot timeout:

api:
  reboot_timeout: 0s

If the mysterious 15-minute resets disappear, the problem was not Wi-Fi association. Home Assistant or another API client was failing to connect.

Do the same carefully with the Wi-Fi timeout only while diagnosing:

wifi:
  reboot_timeout: 0s

Do not disable recovery timeouts blindly on every node. A real network-stack lockup can then leave the device offline indefinitely. Use 0s to isolate the cause, then decide what recovery policy makes sense for that device.

Add Wi-Fi Diagnostics to Every Unstable Node

sensor:
  - platform: wifi_signal
    name: "WiFi RSSI"
    id: wifi_rssi
    update_interval: 30s
    entity_category: diagnostic

  - platform: uptime
    name: "ESP Uptime"
    update_interval: 60s
    entity_category: diagnostic

text_sensor:
  - platform: wifi_info
    ip_address:
      name: "ESP IP Address"
    ssid:
      name: "Connected SSID"
    bssid:
      name: "Connected BSSID"
    dns_address:
      name: "DNS Address"
    power_save_mode:
      name: "WiFi Power Save Mode"

binary_sensor:
  - platform: status
    name: "ESPHome Connection"
    entity_category: diagnostic

This immediately tells you much more than the red “Unavailable” badge in Home Assistant.

The status binary sensor represents overall network/API connectivity, while the Wi-Fi information sensors expose which access point and IP configuration the ESP actually obtained.

How to Read RSSI Properly

ESPHome’s wifi_signal sensor reports RSSI in dBm. Values are negative; numbers closer to zero are stronger.

RSSIPractical interpretation
-30 to -50 dBmExcellent
-50 to -60 dBmVery good
-60 to -67 dBmUsually solid for ESPHome
-67 to -72 dBmUsable but less margin
-72 to -80 dBmWeak; dropouts become much more plausible
Below -80 dBmExpect poor reliability

These are practical engineering ranges rather than an ESPHome guarantee. Two devices at -68 dBm can behave differently depending on interference, antenna orientation and access-point implementation.

Also remember that RSSI only measures signal strength from the connected AP. It does not tell you how congested the channel is or whether packets are being retried heavily.

Strong RSSI Does Not Prove Good Wi-Fi

A node at -50 dBm can still disconnect because of:

  • 2.4 GHz interference.
  • Router firmware bugs.
  • Band-steering or mesh roaming behaviour.
  • Power-save incompatibility.
  • DHCP renewal failures.
  • Duplicate/static IP conflicts.
  • Weak ESP32 power supply during Wi-Fi transmit bursts.
  • API/firewall problems unrelated to RF.

Use RSSI to identify obvious coverage problems, not as proof that every other part of the network is healthy.

Try power_save_mode: none

ESPHome supports three Wi-Fi power-save levels:

NONE
LIGHT
HIGH

Current ESPHome defaults to LIGHT on ESP32. ESPHome explicitly warns that stronger power saving generally reduces Wi-Fi reliability and can produce more frequent disconnections.

For a mains-powered node that keeps dropping offline, this is one of the first settings to test:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: none

If stability improves dramatically, you have found a router/power-save interaction rather than a coverage problem.

For a battery node, disabling power saving can shorten runtime considerably, so treat it as a diagnostic step before deciding on the final configuration.

fast_connect Can Make Roaming Worse

fast_connect skips a full Wi-Fi scan and attempts to connect directly. This can reduce connection time and therefore save energy, but it has a downside.

ESPHome warns that a fast-connect device may connect to the first suitable network/AP it sees even when a better access point is available.

In a house with several mesh nodes or access points using the same SSID, this can create a situation like:

Kitchen ESP32:
AP beside kitchen = -48 dBm
Upstairs AP       = -76 dBm

fast_connect
→ reconnects to upstairs AP
→ node technically works
→ connection becomes unreliable

If a stationary ESPHome node seems to attach to the wrong access point, expose the BSSID diagnostic and disable fast_connect temporarily.

When fast_connect Is Useful

It remains useful for:

  • Battery devices that wake briefly.
  • Single-AP networks.
  • Known fixed networks where scan time matters.

It is not automatically a “make Wi-Fi more reliable” setting.

Static IP Can Fix Slow or Failed DHCP

ESPHome’s own Wi-Fi documentation recommends trying a manual IP when a node connects slowly or has trouble obtaining network connectivity.

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  manual_ip:
    static_ip: 192.168.1.42
    gateway: 192.168.1.1
    subnet: 255.255.255.0
    dns1: 192.168.1.1

This removes DHCP negotiation from the startup path and can make reconnects quicker.

But a Bad Static IP Creates Its Own Problems

Only use a manual IP if you understand your network.

Common mistakes are:

  • Choosing an address inside the router DHCP pool that later gets assigned to another device.
  • Wrong gateway address.
  • Wrong subnet.
  • Static IP from an old network after changing router.
  • Wrong DNS server.

An IP conflict can look exactly like random Wi-Fi: the ESP32 associates with the AP, gets excellent RSSI, but packets intermittently go to another device using the same address.

For many home networks, a DHCP reservation configured in the router is cleaner than hard-coding an address in every ESPHome node.

.local / mDNS Problems Are Not Always Wi-Fi Problems

If:

garden-sensor.local

does not resolve, try the device’s actual IP address.

If the IP works but the hostname does not, Wi-Fi is fine. The problem is mDNS/name resolution.

This commonly appears during OTA uploads: ESPHome says the node cannot be found by name even though Home Assistant is still receiving data.

A static IP or router DHCP reservation also gives you a stable upload target without depending on .local resolution.

Fallback AP Can Confuse Troubleshooting

Many standard ESPHome configurations include:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  ap:
    ssid: "Sensor Fallback"
    password: !secret ap_password

captive_portal:

After the configured station connection fails for the AP timeout, ESPHome can start its own fallback hotspot.

If you suddenly see a Wi-Fi network named after the device, that is useful evidence: the ESP is powered and running, but it has failed to join the intended network.

Do not interpret the fallback AP appearing as proof that the ESP32 crashed.

Power Supply Problems Often Look Exactly Like Wi-Fi Dropouts

ESP32 current is bursty. Wi-Fi transmission can expose a marginal USB cable, weak 5 V adapter, poor regulator or long thin power lead.

Typical clues are:

  • Node works on a laptop USB port but not the installed supply.
  • Uptime resets rather than continuing.
  • Dropouts happen when a relay, display or sensor powers up.
  • Brownout/reset messages appear in serial logs.
  • Shortening the power cable fixes the problem.

Before moving access points, power the same board from a known-good USB supply for a day. If stability returns, fix power first.

Relay Boards Can Reset the ESP32

A common Home Assistant installation puts an ESP32 and relay board on the same cheap supply.

When the relay energises:

relay coil current rises
→ supply voltage dips
→ ESP32 brownout
→ reboot
→ HA reports unavailable
→ looks like Wi-Fi failure

Watch the uptime sensor while switching loads manually. If uptime resets exactly when the relay changes, the router is innocent.

Multiple Access Points: Watch the BSSID

When several APs share one SSID, the SSID sensor cannot tell you which radio the ESP32 is actually using. The BSSID can.

Expose:

text_sensor:
  - platform: wifi_info
    ssid:
      name: "Connected SSID"
    bssid:
      name: "Connected BSSID"

Then compare the BSSID with your access-point controller/router.

A fixed ESP32 should not repeatedly migrate between distant APs for no good reason. If it does, investigate mesh steering, minimum-RSSI policies or fast_connect.

2.4 GHz Is Required on Most ESP32 Boards

ESP32-C3, C6, S3 and the classic ESP32 use 2.4 GHz Wi-Fi for normal ESPHome operation. C6 supports Wi-Fi 6, but still on 2.4 GHz.

If your router has a combined 2.4/5/6 GHz SSID, that is normally fine, but some band-steering and “smart connect” implementations handle small IoT clients poorly.

As a diagnostic test, create a straightforward 2.4 GHz IoT SSID and move one unstable node onto it. If the problem disappears, investigate router steering/security rather than ESPHome code.

Check Wi-Fi Security Settings

Very new or heavily locked-down router configurations can also cause problems:

  • WPA3-only networks with older ESP hardware/firmware.
  • PMF/802.11w settings that are too strict for some clients.
  • Client isolation blocking Home Assistant from reaching ESPHome.
  • VLAN firewall rules allowing internet access but blocking local TCP 6053.
  • Router policies that disconnect low-traffic IoT stations.

A device can therefore connect to Wi-Fi and even reach the internet while remaining unavailable to Home Assistant on another VLAN.

Ping Is a Very Useful Divider

When Home Assistant reports the ESPHome device unavailable, immediately try its IP address:

ping 192.168.1.42

Interpret the result like this:

PingHome AssistantLikely area
WorksUnavailableAPI/firewall/integration issue
FailsUnavailableWi-Fi/IP/power/reboot issue
Works intermittentlyFlappingRF/interference/IP conflict/power

This simple test often saves a lot of random YAML changes.

Safe Mode Helps with Real Boot Loops

ESPHome includes a safe-mode recovery system. After repeated failed boots, safe mode can start with almost all normal components disabled while retaining logging, networking and OTA so you can upload repaired firmware.

Current ESPHome defaults to entering safe mode after ten failed boot attempts, and a boot is normally considered good after one minute.

If a newly added display, external component or sensor driver causes immediate crashes, safe mode is more relevant than Wi-Fi tuning.

A minimal explicit configuration is:

safe_mode:
  num_attempts: 10
  reboot_timeout: 5min

OTA already enables safe-mode support in normal ESPHome setups, so this block is usually only needed when changing defaults.

A Good Diagnostic Wi-Fi Configuration

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  power_save_mode: none

  ap:
    ssid: "ESP Diagnostic Fallback"
    password: !secret ap_password

api:
  encryption:
    key: !secret api_encryption_key
  reboot_timeout: 0s

ota:
  - platform: esphome

captive_portal:

sensor:
  - platform: wifi_signal
    name: "WiFi RSSI"
    update_interval: 30s
    entity_category: diagnostic

  - platform: uptime
    name: "ESP Uptime"
    update_interval: 60s
    entity_category: diagnostic

text_sensor:
  - platform: wifi_info
    ip_address:
      name: "ESP IP"
    ssid:
      name: "ESP SSID"
    bssid:
      name: "ESP BSSID"
    dns_address:
      name: "ESP DNS"
    power_save_mode:
      name: "ESP WiFi Power Save"

binary_sensor:
  - platform: status
    name: "ESPHome Status"
    entity_category: diagnostic

This is deliberately a diagnostic configuration, not a universal final configuration. It disables API-triggered rebooting and Wi-Fi power saving so you can observe the underlying behaviour.

Recommended Troubleshooting Order

  1. Add uptime and Wi-Fi RSSI sensors.
  2. Determine whether the ESP32 is actually rebooting.
  3. Check whether resets occur on a regular 15-minute interval.
  4. Disable API reboot timeout temporarily.
  5. Set power_save_mode: none.
  6. Check RSSI and BSSID.
  7. Disable fast_connect if multiple APs exist.
  8. Ping the device while Home Assistant says unavailable.
  9. Verify DHCP/static IP and look for duplicate addresses.
  10. Test with a known-good power supply and USB cable.
  11. Check VLAN/firewall/router policies.
  12. Only then consider hardware antenna faults or replacing the ESP32.

Quick Fault Table

SymptomMost useful first check
Unavailable every ~15 minAPI and Wi-Fi reboot_timeout
RSSI -80 dBmImprove AP/antenna placement
RSSI -50 dBm but still disconnectsPower save, API, DHCP, router, power supply
Uptime resets with relay switchingPower supply/brownout
Ping works but HA unavailableNative API/VLAN/firewall
IP works but hostname does notmDNS/.local resolution
Node connects to distant mesh APBSSID and fast_connect
Fallback hotspot appearsStation Wi-Fi connection failed
Works after reboot then degradesNetwork stack/router/API behaviour
Reboots immediately after new firmwareCrash loop/safe mode, not Wi-Fi

What I Would Change First on a Mains-Powered ESPHome Node

For a fixed mains-powered ESP32 that randomly disappears, the first test configuration I would use is:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: none

api:
  reboot_timeout: 0s

Then expose uptime, RSSI, BSSID and IP address and leave it running.

If the node is suddenly stable, re-enable one behaviour at a time. That tells you whether the culprit was Wi-Fi power saving, API connectivity or something else rather than blindly applying ten “ESPHome Wi-Fi fixes” at once.

Related ESPHome Networking Guides

Official ESPHome Resources

Share your love