Flight-tracking solution, (assez) simple

Ils existent plusieurs intégrations pour traquer des vols, mais je voullais un epu de contrôle. Via l’api de flightaware (gratuit si personel). J’ai reussi de faire ça
J’ai pas trouvé une solution avec qu’un sensor donc

  1. sensor poue les détails du vol
  2. sensor pour traquer
  3. input_text pour le vol
  4. carte combiné

Résultat:

Sensors

  - platform: command_line
    name: flight_single_id
    unique_id: flight_single_id
    scan_interval: 310
    command: >
         curl -X GET -H "x-apikey:YOUR_API_KEY" "https://aeroapi.flightaware.com/aeroapi/flights/{{ states('input_text.aircraft_id')}}?max_pages=1&start={{ utcnow().strftime("%F") }}&end={{ (now() + timedelta(days=1)).strftime('%F') }}" | jq '{flights: [.flights[] | select(.cancelled==false) | { flight: .ident, flight_fa: .fa_flight_id, flight_iata: .ident_iata, flight_fa_inbound: .inbound_fa_flight_id, origin_city: .origin.city, origin_name: .origin.name , aricraft: .aircraft_type , status: .status , arrival_gate: .gate_destination, arrival_terminal: .terminal_destination , destination_city: .destination.city, destination_name: .destination.name , scheduled_arrival: .scheduled_in, estimated_arrival: .estimated_in, arrival_delay: .arrival_delay }]}'
    value_template: > 
        {{ value_json.flights | length }}
    json_attributes:
      - flights     
      
  - platform: command_line
    name: flight_single_id_position
    unique_id: flight_single_id_position
    device_class: timestamp
    scan_interval: 70
    command: >  
        curl -X GET -H "x-apikey:YOUR_API_KEY"  "https://aeroapi.flightaware.com/aeroapi/flights/{{state_attr('sensor.flight_single_id','flights').0.flight_fa }}/track" | jq '.positions | sort_by(.timestamp)|reverse | .[0] | {timestamp: .timestamp, latitude: .latitude, longitude: .longitude, altitude: .altitude, altitude_change: .altitude_change, groundspeed: .groundspeed}'
    value_template: > 
        {{ value_json.timestamp }}        
    json_attributes:
      - latitude
      - longitude
      - timestamp
      - groundspeed
      - altitude
      - altitude_change

Carte

type: custom:stack-in-card
mode: vertical
cards:
  - type: horizontal-stack
    cards:
      - type: entities
        entities:
          - entity: input_text.aircraft_id
      - type: custom:button-card
        show_name: true
        show_icon: true
        name: refresh
        size: 20%
        tap_action:
          action: call-service
          service: homeassistant.update_entity
          service_data:
            entity_id:
              - sensor.flight_single_id
              - sensor.flight_single_id_position
          data: {}
        icon: mdi:autorenew
  - type: custom:flex-table-card
    clickable: true
    sort_by: state
    max_rows: 15
    entities:
      include: sensor.flight_single_id
    columns:
      - name: Flight
        data: flights
        modify: x.flight
      - name: Origin
        data: flights
        modify: x.origin_city
      - name: Destination
        data: flights
        modify: x.destination_city
      - name: Delay(min)
        data: flights
        modify: |
          if(x.arrival_delay == 0)
          {""}
          else {
          parseInt(x.arrival_delay / 60) }
      - name: Arrival
        data: flights
        modify: |
          if(x.estimated_arrival == null )
            {"-"}
            else {
              var date = new Date(x.estimated_arrival);
              String(date.getDate()).padStart(2,'0')+"/"+
              (String(date.getMonth()+ 1).padStart(2,'0'))+
              " "+
              String(date.getHours()).padStart(2,'0')+":"+
              String(date.getMinutes()).padStart(2,'0')
            }
  - type: map
    entities:
      - entity: sensor.flight_single_id_position
    hours_to_show: 0.2
    default_zoom: 10
    auto_fit: true
4 « J'aime »