Also see here
So what is the verdict here? is the XIAO 7.5 decent?
Seems like some hoops to jump though to render a dashboard but not too bad.
I have been strongly considering a display like this for outside my office door so people know I am in meetings / should not disturb.
I have been running it for a week or so.
I have wife seal of approval!
There is an initial hurdle to get it setup and the guide provide is well done with a few glitches here and there that may trip up the less technically competent like me.
I have it
Setup in the lounge with information that I and my wife check normally several times day.
It is set to refresh every 5 mins, the 30 second was too much as the screen flashes when refreshing.
I need to put it on a charger pretty much once a day.
I put a date/time in the display so I could tell if it was still running.
I can see me just leaving it plugged in permanently.
If you plan to use as a sign on a door then you need to consider the screen refresh time.
If you set it to 5 mins then it could take up to 5 mins to reflect a change, you pull data from the device you canât push to it.
I like it, I had thought about 3d printing a different case for it as they files are available online but have not got around to it yet.
Iâm also using it, I made some changes to the setup, to get rid of the flickering with every update. This screen supports partial updates, so add a âpâ after the model name and add a âfull_update_everyâ interval. Furthermore invert the busy pin as advised in the esphome docs for these models.
display:
- platform: waveshare_epaper
id: my_display
cs_pin: GPIO3
dc_pin: GPIO5
busy_pin:
number: GPIO4
inverted: true
reset_pin: GPIO2
model: 7.50inv2p
full_update_every: 720
update_interval: 10s
Thanks!!!
I have implemented your recommendations and much improved.
I thought while I was updating it I would change the display slightly and go from the Black Screen with white text to White background and black text.
The instructions for Puppet and SEEED state you add a &invert on the end of the url to get the Dashboard image
ââŠ:10000/epaper-display/epaper-display?viewport=800x480&eink=2â
So it becomes
ââŠ:10000/epaper-display/epaper-display?viewport=800x480&eink=2&invertâ
When using this in a browser it does not change the output at all
However adding &inverted does invert the output when use in a browser but has not effect at all on the paper display.
Any ideas, not critical or important ⊠but worth clarifying I think for anyone else trying to get the display the way they want it.
captive_portal:
http_request:
verify_ssl: false
timeout: 10s
watchdog_timeout: 15s
online_image:
- id: dashboard_image
format: PNG
type: BINARY
buffer_size: 30000
url: http://xxx.xxx.xxx.xxx:10000/epaper-display/epaper-display?viewport=800x480&eink=2&inverted
update_interval: 30s
on_download_finished:
- delay: 0ms
- component.update: main_display
spi:
clk_pin: GPIO8
mosi_pin: GPIO10
display:
- platform: waveshare_epaper
id: main_display
cs_pin: GPIO3
dc_pin: GPIO5
busy_pin:
number: GPIO4
inverted: True
reset_pin: GPIO2
model: 7.50inv2p
update_interval: 10s
full_update_every: 720
lambda: |-
it.image(0, 0, id(dashboard_image));
I donât use the it.image function myself, but you can add the foreground and background âcolorâ of the epaper screen to the function.
it.image(0, 0, id(dashboard_image), COLOR_OFF, COLOR_ON);
or maybe you have to swap the COLOR_ON and COLOR_OFF depending on the required result.
it.image(0, 0, id(dashboard_image), COLOR_ON, COLOR_OFF);
Anyone know how to get the battery level/percentage reported back to HA?
I would be interested din that too!
Also anyone else having issues with it just stop updating overnight, I am having to restart Puppet and the device every morning.
Mine has been working great with a 15 day battery life between charges, with 30 minute deep sleep between updates.
I was trying to make it deep sleep during the night, and when I installed the updated code with ESPHome 2025.7.x, it broke. It stopped being able to decode the png images, it keeps running out of memory.
I have managed to fix this by replacing the format from PNG to BMP.
ie:
online_image:
- id: dashboard_image
format: BMP
type: BINARY
buffer_size: 30000
url: http://xxx.xxx.xxx.xx:10000/eink-2/0?viewport=800x480&eink=2&invert&format=bmp #change this link to your screenshot link
update_interval: 90s
on_download_finished:
- delay: 100ms
- component.update: main_display
Just change the format from PNG to BMP and add &format=bmp to the URL from Puppet.
Separately, a thanks to @jsuanet , I tried but failed to get the partial refresh to work previously. I have now followed your example there and it works without issue.
As far as the battery level is concerned, I showed the schematics to a friend of mine who knows more about electronics than I do, and based on his understanding the way this is wired does not allow the battery level to be picked up as is.
On a separate note, these fit perfectly inside an IKEA photo frame. Makes it really easy to hang them on a wall. Have it set up near my front entrance to provide information at a glance (weather, calendar, traffic, ev car range). 30 minutes between updates is more than enough.
Fantastic!!
Back up and working!
By replacing the 5kb png that the esp home device errors out because it is greater than the 48kb available!
Now replacing the 5kb image with a 48k bmp image and everything is now ok and works.
Apparently a 5kb png is now larger than a 48k bmp.
So many,many thanks to @cromelex !!
Hopefully this will be fixed at sometime.
That looks really nice :-j
I am printing a new all black case for mine and it is easy for me to keep it plugged in all the time.
What model of the Ikea frame is that? It looks and fits perfectly. I have two of this screens ordered and currently looking for a way to wall hang them. I have 5V cables behind it so it will be always powered.
Itâs the Ribba 13x18cm.
I believe theyâve been discontinued and replaced by the Rödalm series. It should work just as well, I think the depth is sufficient.
is it possible you share the complete yaml from Captive portal and down ? i do get an image here after all you guys there posts but when i use the Partial function its a blank screen, i cant figure out where im going wrong.
Thanks
Vince
EDIT: it suddenly came to life, so here it is for other people facing the same âproblemsâ donât forget to change the picture url ofc.
captive_portal:
http_request:
verify_ssl: false
timeout: 10s
watchdog_timeout: 15s
online_image:
- id: dashboard_image
format: BMP
type: BINARY
buffer_size: 30000
url: http://10.0.0.125:10000/lovelace/home?viewport=800x480&eink=2&invert&format=bmp #change this link to your screenshot link
update_interval: 90s
on_download_finished:
- delay: 100ms
- component.update: main_display
spi:
clk_pin: GPIO8
mosi_pin: GPIO10
display:
- platform: waveshare_epaper
id: main_display
cs_pin: GPIO3
dc_pin: GPIO5
busy_pin:
number: GPIO4
inverted: true
reset_pin: GPIO2
model: 7.50inv2p
update_interval: 10s
full_update_every: 720
lambda: |-
it.image(0, 0, id(dashboard_image));
Was the issue the image URL?
I have my full code available here, in case it helps.
no idea actually, but, what i now have is after X time Puppet crashes.
901 Error generating screenshot ProtocolError: Page.addScriptToEvaluateOnNewDocument timed out. Increase the 'protocolTimeout' setting in launch/connect calls for a higher timeout if needed.
902 Wait time: 40502740 ms
902 Handling /lovelace/epaper?viewport=800x480&eink=2&invert&format=bmp
at <instance_members_initializer> (file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/common/CallbackRegistry.js:97:14)
at new Callback (file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/common/CallbackRegistry.js:101:16)
at CallbackRegistry.create (file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/common/CallbackRegistry.js:20:26)
at Connection._rawSend (file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Connection.js:95:26)
at CdpCDPSession.send (file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/CdpSession.js:70:33)
at FrameManager.evaluateOnNewDocument (file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/FrameManager.js:229:14)
at CdpPage.evaluateOnNewDocument (file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Page.js:730:41)
at Browser.navigatePage (file:///app/screenshot.js:224:47)
at async RequestHandler.handleRequest (file:///app/http.js:155:32)
Restart of puppet does repair it for a while, do you experience the same ?
Is the puppet screenshot URL available through a browser?
I use the Kindle Lovelace Screensaver add-on for taking screenshots rather than Puppet, could be an option for you to set up.
yes it is available when it has not crashed, when i see this notice then its a no. going to test that , thanks for the tip, i have it nowworking by every X hour restarting the addon.
It seems to have stabilized over the last few days not crashed once in 72hrs!


