rich 3a4dd3c4ca tap-wake: re-check the screen on taps while 'awake'
If something else turned the screen off during the wake minute (the
9pm cron, a kiosk restart from an update), taps only extended the timer
and never turned it back on, so it stayed dark until nobody touched it
for a full minute. Now every tap (at most every 2s) checks the real
screen state.
2026-10-22 22:17:01 -04:00

Kids weather dashboard

A Raspberry Pi kiosk that shows today's weather and a cartoon kid dressed for it: coat, rain boots, sun hat, whatever the day needs. It's built for the official 800×480 touchscreen and works on any screen.

  • Weather: Open-Meteo (free, no API key), refreshed every 10 minutes. If the internet drops, it keeps showing the last forecast.
  • Outfit: based on the "feels like" temperature for the hours ahead (7am–6pm), plus rain, snow, UV and wind. After 7pm it switches to tomorrow, so clothes can be picked the night before.
  • Calendars: shows the kids' events for the same day from Nextcloud public calendar links (optional).
  • Night mode: the screen dims to 50% after dark (30 min after sunset, and before sunrise), and turns off overnight (default 21:00–06:30). Tapping it at night wakes it, dimmed further, for a minute.

Install on a Pi

You need Raspberry Pi OS with desktop (Bookworm or Trixie). Clone the repo on the Pi and run the installer as the desktop user (not root):

git clone https://git.rickelobe.com/rich/kids-dashboard.git ~/kids-dashboard-src
~/kids-dashboard-src/install.sh && sudo reboot

The installer:

  1. Installs chromium, wlopm, python3, cron and curl if they're missing.
  2. Switches the desktop to labwc (Wayland) and turns on desktop autologin, using raspi-config.
  3. Copies the dashboard to ~/kids-dashboard/. Writes config.js (location) and screen.conf (night schedule).
  4. Adds the kiosk to ~/.config/labwc/autostart. If Chromium crashes, lwrespawn restarts it.
  5. Sets up the night-off cron jobs and the tap-wake systemd user service.
  6. Makes the desktop plain black with no icons, since it shows for ~30s at boot before Chromium starts, and the kiosk stops the taskbar. --uninstall puts the original desktop back (after a reboot).

It's safe to re-run, and settings you don't pass are kept from the last run.

Updates: when the repo is a git clone, the installer also adds an hourly cron job (bin/update.sh) that pulls from the remote and re-runs install.sh only if something changed, so a git push reaches the Pi within the hour. The dashboard reloads by itself. ~/kids-dashboard/update.log records each update.

Options

Option Default
--lat N --lon N detected from public IP Location for the forecast
--off HHMM / --on HHMM 2100 / 0630 When the screen goes off and comes back
--awake SECONDS 60 How long a tap keeps the screen on at night
--evening-brightness PERCENT 50 Backlight level from 30 min after sunset until sunrise, while the screen is on (100 turns this off)
--night-brightness PERCENT 20 Backlight level when tapped awake at night; the official 7" screen looks black below about 15 (full brightness returns in the morning)
--no-night-off / --night-off night-off on Keep the screen on 24/7, or turn night-off back on
--school-start MM-DD / --school-end MM-DD 09-01 / 06-15 School year. On school days (Mon–Fri in the school year, unless a calendar event says "no school" or "school closed") the kids get backpacks
--calendar "Name=URL" none A kid's calendar; repeat once per kid. URL is a Nextcloud public share link (…/apps/calendar/p/…)
--no-calendars Stop showing calendars
--uninstall Remove everything (packages and autologin are left alone)

Layout

dashboard/index.html     the whole dashboard: one file, inline SVG art, no dependencies
bin/kiosk.sh             launches Chromium full-screen with its own profile
bin/screen.sh            screen on|off|auto (auto = whatever the schedule says right now)
bin/sun.py               today's sunrise/sunset for the evening dimming (offline)
bin/tap-wake.py          watches the touchscreen; wakes the screen when it's off at night
bin/update.sh            cron job: pulls from git and re-installs when there's something new
bin/fetch-calendars.py   cron job: fetches the kids' calendars into events.js (the page can't, from file://)
systemd/tap-wake.service user service for tap-wake.py
install.sh               installer / updater / uninstaller

Handy commands (on the Pi)

~/kids-dashboard/screen.sh on                                  # turn the screen on by hand
systemctl --user status tap-wake                               # is tap-to-wake running?
XDG_RUNTIME_DIR=/run/user/$(id -u) WAYLAND_DISPLAY=wayland-0 \
  grim /tmp/shot.png                                           # screenshot of what's on screen

Trying out the art

Open dashboard/index.html?demo=LOW,HIGH,CODE[,RAIN%][,UV] in any browser to fake a day's weather. CODE is a WMO weather code.

  • ?demo=22,30,73,60: snow day (coat, snow pants, hat, gloves, scarf, snow boots)
  • ?demo=50,64,61,80: rain (raincoat, rain boots, umbrella)
  • ?demo=72,88,0,0,8: hot and sunny (t-shirt, shorts, sun hat, sunglasses)

Add &wind=MPH (15+ is windy), &season=spring|summer|autumn|winter or &school=0|1 to try the wind, season and backpack looks, e.g. ?demo=45,58,2&season=autumn&wind=22. CODE 45 is fog.

Demo mode also shows three sample calendar events; add ,noevents (e.g. ?demo=45,58,0,0,3,noevents) to hide them.

The clothing thresholds live in outfit() in index.html. Temperatures are in °F.

S
Description
No description provided
Readme
254 KiB
0 Stars 1 Watchers 0 Forks
Languages
HTML 62.6%
Shell 24.3%
Python 13.1%