Custom Component: Flightradar24

Thank you!
The ability to change configuration (distance and position) is under development now. Would be in the next releases :slight_smile:

1 Like

Are you automating anything with this or is it just for interest?

By now only I use for notifications and Lovelace Card just for interest but looking for ideas to use it more

Thank you for this great integration! I would really like to see (and filter on) the altitude. Is it possible to add that?

The flight altitude would be added in the next release :slight_smile:

1 Like

Again, I love this component!
What I did (maybe inspiring others):

I created a flightradar24 “device” that listen to all flights within a radius of 500m around my home.
Whenever that happens, the speaker in the living room makes an announcement like:
The plane you hear now is from KLM. It comes from Atlanta in the United States and is on its way to Amsterdam.

My 5 year-old loves it :heart_eyes: and is learning a lot of cities and countries!
I actually have ChatGPT translate the message for me in Dutch, so the country names coming from the event are translated as well.

Translate in Dutch: {% if trigger.event.data.airline == 'Netherlands -
        Police' %}
          The police helicopter is flying in our neighborhood.
        {% elif trigger.event.data.airport_origin_country_name == 'Netherlands' %}
          The plane you hear now is from {{ trigger.event.data.airline }}. It comes from {{ trigger.event.data.airport_origin_city }} and is on its way to {{ trigger.event.data.airport_destination_city }}{% if trigger.event.data.airport_destination_country_name != 'Netherlands' %} in {{ trigger.event.data.airport_destination_country_name }}{% endif %}.
        {% elif trigger.event.data.airport_destination_country_name == 'Netherlands' %}
          The plane you hear now is from {{ trigger.event.data.airline }}. It comes from {{ trigger.event.data.airport_origin_city }} in {{ trigger.event.data.airport_origin_country_name }} and is on its way to {{ trigger.event.data.airport_destination_city }}.
        {% else %}
          The plane you hear now is from {{ trigger.event.data.airline }}. It comes from {{ trigger.event.data.airport_origin_city }} in {{ trigger.event.data.airport_origin_country_name }} and is on its way to {{ trigger.event.data.airport_destination_city }} in {{ trigger.event.data.airport_destination_country_name }}.
        {% endif %}
8 Likes

Thank you! This is superb :grinning:

I cleaned up the flights list a bit using Home-Assistant-Lovelace-HTML-Jinja2-Template-card. In case someone’s interested, here’s a screenshot and the card definition:

fr24

  - type: conditional
    conditions:
      - condition: numeric_state
        entity: sensor.flightradar24_current_in_area
        above: 0
    card:
      type: custom:html-template-card
      ignore_line_breaks: true
      content: >-
        {% set data = state_attr('sensor.flightradar24_current_in_area',
        'flights') %} {% for flight in data %}
          <ha-icon icon="mdi:airplane"></ha-icon> {%if flight.airline_short %}{{ flight.airline_short }}{% endif %}{% if flight.flight_number %} {{ flight.flight_number }}{% endif %}{% if flight.airline_short or flight.flight_number %}, {% endif %}{% if flight.aircraft_model %}{{ flight.aircraft_model }}{% endif %}
          <div>{%if flight.airport_origin_city or flight.airport_destination_city %}{%if flight.airport_origin_city %}<div style="display: inline-block; margin-left: 28px;"><img style="vertical-align: middle;" src="https://flagsapi.com/{{ flight.airport_origin_country_code[:2] }}/shiny/16.png" />{% endif %} {{ flight.airport_origin_city }}</div>{%if flight.airport_destination_country_code %}<div style="display: inline-block;">&nbsp;-&nbsp;<img style="vertical-align: middle;" src="https://flagsapi.com/{{ flight.airport_destination_country_code[:2] }}/shiny/16.png" />{% endif %} {{ flight.airport_destination_city }}</div>{% else %}<div style="margin-left: 28px;">No data</div>{% endif %}</div></div>
        {% endfor %}

What I would be super interested in would be the current latitudes and longitudes of the aircrafts so I would be able to draw the flight paths on a map. Hope these get added at some point.

Also, there’s a small issue with the country codes. Some of them are 3 characters long which means flags can’t be loaded from flagapi. I cut the country code to 2 characters to make it somewhat work in my card definition, but there are cases where just taking the last character off shows the wrong flag. Not a major thing, but perhaps something to think about, if it would be possible to map the 3 char country codes to standard 2 char codes in the integration.

1 Like

Hi
The current latitudes and longitudes of the aircrafts would be in the next release :slight_smile:
Would be great if you post how you build flight map visualisation

Thanks for pointing to a BUG. I will look into it, but I can’t promise that it would be in the next release :frowning:

Thanks for sharing. Nice improvement to layout.
@ AlexandrErohin - Appreciate the willingness to add the features. Very nice integration

1 Like

No problem. I’ll post my results when the coordinates are available and after (if) I get it done :smile:

1 Like

v0.1.0 Released

Changelog

  • Added current latitude and longitude of the aircraft
  • Added current altitude of the aircraft (measurement: foot)
  • Added current ground speed of the aircraft (measurement: knots)
  • Added current heading of the aircraft (measurement: degrees)
  • Added German translation by @miggi92
6 Likes

Alright. I played around for quite a while looking for a way to get the aircrafts on a map. I tried many different ways, and finally I made it. But it’s quite a hack. Here’s a picture for proof:

So. I’ll just briefly describe here what I did. I’ll publish the relevant stuff after I polish them up a bit, in case there are other people interested in getting the aircraft on a map too :slight_smile:

First of all. The only way to get entities appearing automatically on the standard map card seems to be a geo location source (Geolocation - Home Assistant). The only one on that list that makes any sense in this scenario, is the generic GeoJSON Events. There is a built in GeoJSON integration in HASS that I checked out. It could be leveraged if there was a source that provided GeoJSON data of airplanes of a very specific area someone would be interested in. I admit that I didn’t much bother searching for one, as this seems like a long shot.

So I started looking on how I could use the data already retrieved by this Flightradar24 integration. The coordinates and other data is there, just not in the correct format for the GeoJSON integration. I was hoping to be able to use Home Assistant’s API directly to get the data and format it inside HASS somehow, but that didn’t work out. The API requires authentication and one can’t query for specific attributes anyway, it’s the whole state of a sensor that is retrieved. Also, the GeoJSON integration does not support any kind of authentication. Also I noticed that the scan interval is not configurable either. It’s hardcoded to 5 minutes which is way too long for something like this.

After some poking around I ended up forking the GeoJSON integration and adding 2 configurable fields there. One for scan interval (10 seconds seems quite good), and another one for access token. Now I could enter the API token from HASS to this field and pass it on to a proxy service that could access the HASS API, format the retrieved data to proper GeoJSON, and return it to my customized GeoJSON integration. I created a very simple Node app hosted in a Docker container for handling the data processing. With all this, I managed to get the data to show on a map card.

If you want to achieve the same, you will need the following:

  • My custom GeoJSON integration forked from the built in HASS GeoJSON integration
  • My Node based proxy service for querying HASS API and formatting the retrieved data
  • A server where you can run the Node app (or a Docker container)

Like I wrote earlier, I will publish the above with guides after I clean them up a bit.

What annoys me very much is how limited the map card and the geo location features seem to be. I can only pass a few properties with the GeoJSON data: An ID, latitude and longitude, and the title. Map card automatically shows the title on the markers when geo location sources are used, there’s no way to customize it. So what I’ve done is put an airplane icon (it’s an UTF-character), and the flight number to the title with my proxy service. On the map it will just show the icon and the first character of the flight code. Clicking on a marker gives you this:

So basically the few fields I already mentioned, and the distance to your selected location as the entity state. I would have wanted to get all the relevant data here, and the marker to show up as just an airplane which I would have rotated with CSS according to the aircraft heading. It’s just not possible. If there was some history of coordinates for each plane (not just the current ones, but a list of coordinates), I could draw the route too if I understand the documentation correctly. But as there’s just the current location, the markers will just move each time a new dataset is retrieved.

Sorry, that turned out to be a longer story than intended. In the end the solution is really hacky, but I wanted it done so that’s that :smiley:

2 Likes

Thanks for the research.
It looks complicated to have a map :frowning:
Is there any needed data that I can add to the integration to make it little simpler?

I managed to squeeze out one level of complexity, as I noticed that integrations can be forced to refresh with a service call. Meaning, we are not tied to the 5 min default value of GeoJSON integration. This means that there’s no need to have a forked version of the GeoJSON integration. Unfortunately there’s no way to get data out of the FR24 integration in the correct format, Home Assistant’s API is very limited. That’s why a proxy service is still needed. I pushed the code to github and wrote a short setup guide if someone wants to try it out: GitHub - jesmak/fr24_proxy: Proxy app to convert data from home-assistant-flightradar24 custom integration to GeoJSON format

So, there’s no data that could be added to make this any simpler, but if it’s possible to get more coordinates of a single aircraft (not just the current location), I should be able to draw the flight path on the map too. Don’t know if it’s possible to get this from FR24, but if it is, that might be something worth doing in the future.

Edit: Scrap that. GeoJSON integration only understands Point types, not LineString types which would have to be used to draw the routes. I might look into putting the data on a Grafana map chart later. This would remove the need for a proxy service and would allow drawing the routes. But, I think I’m done with FR24 for now. I’ll return to this topic later at some point.

1 Like

Very impressive work trying to get the map working.

I have a question on this integration. Is there anything stored that will make the database increase over time?
I’m working through my HA configurations to try and reduce integrations that make significant increases to the DB.
Thanks

1 Like

I’d say yes and no. In my experience when there’s a bunch of aircraft in the area, the dataset is so big that HASS logs will show that the recorded will not store the data due to possible performance issues (I think the limit was 16KB or so). So if you’re in an area that has just the right amount of aircraft around all the time, so that the dataset size remains under 16KB but still big, database size will increase with quite a pace when the polling schedule is in the range of seconds. I hope there’s a way in this integration to restrict the returned flight attributes to a predefined set at some point in the future as I would only need a few, and I too would like to keep the database size in control.

You may try to exclude these 3 sensors from Recorder to track.

About restrict the returned flight attributes - it is complicated as I get more request to add more attributes, or store more flights for more time

Could you post your list of attributes that you use?

Maybe there could be a setting in the configuration flow that allows defining a, say comma separated list, of returned attributes. Everything could then be returned if said setting was left empty. Just one idea, perhaps there’s a better way to do it too.

The attributes I personally use and need in my environment are: flight_number, airline_short, aircraft_model, airport_origin_city, airport_destination_city, airport_origin_country_code, airport_destination_country_code, id, call_number, latitude, longitude

Hi, is there a way to send a notification when a specific registration number aircraft enters the area? thanks.

1 Like