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

Older photo of e-ink display

E-Ink dashboard screenshot of current layout

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 Screenshot

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