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