Traffico aereo sotto controllo su Home Assistant con flightradar24
Home Assistant
Scritto da Vincenzo Caputo
Vi è mai capitato di affacciarvi dal balcone della vostra abitazione e di osservare il cielo?
Lo scenario sui cieli della mia città non è molto diverso da quello che vedete in foto e chi come me è molto curioso si chiede spesso com'è possibile che ci siano tutti questi voli in transito.
Se escludiamo le famigerate "scie chimiche" e cerchiamo di approfondire l'argomento, è facile trovare dati online sul traffico aereo quotidiano mondiale e, quello che appare, è più o meno quello che vedete nella seguente foto.
Ecco spiegata la quantità di aerei che potete osservare tirando su il naso in qualsiasi ora del giorno o della notte.
Non tutti sanno che la maggior parte dei voli sono pianificati ed i piani di volo sono di pubblico dominio.
Esiste un sito che raccoglie questi dati in tempo reale e li mostra graficamente al seguente indirizzo:
https://www.flightradar24.com/
In pratica, se sulla vostra testa sta passando un aereo, potete zoomare sulla mappa nel punto dove vi trovare e fare clic sull'aereo ottenendo le principali informazioni di volo.
Per gli amanti di Home Assistant esiste un'integrazione per questo servizio che porta flightradar24 direttamente nel nostro amato personal hub.
Il progetto lo trovate al seguente indirizzo:
https://github.com/AlexandrErohin/home-assistant-flightradar24
L'integrazione è installabile facilmente tramite HACS (Home Assistant Community Store)
Dopo averla installata e configurata potrete ottenere le informazioni dei voli in transito sulla vostra testa, sotto forma di sensori o sotto forma di carda grafica
Le opzioni di configurazione sono sostanzialmente le coordinate che volete monitorare e il raggio di monitoraggio
Devo dire che mi sono divertito veramente tanto a leggere i dati dei voli in transito sulla mia casa, ma ad un certo punto ho voluto spingermi oltre.
Chi mi segue sa che ho implementato nella mia domotica dei controlli vocali molto avanzati grazie all'uso di assist in abbinata con diverse AI.
Dunque ho provato a a mettere a punto il mio personal Hub perchè mi fornisse vocalmente le informazioni sui voli.
A cosa serve?
Assolutamente a nulla, ma vuoi mettere la possibilità di chiedere al tuo assistente domestico di intercettare il traffico aereo ed ottenere le informazioni dei voli in transito?
Ti assicuro che i tuoi amici e parenti rimarranno a bocca aperta sentendo che il tuo Jarvis risponde a queste domande.
La prima cosa che ho fatto è stato archiviare i dati degli ultimi 3 voli transitati nell'area monitorata.
Se vuoi replicare quello che ho fatto puoi seguire le seguenti istruzioni.
Apri il tuo file configuration.yaml (o un file separato per i template, se lo usi).
Assicurati di avere una sezione template: (Se non ce l'hai, aggiungila).
Incolla questo codice YAML direttamente sotto la riga template
template:
- trigger:
# Questo è il trigger: l'evento di un aereo che entra nella zona
- platform: event
event_type: flightradar24_entry
sensor:
# Questo è il sensore che creeremo
- name: "Dati Ultimi 3 Voli"
unique_id: dati_ultimi_3_voli
icon: mdi:history
# Lo "stato" del sensore sarà solo l'ora dell'ultimo rilevamento
# (deve essere < 255 caratteri)
state: >
Ultimo rilevamento: {{ now().strftime('%H:%M') }}
# Gli "attributi" sono la nostra memoria (possono essere molto grandi)
attributes:
flights: >-
{# 1. Definiamo i dati del nuovo volo, presi dall'evento 'trigger' #}
{% set new_flight = {
'callsign': trigger.event.data.callsign,
'model': trigger.event.data.aircraft_model,
'origin': trigger.event.data.airport_origin_city,
'destination': trigger.event.data.airport_destination_city,
'altitude_m': (trigger.event.data.altitude | int(0) * 0.3048) | round(0),
'speed_kmh': (trigger.event.data.ground_speed | int(0) * 1.852) | round(0),
'time': now().strftime('%Y-%m-%d %H:%M')
} %}
{# 2. Carichiamo la vecchia lista dall'attributo 'this' (il sensore stesso) #}
{# 'this.attributes.flights' ci dà la lista che avevamo prima #}
{% set old_list = this.attributes.flights | default([]) %}
{# 3. Creiamo la nuova lista: [nuovo volo] + [vecchia lista] #}
{% set new_list = [new_flight] + old_list %}
{# 4. Restituiamo la lista, prendendo solo i primi 3 elementi [0:3] #}
{{ new_list[0:3] }}
Dopo il riavvio, avrai una nuova entità chiamata sensor.dati_ultimi_3_voli.
All'inizio, il suo attributo flights sarà vuoto.
Non appena il primo aereo entrerà nella tua zona, l'evento flightradar24_entry attiverà il sensore.
Il sensore salverà i dati di quel volo nel suo attributo flights.
Quando arriverà un secondo aereo, il sensore prenderà la vecchia lista (con 1 volo), aggiungerà il nuovo volo in cima e salverà la nuova lista (con 2 voli).
Quando arriverà il quarto aereo, il sensore aggiungerà il nuovo volo in cima e il codice [0:3] "taglierà via" il volo più vecchio (il quarto), mantenendo la lista sempre a 3.
A questo punto io ho creato una card Markdown che visualizza i dati di questi ultimi 3 voli archiviati come potete vedere nella seguente immagine.
Per ottenere la stessa cosa potrete aggiungere una card ad una vista o su una plancia e incollare il seguente codice yaml nella configurazione della card.
type: markdown
content: |
**Ultimi 3 Voli Rilevati:**
{% set flights = state_attr('sensor.dati_ultimi_3_voli', 'flights') %}
{% if flights and flights | count > 0 %}
{% for flight in flights %}
- **{{ flight.callsign }}** ({{ flight.time }})
- Modello: {{ flight.model | default('N/D') }}
- Da: {{ flight.origin | default('Sconosciuto') }}
- A: {{ flight.destination | default('Sconosciuto') }}
- Alt: {{ flight.altitude_m }} m, Vel: {{ flight.speed_kmh }} km/h
{% endfor %}
{% else %}
In attesa del primo aereo...
{% endif %}
A questo punto la parte grafica è completa, ma non riuscirete ancora ad interrogare Assist per ottenere le informazioni sui voli.
Questo perché Assist è bravissimo a leggere lo Stato (state) di un sensore, ma è negato a leggere e interpretare i suoi Attributi (attributes).
Il nostro sensore sensor.dati_ultimi_3_voli è stato costruito così:
Stato: Ultimo rilevamento: 14:32 (una stringa semplice)
Attributi: flights: [ ...tutta la lista dei 3 voli... ] (dati complessi)
Quando chiediamo ad Assist "Dimmi i dati degli ultimi 3 voli", lui guarda l'entità, vede lo stato "Ultimo rilevamento: 14:32" e non sa cosa farsene. Non è addestrato a "scavare" negli attributi e leggere una lista.
Dunque ho dovuto creare dei sensori "di facciata" in cui l'informazione necessaria è scritta per esteso direttamente nello Stato.
Lo stato di un sensore può contenere fino a 255 caratteri, che sono più che sufficienti per descrivere un singolo volo in modo colloquiale.
Andiamo dunque ad aggiungere questi nuovi sensori.
Apri di nuovo il tuo configuration.yaml e trova la sezione template: dove hai inserito il codice per sensor.dati_ultimi_3_voli.
Aggiungi, all'interno della stessa sezione template:, anche il codice per questi 3 nuovi sensori:
template:
# --- QUESTO È IL SENSORE CHE HAI GIÀ ---
- trigger:
- platform: event
event_type: flightradar24_entry
sensor:
- name: "Dati Ultimi 3 Voli"
unique_id: dati_ultimi_3_voli
icon: mdi:history
state: >
Ultimo rilevamento: {{ now().strftime('%H:%M') }}
attributes:
flights: >-
{# ... (tutto il codice per 'flights' rimane invariato) ... #}
{% set new_flight = {
'callsign': trigger.event.data.callsign,
'model': trigger.event.data.aircraft_model,
'origin': trigger.event.data.airport_origin_city,
'destination': trigger.event.data.airport_destination_city,
'altitude_m': (trigger.event.data.altitude | int(0) * 0.3048) | round(0),
'speed_kmh': (trigger.event.data.ground_speed | int(0) * 1.852) | round(0),
'time': now().strftime('%Y-%m-%d %H:%M')
} %}
{% set old_list = this.attributes.flights | default([]) %}
{% set new_list = [new_flight] + old_list %}
{{ new_list[0:3] }}
# --- AGGIUNGI QUESTI NUOVI SENSORI QUI SOTTO ---
- sensor:
# Sensore per il Volo 1 (il più recente)
- name: "Ultimo Volo Rilevato"
unique_id: ultimo_volo_rilevato_assist
icon: mdi:airplane-takeoff
state: >
{# Prendiamo i dati dal nostro sensore "database" #}
{% set flights = state_attr('sensor.dati_ultimi_3_voli', 'flights') %}
{# Controlliamo che esista almeno 1 volo #}
{% if flights and flights | count > 0 %}
{% set f = flights[0] %} {# 'f' sta per il volo più recente #}
Volo {{ f.callsign | default('sconosciuto') }},
un {{ f.model | default('modello sconosciuto') }},
da {{ f.origin | default('origine sconosciuta') }}
a {{ f.destination | default('destinazione sconosciuta') }}.
Altitudine {{ f.altitude_m }} metri,
velocità {{ f.speed_kmh }} chilometri orari.
{% else %}
Nessun volo registrato al momento
{% endif %}
# Sensore per il Volo 2 (il penultimo)
- name: "Penultimo Volo Rilevato"
unique_id: penultimo_volo_rilevato_assist
icon: mdi:airplane
state: >
{% set flights = state_attr('sensor.dati_ultimi_3_voli', 'flights') %}
{# Controlliamo che esistano almeno 2 voli #}
{% if flights and flights | count > 1 %}
{% set f = flights[1] %} {# Prendiamo il secondo della lista #}
Volo {{ f.callsign | default('sconosciuto') }},
un {{ f.model | default('modello sconosciuto') }},
da {{ f.origin | default('origine sconosciuta') }}
a {{ f.destination | default('destinazione sconosciuta') }}.
Altitudine {{ f.altitude_m }} metri,
velocità {{ f.speed_kmh }} chilometri orari.
{% else %}
Nessun secondo volo registrato
{% endif %}
# Sensore per il Volo 3 (il terzultimo)
- name: "Terzultimo Volo Rilevato"
unique_id: terzultimo_volo_rilevato_assist
icon: mdi:airplane-landing
state: >
{% set flights = state_attr('sensor.dati_ultimi_3_voli', 'flights') %}
{# Controlliamo che esistano almeno 3 voli #}
{% if flights and flights | count > 2 %}
{% set f = flights[2] %} {# Prendiamo il terzo della lista #}
Volo {{ f.callsign | default('sconosciuto') }},
un {{ f.model | default('modello sconosciuto') }},
da {{ f.origin | default('origine sconosciuta') }}
a {{ f.destination | default('destinazione sconosciuta') }}.
Altitudine {{ f.altitude_m }} metri,
velocità {{ f.speed_kmh }} chilometri orari.
{% else %}
Nessun terzo volo registrato
{% endif %}
Salva il file configuration.yaml e Riavvia Home Assistant.
Dopo il riavvio, avrai 3 nuove entità:
sensor.ultimo_volo_rilevato
sensor.penultimo_volo_rilevato
sensor.terzultimo_volo_rilevato
Vai nelle impostazioni di Assist e assicurati di esporre queste 3 nuove entità.
Ora, quando un aereo entra nella zona, sensor.dati_ultimi_3_voli si aggiorna.
Immediatamente dopo, anche i 3 nuovi sensori si aggiorneranno, formattando il loro stato.
Quando chiederai ad Assist:
"Che mi dici dell'ultimo volo rilevato?" (o una qualsiasi frase simile in linguaggio del tutto naturale)
Assist vedrà il sensore sensor.ultimo_volo_rilevato, leggerà il suo stato e ti risponderà qualcosa tipo:
"Volo EJU3546, un Airbus A320, da Milano Malpensa a Parigi Charles de Gaulle. Altitudine 10973 metri, velocità 852 chilometri orari."
Il risultato finale lo potete osservare nel video dimostrativo direttamente sul nostro canale YouTube MissingTech
Buona visione!
Produrre e aggiornare contenuti su vincenzocaputo.com richiede molto tempo e lavoro. Se il contenuto che hai appena letto è di tuo gradimento e vuoi supportarmi, clicca uno dei link qui sotto per fare una donazione.