home-assistant

A 40-euro e-book reader became our Home Assistant display

In short

An Xteink X4 (e-book reader, ESP32-C3, 4.26” e-ink) now runs as a status display for an off-grid finca: solar battery, PV output, pool readings, cistern level, outside temperature. The firmware is ESPHome, it talks to Home Assistant over the API, and updates arrive over WiFi. Three pitfalls while flashing, one with deep sleep, and a battery that lasts less than the datasheets promise.

Why bother

The finca runs off-grid. Solar, battery, cistern, pool. All of it lives in Home Assistant, but checking the state meant reaching for a phone every time. What was wanted was something that simply hangs on the wall, without a power cable, and stays readable in full sunlight. So: e-ink.

Ready-made e-ink displays for Home Assistant quickly cost 100 euros and up. The Xteink X4 is a cheap e-book reader with 800x480 pixels, an ESP32-C3 and a 650 mAh battery. The community had already built an ESPHome component for it (esphome-component-xteink on GitHub). That was the point where we gave in.

What we did

Afterwards the reader is no longer a reader — the original firmware is overwritten completely. Beforehand we dumped the 16 MB flash twice and compared the checksums, so the device can be put back at any time. The dump takes a good three minutes. The USB port disappears the moment the reader falls asleep. Sounds trivial, but it cost us one aborted dump: wake it first and raise the sleep timer.

Then ESPHome went on, the device was added to Home Assistant, and updates have been going over the air via WiFi ever since, in around 13 seconds. In portrait orientation the display shows the solar battery level, PV output, consumption and remaining runtime, plus pH and redox from the pool with an assessment and a recommendation (“add pH minus”, “stop chlorination”), the cistern level and the outside temperature. The panel is black and white only, so we render warnings as a frame and critical values inverted. It works better than expected.

What cost us time

The compiler cannot find SPI.h. On ESP32, ESPHome deliberately leaves out the Arduino SPI library, but the Xteink component needs it. A libraries: [SPI] under esphome: in the config fixes it. An spi: block in the YAML does not help.

esphome upload does not recompile. It flashes the existing binary, without warning. After every change to the config or the secrets it has to be esphome run. We “corrected” a wrong WiFi password twice and could not work out why nothing changed.

Deep sleep nearly bricked the device. The X4 cuts power when going to sleep unless GPIO13 is held with gpio_hold_en(). It then never wakes up again. Important: hold it, do not drive it — the hardware already puts about 0.85 V on that pin. ESPHome also needs safe_mode: boot_is_good_after: 10s; otherwise a boot only counts as successful after 60 seconds, the device falls asleep before that, and after a few cycles it ends up in safe mode.

One more detail: sleep_duration is not templatable in the deep sleep component, only in the deep_sleep.enter action. So we set a fixed fallback in the component and the real duration by template in the action.

The honest battery verdict

This is the sobering part. Permanently awake with WiFi, the X4 lasts around four hours. Deep sleep is better, but the device still draws close to 4 mA while asleep, instead of the few microamps you expect from an ESP32. Leakage currents, among them the battery measurement through two 10 kΩ resistors. Realistically, on 650 mAh:

  • 60 s interval: about one day
  • 5 minutes: about three days
  • 10 minutes: about four days

For a display on the wall that is enough, but it is no miracle. One idea is still open: holding the panel’s reset line (GPIO5) as well, which should almost halve the sleep current. Not tested yet — deliberately one change at a time.

The sleep interval is set straight from Home Assistant (60 to 1800 s), with no reflashing. A “keep awake” switch blocks sleep during OTA updates.

What this means for finca owners

If you run a setup with solar, a cistern or pool sensors, you do not need a 500-euro panel to see the state at a glance. An e-ink display in the right spot, set up properly once, does that job for under 50 euros of hardware. We build this into existing Home Assistant installations on request.

Technical details

  • Xteink X4: ESP32-C3, 16 MB flash, panel GDEQ0426T82 / SSD1677, 800x480, 1 bit, 650 mAh
  • ESPHome 2026.8.2, component github://ngxson/esphome-component-xteink
  • Rotation 270 → 480x800 portrait, half refresh ~1.6 s
  • Deep sleep: hold GPIO13, boot_is_good_after: 10s, fallback run_duration: 30s in case Home Assistant does not connect
  • Recovery if it will not boot: device off, hold Volume down + Power, release at the warning, confirm with Volume up → download mode
← Back to In practice