Integrar cualquier coche en Home Assistant

Integrar cualquier coche en Home Assistant

En esta entrada te enseño a integrar cualquier coche en Home Assistant, para incluir automatizaciones en tu conducción.

Alcance de la integración

La situación ideal para integrar cualquier coche en Home Assistant es utilizar las integraciones oficiales de cada marca, o en su defecto utilizar los sensores que nos proporciona Android Auto o Car Play. Sin embargo, esto no es tan sencillo en tanto que dependemos de que el coche proporcione la información necesaria para alimentar nuestros sensores.

Esta guía está orientada a todos aquellos vehículos que no permiten enviar la información directamente. Con esta guía para integrar cualquier coche en Home Assistant vamos a conseguir lo siguiente:

  • Saber si alguno de los usuarios está conduciendo el coche.
  • Saber dónde está nuestro coche en todo momento.
  • Controlar el nivel de combustible y saber dónde está más barato.
  • Disponer de la información del tráfico de las carreteras y trayectos que más frecuentamos.

Requisitos previos

Para poder integrar cualquier coche en Home Assistant necesitas lo siguiente:

¿Hay alguien al volante?

Saber si alguno de los usuarios está conduciendo nos va a servir, principalmente, en dos aspectos:

  • Lo vamos a utilizar como desencadenante de automatizaciones relacionadas con la conducción.
  • Va a servir para que otros usuarios sepan que estás conduciendo (por ejemplo, para que sepan que ya has salido del trabajo o que aún no has llegado a casa de tu viaje).

Si eres usuario de Android

Para saber si un usuario está conduciendo, lo único que necesitas es que tu coche tenga Bluetooth, ya sea de serie o mediante algún reproductor multimedia que hayas añadido, y tener instalada la aplicación de Home Assistant en tu teléfono. De esta forma cuando subas al coche tu dispositivo móvil se vinculará al Bluetooth del coche y podremos detectarlo a través del sensor «Conexión Bluetooth».

Con esta información podemos crear un sensor sencillo en tu fichero ‘sensors.yaml’, que indique si estás en el coche (‘on’) o no (‘off’).

- platform: template
  sensors:
    coche_usuario:
      friendly_name: "Coche (USUARIO)"
      value_template: >
        {% if 'DIRECCION MAC (COCHE)' in state_attr('sensor.DISPOSITIVO_bluetooth_connection','connected_paired_devices') %} on
        {% else %} off
        {% endif %}
      icon_template: mdi:car

Si eres usuario de iOS

Los usuarios de iOS también pueden detectar cuando están conduciendo a través de la aplicación de Home Assistant en tu iPhone. En este caso tienes que activar y utilizar el sensor ‘Activity’ que tomará el estado «Automotive» cuando te conectes a tu coche con CarPlay o con el bluetooth de tu coche.

En este caso también podemos crear un sensor que indique si estás en el coche (‘on’) o no (‘off’), de la siguiente forma:

- platform: template
  sensors:
    coche_usuario:
      friendly_name: "Coche (USUARIO)"
      value_template: >
        {% if states('sensor.iphone_activity') == "Automotive" %} on
        {% else %} off
        {% endif %}
      icon_template: mdi:car

Posición GPS de nuestro coche

Vamos a rastrear la posición GPS de nuestro coche creando un ‘device tracker’. De esta forma podrás saber cosas tan útiles como:

  • Saber si tu coche está en casa o alguien se lo ha llevado.
  • Si está en casa, saber desde cuando está aparcado.
  • Si está fuera, saber a qué distancia está de casa y la dirección donde está aparcado.
  • Ver el trayecto realizado en las últimas 24 horas (o el periodo que tú quieras).
  • Saber si tu coche entra en una zona geográfica concreta.

Creación del ‘device tracker’

Para poder rastrear la posición GPS de tu coche ve a tu fichero ‘known_devices.yaml’ (o créalo si aún no lo tienes) y pega el siguiente código. Puedes modificar el nombre del sensor, el icono y la imagen asociada como prefieras, después reinicia HA. Esto creará la entidad ‘device_tracker.coche’.

coche:
  name: coche
  mac:
  icon: mdi:car
  picture: local/images/coche.png
  track: true

Asignar las coordenadas GPS

Ahora tenemos que asignarle las coordenadas GPS a nuestra entidad. Para ello vamos a utilizar las coordenadas del dispositivo móvil del conductor, de forma que siempre que estés conduciendo vayas compartiendo tus coordenadas con las del coche. Este proceso se detendrá cuando salgas del coche, por lo que guardará la última posición transmitida (y sabrás donde está aparcado).

Para ello crea una automatización de la siguiente forma:

  • Desencadenante. Utiliza la opción de «Patrón de tiempo» para que la automatización se ejecute cada minuto mientras conduces (o el intervalo que tú prefieras).
  • Condición. Selecciona la opción «Estado», busca el sensor creado para detectar si estás conectado al bluetooth del coche y en el campo «Estado» indica ‘on’. De esta forma la automatización sólo se ejecutará cuando estés conduciendo. Si compartes el coche con otros usuarios utiliza la opción «O» para añadir varias condiciones alternativas.
  • Acción. Utiliza el servicio ‘device_tracker.see’ para fijar las coordenadas del coche, utilizando como entrada las coordenadas de tu dispositivo. Si compartes el coche con otros usuarios utiliza la opción «Si-entonces» para el dispositivo del usuario correspondiente.

También puedes crear un segundo desencadenante cuando el sensor creado para detectar si estás conectado al bluetooth del coche pase a ‘off’. De esta forma también transmitirá tus coordenadas justo cuando apagues el coche y tendrás con precisión la ubicación donde está aparcado.

A continuación te dejo un ejemplo de automatización con distintos ‘trigger id’, para dos usuarios que utilizan el mismo coche (que puedes adaptar como quieras).

alias: 🚗 Coche
description: ""
trigger:
  - alias: Coordenadas GPS
    platform: time_pattern
    minutes: /1
    id: Coordenadas GPS
  - platform: state
    entity_id:
      - sensor.coche_USUARIO1
    to: "off"
    alias: Aparcado (USUARIO1)
    id: Aparcado USUARIO1
  - platform: state
    entity_id:
      - sensor.coche_USUARIO2
    to: "off"
    alias: Aparcado (USUARIO2)
    id: Aparcado USUARIO2
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - Coordenadas GPS
        sequence:
          - if:
              - condition: state
                entity_id: sensor.coche_USUARIO1
                state: "on"
            then:
              - service: device_tracker.see
                data:
                  dev_id: COCHE
                  gps:
                    - "{{ state_attr('device_tracker.USUARIO1', 'latitude') }}"
                    - "{{ state_attr('device_tracker.USUARIO1', 'longitude') }}"
          - if:
              - condition: state
                entity_id: sensor.coche_USUARIO2
                state: "on"
            then:
              - service: device_tracker.see
                data:
                  dev_id: COCHE
                  gps:
                    - >-
                      {{ state_attr('device_tracker.USUARIO2',
                      'latitude') }}
                    - >-
                      {{ state_attr('device_tracker.USUARIO2',
                      'longitude') }}
      - conditions:
          - condition: trigger
            id:
              - Aparcado USUARIO1
        sequence:
          - service: device_tracker.see
            data:
              dev_id: COCHE
              gps:
                - "{{ state_attr('device_tracker.USUARIO1', 'latitude') }}"
                - "{{ state_attr('device_tracker.USUARIO1', 'longitude') }}"
      - conditions:
          - condition: trigger
            id:
              - Aparcado USUARIO2
        sequence:
          - service: device_tracker.see
            data:
              dev_id: COCHE
              gps:
                - >-
                  {{ state_attr('device_tracker.USUARIO2', 'latitude')
                  }}
                - >-
                  {{ state_attr('device_tracker.USUARIO2', 'longitude')
                  }}
mode: single

Gestionar las coordenadas

Como cualquier otra entidad del tipo ‘device tracker’, puedes crear automatizaciones con la entidad en función de si entra en alguna zona concreta (por ejemplo, en la zona de tu trabajo), detectar si está en casa o mostrar la entidad en tarjetas de tipo mapa.

Además, a través de la geocodificación inversa también puedes traducir las coordenadas en una dirección legible (por ejemplo, «Calle Aguacate 74»). De esta forma te será mucho más fácil localizar dónde lo has aparcado o calcular y mostrar la distancia a casa.

También puedes localizar la posición de tu coche, incluso si te lo han robado, colocando un AirTag barato.

Creación de la tarjeta

En mi caso he creado la siguiente tarjeta para saber dónde está el coche en cada momento. Esta me indica si está en casa (y desde qué momento) o si está fuera (mostrándome a qué distancia y en qué dirección).

gps coche

A continuación encontrarás el código de esta tarjeta. Para crearla, además de adaptar tus entidades, necesitarás instalar a través de HACS las tarjetas de Bubble Card, Card Mod y Mushroom Cards.

type: vertical-stack
cards:
  - type: custom:bubble-card
    card_type: separator
    name: Yaris
    icon: phu:toyota
    card_mod:
      style: |
        ha-card {
          margin-top: 10px!important;
        }
  - type: custom:mushroom-template-card
    primary: ''
    secondary: >
      🚗 {% if (states('device_tracker.toyota_yaris')) == 'home' %}Aparcado
      desde el {{ as_timestamp(state_attr('sensor.direccion_coche',
      'last_changed'))  | timestamp_custom('%d/%m/%Y a las %H:%Mh') }} {% else
      %}{{ state_attr('sensor.direccion_coche','place_name') }}, {{
      state_attr('sensor.direccion_coche','street') }} {{
      state_attr('sensor.direccion_coche','street_number') }} {% endif %}  
    icon: ''
    layout: vertical
    tap_action:
      action: none
    multiline_secondary: true
    card_mod:
      style: |
        ha-card {
          background: #222c40;
        }
  - square: false
    type: grid
    columns: 2
    cards:
      - type: custom:mushroom-template-card
        primary: >
          {% if (states('device_tracker.toyota_yaris')) == 'home' %}En casa {%
          else %}A {{
          state_attr('sensor.direccion_coche','distance_from_home_km') | int }}
          km{% endif %}  
        secondary: ''
        icon: >
          {% if (states('device_tracker.toyota_yaris')) == 'home' %}mdi:home {%
          else %}mdi:car-side {% endif %}  
        icon_color: >
          {% if (states('device_tracker.toyota_yaris')) == 'home' %}lime {% else
          %}pink {% endif %}  
        entity: device_tracker.toyota_yaris
        layout: vertical
        tap_action:
          action: none
        card_mod:
          style: |
            ha-card { 
              background: linear-gradient( rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.8) ), url('/local/images/tyaris.jpg');
              background-position: center;
              background-size: cover;
              height: 97px!important;
            }
      - type: map
        entities:
          - entity: device_tracker.toyota_yaris
        aspect_ratio: 58%
        dark_mode: false
        card_mod:
          style:
            ha-map $ ha-entity-marker $: |
              .marker {
                border: 0px!important;
                background: transparent!important;
                }
            ha-map$: |
              .leaflet-control-attribution {
                visibility: hidden;
               }
              .leaflet-control-zoom {
                visibility: hidden;
               }
            ha-icon-button$: |
              mwc-icon-button {
                display:none !important
              }

Controlar el nivel de combustible

¿Alguna vez vas con prisa y al arrancar el coche te das cuenta de que el depósito está en reserva? Tanto si no te ha avisado otro conductor como si se te ha olvidado, esto es algo que da mucha rabia.

Creación del sensor del depósito

Los coches más modernos proporcionan el sensor del depósito de combustible en sus aplicaciones, pero no es mi caso. En su lugar he creado un ayudante de tipo «alternar» con el nombre «Gasolina coche», creando la entidad ‘input_boolean.coche_gasolina’.

Como tengo Google Assistant integrado en HA, puedo «encender» y «apagar» este ayudante con la voz mientras voy conduciendo. He creado un diálogo natural con Google Assistant, de forma que si le digo «Ok, Google! No queda gasolina» enciende el ayudante. Si le digo «Ok, Google! Depósito lleno», lo apaga.

Además, he creado una automatización para que cuando se encienda este ayudante envíe una notificación a todos los conductores para que sepan que está reserva. Del mismo modo, envía una notificación cuando ya se ha repostado. De esta forma todos estamos informados y a nadie le pilla por sorpresa.

Gasolineras más baratas

Haciendo uso de la integración de gasolineras puedo localizar en todo momento la gasolinera más barata entre mis preferidas. Esto lo utilizo con dos objetivos:

  • Cuando voy conduciendo, digo «Ok, Google! No queda gasolina» y enciende el ayudante, este me contesta indicándome cuál es la gasolinera más barata y el precio actual. Puedes conseguirlo mediante una notificación como esta (en dispositivos Android).
service: notify.mobile_app_DISPOSITIVO
data:
  message: TTS
  data:
    tts_text: >
        En este momento la gasolinera con mejor precio es la de 
        {%- set gasoli = states
          |selectattr('entity_id', 'contains', 'gasolina')
          |rejectattr('state', 'contains', 'off')
          |sort(attribute='state')
          |list
          |first
        %} {{ gasoli.name }} con un precio de
        {%- set gas = states
          |selectattr('entity_id', 'contains', 'gasolina')
          |rejectattr('state', 'contains', 'off')
          |map(attribute='state')
          |list
          |sort
          |first
        %} {{ gas | round(2)}} euros por litro    
    channel: alarm_stream
    priority: high
    ttl: 0
  • También he creado estos dos ‘widget’ en mi panel de control que indican si el depósito tiene gasolina o está en reserva, y cuál es la gasolinera más barata en ese momento.
gasolina

A continuación encontrarás el código de esta tarjeta. Para crearla, además de adaptar tus entidades, necesitarás instalar a través de HACS las tarjetas de Bubble Card, Card Mod y Mushroom Cards.

type: vertical-stack
cards:
  - type: custom:bubble-card
    card_type: separator
    name: Gasolina
    icon: mdi:gas-station
  - square: false
    type: grid
    columns: 2
    cards:
      - type: custom:mushroom-template-card
        primary: Depósito
        secondary: >
          {% if (states('input_boolean.coche_gasolina')) == 'on' %}En reserva {%
          else %}Lleno {% endif %}  
        icon: >
          {% if (states('input_boolean.coche_gasolina')) == 'on'
          %}mdi:gauge-empty {% else %}mdi:gauge-full {% endif %}  
        icon_color: >
          {% if (states('input_boolean.coche_gasolina')) == 'on' %}red {% else
          %}lime {% endif %}  
        entity: input_boolean.coche_gasolina
        layout: vertical
        tap_action:
          action: toggle
        card_mod:
          style: |
            ha-card { 
              background: #222c40;
            }
      - type: custom:mushroom-template-card
        primary: |
          {% set gas = states
            |selectattr('entity_id', 'contains', 'gasolina')
            |rejectattr('state', 'contains', 'off')
            |sort(attribute='state')
            |list
            |first
          %}{{ gas.name }}
        secondary: |
          {% set gas = states
            |selectattr('entity_id', 'contains', 'gasolina')
            |rejectattr('state', 'contains', 'off')
            |sort(attribute='state')
            |list
            |first
          %}{{ gas.state | round(2) }} €/L
        icon: mdi:gas-station
        icon_color: lime
        layout: vertical
        tap_action:
          action: none
        card_mod:
          style: |
            ha-card { 
              background: #222c40;
            }

Información del tráfico

Uno de los aspectos más interesantes que afecta a la conducción y que vamos a poder explotar al integrar cualquier coche en Home Assistant es la información del tráfico. Esto hará que sea más eficiente y cómoda.

Lo primero que vamos a poder hacer gracias a la integración con Waze es saber, en función del estado actual del tráfico, a cuánto tiempo nos encontramos de llegar a casa. Esto te va a ser de gran utilidad para decidir si es el momento de empezar tu viaje o te merece la pena esperar un poco. Puedes crear, por ejemplo, una automatización para que HA te avise cuando sea el mejor momento (por ejemplo, cuando el trayecto sea inferior a 20 minutos).

También voy a utilizar esta integración para monitorizar los tramos de algunas carreteras que me interesan de esta forma tan sencilla:

  • Voy a crear un sensor que me indique el tiempo del trayecto del tramo que me interese, seleccionando como origen un punto de la carretera y otro como destino (como si fuera un trayecto que quisiera recorrer).
  • Este sensor me indicará el tiempo que tardo en recorrerlo en coche. Supongamos que cuando no hay tráfico tardo 10 minutos. Este será el valor que consideraré como «tráfico fluido».
  • En base a mi experiencia y mis preferencias voy a establecer otros dos umbrales. Por ejemplo, entre 10 y 20 minutos lo consideraré «trafico lento» y más de 20 minutos supondrá un «atasco» (más tarde puedo ir calibrando estos valores).

Además puedo consultar si hay algún accidente o un control policial, con sólo acceder a la tarjeta donde he integrado el tramo de Waze.

Por otro lado, en esta entrada te enseñé cómo puedes integrar webcams públicas en HA y, en particular, las de la DGT (Dirección General de Tráfico) son de las más fáciles de integrar. Esto nos va a permitir echar un vistazo rápido y saber cómo está el tráfico en nuestras carreteras de paso. Qué duda cabe que esto también resulta de gran utilidad si quieres evitar atascos o decidir cuándo es el mejor momento para salir de viaje.

A continuación encontrarás el código de esta tarjeta. Para crearla, además de adaptar tus entidades, necesitarás instalar a través de HACS las tarjetas de Bubble Card, Card Mod, Mushroom Cards y Bar Card.

type: vertical-stack
cards:
  - type: custom:bubble-card
    card_type: separator
    name: Tráfico
    icon: mdi:cctv
  - type: custom:stack-in-card
    card_mod:
      style: |
        ha-card {
          background: #222c40;
        }
    cards:
      - square: false
        type: grid
        cards:
          - type: custom:mushroom-template-card
            primary: En directo
            secondary: >
              {% if (states('sensor.waze_a_casa') | int) == 0 %} Ver estado {%
              else %} Estas a {{ states('sensor.waze_a_casa') }} de casa {%
              endif %}
            icon: mdi:car-multiple
            icon_color: white
            multiline_secondary: true
            tap_action:
              action: navigate
              navigation_path: '#trafico'
          - type: custom:bar-card
            card_mod:
              style: |-
                ha-card {
                  border: 0px;
                  height: 64px;
                }
                bar-card-name {
                  margin-left: 10px;
                  font-size: 9px;
                  text-shadow: 1px 1px #0005;
                  opacity: .8
                }
                bar-card-currentbar {
                  border-radius: 3px !important;
                }
                bar-card-backgroundbar {
                  border-radius: 3px !important;
                  opacity: 0.7
                }
                bar-card-value {
                  visibility: hidden;
                }
            entities:
              - entity: sensor.waze_a5
                name: A5
                max: 60
                severity:
                  - color: darkseagreen
                    from: 0
                    to: 15
                  - color: orange
                    from: 15
                    to: 25
                  - color: crimson
                    from: 25
                    to: 60
                height: 13px
                decimal: 0
                positions:
                  icon: 'off'
                  name: inside
                  indicator: 'off'
              - entity: sensor.waze_m503
                name: M503
                max: 30
                severity:
                  - color: darkseagreen
                    from: 0
                    to: 5
                  - color: orange
                    from: 5
                    to: 10
                  - color: crimson
                    from: 10
                    to: 30
                height: 13px
                decimal: 0
                positions:
                  icon: 'off'
                  name: inside
                  indicator: 'off'
        columns: 2
  - square: false
    type: grid
    cards:
      - type: picture
        image: https://infocar.dgt.es/etraffic/data/camaras/788.jpg?t=1711541024661
        tap_action:
          action: none
      - type: picture
        image: https://informo.madrid.es/cameras/Camara11306.jpg?rand=1711622226935
        tap_action:
          action: none
    columns: 2

Otras ideas de automatización

Además de todo lo anterior también hay otras formas de integrar cualquier coche en Home Assistant, por ejemplo: