Lovelace и Conditional Card

2 февраля, 2021

В этой заметке я хочу обратить внимание на существующую “из коробки” возможность фильтровать вывод карточек в интерфейсе lovelace, а так же скрывать или отображать карточки, например, по нажатию кнопки. Что бы не загромождать интерфейс HA и не плодить множество дашбордов, бывает удобно показывать карточки только в определенное время, в зависимости от каких-то событий или условий.

В интерфейсе HA за условия отображения отвечает специальная карточка – Conditional Card. Подробное описание карточки можно (и нужно) почитать в официальной документации, а я покажу ее использование в реальной жизни.

Один из примеров это показ карточки “время в пути”. С утра мне нужно видеть сколько займет путь из дома до работы, а вечером наоборот. При этом днем или в выходные мне эта информация совершенно ни к чему.

Начать здесь нужно с выбора компонента, который позволит получать информацию о времени в пути от одной точки до другой, в моем случае это кастомный sensor.yandex_maps. Конфигурация у него максимально простая, и в моем случае выглядит примерно так:

- platform: yandex_maps
  start: zone.home
  destination: !secret yandex_map_dest_1
  name: До работы [Саша]
- platform: yandex_maps
  start: !secret yandex_map_dest_1
  destination: zone.home
  name: До дома [Саша]
- platform: yandex_maps
  start: zone.home
  destination: !secret yandex_map_dest_2
  name: До работы [Ира]
- platform: yandex_maps
  start: !secret yandex_map_dest_2
  destination: zone.home
  name: До дома [Ира]

Создается 4 сенсора, для меня и моей второй половины, в двух направлениях для каждого – от дома до работы и от работы до дома.
В secrets.yaml координаты прописаны так:

yandex_map_dest_1: '37.617243,55.750654'
yandex_map_dest_2: '37.619067,55.752242'

Обратите внимание, что в конфиге координаты надо указать в обратном Яндекс Картам порядке – долгота, широта.

На картах – широта, долгота

Дальше, нужно определить время, в течении которого будут отображаться карточки. Сделать это можно с помощью стандартного бинарного сенсора Times of the Day, добавив в конфиг два интервала – например утро (с 7 до 10) и вечер (с 17 до 21).

- platform: tod
  name: time_between_7_10
  after: '7:00'
  before: '10:00'
- platform: tod
  name: time_between_17_21
  after: '17:00'
  before: '21:00'

Дополнительно, нужен сенсор который позволит определить рабочий ли сегодня день или нет. Для этого в HA существует бинарный сенсор Workday. Конфиг в моем случае у него максимально простой:

- platform: workday
  country: RU

Основываясь на этих сенсорах Conditional Card и будет отображать нужные карточки. Стоит отметить, что все условия указанные в блоке conditions читаются через “И”. Т.е. для того, что бы карточка была показана, все проверки должны вернуть True.
Важный момент – Conditional Card позволяет указать для отображения только одну карточку, но это легко обойти завернув все что нужно в vertical-stack или horizontal-stack.

В конфиге это будет выглядеть примерно так:

# --- Время в пути (Утро)
- type: conditional
  conditions:
# Время сейчас в промежутке с 7-00 до 10-00
    - entity: binary_sensor.time_between_7_10
      state: "on"
# И
# Сегодня рабочий день
    - entity: binary_sensor.workday_sensor
      state: "on"
  card:
    type: vertical-stack
    cards:
      - type: markdown
        content: "### Время в пути:"
# Показываем время до работы
      - type: entities
        entities:
          - sensor.do_raboty_sasha
          - sensor.do_raboty_ira
      - type: history-graph
        hours_to_show: 2
        refresh_interval: 60
        entities:
          - sensor.do_raboty_sasha
          - sensor.do_raboty_ira

# --- Время в пути (Вечер)
- type: conditional
  conditions:
# Время сейчас в промежутке с 17-00 до 21-00
    - entity: binary_sensor.time_between_17_21
      state: "on"
# И
# Сегодня рабочий день
    - entity: binary_sensor.workday_sensor
      state: "on"
  card:
    type: vertical-stack
    cards:
      - type: markdown
        content: "### Время в пути:"
# Показываем время до дома
      - type: entities
        entities:
          - sensor.do_doma_sasha
          - sensor.do_doma_ira
      - type: history-graph
        hours_to_show: 2
        refresh_interval: 60
        entities:
          - sensor.do_doma_sasha
          - sensor.do_doma_ira

Как итог, если выполнены все условия, на дашборде появится вот такой блок:

Утренний вариант

А как только хотя бы одно из условий перестанет выполнятся (время или день недели), все эти 3 карточки пропадут, освободив место для более важной информации =)

– ~ –

Еще один пример использования Conditional Card – пульт управления ТВ прямо в интерфейсе HA.
Со всеми нужными кнопками он получается достаточно громоздким, да к тому же у меня их несколько.
Здесь не нужны сенсоры, время и дни недели. Здесь вполне подойдет кнопка, по нажатию на которую карточка с пультом будет либо показана, либо спрятана.

Вот как это выглядит у меня в интерфейсе:

По нажатию на кнопку “Пульт управления” собственно пульт появляется или исчезает .

Работает это так:
Есть Conditional Card, в условии которой прописана проверка какой либо сущности, в моем случае это Input Boolean.
И есть кнопка, при нажатии на которую вызывается toggle (меняет состояние на противоположное) для input_boolean.

В lovelace’е будет следующий код:

# Кнопка, по нажатию вызывает toggle для input_boolean
- type: button
  entity: input_boolean.tv_remote_show_bedroom
  name: "\U000021E7 Пульт управления \U000021E9"
  show_state: false
  show_icon: false
  tap_action:
    action: toggle
# В зависимости от состояния input_boolean отображает или нет карточку с пультом
- type: conditional
  conditions:
    - entity: input_boolean.tv_remote_show_bedroom
      state: "on"
  card: !include samsung_tv_remote_ue.yaml

Код для input_boolean особого интереса не представляет:

tv_remote_show_bedroom:
  icon: mdi:remote-tv