Een Home Assistant-dashboard op e-ink met Python en een ESP32
Intro
Een dashboard is pas handig als de informatie die je zoekt ook echt in beeld komt. Voor dit project combineerde ik twee repositories: eink-server haalt gegevens uit mijn thuisomgeving en maakt daar een beeld van; e-ink7.5 laat dat beeld zien op een ESP32 met een 7,5-inch e-inkdisplay.
Het zijn dus geen twee versies van hetzelfde programma. De ene helft weet iets van data, HTML en afbeeldingen. De andere helft weet iets van wifi, bytes en het aansturen van het scherm. De afspraak ertussen is bewust klein gehouden: één afbeelding ophalen via HTTP.
Niet zo technisch? Klik hier voor de simpele uitleg
Dit is de korte versie in gewone taal.
1. De server verzamelt informatie
De server haalt gegevens op, bijvoorbeeld het weer en praktische informatie uit Home Assistant, en maakt daarvan één dashboardplaatje.
2. Het scherm vraagt om dat plaatje
Een klein ESP32-bordje maakt verbinding met wifi en haalt de afbeelding op bij de server.
3. Het scherm ververst niet voortdurend
Na het tonen van het dashboard gaat het bordje slapen. Na een ingestelde tijd wordt het wakker, haalt een nieuwe versie op en werkt het scherm bij.
TL;DR: De Python/FastAPI-server haalt onder meer Home Assistant- en optioneel Sonarr/Radarr-data op, rendert een afbeelding van 800 × 480 pixels en verpakt die in twee 1-bit-kleurvlakken. De ESP32-firmware haalt de vaste binaire payload op via GET /dashboard, stuurt die naar een zwart-wit-rood GxEPD2-display en gaat daarna in deep sleep. De twee projecten blijven los te ontwikkelen zolang ze hetzelfde beeldformaat afspreken.
Twee projecten, één dashboard
De server en de firmware hebben ieder een eigen taak. Dat is prettig, want een dashboardlayout aanpassen is iets heel anders dan een e-paperdisplay betrouwbaar aansturen.
| Project | Verantwoordelijkheid |
|---|---|
eink-server | Data ophalen, dashboard opbouwen, renderen en als bitmap beschikbaar maken |
e-ink7.5 | Wifi beheren, bitmap ophalen, display bijwerken en energie besparen |
De ESP32 hoeft dus geen Home Assistant-integratie, agenda of ingewikkelde HTML te begrijpen. En de server hoeft niet te weten hoe de display-driver zijn pixels precies wegschrijft. Alleen het formaat van de overdracht moet aan beide kanten kloppen.
Wat de server doet
De server is geschreven in Python met FastAPI. Een scheduler haalt periodiek gegevens op uit Home Assistant: weer en verwachting, afval, verjaardagen, auto- en energiegegevens en stappentellers. Sonarr en Radarr kunnen aanvullend recente media aanleveren.
Daarna wordt het dashboard op een vast canvas van 800 × 480 pixels opgebouwd. De standaardroute rendert de HTML-template met Chromium; als dat niet lukt, kan de server terugvallen op een renderer met Pillow. Zo zit de complexe opmaak aan de serverkant, waar ik hem snel kan aanpassen en bekijken.
Een normaal computerscherm heeft miljoenen kleuren. Dit paneel heeft er drie: zwart, wit en rood. De server brengt de afbeelding daarom terug tot die kleuren en zet de pixels om in twee monochrome bitmaps. Dat is een heel ander soort layoutwerk dan een gewone webpagina: tekst moet leesbaar blijven, informatie moet in weinig ruimte passen en kleur kan alleen op een paar plekken nadruk geven.
Wat de ESP32 doet
De firmware is een PlatformIO/Arduino-project voor een ESP32 Dev Module met een GxEPD2 7,5-inch driekleurendisplay. Bij het starten probeert het bordje verbinding te maken met het ingestelde wifi-netwerk. Lukt dat niet, dan kan het een configuratieportaal openen zodat je de wifi opnieuw kunt instellen.
Na een verbinding vraagt de ESP32 de dashboardafbeelding op bij de server. Als dat lukt, werkt hij het scherm bij. Bij een mislukte wifi- of HTTP-aanvraag laat hij de bestaande inhoud staan en probeert hij het later opnieuw.
Daarna zet de firmware wifi uit, laat het display hiberneren en start deep sleep. Standaard wordt het bordje na tien minuten wakker. Het scherm zelf houdt de laatste afbeelding vast, ook wanneer de ESP32 slaapt. Dat is precies waarom e-ink hier goed past: het beeld hoeft niet continu opnieuw opgebouwd of verlicht te worden.
De afspraak tussen beide kanten
De route /dashboard geeft geen JSON terug, maar een vaste binaire payload van 96.000 bytes. Die bestaat uit twee kleurvlakken van elk 48.000 bytes. De firmware controleert de Content-Length; klopt die niet, dan wordt de overdracht afgewezen.
Dat klinkt streng, maar is hier juist handig. Het bordje hoeft geen zware parser of afbeeldingsdecoder te draaien. Het leest de bytes in vaste stukken en kan het rode vlak in stroken naar het display schrijven. De prijs is dat server en firmware precies dezelfde afmetingen, bitindeling en volgorde moeten gebruiken. Een kleine wijziging aan één kant kan anders al een verkeerd beeld opleveren.
Dat is voor mij het interessantste technische deel van de samenwerking: de projecten zijn los, maar de grens ertussen is heel concreet. Niet “stuur maar een dashboard”, maar “stuur exact dit aantal bytes in precies dit formaat”.
Waarom e-ink en deep sleep
Een tablet zou makkelijker zijn, maar verbruikt voortdurend stroom en voelt meer als nog een scherm dat je moet bedienen. Deze opstelling heeft één taak: de informatie rustig zichtbaar maken. De ESP32 wordt alleen actief om te verbinden, de afbeelding op te halen en het paneel bij te werken.
Het beperkte kleurenpalet dwingt ook keuzes af. Je kunt niet elk detail uit een kleurrijk dashboard zomaar verkleinen. Je moet bepalen wat op die 800 × 480 pixels echt belangrijk is en hoe je met zwart, wit en een beetje rood de aandacht verdeelt.
Wat dit project interessant maakt
Los zijn het twee overzichtelijke projecten. Samen vormen ze een compleet systeem: Home Assistant en andere bronnen leveren de inhoud, de server maakt er een displayvriendelijk beeld van en de ESP32 brengt dat beeld naar een scherm dat het lang kan vasthouden.
De scheiding maakt het ook makkelijker om verder te bouwen. Nieuwe informatie of een andere dashboardindeling hoort vooral bij de server. Een andere slaaptijd of wifi-instelling hoort bij de firmware. Zolang de afspraak tussen die twee hetzelfde blijft, hoeven ze niet tegelijk te veranderen.
Dat vind ik een mooie manier om hardware en software te combineren: de server doet het zware werk, het kleine bordje doet één ding en doet daarna weer rustig een stap terug.
Vragen / feedback
Als je vragen hebt over de server, de ESP32-firmware of het beeldformaat, stel ze dan via mijn contactformulier en ik neem contact met je op.