RasPi Zero Hub – Architektur & Datenfluss
In den bisherigen Beiträgen habe ich Projektidee, Hardware, Aufbau und die Installation der benötigten Bibliotheken beschrieben.
Dieser Artikel setzt dort an, wo die eigentliche Struktur des Systems sichtbar wird: in der inneren Organisation der Software.
Ziel ist es nicht, den vollständigen Code zu erläutern oder einzelne Zeilen zu erklären.
Vielmehr geht es darum, nachvollziehbar zu machen:
-
wie die einzelnen Komponenten zusammenspielen
-
wie Sensordaten ihren Weg durch das System nehmen
-
warum bestimmte Architekturentscheidungen getroffen wurden
Der vollständige Code ist separat verfügbar. Die hier gezeigten Ausschnitte dienen ausschließlich der strukturellen Verankerung.
1. Überblick: Komponenten des Systems
Der RasPi Zero Hub besteht softwareseitig aus vier klar getrennten Ebenen:
-
Sensor-Ebene (Hardware & Treiber)
-
Python-Steuerung (Logik & Koordination)
-
Visualisierung & Interaktion (Display, Touch, WebSocket)
-
Persistenz & externe Anbindungen (SQLite, API, OpenWeather)
Diese Trennung ist bewusst gewählt.
Sie erlaubt es, einzelne Bereiche unabhängig zu erweitern oder auszutauschen, ohne die Gesamtarchitektur zu verändern.
2. Sensor-Ebene: Rohdaten als Grundlage
Im Standardaufbau kommen drei Sensortypen zum Einsatz:
-
BME280
Temperatur, Luftfeuchtigkeit, Luftdruck (Innen)
-
DHT22
Temperatur und Luftfeuchtigkeit (Innen, zweite Quelle)
-
AM2301 / AM3201
Temperatur und Luftfeuchtigkeit (Außen)
Jeder Sensor liefert Rohwerte.
In dieser Phase findet noch keine Bewertung statt – es geht ausschließlich um Messung.
Die Sensoren werden bewusst getrennt behandelt, um:
-
Plausibilitätsprüfungen zu ermöglichen
-
Mittelwerte bilden zu können
-
Erweiterungen offen zu halten
3. Python als Zentrale: Lesen, Verarbeiten, Verteilen
Die zentrale Python-Anwendung übernimmt drei Hauptaufgaben:
-
Zyklisches Einlesen der Sensoren
-
Aufbereitung und Aggregation der Werte
-
Weitergabe an Anzeige, Logik und Speicher
Der Ablauf ist strukturell immer gleich:
Sensoren lesen
→ Werte prüfen
→ Mittelwerte berechnen
→ Logik anwenden
→ Daten verteilen
Wichtig ist:
Es gibt nur eine Quelle der Wahrheit – die Python-Logik.
Display, Webinterface und API greifen niemals direkt auf Sensoren zu.
Übernahme der Messwerte
Die Sensoren werden zunächst lokal eingelesen. Erst danach werden die Werte gesammelt in den globalen Systemzustand übernommen.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
while True: # --- Sensoren lokal einlesen --- local_bme_temperatur = bme280.get_temperature() local_bme_luftfeuchtigkeit = bme280.get_humidity() local_bme_luftdruck = bme280.get_pressure() local_dht_humidity, local_dht_temperature = Adafruit_DHT.read_retry(dhtSensorWeissTyp, dhtSensorWeissGpio) local_am_humidity, local_am_temperature = Adafruit_DHT.read_retry(dhtSensorAM3201Typ, dhtSensorAM3201Gpio) # --- Atomare Übernahme der Messwerte --- with state_lock: bme_temperatur = local_bme_temperatur bme_luftfeuchtigkeit = local_bme_luftfeuchtigkeit bme_luftdruck = local_bme_luftdruck dht_humidity = local_dht_humidity dht_temperature = local_dht_temperature am_humidity = local_am_humidity am_temperature = local_am_temperature |
Die Werte werden zunächst in lokalen Variablen erfasst.
Erst anschließend erfolgt eine atomare Übernahme in den globalen Zustand – abgesichert durch state_lock.
Damit wird verhindert, dass Display, WebSocket oder LED-Logik mit inkonsistenten Zwischenwerten arbeiten.
Logik anwenden: Mittelwert & Schwellenwert
Die eigentliche Bewertung erfolgt ausschließlich in der Python-Zentrale.
Ein Beispiel ist die Prüfung der Luftfeuchtigkeit.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def ist_luftfeuchtigkeit_ueber_schwellenwert(): global raumklima, bme_luftfeuchtigkeit, LUFTFEUCHTIGKEIT_SCHWELLENWERT, am_humidity, dht_humidity innen_mittelwert = berechne_mittelwert(bme_luftfeuchtigkeit, dht_humidity) if innen_mittelwert is None or am_humidity is None: raumklima = True return if innen_mittelwert > LUFTFEUCHTIGKEIT_SCHWELLENWERT and am_humidity > LUFTFEUCHTIGKEIT_SCHWELLENWERT: raumklima = False else: raumklima = True |
Die Entscheidung basiert auf:
-
einem Mittelwert zweier Innen-Sensoren
-
einem konfigurierbaren Schwellenwert
-
einer Fail-safe-Strategie bei fehlenden Messwerten
Diese Logik existiert ausschließlich im Backend.
Das Frontend übernimmt keine Berechnungen.
4. Messwert-Mapping: Klar definierte Bedeutungen
Zur Konsistenz über alle Ebenen hinweg ist das Messwert-Mapping eindeutig definiert:
|
Feld |
Bedeutung |
|---|---|
|
sensorwert_a |
BME280 Temperatur innen |
|
sensorwert_b |
BME280 Luftfeuchtigkeit innen |
|
sensorwert_c |
BME280 Luftdruck |
|
sensorwert_d |
DHT22 Temperatur innen |
|
sensorwert_e |
DHT22 Luftfeuchtigkeit innen |
|
sensorwert_f |
AM2301 Temperatur außen |
|
sensorwert_g |
AM2301 Luftfeuchtigkeit außen |
Abgeleitete Werte werden nicht persistent gespeichert, sondern bei Bedarf berechnet.
Beispiel:
-
Temperatur innen (Ø) = (a + d) / 2
-
Luftfeuchtigkeit innen (Ø) = (b + e) / 2
Das vermeidet Redundanz und hält die Datenbasis transparent.
5. Interaktion: Display, Touchsensor & WebSocket
Der RasPi Zero Hub ist kein passives Messgerät.
Display & Touchsensor
-
Das LCD zeigt verschiedene Informationsseiten
-
Der Touchsensor wechselt zyklisch zwischen Ansichten
-
Keine Menülogik, keine Hierarchien – bewusst einfach gehalten
WebSocket als Konfigurationskanal
Über das Webinterface können Laufzeitparameter verändert werden:
-
Schwellenwerte
-
Anzeigezeiten
-
API-Aktivierung
-
Speicherintervalle
Änderungen wirken sofort – ohne Neustart.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
if "daten_speicherintervall" in data: daten_speicherintervall = data["daten_speicherintervall"] konfiguration_speichern( sensor_name, sensor_standort, terminalausgabe, LUFTFEUCHTIGKEIT_SCHWELLENWERT, display_anzeige_dauer, OWM_API_Activ, OWM_API_KEY, OWM_Lat, OWM_Lon, extern_datenbank_aktiv, extern_datenbank_api_key, extern_datenbank_speicherintervall, beginn_led_steuerung, ende_led_steuerung, daten_speicherintervall ) |
Die WebSocket-Nachricht ändert zunächst die Runtime-Variablen.
Anschließend wird die Konfiguration persistent gespeichert.
Damit gilt:
-
Änderungen wirken sofort
-
bleiben nach Neustart erhalten
-
werden ausschließlich zentral verwaltet
Der WebSocket dient dabei nur der lokalen Steuerung, nicht der Fernbedienung.
6. Speicherung: Lokal zuerst, extern optional
Lokale Speicherung (SQLite)
Jeder Messzyklus wird lokal gespeichert – unabhängig von Netzwerk oder API.
|
1 2 3 4 5 6 7 8 |
def sensordaten_speichern(timestamp, sensor_id, temperature, humidity, pressure): with sqlite3.connect(sensordata_db_path) as conn: c = conn.cursor() c.execute( "INSERT INTO sensordaten (timestamp, sensor_id, temperature, humidity, pressure) VALUES (?, ?, ?, ?, ?)", (timestamp, sensor_id, temperature, humidity, pressure) ) conn.commit() |
Die lokale Datenbank ist die stabile Basis des Systems.
Externe Dienste sind optional – niemals Voraussetzung für den Betrieb.
Externe Speicherung (API)
Optional können Daten zusätzlich an eine externe API übertragen werden.
Zweck:
-
Langzeitarchivierung
-
Zentrale Auswertung
-
Dashboard-Anbindung
Wichtig:
-
API-Key-basiert
-
Rate-limitiert
-
Zeitstempel-validiert
Die externe Speicherung ergänzt die lokale Datenbank – sie ersetzt sie nicht.
7. Externe Daten: OpenWeather als Vergleichswert
Zusätzlich können Wetterdaten von OpenWeather eingebunden werden.
Diese Daten:
-
werden nicht mit eigenen Sensoren vermischt
-
dienen als Referenzwerte
-
fließen nur in Anzeige und Vergleich ein
Die Kernlogik basiert ausschließlich auf eigenen Messungen.
8. Fazit: Ein bewusst modularer Ansatz
Die Architektur des RasPi Zero Hub folgt drei Grundprinzipien:
-
Trennung von Messung, Logik und Darstellung
-
Lokale Funktionalität ohne externe Abhängigkeiten
-
Optionale Erweiterbarkeit statt Zwang
Die Python-Zentrale bildet den stabilen Kern.
Alle anderen Ebenen – Display, Webinterface, externe API – greifen auf diesen Kern zu, ohne ihn zu umgehen.
In den nächsten Beiträgen gehe ich gezielt auf einzelne Teilbereiche ein – beginnend mit der Sensorik und der Messwert-Aufbereitung.
Wenn du diese Artikelserie bisher nicht kennst, hier sind die bisher erschienenen Einträge des Projekttagebuchs.
- Projekttagebuch: RasPi Zero Hub – Die Projektidee
- Projekttagebuch: RasPi Zero Hub – Grundlagen zur Hardware
- Projekttagebuch: RasPi Zero Hub – Aufbau der Hardware
- Projekttagebuch: RasPi Zero Hub – eine umfassende Schritt-für-Schritt-Anleitung zum Einrichten und Installieren aller benötigten Bibliotheken
Der vollständige Projektcode des RasPi Zero Hub steht als Download zur Verfügung.
Alle Python-Dateien, Konfigurationen sowie die Weboberfläche sind dort gebündelt abrufbar:


Kleiner Hinweis, alle Kommentare werden moderiert.
Dies bedeutet, der Kommentar wird vor der Veröffentlichung durchgelesen und von mir geprüft. Auch behalte ich mir vor, jeden Kommentar zu löschen, der nicht direkt auf das Thema abzielt oder nur den Zweck hat, Leser oder Autoren herabzuwürdigen.