Some hardware links on this page are affiliate links. As an Amazon Associate I earn from qualifying purchases. We may earn a commission if you buy through them, at no extra cost to you. See the affiliate disclosure.
A stock ESPHome Bluetooth proxy forwards every advertisement it hears. Phones you do not own, and Apple’s background chatter, ride the Wi-Fi link to Home Assistant and get discarded there. With one proxy that is a small waste. With a proxy in every room it becomes the busiest thing on the API. This pack drops those advertisements on the ESP32, using the filter hook bluetooth_proxy gained in ESPHome 2026.10.0.
IRKs and any device allow-list stay in secrets.yaml. This page has no device addresses.
This is the filter in front of a proxy. BLE room presence is the map that turns the advertisements you keep into a room. Add the filter to those same nodes when the proxies are busy.
What problem it solves
You want Bermuda, Private BLE Device, or a handful of real sensors to keep working, and you want the proxy to stop spending airtime on advertisements nobody in the house uses.
How it works
- Hook — ESPHome 2026.10.0 adds an advertisement filter on
bluetooth_proxy. The external componentble_advert_filterregisters there. Older ESPHome releases have no hook; the pack targets 2026.10 and newer. - Distance —
rssi_thresholddrops advertisements weaker than a level you pick (a common start is −80 dBm).rssi_flooris a harder cut that also applies to devices you otherwise allow. - Your devices — list the IRKs of phones and watches you track, via
!secret. Those devices pass. Other rotating addresses are dropped. A phone gets a new IRK after an erase or a restore; the forwarded-IRK counter going flat while you are home is the hint to capture it again. - Manufacturer noise — a block list can drop a company id such as Apple’s
0x004C. HomeKit accessories stay allowed by default. An IRK you listed still passes. iBeacons use that same Apple id, including beacons sent from an Android phone, so allow a beacon by its UUID when you track one. - Pairing — Matter (
0xFFF6) and Improv can stay on a service-UUID allow-list so commissioning still works while the filter is on. Find My (AirTag, AirPods) stays if you setallow_findmy: true. - Counters — forwarded, dropped, and drop-rate sensors, plus a number entity for the RSSI threshold, so you can tune from Home Assistant and flash again only when the shape of the filter changes.
Pin the component to a release tag. The project documented v2.0.3 when this page was written.
Hardware notes
- Proxy you already have. Any ESP32 that already runs
bluetooth_proxy(the C3, C6, and S3 are the boards the component author has run). Reflash; there is nothing new to install on the Home Assistant side. - A new proxy. An ESP32-C6 Super Mini is enough when a room has no node yet. One proxy per area is the presence-pack rule; this filter does not change that.
- Trackers. Phones, watches, and tags you already enrolled. The filter does not discover them for you.
Snippet
Names and secrets are substitutions. Addresses stay in your secrets file:
substitutions:
device_name: ble-proxy-office
friendly_name: Office BLE proxy
external_components:
- source:
type: git
url: https://github.com/davidcoulson/esphome-ble-advert-filter
ref: v2.0.3
components: [ble_advert_filter]
bluetooth_proxy:
active: true
ble_advert_filter:
rssi_threshold: -80
rssi_floor: -90
irks:
- !secret irk_phone
manufacturer_blocklist:
- 0x004C
allow_findmy: true
service_uuid_allowlist:
- 0xFFF6
sensor:
- platform: ble_advert_filter
forwarded:
name: BLE forwarded
dropped:
name: BLE dropped
drop_rate:
name: BLE drop rate
# Wi-Fi, API, and the threshold number entity: full YAML in the pack
Setup outline
- Confirm the proxy is online in Home Assistant and that ESPHome is 2026.10.0 or newer.
- Add the external component pinned to a tag, plus
ble_advert_filterwith an RSSI threshold only. Flash. The drop counter should move and your nearby sensors should still update. - Add IRKs as secrets, then the manufacturer block and the pairing UUIDs you actually use. Flash again.
- Walk the rooms you track. If a watch vanishes, check the forwarded-IRK sensor before you loosen the filter.
- Put the threshold number entity on a dashboard if you want to experiment without a rebuild.
Troubleshooting
- The YAML fails to compile. ESPHome is older than 2026.10.0, or the
ref:tag does not exist. Update ESPHome, then pin a real release tag. - A phone you own disappears. Its IRK changed, or
drop_non_resolvableis on and that phone is advertising a non-resolvable address. Capture the IRK again. Turndrop_non_resolvableoff when a beacon app you use has no stable identity. - An iBeacon vanished after the Apple block. iBeacons carry Apple’s manufacturer id. Allow that beacon’s UUID.
- Matter commissioning fails next to the proxy. Add the Matter service UUID
0xFFF6toservice_uuid_allowlist, and bring the device close enough to clearrssi_floor. - HomeKit accessories went quiet.
allow_homekitwas set false. Leave it at the default (allowed). - Drop rate stays near zero. The threshold is so low that almost everything passes, or the sensors were not added. −80 dBm is a starting cut, not a promise. Watch the counters for a minute in a busy room and then move the number entity.
Credits
Based on the community project BLE advert filter and davidcoulson/esphome-ble-advert-filter. This write-up is an original proxy-filter overview for a home that already runs ESPHome proxies, not a paste of that component’s docs.