# Open-Meteo Wetter-API (stdlib-only)

Kostenlose, offene Wetter-API — **kein API-Key nötig**. Perfekt für Wetter-Widgets auf ESP32-Dashboards oder schnelle CLI-Abfragen.

## Basis-URL

```
https://api.open-meteo.com/v1/forecast
```

## Python-Beispiel (nur stdlib)

```python
import urllib.request
import json
from datetime import datetime

def get_weather(lat=48.2082, lon=16.3738, timezone="Europe/Vienna"):
    url = (
        f"https://api.open-meteo.com/v1/forecast?"
        f"latitude={lat}&longitude={lon}"
        f"&current=temperature_2m,relative_humidity_2m"
        f",apparent_temperature,weather_code,wind_speed_10m,precipitation"
        f"&daily=temperature_2m_max,temperature_2m_min,precipitation_sum"
        f"&timezone={timezone}"
    )
    
    req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
    with urllib.request.urlopen(req, timeout=15) as resp:
        data = json.loads(resp.read().decode())
    
    current = data["current"]
    daily = data["daily"]
    
    # Wettercode zu Text
    codes = {
        0: "Klarer Himmel", 1: "Überwiegend klar", 2: "Teilweise bewölkt",
        3: "Bewölkt", 45: "Nebel", 48: "Reifnebel",
        51: "Leichter Nieselregen", 53: "Mäßiger Nieselregen", 55: "Starker Nieselregen",
        61: "Leichter Regen", 63: "Mäßiger Regen", 65: "Starker Regen",
        71: "Leichter Schneefall", 73: "Mäßiger Schneefall", 75: "Starker Schneefall",
        80: "Leichte Regenschauer", 81: "Mäßige Regenschauer", 82: "Starke Regenschauer",
        95: "Gewitter", 96: "Gewitter mit Hagel", 99: "Schweres Gewitter mit Hagel"
    }
    
    return {
        "temp": current["temperature_2m"],
        "feels_like": current["apparent_temperature"],
        "humidity": current["relative_humidity_2m"],
        "wind": current["wind_speed_10m"],
        "precip": current["precipitation"],
        "weather": codes.get(current.get("weather_code", 0), "Unbekannt"),
        "today_max": daily["temperature_2m_max"][0],
        "today_min": daily["temperature_2m_min"][0],
        "today_rain": daily["precipitation_sum"][0]
    }

if __name__ == "__main__":
    w = get_weather()
    print(f"🌡️ {w['temp']}°C (gefühlt {w['feels_like']}°C)")
    print(f"🌧️ {w['weather']}, 💧 {w['humidity']}%")
```

## Verfügbare Parameter

| Parameter | Beschreibung | Beispiel |
|-----------|-------------|----------|
| `latitude` | Breitengrad | `48.2082` |
| `longitude` | Längengrad | `16.3738` |
| `current` | Aktuelle Werte (Komma-separiert) | `temperature_2m,wind_speed_10m` |
| `hourly` | Stündliche Vorhersage | `temperature_2m,precipitation_probability` |
| `daily` | Tageswerte | `temperature_2m_max,temperature_2m_min` |
| `timezone` | Zeitzone | `Europe/Vienna`, `auto` |
| `forecast_days` | Vorhersage-Horizont | `7` |

## Aktuelle Variablen (current)

- `temperature_2m` — Lufttemperatur in 2m Höhe (°C)
- `relative_humidity_2m` — Relative Luftfeuchtigkeit (%)
- `apparent_temperature` — Gefühlte Temperatur (°C)
- `weather_code` — WMO Weather interpretation code (0-99)
- `wind_speed_10m` — Windgeschwindigkeit in 10m Höhe (km/h)
- `precipitation` — Niederschlag (mm)
- `pressure_msl` — Luftdruck auf Meereshöhe (hPa)
- `cloud_cover` — Wolkenbedeckung (%)

## Alternative Endpoints

- **Historische Daten:** `https://archive-api.open-meteo.com/v1/archive?...`
- **Luftqualität:** `https://air-quality-api.open-meteo.com/v1/air-quality?...`
- **Geocoding:** `https://geocoding-api.open-meteo.com/v1/search?name=Wien&count=1`

## Datenquelle

ECMWF (Europäisches Zentrum für mittelfristige Wettervorhersage), NOAA, DWD, MeteoSwiss, u.a.

## Limits

- Keine harten Limits dokumentiert
- Fair-use: max ~10.000 calls/day empfohlen
- Kommerzielle Nutzung erlaubt (CC BY 4.0)

## WMO Weather Codes (vollständig)

| Code | Bedeutung |
|------|-----------|
| 0 | Klarer Himmel |
| 1, 2, 3 | Klar → Teilweise bewölkt → Bewölkt |
| 45, 48 | Nebel / Ablagerender Reifnebel |
| 51, 53, 55 | Nieselregen (leicht → mäßig → stark) |
| 56, 57 | Gefrierender Nieselregen |
| 61, 63, 65 | Regen (leicht → mäßig → stark) |
| 66, 67 | Gefrierender Regen |
| 71, 73, 75 | Schneefall (leicht → mäßig → stark) |
| 77 | Schneekörner |
| 80, 81, 82 | Regenschauer (leicht → mäßig → stark) |
| 85, 86 | Schneeschauer |
| 95 | Gewitter (leicht/mäßig) |
| 96, 99 | Gewitter mit Hagel |

## Weitere Info

Doku: https://open-meteo.com/en/docs
