An ESPHome device no longer needs Wi-Fi or Ethernet to reach the network. A new modem component, merged on 23 October 2026 for ESPHome 2026.11, brings up an IP connection over PPP through a cellular modem wired to the ESP32's UART. The API, MQTT and OTA updates then work the same way they do over Wi-Fi. The pull request was opened in May 2024 and closes four feature requests, the oldest from November 2019. People have wanted this for a long time, for sheds, allotments, boats and other places without a home network.
Supported modems and limits
The model option takes BG96, SIM800, SIM7000, SIM7070, SIM7080, SIM7600, SIM7670 or GENERIC. GENERIC drives an unlisted modem with standard AT commands. Every modem, including the generic one, must support CMUX (3GPP TS 27.010). The component uses it to multiplex the link, so you can still send AT commands while data is flowing. Underneath it runs Espressif's esp_modem 2.1.0 library.
A minimal configuration needs four lines: the model, the operator's APN and the RX and TX pins. Optional rts_pin and cts_pin turn on hardware flow control.
There are a few restrictions:
- Only ESP32 chips with the ESP-IDF framework are supported.
modemcan't be used together withethernetorcaptive_portal.- The component doesn't drive the modem's
PWRKEYpin. If a board needs a power-on pulse, setenable_on_boot: false, pulse the pin fromon_bootand then callmodem.enable. - GNSS, power management and signal strength sensors were left out to keep the first version small. The author says they can follow later as separate platforms.
Home Assistant behind the operator's NAT
On most mobile networks the device gets a private address behind the operator's NAT, so Home Assistant can't open a connection to it. The documentation recommends MQTT, where the device connects out to the broker, or the native API over a WireGuard tunnel.
Safe SIM handling
The SIM PIN is sent at most twice, and the count survives reboots. A wrong PIN therefore stops the modem instead of locking the SIM. A PIN the SIM rejects outright uses up both attempts at once, and the component then reports an error until you fix pin_code. Changing pin_code resets the count.
If the connection stays down for reboot_timeout (10 minutes by default), the device reboots. Setting it to 0s turns that off. Besides the modem.enable, modem.disable and modem.send_at actions, there are on_sync, on_connect and on_disconnect triggers, modem.connected and modem.enabled conditions, and a urc text sensor that publishes the messages the modem sends on its own, such as network registration changes.
The component should arrive with ESPHome 2026.11. Its documentation is already merged into the next branch of the ESPHome docs.