No description
Find a file
radek 17c5d79b1c
All checks were successful
Build and Test / test (push) Successful in 16s
Build and Test / build (push) Successful in 2m21s
Update .forgejo/workflows/ci.yaml
2025-04-10 08:09:47 +00:00
.forgejo/workflows Update .forgejo/workflows/ci.yaml 2025-04-10 08:09:47 +00:00
.github/workflows Initial import 2025-04-09 22:39:41 +02:00
kubernetes Initial import 2025-04-09 22:39:41 +02:00
src Initial import 2025-04-09 22:39:41 +02:00
tests Initial import 2025-04-09 22:39:41 +02:00
.gitignore Initial import 2025-04-09 22:39:41 +02:00
Dockerfile Initial import 2025-04-09 22:38:34 +02:00
init.sh Initial import 2025-04-09 22:39:41 +02:00
pyproject.toml Initial import 2025-04-09 22:39:41 +02:00
README.md Initial import 2025-04-09 22:39:41 +02:00
requirements.txt Initial import 2025-04-09 22:39:41 +02:00
setup.py Initial import 2025-04-09 22:39:41 +02:00

YR Weather Forecast

Aplikace pro stahování a ukládání předpovědí počasí z norského meteorologického institutu yr.no.

Popis

Tato aplikace pravidelně stahuje hodinové předpovědi počasí pro nakonfigurované lokality z API yr.no a ukládá je do PostgreSQL databáze. Aplikace je navržena pro běh jako Kubernetes cronjob v pravidelných intervalech (každých 6 hodin).

Pro každou lokalitu aplikace stahuje následující meteorologické údaje:

  • Tlak vzduchu
  • Teplota vzduchu
  • Pravděpodobnost srážek
  • Intenzita srážek
  • Směr větru
  • Rychlost větru
  • Nárazy větru
  • Relativní vlhkost
  • Rosný bod
  • Procenta (poměr) oblačnosti
  • Celkový charakter počasí (slunečno, polojasno, oblačno, ...)

Data jsou uložena v databázi tak, aby bylo možné:

  • Vyhodnocovat změny předpovědí v čase (trendy předpovědí)
  • Porovnávat odchylky a trendy odchylek předpovědi v určitý čas se skutečnými naměřenými klimatickými parametry

Databázové schéma

Aplikace používá následující tabulky:

  • locations - Seznam lokalit
  • forecast_runs - Seznam běhů stahování předpovědí (každý běh má jedinečné ID)
  • weather_forecasts - Samotné předpovědi počasí

Sloupce forecast_date a forecast_hour byly zvoleny pro optimalizaci vyhledávání. Tento přístup umožňuje rychlé dotazování na předpovědi pro konkrétní datum nebo konkrétní hodinu dne. Zvyšuje to efektivitu dotazů typu "všechny předpovědi pro konkrétní lokalitu v konkrétní den" nebo "předpovědi pro konkrétní hodinu napříč lokalitami". Indexování podle těchto sloupců je výrazně efektivnější než dotazování na časové rozmezí.

Technologie

  • Python 3.10+
  • SQLAlchemy ORM
  • PostgreSQL
  • asyncio a aiohttp pro asynchronní zpracování
  • pytest pro testování
  • Docker
  • Kubernetes

Instalace a spuštění

Lokální spuštění

  1. Naklonujte repozitář:

    git clone https://github.com/yourusername/yr-weather-forecast.git
    cd yr-weather-forecast
    
  2. Vytvořte a aktivujte virtuální prostředí:

    python -m venv venv
    source venv/bin/activate  # Na Windows: venv\Scripts\activate
    
  3. Nainstalujte závislosti:

    pip install -r requirements.txt
    
  4. Nastavte proměnné prostředí pro připojení k databázi:

    export POSTGRES_HOST=localhost:5432
    export POSTGRES_DB=weather
    export POSTGRES_USER=postgres
    export POSTGRES_PASSWORD=postgres
    
  5. Spusťte aplikaci:

    python -m src.main
    

Nasazení do Kubernetes

  1. Upravte soubor kubernetes/secrets.yaml s přihlašovacími údaji k databázi.

  2. Upravte kubernetes/configmap.yaml podle potřeby (přidejte další lokality).

  3. Vytvořte Kubernetes objekty:

    kubectl apply -f kubernetes/configmap.yaml
    kubectl apply -f kubernetes/secrets.yaml
    kubectl apply -f kubernetes/cronjob.yaml
    

Konfigurace

Konfigurační soubor config.yaml obsahuje:

  • user_agent: Identifikátor pro API požadavky
  • locations: Seznam lokalit pro stažení předpovědí

Příklad konfigurace:

user_agent: "yr-weather-forecast/1.0 (contact@example.com)"
locations:
  - code: "prague"
    name: "Prague"
    latitude: 50.0755
    longitude: 14.4378
    altitude: 235
    note: "Hlavní město České republiky"
  - code: "brno"
    name: "Brno"
    latitude: 49.1951
    longitude: 16.6068
    altitude: 237
    note: "Druhé největší město v České republice"

Testování

Spuštění testů:

pytest

Spuštění testů s pokrytím:

pytest --cov=src/ --cov-report=html

Licence

MIT