OpenUV Index
Der Node fragt die OpenUV.io-API nach dem aktuellen UV-Index, Ozonwert und den sicheren Sonnenzeiten für einen oder mehrere Standorte ab. Optional liefert er zusätzlich die stündliche UV-Vorhersage des Tages. Die Ergebnisse werden als NGSI-LD-nahe Objekte vom Typ UVIndexObservation und UVIndexForecast ausgegeben.
- Node-Typ
- openuv
- Paket
- @htag/node-red-contrib-hypertegrity-weather
- Eingänge / Ausgänge
- 1 / 2
- Datenquelle
- OpenUV.io API (api.openuv.io/api/v1)
Wofür Sie den Node verwenden
Der UV-Index beschreibt die sonnenbrandwirksame Strahlung und ist eine wichtige Kenngröße für Gesundheitsschutz im öffentlichen Raum. OpenUV.io stellt diesen Wert in Echtzeit für beliebige Koordinaten bereit, berechnet aus Satellitendaten zur Ozonschicht. Der OpenUV-Index-Node bindet den Dienst in Node-RED ein und übernimmt die Authentifizierung, die Abfrage je Standort und die Umformung in ein einheitliches Datenmodell.
Typische Einsatzfälle sind:
- UV-Hinweise für Freibäder, Schulhöfe und Spielplätze auf Anzeigetafeln oder in einer Bürger-App.
- Gesundheitsdashboards einer Kommune mit UV-Index, Ozon und sicheren Sonnenzeiten je Hauttyp.
- Tagesverlauf des UV-Index als Vorhersage für Veranstaltungsplanung oder Bewässerungssteuerung.
So funktioniert der Node
Auslösen
Eine eingehende Nachricht startet den Abruf. Der Node fragt OpenUV.io nicht von selbst ab.
Abfragen
Für jeden Standort wird der Endpunkt /uv mit Breiten- und Längengrad aufgerufen, bei aktivierter Vorhersage zusätzlich /forecast.
Umformen
Die Antwort wird in ein UVIndexObservation-Objekt umgeformt; jeder Vorhersagepunkt wird zu einem eigenen UVIndexForecast-Objekt.
Ausgeben
Ausgang 1 erhält je Standort eine Beobachtung, Ausgang 2 je Vorhersagestunde eine eigene Nachricht.
Ergebnis: UV-Beobachtungen und -Vorhersagen mit Geoposition, die direkt in den NGSI-LD Builder geführt werden können.
Der Node ist triggerbasiert. Kombinieren Sie ihn mit einem Inject-Node, der in einem festen Intervall auslöst. Beachten Sie dabei das Kontingent Ihres OpenUV.io-Tarifs: Jeder Auslöser verursacht eine Anfrage je Standort und bei aktivierter Vorhersage eine weitere. Die Standorte werden nacheinander abgefragt, der Timeout je Anfrage beträgt 10 Sekunden.
Konfiguration
Der Bearbeitungsdialog besteht aus dem Feld Name und zwei Registerkarten.
Registerkarte „Standorte“
| Feld | Typ | Standard | Bedeutung |
|---|---|---|---|
| Name | Text | leer | Anzeigename des Nodes im Flow. |
| Kartenauswahl | Karte | – | Ein Klick auf die Karte setzt einen Punkt; „Ausgewählten Punkt hinzufügen“ übernimmt ihn in die Liste. Bereits vorhandene Koordinaten werden mit „Dieser Standort wurde bereits hinzugefügt“ abgewiesen. |
Ausgewählte Standorte (locations) | Liste | leer | Einträge mit Standortname (name), Breitengrad (lat) und Längengrad (lon). Der Name wird Teil der Entitäts-ID und erscheint in locationName. |
Registerkarte „Einstellungen“
| Feld | Typ | Standard | Bedeutung |
|---|---|---|---|
API-Schlüssel (apiKey) | Passwortfeld, Pflichtfeld | leer | Ihr OpenUV.io-API-Schlüssel. Er wird als HTTP-Header x-access-token gesendet. |
Vorhersage (outputForecast) | Kontrollkästchen | inaktiv | Vorhersagedaten im Output einbeziehen: fragt zusätzlich den Endpunkt /forecast ab und bedient Ausgang 2. |
API-Schlüssel beziehen
Registrieren Sie sich auf openuv.io und erzeugen Sie im Dashboard einen API-Schlüssel. OpenUV.io bietet einen kostenlosen Tarif mit begrenztem Tageskontingent sowie kostenpflichtige Tarife mit höheren Limits; die aktuellen Konditionen finden Sie auf der Website des Anbieters.
Eingang
Der Eingang dient ausschließlich als Auslöser. Der Node wertet keine Eigenschaft der Eingangsnachricht aus und übernimmt sie auch nicht in die Ausgabe.
| Eigenschaft | Typ | Bedeutung |
|---|---|---|
msg | beliebig | Jede Nachricht startet den Abruf für alle konfigurierten Standorte. |
Ausgang
Der Node hat zwei Ausgänge. Beide Payloads sind weitgehend flache Objekte; nur location ist bereits als NGSI-LD-GeoProperty strukturiert. Sie können an den NGSI-LD Builder übergeben werden.
Ausgang 1: UVIndexObservation
Je Standort eine Nachricht mit msg.topic = "uv-observation" und msg.location = Standortname.
{
"id": "urn:ngsi-ld:UVIndexObservation:Freibad_Beispielstadt",
"type": "UVIndexObservation",
"uVIndex": 3.2,
"uVIndexMax": 4.1,
"uVIndexMaxTime": "2026-10-01T11:20:00.000Z",
"ozone": 298.5,
"ozoneTime": "2026-10-01T07:00:00.000Z",
"safeExposure": {"st1": 52, "st2": 62, "st3": 83, "st4": 104, "st5": 166, "st6": 311},
"sunInfo": {
"sun_times": {"sunrise": "2026-10-01T05:25:00.000Z", "sunset": "2026-10-01T16:58:00.000Z"},
"sun_position": {"azimuth": 0.42, "altitude": 0.61}
},
"location": {"type": "GeoProperty", "value": {"type": "Point", "coordinates": [7.77, 49.44]}},
"locationName": "Freibad Beispielstadt"
}
| Feld | Bedeutung |
|---|---|
id | urn:ngsi-ld:UVIndexObservation: plus Standortname; alle Zeichen außer Buchstaben und Ziffern werden durch _ ersetzt. |
type | Immer UVIndexObservation. |
uVIndex | Aktueller UV-Index (dimensionslos, OpenUV uv). |
uVIndexMax | Tagesmaximum des UV-Index (OpenUV uv_max). |
uVIndexMaxTime | Zeitpunkt des Tagesmaximums (OpenUV uv_max_time, ISO 8601). |
ozone | Ozonsäule in Dobson-Einheiten (OpenUV ozone). |
ozoneTime | Zeitstempel der Ozonmessung (OpenUV ozone_time). |
safeExposure | Sichere Sonnenzeit in Minuten je Hauttyp st1 bis st6 nach Fitzpatrick (OpenUV safe_exposure_time), unverändert übernommen. |
sunInfo | Sonnenauf- und -untergangszeiten sowie Sonnenstand (OpenUV sun_info), unverändert übernommen. |
location | GeoProperty mit GeoJSON-Punkt [Länge, Breite] des Standorts. |
locationName | Der von Ihnen vergebene Standortname. |
Ausgang 2: UVIndexForecast
Nur bei aktivierter Vorhersage. Je Vorhersagepunkt (stündlich für den laufenden Tag) eine eigene Nachricht mit msg.topic = "uv-forecast" und msg.location = Standortname.
{
"id": "urn:ngsi-ld:UVIndexForecast:Freibad_Beispielstadt",
"type": "UVIndexForecast",
"dateIssued": "2026-10-01T12:00:00.000Z",
"uVIndex": 3.8,
"sunPosition": {"azimuth": 0.55, "altitude": 0.58},
"location": {"type": "GeoProperty", "value": {"type": "Point", "coordinates": [7.77, 49.44]}},
"locationName": "Freibad Beispielstadt"
}
| Feld | Bedeutung |
|---|---|
id | urn:ngsi-ld:UVIndexForecast: plus bereinigter Standortname. |
type | Immer UVIndexForecast. |
dateIssued | Zeitpunkt, für den der Vorhersagewert gilt (OpenUV uv_time). |
uVIndex | Vorhergesagter UV-Index. |
sunPosition | Sonnenstand zum Vorhersagezeitpunkt (OpenUV sun_position). |
location, locationName | Wie bei Ausgang 1. |
Beispiel-Flow
Das Paket bringt einen Beispiel-Flow mit. Sie importieren ihn in Node-RED über Menü → Importieren → Beispiele → @htag/node-red-contrib-hypertegrity-weather → openuv-io. Alternativ laden Sie die Datei openuv-io.json herunter und importieren sie über Menü → Importieren.
Inject
Ein Inject-Node löst den Abruf manuell oder in einem festen Intervall aus.
OpenUV Index
Der Node fragt OpenUV.io für die konfigurierten Standorte ab. Im Beispiel sind API-Schlüssel und Standortliste leer und müssen ergänzt werden.
Debug
Zwei Debug-Nodes zeigen Beobachtung und Vorhersage in der Seitenleiste an.
Beispiel-Flow als JSON anzeigen
[
{"id": "tab1", "type": "tab", "label": "openuv-io", "disabled": false, "info": ""},
{"id": "inject1", "type": "inject", "z": "tab1", "name": "Go!", "props": [{"p": "payload"}, {"p": "topic", "vt": "str"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 110, "y": 100, "wires": [["uv1"]]},
{"id": "uv1", "type": "openuv", "z": "tab1", "name": "", "apiKey": "", "locations": [], "outputForecast": false, "x": 300, "y": 100, "wires": [["debug1"], ["debug2"]]},
{"id": "debug1", "type": "debug", "z": "tab1", "name": "Observation", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "x": 490, "y": 80, "wires": []},
{"id": "debug2", "type": "debug", "z": "tab1", "name": "Forecast", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "x": 480, "y": 120, "wires": []}
]
Status und Fehler
| Anzeige | Bedeutung |
|---|---|
| Roter Ring „Kein API-Schlüssel konfiguriert“ | Das Feld API-Schlüssel ist leer. Der Abruf wird nicht gestartet; der Fehler wird zusätzlich über node.error gemeldet. |
| Grauer Ring „Keine Standorte konfiguriert“ | Die Standortliste ist leer. Der Abruf wird nicht gestartet. |
| Blauer Punkt „Abrufen…“ | Der Abruf läuft. |
| Grüner Punkt „Aktiv: n“ | Alle n Standorte wurden erfolgreich abgefragt. |
| Gelber Punkt „Aktiv: n, Fehler: m“ | n Standorte erfolgreich, m Standorte mit Fehler. |
| Roter Ring „Fehler beim Abrufen“ | Kein Standort konnte abgefragt werden. |
| Fehler „Fehler beim Abrufen der UV-Daten (Standort): …“ | Die Anfrage an /uv ist für diesen Standort gescheitert, zum Beispiel wegen eines ungültigen Schlüssels, eines erschöpften Kontingents oder eines Timeouts. |
| Warnung „Fehler beim Abrufen der Vorhersage (Standort): …“ | Die Anfrage an /forecast ist gescheitert; die Beobachtung wurde trotzdem ausgegeben. |
Fehler werden über node.error gemeldet und können mit einem Catch-Node abgefangen werden.
Hinweise
- Kontingent und Rate Limits: OpenUV.io begrenzt die Zahl der Anfragen je Tag abhängig vom Tarif. Jeder Auslöser verursacht eine Anfrage je Standort, bei aktivierter Vorhersage zwei. Bei 5 Standorten und stündlichem Abruf entstehen also 120 beziehungsweise 240 Anfragen pro Tag. Nachts liefert OpenUV.io einen UV-Index von 0; sparen Sie Anfragen, indem Sie nur zwischen Sonnenaufgang und Sonnenuntergang auslösen.
- Nutzungsbedingungen: Die Nutzung der API unterliegt den Bedingungen von OpenUV.io. Prüfen Sie vor einer Veröffentlichung der Daten, ob Ihr Tarif dies erlaubt.
- Kontextspeicher: Der Node speichert keine Daten im Node-RED-Kontext.
- Proxy: Es gibt keine eigene Proxy-Einstellung;
axiosbeachtet die UmgebungsvariablenHTTP_PROXYundHTTPS_PROXY. - Einheiten: UV-Index dimensionslos nach WHO-Skala, Ozon in Dobson-Einheiten, sichere Sonnenzeiten in Minuten, Sonnenstand in Radiant.
- Externe Dienste im Editor: Die Karte lädt Kacheln von OpenStreetMap; der Browser mit dem Node-RED-Editor benötigt dafür Internetzugang.
- Personenbezogene Daten: Die Ausgabe enthält Koordinaten und die von Ihnen vergebenen Standortnamen. Verwenden Sie keine Namen von Privatpersonen oder private Adressen als Standortnamen, wenn die Daten veröffentlicht werden.
- Datenmodell: Die Ausgabetypen
UVIndexObservationundUVIndexForecastfolgen den Konventionen der Smart Data Models (flache Attribute, GeoProperty fürlocation).