Tarjetas dinámicas con botones

En esta entrada te explico cómo crear tarjetas dinámicas con botones, de forma que cambie el contenido mostrado al pulsarlos. Por cierto, esta entrada parte de la idea compartida por nuestro amigo WoodBox de la comunidad de Aguacatec.

Mejora la accesibilidad de tu panel

A medida que vamos incluyendo dispositivos e integraciones en nuestra instancia de Home Assistant cada vez tenemos acceso a más información. Esto puede tener un impacto negativo si no tenemos en cuenta la navegabilidad del panel. Es decir, la forma en la que mostramos esta información para que sea fácilmente accesible.

Anteriormente ya hemos visto otras formas de organizar el contenido para tener todo a “un solo clic de distancia”. Por ejemplo, puedes lanzar contenido adicional en ‘pop-up’s, organizar tus iconos en tarjetas de habitación o mostrarlos en menús emergentes.

Lo que hoy vamos a ver es otra forma alternativa de organización, de forma que podamos cambiar la información disponible creando tarjetas dinámicas con botones, que cambien el contenido visible al pulsarlos.

Tarjetas condicionales

El principio general es sencillo, nos vamos a apoyar en alguna entidad vinculada y a asociar cada bloque de contenido a uno de sus estados. Esto podemos hacerlo de forma sencilla utilizando una tarjeta de tipo condicional, de las que vienen preinstaladas en Home Assistant. Esta muestra una tarjeta únicamente si se dan las condiciones especificadas (en este ejemplo, sólo muestra la tarjeta cuando la bombilla está encendida).

tarjeta condicional

El código correspondiente al ejemplo sería el siguiente:

type: vertical-stack
cards:
  - type: entities
    entities:
      - entity: light.bombilla
        name: Bombilla
  - type: conditional
    conditions:
      - condition: state
        entity: light.bombilla
        state: 'on'
    card:
      type: markdown
      content: Y se hizo la luz!! 💡💡

Si observas la última parte del código, la segunda tarjeta sólo aparece cuando el estado de la entidad ‘light.bombilla’ es igual a “on”. La cosa se pone interesante si añades una tarjeta condicional para cada uno de los estados. Para ello sólo tienes que añadir otra tarjeta condicional para el segundo estado (‘off’).

tarjeta condicional
type: vertical-stack
cards:
  - type: entities
    entities:
      - entity: light.bombilla
        name: Bombilla
  - type: conditional
    conditions:
      - condition: state
        entity: light.bombilla
        state: 'off'
    card:
      type: markdown
      content: No veo nada!! 😣😣
  - type: conditional
    conditions:
      - condition: state
        entity: light.bombilla
        state: 'on'
    card:
      type: markdown
      content: Y se hizo la luz!! 💡💡

Una vez comprendido esto, ¿por qué quedarnos únicamente con estados binarios? Si utilizamos como entidad de referencia un ayudante de tipo desplegable podemos reflejar tantas opciones como queramos.

tarjeta condicional
type: vertical-stack
cards:
  - type: entities
    entities:
      - entity: input_select.rutina
  - type: conditional
    conditions:
      - condition: state
        entity: input_select.rutina
        state: Desayuno
    card:
      type: markdown
      content: La comida más importante del día! 🥑
  - type: conditional
    conditions:
      - condition: state
        entity: input_select.rutina
        state: Trabajo
    card:
      type: markdown
      content: Venga que hay que pagar facturas! 🫰
  - type: conditional
    conditions:
      - condition: state
        entity: input_select.rutina
        state: Deporte
    card:
      type: markdown
      content: Mens sana in corpore sano 💪
  - type: conditional
    conditions:
      - condition: state
        entity: input_select.rutina
        state: Descanso
    card:
      type: markdown
      content: Se acabó lo que se daba! 😴

Y si ahora cambiamos el desplegable, por ejemplo, por unas tarjetas Mushroom Card ya habríamos conseguido tarjetas dinámicas con botones formando un menú totalmente navegable. Sólo tienes que asignar como ‘tap action’ a cada tarjeta el servicio ‘input_select.select_option’ e indicar la opción correspondiente.

tarjeta condicional
type: vertical-stack
cards:
  - type: entities
    entities:
      - entity: input_select.rutina
  - square: false
    type: grid
    cards:
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:food-apple
        layout: vertical
        tap_action:
          action: call-service
          service: input_select.select_option
          target:
            entity_id: input_select.rutina
          data:
            option: Desayuno
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:briefcase
        layout: vertical
        tap_action:
          action: call-service
          service: input_select.select_option
          target:
            entity_id: input_select.rutina
          data:
            option: Trabajo
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:dumbbell
        layout: vertical
        tap_action:
          action: call-service
          service: input_select.select_option
          target:
            entity_id: input_select.rutina
          data:
            option: Deporte
      - type: custom:mushroom-template-card
        primary: ''
        secondary: ''
        icon: mdi:sleep
        layout: vertical
        tap_action:
          action: call-service
          service: input_select.select_option
          target:
            entity_id: input_select.rutina
          data:
            option: Descanso
    columns: 4
  - type: conditional
    conditions:
      - condition: state
        entity: input_select.rutina
        state: Desayuno
    card:
      type: markdown
      content: La comida más importante del día! 🥑
  - type: conditional
    conditions:
      - condition: state
        entity: input_select.rutina
        state: Trabajo
    card:
      type: markdown
      content: Venga que hay que pagar facturas! 🫰
  - type: conditional
    conditions:
      - condition: state
        entity: input_select.rutina
        state: Deporte
    card:
      type: markdown
      content: Mens sana in corpore sano 💪
  - type: conditional
    conditions:
      - condition: state
        entity: input_select.rutina
        state: Descanso
    card:
      type: markdown
      content: Se acabó lo que se daba! 😴

State Switch Card

Por cierto, quizás te interese saber que antes de que pudiéramos crear estas tarjetas condicionales ya existía la opción de instalar State Switch Card. Esta sigue el mismo principio de funcionamiento, aunque el código se estructura de otra forma.

State Switch Card

Aunque a día de hoy puede que ya no sea una opción tan interesante, sigue ofreciendo alguna funcionalidad adicional. Por ejemplo, permite realizar transiciones en el cambio de las tarjetas que le puede dar un “toque” a tu panel.

State Switch Card

También permite cambiar tarjetas, por ejemplo, en función de la resolución del dispositivo. Esto puede resultarte interesante si estás investigando como mejorar tu wall panel.

State Switch Card

¿Dudas?¿necesitas ayuda? entra aquí
Y si te ha gustado, compártelo! 🙂
Send this to a friend