E-paper dashboard

Ever since I got my first e-paper/e-ink device, a Kobo Aura HD ebook reader, back in 2013, I have had a great appreciation for this technology. The next year I got a Pebble watch, which also used this technology (and to this date, the Pebble Time Round, which I eventually bought, is the best smartwatch I’ve ever had - if a new version shows up, I’d buy it in a second).
Today, I use a reMarkable 2 as a low-tech-but-digital notebook.

As such, I had been keeping an eye on the technology, but wasn’t really keen on spending 100+ € on a panel just for use with Home Assistant.

The seeedstudio XIAO 7.5” ePaper panel

Recently I came upon a mention of the Seeedstudio XIAO 7.5” ePaper Panel. As the name indicates, it’s a 7.5” e-ink display, provided in a 3D-printed enclosure with a XIAO ESP32-C3 and also including a 2000mAh battery. The price is quite decent too, and I ended up paying 64€ with shipping and tax (thanks to the current exchange rate of the EUR/USD). In Europe, the usual price for just the display itself is around 70€, so this unit is a bit of a bargain, and I didn’t even have to assemble it myself. Seeedstudio even provide a wiki with great examples of how to make it work, such as using ESPHome and an addon to take a screenshot of a specific dashboard to display.

Perfect Form Factor for Home Display

The size of the enclosure also makes it a perfect fit inside a standard IKEA photo frame. This makes it ideal if you want to mount it on a wall, to display information at a glance.

We keep ours near our front entrance, by the stairs, and we use it to display information using Home Assistant. This includes things like the weather for the day, traffic information for our next calendar events (via Waze Live Maps), and the current range on our EV. To build the dashboard, I used 2 sections, so they would go side by side, and adapted the cards so that they would look ok in black and white. I also added a “Last updated” template card at the bottom right, so I can tell when it last happened.

Last updated: {{ now().strftime('%d %B, %H:%M') }}

The device doesn’t report battery percentage, and as it is e-ink, the screen doesn’t go off when it runs out of power.

The  seeedstudio XIAO 7.5'' ePaper panel nicely fitted inside an IKEA photo frame.
The seeedstudio XIAO 7.5'' ePaper panel nicely fitted inside an IKEA photo frame.

Battery Performance

The battery capacity is very decent. I was able to get 15 days out of it using deep sleep. This is done by waking the device for 2 minutes to process the update, and then have it sleep for the next 30 minutes. For the type of information we are using this for, this is frequent enough.

I am currently experimenting with more complex code to keep the display in deep sleep overnight, which should allow me to extend the battery life even further.

ESPHome code

After the update to ESPHome version 2025.7.x, I add to make some changes to the sample code provided by Seeedstudio in their wiki. The PNG decoder kept running out of memory, so I replaced it with BMP, which works just the same and avoids the issue entirely.

Configuration with deep sleep

29-Aug-2025: this code has been updated with manual sensor updates for the diagnostic sensors. The sensors were failing to update as the attempts were happening while wifi was disconnected (during deep sleep). They are now triggered manually each time the wifi connects.

13-Aug-2025: this code has been updated with a script section, kindly shared in Reddit by another user. Instead of using a predefined deep_sleep duration, it is being called based on the current time. This allows you to set a longer period between updates at night, for example.

Faster display updates with partial refresh

If you don’t mind the battery lasting for a shorter amount of time, or if you will always have the device powered via USB, you can use partial/fast refresh to allow quicker screen updates, where only the relevant pixels are updated, without a full refresh (which causes a noticeable effect on the screen, with the whole thing going black and white again for a second). Eventually, the screen will still need a full refresh, but the code takes care of this and will automatically trigger it after a specified number of updates.

Sample use case: desk clock and calendar display

With fast refresh, you could conceivably use the display as a desk clock + calendar, showing the current time (updating every minute) and displaying calendar entries from a synchronised calendar. This would be great for me, as I spend most of my work day in Zoom meetings. Unfortunately, my employer doesn’t allow me to share or sync my work calendar in any way, shape or form, so that’s a no go. Still, I’ve tested the .yaml code version for it:

Configuration for Fast Refresh

If you are using deep sleep, you cannot use partial/fast refresh, as the two are not compatible.