Tracking Max Verstappen's private jet with Home Assistant and ADS-B
Every commercial and private aircraft broadcasting ADS-B is publicly visible to anyone willing to poll the right API. Max Verstappen's Dassault Falcon 900 with registration PH-UTL (Unleash The Lion) is no exception. I thought it would be fun to wire this into Home Assistant and have a dedicated Mastodon bot post updates whenever the jet takes off or lands somewhere.
The result is @waarismax on my own Fediverse instance. It posts publicly whenever PH-UTL moves. The bot posts in Dutch.

Why
Because I could.
Finding the data
adsb.lol is a free, no-auth API that queries live ADS-B data by ICAO hex code. A single GET request returns the current position and state of any broadcasting aircraft:
https://api.adsb.lol/v2/icao/4867e6
When the aircraft is airborne, the response includes an ac array with fields for altitude, ground speed, lat/lon, callsign, and more. When it's on the ground with its transponder off, ac is empty and total is 0. That on/off toggle is the trigger for the automations.
The sensor setup
Everything lives in configuration.yaml. A rest: block polls the API every 60 seconds and derives six sensors from the response: status (airborne/offline), altitude, speed, latitude, longitude, and flight number.
The max_jet_status sensor is the key one. It flips between airborne and offline and is what the takeoff and landing automations watch.
Reverse geocoding the position
Lat/lon coordinates are not readable in a Mastodon post. I wanted "Keulen, Duitsland" rather than "50.868, 7.121". OpenStreetMap's Nominatim API handles this for free, with no API key required, as long as you respect the fair use policy.
Rather than polling Nominatim on a fixed interval, a rest_command calls it on demand and a dedicated automation fires that command whenever the aircraft's latitude changes state. This means Nominatim only gets called when the aircraft is actually moving.
A city → town → village fallback chain handles the fact that Nominatim doesn't always return a city field, depending on how rural the position is.
The Mastodon bot
I created a separate Mastodon account @waarismax@social.schoonens.nl on my self-hosted instance and connected it to Home Assistant.
The automations
Two automations watch sensor.max_jet_status and post to the bot when it changes. A for: duration of 5 minutes debounces brief signal dropouts. One automation handles takeoff (offline to airborne), one handles landing (airborne to offline).