dorkhub

pi-inky-weather-epd

A beautiful weather dashboard for any colour E-Paper Display

mt-empty
Rust1055 forksGPL-3.0updated 3 days ago
visit the demogit clone https://github.com/mt-empty/pi-inky-weather-epd.gitmt-empty/pi-inky-weather-epd

Pi Inky Weather Display

Build Status Rust Version License

A beautiful weather dashboard for Raspberry Pi with 7.3" e-paper display

FeaturesQuick StartHardwareConfigurationDevelopment

Hourly timelapse

The generation of the image is abstracted away from the hardware, so it can be used on any hardware stack.

Hardware

Dashboard Case

Setup on Raspberry Pi

  1. Install the Inky library:

    curl https://get.pimoroni.com/inky | bash

    For detailed installation steps, refer to the official documentation.

  2. Download the latest release:

    Download the latest release for your architecture from the releases page and extract it:

    Architecture Guide
    Raspberry Pi Model Architecture Download
    Pi 1, Zero, Zero W arm-unknown-linux-gnueabihf ARMv6
    Pi 2, 3, 4, Zero 2 W (32-bit OS) armv7-unknown-linux-gnueabihf ARMv7
    Pi 3, 4, 5 (64-bit OS) aarch64-unknown-linux-gnu ARMv8
    x86 Linux x86_64-unknown-linux-gnu x64
     # Download and extract
     wget https://github.com/mt-empty/pi-inky-weather-epd/releases/latest/download/pi-inky-weather-epd-<architecture>.zip
     unzip pi-inky-weather-epd-<architecture>.zip
     chmod +x pi-inky-weather-epd
  3. Configure your weather data provider and location:

    Get your latitude and longitude from https://www.latlong.net/ and create a configuration file:

    mkdir -p ~/.config
    cat > ~/.config/pi-inky-weather-epd.toml << EOF
    [api]
    latitude = YOUR_LATITUDE   # e.g., -33.8727 # Sydney
    longitude = YOUR_LONGITUDE # e.g., 151.2057
    provider = "open_meteo"    # "open_meteo" (worldwide) or "bom" (Australia only)
    EOF

    See ./config/default.toml for more configuration examples.

  4. Set up an hourly cron job to update the display:

    (crontab -l 2>/dev/null; echo "0 * * * * cd /path/to/extracted/files && ./pi-inky-weather-epd && sudo <PYTHON_PATH> <IMAGE_SCRIPT_PATH> --file dashboard.png --saturation <SATURATION>") | crontab -

    Replace:

    • /path/to/extracted/files with your installation directory
    • <PYTHON_PATH> with path to Python (e.g., /usr/bin/python3)
    • <IMAGE_SCRIPT_PATH> with path to Inky's image.py (e.g., /home/pi/Pimoroni/inky/examples/7color/image.py)
    • <SATURATION> with the desired saturation level depending on your display (e.g., 1.0). If using the Inky Impression 7 colours, it is not recommended to change this for current icons

    Example of complete cron command:

    0 * * * * cd /home/pi/pi-inky-weather-epd && ./pi-inky-weather-epd && sudo /home/dietpi/env/bin/python3 /home/dietpi/Pimoroni/inky/examples/7color/image.py --file dashboard.png --saturation 1.0

Configuration

You can override the default configs located at ./config/ by creating a file at:

~/.config/pi-inky-weather-epd.toml

Configuration Examples

Here are example configurations.

Default Configuration

Default configuration

Imperial Units

[render_options]
temp_unit = "F"
wind_speed_unit = "mph"

Date Format

You can customise the date format using chrono strftime specifiers. The default is "%A, %d %B" (e.g., "Saturday, 06 December").

[render_options]
# Example formats:
# date_format = "%B %-d, %Y"     # December 6, 2025 (US style)
# date_format = "%d/%m/%Y"       # 06/12/2025 (Australia/UK)
# date_format = "%m/%d/%Y"       # 12/06/2025 (USA)
# date_format = "%Y-%m-%d"       # 2025-12-06 (ISO 8601)
# date_format = "%a, %-d %b"     # Sat, 6 Dec
# date_format = "%d.%m.%Y"       # 06.12.2025 (Germany)

date_format = "%A, %d %B"

See chrono strftime documentation for all available format specifiers.

Use Clear night Icon instead of Moon Phase icon when Time=night and Weather=clear

Moon phase configuration

When the sky is clear, the moon phase icon is used instead of the clear night icon, you can disable with:

[render_options]
use_moon_phase_instead_of_clear_night = false

Set X-Axis Placement to be always at y=0

X-axis at minimum

The x-axis is no longer at the bottom of the graph when the temperature is below zero, it is now always positioned at x = 0.

[render_options]
x_axis_always_at_min = false

Dark Theme

Dark theme

[colours]
background_colour   = "black"
text_colour         = "white"

x_axis_colour       = "white"
y_left_axis_colour  = "red"
y_right_axis_colour = "blue"

actual_temp_colour  = "red"
feels_like_colour   = "green"
rain_colour         = "blue"

Auto-Update Interval

Enable auto-update when a new release is available. This is enabled by default.

[release]
# Set to 0 to disable auto-updating
update_interval_days = 7
# Opt in to pre-release versions (requires update_interval_days > 0)
allow_pre_release_version = false

Degraded Operation

The dashboard can still work using cached data for a while if the API is unreachable. A diagnostic icon and message appears on the display when issues occur.

Diagnostic Type Priority Icon
API Error High API Error
No Internet Medium No Internet
Incomplete Data Low Incomplete Data
Update Failed Low Update Failed

When multiple diagnostics occur, the highest priority diagnostic is displayed, lower priority ones are cascaded.

Inky Impression 7.3

Supported Colours at 1.0 Saturation (Without Dithering)

[0, 0, 0],        # Black
[255, 255, 255],  # White
[0, 255, 0],      # Green
[0, 0, 255],      # Blue
[255, 0, 0],      # Red
[255, 255, 0],    # Yellow
[255, 140, 0],    # Orange

Documentation and Resources

Design Decisions

Image generation is hardware-agnostic. Weather data is rendered to an SVG via TinyTemplate, then rasterized to PNG with resvg. The same pipeline runs on a Pi or a dev laptop, so cargo run on your machine shows exactly what ships to the panel — no on-device-only rendering path to debug blind.

Degrades instead of failing. If the API is unreachable, the fetcher falls back to the last cached response and keeps rendering, surfacing a priority-ordered diagnostic icon instead of a blank display or a crash log nobody on a headless Pi will ever see.

Config, not code, for personalization. Colours, units, date format, and axis behaviour are all TOML overrides layered on config/default.toml — no fork needed to reskin the dashboard.

Backward-compatible by default. The binary can self-update in place on unattended Pi devices, so a newer binary routinely reads state (cached JSON, TOML config) written by an older one. New fields must tolerate absence rather than hard-fail a fetch.

Time is injected, not read. Time-dependent logic goes through a Clock abstraction rather than calling the system clock directly, so tests and the 24-hour simulation script can drive arbitrary times deterministically.

Contributing

Contributions are welcome — see docs/CONTRIBUTING.md for dev setup, running tests, simulating dashboards, and troubleshooting.

more like this

fridge_tracker

鲜知贴:可复刻的 ESP32 墨水屏食材保鲜提醒器,包含 H5/Node.js/SQLite 服务端、C3/S3 固件、三色/四色屏渲染和 3D 打印外壳,支持公共托管、本地与自托管部署。

JavaScript69

chess-artist

A python script that can annotate chess games in pgn file with static evaluation or search score of an engine, can anno…

Python73

Volna42BW

Weather station Volna 42BW, Arduino Framework, ESP8266 or ESP32

C91

search

search projects, people, and tags