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.

WhereIsMax bot post

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).