Dashboard: refonte design « instrument 1-bit » (jauges graduées, polices vendorisées, glyphes météo)
- Identité noir & blanc pur (zéro gris, anti-ghosting e-ink) ; hachures pour conso/alarme - Typo vendorisée : Archivo (mots) + JetBrains Mono (nombres tabulaires), @font-face base64 - Jauge signature : noir = restant, repère seuil 20 %, hachures sous le seuil - Météo : glyphes 1-bit en silhouette (weather.kind) au lieu d'emoji couleur - Layout rééquilibré (plus de débordement), états dégradés soignés - dev/preview.py : aperçu hors-ligne du template
This commit is contained in:
@@ -9,29 +9,30 @@ from config import config
|
||||
|
||||
API_URL = "https://api.open-meteo.com/v1/forecast"
|
||||
|
||||
# Codes WMO -> (libellé court FR, emoji). Suffisant pour un dashboard e-ink.
|
||||
# Codes WMO -> (libellé court FR, kind). `kind` pilote le glyphe 1-bit dessiné côté
|
||||
# template (clear/partly/cloudy/fog/rain/snow/storm) : pas d'emoji couleur sur e-ink.
|
||||
WMO = {
|
||||
0: ("Dégagé", "☀"),
|
||||
1: ("Peu nuageux", "🌤"),
|
||||
2: ("Nuageux", "⛅"),
|
||||
3: ("Couvert", "☁"),
|
||||
45: ("Brouillard", "🌫"),
|
||||
48: ("Brouillard givrant", "🌫"),
|
||||
51: ("Bruine légère", "🌦"),
|
||||
53: ("Bruine", "🌦"),
|
||||
55: ("Bruine forte", "🌦"),
|
||||
61: ("Pluie faible", "🌧"),
|
||||
63: ("Pluie", "🌧"),
|
||||
65: ("Pluie forte", "🌧"),
|
||||
71: ("Neige faible", "🌨"),
|
||||
73: ("Neige", "🌨"),
|
||||
75: ("Neige forte", "🌨"),
|
||||
80: ("Averses", "🌦"),
|
||||
81: ("Averses", "🌧"),
|
||||
82: ("Fortes averses", "⛈"),
|
||||
95: ("Orage", "⛈"),
|
||||
96: ("Orage + grêle", "⛈"),
|
||||
99: ("Orage + grêle", "⛈"),
|
||||
0: ("Dégagé", "clear"),
|
||||
1: ("Peu nuageux", "partly"),
|
||||
2: ("Nuageux", "partly"),
|
||||
3: ("Couvert", "cloudy"),
|
||||
45: ("Brouillard", "fog"),
|
||||
48: ("Brouillard givrant", "fog"),
|
||||
51: ("Bruine légère", "rain"),
|
||||
53: ("Bruine", "rain"),
|
||||
55: ("Bruine forte", "rain"),
|
||||
61: ("Pluie faible", "rain"),
|
||||
63: ("Pluie", "rain"),
|
||||
65: ("Pluie forte", "rain"),
|
||||
71: ("Neige faible", "snow"),
|
||||
73: ("Neige", "snow"),
|
||||
75: ("Neige forte", "snow"),
|
||||
80: ("Averses", "rain"),
|
||||
81: ("Averses", "rain"),
|
||||
82: ("Fortes averses", "storm"),
|
||||
95: ("Orage", "storm"),
|
||||
96: ("Orage + grêle", "storm"),
|
||||
99: ("Orage + grêle", "storm"),
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +43,7 @@ class Weather:
|
||||
temp: float | None = None
|
||||
feels_like: float | None = None
|
||||
label: str = ""
|
||||
icon: str = ""
|
||||
kind: str = ""
|
||||
temp_min: float | None = None
|
||||
temp_max: float | None = None
|
||||
precip_prob: int | None = None
|
||||
@@ -68,7 +69,7 @@ async def fetch_weather() -> Weather:
|
||||
cur = data.get("current", {})
|
||||
daily = data.get("daily", {})
|
||||
code = int(cur.get("weather_code", -1))
|
||||
label, icon = WMO.get(code, ("—", "·"))
|
||||
label, kind = WMO.get(code, ("—", "cloudy"))
|
||||
|
||||
def _first(key: str):
|
||||
vals = daily.get(key) or []
|
||||
@@ -79,7 +80,7 @@ async def fetch_weather() -> Weather:
|
||||
temp=cur.get("temperature_2m"),
|
||||
feels_like=cur.get("apparent_temperature"),
|
||||
label=label,
|
||||
icon=icon,
|
||||
kind=kind,
|
||||
temp_min=_first("temperature_2m_min"),
|
||||
temp_max=_first("temperature_2m_max"),
|
||||
precip_prob=_first("precipitation_probability_max"),
|
||||
|
||||
Reference in New Issue
Block a user