~xenrox/status-display

33f8059dffd7cdb0e74c6439b2bd1daa5fee0bff — Thorben Günther 3 years ago 64034ff
Add module for weather
5 files changed, 92 insertions(+), 3 deletions(-)

M README.md
A config.ini
A modules/weather.py
M status-display.py
A weathericons-regular-webfont.ttf
M README.md => README.md +4 -3
@@ 1,7 1,8 @@
Code for updating my 7.5" Waveshare e-ink status display, which is connected to a Raspberry Pi Zero.

Based on [waveshare-code].

[waveshare-code]: https://github.com/waveshare/e-Paper
Based on [waveshare's code]. Uses [weather-icons].

apt-get install python3-pillow python3-rpi.gpio python3-spidev fonts-roboto

[waveshare's code]: https://github.com/waveshare/e-Paper
[weather-icons]: https://erikflowers.github.io/weather-icons/

A config.ini => config.ini +4 -0
@@ 0,0 1,4 @@
[weather]
latitude=
longitude=
apikey=

A modules/weather.py => modules/weather.py +70 -0
@@ 0,0 1,70 @@
import requests

# Translation: https://erikflowers.github.io/weather-icons/api-list.html
ICONS = {
    200: {"day": "\uf010", "night": "\uf02d"},
    201: {"day": "\uf010", "night": "\uf02d"},
    202: {"day": "\uf010", "night": "\uf02d"},
    210: {"day": "\uf005", "night": "\uf025"},
    211: {"day": "\uf005", "night": "\uf025"},
    212: {"day": "\uf005", "night": "\uf025"},
    221: {"day": "\uf005", "night": "\uf025"},
    230: {"day": "\uf010", "night": "\uf02d"},
    231: {"day": "\uf010", "night": "\uf02d"},
    232: {"day": "\uf010", "night": "\uf02d"},
    300: {"day": "\uf00b", "night": "\uf02b"},
    301: {"day": "\uf00b", "night": "\uf02b"},
    302: {"day": "\uf008", "night": "\uf028"},
    310: {"day": "\uf006", "night": "\uf026"},
    311: {"day": "\uf008", "night": "\uf028"},
    312: {"day": "\uf008", "night": "\uf028"},
    313: {"day": "\uf009", "night": "\uf029"},
    314: {"day": "\uf008", "night": "\uf028"},
    321: {"day": "\uf00b", "night": "\uf02b"},
    500: {"day": "\uf00b", "night": "\uf02b"},
    501: {"day": "\uf008", "night": "\uf028"},
    502: {"day": "\uf008", "night": "\uf028"},
    503: {"day": "\uf008", "night": "\uf028"},
    504: {"day": "\uf008", "night": "\uf028"},
    511: {"day": "\uf006", "night": "\uf026"},
    520: {"day": "\uf009", "night": "\uf029"},
    521: {"day": "\uf009", "night": "\uf029"},
    522: {"day": "\uf009", "night": "\uf029"},
    531: {"day": "\uf00e", "night": "\uf02c"},
    600: {"day": "\uf00a", "night": "\uf02a"},
    601: {"day": "\uf00a", "night": "\uf02a"},
    602: {"day": "\uf0b2", "night": "\uf0b2"},
    611: {"day": "\uf006", "night": "\uf026"},
    612: {"day": "\uf006", "night": "\uf026"},
    613: {"day": "\uf006", "night": "\uf026"},
    615: {"day": "\uf006", "night": "\uf026"},
    616: {"day": "\uf006", "night": "\uf026"},
    620: {"day": "\uf006", "night": "\uf026"},
    621: {"day": "\uf00a", "night": "\uf02a"},
    622: {"day": "\uf00a", "night": "\uf02a"},
    701: {"day": "\uf009", "night": "\uf029"},
    711: {"day": "\uf062", "night": "\uf062"},
    721: {"day": "\uf0b6", "night": "\uf0b6"},
    731: {"day": "\uf063", "night": "\uf063"},
    741: {"day": "\uf003", "night": "\uf04a"},
    751: {"day": "\uf082", "night": "\uf082"},
    761: {"day": "\uf063", "night": "\uf063"},
    762: {"day": "\uf063", "night": "\uf063"},
    771: {"day": "\uf000", "night": "\uf022"},
    781: {"day": "\uf056", "night": "\uf056"},
    800: {"day": "\uf00d", "night": "\uf02e"},
    801: {"day": "\uf000", "night": "\uf022"},
    802: {"day": "\uf000", "night": "\uf022"},
    803: {"day": "\uf000", "night": "\uf022"},
    804: {"day": "\uf002", "night": "\uf086"},
}


def get_weather(token, lat, lon):
    r = requests.get(
        "https://api.openweathermap.org/data/2.5/onecall?lat={}&lon={}&appid={}&eclude=minutely,hourly&units=metric".format(
            lat, lon, token
        )
    )
    data = r.json()
    return ICONS[data["current"]["weather"][0]["id"]]["day"]

M status-display.py => status-display.py +14 -0
@@ 1,8 1,15 @@
import configparser

import driver as epd
from modules.timestamp import timestamp_str
from modules.weather import get_weather
from PIL import Image, ImageDraw, ImageFont

font35 = ImageFont.truetype("Roboto-Bold.ttf", 35)
w_font30 = ImageFont.truetype("./weathericons-regular-webfont.ttf", 30)

config = configparser.ConfigParser()
config.read("config.ini")

epd = epd.EPD()
epd.init()


@@ 12,6 19,13 @@ draw = ImageDraw.Draw(Himage)

draw.text((520, 0), timestamp_str(), font=font35, fill=0)

icon = get_weather(
    config.get("weather", "apikey"),
    config.get("weather", "latitude"),
    config.get("weather", "longitude"),
)
draw.text((20, 0), icon, font=w_font30, fill=0)

buffer = epd.getbuffer(Himage)
epd.clear()
epd.display(buffer)

A weathericons-regular-webfont.ttf => weathericons-regular-webfont.ttf +0 -0