Build a Bluetooth Low Energy Room Presence and Asset Tracker with ESP32
- ESP32 development board (WROOM-32 or similar)
- BLE beacon tags, coin-cell (iBeacon/Eddystone compatible)
- CR2032 coin cell batteries (spares)
- USB power supply, 5V (per scanner node)
- Small project enclosure for each scanner node
- Micro USB or USB-C cable, per node
- Adhesive Velcro strips for mounting beacon tags to tools
Shared shop tools have a way of walking off to whatever bench or corner someone last used them at, and hunting for a specific caliper, a cordless driver, or a torque wrench is a small but constant tax on shop time. This project builds a room-level presence and asset tracker using cheap BLE beacon tags stuck to the tools you care about and a small network of ESP32 scanner nodes that report which tags they can see, and how strongly, to Home Assistant. It won't give you centimeter-accurate positioning — that's a much harder RF problem — but for "which room or zone is this tool currently in," RSSI-based presence detection is simple, cheap, and reliable enough for real shop use.
How This Actually Works
BLE beacon tags broadcast a small, unencrypted advertising packet on a regular interval (typically every 100ms–1s depending on the tag's power settings) containing an identifier — either in Apple's iBeacon format (a UUID plus major/minor values) or Google's Eddystone format (a URL or namespace/instance ID). Any BLE-capable receiver nearby can passively read these advertisements without pairing to the tag at all, which is what makes beacon-based tracking so power-efficient on the tag side: the tag never has to maintain a connection, just shout its identity into the air periodically. Each ESP32 scanner node in this build continuously listens for these advertisements and records the received signal strength (RSSI) for each tag it hears. Because RSSI roughly correlates with distance (with a lot of noise from walls, shelving, and reflections), a tag heard strongly by the scanner mounted near your laser cutter and only faintly or not at all by the scanner near your 3D printer bench tells you, with reasonable confidence, which zone the tool is actually in.
Flashing the Scanner Firmware
Each ESP32 scanner node runs a small sketch using the ESP32 BLE Arduino library's scan functionality in continuous/active scan mode, filtering advertisements to only the beacon UUIDs you've registered so you're not flooding your MQTT broker with every stray BLE device in range (phones, headphones, and other unrelated gadgets are constantly advertising nearby). On each scan cycle, the node publishes an MQTT message per detected tag containing the tag ID, RSSI, and the scanner's own zone name (set as a hardcoded config value per node, e.g. "cnc-corner" or "electronics-bench"). Keep the scan interval reasonably short (1–2 seconds) for responsive presence updates without pegging the ESP32's radio; BLE scanning and WiFi both use the same 2.4GHz radio hardware on the ESP32, so very aggressive scan windows can start to compete with your WiFi connection's reliability on a busy channel.
Deploying Beacon Tags
Program each beacon tag (most cheap iBeacon-format tags ship with a simple config app or a fixed default UUID/major/minor you record) with a unique major/minor identifier pair, keeping a simple spreadsheet mapping identifier to the tool it's stuck to. Mount tags with adhesive Velcro rather than permanent adhesive so they can be moved between tools as your inventory changes, and stick them somewhere that won't get knocked off during normal handling — the underside of a handle or a flat body surface works better than an edge that takes impacts. Most coin-cell beacon tags last many months to over a year on a single CR2032 depending on advertising interval, so battery replacement is an occasional task rather than a maintenance burden.
Home Assistant Integration
With each scanner publishing zone/RSSI data over MQTT, a simple Node-RED flow or a set of Home Assistant template sensors can determine, per tag, which zone reported the strongest RSSI most recently and expose that as the tag's current location. Set a timeout (a tag not heard by any scanner for, say, five minutes) to mark a tool as "unknown/out of range" rather than leaving it stuck showing its last known zone indefinitely, which matters if a tool gets taken off-site or the battery dies. From there, a simple Lovelace dashboard card listing each tracked tool and its last-known zone gives anyone in the shop a fast way to check where something is before physically searching for it.
Scaling to Multiple Zones
Add scanner nodes incrementally as you identify zones worth distinguishing — a single-room shop might only need one or two scanners, while a shop with a laser corner, a CNC area, and an electronics bench benefits from a scanner in each. Each additional scanner is just another flashed ESP32 with a unique zone name in its config, publishing to the same MQTT topic structure, so the system scales without any changes to the core firmware. If you're already running other ESP32 sensor nodes on your shop network (environmental monitors, machine status displays), this project pairs naturally with that existing MQTT/Home Assistant infrastructure rather than requiring a separate system.
Safety Notes
This is a low-power, low-risk build electrically — BLE beacon tags run at milliwatt transmit power with no meaningful RF exposure concern, and the ESP32 scanner nodes are simple 5V USB-powered devices. The main practical safety consideration is battery handling: coin cells are a swallowing hazard around small children and pets, so store spares securely and dispose of depleted cells through battery recycling rather than household trash. If you're mounting scanner node enclosures near machinery, route USB power cables away from moving parts and pinch points the same way you would any shop electronics.
This system trades precision for simplicity and cost — you won't get exact coordinates, but for the actual question most shops care about ("is the digital caliper in the CNC area or did someone leave it on the electronics bench again") zone-level presence detection built from a few dollars of beacon tags and a couple of ESP32 boards does the job well.