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.

3 „Gefällt mir“

Ich habe es jetzt umgesetzt und finde das Ergebnis richtig gut. Ob ich dafür eine praktische Verwendung finde, weiß ich noch nicht, aber es bleibt vorerst zum Basteln angeschlossen. Vielen Dank!

2 „Gefällt mir“