docs: expand pegels API documentation

This commit is contained in:
Matthias Jacob committed 2026-10-14 05:33:29 +02:00
1 parent 7e9dc86446
commit bc70066bc2
2 files changed
+238 -140

No files matched your search

+150 -137
View File
@@ -1,73 +1,40 @@
# Sachsen Pegel Proxy (HWIMS → JSON)
# Sachsen Pegel Proxy
Small FastAPI service that converts the Sachsen HWIMS RSS feed into clean, machine-readable JSON.
Kleiner FastAPI-Dienst, der Pegelstationen und Messwerte aus dem sächsischen Hochwasser- und Wasserstands-Informationssystem (HWIMS) als JSON bereitstellt. Die Daten stammen aus der offiziellen Stationsübersicht und den RSS-Feeds der Stationen.
Perfect for use with Home Assistant or other automation tools.
## Live-Dienst und API-Dokumentation
## 🌐 Live Service
- API-Basis-URL: <https://sachsen-pegel-proxy.vercel.app>
- Interaktive Swagger-Dokumentation: <https://sachsen-pegel-proxy.vercel.app/docs>
- Alternatives ReDoc: <https://sachsen-pegel-proxy.vercel.app/redoc>
- OpenAPI-Schema: <https://sachsen-pegel-proxy.vercel.app/openapi.json>
- Running instance: [https://sachsen-pegel-proxy.vercel.app/](https://sachsen-pegel-proxy.vercel.app/)
- API docs: [https://sachsen-pegel-proxy.vercel.app/docs](https://sachsen-pegel-proxy.vercel.app/docs)
Alle API-Antworten sind JSON. Die Endpunkte benötigen keine Authentifizierung.
---
## Endpunkte
## ✨ Features
| Methode | Pfad | Beschreibung |
| --- | --- | --- |
| `GET` | `/api/pegel` | Verfügbare Pegelstationen auflisten |
| `GET` | `/api/pegel/{pegel_id}` | Messwerte und Feed-Historie einer Station abrufen |
* Converts RSS → structured JSON
* Supports **any Pegel ID**
* Extracts:
### Stationsliste
* water level (cm)
* flow (m³/s)
* flood alert level
* timestamp (ISO format)
* Provides:
`GET /api/pegel`
* latest value
* full history from feed
Optional kann die Anzahl der zurückgegebenen Stationen mit `limit` begrenzt werden:
---
## 🔗 Example
Request:
```
GET /api/pegel/560021
```
Response:
```json
{
"station_id": "560021",
"station_title": "Golzern 1 / Vereinigte Mulde",
"latest": {
"timestamp": "2026-01-01T12:00:00+00:00",
"water_level_cm": 98,
"flow_m3s": 20.8,
"flood_alert_level": "Kein Hochwasser"
}
}
```
Index request (all discovered stations):
```
GET /api/pegel
```
Index request with limit:
```
```text
GET /api/pegel?limit=5
```
Index response shape:
`limit` muss eine positive ganze Zahl sein. `count` ist die Anzahl der tatsächlich zurückgegebenen Elemente; `total_available` gibt die Gesamtzahl der gefundenen Stationen an und wird durch `limit` nicht verändert.
Beispielantwort:
```json
{
"count": 5,
"count": 1,
"total_available": 312,
"items": [
{
@@ -77,113 +44,159 @@ Index response shape:
}
],
"source": "https://www.umwelt.sachsen.de/umwelt/infosysteme/hwims/portal/web/wasserstand-uebersicht",
"fetched_at": "2026-05-05T01:00:00+00:00",
"warnings": [
"optional, only present for partial failures"
]
"fetched_at": "2026-05-05T00:15:00+00:00"
}
```
---
| Feld | Typ | Bedeutung |
| --- | --- | --- |
| `count` | integer | Anzahl der Elemente in `items` |
| `total_available` | integer | Gesamtzahl der gefundenen Stationen vor Anwendung von `limit` |
| `items` | array | Stationen mit `station_id`, `station_title` und RSS-Feed-URL `source` |
| `station_title` | string oder `null` | Stationsname, sofern er aus der Quelle ermittelt werden konnte |
| `source` | string | Verwendete Discovery-Quelle; beim Cache-Fallback der Wert `"cache"` |
| `fetched_at` | string | Zeitpunkt der Antworterstellung als ISO-8601-Zeitstempel |
| `warnings` | array, optional | Hinweise auf Fehler der Discovery-Quelle, wenn ein Cache-Fallback verwendet wurde |
| `cache_fetched_at` | string, optional | Zeitpunkt, an dem der verwendete Discovery-Cache geladen wurde; nur beim Cache-Fallback |
## 🚀 Local Development
Die Stationsübersicht wird intern 15 Minuten zwischengespeichert. Ist die Quelle vorübergehend nicht erreichbar, liefert der Dienst vorhandene Cache-Daten mit `warnings` und `cache_fetched_at`. Gibt es keinen verwendbaren Cache, antwortet der Endpunkt mit HTTP `502`.
### Messwerte einer Station
`GET /api/pegel/{pegel_id}`
Die Pegel-ID muss aus mindestens sechs Ziffern bestehen. Der Endpunkt liefert alle Einträge, die im RSS-Feed der Station verfügbar sind. `latest` ist der neueste Messwert und entspricht dem ersten Eintrag in `entries`.
```text
GET /api/pegel/560021
```
Beispielantwort:
```json
{
"station_id": "560021",
"station_title": "Golzern 1 / Vereinigte Mulde",
"count": 2,
"latest": {
"timestamp": "2026-05-05T02:15:00+02:00",
"title": "Wasserstand und Durchfluss für 05.05.2026 02:15 Uhr (MESZ)",
"water_level_cm": 98.0,
"flow_m3s": 20.8,
"flood_alert_level": "Kein Hochwasser"
},
"entries": [
{
"timestamp": "2026-05-05T02:15:00+02:00",
"title": "Wasserstand und Durchfluss für 05.05.2026 02:15 Uhr (MESZ)",
"water_level_cm": 98.0,
"flow_m3s": 20.8,
"flood_alert_level": "Kein Hochwasser"
},
{
"timestamp": "2026-05-05T02:00:00+02:00",
"title": "Wasserstand und Durchfluss für 05.05.2026 02:00 Uhr (MESZ)",
"water_level_cm": 98.0,
"flow_m3s": 20.8,
"flood_alert_level": "Kein Hochwasser"
}
],
"source": "https://www.umwelt.sachsen.de/umwelt/infosysteme/hwims/portal/web/feed/wasserstand-pegel-560021",
"fetched_at": "2026-05-05T00:16:00+00:00"
}
```
| Feld | Typ | Bedeutung |
| --- | --- | --- |
| `station_id` | string | Angefragte Pegel-ID |
| `station_title` | string oder `null` | Stationsname aus dem RSS-Feed |
| `count` | integer | Anzahl der vom Feed gelieferten Einträge |
| `latest` | Objekt | Neuester Eintrag; identisch mit `entries[0]` |
| `entries` | array | Feed-Einträge in der Reihenfolge der Quelle, normalerweise neueste zuerst |
| `timestamp` | string oder `null` | Messzeitpunkt als ISO-8601 mit Zeitzonenoffset |
| `title` | string oder `null` | Originaltitel des RSS-Eintrags |
| `water_level_cm` | number oder `null` | Wasserstand in Zentimetern |
| `flow_m3s` | number oder `null` | Durchfluss in Kubikmetern pro Sekunde |
| `flood_alert_level` | string oder `null` | Meldestufe als Text |
| `source` | string | URL des verwendeten RSS-Feeds |
| `fetched_at` | string | Zeitpunkt des Abrufs durch die API als UTC-Zeitstempel |
Ein Messwert ist `null`, wenn er im jeweiligen RSS-Eintrag fehlt oder nicht erkannt werden kann. Zeitstempel werden, wenn möglich, aus der Uhrzeit im RSS-Titel gebildet; andernfalls verwendet die API das Datumsfeld des Feeds. Sommer- und Winterzeit werden als Offset berücksichtigt.
## Fehlerantworten
Fehler der API enthalten ein JSON-Objekt mit dem Feld `detail`.
| HTTP-Status | Ursache | Beispiel für `detail` |
| --- | --- | --- |
| `400` | `limit` ist kleiner oder gleich null | `Ungültiger limit-Parameter` |
| `400` | Pegel-ID hat nicht mindestens sechs Ziffern | `Ungültige Pegel-ID` |
| `404` | Feed enthält keine Einträge für die Pegel-ID | `Keine Daten gefunden` |
| `422` | Query-Parameter kann nicht als Zahl interpretiert werden | FastAPI-Validierungsfehler |
| `502` | Stationsübersicht nicht erreichbar und kein Cache vorhanden | `Upstream-Discovery nicht verfügbar` |
## Beispiele
Mit `curl`:
```bash
curl "https://sachsen-pegel-proxy.vercel.app/api/pegel?limit=5"
curl "https://sachsen-pegel-proxy.vercel.app/api/pegel/560021"
```
### Home Assistant
```yaml
rest:
- resource: "https://sachsen-pegel-proxy.vercel.app/api/pegel/560021"
scan_interval: 300
sensor:
- name: "Pegel Golzern Wasserstand"
value_template: "{{ value_json.latest.water_level_cm }}"
unit_of_measurement: "cm"
json_attributes_path: "$.latest"
json_attributes:
- timestamp
- flow_m3s
- flood_alert_level
```
## Lokale Entwicklung
```bash
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
uvicorn api.app:app --reload
```
Open:
Lokal erreichbare Endpunkte:
```
http://127.0.0.1:8000/api/pegel
http://127.0.0.1:8000/api/pegel/560021
```
- API: <http://127.0.0.1:8000/api/pegel>
- Swagger: <http://127.0.0.1:8000/docs>
- ReDoc: <http://127.0.0.1:8000/redoc>
- OpenAPI: <http://127.0.0.1:8000/openapi.json>
API docs:
## Bereitstellung auf Vercel
```
http://127.0.0.1:8000/docs
```
---
## ☁️ Deploy (Vercel)
This repository does not include platform-specific deployment configuration.
Deploy by connecting the repo in Vercel (or using the CLI), then verify the API endpoints after deployment.
Das Repository enthält keine plattformspezifische Deployment-Konfiguration. Das Projekt kann mit Vercel verbunden und anschließend beispielsweise mit der CLI bereitgestellt werden:
```bash
npx vercel
npx vercel --prod
```
---
Nach der Bereitstellung beide API-Endpunkte und `/docs` prüfen.
## 🏠 Home Assistant Example
## Datenquelle und Hinweise
```yaml
rest:
- resource: "https://your-app.vercel.app/api/pegel/560021"
scan_interval: 300
json_attributes_path: "$.latest"
sensor:
- name: "Pegel Wasserstand"
value_template: "{{ value_json.latest.water_level_cm }}"
unit_of_measurement: "cm"
json_attributes:
- flow_m3s
- flood_alert_level
```
Die Messwerte werden von der offiziellen Website des Freistaats Sachsen bereitgestellt:
---
- Übersicht: <https://www.umwelt.sachsen.de/umwelt/infosysteme/hwims/portal/web/wasserstand-uebersicht>
- Beispiel-Feed: <https://www.umwelt.sachsen.de/umwelt/infosysteme/hwims/portal/web/feed/wasserstand-pegel-560021>
## ⚙️ Configuration
Verfügbarkeit und Richtigkeit der Quelldaten werden nicht garantiert. Änderungen am Aufbau der HWIMS-Seiten oder RSS-Feeds können die Verarbeitung beeinträchtigen. Dieses Projekt ist nicht mit dem Freistaat Sachsen verbunden.
No config required.
## Lizenz
Pegel ID is passed via URL:
```
/api/pegel/<id>
```
Index endpoint:
```
/api/pegel
```
Query params for index:
* `limit` (positive integer, optional; invalid values return HTTP 400)
---
## 📡 Data Source
Data provided by the official Sachsen environmental portal:
https://www.umwelt.sachsen.de/
Example feed:
https://www.umwelt.sachsen.de/umwelt/infosysteme/hwims/portal/web/feed/wasserstand-pegel-560021
---
## ⚠️ Disclaimer
* No guarantees on data accuracy or availability
* Feed format may change
* Not affiliated with the State of Saxony
---
## 📝 License
MIT
MIT