Перейти к содержанию

E-Ink дисплей | ESPHome-TRMNL 7.5"

Файлы

Printables Thingiverse Creality Cloud MakerWorld github ☕︎ Угостить автора чашечкой чая 🡥


Описание

Это экран на электронных чернилах на прошивке ESPHome​ созданный для отображения информации с вашего сервера Inker и управляемый Home Assistant. Проект не создан командой ESPHome или ТRMNL и не аффилирован с ними.

flowchart LR
    HA["Home <br> Assistant"] -- JSON API --> Inker["Inker"]
    RSS["RSS-каналы"] --> Inker
    Inker -- PNG --> ESPH["ESPHome <br> E-Ink дисплей"]
    HA <--> MQTT_Int["интеграция <br> MQTT"]
    HA --> BP["blueprint"]
    BP --> MQTT_Int
    MQTT_Int <--> Mosq["Mosquitto <br> broker"]
    Mosq <-- MQTT --> ESPH

img

INKER - создавайте интерфейс без единой строчки кода

Особенности:

  • Энергоэффективность: Экран приостанавливает обновления, когда вас нет дома или в комнате.
  • Расширяемость: Благодаря ESPHome, устройство поддерживает подключение огромного количества дополнительных датчиков.
  • Связь по MQTT: Мгновенный обмен данными с вашим сервером.

Корпус:

  • Компактность: Минималистичный корпус (175.6 x 116.6 x 11.25 мм) с узкими рамками, где всё внимание сосредоточено на экране.
  • Эргономика: Удобные кнопки расположены на виду — вам больше не придется нащупывать их на задней панели.
  • Три варианта размещения: ножка(настольное), подвес (настенное), магниты (настенное)
  • Простая сборка: Корпус собирается на надежных защелках — никаких лишних винтов и сложного монтажа.

Компоненты

Изображение Компонент Ссылка Кол-во Примечание
ePaper дисплей 7.5 ePaper дисплей 7.5 bp ePaper дисплей 7.5" Aliexpress 1 Это 3-цветный B/W/R дисплей но использовать получится только B/W из за нехватки оперативной памяти.
поддерживаемые дисплеи
Предельные размеры экрана 171.20 x 112.20x 1.50, mm
USB C штекер USB C штекер Aliexpress 1
USB C разъем USB C разъем Aliexpress 1
Ползунковые переключатели Ползунковый переключатель TLZWLA SS12F15VG4 Aliexpress 1
img Тактовая кнопка 6X6X10 Aliexpress 1
img Контроллер Waveshare E-Paper ESP32 Driver Board (V3) Aliexpress 1
Батарея li-ion 1 Максимальная толщина 7.4 мм. При обновлении раз в час, аккумулятора на 1400 mAh (5.18 Wh) хватает примерно на месяц работы
img Модуль зарядки TP4056 Aliexpress 1
Резистор 100 кОм 2
img Неодимовый магнит 8x3mm 5 5 магнитов надежно удерживают 150 г дисплей на металлической двери
Клей T-7000/B-7000 1

Примерная стоимость 1 экрана c 20% НДС и доставкой 50$


Сборка

  1. Удалите красный светодиод PWR с Waveshare E-Paper ESP32 Driver Board для экономии энергии

  2. Чтобы сделать плату драйвера ESP32 тоньше, отпаяйте контакты на её нижней стороне. (Совет: сначала поднимите и снимите пластик между контактами с помощью отвёртки).

  3. Установите переключатель №1 на ESP32 в положение A.

    img

  4. Установите переключатель №2 на ESP32 в положение «ON». Этот переключатель управляет питанием модуля UART через USB. Когда модуль не используется, вы можете вручную выключить его для экономии энергии (если переключатель 2 находится в положении «ВЫКЛ», загрузить программу невозможно).

  5. Соберите все части корпуса в указанной последовательности.

    img

  6. Спаяйте компоненты по схеме.

    img
    ссылка на проект

  7. Нанесите клей T-7000/B-7000 в райне магнитов что бы корпус не скользил по гладкой металлической поверхности

    img


Установка прошивки

  1. Установите ESPHome Device Builder
    Откройте свой экземпляр Home Assistant и отобразите панель управления дополнения.

  2. Скачайте конфигурационный файл esphome-trmnl.yaml и измените значения на свои

    Переменная Значение Описание
    fw_version 1.0.1 esphome-trmnl Версия прошивки
    server_url http://192.168.1.123:80 URL-адрес сервера Inker
    mqtt_broker_ip 192.168.1.100 IP-адрес брокера Mosquitto
    manual_ip_static_ip 192.168.1.222 Статический IP-адрес дисплея
    manual_ip_gateway 192.168.1.1 Шлюз локальной сети
    manual_ip_subnet 255.255.255.0 Подсеть локальной сети
    name trmnl Системное имя устройства (строчные буквы, цифры, дефис, до 24 симв.)
    friendly_name TRMNL Имя в интерфейсе Home Assistant
    model 7.50in-bV3 Модель e-ink дисплея
    wifi_output_power 8.5dB Мощность передачи Wi-Fi (от 8.5 до 20.5 dB)
    img_type BINARY Способ внутреннего кодирования изображения
    img_format PNG Формат, в котором закодировано изображение.
    img_url_setup_logo http://raw.github.../setup-logo.bmp Изображение заглушка
    deep_sleep_delay 1000ms Задержка перед переходом в сон
    sleep_time 3600 Время сна по умолчанию (сек.)
    error_sleep_duration 1200 Время сна при возникновении ошибки (сек.)
    reset_duration 200 ms Длительность операции сброса дисплея
    wifi_connect_delay 15s Таймаут ожидания подключения к Wi-Fi
    mqtt_connect_delay 500ms Задержка после успешного подключения к MQTT
    button GPIO32 Пин кнопки управления
    adc_pin GPIO34 Пин АЦП (для мониторинга батареи)
    deep_sleep_pin GPIO32 Пин для пробуждения из глубокого сна
    clk_pin GPIO13 SPI Clock пин
    mosi_pin GPIO14 SPI MOSI пин
    cs_pin GPIO15 SPI Chip Select пин
    dc_pin GPIO27 Data/Command пин
    busy_pin GPIO25 Busy пин (Для предотвращения необратимого повреждения дисплея необходимо инвертировать контакт BUSY на моделях gdew0154m09, Waveshare 7.30in-f и Waveshare 7.50in V2 (и наверно на V3 и других новых моделях). Установите для контакта busy значение inverted: true в настройках)
    reset_pin GPIO26 Пин аппаратного сброса дисплея
  3. Добавьте в secrets.yaml ESPHome

    mqtt_password: #пароль для подключения к MQTT
    wifi_ssid: #имя вашей wifi сети
    wifi_password #пароль вашей wifi сети
    
  4. Загрузите отредактированный yaml в ESPHome и установите прошивку на ESP32

Установка Inker

Важное примечание

Данное руководство предполагает, что у вас уже установлен Home Assistant. Также для работы потребуется Docker с установленным плагином Docker Compose. Все действия в инструкции описываются из расчета, что установка производится на ОС Debian.

  1. Создайте директорию

    Создайте директорию (например, ./inker) для хранения файла `docker-compose.yml` и перейдите в неё.
    mkdir ./inker
    cd ./inker
    
  2. Создайте docker-compose.yml выполните следующие команды:

    Создайте файл docker-compose.yml
    cat <<EOF > docker-compose.yml
    services:
      inker:
        image: wojooo/inker:latest
        container_name: inker
        restart: unless-stopped
        ports:
          - "80:80"
        volumes:
          - postgres_data:/var/lib/postgresql/17/main
          - redis_data:/data
          - uploads_data:/app/uploads
        environment:
          TZ: UTC
          ADMIN_PIN: "1111"
    volumes:
      postgres_data:
      redis_data:
      uploads_data:
    EOF
    
  3. Запустите контейнер

Из созданной вами на шаге 1.1 директории (которая теперь должна содержать ваши пользовательский docker-compose.yml файл) выполните следующую команду, чтобы запустить Inker в качестве фоновой службы:

Запустите контейнер
docker compose up -d

Обновление Inker

При выпуске новой версии следует ознакомиться с примечаниями к выпуску и учесть все отмеченные в них изменения, нарушающие обратную совместимость. После этого приложение можно обновить и перезапустить с помощью следующих команд, запущенных в каталоге, где находится файл docker-compose.yml:

Обновление и перезапуск Inker.
docker compose pull && docker compose up -d
Для освобождения дискового пространства устаревшие образы контейнеров старой версии можно удалить с помощью следующей команды:
Удалите неиспользуемые образы Docker.
docker image prune

Настройка Home Assistant

  1. Установите Mosquitto broker
    Открыть панель Mosquitto broker в вашем Home Assistant.
    На вкладке "Конфигурация" Mosquitto broker введите "name" и "mqtt_password" которые вы использовали в прошивке

  2. Установите интеграцию MQTT
    MQTT
    Включите экран, он должен появится в интеграции MQTT

  3. Установите blueprint
    Open in Home Assistant


Калибровка сенсора напряжения батареи (Калибровка АЦП)

  1. Запишите показания при напряжение акб 4.20, 4.19, 3.75, 3.50 и 3.00 V.

  2. Впишите данные в фильтр. Слева от (->) значения от датчика, а справа истинное значение

        sensor:
      - platform: adc
        ...
        id: battery_voltage
        ...
           - calibrate_linear:
               - 3.22 -> 3.75
               - 3.64 -> 4.19
               - 3.89 -> 4.20
        ...
    

Создание пользовательских виджетов

Пример 1. Home Assistant "Время и дата"

Этап 1. Настройка источника данных (Data Source). Здесь мы указываем inker, откуда и как забирать информацию из Home Assistant.

img

  1. Создайте новый источник данных в интерфейсе inker.
  2. В блоке Basic Information (Основная информация):
    • Name: Введите понятное имя, например, НА Время.
    • Type: Выберите JSON API.
  3. В блоке Connection (Подключение):
    • URL: Укажите адрес к API вашего Home Assistant для конкретного сенсора.
      • Формат: http://<IP-адрес-HA>:<порт>/api/states/<название_сенсора>
    • HTTP Method: Выберите GET.
    • Custom Headers (Пользовательские заголовки): Обязательно добавьте заголовок для авторизации в Home Assistant (для этого вам понадобится долгосрочный токен доступа, созданный в профиле пользователя HA).
      • Header name: введите Authorization
      • Header value: введите Bearer ВАШ_ТОКЕН (замените ВАШ_ТОКЕН на реальный токен из HA, обратите внимание на пробел после слова Bearer).
      • Нажмите кнопку Add.
  4. Нажмите зеленую кнопку Test URL. Если все настроено верно, inker подключится к Home Assistant и в правой панели появятся доступные поля (например, entity_id, state, last_changed и т.д.).
  5. В блоке Settings (Настройки):
    • Refresh Interval (seconds): Укажите интервал обновления данных в секундах.
  6. Нажмите Save Changes (Сохранить изменения).

Этап 2. Настройка виджета. Здесь мы настраиваем, как именно полученные данные будут отображаться на экране.

img

  1. Создайте новый пользовательский виджет в интерфейсе inker.
  2. Выберите Data Source (источника данных) который мы создали на первом этапе (например, "НА Время").
  3. Выберите тип отображения (Choose Display Type) JavaScript
  4. В поле Widget Name укажите название для виджета, например, HA time.
  5. В блоке JavaScript Transform мы настроим форматирование полученных данных:
    • Output Mode: Выберите Single Value.
    • В поле JavaScript Code вставьте следующий код для преобразования даты и времени:
const state = $.state;
const dateObj = new Date(state);
const formatter = new Intl.DateTimeFormat('ru-RU', {
    weekday: 'short', // пн, вт, ср...
    day: 'numeric',   // 15
    month: 'short',   // марта
    hour: '2-digit',  // 22
    minute: '2-digit' // 13
});
const result = formatter.format(dateObj);
return result;
  1. В блоке Live Output ниже вы сразу увидите результат работы вашего кода. Если данные из HA поступают корректно, там отобразится отформатированное время (например: вт, 5 мая, 11:45). Вы также увидите предпросмотр готового виджета в панели Live Preview справа вверху.
  2. Нажмите Save Changes (Сохранить изменения), чтобы завершить настройку виджета.

Пример 2. Home Assistant "Календарь"

Этот виджет соберет события из нескольких календарей HA и выведет их одной строкой.

Настраивается аналогично Примеру 1 , но с другим URL, который отдаёт состояние всех сущностей:

http://<IP_АДРЕС_HA>:<ПОРТ>/api/states

img

JavaScript код
const entities = ["calendar.test1", "calendar.test2"];
const groupedEvents = {}; // Объект для группировки: { "Сегодня (05.05)": ["Событие 1", "Событие 2"] }

entities.forEach(entityId => {
    const calendar = $.find(item => item.entity_id === entityId);

    if (calendar && calendar.attributes && calendar.attributes.start_time) {
        const eventName = calendar.attributes.message;
        const startTime = calendar.attributes.start_time;

        const eventDate = new Date(startTime.replace(' ', 'T'));
        const today = new Date();

        eventDate.setHours(0, 0, 0, 0);
        today.setHours(0, 0, 0, 0);

        const daysUntilEvent = Math.round((eventDate - today) / (1000 * 60 * 60 * 24));

        if (daysUntilEvent === 0 || daysUntilEvent === 1) {
            const dayStr = daysUntilEvent === 0 ? "Сегодня" : "Завтра";
            const day = String(eventDate.getDate()).padStart(2, '0');
            const month = String(eventDate.getMonth() + 1).padStart(2, '0');

            const label = `${dayStr} (${day}.${month})`;

            // Если такой даты еще нет в объекте, создаем пустой массив
            if (!groupedEvents[label]) {
                groupedEvents[label] = [];
            }
            // Добавляем название события в массив этой даты
            groupedEvents[label].push(eventName);
        }
    }
});

// Формируем итоговые строки
const result = Object.keys(groupedEvents).map(label => {
    const events = groupedEvents[label].join(", "); // Объединяем события через запятую
    return `${label} ${events}`;
});

// Возвращаем результат, разделенный переносом строки (или запятой)
return result.join("  |  ");
  • В блоке Live Output ниже вы сразу увидите результат работы вашего кода. Если данные из HA поступают корректно, там отобразится данные календаря за текущий день или завтрашний (например: Сегодня (05.05)": ["Событие 1", "Событие 2"]).

img


FAQ

  • Как изменить ssid и пароль wifi? Подключитесь по usb откройте web.esphome.io CONNECT () Configure Wi-Fi (ESP32 должна быть в активном режиме)

Помогите! Что-то не работает.

  • Некорректное отображение: если качество изображения низкое или устройство не работает, попробуйте переключить переключатель №1 на ESP32.

  • Ничего не работает -> откройте web.esphome.io и подключите панель через usb и посмотрите логи.

  • Esphome не обновлялся но перестал собирать рабочую прошивку: удалите папки 'C:\Users\name_user.platformio\' и '.esphome\build'

Угостите автора чашечкой чая ☕︎

Поделитесь с друзьями
Ссылка скопирована!

Подписывайтесь в Telegram

Комментарии