MATTES.DEV

← Blog

· 3 min read

An e-paper departure board on a reTerminal

The board shows live departures from Stuttgart's VVS transit network on an e-paper panel by the front door, so the next connections can be read without a phone or an app. It runs on a Seeed reTerminal E1001: an ESP32-S3 with octal PSRAM behind a 7.5-inch monochrome e-paper panel at 800×480. E-paper is appropriate for this purpose because it stays legible across the room under ambient light, draws power only during a refresh, and retains the last frame without being driven. The firmware is ESPHome — YAML for the device configuration, C++ lambdas for the parsing and layout logic.

On-device data path

The device queries Stuttgart's public VVS EFA API over WiFi, parses the responses locally and renders the result itself. Neither a Home Assistant instance nor an intermediate server is required at runtime, which removes the components that would otherwise have to stay available for the board to keep working, and keeps the request path to a single hop.

Departures from three configurable stops are merged into one chronologically sorted list, of which the next five are displayed. U-Bahn and S-Bahn services are included, buses are filtered out by default. Stop IDs, refresh interval, line and direction filters, screen rotation and interface language are YAML substitutions, so reconfiguration does not require changes to the parsing or layout code.

Failure behaviour

A transit API is a dependency that fails intermittently, so most of the implementation effort went into the failure cases. Each stop is fetched independently with its own timeout, so a slow endpoint does not delay the others. The panel is repainted only after all requests have resolved, which rules out a partially updated board. If every request fails, the last successful data remains on screen instead of the board clearing, and an indicator marks the data as stale — an outdated board is more useful than an empty one as long as that state is visible.

Display design

On a monochrome panel, shape, weight and position have to carry the information that colour would otherwise carry, so the line badges do the distinguishing: square corners for U-Bahn, rounded corners for S-Bahn, with directional triangles on branching lines such as U7 and U15 to indicate which branch a service takes. Text is set in Noto Sans; English and German string packs are included.

Optional Home Assistant integration

The ESPHome API optionally exposes around a dozen entities to Home Assistant — next departure, load counters, a stale flag, and diagnostics such as temperature and WiFi signal. That connection is optional and the board's behaviour is unchanged without it: the device requires no notifications, no account and no subscription beyond a power supply and a WiFi network. The complete configuration is on GitHub.