Home Build Film Travel Play
Hank Leukart
Hank Leukart
Product Manager by day. Filmmaker by night.

NOW ON BLUESKY 23h ago →

the moment i get my delorean, i'll travel to 2011 montreal because of mile end kicks

About Me Email
IMDb
e-ink
Glanceable from across the room. No backlight, no screen glare, just a permanent weather verdict on your wall.
8 verdicts
Not just yes/no—Beach Day, Night Time, Indoor Day, Rain Day, Wind Day, Brrr Day, Nice Day, and Grey Day.
hourly
Parses Open-Meteo hourly forecast data to predict exactly when the fog will burn off.
tomorrow
Automatically switches to tomorrow's forecast after sunset so you can plan ahead.
What It Does

A Weather Decision Engine for Your Wall

Beach Day is an e-ink dashboard that answers one question: should you go to the beach today? It pulls live forecast, UV, and air quality data from Open-Meteo, runs it through a stack of opinionated comfort rules, and renders a verdict you can read from across the room.

Eight Verdicts, Not Two

Most weather apps dump numbers on you and make you do the math. Beach Day distills the entire forecast into one of eight states, each with its own icon and subtitle. "Beach Day! Pack the car." Or "Wind Day. Hold your towel." Or "Indoor Day. Air Purifier On Max." Or on a foggy 68° morning with sun in the afternoon: "Nice Day. But not quite beachy." The worst case isn't a wall of data. It's "Grey Day. Seattle vibes."

Fog-Clearing Prediction (with a 2 PM Cutoff)

Beach Day parses every hour of the forecast between 9 AM and 6 PM, finds the first hour where the sky clears (WMO codes 0 or 1), and tells you exactly when: "At 11 AM." If the day starts sunny, it says "All day." If there's no sun at all, "Cloudy." To qualify for a Beach or Nice Day, the clearing must happen by 2:00 PM or earlier. If the sun doesn't come out until 3:00 PM, the day is flagged as a "Grey Day." However, the checklist still helpfully displays "At 3 PM" with a fail cross, so you know exactly when the sun is coming.

The Overnight Flip

After sunset, the entire dashboard pivots. The left panel switches to a crescent moon with "Night Time. Beach is closed." The right panel header changes to "Tomorrow (Thursday)" and every metric—temperature, precipitation, wind, sun, and the WMO weather description—swaps to tomorrow's data. You go to bed knowing whether to set an alarm or sleep in.

The Receipts

A five-row checklist shows exactly which metric passed or failed: Sun (coming out by 2 PM?), High Temp (above 75°F?), Rain Chance (below 20%?), Max Wind (below 15 mph?), and Air Quality (AQI below 100?). Each row shows the actual value (rounded to the nearest integer) and a pass/fail icon. When it's not a beach day, you can see exactly why at a glance.

Under the Hood

How it works

The system has three layers that are deliberately separated: a Hubitat driver that fetches weather data, a Hubitat app that handles the integration logic, and a Liquid template that renders it on the TRMNL e-ink screen.

1

The Open-Meteo Driver (Groovy)

A Hubitat device driver polls the Open-Meteo Weather and Air Quality APIs on a scheduled cadence. It acts as a pure, modular data collector—fetching today's and tomorrow's temperatures, wind speeds, UV index, and US AQI, and exposing them as standard Hubitat device attributes.

2

The Integration App (Groovy)

A dedicated Hubitat App handles the business logic and TRMNL integration. It subscribes to the weather device's updates, parses the hourly forecast JSON, performs the Option B hourly forecast merging (so past hourly periods are preserved and the clearing time doesn't get lost), rounds all values for clean display, packages the payload, and POSTs it to the TRMNL webhook.

3

The Liquid Template

The TRMNL rendering server executes the Liquid template from scratch on every screen update. It determines whether it's day or night, evaluates the comfort thresholds, decides which of the eight states applies, and renders a split-panel layout with hand-drawn SVG icons. All sizing uses container-query units (cqh/cqw) so the layout scales natively between the TRMNL OG (800×480) and TRMNL X (1872×1404).

4

The Payload Constraint

TRMNL imposes a 2 KB limit on webhook payloads. The Hubitat App compresses hourly forecast data into two-character keys (t for time, f for forecast), truncates ISO timestamps to 13 characters, and caps the array at 26 periods to stay well under the limit.

Built With

The tech stack.

Op Open-Meteo API — free, no API key, global weather and air quality models Hu Hubitat Elevation — local home automation hub running the Groovy driver and app TR TRMNL — e-ink display platform with Liquid template rendering Li Liquid — Shopify's templating language, executed server-side by TRMNL HT HTML, CSS & SVG — fluid layout with container-query units for e-ink scaling

Explore the implementation details.

Check out the documentation, source files, and build guides to set up your own version.