Build a Wi-Fi Presence Detector Using ESP32 and Home Assistant
Build a Wi-Fi Presence Detector Using ESP32 and Home Assistant
Ever walked into a room and wished the lights would just know to turn on? Or wanted your smart home to react the moment your phone connects to Wi-Fi? With an ESP32 and Home Assistant, you can build a Wi-Fi presence detector that does exactly that—no fancy sensors or wearables required. In this guide, I’ll walk you through my own journey of setting this up, complete with code snippets, troubleshooting tips, and a few laughs at my own mistakes.
Why Wi-Fi Presence Detection?
Bluetooth-based presence detection is common, but Wi-Fi offers better range and reliability—especially if your phone is stubborn about keeping Bluetooth on (looking at you, iOS users). By detecting Wi-Fi probe requests (the “Hey, is my network here?” signals devices broadcast), an ESP32 can act as a low-cost, low-power presence sensor.
What You’ll Need
- ESP32 board (I used the ESP32-WROOM-32, but any variant works)
- Micro-USB cable (for power and programming)
- Home Assistant instance (local or cloud, but local is chef’s kiss)
- ESPHome (installed as a Home Assistant add-on or standalone)
- Wi-Fi network (2.4GHz preferred for ESP32 compatibility)
Step 1: Flash ESP32 with ESPHome
ESPHome makes firmware management a breeze. If you haven’t installed it yet, go to Home Assistant → Add-ons → ESPHome and hit install. Then:
- Create a new device in ESPHome, naming it something like
wifi_presence_detector
. - Use the following YAML configuration (adjust
ssid
andpassword
to match your Wi-Fi):
esphome:
name: wifi_presence_detector
platform: ESP32
board: esp32dev
wifi:
ssid: "Your_WiFi_SSID"
password: "Your_WiFi_Password"
power_save_mode: none # Disable sleep for real-time detection
api:
password: "your_api_password"
ota:
password: "your_ota_password"
logger:
level: DEBUG # Helpful for troubleshooting
binary_sensor:
- platform: wifi_scan
ssid: !secret target_ssid # Replace with the SSID of the device you're tracking
name: "Phone Presence"
id: phone_present
- Flash the ESP32 via USB. Click “Install” in ESPHome, select “Plug into this computer,” and follow the prompts.
Step 2: Integrate with Home Assistant
Once flashed, the ESP32 should appear in Home Assistant’s Integrations tab. If not, manually add it via Configuration → Devices & Services → Add Integration → ESPHome.
- The
phone_present
binary sensor will show ason
when the target device (e.g., your phone) is detected andoff
when absent. - Test it by toggling your phone’s Wi-Fi and watching the sensor state change.
Step 3: Automate All the Things!
Now for the fun part: automations! Here’s one to turn on lights when you arrive home:
automation:
- alias: "Turn on lights when phone arrives"
trigger:
platform: state
entity_id: binary_sensor.phone_present
to: "on"
action:
service: light.turn_on
target:
entity_id: light.living_room_lights
Want to get fancy? Add a delay to avoid false triggers when your phone briefly disconnects:
trigger:
platform: state
entity_id: binary_sensor.phone_present
to: "on"
for:
minutes: 1 # Only trigger after 1 minute of continuous presence
Common Pitfalls and Fixes
False Positives/Negatives:
- Adjust the
scan_interval
in ESPHome (default: 60s). Shorter intervals drain battery faster but improve accuracy. - Use MAC address filtering for precision (add
mac_address: "AA:BB:CC:..."
underbinary_sensor
).
- Adjust the
ESP32 Overheating:
- If your board gets warm, lower the
scan_interval
or add a heatsink. Mine once got so hot I could’ve fried an egg on it.
- If your board gets warm, lower the
Home Assistant Delays:
- Ensure your ESP32 and HA are on the same local network to minimize latency.
Going Further
- Multi-room tracking: Deploy multiple ESP32s and use zone-based automations.
- Energy monitoring: Pair with a smart plug to log presence data in Grafana (check out my Grafana alerting guide for inspiration).
- Privacy mode: Hash MAC addresses in ESPHome to avoid storing raw device identifiers.
FAQ
Q: Can I detect multiple devices?
A: Absolutely! Duplicate the binary_sensor
block in ESPHome for each SSID/MAC.
Q: Will this work if my phone’s Wi-Fi is off?
A: Nope—devices must broadcast probe requests. iOS 15+ and Android 10+ randomize MAC addresses by default, but you can whitelist your home network to avoid this.
Q: How accurate is Wi-Fi presence detection?
A: Range is ~10-20m indoors. For pinpoint accuracy, combine with Bluetooth (like my Xiaomi Mijia temperature guide).
Now go forth and make your home just a little smarter. And if your ESP32 starts judging your comings and goings… well, that’s between you and your Wi-Fi router. 😉