Datenströme visualisieren mit Node-RED

Vorraussetzungen

Dieses Kapitel setzt vorraus, dass Sie:

  • Einen Raspberry Pico W mit der Micropython Firmware geflasht haben.
  • Einen DHT11 Sensor zur Verfügung haben
  • Node-RED auf einem Computer oder Raspberry Pi installiert haben.
  • Ein WLAN Netzwerk vorhanden ist.

Datenströme visualisieren

Sensoren erfassen Messwerte als fortlaufende Datenströme. Damit diese Werte nutzbar werden, müssen sie in strukturierter Form übertragen, inhaltlich ausgewertet und so aufbereitet werden, dass sie schnell überprüfbar und verständlich dargestellt werden können. Dieses Kapitel befasst sich mit der Visualisierung von Datenströmen.

Für die Umsetzung wird die No Code/Low Code Software Node-RED genutzt. Node-RED stellt eine grafische Entwicklungsumgebung bereit, in der Datenflüsse aus vorgefertigten Bausteinen zusammengesetzt werden. Dadurch wird ein niedrigschwelliger Umgang mit Daten möglich, weil informatische Verarbeitungsschritte ohne umfangreiche Programmierkenntnisse umgesetzt und transparent nachvollzogen werden können.

Ziel

Ziel dieses Kapitels ist es, grundlegende Arbeitsschritte kennenzulernen, die in späteren Abschnitten erneut benötigt werden.

Daten werden:

  • in einem verbreiteten Austauschformat wie JSON bereitgestellt
  • in Node-RED eingelesen, gezielt gefiltert oder umgerechnet
  • in einem Dashboard visualisiert.

Dabei geht es nicht um eine vollständige Datenanalyse, sondern um ein Verständnis dafür, wie Messwerte als Datenfluss verarbeitet werden und wie aus Rohdaten eine übersichtliche Darstellung entstehen kann.

JSON-Daten verstehen und visualisieren

JSON als Datenformat für Datenströme

Viele Datenströme im Netz werden im Format Java Script Object Notation (JSON) übertragen. JSON ist ein textbasiertes Austauschformat, das sowohl für Menschen gut lesbar ist als auch von Maschinen verarbeitbar ist. Es ist sprachunabhängig, dadurch können sehr unterschiedliche Systeme Daten im gleichen Format senden und empfangen. Einen kompakten Überblick bietet der Wikipedia-Artikel zu JSON.

Ein JSON Objekt besteht aus Schlüssel-Wert-Paaren. Der Schlüssel ist ein Name in Anführungszeichen, der Wert kann zum Beispiel eine Zahl, ein Text, true oder false oder auch wieder ein weiteres Objekt sein. Dadurch sind auch verschachtelte Strukturen möglich:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "device_id": "sensor-node-42",
  "location": "Rooftop, Building A",
  "measurements": [
    {
      "timestamp": "2026-03-23T10:15:00Z",
      "temperature_c": 18.4,
      "humidity_pct": 62.7
    },
    {
      "timestamp": "2026-03-23T10:20:00Z",
      "temperature_c": 18.9,
      "humidity_pct": 61.2
    }
  ]
}

JSON in Node-RED simulieren und visualisieren

Um einen Datenstrom ohne Hardware zu simulieren, kann dieser in Node-RED erstellt und dann in einem Dashboard visualisiert werden. Laden Sie dazu den bereitgestellten Flow 01-mock-flow herunter und importieren Sie ihn in Node-RED. Beim Import kann es sein, dass Node-RED zusätzliche Nodes nachinstallieren muss, um den Flow korrekt darzustellen. Folgen Sie dazu den Anweisungen in Node-RED.

Beispiel-Flow in Node-RED zum Erzeugen von zufälligen "Messwerten"
Beispiel-Flow in Node-RED zum Erzeugen von zufälligen “Messwerten”

Nach dem Import sehen Sie die drei Bausteine:

  1. Ein Inject-Node timer als Taktgeber, der alle 3 Sekunden auslöst.
  2. Ein Function-Node generate JSON, der bei jedem Takt ein einfaches JSON-Objekt mit zwei Wertepaaren generiert. Die Werte werden mit jedem Takt neu generiert und leicht verändert, damit im Dashboard eine Bewegung im Verlauf sichtbar wird.
  3. Zwei Dashboard-Chart-Nodes, die jeweils einen der beiden Werte aus dem Payload als Zeitreihe darstellen.
Darstellung von Messwerten in einem Dashboard
Darstellung von Messwerten in einem Dashboard

Weitere Informationen zum Umgang mit Node-RED finden Sie in der offiziellen Node-RED Dokumentation.

Datenfluss in Node-RED

Node-RED verarbeitet Daten als Nachrichtenobjekte msg, die von Node zu Node weitergereicht werden. Die eigentlichen Nutzdaten liegen dabei in der Regel in msg.payload, zum Beispiel als JSON Objekt. Einzelne Werte können anschließend gezielt aus dem Payload entnommen und an Visualisierungs Nodes übergeben werden.

Realitätsnahe JSON Daten und Base64 Payload

Im nächsten Beispiel wird ein komplexeres JSON Objekt betrachtet, das sich am Aufbau realer LoRaWAN Uplink Events orientiert. Solche Ereignisse enthalten viele Metadaten, zum Beispiel zur Quelle, zum Empfang über Gateways oder zur Funkübertragung. Für die Weiterverarbeitung und Visualisierung sind davon in der Regel nur wenige Felder relevant. Ziel dieses Abschnitts ist es deshalb, aus einem großen JSON Objekt gezielt nur die Daten herauszufiltern, die tatsächlich benötigt werden.

Flow importieren

Laden sie den Flow 02-mock2-flow herunter und importieren Sie ihn in Node-RED.

Flow aufbau

Der Flow besteht aus den folgenden Schritten:

  1. timer: löst alle 3 Sekunden aus und triggert damit den nachfolgenden Node.
  2. generate JSON: erzeugt ein realtitätsnahes JSON Objekt, was einen LoRaWAN Uplink Event simuliert.
  3. change frm_payload: variiert den Wert frm_payload.
  4. extract payload base64: filtert das JSON Objekt so, dass nur noch der Base64 String übrig bleibt.
  5. decode base64 2x 2bytes: decodiert den Base64 String in zwei Werte.
  6. Dashboard Charts und Gauges: dienen der Visualisierung.

JSON Objekt

Wenn Sie das JSON Objekt betrachten, sehen Sie, dass es sehr viele Felder enthält. Für die Visualisierung im Dashboard sind aber nur wenige davon relevant. In diesem Fall ist es der Wert payload.uplink_message.frm_payload, der die eigentlichen Nutzdaten enthält. Dieser Wert wurde als Base64 String codiert.

Base64

Base64 ist ein Kodierungsverfahren, das Daten in eine Zeichenkette umwandelt, die aus 64 verschiedenen Zeichen besteht. Es wird häufig verwendet, um binäre Daten wie Bilder, Zip-Dateien oder Emailanhänge in Textform zu übertragen, zum Beispiel in JSON Objekten. Durch die Codierung wird ein problemloser Transport über diese Textprotokolle ermöglicht.

Auch in diesem Beispiel werden die Nutzdaten varriert, damit bei der Visualisierung im Dashboard eine Veränderung zu sehen ist. Dieser Schritt dient nur dazu, die Nutzdaten durch Variation “echter” aussehen zu lassen. Diese Veränderung erfolgt in dem Node change frm_payload.

Alle anderen Felder außer dem Payload sind für die Visualisierung nicht notwendig. Deshalb wird das JSON-Objekt mit einem Change Node extract payload base64 manipuliert, sodass nur noch der Wert payload.uplink_message.frm_payload als msg.payload übrig bleibt.

Im nächsten Schritt wird der Base64-String mit einem Function Node decode base64 2x 2bytes in die ursprünglichen Nutzdaten zurückverwandelt. In diesem Fall handelt es sich um 2x 2 Byte Werte, die Temperatur und Luftfeuchtigkeit repräsentieren.

Diese Werte werden anschließend im Dashboard auf unterschiedliche Weise visualisiert.

Codierung

Das wissen um die Codierung ist in diesem Fall notwendig, damit die Nutzdaten korrekt decodiert werden können.

Reale Sensordaten visualisieren

Damit die Visualisierung nicht nur auf fiktiven Daten basiert, werden in diesem Kapitel reale Sensordaten von einem DHT11 Sensor verwendet. Der Sensor wird vom Raspberry Pico ausgelseen und über einen Webserver bereitgestellt der wiederum von Node-RED abgefragt wird.

DHT11 verkabeln

Schließen Sie das DHT11 Sensormodul wie folgt an Ihren Raspberry Pico an:

Der Sensor DHT11 mit dem Raspberry Pico verbunden. Darstellung mit fritzing: Benjamin Blessing
Der Sensor DHT11 mit dem Raspberry Pico verbunden. Darstellung mit fritzing: Benjamin Blessing
Raspberry Pico DHT11
3,3 V: Pin 36 +
GND: Pin 38 -
GPIO9 (Pin12) Out

Webserver mit Sensordaten bereitstellen

Führen Sie den folgenden Code auf ihrem Raspberry Pico aus.
Ersetzen Sie dabei die SSID und das Passwort durch die Zugangsdaten ihres WLANs.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
# Import necessary modules
import network
import socket
import time
import json
import dht
from machine import Pin

# Wi-Fi credentials
ssid = 'WLAN_SSID_EINTRAGEN'
password = 'WLAN_PASSWORT_EINTRAGEN'

# DHT11 initialisieren
sensor = dht.DHT11(Pin(9))

# Connect to WLAN
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# Wait for Wi-Fi connection
connection_timeout = 10
while connection_timeout > 0:
    if wlan.status() >= 3:
        break
    connection_timeout -= 1
    print('Waiting for Wi-Fi connection...')
    time.sleep(1)

# Check if connection is successful
if wlan.status() != 3:
    raise RuntimeError('Failed to establish a network connection')
else:
    print('Connection successful!')
    network_info = wlan.ifconfig()
    print('IP address:', network_info[0])

# Set up socket and start listening
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen()

print('Listening on', addr)

# Variable initialisieren
sensor_werte = {
    "temp": 20,
    "hum": 40
}

# Liest den Sensor und updated das Dict.
def read_dht11():
    try:
        sensor.measure()
        temperatur = sensor.temperature()
        luftfeuchtigkeit = sensor.humidity()

        sensor_werte["temp"] = temperatur
        sensor_werte["hum"] = luftfeuchtigkeit
        
    except Exception:
        pass

    return sensor_werte

# Main loop to listen for connections
while True:
    conn = None
    try:
        conn, addr = s.accept()
        print("Connection from", addr)

        # Request Daten vom Client lesen
        request = conn.recv(1024)
        if not request:
            conn.close()
            continue

        # Pfad extrahieren (z.B. GET / HTTP/1.1)
        first_line = request.split(b"\r\n")[0]
        # Holt Index 1 also b"/" und decodiert zu einem String "/"
        path = first_line.split()[1].decode()

        if path == "/":
            # Sensor lesen
            data = read_dht11()
            # JSON erstellen
            body = json.dumps(data)

            # HTTP Response senden
            conn.send("HTTP/1.1 200 OK\r\n")
            # Header (Content-Typ)
            conn.send("Content-Type: application/json\r\n")
            # Leerzeichen (Trennt Header von Body)
            conn.send("Connection: close\r\n\r\n")
            # Der Body
            conn.send(body)

        else:
            conn.send("HTTP/1.1 404 Not Found\r\n\r\n")

        conn.close()

    except OSError as e:
        conn.close()
        print('Connection closed')
  • Sobald die Verbindung zum WLAN hergestellt ist und der Webserver läuft, sehen Sie die IP-Adresse die der Router dem Pico zugewiesen hat.
  • Sobald Sie diese IP-Adresse in einem Browser eingeben, sollten Sie die aktuellen Sensordaten als JSON Objekt sehen. Zum Beispiel: {"temp": 21, "hum": 45}.

Sensordaten in Node-RED visualisieren

Laden Sie den Flow 03-piko-dht11 herunter und importieren Sie ihn in Node-RED. Der Flow besteht aus den folgenden Schritten:

  1. Taktgeber: löst alle 2 Sekunden aus und triggert damit den nachfolgenden Node.
  2. HTTP Request: sendet eine GET Anfrage an den Webserver des Raspberry Pico und erhält ein JSON Objekt mit den aktuellen Sensordaten.
  3. 2 Change Nodes umd die Daten für die Visualisierung aufzubereiten.
  4. Dashboard Charts und Gauges: dienen der Visualisierung.

IP-Adresse anpassen

Damit der Flow funktioniert müssen Sie den HTTP Request Node öffnen und die URL anpassen. Geben Sie im Feld URL die IP-Adresse ein, die der Router ihrem Pico zugewiesen hat.

Weiter