Contents

Bluetooth Proxies Under $20: Room Detection with ESP32-C3

Drop a few ESP32 boards ($3-8 each) flashed with ESPHome ’s Bluetooth Proxy firmware into rooms where BLE devices drop out. Home Assistant then routes Bluetooth traffic through the nearest proxy on its own. Each proxy adds about 10-15 meters of BLE coverage through interior walls, needs only a USB power cable, and works with HA’s native Bluetooth setup. The BLE devices themselves need no config changes. They have no idea they’re talking through a relay.

A typical three-bedroom house needs two or three proxies for wall-to-wall coverage. Total hardware cost sits under $20. Power draw is under 2 watts for the lot, and the whole thing can be running in under 30 minutes.

Why Bluetooth Falls Short in a Smart Home

Bluetooth Low Energy has a top range over 100 meters in open air. Indoors, the story is much worse. Through standard drywall, real range drops to 5-10 meters. Through brick, concrete, or floors with rebar, expect 3-5 meters at best. A Home Assistant server tucked in a closet or rack may only reach BLE devices in the same room and one room over.

You’ve probably seen the signs if you’ve scattered BLE sensors around the house. Xiaomi LYWSD03MMC thermometers show “unavailable” every few hours. Switchbot devices time out during commands. Govee sensors get stuck on stale readings. HA logs fill up with BleakError or Connection timeout entries. Presence checks based on phone BLE beacons fail in distant rooms. The signal never makes it back to the server.

The obvious fix is a better antenna. Swapping in a high-gain USB adapter like the TP-Link UB500 (Realtek RTL8761B chipset) does help, but only by about 2-3 meters. BLE is a short-range protocol by design. No single antenna spot can cover a whole house. You need multiple listeners spread across the building, and that’s exactly what Bluetooth proxying provides.

How Bluetooth Proxying Works

An ESP32 running ESPHome’s Bluetooth Proxy component acts as a Wi-Fi-to-BLE bridge. It scans for BLE ads nearby and sends them to Home Assistant over Wi-Fi. For devices that need active links (reading GATT data, writing commands), HA sends the request to the proxy. The proxy runs it on the BLE side and sends back the result. The BLE device never knows a proxy is in the loop.

When multiple proxies can see the same device, Home Assistant picks the one reporting the strongest RSSI (signal strength). If a proxy goes offline, HA falls back to the next-best proxy or the built-in Bluetooth adapter. This happens with no manual failover setup.

One key distinction: a Bluetooth proxy is not a BLE mesh repeater. It doesn’t extend BLE range between devices. It only bridges BLE devices and Home Assistant. BLE mesh, used by some commercial systems, runs at a different protocol layer.

Coverage Planning

For placement, think one proxy per floor or per two to three rooms. An apartment usually needs one or two. A two-story house with a basement might need three or four. The proxy only needs USB power and Wi-Fi. No Ethernet, no special mounting hardware. A short USB-C cable and a phone charger hidden behind a bookshelf works fine.

Choosing the Right ESP32 Board

Not every ESP32 board works as well as a Bluetooth proxy. The chip type sets whether you get passive-only or full active proxying. The board design shapes range and uptime.

ESP32 (Original)

The classic ESP32-WROOM-32 and ESP32-DevKitC boards support BLE 4.2. They work for passive (ad-only) proxying. That means they can relay sensor broadcasts from devices like Xiaomi thermometers or Ruuvi tags. But the original ESP32’s Bluetooth stack can’t hold many active links while proxying. So active proxying (linking to devices for reads and writes) is flaky. Use these boards only if all your BLE devices broadcast passively.

ESP32-C3

The ESP32-C3 supports both passive and active proxying with BLE 5.0. It’s a single-core RISC-V chip that draws less power than the original ESP32. Popular boards include the Seeed XIAO ESP32-C3 ($5) and the ESP32-C3 SuperMini ($2.50-3 on AliExpress). The SuperMini measures just 22.5mm x 18mm, small enough to hide almost anywhere. This is the best starting point for most users.

ESP32-C3 SuperMini development board
The ESP32-C3 SuperMini - one of the smallest and cheapest boards for a Bluetooth proxy
Image: espboards.dev

ESP32-S3

The ESP32-S3 is the best pick when you have many active BLE devices. Think smart locks, Switchbot curtain motors, or BLE plant sensors that need polling. It’s dual-core with BLE 5.0 and handles more concurrent active connections than the C3. The ESP32-S3-DevKitC-1 ($8) or Seeed XIAO ESP32-S3 ($7) are solid choices.

What to Avoid

  • ESP8266 has no Bluetooth hardware at all
  • ESP32-S2 also lacks Bluetooth
  • ESP32-C6 has BLE 5.3 plus Zigbee and Thread border router capability, but ESPHome Bluetooth Proxy support is still experimental
  • Any board lacking an onboard PCB antenna or U.FL connector will have terrible range

Hardware Comparison

BoardBLE VersionActive ProxyApprox. PriceBest For
ESP32-WROOM-324.2No$4-6Passive sensors only
ESP32-C3 SuperMini5.0Yes$2.50-3Most users, compact installs
Seeed XIAO ESP32-C35.0Yes$5Reliable, well-documented
ESP32-S3-DevKitC-15.0Yes$8Many active BLE devices
Seeed XIAO ESP32-S35.0Yes$7Active devices, compact

External Antenna and Power

For top range in garages, basements, or open-plan areas, use an ESP32 board with a U.FL connector (such as the ESP32-WROOM-32U variant) and attach an external 2.4GHz antenna. A 5dBi antenna can boost BLE proxy range by 50-100% over the PCB antenna.

Power draw barely registers. Each proxy pulls 80-150mA at 5V (0.4-0.75W). Any USB phone charger will do. Three proxies running 24/7 cost roughly $1-2 per year in electricity.

Flashing ESPHome Bluetooth Proxy Firmware

ESPHome offers both a zero-code web installer and a custom YAML path for advanced users.

Web Installer (Easiest Method)

  1. Go to the ESPHome Bluetooth Proxy installer
  2. Plug the ESP32 into your computer via USB
  3. Click “Install” and pick the right board (ESP32, C3, or S3)
  4. Type in your Wi-Fi login when asked
  5. The browser flashes the firmware via Web Serial API (Chrome or Edge needed)

Total time: under two minutes. After flashing, the device shows up in the ESPHome Dashboard (if you run one). Adopt it from there to manage OTA updates going forward.

ESP32 development board commonly used as a Bluetooth proxy
A generic ESP32 board ready to be flashed with Bluetooth Proxy firmware via the ESPHome web installer
Image: ESPHome

Custom ESPHome YAML (Advanced)

For more control, create a custom ESPHome device config. Here’s a minimal working example for an ESP32-C3:

substitutions:
  name: bt-proxy-livingroom

esphome:
  name: ${name}
  name_add_mac_suffix: true

esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: esp-idf

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

logger:

api:
  encryption:
    key: !secret api_encryption_key

ota:
  platform: esphome

esp32_ble_tracker:

bluetooth_proxy:
  active: true

Key points on the YAML config:

  • bluetooth_proxy: active: true turns on link-based proxying for active devices, not just passive ad relays. In ESPHome 2026.3, active links are on by default.
  • The esp32_ble_tracker part is needed. The Bluetooth proxy depends on it.
  • connection_slots defaults to 3. Each slot uses about 1KB of RAM, with a max of 9. The ESPHome docs say stay at or below 5 to dodge memory issues. Ethernet-based proxies can usually handle 4 slots.
  • Use the esp-idf framework instead of Arduino. It speeds up Bluetooth on all ESP32 boards.
  • The api: encryption: key: setting locks all traffic between the proxy and Home Assistant.

For static IP setup, add a manual_ip: block under wifi: if your DHCP server is flaky. The proxy must be on the same network as Home Assistant or at least routable to it.

After the first USB flash, all later updates happen over Wi-Fi via OTA. The ESPHome Dashboard pushes updates on its own, and each one takes 30-60 seconds per proxy.

Monitoring Proxy Health

Each proxy exposes a few useful sensors in Home Assistant:

  • A Bluetooth proxy connections count showing active BLE connections held by that proxy
  • Wi-Fi signal strength, which flags proxies with poor placement. If the signal is weak, the proxy will drop BLE advertisements.
  • An uptime sensor that confirms the device hasn’t rebooted out of the blue

Home Assistant Integration and Device Discovery

Once a Bluetooth Proxy comes online, Home Assistant finds it on its own via the ESPHome API. No manual setup is needed. The proxy shows up under Settings > Devices & Services > ESPHome. HA then starts pulling in BLE advertisements from the proxy’s coverage area.

Discovering BLE Devices Through Proxies

Go to Settings > Devices & Services > Bluetooth. Home Assistant lists all found BLE devices, no matter which proxy spotted them. Devices that used to sit out of range of HA’s built-in Bluetooth but within range of a proxy will show up here for the first time. Click “Configure” to add them.

Supported device groups:

  • Passive sensors like Xiaomi LYWSD03MMC, Govee H5075, Ruuvi tags, and BTHome devices are ad-only and work with any ESP32 proxy
  • Active devices like Switchbot curtain motors, Switchbot locks, Oral-B toothbrushes, and BLE plant sensors need active proxy support (ESP32-C3 or S3)
  • BLE trackers like iBeacon, phone BLE ads, and Tile work with passive proxying for presence detection

Active BLE connections also let you bridge devices like Bluetooth OBD-II car diagnostics adapters straight into Home Assistant.

Proxy Selection and Failover

When multiple proxies can see the same BLE device, Home Assistant picks the one with the strongest RSSI. This happens on its own. In the Bluetooth integration settings, you can see which adapter or proxy is handling each device, and override the assignment if needed.

If a proxy goes offline, HA falls back to the next-best proxy or the built-in adapter. This gives you redundancy with no manual failover setup.

Performance Limits

For passive BLE ads (temperature sensors, beacon broadcasts), a single ESP32 proxy can handle 20-40 devices at once before performance starts to drop. For active connections, the connection_slots setting sets the ceiling. Default is 3, with a suggested max of 5. Devices that connect briefly to swap data and then disconnect free up the slot for others. So you can use more active devices than you have slots. Devices that stay connected all the time (some locks, thermostats) hold a slot the whole time.

Troubleshooting Discovery Issues

If a known BLE device doesn’t show up:

  • Check that the proxy’s Wi-Fi signal is strong. Weak Wi-Fi means missed ads forwarded to HA.
  • Check HA logs for bluetooth_proxy entries
  • Make sure the proxy has active: true in esp32_ble_tracker if the device needs active scanning to advertise
  • Place the proxy at least 3 meters from routers, switches, and other network gear. EMI hurts Bluetooth reception.

Room-Level Presence Detection with BLE Proxies

With a proxy in each room, you can go beyond “is someone home” and answer “which room are they in.” All from the phone they’re already carrying.

How BLE Presence Detection Works

Phones (both iOS and Android) keep broadcasting BLE ads. By measuring the RSSI (signal strength) at each proxy, Home Assistant can guess which room a device is in. The proxy with the strongest RSSI is the closest. This isn’t sub-meter positioning, but it’s reliable enough to tell the living room apart from the bedroom.

Bermuda Integration

The Bermuda add-on (via HACS ) pulls BLE RSSI data from all your Bluetooth proxies and guesses device distance and area. After setup, it builds sensor.bermuda_<device>_area entries that show the best-guess room for each tracked device.

Setup steps:

  1. Install Bermuda via HACS and restart Home Assistant
  2. Add the integration under Settings > Devices & Services
  3. Add your tracked devices (phone BLE MAC address or iBeacon UUID)
  4. Map each proxy to a room/area in HA
  5. Bermuda picks which proxy has the strongest signal and tags the device to that room

The update interval is tunable. It defaults to one second. Bermuda supports custom RSSI thresholds and area mappings for fine-tuning.

Bermuda integration device info panel in Home Assistant showing tracked BLE device sensors
Bermuda device info showing distance, area, and scanner details for a tracked Bluetooth device
Image: Bermuda GitHub

Dealing with MAC Randomization

Android’s BLE MAC randomization rotates the address from time to time, which breaks tracking. Two workarounds:

  • Use the Private BLE Device add-on (built into HA since 2023.10). It can resolve random addresses with an Identity Resolving Key (IRK).
  • Use the Home Assistant Companion app’s BLE transmitter feature to send a stable ID

iOS devices with the HA Companion app can use iBeacon mode for stable ID.

Improving Accuracy

  • Place proxies in the middle of each room, not against shared walls
  • The ESP32’s PCB antenna is slightly directional. Point the board toward the room’s center.
  • Tune RSSI thresholds by walking through rooms and noting signal levels
  • Accuracy is room-level (which room), not precise positioning (where in the room)

Bermuda sensor attributes showing area name, distance, and RSSI values
Bermuda sensor attributes with area name, MAC address, distance estimate, and RSSI readings from multiple proxies
Image: Bermuda GitHub

Presence Detection Compared

MethodDetectsAccuracyCost per RoomRequires
BLE Proxy + BermudaWhich room a person is inRoom-level$3-8Phone with BLE
mmWave Radar (e.g., LD2410B)Presence, even stationarySub-room zones$5-15Nothing (passive)
PIR SensorMotion onlyRoom-level$3-10Nothing (passive)
BLE + mmWave combinedBoth identity and presenceBest overall$8-20Phone for identity

BLE proxies tell you who is in a room (because they track a specific phone). mmWave and PIR sensors tell you that someone is in a room, but not who. Combining both gives you the full picture. mmWave confirms presence even when someone is sitting still, while BLE names the person.

Automation Examples

Once room-level presence works, automations get more targeted:

  • Turn on room-specific lights when sensor.bermuda_phone_area flips to “Living Room”
  • Turn off lights five minutes after the last person leaves a room
  • Adjust the thermostat based on which rooms are occupied
  • Play music in whatever room you walk into via a multi-room audio system
  • Arm a security zone when all tracked phones leave a set area

Practical Tips for Deployment

A few things worth knowing before you order a bag of ESP32-C3 boards.

Flash one proxy first, put it in the room with the worst BLE device, and check that it works before buying more. The web installer makes this a five-minute test.

Give each proxy a clear name in the ESPHome config (bt-proxy-kitchen, bt-proxy-bedroom) rather than the default. It helps when you’re poking around Bluetooth integration settings and trying to spot which proxy handles which device.

The proxy needs solid Wi-Fi to forward BLE data reliably. A proxy reporting -80 dBm Wi-Fi will drop packets. If Wi-Fi is weak in a given room, fix that first (mesh AP, access point) before dropping a BLE proxy there.

Place proxies at least 3 meters from routers, switches, and other network gear. Bluetooth and Wi-Fi share the 2.4GHz band, and nearby transmitters create interference that hurts BLE reception.

When writing custom YAML configs, always use framework: type: esp-idf instead of Arduino. The ESP-IDF Bluetooth stack is more stable and runs better for proxy workloads.

If you enjoy building with ESPHome, the same ESP32 hardware makes a great base for other sensors. A low-cost air quality monitor is a fine next project once your BLE proxies are up, and a Home Assistant smart irrigation system puts the same chip to work driving sprinkler zones outdoors.

Keep your proxies updated. ESPHome’s Bluetooth proxy support keeps getting better. The 2026.3.0 release added BLE link parameter tuning. Proxies can now switch linked devices from fast intervals (~7.5ms) to slow ones (~1000ms) after the link forms. This cuts battery drain a lot on always-on devices like Yale and August locks.

The whole setup, from unboxing an ESP32-C3 to seeing distant BLE sensors report data in Home Assistant, takes about 15 minutes per proxy. For under $20 in hardware, you get reliable Bluetooth coverage across the whole house, auto failover between proxies, and the base for room-level presence detection. Not many smart home upgrades give that much return for that little spend.