From 3a2d8037880d9775e67ee89918ee7c44d4231657 Mon Sep 17 00:00:00 2001 From: Stefan Koelle Date: Fri, 7 Aug 2026 21:36:08 +0200 Subject: [PATCH] documentation: profiles feature --- AGENTS.md | 5 ++++- README.md | 37 ++++++++++++++++++++++++------------- SPEC.md | 26 +++++++++++++++++++------- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index da97ee7..dfedd5d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,7 +11,7 @@ MVG Departures Monitor: FastAPI-App für Münchner U-/S-Bahn-Abfahrtsanzeige. Mo | `app/main.py` | FastAPI-App, Endpunkte, Caching, MVG-API-Aufrufe | | `app/config.py` | Config-Loader: YAML → Dataclasses | | `app/templates/index.html` | Jinja2-HTML-Template (Mobile-UI) | -| `config.yaml` | Stationskonfiguration (User-Input) | +| `config.yaml` | Profil- und Stationskonfiguration (User-Input) | | `requirements.txt` | Python-Dependencies | | `Dockerfile` | Container-Build | | `.github/workflows/build.yml` | CI/CD | @@ -60,6 +60,9 @@ Kein Linter konfiguriert. Bei Bedarf: `ruff check app/` oder `black app/` ### Neue Station hinzufügen → Nur `config.yaml` editieren, kein Code nötig +### Neues Profil hinzufügen +→ `config.yaml` unter `profiles:` neuen Eintrag mit `name:` und `stations:` ergänzen + ### Neuen Transporttyp hinzufügen → `TYPE_MAP` und `ICON_MAP` in `main.py` erweitern, CSS-Klasse `.icon-X` in `index.html` hinzufügen diff --git a/README.md b/README.md index c110967..48664f6 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,9 @@ Kompakter Abfahrtsmonitor fuer MVG U-Bahn und S-Bahn (Muenchen), primaer fuer mo - Konfigurierbare Stationsliste (`config.yaml`) mit Typ (UBAHN/SBAHN/TRAM/BUS) - Ausschluss-Filter pro Station: nur unerwuenschte Zielrichtungen werden ausgeblendet, neue/unbekannte Ziele werden automatisch weiter angezeigt +- Profile zur Gruppierung von Stationen (z.B. "Hinfahrt" und "Rückfahrt") + - Klickbare Kacheln zum Profilwechsel (nur bei >1 Profil) + - URL-Param `?profile=` + Auto-Refresh - Zwei Endpunkte: - `/` — mobile-optimierte HTML-Ansicht mit Auto-Refresh (alle 60s per Meta-Refresh) - `/api/departures` — JSON-Ausgabe derselben Daten @@ -24,18 +27,24 @@ refresh_seconds: 60 cache_seconds: 20 departures_limit: 10 -stations: - - name: "Josephsburg, München" - type: "UBAHN" - exclude_destinations: - - "Messestadt Ost" - - "Messestadt West" - - - name: "Berg am Laim, München" - type: "SBAHN" - exclude_destinations: - - "Erding" - - "Markt Schwaben" +profiles: + - name: "Hinfahrt" + stations: + - name: "Josephsburg, München" + type: "UBAHN" + exclude_destinations: + - "Messestadt Ost" + - "Messestadt West" + - name: "Berg am Laim, München" + type: "SBAHN" + exclude_destinations: + - "Erding" + - "Markt Schwaben" + - name: "Rückfahrt" + stations: + - name: "Grosshadern, München" + type: "UBAHN" + exclude_destinations: [] ``` `exclude_destinations` filtert per exaktem `destination`-Stringvergleich. Alles was @@ -102,7 +111,9 @@ https://www.mvg.de/api/bgw-pt/v3/departures?globalId=de:09162:910&limit=10&trans | Route | Beschreibung | |---|---| | `/` | HTML-Ansicht, mobile-optimiert, Auto-Refresh alle 60s | -| `/api/departures` | JSON-Liste aller gefilterten Abfahrten | +| `/?profile=` | HTML-Ansicht für ein bestimmtes Profil | +| `/api/departures` | JSON-Liste aller gefilterten Abfahrten (erstes Profil als Fallback) | +| `/api/departures?profile=` | JSON-Liste für ein bestimmtes Profil | | `/healthz` | Healthcheck fuer Docker/Watchtower | ## Projektstruktur diff --git a/SPEC.md b/SPEC.md index 793321e..b7e24f0 100644 --- a/SPEC.md +++ b/SPEC.md @@ -42,7 +42,9 @@ config.yaml ↓ load_config() → AppConfig (Dataclass) ↓ -Für jede Station: +Profile auswählen (?profile= param oder erstes Profil) + ↓ +Für jede Station im aktiven Profil: resolve_station_id(name) → station_id (mit Memory-Cache) ↓ MvgApi(station_id).departures(limit, transport_types) @@ -61,7 +63,9 @@ Response: JSON oder HTML-Template | Route | Methode | Beschreibung | |---|---|---| | `/` | GET | Mobile HTML-Ansicht, Auto-Refresh alle 60s | -| `/api/departures` | GET | JSON-Liste aller gefilterten Abfahrten | +| `/?profile=` | GET | HTML-Ansicht für ein bestimmtes Profil | +| `/api/departures` | GET | JSON-Liste aller gefilterten Abfahrten (erstes Profil als Fallback) | +| `/api/departures?profile=` | GET | JSON-Liste für ein bestimmtes Profil | | `/healthz` | GET | Healthcheck (`{"status": "ok"}`) | ## 6. Konfiguration (`config.yaml`) @@ -71,11 +75,18 @@ refresh_seconds: 60 # Meta-Refresh-Intervall (HTML) cache_seconds: 20 # API-Cache pro Station departures_limit: 10 # Max. Abfahrten pro Station -stations: - - name: "Station Name, München" - type: "UBAHN" # UBAHN | SBAHN | TRAM | BUS - exclude_destinations: # Exakter Stringvergleich - - "Zielstation" +profiles: + - name: "Hinfahrt" # Profilname (einzigartig) + stations: + - name: "Station Name, München" + type: "UBAHN" # UBAHN | SBAHN | TRAM | BUS + exclude_destinations: # Exakter Stringvergleich + - "Zielstation" + - name: "Rückfahrt" + stations: + - name: "Andere Station" + type: "SBAHN" + exclude_destinations: [] ``` ### Filter-Logik @@ -93,6 +104,7 @@ stations: ## 8. UI - Dunkles Theme (`#111417` Background) +- Profil-Kacheln (nur bei >1 Profil): 50% Breite, Basis `#1e242b`, aktiv `#005ca9` (MVG-Blau) - Farbliche Unterscheidung: U-Bahn (blau `#005ca9`), S-Bahn (grün `#00933b`), Tram (rot `#e2001a`), Bus (grau `#55545a`) - Anzeige: Linie, Ziel, Abfahrtszeit, Verspätung (gelb/rot), Entfall, Störungsmeldungen - Responsive, für Smartphone-First optimiert