iOS Notifications via ANCS lokal über Bluetooth und ESPHome

Hallo zusammen,

ich wollte ein Setup teilen, mit dem ich ein Problem gelöst habe, an dem die iOS-Companion-App bei mir immer gescheitert ist: iPhone-Benachrichtigungen komplett lokal in Home Assistant zu bekommen – mit echtem Inhalt (Absender, Titel, Text) und ohne spürbare Verzögerung.

Der Trick ist ANCS (Apple Notification Center Service) – ein BLE-Protokoll, das Apple eigentlich für Smartwatches gebaut hat. Ein gekoppelter ESP32 darf damit jede Notification mitlesen, die das iPhone erzeugt. Dafür gibt es eine richtig gute ESPHome-Component:

https://github.com/wonderslug/esphome-ancs

Was in HA ankommt:
Jede Benachrichtigung feuert ein Event mit app_id, title, subtitle, message und der ANCS-category (incoming_call, missed_call, email, social usw.). Man kann also je nach App und Anrufer unterschiedlich reagieren – z. B. Outlook lässt nur eine LED blinken, ein eingehender Anruf löst eine TTS-Ansage aus.

Mein Use-Case:
Das Handy liegt bei mir auf dem Schreibtisch (der zufällig im Schlafzimmer steht). Kommt eine Notification rein und es ist niemand im Raum, schickt eine Automation die TTS-Ansage auf die HomePods, sodass sie mir durchs Haus „folgt". Die Präsenz kommt von einem Aqara FP2.

Zwei Dinge, über die ich gestolpert bin – erspart euch den Ärger:

  1. Das Pairing läuft NICHT über die iOS-Bluetooth-Einstellungen. Neuere iOS-Versionen zeigen DIY-BLE-Geräte dort gar nicht an. Man muss die Kopplung einmalig über die App nRF Connect for Mobile anstoßen (Scannen → Verbinden → iOS zeigt dann den normalen Pairing-Dialog). Danach reconnectet es automatisch und man braucht die App nie wieder.

  2. Fokus / Nicht stören unterdrückt ANCS-Benachrichtigungen auf OS-Ebene – im DND-Modus kommt also nichts durch. Gut zu wissen, bevor man stundenlang sucht, „warum nichts ankommt".

Noch ein paar Hinweise für alle, die es ausprobieren wollen:

  • ANCS braucht das ESP-IDF-Framework und belegt das BLE-Radio exklusiv – also kein bluetooth_proxy oder esp32_ble_tracker auf demselben Node.

  • Es kann immer nur ein iPhone gleichzeitig aktiv verbunden sein. max_bonds speichert mehrere, aber wer zwei Handys parallel will (z. B. dienstlich + privat), braucht zwei ESPs.

Ich teile gerne meine YAML und die TTS-Routing-Automation, falls Interesse besteht. Mich würde interessieren, ob jemand etwas Ähnliches gebaut hat – vor allem, wie ihr die Entprellung/Deduplizierung der Notifications und das Filtern nach app_id löst.