Luftdaten (UBA)
Der Node fragt die Luftdaten-API v4 des Umweltbundesamts (UBA) für ausgewählte Messstationen ab. Er gibt am ersten Ausgang je Station die jüngste Messung als AirQualityObserved-Entität und am zweiten Ausgang eine Liste stündlicher AirQualityForecast-Entitäten aus.
- Node-Typ
- luftdaten
- Paket
- @htag/node-red-contrib-hypertegrity-environment
- Eingänge / Ausgänge
- 1 / 2
- Datenquelle
- Luftdaten-API v4 des Umweltbundesamts
Wofür Sie den Node verwenden
Das Umweltbundesamt veröffentlicht die Messwerte der amtlichen Luftmessnetze der Länder über eine offene API. Der Luftdaten-Node holt diese Werte für die Stationen, die Sie auf einer Karte auswählen, in einen Node-RED-Flow und bildet sie auf die Smart Data Models AirQualityObserved und AirQualityForecast ab.
Typische Einsatzfälle sind:
- Amtliche Luftqualität einer Stadt oder Region in einen NGSI-LD Context Broker übernehmen.
- Feinstaub-, Stickstoffdioxid- und Ozonwerte in Dashboards und Warn-Flows auswerten.
- Vorhersagen für die nächsten Stunden anzeigen, zum Beispiel für Hinweise an Radfahrende oder Sportveranstaltungen.
So funktioniert der Node
Auslösen
Eine beliebige eingehende Nachricht startet den Abruf. Der Node fragt die API nicht von selbst ab.
Stationsliste laden
Die Stammdaten aller Stationen werden geladen und eine Stunde lang zwischengespeichert.
Messwerte und Vorhersage abrufen
Je Station werden die Messwerte von gestern bis heute und die Vorhersage für den Vorschauzeitraum abgefragt.
Ausgeben
Je Station verlässt die jüngste Messung Ausgang 1 und die Liste der Vorhersagestunden Ausgang 2.
Ergebnis: Pro Station eine AirQualityObserved-Entität und ein Array von AirQualityForecast-Entitäten, gefiltert auf die gewählten Schadstoffkomponenten.
Der Node ist triggerbasiert. Kombinieren Sie ihn mit einem Inject-Node, der stündlich auslöst, da das UBA die Messwerte als Stundenmittel bereitstellt. Die Stationen werden nacheinander abgefragt; für jede Station sendet der Node ein eigenes Nachrichtenpaar. Scheitert eine einzelne Abfrage, gibt der Node eine Warnung aus und fährt mit der nächsten Station fort.
Konfiguration
Der Bearbeitungsdialog ist in die Registerkarten Stationen und Einstellungen gegliedert.
Registerkarte Stationen
| Feld | Typ | Standard | Bedeutung |
|---|---|---|---|
| Name | Text | leer | Anzeigename des Nodes im Flow. Ohne Namen zeigt der Node „UBA Luftdaten“. |
| Stationen auswählen | Karte mit Liste | keine Auswahl | Stationen wählen Sie per Klick auf einen Kartenmarker oder einen Listeneintrag. Gespeichert wird je Station ein Objekt mit id, name, lat und lon im Array stations. |
| Ort oder Adresse eingeben / Suchen | Text und Schaltfläche | leer | Geokodiert den Suchbegriff über den Nominatim-Dienst von OpenStreetMap und zeichnet einen Suchkreis um den Treffer. Ein Klick auf die Karte setzt den Kreis ebenfalls. |
| Radius | Schieberegler 5 km bis 100 km, Schritt 5 km | 25 km | Radius des Suchkreises. Stationen innerhalb des Kreises werden in der Liste hervorgehoben. |
| Liste filtern | Text | leer | Filtert die Stationsliste nach Name oder Stations-ID. |
| Sichtbare auswählen / Alle löschen | Schaltflächen | – | Wählt alle gerade gelisteten Stationen aus bzw. entfernt die gesamte Auswahl und setzt den Radius zurück. |
Registerkarte Einstellungen
| Feld | Typ | Standard | Bedeutung |
|---|---|---|---|
| API Basis-URL | Text | siehe unten | Basis-URL der UBA-API. Der Node hängt die Pfade stations/json, airquality/json und airqualityforecast/json an. |
| Komponenten | Kontrollkästchen | PM10, PM2.5, NO2, O3 | Schadstoffe, die in die Entitäten übernommen werden: PM10, PM2.5, NO2 (Stickstoffdioxid), O3 (Ozon), SO2 (Schwefeldioxid), CO (Kohlenmonoxid). Gespeichert als Array components mit den Werten PM10, PM25, NO2, O3, SO2, CO. |
| Vorschau (Stunden) | Zahl | 24 | Anzahl der Stunden, für die Vorhersagedaten abgefragt und ausgegeben werden. |
Standardwerte der URL-Felder:
API Basis-URL: https://luftdaten.umweltbundesamt.de/api/air-data/v4/
Die Stationsliste enthält alle Stationen, die im zurückliegenden Jahr Luftqualitätsdaten geliefert haben. Nicht jede Station misst jede Komponente. Fehlt eine Komponente an einer Station, fehlt sie auch in der Entität.
Eingang
Der Eingang dient ausschließlich als Auslöser. Der Node wertet keine Eigenschaften der eingehenden Nachricht aus.
| Eigenschaft | Typ | Bedeutung |
|---|---|---|
msg | beliebig | Jede Nachricht startet einen Abruf aller konfigurierten Stationen. Inhalt und Eigenschaften der Nachricht werden nicht in die Ausgabe übernommen. |
Ausgang
Der Node besitzt zwei Ausgänge mit den Beschriftungen Current Air Quality und Air Quality Forecast. Je Station sendet er ein Nachrichtenpaar; fehlt für eine Station einer der beiden Teile, ist der betreffende Ausgang für diese Station leer.
Ausgang 1: Aktuelle Messwerte
msg.payload enthält eine AirQualityObserved-Entität mit der jüngsten verfügbaren Messung der Station. Die Schadstoffwerte sind flache Zahlenattribute, sodass die Entität direkt an den NGSI-LD Builder übergeben werden kann.
{
"id": "urn:ngsi-ld:AirQualityObserved:Germany-UBA-123",
"type": "AirQualityObserved",
"dateObserved": "2026-10-01T07:00:00+01:00",
"location": {"type": "Point", "coordinates": [7.4601, 51.5102]},
"address": {
"type": "Property",
"value": {"addressLocality": "Beispielstadt Mitte", "addressCountry": "DE"}
},
"source": "UBA Luftdaten API v4",
"PM10": 18,
"NO2": 22.5,
"PM25": 9,
"O3": 61
}
| Feld | Bedeutung |
|---|---|
id | urn:ngsi-ld:AirQualityObserved:Germany-UBA- gefolgt von der numerischen Stations-ID des UBA. |
type | Immer AirQualityObserved. |
dateObserved | Zeitstempel der Messung aus der API, ergänzt um die Zeitzonenangabe +01:00. |
location | GeoJSON-Punkt in der Reihenfolge Länge, Breite aus den Stationsstammdaten. Fehlen diese, steht hier [0, 0]. |
address | Ortsangabe im NGSI-LD-Property-Format mit dem Stationsnamen als addressLocality und DE als addressCountry. |
source | Immer UBA Luftdaten API v4. |
PM10, PM25, NO2, O3, SO2, CO | Messwerte der gewählten Komponenten als Zahl. Nur Komponenten, die ausgewählt sind und an der Station gemessen werden, erscheinen. |
Ausgang 2: Vorhersage
msg.payload enthält ein Array von AirQualityForecast-Entitäten, je eine pro Vorhersagestunde innerhalb des Vorschauzeitraums.
[
{
"id": "urn:ngsi-ld:AirQualityForecast:Germany-UBA-123",
"type": "AirQualityForecast",
"dateIssued": "2026-10-01T08:15:00.000Z",
"validFrom": "2026-10-01T09:00:00+01:00",
"validTo": "2026-10-01T10:00:00+01:00",
"location": {"type": "Point", "coordinates": [7.4601, 51.5102]},
"address": {
"type": "Property",
"value": {"addressLocality": "Beispielstadt Mitte", "addressCountry": "DE"}
},
"source": "UBA Luftdaten API v4",
"PM10": 17,
"NO2": 20,
"O3": 58
}
]
| Feld | Bedeutung |
|---|---|
id | urn:ngsi-ld:AirQualityForecast:Germany-UBA- gefolgt von der Stations-ID. |
type | Immer AirQualityForecast. |
dateIssued | Zeitpunkt des Abrufs im ISO-8601-Format (UTC). |
validFrom, validTo | Beginn und Ende der Vorhersagestunde aus der API, ergänzt um +01:00. |
location, address, source | Wie am ersten Ausgang. |
| Komponenten | Vorhergesagte Werte der gewählten Komponenten als Zahl. |
Die Entitäten enthalten keine Einheitenangabe. Maßgeblich sind die Einheiten der UBA-API, die in der API-Dokumentation je Komponente beschrieben sind.
Beispiel-Flow
Das Paket bringt einen Beispiel-Flow mit. Sie importieren ihn in Node-RED über Menü → Importieren → Beispiele → @htag/node-red-contrib-hypertegrity-environment → lufdaten-api. Alternativ laden Sie die Datei lufdaten-api.json herunter und importieren sie über Menü → Importieren.
Inject
Ein Inject-Node löst den Abruf manuell aus. Für den Dauerbetrieb stellen Sie ein stündliches Intervall ein.
Luftdaten
Der Node ist ohne Stationen vorkonfiguriert. Wählen Sie im Dialog mindestens eine Station aus, bevor Sie deployen.
Zwei Debug-Nodes
„Current Data“ zeigt die AirQualityObserved-Entitäten, „Forecast Data“ die Vorhersage-Arrays.
Beispiel-Flow als JSON anzeigen
[
{"id": "tab1", "type": "tab", "label": "Luftdaten Api", "disabled": false, "info": ""},
{"id": "inject1", "type": "inject", "z": "tab1", "name": "", "props": [{"p": "payload"}, {"p": "topic", "vt": "str"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 120, "y": 140, "wires": [["uba1"]]},
{"id": "uba1", "type": "luftdaten", "z": "tab1", "name": "", "stations": [], "components": ["PM10", "NO2", "PM25", "O3"], "apiBaseUrl": "https://luftdaten.umweltbundesamt.de/api/air-data/v4/", "lookahead": 24, "x": 300, "y": 140, "wires": [["debug1"], ["debug2"]]},
{"id": "debug1", "type": "debug", "z": "tab1", "name": "Current Data", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "x": 510, "y": 100, "wires": []},
{"id": "debug2", "type": "debug", "z": "tab1", "name": "Forecast Data", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "x": 520, "y": 160, "wires": []}
]
Status und Fehler
| Anzeige | Bedeutung |
|---|---|
| Roter Ring „no station selected“ | Der Abruf wurde ausgelöst, aber es ist keine Station konfiguriert. Die Meldung „No station selected“ wird über node.error gemeldet. |
| Blauer Punkt „fetching...“ | Der Abruf läuft. |
| Grüner Punkt „Obs: n, Forecast: m“ | Der Abruf ist abgeschlossen; n Messwert-Entitäten und m Vorhersage-Entitäten wurden gesendet. |
| Roter Punkt „error“ | Der Abruf ist insgesamt fehlgeschlagen, zum Beispiel weil die Stationsliste nicht geladen werden konnte. Die Meldung „Processing failed: …“ wird über node.error gemeldet. |
| Warnung „Observed data fetch failed for …“ | Die Messwertabfrage einer einzelnen Station ist nach drei Versuchen gescheitert. Die übrigen Stationen werden weiter verarbeitet. |
| Warnung „Forecast fetch failed for …“ | Die Vorhersageabfrage einer einzelnen Station ist nach drei Versuchen gescheitert. |
Fehler werden über node.error mit der auslösenden Nachricht gemeldet und können mit einem Catch-Node abgefangen werden.
Hinweise
- Kein API-Schlüssel nötig: Die Luftdaten-API des UBA ist frei zugänglich. Der Node nutzt eine Zeitüberschreitung von 15 Sekunden und wiederholt jede Anfrage bis zu dreimal mit kurzer Pause.
- Stationscache: Die Stationsliste wird prozessweit für eine Stunde zwischengespeichert, auch über mehrere Node-Instanzen hinweg. Ein Neustart von Node-RED leert den Cache.
- Externe Dienste im Editor: Die Adresssuche sendet den Suchbegriff direkt aus dem Browser an den Nominatim-Dienst von OpenStreetMap; die Kartenbibliothek Leaflet wird von unpkg.com geladen. Die Stationsliste lädt der Dialog über den Admin-Endpunkt
/luftdaten/stationsdes Node-RED-Servers. - Einheiten: Die Werte werden ohne Einheit und ohne Umrechnung übernommen (Konzentrationen in metrischen Einheiten gemäß UBA-API, in der Regel µg/m³).
- Personenbezogene Daten: Die Daten beschreiben amtliche Messstationen und enthalten keine personenbezogenen Angaben.