ESPHome is getting a display platform for reflective monochrome LCDs, screens that use room light instead of a backlight. The new st7305 component drives panels with Sitronix's ST7305 and ST7306 controllers over SPI. Clyde Stubbs (clydebarrow) wrote it and merged it into ESPHome's development branch on 19 October 2026 at 10:57 Polish time, right after its documentation went into the next branch of esphome.io. ESPHome 2026.10 is already in beta, with 2026.10.0b5 out the same day, so the driver is set for ESPHome 2026.11.
The board it was built on
The driver has one ready-made model, WAVESHARE-400X300, for the Waveshare ESP32-S3-RLCD-4.2. That board has a 4.2-inch black-and-white RLCD with 300 × 400 pixels and an ST7305 controller, an ESP32-S3-WROOM-1-N16R8 module with 16 MB of flash and 8 MB of PSRAM, an ES8311 audio codec, two microphones with an ES7210 converter, a speaker connector, an SHTC3 temperature and humidity sensor, a PCF85063 real-time clock, a microSD slot and an 18650 battery holder. Waveshare sells it for $24.99 to $26.99, depending on whether the 18650 cell is included, and lists ESP-IDF and Arduino as supported.
The model already knows the board's fixed pins: CS on GPIO40, DC on GPIO5 and reset on GPIO41. Apart from the SPI bus, the configuration only needs the platform and the model:
spi:
clk_pin: GPIO11
mosi_pin: GPIO12
display:
- platform: st7305
model: WAVESHARE-400X300
lambda: |-
it.fill(Color::WHITE);
it.print(10, 10, id(my_font), Color::BLACK, "Hello");
Only the changed part goes over SPI
The panels store one bit per pixel, and the controller addresses its memory in blocks of 12 × 2 pixels. A landscape panel packs 2 × 4 pixels into each byte, a portrait panel 4 × 2. The framebuffer takes 15 KB and goes into PSRAM when the psram component is enabled. Besides full-frame refreshes, the driver works out which window has changed and sends only that. If a redraw changes nothing, nothing goes over the bus. The screen redraws every second by default, and the SPI clock defaults to 10 MHz.
Other panels
For panels other than Waveshare's, there is a CUSTOM model. You supply the width and height, the packing orientation (portrait), the address window and the controller's init sequence. The panel's inner dimension has to be a multiple of 12, meaning the height for a landscape panel and the width for a portrait one, so that the framebuffer lines up with the controller's 12-pixel blocks.
The author tested the driver on the Waveshare board, including rotation by 90 degrees, a build with octal PSRAM and a CUSTOM configuration with the same panel parameters. Portrait packing has only been checked by tests run on a computer, because the author had no portrait panel to try.