Как подключить дисплей к яндекс.станции без хирургического вмешательства

Тема в разделе "Глядите, что я сделал", создана пользователем Di_Mok, 17 янв 2022.

  1. Di_Mok

    Di_Mok Нуб

    После приобретения ещё одной станции на кухню (Лайт), решил приколотить её к стене прямо над кухонным столом. Идея прижилась, но хотелось большего - экранчик, т.к. она висит прямо перед глазами.
    Всё нижеследующее скорее не готовый рецепт, а ход мыслей. Точнее выдержки. Полную ленту мозгового штурма выкладывать не буду, дабы не нанести психологическую травму читателю.

    Тех, кто верит в чудеса, сразу огорчу, это работает не на прямую, а через HomeAssistant.

    Для заинтересовавшихся маленький ролик:



    Поехали...

    Нам потребуется:

    Home Assistant:
    Железо:
    • ESP8266
    • Дисплей SSD1306 *
    * Для меня вопрос с дисплеем остаётся открытым, т.к. под рукой оказался только SSD1306 0.96", а он, на мой взгляд, маловат.

    Создание сенсора

    Изначально, моё распалённое новогодним алкоголем воображение нагородило довольно громоздкую конструкцию взаимодействия, но это как следствие слабого знания темы, вознёй с HA я увлёкся около месяца назад.

    Почитав не много понял, что ESPHome прекрасно интегрирован в HA, и может слушать сенсоры без всяких лишних телодвижений.

    Идем в Панель разработчика, и видим вожделенное, а именно атрибуты : media_title и media_artist
    Одна незадача - в media_title присутствуют и название песни и имя исполнителя, а я хотел их отображать отдельно, в две строки.

    1.png

    Работать будет и так, но это не наш путь. Обтяпаем строку с конца на длину названия исполнителя, и ещё точку и пробел.
    Можно было ещё вытянуть статус (play/pause) и уровень громкости, а также время воспроизведения, но миниатюрность экрана отбило желание
    Переходим на вкладочку Шаблоны, и при помощи богомерзкой Jinja2 пытаемся воплотить идею. Получилось.

    2.png

    Осталось превратить полученный опыт в желаемый результат. Нужно вставить следующий код в ... (не знаю как у вас, а я рукоблудные сенсоры вынес в отдельный файл sensors.yaml)

    Код (Text):
    - platform: template
      sensors:
        ys_title:
          value_template: >-
            {% set str_len = state_attr('media_player.yandex_station_ВАШ_ID', 'media_artist')|length %}
            {{ state_attr('media_player.yandex_station_ВАШ_ID', 'media_title')[:-str_len-2]}}
        ys_artist:
          value_template: >-
            {{ state_attr('media_player.yandex_station_ВАШ_ID', 'media_artist')}}
    Первый этап пройден

    Создание нового устройства в ESPHome

    Описывать начальные этапы манипуляций, думаю нет смысла, поэтому сразу переходим к десерту. Нам нужно прицепиться к созданному ранее в HA сенсору.
    В редакторе кода устройства добавляем:

    Код (Text):
    text_sensor:
      - platform: homeassistant
        name: "ys_title"
        entity_id: sensor.ys_title
        id: ys_title
      - platform: homeassistant
        name: "ys_artist"
        entity_id: sensor.ys_artist
        id: ys_artist
    Не много занимаемся самолюбованием созерцанием прилетающих данных в логах, и двигаемся дальше.

    Натренированные в многочисленных приключениях нижние полушария мозга подсказываю, что необходимо подгрузить кириллический шрифт.

    Делается это копированием шрифта в папку /config/esphome и объявлением в конфигурации:

    Код (Text):
    font:
      - file: "arial.ttf"
        id: arial14
        size: 14
    Но фокус не удался. Вместо кириллических символов закрашенные прямоугольники. Нужно добавить список символов:

    Код (Text):
    glyphs: ' !"%() ,-.:/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz°АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    Не нужно бездумно копипастить эту строку. В русском алфавите я накосячил три раза )))

    Прицепим дисплей и выведем на него данные с нашего сенсора:

    Код (Text):
    i2c:
      sda: GPIO4
      scl: GPIO5
    display:
      - platform: ssd1306_i2c
        model: "SSD1306 128x64"
        address: 0x3C
        lambda: |-
          it.printf(4, 4, id(arial14), "%s",id(ys_title).state.c_str());
          it.printf(4, 20, id(arial14), "%s",id(ys_artist).state.c_str());
    Вряд ли стоит заострять на этом пункте внимание, описаний подключения дисплея навалом, да и экземпляр не удачный. Замечу лишь, что две последние строки как раз и выводят информацию полученную от ЯС. Первая - композиция, вторая - исполнитель. Почему не наоборот? Я художник, я так вижу.

    Еще добавил часы. Модуля часов у меня не оказалось, поэтому опять же вытянул данные от сенсора HA. Этот момент решил пропустить. Он есть в общем коде.

    Ну и, собственно, результат:

    Код (Text):
    esphome:
      name: test

    esp8266:
      board: esp01_1m

    # Enable logging
    logger:

    # Enable Home Assistant API
    api:

    ota:
      password: "xzxzxz"

    wifi:
      ssid: !secret wifi_ssid
      password: !secret wifi_password

      # Enable fallback hotspot (captive portal) in case wifi connection fails
      ap:
        ssid: "Test Fallback Hotspot"
        password: "xzxzxz"

    captive_portal:

    text_sensor:
      - platform: homeassistant
        name: "ys_title"
        entity_id: sensor.ys_title
        id: ys_title
      - platform: homeassistant
        name: "ys_artist"
        entity_id: sensor.ys_artist
        id: ys_artist

    time:
      - platform: homeassistant
        id: ha_time

    i2c:
      sda: GPIO4
      scl: GPIO5

    font:
      - file: "arial.ttf"
        id: arial14
        glyphs: ' !"%() ,-.:/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz°АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
        size: 14
      - file: "arial.ttf"
        id: arial18
        size: 18

    display:
      - platform: ssd1306_i2c
        model: "SSD1306 128x64"
        address: 0x3C
        lambda: |-
          it.printf(4, 4, id(arial14), "%s",id(ys_title).state.c_str());
          it.printf(4, 20, id(arial14), "%s",id(ys_artist).state.c_str());
          it.strftime(40, 40, id(arial18), "%H:%M", id(ha_time).now());
     
    На этом работа над аппаратно-программной частью закончена. Ещё сыровато, но работает. Всё выше описанное делалось руками дилетанта, возможно есть более правильные и элегантные решения, но мне не попадались, поэтому решил поделиться с общественностью.

    Колонка у меня закреплена на стене при помощи напечатанного кронштейна, нужно делать новый с учётом дисплея, но так как тот что есть меня не устраивает, пока таймаут.

    Корпус
    Come in soon
     
    Последнее редактирование: 17 янв 2022