Apple Airtag Integration Home Assistant

Auf der Suche nach einer Möglichkeit, AirTags in Home Assistant zu integrieren, bin ich auf ein spannendes DIY-Projekt im Home Assistant Forum gestoßen: AirTag-Integration (benutzerfreundlich + Gerätetracker). Diese Integration bezieht ihre Daten aus der “Wo ist …”-App des iPhones. Die Standortdaten werden über einen Shortcut mittels OCR extrahiert. Der Shortcut aktiviert den Bildschirm, öffnet die “Wo ist …”-App, macht einen Screenshot und liest daraus die Position aus, die anschließend zur Weiterverarbeitung an Home Assistant gesendet wird.

Voraussetungen:

Relativ einfach starten wir mit einem

1.) Airtag oder Airtag kompatible Tracker
2.) Iphone / Ipad ( ohne Bildschirmsperre )
3.) GEOAPIFY

AirTag Location an Home Assistant senden:

Dafür erstellen wir in HomeAssistant einen Input-Helper sowie eine iPhone-Shortcut, der die „Wo ist …“-Daten zur weiteren Verarbeitung an HA sendet.

  • In Home Assistant legen wir uns einen Input-Helper an unter: Einstellungen > Geräte und Dienste > Helfer > Helfer erstellen > Text.
    Wir geben diesen einen Namen zbsp. „AirTag“ und legen einen Maximalwert von „255“ fest. Dadurch wird die Entität „input_text.airtag“ eingerichtet, die die vom iOS-Gerät gesendeten Informationen speichert.
  • Auf dem iOS-Gerät öffnen wir die App «Wo ist?» und benennen die Geräte wie folgt um:
    ein Sternchen (*) am Anfang des Namens , wie hier gezeigt:
  • Als nächste generieren wir uns den Shortcut wie folgt
    1. Öffne “Kurzbefehle” auf deinem Iphone und erstelle einen neuen Kurzbefehl
    2. Aktion: URL und gib folgende URL ein: findmy://items
    3. Aktion: URL öffnen
    4. Aktion: Warten 4 Sekunden
    5. Aktion: Bildschirmfoto aufnehmen
    6. Aktion: Text aus Bildschirmfoto extrahieren
    7. Aktion: Text aufteilen Text aus Bild bei Eigene * teilen
    8. Aktion: Anzahl Objekte in Text aufteilen zählen
    9. Aktion: Objekte aus Liste abrufen Objekte aus Bereich 2 bis 5
    10. Aktion: Wörterbuch neues Objekt als Text hinzufügen
      • entity_id input_text.airtag
      • value Text aufteilen
    11. Dienst aufrufen input_text.set_value
      • Server: <HomeAssistantServer>
      • Daten: Wörterbuch
    12. Bildschirm sperren
NOTE: Jede weitere Aktion, verwendet das vorangegangen Ergebnis. Zwischenergebnisse kann man sich mit der Aktion Ergebnis einblenden anzeigen lassen.

Datenauswertung und Verarbeitung in HomeAssistant

Wir haben jetzt die gesendetedn Daten vom iPhone in Home Assistant verfügbar 
Überprüfen können wir den Inhalt via Entwicklerwerkzeugen > Zustände > nach der Entität «input_text.airtag» suchen. Es sollte dann wie folgt aussehen:

Der nächste Schritt zur Integration von AirTag in Home Assistant besteht darin, auf Basis dieser Informationen für jeden Tracker einen Sensor zu erstellen, der die von der App bereitgestellte Adresse vervollständigt und die entsprechenden Koordinaten erfasst. Dabei sollten Sie beachten, dass die „Wo ist?“ App die Informationen auf verschiedene Arten anzeigen kann:

  • «Home» – This appears when you have set your home address in the app, and the device is there (the same would happen if you had identified other known places, such as «Work»).
  • «Street…» – When the device is at an unknown place, it will indicate the corresponding address.
  • «Last Seen…» – We will see this when it has been a while since the device sent its location for the last time.

Sensoren in Home Assistant anlegen

In diesen Schritten, erstellen wir die Notwendigen Sensoren

  1. Erstelle dir ein Konto auf der  Geoapify-Website und erstelle dir eine neues Projekt inklusiven API-Key.
  2. Den folgenden Code kannst du in deine ‘sensors.yaml’ Datei übernehmen. Achte auf die folgenden Änderungen:
    • Ersetze «ITEM» mit dem Namen deiner Trackers  (zB. «Fahrrad»).
    • Setze den Wert “scan_interval” auf die Dauer [in Sekunden] fest, in der die Sensorkoordinaten aktualisiert werden sollen. Eine Aktualisierung macht nur Sinn, wenn der iOS Shortcut ebenfalls in diesem Intervall aufgerufen wird. Ich lasse den Shortcut aller 10 Minuten laufen und den Sensor aller 5 Minuten aktualisieren. ( ggf. kann man dies noch automatisieren )
    • Ersetze «ITEM_FINDMY_NAME» mit dem Name des Trackers in der «Find My» app auf deinem iOS Gerät (zB, «Fahrrad»).
    • Ersetze «HOME» mit dem exakten Wort, welches deine «Find My» app auf deinem iOS Gerät anzeigt, wenn der Tracker zu Hause ist ( «Home» oder «Privat»).
    • Ersetze «FULLADRESS» mit deiner Wohnadresse  ( «Musterstrasse 1a, Musterstadt»). Der Sensor wird diese Koordinaten verwenden, wenn die «Find My» app den Tracker als “Home” präseniert.
    • Ersetze «YOURAPIKEY» mit dem API-Schlüssel den wir über Geoapify erstellt haben.
    • Ersetze «STREETNAME» mit der Straße in der du wohnst. Der Sensor zeigt an das du zuhause bist auch wenn die Koordinaten nicht genau sind.
    • Ersetze «FIXADDRESS» mit dem Land+Stadt (ie, «{% set fix = address + «, Musterstadt, Germany» %}»), damit die Ergebnisse seiten Geoapify limitiert werden. Dies hilft falsche Treffer aufgrund von Orten mit ähnlichen Namen zu vermeiden. Es kann aber auch leer gelassen werden ({% set fix = address + «» %}).
  3. Konfiguration überprüfen und neu starten
  4. Nun sollten die beiden 2 Sensoren sensor.airtag_ITEM & sensor.airtag_ITEM_geo  angelegt worden sein. Überprüfen kannst du dies via Developer Tools > Zustände. Sollte kein ‘geo’ Sensor angelegt sein bzw. dieser nicht verfügbar sein wärend der Laufzeit, empfiehlt es sich die REST-Entitäten neu zu laden.
YAML
- platform: rest
  name: airtag_ITEM_geo
  value_template: "{{ value_json.results[0].formatted }}"
  json_attributes_path: "$.results[0]"
  json_attributes:
    - lon
    - lat
  verify_ssl: true
  scan_interval: 900 # every 15 min
  force_update: true
  resource_template: >
    {% set address = states('input_text.airtag').split('ITEM_FINDMY_NAME')[1].split('')[0] %}
    {% if address == "HOME" %}
      {% set home = "FULLADRESS" %}
      {{
        "https://api.geoapify.com/v1/geocode/search?text="
        + home | urlencode
        + "&apiKey=YOURAPYKEY&format=json"
      }}
    {% else %}
      {% set fix = address + "FIXADDRESS" %}
      {{
        "https://api.geoapify.com/v1/geocode/search?text="
        + fix | urlencode
        + "&apiKey=YOURAPYKEY&format=json"
      }}
    {% endif %}

- platform: template
  sensors:
    airtag_ITEM:
      friendly_name: "ITEM"
      value_template: >
        {% set home = "STREETNAME" %} 
        {% if ":" in states('input_text.airtag').split('ITEM_FINDMY_NAME')[1].split('')[0] %} 
        {{ states('input_text.airtag').split('ITEM_FINDMY_NAME')[1].split('')[0].split(',')[0] }}
        {% elif home in states('input_text.airtag').split('ITEM_FINDMY_NAME')[1].split('')[0] %}Home
        {% else %}
        {{ states('sensor.airtag_ITEM_geo') }}
        {% endif %}
      attribute_templates:
        latitude: >
          {% if ":" in states('input_text.airtag').split('ITEM_FINDMY_NAME')[1].split('')[0] %}null
          {% else %}{{ state_attr('sensor.airtag_ITEM_geo','lat') }}
          {% endif %}
        longitude: >
          {% if ":" in states('input_text.airtag').split('ITEM_FINDMY_NAME')[1].split('')[0] %}null
          {% else %}{{ state_attr('sensor.airtag_ITEM_geo','lon') }}
          {% endif %}
        status: >
          {% if ":" in states('input_text.airtag').split('ITEM_FINDMY_NAME')[1].split('')[0] %}unavailable
          {% else %}available
          {% endif %}
        last_update: "{{ as_timestamp(states.input_text.airtag.last_updated)|timestamp_custom ('%d/%m/%Y %H:%Mh') }}"
      icon_template: mdi:bag-personal
Expand

NOTE: Sensoren und Entitäten müssen klein geschrieben werden!