ESP32 + Waveshare 4.2" E-Paper Anleitung

Hallo zusammen,

ich bin Einsteiger und habe mich anfangs etwas schwergetan, ein E-Ink Display mit einem ESP32 in Home Assistant einzubinden. Nach einigem Probieren hat es dann aber doch funktioniert.

Damit andere sich leichter tun, habe ich die Schritte hier als kleine Anleitung zusammengeschrieben:

Vielleicht hilft es ja jemandem, der ebenfalls neu in dem Thema ist.

Hardware vorbereiten

  • ESP32 Board: ESP32 CH340 Chip ESP-WROOM-32

  • E-Paper Display: Waveshare 4.2" (400x300, GDEY042T81 Rev. T81 V2.2)

Pins verbinden (ESP32 → Display)

  • 3V3 → VCC (nur 3,3 V, kein 5V!)

  • GND → GND

  • GPIO23 → DIN (MOSI)

  • GPIO18 → CLK (SCK)

  • GPIO5 → CS

  • GPIO17 → DC

  • GPIO16 → RST

  • GPIO4 → BUSY

Home Assistant vorbereiten

  1. ESPHome Add-on installieren (über Add-on Store).

  2. Im File Editor die Datei configuration.yaml öffnen.
    Direkt unter:

    automation: !include automations.yaml
    
    

    folgende Zeile einfügen:

    script: !include scripts.yaml
    
    
  3. Helfer für Texteingabe anlegen:

    • Einstellungen → Geräte & Dienste → Helfer → „Helfer erstellen“ → Text Eingabe

    • Name: Display-Text

    • Entitäts-ID: input_text.display_text

    • Länge: z. B. 250 Zeichen

Schriftarten hochladen

  1. Lade die Fonts herunter:

    • Roboto-Regular.ttf

    • Roboto-Bold.ttf

  2. In HomeAssistant den File Editor öffnen → /config/esphome/

  3. Beide .ttf Dateien hochladen

4. Script zum Senden an Display

Unter Einstellungen → Automationen & Szenen → Scripte ein neues Script anlegen:

  • Name: Text ans E-Paper senden

  • Aktion hinzufügen → Service eink_42_show_message

  • Nachricht:

    message: "{{ states('input_text.display_text') }}"
    
    

Speichern.

5. Dashboard-Karte erstellen

Unter Übersicht (Dashboard) → Bearbeiten → Manuelle Karte hinzufügen und diesen Code einfügen:

type: vertical-stack
cards:
  - type: entities
    title: E-Paper
    entities:
      - entity: input_text.display_text
        name: Text für Display
  - type: button
    name: Auf Display senden
    tap_action:
      action: call-service
      service: script.send_to_eink_display


6. ESPHome-Gerät anlegen

  1. Gehe in ESPHome → New Device → Continue → Empty Configuration

  2. Name vergeben, z. B. eink-42

  3. Auf EDIT klicken und diesen Code einfügen:

esphome:
  name: eink-42
  friendly_name: E-Paper 4.2

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

api:
  services:
    - service: show_message
      variables:
        message: string
      then:
        - lambda: |-
            id(my_message) = std::string(message);
            id(eink).update();

ota:
  platform: esphome

wifi:
  ssid: "WLAN_SSID"
  password: "WLAN_PASSWORT"
  manual_ip:
    static_ip: 192.168.178.76
    gateway: 192.168.178.1
    subnet: 255.255.255.0

spi:
  clk_pin: 18
  mosi_pin: 23

globals:
  - id: my_message
    type: std::string
    restore_value: no
    initial_value: '"Hello World"'

# Fonts (liegen im /config/esphome/ Ordner)
font:
  - file: "Roboto-Bold.ttf"
    id: f_big
    size: 28
  - file: "Roboto-Regular.ttf"
    id: f_small
    size: 20

time:
  - platform: homeassistant
    id: homeassistant_time

sensor:
  - platform: homeassistant
    id: ha_temp
    entity_id: sensor.wohnzimmer_temperature

display:
  - platform: waveshare_epaper
    id: eink
    cs_pin: 5
    dc_pin: 17
    reset_pin: 16
    busy_pin: 4
    model: gdey042t81
    rotation: 0
    update_interval: never
    full_update_every: 1
    lambda: |-
      // Panel invertiert Farben → Hintergrund "BLACK" = WEISS, Text "WHITE" = SCHWARZ
      it.fill(Color::BLACK);

      // Nachricht mit Zeilenumbruch (max. 32 Zeichen) und voller Zentrierung
      if (!id(my_message).empty()) {
        const int line_height = 34;
        const int max_chars = 32;  // mehr Zeichen -> nutzt Breite besser

        std::string msg = id(my_message);
        std::vector<std::string> lines;

        while (!msg.empty()) {
          std::string line = msg.substr(0, max_chars);

          size_t last_space = line.find_last_of(' ');
          if (last_space != std::string::npos && msg.length() > max_chars) {
            line = msg.substr(0, last_space);
            msg.erase(0, last_space + 1);
          } else {
            msg.erase(0, line.length());
          }
          lines.push_back(line);
        }

        // vertikale Zentrierung
        int total_height = lines.size() * line_height;
        int start_y = (300 - total_height) / 2;

        // Zeilen mittig ausgeben
        for (size_t i = 0; i < lines.size(); i++) {
          it.printf(200, start_y + i * line_height, id(f_big), Color::WHITE, TextAlign::CENTER, "%s", lines[i].c_str());
        }
      }

      // Uhrzeit unten rechts
      auto time = id(homeassistant_time).now();
      if (time.is_valid()) {
        it.strftime(390, 290, id(f_small), Color::WHITE, TextAlign::BOTTOM_RIGHT, "%H:%M", time);
      }

      // Temperatur unten links
      if (!isnan(id(ha_temp).state)) {
        it.printf(10, 290, id(f_small), Color::WHITE, TextAlign::BOTTOM_LEFT, "%.1f°C", id(ha_temp).state);
      }

:warning: WLAN-Daten (ssid und password) sowie IP-Adresse an dein Netzwerk anpassen!

7. Firmware installieren

  1. ESP32 per USB an den PC anschließen.

  2. In ESPHome → beim Device auf die 3 Punkte → Install → Manual Download.

  3. Warten bis die Datei erstellt ist → herunterladen.

  4. https://web.esphome.io/ öffnen.

  5. Auf CONNECT klicken, den richtigen USB-Port auswählen.

  6. Firmware-Datei hochladen.

:white_check_mark: Jetzt kannst du Texte über HomeAssistant ins Feld Display-Text eingeben und mit einem Klick auf „Auf Display senden“ auf dem Display anzeigen lassen, zusammen mit Uhrzeit und Temperatur.

2 „Gefällt mir“