A wall-mounted e-ink dashboard that shows everything I need before leaving the house: weather, train times, tram schedules, and birthday reminders. Updates every 10 minutes and runs on battery for 3-4 months.
Older photo of e-ink display
E-Ink dashboard screenshot of current layout
Motivation
I wanted a glanceable display near my front door that shows relevant local information without needing to check my phone. E-ink is perfect for this — low power consumption, always-on visibility, and no screen glare.
E-Ink Display first test
How It Works
The architecture is simple: a Python server generates the dashboard image, and an ESP32 fetches and displays it.
Server (Python):
- Fetches data from weather, transport, and river APIs
- Caches responses to minimize API calls
- Renders an 800x480 image using PIL/Pillow
- Converts to 1-bit BMP with Floyd-Steinberg dithering
- Serves the image via HTTP
Display (ESP32):
- Wakes from deep sleep every 10 minutes
- Downloads the latest image over WiFi
- Renders to the e-ink display
- Returns to deep sleep
This keeps the ESP32 firmware minimal — no API keys, no complex logic. I can update the dashboard layout by editing Python code without reflashing the hardware.
What It Shows
- Header: Date, wedding countdown, birthday notifications
- Weather: Current conditions, 4-day forecast, UV index, Rhine river temperature and water level
- Travel: Real-time ETAs to work and family (Google Maps)
- Transport: Next trains and trams from Basel SBB (Swiss Transport API)
- Footer: Last updated timestamp
Hardware
- Waveshare 7.5" e-ink display (800x480, black & white)
- ESP32 microcontroller
- 10,000mAh battery (3-4 months runtime)
- 3D-printed wall-mount case
- Linux server (Debian) running Python
Data Sources
- OpenWeatherMap — Weather forecasts
- Swiss Transport API — Train and tram schedules
- Google Distance Matrix — Travel time estimates
- Basel Open Data — Rhine river temperature and water level