The XDA post that made the rounds this week put a number on something home-lab people had suspected for years: modern phones broadcast a resolvable BLE beacon roughly once a second, and a $6 ESP32 sitting on the wall can hear it. With three of them across a house, presence is no longer “someone is home” but “Sam is in the kitchen.” No wearable, no app, no cloud, no shared account.
We tested 7 desktop and server apps that turn that beacon into a Home Assistant sensor for room-level presence. Everything below runs locally and expects nothing more than a Home Assistant install and a handful of cheap microcontrollers or a USB dongle.
What to look for in a Bluetooth presence app
- Room-level accuracy, not just “home or away”. Distance estimates from a single node are noisy, so multi-node trilateration matters.
- Fast enter and leave events. A five-second detection is fine for lighting scenes, a thirty-second one is not.
- Home Assistant integration. Native HACS support beats a hand-rolled MQTT topic.
- Support for both iOS and Android. iPhones rotate their MAC address, so the app has to handle irk keys or resolvable identifiers.
- Runs on the hardware you already own. ESP32, a Pi, a NUC, a Synology container.
- Deals gracefully with visitors. Guest phones should not trip your bedroom lamp.
Quick comparison
| App | Best for | Platforms | Free plan | Standout feature |
|---|---|---|---|---|
| ESPresense | Room-level presence with cheap ESP32 nodes | Linux, Windows, macOS (dev tools) | Yes (open source) | Firmware and MQTT gateway that snap into Home Assistant |
| Bermuda BLE Trilateration | Multi-node distance and room math inside HA | Runs on the HA host | Yes (open source) | Sensors surface expected room without a separate broker |
| room-assistant | Multi-sensor presence across a Pi mesh | Linux, macOS, Windows | Yes (open source) | Handles Bluetooth Classic, BLE, and mmWave in one config |
| Home Assistant Bluetooth | Zero-config presence on the HA host itself | Windows, macOS, Linux (HAOS) | Yes | ESPHome Bluetooth Proxy support out of the box |
| Theengs Gateway | Tracks BLE tags and sensors alongside phones | Windows, macOS, Linux (Docker or pip) | Yes (open source) | Decodes 100+ BLE devices, not just phones |
| OwnTracks | Phone-side GPS and iBeacon regions | Windows, macOS, Linux (server) | Yes (open source) | Adds room context by beacon UUID from the phone |
| Monitor | Bash-based BLE scanner for a single Pi | Linux | Yes (open source) | No dependencies beyond BlueZ, hard to break |
The 7 best apps for Bluetooth presence detection in Home Assistant
1. ESPresense — best for room-level tracking with ESP32 nodes
ESPresense is the setup most people land on. Flash the firmware to a handful of ESP32 boards, plug them in around the house, and each one starts publishing rolling RSSI values for every BLE device it hears. The Home Assistant integration reads those over MQTT and outputs a sensor per phone that names the current room, updated in under a second. It supports iOS irk keys, so iPhones stay tracked despite MAC rotation.
Where it falls short: RSSI is not laser rangefinding. Furniture, walls, and metal appliances shift readings by several dB, so the first weekend is spent calibrating each node.
Pricing:
- Free: open source under MIT
- Paid: none
Platforms: Linux, Windows, macOS (any host that flashes ESPHome or PlatformIO)
Download: espresense.com
Bottom line: Pick ESPresense if the house has cheap power outlets and you want the best per-room accuracy for the money.
2. Bermuda BLE Trilateration — best if the ESP nodes are already there
Bermuda takes ESPresense’s raw readings (or ESPHome Bluetooth Proxy data) and does the trilateration inside Home Assistant. It exposes distance-to-node sensors, an “area predicted” sensor, and a debug map that helps you see which nodes hear which devices. The install is HACS-only, no separate broker or container.
Where it falls short: The prediction is only as good as the input data, so a house with two ESP nodes will still be coarse. The tuning parameters are dense and take a couple of readings to make sense of.
Pricing:
- Free: open source under GPLv3
- Paid: none
Platforms: Runs on the Home Assistant host (any Linux, HAOS, macOS, or Windows install)
Download: github.com/agittins/bermuda
Bottom line: Pick Bermuda if the ESP fleet is running and you want cleaner room predictions without adding another service.
3. room-assistant — best for a Pi mesh across a large house
room-assistant predates the ESPresense wave and still has a strong following. It runs a Node.js process on any Pi or small Linux box, scans for BLE and Bluetooth Classic devices, and reports through MQTT with a per-room sensor. It also supports mmWave presence add-ons, so a room without a phone user still registers a warm body.
Where it falls short: Docs assume some Node comfort, and each Pi carries a small monthly maintenance tax compared to a fleet of stateless ESP32s.
Pricing:
- Free: open source under MIT
- Paid: none
Platforms: Linux, macOS, Windows
Download: room-assistant.io
Bottom line: Pick room-assistant if you already have Pis on the wall and want more than BLE (mmWave, Classic Bluetooth, wearables) in the same config.
4. Home Assistant Bluetooth — best zero-config path when the host has BLE
The Home Assistant Bluetooth integration ships in the box. If HAOS runs on a mini PC with a USB dongle or a Pi with a working radio, it publishes any nearby BLE device as a device_tracker entity. Combined with an ESPHome Bluetooth Proxy on an ESP32 by the door, a small house can get one-room resolution without a dedicated presence platform.
Where it falls short: One radio equals one room. Multi-room accuracy needs proxies, which puts you back in ESPresense or Bermuda territory.
Pricing:
- Free: bundled with Home Assistant
- Paid: none
Platforms: Windows, macOS, Linux (any HA install)
Download: home-assistant.io/integrations/bluetooth
Bottom line: Pick this first if the goal is presence in one or two rooms and the HA host already has a radio.
5. Theengs Gateway — best when the house has more than phones to track
Theengs Gateway decodes over a hundred BLE devices, from Xiaomi thermometers to Ruuvi tags to Apple AirTags. Run it on a small Linux box or Docker container, point it at the MQTT broker, and Home Assistant gets a fleet of sensors for every plant-monitor and doorbell tag on the wall. For presence, it exposes both phones and generic BLE trackers as first-class entities.
Where it falls short: Room-level accuracy is not its focus. Pair it with ESPresense when you need per-room resolution and use Theengs for the everything-else sensors.
Pricing:
- Free: open source under MIT
- Paid: none
Platforms: Windows, macOS, Linux (Docker or pip)
Download: theengs.io
Bottom line: Pick Theengs if the house is full of BLE sensors that Home Assistant should know about beyond the humans.
6. OwnTracks — best when you also want GPS fences
OwnTracks runs on the phone and reports position back to a self-hosted server (either its own recorder or over MQTT). The BLE piece uses iBeacon regions, so a small transmitter in the office or kitchen tags the phone into that region automatically. It pairs well with Home Assistant’s OwnTracks device tracker for a home-away plus room layer.
Where it falls short: The iBeacon side needs cheap transmitters on the wall and phone-side battery tolerance, and iOS demands the app run in the background to catch region events.
Pricing:
- Free: open source under Apache 2.0
- Paid: none
Platforms: Windows, macOS, Linux (recorder server)
Download: owntracks.org
Bottom line: Pick OwnTracks if you already track GPS locations at home and want to layer BLE regions on top of the same setup.
7. Monitor — best minimalist BLE scanner for a single Pi
Monitor is a Bash script that turns a Raspberry Pi with BlueZ into a presence sensor. It watches for known devices, computes RSSI trends, and publishes MQTT topics for arrival and departure. Zero dependencies beyond the OS, small footprint, and remarkably stable.
Where it falls short: No trilateration, no iOS irk support, and no maintenance from the original author for a while. Best treated as one component in a larger stack.
Pricing:
- Free: open source under Apache 2.0
- Paid: none
Platforms: Linux
Download: github.com/andrewjfreyer/monitor
Bottom line: Pick Monitor for a one-Pi setup where you want the smallest possible arrival and departure sensor and nothing else.
How to pick
If you want per-room accuracy and the budget for a handful of ESP32s, install ESPresense and layer Bermuda on top.
If Pis are already on the wall handling other jobs, run room-assistant for BLE, mmWave, and Bluetooth Classic in one place.
If the goal is presence in one or two rooms and Home Assistant already has a radio, start with the native Home Assistant Bluetooth integration.
If the house has plant monitors, AirTags, and thermometers to track alongside phones, run Theengs Gateway and pair it with ESPresense for room math.
If GPS zones already work through OwnTracks, use its iBeacon regions to extend the same platform into rooms.
If you just want a single Pi to watch the front door and log arrivals, run Monitor and stop there.
FAQ
Do I need one ESP32 per room?
Yes for good accuracy. Two nodes let ESPresense make a rough guess, three or more nodes let Bermuda triangulate. A typical two-bedroom flat is comfortable at four nodes; a house with an upstairs usually wants five to seven.
Does this work with iPhones?
Yes. iOS rotates its BLE MAC address every 15 minutes, which older tools stumble on. ESPresense, Bermuda, and room-assistant all support iOS irk keys, which are the resolvable identifiers the phone advertises alongside the address. The initial pairing takes an extra step compared to Android.
Will it drain my phone’s battery?
No, because the phone is only broadcasting, not scanning. BLE advertisement is what most modern OSes leave on for AirDrop, Fast Pair, and Find My. Your phone does not know it is being tracked.
What about guests?
Only devices you have explicitly added to the config generate room events. A visitor’s phone is heard by the nodes but ignored by Home Assistant, so it never triggers your automations.