ESPHomeHome Assistant

BLE proxy advertisement filter

Drop weak and irrelevant Bluetooth advertisements on an ESPHome proxy before they cross Wi-Fi to Home Assistant. Needs ESPHome 2026.10 or newer and the bluetooth_proxy filter hook.

Difficulty · IntermediateSetup · 30–60 minutesHA · current stable (Bluetooth proxy)ESPHome · 2026.10.0 or newer
Get the pack · from $19Have us set it up

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

  1. Hook — ESPHome 2026.10.0 adds an advertisement filter on bluetooth_proxy. The external component ble_advert_filter registers there. Older ESPHome releases have no hook; the pack targets 2026.10 and newer.
  2. Distance — rssi_threshold drops advertisements weaker than a level you pick (a common start is −80 dBm). rssi_floor is a harder cut that also applies to devices you otherwise allow.
  3. 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.
  4. 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.
  5. 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 set allow_findmy: true.
  6. 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

  1. Confirm the proxy is online in Home Assistant and that ESPHome is 2026.10.0 or newer.
  2. Add the external component pinned to a tag, plus ble_advert_filter with an RSSI threshold only. Flash. The drop counter should move and your nearby sensors should still update.
  3. Add IRKs as secrets, then the manufacturer block and the pairing UUIDs you actually use. Flash again.
  4. Walk the rooms you track. If a watch vanishes, check the forwarded-IRK sensor before you loosen the filter.
  5. 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_resolvable is on and that phone is advertising a non-resolvable address. Capture the IRK again. Turn drop_non_resolvable off 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 0xFFF6 to service_uuid_allowlist, and bring the device close enough to clear rssi_floor.
  • HomeKit accessories went quiet. allow_homekit was 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.

Changelog

v1.0 · Oct 23, 2026: First publish.