Lilygo T5 T547 e-paper - anyone having had success?

Hi all,

anybody who has managed to compile for the Lilygo T547 e-paper and is willing to share?

I have tried various sources and all I got was a ton of errors:
github://danuw/esphome-components2
github://vbaksa/esphome
github://kaeltis/esphome-lilygo-t547plus
github://nickolay/esphome-lilygo-t547plus
github://dabalroman/esphome-lilygo-t547plus_esphome-2025.11

Running HAOS core 2025.12.1 with ESPHome 2025.12.7

This is an example for a .yaml file, super simple β€œHello World”-style. Getting different kinds of compiling errors. β€œCould not find package Wire”,

esphome:
  name: esp-epaper
  friendly_name: esp-epaper
  platformio_options:
    board_build.f_flash: 80000000L
    board_build.flash_mode: qio
    board_build.psram_type: opi
    board_build.partitions: default_16MB.csv
    board_build.arduino.memory_type: qio_opi
    build_flags:  # the first three defines are required for the screen library to function.
      - "-DBOARD_HAS_PSRAM" #OK
      - "-DARDUINO_USB_MODE=1" #OK
      - "-DARDUINO_USB_CDC_ON_BOOT=1" #OK
  libraries:
    - SPI

esp32:
  board: esp32dev
  framework:
    type: arduino

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

external_components:
  - source: github://nickolay/esphome-lilygo-t547plus
    components: ["t547"]
  - source: github://kaeltis/esphome-lilygo-t547plus
    components: ["lilygo_t5_47_battery"]

display:
- platform: t547
  id: t5_display
  update_interval: 30s
  lambda: ---

sensor:
  - platform: lilygo_t5_47_battery
    id: battery_voltage
    voltage:
      name: "Battery Voltage"
    update_interval: 60s

deep_sleep:
  run_duration: 10s
  sleep_duration: 1min
  id: deep_sleep_1

tried hbast?

esphome:
  name: wetter
  friendly_name: Wetterdisplay

  on_boot:
    - priority: 600
      then:
        - logger.log: "ESP gestartet – Wetterdashboard aktiv"

    - priority: -10
      then:
        - logger.log: "Starte Update-Skript (Timer-DeepSleep, kein Button-Wakeup)"
        - script.execute: update_and_sleep   

  platformio_options:
    upload_speed: 921600
    monitor_speed: 115200
    board_build.mcu: esp32s3
    board_build.f_cpu: 240000000L
    board_build.arduino.memory_type: qspi_opi
    board_build.flash_size: 4MB
    board_build.flash_mode: qio
    board_build.flash_type: qspi
    board_build.psram_type: opi
    board_build.memory_type: qspi_opi
    board_build.boot_freq: 80m
    build_flags:
      - "-DBOARD_HAS_PSRAM"
      - "-DARDUINO_USB_CDC_ON_BOOT=1"
      - "-mfix-esp32-psram-cache-issue"

  libraries:
    - SPI

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino
    # CRITICAL for ESP-IDF 5.4.2+: Enable PSRAM initialization (thanks @hbast!)
    sdkconfig_options:
      CONFIG_SPIRAM: "y"
      CONFIG_SPIRAM_MODE_OCT: "y"
      CONFIG_SPIRAM_SPEED_80M: "y"
      CONFIG_SPIRAM_USE_MALLOC: "y"
      CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL: "16384"
      CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP: "y"
      CONFIG_ESP32S3_SPIRAM_SUPPORT: "y"
      CONFIG_SPIRAM_BOOT_INIT: "y"
      CONFIG_SPIRAM_IGNORE_NOTFOUND: "n"

# Logging + OTA + API
logger:
  level: INFO

api:
  encryption:
    key: ""

ota:
  - platform: esphome
    password: ""

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

  # Fast connect for DeepSleep optimization
  fast_connect: true
  
  # Disable power saving for faster wake-up
  power_save_mode: none

  ap:
    ssid: "EpaperDashboard Fallback"
    password: ""

captive_portal:

# ═══════════════════════════════════════════════════════════
# DEEPSLEEP CONFIGURATION
# ═══════════════════════════════════════════════════════════
deep_sleep:
  id: deep_sleep_control
  sleep_duration: 6h

external_components:
  - source:
      type: git
      url: https://github.com/hbast/esphome-lilygo-t547plus_esphome-2025.11
      ref: deepsleep-example
    components: ["t547"]

Thanks, I’ll give it a try right now…

It is compiling, however I am getting this error in a loop on the device.

Oh, I have just found out that the git by hbast is for the t547 plus only, I have the β€œold classic” one. So that one won’t work

Try this

t
# ═══════════════════════════════════════════════════════════
# LilyGo T5 4.7" ESP32 (Non-Plus) – Wetterdashboard (DeepSleep)
# ═══════════════════════════════════════════════════════════

esphome:
  name: wetter-nonplus
  friendly_name: Wetterdisplay Non-Plus

  on_boot:
    - priority: 600
      then:
        - logger.log: "ESP gestartet – Wetterdashboard aktiv"

    - priority: -10
      then:
        - logger.log: "Starte Update-Skript (Timer-DeepSleep, kein Button-Wakeup)"
        - script.execute: update_and_sleep   

  platformio_options:
    upload_speed: 921600
    monitor_speed: 115200

esp32:
  board: esp32dev  # Standard ESP32 fΓΌr T5 4.7 Non-Plus
  framework:
    type: arduino

# Logging + OTA + API
logger:
  level: INFO

api:
  encryption:
    key: "ukhS8iah+AyqjgwNxY4h4BkeJGg1g1QSXyrxcQaoTmk="

ota:
  - platform: esphome
    password: "12345678"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true
  power_save_mode: none
  ap:
    ssid: "EpaperDashboard Fallback"
    password: "12345678"

captive_portal:

# DeepSleep
deep_sleep:
  id: deep_sleep_control
  sleep_duration: 6h

time:
  - platform: homeassistant
    id: ha_time

# ═══════════════════════════════════════════════════════════
# FONTS 
# ═════════════════════════════════════════════════

# ═══════════════════════════════════════════════════════════
# SENSORS & TEXT SENSORS 
# ═══════════════════════════════════════════════════════════
sensor:
  - platform: wifi_signal
    name: "WiFi Signal"
    update_interval: 60s

  # Batterie (ADC – Pin ggf. anpassen!)
  - platform: adc
    pin: GPIO14  # PrΓΌfe fΓΌr Non-Plus! Oft GPIO34/35
    id: battery_voltage_raw
    attenuation: 12db
    update_interval: never
    internal: true
    unit_of_measurement: V
    accuracy_decimals: 3
    filters:
      - multiply: 2.0  # Teiler korrigieren

  - platform: template
    name: "Akku Prozent"
    id: battery_level
    unit_of_measurement: "%"
    device_class: battery
    accuracy_decimals: 0
    update_interval: 60s
    lambda: |-
      float v = id(battery_voltage_raw).state;
      // Typische Li-Ion Kurve: 3.3V leer, 4.2V voll
      if (v < 3.3) return 0.0f;
      if (v > 4.2) return 100.0f;
      return (v - 3.3f) / (4.2f - 3.3f) * 100.0f;



# ═══════════════════════════════════════════════════════════
# DISPLAY fΓΌr T5 4.7 Non-Plus
# ═══════════════════════════════════════════════════════════
display:
  - platform: waveshare_epaper
    cs_pin: GPIO5
    dc_pin: GPIO17
    busy_pin: GPIO4
    reset_pin: GPIO16
    display_size: 960x540
    num_colors: 16
    rotation: 0Β°
    id: lilygo_display
    update_interval: never
    lambda: |-
      // DEIN KOMPLETTER WEATHER DISPLAY CODE 
      it.fill(COLOR_OFF);
      


# ═══════════════════════════════════════════════════════════
# UPDATE SCRIPT (identisch aus Original)
# ═══════════════════════════════════════════════════════════
script:
  - id: update_and_sleep
    then:
      - logger.log: "Starte Update + DeepSleep Sequenz..."
      - wait_until:
          condition: wifi.connected
          timeout: 15s
      - if:
          condition: wifi.connected
          then:
            - logger.log: "WiFi verbunden"
          else:
            - logger.log: "Kein WLAN – mache trotzdem weiter" 
            level: WARN
      - wait_until:
          condition: api.connected
          timeout: 15s
      - wait_until:
          condition:
            lambda: 'return id(ha_time).now().is_valid();'
          timeout: 15s
      - wait_until:
          condition:
            lambda: 'return id(temp_nuernberg).has_state();'
          timeout: 20s
      - wait_until:
          condition:
            lambda: 'return id(forecast_day1_temp).has_state();'
          timeout: 20s
      - delay: 2s
      - logger.log: "Lese Batteriespannung..."
      - component.update: battery_voltage_raw
      - delay: 50ms
      - component.update: battery_level
      - logger.log: "Aktualisiere Display..."
      - display.update: lilygo_display
      - logger.log: "Display aktualisiert"
      - delay: 3s
      - logger.log: "Gehe jetzt in DeepSleep..."
      - deep_sleep.enter: deep_sleep_control
1 Like