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
-
ESPHome Add-on installieren (über Add-on Store).
-
Im File Editor die Datei
configuration.yamlöffnen.
Direkt unter:automation: !include automations.yamlfolgende Zeile einfügen:
script: !include scripts.yaml -
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
-
Lade die Fonts herunter:
-
Roboto-Regular.ttf
-
Roboto-Bold.ttf
-
-
In HomeAssistant den File Editor öffnen →
/config/esphome/ -
Beide
.ttfDateien 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
-
Gehe in ESPHome → New Device → Continue → Empty Configuration
-
Name vergeben, z. B.
eink-42 -
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);
}
WLAN-Daten (ssid und password) sowie IP-Adresse an dein Netzwerk anpassen!
7. Firmware installieren
-
ESP32 per USB an den PC anschließen.
-
In ESPHome → beim Device auf die 3 Punkte → Install → Manual Download.
-
Warten bis die Datei erstellt ist → herunterladen.
-
https://web.esphome.io/ öffnen.
-
Auf CONNECT klicken, den richtigen USB-Port auswählen.
-
Firmware-Datei hochladen.
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.