A wall-mounted e-ink dashboard that shows everything I need before leaving the house: weather, tram departures, commute times, waste collection days, and birthday reminders. It refreshes every 10 minutes during the day, slows down at night, 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

Current layout: hourly temperature curve, warning bar, 4-day forecast chart, departures, commute and reminders

Earlier text-only dashboard layout

The earlier text-only layout, before the move to charts and panels

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, including the temperature and forecast charts
  • Converts to 1-bit BMP with Floyd-Steinberg dithering
  • Serves the image via HTTP

Display (ESP32):

  • Wakes from deep sleep every 10 minutes during the day, less often at night
  • 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

The layout went through a full redesign: the early version was a wall of text, the current one leans on small charts and dedicated panels.

  • Header: Weekday and date, plus icons for the activities scheduled that day
  • Now: Current and felt temperature, day min/max, UV index, sunshine duration, precipitation amount and probability, wind, and Rhine river temperature, water level and turbidity (FNU)
  • Hourly curve: Temperature over the next 24 hours with sunset and sunrise markers, night hours shaded
  • Warning bar: Weather warnings (e.g. heat warning level 3) and birthday reminders, only drawn when there is something to say
  • 4-day forecast: Daily high/low as a line chart with precipitation amount and probability underneath
  • Departures: Next trams per line and direction from the local stop (Swiss Transport API)
  • Unterwegs: Live travel times to work and family (Google Maps)
  • Termine: Waste collection days (household waste, paper), anniversaries and countdowns
  • Footer: Last update, current refresh mode and next refresh time

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, water level and turbidity
  • Local waste collection calendar: Household waste and paper pickup days