Can't get display on 2.13" "Snoopy" e-ink ESP32

'm working on an indoor air quality (IAQ) sensor and want to add a waveshare 2.13" e-ink display (product page shows Snoopy as an example), but I can’t get anything to display.

Display buy page

https://www.aliexpress.com/item/32904355329.html?spm=a2g0o.order_list.order_list_main.72.356a18020bisw8

Drive/ board buy page

https://www.aliexpress.com/item/32953365564.html?spm=a2g0o.order_list.order_list_main.60.356a18020bisw8

This is my current config. Display code is at the bottom. Currently I am using model

2.13in-ttgo-dke in the code as anything else results in;

[E][waveshare_epaper:119]: Timeout while displaying image!

in the logs

I did look up the display data sheet and check continuity against all the pins on the driver board. The only pin I couldn’t get continuity for was the 3.3V pin which I suspect is my problem?

esphome:
  name: iaq-lounge
  friendly_name: IAQ LOUNGE

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:
  encryption:
    key: "xxx"

ota:


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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "IAQ LOUNGE"
    password: "xxx"

captive_portal:
    
i2c:
  sda: 21
  scl: 22
  scan: True
  id: bus_a

uart:
  #- id: uart_1
    #tx_pin: 15
    #rx_pin: 13
    #baud_rate: 9600    
  - id: uart_2
    tx_pin: 17
    rx_pin: 16
    baud_rate: 256000
    parity: NONE
    stop_bits: 1

# Pins for Waveshare ePaper ESP Board
spi:
  clk_pin: GPIO13
  mosi_pin: GPIO14

ld2410:
  uart_id: uart_2
  timeout: 150s
  max_move_distance : 6m
  max_still_distance: 0.75m
  g0_move_threshold: 10
  g0_still_threshold: 20
  g1_move_threshold: 10
  g1_still_threshold: 20
  g2_move_threshold: 20
  g2_still_threshold: 21
  g3_move_threshold: 30
  g3_still_threshold: 31
  g4_move_threshold: 40
  g4_still_threshold: 41
  g5_move_threshold: 50
  g5_still_threshold: 51
  g6_move_threshold: 60
  g6_still_threshold: 61
  g7_move_threshold: 70
  g7_still_threshold: 71
  g8_move_threshold: 80
  g8_still_threshold: 81


sensor:
  - platform: scd30
    co2:
      name: "SCD30 CO2"
      id: scd30_co2
      accuracy_decimals: 1
    temperature:
      name: "SCD30 Temperature"
      id: scd30_temperature
      accuracy_decimals: 1
    humidity:
      name: "SCD30 Humidity"
      id: scd30_humidity
      accuracy_decimals: 1
    address: 0x61
    i2c_id: bus_a
    update_interval: 120s
  - platform: bme280
    temperature:
      name: "BME280 Temperature"
      oversampling: 16x
    pressure:
      name: "BME280 Pressure"
    humidity:
      name: "BME280 Humidity"
    address: 0x76
    update_interval: 120s
  - platform: tsl2561
    name: "TSL2561 Ambient Light"
    address: 0x39
    update_interval: 30s
  - platform: ld2410
    moving_distance:
      name : Moving Distance
    still_distance:
      name: Still Distance
    moving_energy:
      name: Move Energy
    still_energy:
      name: Still Energy
    detection_distance:
      name: Detection Distance
  #- platform: pmsx003
  #  type: PMSX003
  #  uart_id: uart_1
  #  pm_1_0:
  #    name: "Particulate Matter <1.0µm Concentration"
  #  pm_2_5:
  #    name: "Particulate Matter <2.5µm Concentration"
  #  pm_10_0:
  #    name: "Particulate Matter <10.0µm Concentration"
  #  update_interval: 120s

display:
  - platform: waveshare_epaper
    cs_pin: GPIO15
    dc_pin: GPIO27
    busy_pin: GPIO25
    reset_pin: GPIO26
    model: 2.13in-ttgo-dke
    update_interval: 30s
    full_update_every: 2
    lambda: |-
      it.print(0, 0, id(roboto), "E-Paper is awesome!");
      it.printf(10, 20, id(roboto), "CO2: %.2f ppm", id(scd30_co2).state);
      it.printf(10, 40, id(roboto), "Temp: %.2f °C", id(scd30_temperature).state);
      it.printf(10, 60, id(roboto), "Humidity: %.2f %%", id(scd30_humidity).state);

font:
  - file: "gfonts://Roboto"
    id: roboto
    size: 12

Logs;

INFO Successfully compiled program.
INFO Resolving IP address of iaq-lounge.local
INFO  -> 192.168.x.x
INFO Uploading /data/iaq-lounge/.pioenvs/iaq-lounge/firmware.bin (969376 bytes)
Uploading: [============================================================] 100% Done...

INFO Waiting for result...
INFO OTA successful
INFO Successfully uploaded program.
INFO Starting log output from iaq-lounge.local using esphome API
INFO Successfully connected to iaq-lounge.local
[18:13:01][I][app:102]: ESPHome version 2023.4.4 compiled on May 18 2023, 18:12:22
[18:13:01][C][wifi:505]: WiFi:
[18:13:01][C][wifi:363]:   Local MAC: x
[18:13:01][C][wifi:364]:   SSID: [redacted]
[18:13:01][C][wifi:365]:   IP Address: x
[18:13:01][C][wifi:367]:   BSSID: [redacted]
[18:13:01][C][wifi:368]:   Hostname: 'iaq-lounge'
[18:13:01][C][wifi:370]:   Signal strength: -62 dB ▂▄▆█
[18:13:01][C][wifi:374]:   Channel: 1
[18:13:01][C][wifi:375]:   Subnet: 255.255.255.0
[18:13:01][C][wifi:376]:   Gateway: 192.168.0.1
[18:13:01][C][wifi:377]:   DNS1: 192.168.0.6
[18:13:01][C][wifi:378]:   DNS2: 0.0.0.0
[18:13:01][C][logger:294]: Logger:
[18:13:01][C][logger:295]:   Level: DEBUG
[18:13:01][C][logger:296]:   Log Baud Rate: 0
[18:13:01][C][logger:297]:   Hardware UART: UART0
[18:13:01][C][i2c.arduino:053]: I2C Bus:
[18:13:01][C][i2c.arduino:054]:   SDA Pin: GPIO21
[18:13:01][C][i2c.arduino:055]:   SCL Pin: GPIO22
[18:13:01][C][i2c.arduino:056]:   Frequency: 50000 Hz
[18:13:01][C][i2c.arduino:059]:   Recovery: bus successfully recovered
[18:13:01][I][i2c.arduino:069]: Results from i2c bus scan:
[18:13:01][I][i2c.arduino:075]: Found i2c device at address 0x39
[18:13:01][I][i2c.arduino:075]: Found i2c device at address 0x61
[18:13:01][I][i2c.arduino:075]: Found i2c device at address 0x76
[18:13:01][C][spi:101]: SPI bus:
[18:13:01][C][spi:102]:   CLK Pin: GPIO13
[18:13:01][C][spi:104]:   MOSI Pin: GPIO14
[18:13:01][C][spi:106]:   Using HW SPI: YES
[18:13:01][C][uart.arduino_esp32:108]: UART Bus 1:
[18:13:01][C][uart.arduino_esp32:109]:   TX Pin: GPIO17
[18:13:01][C][uart.arduino_esp32:110]:   RX Pin: GPIO16
[18:13:01][C][uart.arduino_esp32:112]:   RX Buffer Size: 256
[18:13:01][C][uart.arduino_esp32:114]:   Baud Rate: 256000 baud
[18:13:01][C][uart.arduino_esp32:115]:   Data Bits: 8
[18:13:01][C][uart.arduino_esp32:116]:   Parity: NONE
[18:13:01][C][uart.arduino_esp32:117]:   Stop bits: 1
[18:13:01][C][ld2410:012]: LD2410:
[18:13:01][C][ld2410:019]:   Moving Distance 'Moving Distance'
[18:13:01][C][ld2410:019]:     Device Class: 'distance'
[18:13:01][C][ld2410:019]:     State Class: ''
[18:13:01][C][ld2410:019]:     Unit of Measurement: 'cm'
[18:13:01][C][ld2410:019]:     Accuracy Decimals: 0
[18:13:01][C][ld2410:020]:   Still Distance 'Still Distance'
[18:13:01][C][ld2410:020]:     Device Class: 'distance'
[18:13:01][C][ld2410:020]:     State Class: ''
[18:13:01][C][ld2410:020]:     Unit of Measurement: 'cm'
[18:13:01][C][ld2410:020]:     Accuracy Decimals: 0
[18:13:01][C][ld2410:021]:   Moving Energy 'Move Energy'
[18:13:01][C][ld2410:021]:     Device Class: 'energy'
[18:13:01][C][ld2410:021]:     State Class: ''
[18:13:01][C][ld2410:021]:     Unit of Measurement: '%'
[18:13:01][C][ld2410:021]:     Accuracy Decimals: 0
[18:13:01][C][ld2410:022]:   Still Energy 'Still Energy'
[18:13:01][C][ld2410:022]:     Device Class: 'energy'
[18:13:01][C][ld2410:022]:     State Class: ''
[18:13:01][C][ld2410:022]:     Unit of Measurement: '%'
[18:13:01][C][ld2410:022]:     Accuracy Decimals: 0
[18:13:01][C][ld2410:023]:   Detection Distance 'Detection Distance'
[18:13:01][C][ld2410:023]:     Device Class: 'distance'
[18:13:01][C][ld2410:023]:     State Class: ''
[18:13:01][C][ld2410:023]:     Unit of Measurement: 'cm'
[18:13:01][C][ld2410:023]:     Accuracy Decimals: 0
[18:13:02][C][ld2410:029]:   Firmware Version : 0.0.0000
[18:13:02][C][scd30:115]: scd30:
[18:13:02][C][scd30:116]:   Address: 0x61
[18:13:02][C][scd30:134]:   Altitude compensation: OFF
[18:13:02][C][scd30:138]:   Automatic self calibration: ON
[18:13:02][C][scd30:139]:   Ambient pressure compensation: 0mBar
[18:13:02][C][scd30:140]:   Temperature offset: 0.00 °C
[18:13:02][C][scd30:141]:   Update interval: 120s
[18:13:02][C][scd30:142]:   CO2 'SCD30 CO2'
[18:13:02][C][scd30:142]:     Device Class: 'carbon_dioxide'
[18:13:02][C][scd30:142]:     State Class: 'measurement'
[18:13:02][C][scd30:142]:     Unit of Measurement: 'ppm'
[18:13:02][C][scd30:142]:     Accuracy Decimals: 1
[18:13:02][C][scd30:142]:     Icon: 'mdi:molecule-co2'
[18:13:02][C][scd30:143]:   Temperature 'SCD30 Temperature'
[18:13:02][C][scd30:143]:     Device Class: 'temperature'
[18:13:02][C][scd30:143]:     State Class: 'measurement'
[18:13:02][C][scd30:143]:     Unit of Measurement: '°C'
[18:13:02][C][scd30:143]:     Accuracy Decimals: 1
[18:13:02][C][scd30:144]:   Humidity 'SCD30 Humidity'
[18:13:02][C][scd30:144]:     Device Class: 'humidity'
[18:13:02][C][scd30:144]:     State Class: 'measurement'
[18:13:02][C][scd30:144]:     Unit of Measurement: '%'
[18:13:02][C][scd30:144]:     Accuracy Decimals: 1
[18:13:02][C][bme280.sensor:177]: BME280:
[18:13:02][C][bme280.sensor:178]:   Address: 0x76
[18:13:02][C][bme280.sensor:190]:   IIR Filter: OFF
[18:13:02][C][bme280.sensor:191]:   Update Interval: 120.0s
[18:13:02][C][bme280.sensor:193]:   Temperature 'BME280 Temperature'
[18:13:02][C][bme280.sensor:193]:     Device Class: 'temperature'
[18:13:02][C][bme280.sensor:193]:     State Class: 'measurement'
[18:13:02][C][bme280.sensor:193]:     Unit of Measurement: '°C'
[18:13:02][C][bme280.sensor:193]:     Accuracy Decimals: 1
[18:13:02][C][bme280.sensor:194]:     Oversampling: 16x
[18:13:02][C][bme280.sensor:195]:   Pressure 'BME280 Pressure'
[18:13:02][C][bme280.sensor:195]:     Device Class: 'pressure'
[18:13:02][C][bme280.sensor:195]:     State Class: 'measurement'
[18:13:02][C][bme280.sensor:195]:     Unit of Measurement: 'hPa'
[18:13:02][C][bme280.sensor:195]:     Accuracy Decimals: 1
[18:13:02][C][bme280.sensor:196]:     Oversampling: 16x
[18:13:02][C][bme280.sensor:197]:   Humidity 'BME280 Humidity'
[18:13:02][C][bme280.sensor:197]:     Device Class: 'humidity'
[18:13:02][C][bme280.sensor:197]:     State Class: 'measurement'
[18:13:02][C][bme280.sensor:197]:     Unit of Measurement: '%'
[18:13:02][C][bme280.sensor:197]:     Accuracy Decimals: 1
[18:13:02][C][bme280.sensor:198]:     Oversampling: 16x
[18:13:02][C][tsl2561:040]: TSL2561 'TSL2561 Ambient Light'
[18:13:02][C][tsl2561:040]:   Device Class: 'illuminance'
[18:13:02][C][tsl2561:040]:   State Class: 'measurement'
[18:13:02][C][tsl2561:040]:   Unit of Measurement: 'lx'
[18:13:02][C][tsl2561:040]:   Accuracy Decimals: 1
[18:13:02][C][tsl2561:041]:   Address: 0x39
[18:13:02][C][tsl2561:048]:   Gain: 1x
[18:13:02][C][tsl2561:049]:   Integration Time: 402.0 ms
[18:13:02][C][tsl2561:051]:   Update Interval: 30.0s
[18:13:02][C][waveshare_epaper:1701]: Waveshare E-Paper
[18:13:02][C][waveshare_epaper:1701]:   Rotations: 0 °
[18:13:02][C][waveshare_epaper:1701]:   Dimensions: 128px x 250px
[18:13:02][C][waveshare_epaper:1702]:   Model: 2.13inDKE
[18:13:02][C][waveshare_epaper:1703]:   Reset Pin: GPIO26
[18:13:02][C][waveshare_epaper:1704]:   DC Pin: GPIO27
[18:13:02][C][waveshare_epaper:1705]:   Busy Pin: GPIO25
[18:13:02][C][waveshare_epaper:1706]:   Update Interval: 30.0s
[18:13:02][C][captive_portal:088]: Captive Portal:
[18:13:02][C][mdns:108]: mDNS:
[18:13:02][C][mdns:109]:   Hostname: iaq-lounge
[18:13:02][C][ota:093]: Over-The-Air Updates:
[18:13:02][C][ota:094]:   Address: iaq-lounge.local:3232
[18:13:02][C][api:138]: API Server:
[18:13:02][C][api:139]:   Address: iaq-lounge.local:6053
[18:13:02][C][api:141]:   Using noise encryption: YES
[18:13:02][I][waveshare_epaper:1602]: Performing partial e-paper update.
[18:13:03][I][waveshare_epaper:1694]: Completed e-paper update.
[18:13:08][D][tsl2561:126]: Got illuminance=91.9lx
[18:13:08][D][sensor:110]: 'TSL2561 Ambient Light': Sending state 91.91389 lx with 1 decimals of accuracy

Any help is hugely appreciated. This is also my first Esphome project so if you see anything else that could be done better, please let me know