An ESP32 (M5Stack ATOM Echo) running an ESPHome ANCS component bonds with an iPhone over Bluetooth and republishes its notifications to Home Assistant as sensor state and history. The Apple Notification Center Service (ANCS) — the same protocol used by Apple Watch — lets any bonded BLE device subscribe to iOS notifications. The setup exposes nine entities including last notification title, message body, app bundle ID, caller, and connection status. A key constraint is that ANCS uses NimBLE, which conflicts with the Bluedroid stack used by ESPHome's bluetooth_proxy, requiring a dedicated chip. Pairing is done once via nRF Connect for Mobile. The author uses the notification history not for real-time automation but as context for a self-hosted LLM agent connected to Home Assistant via MCP, allowing it to answer questions about the day's events without any active forwarding or automation.

8m read timeFrom blog.iodev.org
Post cover image
Table of contents
Why it needed a chip of its ownPairingWhat shows up in Home AssistantHow the agent gets at it

Questions this post answers

Why can't I run the ESPHome ANCS component on the same ESP32 as bluetooth_proxy or esp32_ble_tracker?

ANCS uses the NimBLE Bluetooth stack, while bluetooth_proxy and esp32_ble_tracker are built on Bluedroid. ESPHome compiles exactly one Bluetooth stack into any given firmware, so the two components are mutually exclusive on the same device. You need a dedicated ESP32 running only the ANCS component with the ESP-IDF framework. Makers splitting ESP32 duties across components find the latest ESPHome constraints covered on daily.dev.

How do I pair an ESP32 running ESPHome ANCS with an iPhone since iOS won't let the device initiate pairing?

Use the nRF Connect for Mobile app. Scan for the device under the name you set as ancs_name, connect to it, and accept the pairing request iOS presents. This is a one-time operation — the bond survives reflashing, and afterward the ESP32 reconnects to the phone automatically because it advertises a solicited service UUID that prompts the phone to reconnect. Home Assistant builders working through iPhone BLE pairing quirks track solutions like this on daily.dev.

What Home Assistant entities does the ESPHome ANCS component create and what data do they expose?

The component creates nine entities: sensors for last notification title (last_notification), message body (last_message, truncated), app bundle ID (last_app, e.g. ph.telegra.Telegraph), caller name (last_caller, only populated during calls), and connected iPhone name; binary sensors for call_active and iphone_connected; and buttons to clear bonds and disconnect iPhones. All sensors update within the same fraction of a second per notification and are correlated by timestamp. Developers building Home Assistant notification pipelines find real-world entity breakdowns like this on daily.dev.

106 Impressions