Indoor positioning for Home Assistant, powered by Bermuda.
Bermuda's Bluetooth proxies measure how far each phone, watch, pet tag or Tile is from each proxy. Sextant turns those distances into a dot on your floor plan, and from the dot into the four things automations want: which floor, which room, which spot in the room, and the nearest room when the fix sits between two.
- 🐱 Where is the cat? Put a tag on her collar and Sextant shows her on your floor plan: which floor, which room, even which spot in the room (the sofa, the bed, the litter box). Same for the dog, your watch, your phone, the kids, the car keys.
- 🏠 Automations that know who is where. Lights that follow you from room to room, heating that knows the bedroom is empty, a nudge when the dog is on the couch again, a TV that pauses when you walk out. Every tracked thing gets five sensors: where it is (spot if it is in one, room if not), plus floor, room, spot and nearest room. Give things an owner and each person gets the same, placed by whichever of their things is with them, plus a device tracker.
- 📡 More than Bluetooth. An mmWave presence sensor on the plan puts the phone in front of it on the exact spot, pins locations by itself and counts people who carry nothing. Roborock vacuums are placed from their own maps.
- 🔧 Set up in an afternoon. Install from HACS, upload a floor plan, draw your rooms, drop your Bluetooth proxies where they sit in the house, choose what to track. That is all.
- 📍 Steady, not jumpy. A cat asleep on the bed stays "on the bed". A watch on the boundary between the kitchen and the dining room does not flip back and forth every few seconds.
- 🎯 Teach it. If something shows in the wrong place, click where it really is and Sextant works out which settings fit that thing best.
- 🤖 Built with AI, tested in a real house. Sextant was developed with Claude as a coding partner, and every change runs in the author's home before it ships: more than 60 Bluetooth proxies, 23 tracked phones, watches, pets and belongings plus three robot vacuums, 20 rooms on three floors. See AI-assisted development.
New here? Start with Getting started: from nothing to a thing on your floor plan and a first automation.
| Install | Configure | Tune | Automate |
|---|---|---|---|
| Getting started · Installing · What you need · Upgrading from BPS | Edit · Things · Bermuda · Proxies | Live · Calibration · Tuning · Advice · How positioning works | Recipes · Sensors, card, services and API |
Also Hardware (turning outlets and switches into proxies, with the pin maps), Where Sextant fits (Bermuda, BPS, BPS-improved and Sextant side by side) and Data and development.
- HACS → Integrations → ⋮ → Custom repositories: add
davidcoulson/sextantas an Integration, install Sextant, restart. - Settings → Devices & Services → Add Integration → Sextant. Bermuda must already be set up; for everything Sextant can do, run the Bermuda fork.
- Open Sextant in the sidebar. On Edit, add a floor from a plan image, set its scale, place the proxies, draw the rooms, Save.
- On Things, pick what to track. Positions appear on Live within a cycle.
- With more than one floor, give each an elevation and line them up with alignment anchors.
Getting started walks through all of it.
You want three or more proxies per floor, and each ESPHome proxy should advertise an iBeacon so its siblings can range it. The details, including the beacon block, are in What you need.
A native Home Assistant panel at /sextant, no iframe and no pasted
token, in Home Assistant's own theme and unit system. Eight pages:
| Page | For |
|---|---|
| Live | every tracked thing on the plan, grouped by person; focus one for its room, spot, floor, proxies, timeline and activity heatmap; location pins; a refresh menu on the countdown |
| Edit | place proxies and mmWave sensors, draw rooms, spots and no-go areas, set the scale and floor levels, line the floors up with anchors |
| Things | what is tracked and everything Bermuda hears; name, class, colour, photo, height, owner and estimator per thing; people and their GPS fallbacks; robot vacuums |
| Bermuda | Bermuda's global options, Find My accessories, Tiles |
| Proxies | proxy health by floor and room, what each proxy hears, the self-test |
| Calibration | proxies calibrate each other; apply into Sextant or into Bermuda |
| Tuning | the stability KPI, accuracy from location pins, every knob live |
| Advice | which rooms the proxies serve worst and where one more would help |
- A position on the floor plan: trilateration fused with fingerprints the proxies build by hearing each other's beacons.
- Rooms as polygons with spots and no-go areas. Room and spot elections with a margin, a dwell and a stationary lock, so sensors do not flap.
- Floor election by competition between floors, scaled by proximity and a per-floor bias that can vary across the plan (a bias field), for landings and double-height rooms where both floors hear a thing equally.
- Alignment anchors that say how the floors stack, with an elevation per floor: shared named points on every plan, fitted into one house frame, with misplaced pins found and named and each floor's scale audited.
- Proxy calibration with 3D heights, written into Bermuda if you like.
- Location pins: say where a thing really is and Sextant finds the settings that fit it, and reports accuracy in metres.
- People: things given an owner place that person, by whichever of them is moving or most recently arrived, with a GPS tracker to fall back on when the house has lost them.
- mmWave presence sensors (Everything Presence, Apollo R PRO-1 and other LD2450 boards) on the plan: a thing near a target is put on it, a still target and a still thing make a pin nobody had to tap, and a target no device accounts for counts as an untracked person.
- Roborock vacuums placed from their own maps, lined up with the plan by the rooms both maps name.
- Bermuda management from the panel: track, untrack, Find My accessories, Tiles followed across address rotation (with the fork).
- Five sensors per thing, a map card, services and a websocket push per cycle. Pure numpy, no SciPy.
Sextant was written with Claude as a pair programmer, through Claude Code. Claude wrote most of the code, the tests and these docs. What keeps that honest is the test bed: every change runs in the author's house before it ships, with more than 60 Bluetooth proxies (bare ESP boards and Shellys, all running ESPHome), 20 rooms with 13 spots across three floors, an mmWave sensor, three Roborock vacuums, and a tracked mix of people, phones, watches, Find My accessories and seven animals on iBeacon collar tags. The author sets the direction, watches what the things do on the real floor plan, and decides what ships. Expect the codebase to read the way an AI writes it: long comments explaining why, a consistent shape from file to file, and a test for nearly everything. Bugs are still bugs, whoever typed them; issues and pull requests are welcome on davidcoulson/sextant.
Sextant began as a fork of Hogster/BPS via maxi1134/BPS-improved. Full credit for the original integration goes to @Hogster and @maxi1134, to @agittins for Bermuda, and to Megarushing for the Find My accessory support merged into the Bermuda fork. MIT licensed, see LICENSE.

