Muestra en tiempo real la canción que estás escuchando en Navidrome directamente en tu pantalla AWTRIX gracias a Home Assistant y MQTT.


En su día hablamos en el blog sobre cómo integrar AWTRIX en Home Assistant para poder enviarle notificaciones personalizadas, sensores y más desde nuestras automatizaciones. Si aún no lo has hecho, te recomiendo que sigas primero ese tutorial, ya que en este artículo vamos a dar por hecho que tienes AWTRIX funcionando e integrado con MQTT en tu instancia de Home Assistant.

Integrar AWTRIX 3 en Home Assistant (utilizando Zigbee2MQTT)
El Ulanzi TC001 es un reloj LED RGB personalizable, ideal para domótica, mostrando hora, clima, notificaciones y más.

Hoy vamos un paso más allá y conectamos Navidrome, el servidor de música compatible con la API Subsonic, con Home Assistant y AWTRIX para mostrar en tiempo real la canción que estás escuchando directamente en tu AWTRIX. Una integración sencilla pero muy vistosa, ideal para los que disfrutamos de tener todo sincronizado y visible en casa.

Pasos previos

Para poder seguir con este tutorial es necesario tener:

  • Un servidor de Navidrome en local.
  • Awtrix configurado en Home Assistant usando MQTT.
  • Una instancia de Home Assistant (obviamente).

Creación del sensor

Para crear el sensor, primero tenemos que confirmar que funciona correctamente la API de Subsonic. Para comprobarlo usaremos curl haciendo esta petición:

curl 'http://[IP_Servidor]/rest/getNowPlaying.view?u=[USUARIO]&p=[CONTRASEÑA]&v=1.16.1&c=HomeAssistant'

Esto si no estás escuchando nada debería de responder lo siguiente:

<subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.16.1" type="navidrome" serverVersion="0.57.0 (4909232e)" openSubsonic="true"><nowPlaying></nowPlaying></subsonic-response>

Y si estás escuchando algo en este momento, debería de salirte toda la información de la canción que estás escuchando en ese momento.

Vamos a explicar por partes que es cada cosa:

  • u: tu usuario de Navidrome.
  • p: tu contraseña.
  • v: versión de API Subsonic
  • c: identificador del cliente (ej. HomeAssistant)

Una vez esto responde correctamente, vamos a Home Assistant para crear el sensor. Como que tenemos que crear un sensor API REST, tendremos que editar directamente el fichero de configuración configuration.yml usando un editor.

Si no tienes editor en Home Assistant, te dejo este otro artículo que te detalla como instalar un editor:

Instala un editor de texto para modificar la configuración de tu Home Assistant
Home Assistant es una de las plataformas más populares para gestionar dispositivos inteligentes, y conocer los diferentes editores de texto disponibles para modificar configuraciones y scripts es fundamental para personalizar y optimizar la experiencia.

En nuestro fichero de configuración de Home Assistant añadimos lo siguiente al final:

sensor:
  - platform: rest
    name: Navidrome Now Playing
    resource: curl 'http://[IP_Servidor]/rest/getNowPlaying.view?u=[USUARIO]&p=[CONTRASEÑA]&v=1.16.1&c=HomeAssistant'
    value_template: >
      {% set data = state_attr('sensor.navidrome_now_playing', 'subsonic-response') %}
      {% set entry = data.get('nowPlaying', {}).get('entry', {}) %}
      {% if entry.get('@title') %}
        {{ entry.get('@artist', 'Desconocido') }} - {{ entry.get('@title', 'Sin título') }}
      {% else %}
        Nada sonando
      {% endif %}
    json_attributes:
      - subsonic-response
    scan_interval: 15

Guardamos la configuración y reiniciamos Home Assistant.

Una vez inicia de nuevo Home Assistant, podemos ir a Herramientas para desarrolladores - Estados y allí buscamos por sensor.navidrome_now_playing:

También podemos añadir el sensor en una tarjeta dentro de una dashboard:

Una vez tengamos esto funcionando, el siguiente paso será crear una automatización para que funcione con Awtrix.

Configuración de la automatización

Ahora tendremos que crear una automatización, como siempre vamos a Configuración - Automatizaciones y Escenas y hacemos clic en Crear Automatización.

La automatización constará de un cambio de un sensor y que ejecutará el envío de datos con una condición. Veamos paso por paso:

Cuando...

triggers:
  - trigger: state
    entity_id:
      - sensor.navidrome_now_playing
    to: null

Cuando el sensor.navidrome_now_playing cambie a cualquier estado. Usamos to: null para que indique "cualquier estado".

Y si...

Para la condición, usaremos una plantilla:

conditions:
  - condition: template
    value_template: >
      {{ trigger.from_state.state != trigger.to_state.state and not
      trigger.to_state.state.startswith('Nada') }}

Para evitar notificaciones repetidas en AWTRIX, añadimos dos condiciones a la automatización:

  1. El estado actual debe ser diferente al anterior → así nos aseguramos de que solo se ejecuta cuando cambia realmente la canción, y no cada vez que el sensor se actualiza.
  2. El nuevo estado no debe contener la palabra "nada" → esto evita mostrar notificaciones cuando no hay música reproduciéndose, ya que el sensor muestra "Nada sonando" en ese caso.

Gracias a estas condiciones, el aviso en AWTRIX se enviará una sola vez por canción y solo si hay algo sonando de verdad.

Entonces hacer...

Si se cumple la condición, entonces lo que haremos será publicar la información a MQTT que es como tenemos configurado Awtrix:

actions:
  - action: mqtt.publish
    data:
      topic: awtrix/notify
      payload: |-
        {
          "icon": 32256,
          "repeat": 2,
          "duration": 10,
          "text": "{{ state_attr('sensor.navidrome_now_playing', 'subsonic-response').nowPlaying.entry['@artist'] }} - {{ state_attr('sensor.navidrome_now_playing', 'subsonic-response').nowPlaying.entry['@title'] }}"
        }

Para aquí lo mostraremos de la siguiente forma Artista - Canción, por ejemplo Rammstein - Sonne.

Integración completa

Y como siempre, te dejo la integración completa para que puedas hacer un copy&paste en condiciones:

alias: Now Playing Navidrome
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.navidrome_now_playing
    to: null
conditions:
  - condition: template
    value_template: >
      {{ trigger.from_state.state != trigger.to_state.state and not
      trigger.to_state.state.startswith('Nada') }}
actions:
  - action: mqtt.publish
    data:
      topic: awtrix/notify
      payload: |-
        {
          "icon": 32256,
          "repeat": 2,
          "duration": 10,
          "text": "{{ state_attr('sensor.navidrome_now_playing', 'subsonic-response').nowPlaying.entry['@artist'] }} - {{ state_attr('sensor.navidrome_now_playing', 'subsonic-response').nowPlaying.entry['@title'] }}"
        }
mode: single

Más sobre ./voidNull

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación