openSenseMap
Der Node ruft für eine Liste ausgewählter senseBoxen die Stammdaten und die jeweils letzten Messwerte aller Sensoren von der openSenseMap-API ab. Die Boxen wählen Sie im Bearbeitungsdialog über eine Karte mit Bounding Box oder über eine manuelle Liste von Box-IDs aus.
- Node-Typ
- opensensemap
- Paket
- @htag/node-red-contrib-hypertegrity-environment
- Eingänge / Ausgänge
- 1 / 1
- Datenquelle
- openSenseMap-API (api.opensensemap.org)
Wofür Sie den Node verwenden
Die openSenseMap ist eine offene Plattform für Umweltsensoren, auf der Schulen, Vereine und Privatpersonen ihre senseBoxen veröffentlichen. Der openSenseMap-Node holt die letzten Messwerte ausgewählter Boxen in einen Node-RED-Flow, ohne dass Sie die API selbst ansprechen müssen. Jede Box wird mit allen ihren Sensoren als ein Objekt ausgegeben.
Typische Einsatzfälle sind:
- Lokale Umweltdaten wie Temperatur, Luftfeuchte oder Feinstaub aus einem Stadtgebiet in eine urbane Datenplattform übernehmen.
- Bürgersensorik ergänzen, wenn amtliche Messstationen zu weit entfernt sind.
- Dashboards speisen, die den Zustand mehrerer senseBoxen in einem Quartier zeigen.
So funktioniert der Node
Auslösen
Eine beliebige eingehende Nachricht startet den Abruf. Der Node fragt die API nicht von selbst ab.
Boxen abrufen
Für jede konfigurierte Box-ID wird die API einzeln aufgerufen. Nicht erreichbare Boxen werden mit einer Warnung übersprungen.
Umformen
Jede Box wird in ein Objekt mit Standort, Stammdaten, Sensorliste und einem Messwert-Index nach Sensortyp überführt.
Ausgeben
Alle Boxen verlassen den Node in einer Nachricht als Array in msg.payload.
Ergebnis: Ein Array von Box-Objekten mit den jeweils letzten Messwerten aller Sensoren, ergänzt um Zähler für Boxen und Sensoren.
Der Node ist triggerbasiert. Kombinieren Sie ihn mit einem Inject-Node, der in einem festen Intervall auslöst. Zur Laufzeit ruft der Node ausschließlich die im Dialog gespeicherten Box-IDs ab. Die Bounding Box dient nur dazu, Boxen im Bearbeitungsdialog auf der Karte zu finden und auszuwählen. Ohne ausgewählte Boxen liefert der Node ein leeres Array.
Konfiguration
Der Bearbeitungsdialog zeigt je nach Auswahlmodus entweder die Kartenauswahl oder ein Textfeld für Box-IDs. Die Felder API URL und Debug-Modus sind in beiden Modi sichtbar.
| Feld | Typ | Standard | Bedeutung |
|---|---|---|---|
| Name | Text | leer | Anzeigename des Nodes im Flow. Ohne Namen zeigt der Node „openSenseMap: BBox“ oder „openSenseMap: n Boxes“. |
| Auswahlmodus | Auswahl (bbox, ids) | bbox | Bounding Box (Bereich auf Karte) zeigt eine Karte mit Suchfunktion; Manuelle Box-IDs zeigt ein Textfeld. In beiden Fällen wird am Ende eine Liste von Box-IDs gespeichert. |
| Manuelle ID(s) | Text (nur Bounding-Box-Modus) | leer | Kommagetrennte Box-IDs. Das Feld spiegelt die aktuell ausgewählten Boxen und kann auch direkt bearbeitet werden. |
| Stadt oder Adresse / Suchen | Text und Schaltfläche | leer | Geokodiert den Suchbegriff über den Nominatim-Dienst von OpenStreetMap und legt die Bounding Box um den gefundenen Punkt. |
| Größe | Schieberegler 200 m bis 20 000 m, Schritt 200 m | 1000 (1,0 km) | Kantenlänge der Bounding Box in Metern. Gespeichert als bboxSize. |
| Nord (Breite), Ost (Länge), Süd (Breite), West (Länge) | Zahl | 52.005, 7.505, 51.995, 7.495 | Eckkoordinaten der Bounding Box in Dezimalgrad. Gespeichert als Objekt bbox. Eine Änderung lädt die Boxenliste neu. |
| Boxen filtern | Text | leer | Filtert die Liste der gefundenen Boxen nach Name oder ID. |
| Sichtbare auswählen / Alle löschen | Schaltflächen | – | Wählt alle gerade gelisteten Boxen aus bzw. leert die Auswahl. |
| Box IDs | Mehrzeiliger Text (nur Modus Manuelle Box-IDs) | leer | Eine senseBox-ID pro Zeile. Gespeichert als Array boxIds. |
| API URL | Text | siehe unten | Basis-URL des Boxen-Endpunkts. Der Node hängt /<Box-ID> an. |
| Debug-Modus | Kontrollkästchen | aus | Schreibt detaillierte Protokolle als Warnungen in die Debug-Seitenleiste. |
Standardwerte der URL-Felder:
API URL: https://api.opensensemap.org/boxes
Die Karte zeigt Boxen, die zum Zeitpunkt der Bearbeitung innerhalb der Bounding Box liegen. Gespeichert werden nur die angehakten Box-IDs. Neue Boxen, die später im Gebiet erscheinen, werden nicht automatisch aufgenommen.
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 Boxen. Inhalt und Eigenschaften der Nachricht werden nicht übernommen. |
Ausgang
Der Node sendet pro Abruf eine Nachricht. msg.payload ist ein Array mit einem Objekt je erfolgreich abgerufener Box. Zusätzlich werden Zähler und die Rohdaten der API mitgegeben.
{
"payload": [
{
"id": "5f1a2b3c4d5e6f7a8b9c0d1e",
"name": "senseBox Beispielstadt Rathaus",
"location": {"type": "Point", "coordinates": [7.5001, 52.0002]},
"exposure": "outdoor",
"model": "homeV2Wifi",
"createdAt": "2024-03-01T10:00:00.000Z",
"updatedAt": "2026-10-01T08:10:00.000Z",
"lastMeasurementAt": "2026-10-01T08:10:00.000Z",
"grouptag": ["Beispielstadt"],
"sensors": {
"Temperatur": {"id": "5f1a2b3c4d5e6f7a8b9c0d1f", "title": "Temperatur", "sensorType": "HDC1080", "unit": "°C", "icon": "osem-thermometer", "value": "18.5", "timestamp": "2026-10-01T08:10:00.000Z"},
"PM10": {"id": "5f1a2b3c4d5e6f7a8b9c0d20", "title": "PM10", "sensorType": "SDS 011", "unit": "µg/m³", "icon": "osem-cloud", "value": "12.3", "timestamp": "2026-10-01T08:10:00.000Z"}
},
"measurements": {
"HDC1080": {"value": "18.5", "unit": "°C", "timestamp": "2026-10-01T08:10:00.000Z"},
"SDS 011": {"value": "12.3", "unit": "µg/m³", "timestamp": "2026-10-01T08:10:00.000Z"}
}
}
],
"boxCount": 1,
"sensorCount": 2,
"_rawBoxes": ["… unveränderte API-Antworten …"]
}
| Feld | Bedeutung |
|---|---|
payload[].id | ID der senseBox (Feld _id der API). |
payload[].name | Name der Box, wie von der Betreiberin oder dem Betreiber vergeben. |
payload[].location | GeoJSON-Punkt in der Reihenfolge Länge, Breite. Fehlt der Standort, sind beide Werte null. |
payload[].exposure | Aufstellungsort laut API, zum Beispiel outdoor, indoor oder mobile; sonst unknown. |
payload[].model | Hardware-Modell der Box; sonst unknown. |
payload[].createdAt, updatedAt, lastMeasurementAt | Zeitstempel aus den Stammdaten der Box. |
payload[].grouptag | Gruppen-Tags der Box als Array; leer, wenn keine vergeben sind. |
payload[].sensors | Objekt, dessen Schlüssel der Sensortitel ist. Jeder Eintrag enthält id, title, sensorType, unit, icon sowie value und timestamp der letzten Messung. Ohne Messung sind value und timestamp null. |
payload[].measurements | Kurzindex der letzten Messwerte, Schlüssel ist der sensorType (ersatzweise der Titel). Enthält value, unit und timestamp. |
boxCount | Anzahl der erfolgreich abgerufenen Boxen. |
sensorCount | Summe aller Sensoren über alle Boxen. |
_rawBoxes | Unveränderte API-Antworten der Boxen zur Nachverfolgung. |
Die Messwerte werden so übernommen, wie die API sie liefert, in der Regel als Zeichenkette. Sind keine Boxen konfiguriert oder keine erreichbar, sendet der Node payload: [] mit boxCount: 0 und sensorCount: 0 ohne _rawBoxes.
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 → opensensemap. Alternativ laden Sie die Datei opensensemap.json herunter und importieren sie über Menü → Importieren.
Inject
Ein Inject-Node mit dem Namen „Go!“ löst den Abruf manuell aus.
openSenseMap
Der Node ist im Bounding-Box-Modus ohne ausgewählte Boxen vorkonfiguriert. Wählen Sie im Dialog Boxen aus, bevor Sie deployen.
Debug
Ein Debug-Node „Sensor Outputs“ zeigt das Array der Box-Objekte in der Seitenleiste.
Beispiel-Flow als JSON anzeigen
[
{"id": "tab1", "type": "tab", "label": "OpenSensemap", "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": 100, "y": 100, "wires": [["osm1"]]},
{"id": "osm1", "type": "opensensemap", "z": "tab1", "name": "", "selectionMode": "bbox", "boxIds": [], "bbox": {"north": 52.005, "east": 7.505, "south": 51.995, "west": 7.495}, "bboxSize": 1000, "apiUrl": "https://api.opensensemap.org/boxes", "debug": false, "x": 400, "y": 100, "wires": [["debug1"]]},
{"id": "debug1", "type": "debug", "z": "tab1", "name": "Sensor Outputs", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "x": 720, "y": 100, "wires": []}
]
Status und Fehler
| Anzeige | Bedeutung |
|---|---|
| Grauer Ring „no boxes selected“ | Beim Start sind keine Box-IDs konfiguriert. |
| Grauer Punkt „n boxes ready“ | Beim Start sind n Box-IDs konfiguriert; der Node wartet auf einen Auslöser. |
| Blauer Punkt „fetching...“ | Der Abruf läuft. |
| Gelber Ring „no boxes selected“ | Der Abruf wurde ausgelöst, aber es sind keine Boxen konfiguriert oder keine erreichbar. Es wird ein leeres Array gesendet. |
| Grüner Punkt „n boxes (m sensors)“ | Der Abruf war erfolgreich; n Boxen mit insgesamt m Sensoren wurden ausgegeben. |
| Roter Ring „API Error“ | Ein unerwarteter Fehler beim Zusammenstellen der Anfragen. Die Meldung „API Error: …“ wird über node.error gemeldet. |
| Roter Ring „error“ | Der Abruf ist fehlgeschlagen. Die Meldung „Failed to fetch data: …“ wird über node.error gemeldet. |
| Warnung „Failed to fetch box …“ | Eine einzelne Box konnte nicht geladen werden (Zeitüberschreitung nach 10 Sekunden oder Fehlerantwort). Der Abruf der übrigen Boxen läuft weiter. |
Fehler werden über node.error gemeldet und können mit einem Catch-Node abgefangen werden.
Hinweise
- Kein API-Schlüssel nötig: Die openSenseMap-API ist ohne Registrierung lesbar. Beachten Sie die Nutzungsbedingungen des Betreibers und wählen Sie ein moderates Abrufintervall, da jede Box einzeln angefragt wird.
- Externe Dienste im Editor: Die Adresssuche im Bearbeitungsdialog sendet den Suchbegriff direkt aus dem Browser an den Nominatim-Dienst von OpenStreetMap. Die Kartenbibliothek Leaflet wird von unpkg.com geladen. Beide Aufrufe finden nur beim Bearbeiten statt, nicht zur Laufzeit.
- Admin-Endpunkt: Zum Laden der Boxenliste nutzt der Dialog den Endpunkt
/opensensemap/boxesder Node-RED-Admin-API, der die Anfrage serverseitig an die openSenseMap-API weiterreicht (Zeitüberschreitung 30 Sekunden). - Zugriff nach Titel oder Typ: Das Objekt
sensorsist nach Sensortitel indiziert und enthält alle Sensoren einer Box. Das Objektmeasurementsbietet einen Schnellzugriff auf die letzten Messwerte nach Sensortyp. - Personenbezogene Daten: Viele senseBoxen werden von Privatpersonen betrieben. Boxnamen, Gruppen-Tags und Standorte können Rückschlüsse auf Personen erlauben. Prüfen Sie vor der Weitergabe in einen Context Broker, ob diese Angaben veröffentlicht werden dürfen.
- Einheiten: Die Einheiten stammen aus den Sensordefinitionen der jeweiligen Box (zum Beispiel °C, %, hPa, µg/m³) und werden unverändert übernommen.
- Ausgabeformat: Der Node liefert ein flaches Box-Objekt, keine NGSI-LD-Entität. Für einen Context Broker formen Sie die Daten mit dem NGSI-LD Builder um.