Initial commit

This commit is contained in:
2026-03-19 17:30:04 +01:00 Verified
commit 87f585b6c0
98 changed files with 2746 additions and 0 deletions
+128
View File
@@ -0,0 +1,128 @@
# icons/__init__.py
from pathlib import Path
from PIL import Image
def _open_icon(*files_folder) -> Image.Image:
"""Helper function to load images cleanly."""
return Image.open(Path(__file__).parent.joinpath(*files_folder))
class Icon:
wind = {
0.0: ("N", _open_icon("wind", "N.bmp")),
22.5: ("NNE", _open_icon("wind", "NNE.bmp")),
45.0: ("NE", _open_icon("wind", "NE.bmp")),
67.5: ("ENE", _open_icon("wind", "ENE.bmp")),
90.0: ("E", _open_icon("wind", "E.bmp")),
112.5: ("ESE", _open_icon("wind", "ESE.bmp")),
135.0: ("SE", _open_icon("wind", "SE.bmp")),
157.5: ("SSE", _open_icon("wind", "SSE.bmp")),
180.0: ("S", _open_icon("wind", "S.bmp")),
202.5: ("SSW", _open_icon("wind", "SSW.bmp")),
225.0: ("SW", _open_icon("wind", "SW.bmp")),
247.5: ("WSW", _open_icon("wind", "WSW.bmp")),
270.0: ("W", _open_icon("wind", "W.bmp")),
292.5: ("WNW", _open_icon("wind", "WNW.bmp")),
315.0: ("NW", _open_icon("wind", "NW.bmp")),
337.5: ("NNW", _open_icon("wind", "NNW.bmp")),
}
moon = {
0.0: _open_icon("moon", "1.bmp"),
16.7: _open_icon("moon", "2.bmp"),
33.3: _open_icon("moon", "3.bmp"),
50.0: _open_icon("moon", "4.bmp"),
66.7: _open_icon("moon", "5.bmp"),
83.3: _open_icon("moon", "6.bmp"),
100.0: _open_icon("moon", "7.bmp"),
}
warning = {
"fire": _open_icon("warnings", "fire.png"),
"wind": _open_icon("warnings", "wind.bmp"),
"water_shortage": _open_icon("warnings", "water_shortage.png"),
"temperature_high": _open_icon("warnings", "temperature_high.png"),
"no_wifi": _open_icon("warnings", "no_wifi.bmp"),
"RED": _open_icon("warnings", "RED.png"),
"YELLOW": _open_icon("warnings", "YELLOW.png"),
"ORANGE": _open_icon("warnings", "ORANGE.png"),
}
default = {
"indoor": _open_icon("default", "indoor.bmp"),
"temp_low": _open_icon("default", "temp_low.bmp"),
"temp_mid": _open_icon("default", "temp_mid.bmp"),
"temp_high": _open_icon("default", "temp_high.bmp"),
"humidity": _open_icon("default", "humidity.bmp"),
"pressure": _open_icon("default", "pressure.bmp"),
"sunrise": _open_icon("default", "sunrise.bmp"),
"sunset": _open_icon("default", "sunset.bmp"),
"dew": _open_icon("default", "dew.bmp"),
"wind": _open_icon("default", "wind.bmp"),
"wind_gust": _open_icon("default", "wind_gust.bmp"),
"uv": _open_icon("default", "uv.bmp"),
}
_weather_id_map = {
0: ("clear", "breezy"),
1: ("partly_cloudy", "breezy"),
2: ("partly_cloudy", "breezy"),
3: ("partly_cloudy", "windy_mostly_cloudy"),
4: ("mostly_cloudy", "windy_mostly_cloudy"),
5: ("mostly_cloudy", "windy_mostly_cloudy"),
6: ("fog", "fog"),
7: ("scattered_showers", "scattered_showers"),
8: ("scattered_showers", "scattered_showers"),
9: ("heavy_rain", "heavy_rain"),
10: ("mix_rainfall", "mix_rainfall"),
11: ("sleet", "sleet"),
12: ("sleet", "sleet"),
13: ("sleet", "sleet"),
14: ("snow", "breezy_snow"),
15: ("snow", "breezy_snow"),
16: ("blizzard", "blizzard"),
17: ("drizzle", "drizzle"),
18: ("rain", "rain"),
19: ("heavy_rain", "heavy_rain"),
20: ("scattered_thunderstorm", "scattered_thunderstorm"),
21: ("sleet", "sleet"),
22: ("sleet", "sleet"),
23: ("sleet", "sleet"),
24: ("snow", "breezy_snow"),
25: ("snow", "breezy_snow"),
26: ("blizzard", "blizzard"),
}
_forecast_icons = {"day": {}, "night": {}}
for forecast_pic in Path(__file__).parent.joinpath("forecast", "day").glob("*.png"):
_forecast_icons["day"][forecast_pic.stem] = _open_icon(
"forecast", "day", forecast_pic.name
)
for forecast_pic in (
Path(__file__).parent.joinpath("forecast", "night").glob("*.png")
):
_forecast_icons["night"][forecast_pic.stem] = _open_icon(
"forecast", "night", forecast_pic.name
)
@classmethod
def get_forecast(
cls,
id: int,
time_of_day: str,
wind_strength: float,
wind_speed_limit: float = 12.0,
) -> Image.Image:
"""Fetches the correct forecast icon instantly without looping."""
icon_names = cls._weather_id_map.get(id, ("clear", "breezy"))
selected_icon_name = (
icon_names[1] if wind_strength >= wind_speed_limit else icon_names[0]
)
return cls._forecast_icons[time_of_day][selected_icon_name]