Glossar
Ein Nachschlagewerk für die Fachbegriffe und projektspezifischen Begriffe, die in
luftqualitaet-cli verwendet werden. Die zugrunde liegende API ist deutsch
(Umweltbundesamt); dieses Glossar nennt den Begriff aus CLI und Client neben dem
deutschen Original, sofern es eines gibt.
Übersetzungstabelle (aus der API). Die CLI folgt diesen Begriffen:
Deutsch Englisch / API-Begriff Luftqualität air quality Komponente / Schadstoff component / pollutant Messnetz network Messumfang / Scope scope Station / Messstation station Stationstyp station type Stationseinstellung station setting Überschreitung transgression / exceedance Jahresbilanz annual balance Grenzwert / Schwellenwert threshold Messwert measure / measurement Stundenwert hourly value
Die Datenquelle
Umweltbundesamt (UBA). Die Umweltbehörde des Bundes
(umweltbundesamt.de). Sie erhebt und veröffentlicht die amtlichen deutschen
Luftqualitätsdaten, die dieses Tool abfragt.
Air-Data-API. Die offene REST-API des UBA für Luftqualitätsdaten, ohne API-Schlüssel.
Dieser Client nutzt den Live-API-Pfad /api/air-data/v3 auf
https://luftdaten.umweltbundesamt.de (die Standard-Basis-URL; die ältere Adresse
https://www.umweltbundesamt.de/api/air_data/v3 leitet dauerhaft dorthin um).
--base-url (im Client baseUrl) nimmt nur den Host – den API-Pfad ergänzt der Client
und lehnt eine Basis-URL ab, die schon darauf endet. Sie löst die
OpenAPI-Spezifikation v2 ab, die unter
luftqualitaet.api.bund.dev veröffentlicht ist.
Index- und Datenstruktur. Der Aufbau der meisten API-Antworten: Ein indices-Array
benennt die Spalten (das Zeilenlayout), und die Nutzdaten sind eine kompakte Map mit
ID, Code oder Zeitstempel als Schlüssel statt eines Arrays beschrifteter Objekte. Der
Client gibt diese Nutzdaten unverändert als rohes JSON zurück (JsonObject / AirDataResult),
statt einen strikten Typ pro Endpoint zu raten, denn das Layout hängt von Endpoint und
Parametern ab.
Ressourcen / Endpoints
Der Client stellt zwei Arten von Endpoints bereit: Daten-Endpoints (Messwerte und Aggregationen für eine Station und ein Zeitfenster oder für eine Komponente und ein Jahr) und Referenz-Endpoints (die Nachschlagelisten, die den numerischen IDs ihre Bedeutung geben).
airquality (/airquality/json). Luftqualitätsindex-Daten für eine Station über
ein Zeitfenster. Der Index hat fünf Stufen, von 0 (sehr gut) bis 4 (sehr schlecht).
CLI: airquality.
airquality-limits (/airquality/limits). Der verfügbare Datumsbereich je Station
für Luftqualitätsdaten – damit ermitteln Sie, welche Zeitfenster Sie abfragen können.
CLI: airquality-limits.
measures (/measures/json). Rohe Messdaten für eine Station über ein Zeitfenster,
für eine Komponente und einen Messumfang: Die Antwort enthält eine Reihe (ein Wert je
Stunde), ohne component/scope wählt die API also eine aus, statt alle zu liefern.
Der Client (und damit die CLI) verlangt beide. Eine ID, die die Station nicht misst, ergibt "data": {}.
CLI: measures.
measures-limits (/measures/limits). Der verfügbare Datumsbereich je
Messumfang, Komponente und Station für Messwerte. CLI: measures-limits.
annual-balances (/annualbalances/json). Jahresbilanzen für eine Komponente und
ein bestimmtes Jahr (>= 2016). Jede Zeile besteht aus einer Stations-ID und Kennzahlen,
deren Anzahl und Bedeutung von der Komponente abhängen (für O₃ gibt es keinen
Jahresmittelwert); das Objekt headers der Antwort benennt sie nach ihrer Position in der
Zeile, das Array indices passt dagegen nicht zu den Zeilen. Das UBA wertet sie „auf
Basis der endgültigen Daten“ aus, die im Juni des Folgejahres erscheinen; bis dahin hat das
Jahr keine Zeilen. Das ist die maßgebliche Zahl der Überschreitungen eines Jahres, und sie
stimmt mit den Tagesmittelwerten der Stationen überein. CLI: annual-balances.
transgressions (/transgressions/json). Daten zu Überschreitungen für eine
Komponente und ein Jahr – wie oft ein Grenzwert überschritten wurde. Das Objekt headers
der Antwort gibt an, was die Jahressumme zählt (Stunden oder Tage über welchem Wert);
day_recent zeigt, wie weit die Daten des Jahres reichen. Das UBA bietet diese Tabellen
„für das laufende Jahr“ an, aus vorläufigen Daten; die Tabelle eines abgeschlossenen
Jahres wird nicht auf die endgültigen Daten gebracht, daher weicht ihre Jahressumme
2019–2025 bei 10–35 % der PM₁₀-Stationen von annual-balances ab, in beide Richtungen
(Halle/Paracelsusstr., PM₁₀ 2024: hier 17 Tage, in der Jahresbilanz und in den
Tagesmittelwerten der Station 8). Für das laufende Jahr und die Monatswerte verwenden; für
ein abgeschlossenes Jahr nach annual-balances ordnen. CLI: transgressions (mit einem
Hinweis, einem INFO-Eintrag, auf stderr für ein abgeschlossenes Jahr).
thresholds (/thresholds/json). Die Grenz- und Schwellenwerte für eine bestimmte
Verwendung use (airquality oder measure), optional je Komponente und Messumfang. CLI:
thresholds.
meta (/meta/json). Kombinierte Metadaten für ein use – bündelt Komponenten,
Messumfänge, Messnetze, Stationen usw., die Sie für andere Abfragen brauchen. CLI: meta.
Referenzlisten
components (/components/json). Die gemessenen Komponenten (Schadstoffe):
z. B. PM10, NO₂, O₃, SO₂, CO. CLI: components. Jede Zeile enthält eine ID, einen Code
und die Maßeinheit.
networks (/networks/json). Die Messnetze – die Messnetze der Länder und des
Bundes, die die Stationen betreiben. CLI:
networks.
scopes (/scopes/json). Die Messumfänge – die Aggregations- bzw.
Mittelungsdefinition einer Messung (z. B. Stundenmittel, 24-Stunden-Mittel, die
Mittelungszeit + die Komponente, für die sie gilt). CLI:
scopes.
station-types (/stationtypes/json). Die Klassifikation der Stationstypen (z. B.
Hintergrund, Verkehr, Industrie). CLI: station-types.
station-settings (/stationsettings/json). Die Klassifikation der
Stationsumgebung (z. B. städtisch, vorstädtisch, ländlich). CLI: station-settings.
transgression-types (/transgressiontypes/json). Der Katalog der
Überschreitungsarten, auf die die Überschreitungsdaten verweisen. CLI:
transgression-types.
Wichtige Kennungen & Abfrageparameter
station. Die numerische Stations-ID, die eine Messstation bezeichnet. Ein
Pflichtparameter von airquality und measures. Stations-IDs beginnen bei 1, daher
lehnt die CLI 0 schon lokal ab. IDs finden Sie über meta / airquality-limits /
measures-limits. Eine ID, die die API nicht kennt, bekommt meist "data": {} mit HTTP
200, wie ein Zeitfenster ohne Daten (nur IDs weit außerhalb des Katalogs bekommen HTTP 409);
die CLI schlägt die ID dann im Stationskatalog (meta --use measure) nach und endet mit Exit 4
(nicht gefunden), wenn sie dort fehlt, oder gibt die leere Antwort mit einem Hinweis (einem INFO-Eintrag) auf stderr
aus, wenn es die Station gibt.
component. Die numerische Komponenten-ID, die einen Schadstoff bezeichnet. Pflicht
bei annual-balances / transgressions / measures; optional bei thresholds.
Die Zuordnung ID ↔ Schadstoff liefert components.
scope. Die numerische Messumfang-ID, die einen Messumfang (Mittelungsdefinition)
bezeichnet. Pflicht bei measures, optional bei thresholds. Auflösung über scopes.
year. Eine vierstellige Jahreszahl für die Jahresaggregationen; das früheste Jahr der
API ist 2016, daher lehnt die CLI alles darunter ab. transgressions ist erst ab
2019 vollständig: Für 2016–2018 antwortet die API bei manchen Komponenten (NO₂,
PM₁₀) mit HTTP 500, was die CLI mit einem Hinweis meldet.
Zeitfenster (date_from / time_from / date_to / time_to). Die
Daten-Endpoints adressieren ein Zeitfenster über Startdatum+Stunde und Enddatum+Stunde.
Datumsangaben haben das Format YYYY-MM-DD. Stunden sind Werte für das Stundenende im
Bereich 1..24 (nicht 0..23): Stunde 1 ist das Intervall, das um 01:00 Uhr endet,
Stunde 24 endet um Mitternacht. Die Zeiten sind ganzjährig MEZ (UTC+1) – so beschriftet
sie die airquality-Antwort –, im Sommer liegen sie also eine Stunde hinter der deutschen
Ortszeit. Die CLI prüft das Kalenderdatum und den Stundenbereich und
lehnt ein umgekehrtes Zeitfenster (Beginn nach Ende) ab, bevor eine Anfrage gesendet wird.
Enums / Codes des Clients
Dies sind die geschlossenen Wertemengen, gegen die der Client validiert (definiert in
packages/client/src/enums.ts):
lang (Lang). Antwortsprache für die Bezeichnungen in Referenzlisten und
Metadaten: de | en. CLI: --lang.
index (IndexKind). Wie eine Referenzliste in der Antwort verschlüsselt ist: id
(die numerische ID) | code (der Kurzcode). CLI: --index. annual-balances und
transgressions nehmen es ebenfalls an, ihre Zeilen sind aber Arrays mit der
Stations-ID vorn – es ändert dort nichts.
use (meta) (MetaUse). Welches Metadatenpaket der Endpoint meta liefert:
airquality | measure | transgression | annualbalance | map. Bei
use=airquality ist ein Zeitfenster (--date-from + --date-to) erforderlich. Bei
den anderen Werten ist es optional, die API wendet es aber ebenfalls an (use=measure
liefert dann nur die im Fenster aktiven Stationen). Deshalb prüft der Client es genauso:
beide Daten oder keines, Stunden nur zusammen mit Daten, fehlende Stunden werden als
1/24 gesendet (DEFAULT_META_TIME_FROM/DEFAULT_META_TIME_TO; sonst nähme die API
die aktuelle Stunde), kein umgekehrtes Fenster. CLI: meta --use.
use (thresholds) (ThresholdUse). Welche Schwellenwertmenge der Endpoint thresholds
liefert: airquality | measure. CLI: thresholds --use.
Such- und API-Konzepte
Retry / Backoff. Die API begrenzt die Anfragerate und kann vorübergehend mit 429 /
503 antworten; die Engine wiederholt solche Anfragen automatisch, linear steigend
(200 ms, 400 ms, …) oder nach dem Retry-After der Antwort (Sekunden oder ein HTTP-Datum),
wenn das länger ist — ein Retry-After von 0 oder ein vergangenes Datum verkürzt die
Wartezeit nie. Ein Retry-After über 30 s wird nicht abgewartet: Der Fehler erscheint
sofort und nennt die verlangte Wartezeit (--max-retries, 0..10, Standard 2). Eine Verbindung, die der Server mitten in der
Anfrage abbricht, wird ebenso wiederholt (linear steigend); eine abgelehnte Verbindung, ein
DNS-Fehler oder eine Zeitüberschreitung nicht.
Weiterleitungen. Die Engine folgt standardmäßig bis zu 5 HTTP-Weiterleitungen
(einstellbar mit --max-redirects; 0 schaltet das Folgen ab). Bei einer
Cross-Origin-Weiterleitung entfernt sie die Request-Header (und setzt nur die
unbedenklichen Accept / User-Agent wieder), damit nichts Sensibles an einen anderen
Origin gelangt. Zugangsdaten in --base-url (https://user:pw@mirror/) gehen als
Authorization: Basic-Header nur an den Origin der Basis-URL (Schema, Host, Port): Eine
Weiterleitung auf denselben Origin behält sie, relativ oder absolut, eine auf einen anderen
Origin lässt sie weg, und ein 401/403 danach sagt das (bei http→https: eine https-Basis-URL
verwenden). Zugangsdaten im Location eines Servers werden nie verwendet.
Obergrenze der Antwortgröße (maxResponseBytes). Eine feste Obergrenze für die Größe
des Antwort-Bodys (Standard 100 MiB; 0 = unbegrenzt), die vor Speichererschöpfung durch
einen feindseligen oder fehlerhaften Endpoint schützt. CLI: --max-response-bytes. Die
Engine setzt sie, wie auch das Zeitlimit, auch für einen eigenen Transport eines
Bibliotheksnutzers durch.
Nur lesend, ohne Authentifizierung. Die Air-Data-API des UBA benötigt keinen
API-Schlüssel; dieser Client implementiert nur die offenen, lesenden GET-Endpoints.
Log-Eintrag (log record). Jede Diagnosezeile, die die CLI nach stderr schreibt: ein
Zeitstempel, eine Stufe (ERROR, WARN, INFO) und ein Thema luftqualitaet.<Bereich>,
als Text (im Stil von log4j) oder mit --log-format jsonl als ein JSON-Objekt pro Zeile.
Die Bereiche: cli (Bedienfehler, Meldungen von commander, unerwartete Fehler), api (die
Antworten der API und die Hinweise dazu: ein Fehlerstatus, eine unbekannte Station, eine
fehlerhafte Antwort — ungültiges JSON, die falsche Form oder der falsche Inhaltstyp —, die
Hinweise zu einem Zeitfenster ohne Daten oder zu einer Jahreszahl, die Hinweise zu 409 und
500), http (die Verbindung, die Klartext-Warnung, je Wiederholung eine WARN-Zeile vor dem Warten) und output (ein Schreibfehler auf
stdout). Ein Eintrag ist immer eine Zeile; Steuerzeichen darin werden maskiert.
Bibliothek & Interna. Begriffe zum TypeScript-Client und seinen Interna –
LuftqualitaetClient, die Request-Engine, Transport, Retry/Backoff, Fehlertypen, Query-Builder – stehen jetzt in DEVELOPING.md.