RasPi Zero Hub – Sensorik & Messwert-Aufbereitung
Nachdem im vorherigen Beitrag die Architektur und der Datenfluss des RasPi Zero Hub beschrieben wurden, geht es nun um den ersten wirklich greifbaren Teil der Software: die Sensorik.
Dieser Beitrag beantwortet konkret:
-
welche Sensoren eingesetzt werden
-
welche Aufgaben sie jeweils haben
-
wie Rohdaten verarbeitet werden
-
wie daraus verwertbare Messwerte entstehen
Es geht nicht um Verkabelung oder Installation – diese Punkte wurden bereits in früheren Artikeln behandelt.
1. Warum mehrere Sensoren für ähnliche Messgrößen?
Im RasPi Zero Hub werden für den Innenbereich zwei unabhängige Sensorquellen genutzt:
-
BME280
-
DHT22
Beide liefern Temperatur und Luftfeuchtigkeit, jedoch mit unterschiedlichen Eigenschaften:
-
unterschiedliche Messverfahren
-
unterschiedliche Reaktionszeiten
-
unterschiedliche Fehleranfälligkeit
Der bewusste Einsatz mehrerer Sensoren erlaubt:
-
Plausibilitätsprüfungen
-
Mittelwertbildung
-
robustere Aussagen über das Raumklima
Für den Außenbereich kommt zusätzlich ein AM2301 (AM3201) zum Einsatz.
2. Überblick: Zuständigkeiten der Sensoren
|
Sensor |
Messgrößen |
Einsatz |
|---|---|---|
|
BME280 |
Temperatur, Luftfeuchtigkeit, Luftdruck |
Innen |
|
DHT22 |
Temperatur, Luftfeuchtigkeit |
Innen (zweite Quelle) |
|
AM2301 |
Temperatur, Luftfeuchtigkeit |
Außen |
Der Luftdruck ist bewusst nur innen relevant und wird ausschließlich über den BME280 erfasst.
3. Sensoren einlesen – bewusst getrennt
Die Sensoren werden im Python-Code nicht gemeinsam, sondern getrennt ausgelesen.
Das vereinfacht Debugging und verhindert Abhängigkeiten.
Beispiel: BME280
|
1 2 3 |
bme_temperatur = bme280.get_temperature() bme_luftfeuchtigkeit = bme280.get_humidity() bme_luftdruck = bme280.get_pressure() |
Beispiel: DHT22
|
1 2 3 4 |
dht_humidity, dht_temperature = Adafruit_DHT.read_retry( dhtSensorWeissTyp, dhtSensorWeissGpio ) |
Beispiel: AM2301 (Außen)
|
1 2 3 4 |
am_humidity, am_temperature = Adafruit_DHT.read_retry( dhtSensorAM3201Typ, dhtSensorAM3201Gpio ) |
Diese Trennung ist nicht zufällig.
Sie wird auch im Hauptzyklus der Anwendung konsequent umgesetzt:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
while True: 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 ) time.sleep(sensor_intervall) |
Die Sensorik läuft in einem klar definierten Intervall.
Es erfolgt an dieser Stelle ausschließlich Datenerfassung – keine Bewertung.
4. Rohdaten ≠ Anzeigewerte
Ein häufiger Fehler in IoT-Projekten ist es, Messwerte sofort weiterzuverarbeiten oder anzuzeigen.
Im RasPi Zero Hub gilt bewusst:
Rohdaten bleiben Rohdaten.
Erst im nächsten Schritt werden sie:
-
geprüft
-
kombiniert
-
weiterverwendet
Diese Trennung hält die Logik nachvollziehbar und verhindert implizite Nebenwirkungen.
5. Festes Messwert-Mapping
Damit alle Systemteile dieselbe Bedeutung der Werte kennen, ist das Mapping fest definiert:
-
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
Diese Zuordnung ist im Python-Code dokumentiert und im Dashboard explizit gemappt.
Es wird nichts implizit interpretiert.
6. Mittelwertbildung für Innenwerte
Für Temperatur und Luftfeuchtigkeit im Innenbereich werden Mittelwerte gebildet.
|
1 2 3 4 5 6 7 8 9 |
def berechne_mittelwert(wert1, wert2): if wert1 is not None and wert2 is not None: return (wert1 + wert2) / 2 elif wert1 is not None: return wert1 elif wert2 is not None: return wert2 else: return None |
Beispiel (Temperatur innen):
|
1 |
temp_innen = berechne_mittelwert(bme_temperatur, dht_temperature) |
Diese Mittelwerte sind keine rein kosmetische Anzeige, sondern werden direkt in der Entscheidungslogik verwendet:
|
1 2 3 4 5 6 7 8 |
innen_luftfeuchtigkeit = berechne_mittelwert( bme_luftfeuchtigkeit, dht_humidity ) if innen_luftfeuchtigkeit is not None: if innen_luftfeuchtigkeit > LUFTFEUCHTIGKEIT_SCHWELLENWERT: raumklima = False |
Die Mittelwerte dienen somit als stabile Entscheidungsgrundlage.
Sie werden:
-
live berechnet
-
für Logik verwendet
-
im Dashboard angezeigt
Nicht jedoch dauerhaft gespeichert.
7. Umgang mit Messfehlern
Sensoren sind nicht perfekt.
Deshalb wird jeder Wert einzeln geprüft.
Beispielhafte Fallback-Logik:
|
1 2 3 4 5 6 7 8 |
if bme_temperatur is not None and dht_temperature is not None: temp_innen = (bme_temperatur + dht_temperature) / 2 elif bme_temperatur is not None: temp_innen = bme_temperatur elif dht_temperature is not None: temp_innen = dht_temperature else: temp_innen = None |
Ergänzend ist im Code eine transparente Debug-Ausgabe vorgesehen:
|
1 2 3 4 |
if terminalausgabe: print("BME:", bme_temperatur, bme_luftfeuchtigkeit) print("DHT:", dht_temperature, dht_humidity) print("AM :", am_temperature, am_humidity) |
Damit lässt sich jederzeit nachvollziehen, welche Werte tatsächlich vorliegen.
Fehlende Messwerte führen nicht zum Systemabbruch.
Das System bleibt auch bei Teilausfällen funktionsfähig.
8. Übergabe an Logik, Anzeige und Speicherung
Nach der Aufbereitung stehen drei Wege offen:
-
Anzeige auf dem Display
-
Logik (z. B. LED-Steuerung)
-
Speicherung (SQLite / API)
Die Sensorwerte werden atomar in den globalen Zustand übernommen:
|
1 2 3 4 5 6 7 |
with state_lock: bme_temperatur = local_bme_temperatur bme_luftfeuchtigkeit = local_bme_luftfeuchtigkeit dht_temperature = local_dht_temperature dht_humidity = local_dht_humidity am_temperature = local_am_temperature am_humidity = local_am_humidity |
Alle Systemteile greifen anschließend auf dieselbe konsistente Datenbasis zu.
Es gibt keine parallelen Berechnungen und keine widersprüchlichen Werte.
9. Fazit
Die Sensorik im RasPi Zero Hub ist bewusst:
-
redundant
-
transparent
-
erweiterbar
Durch die klare Trennung von:
-
Rohdaten
-
Aufbereitung
-
Nutzung
bleibt der Code nachvollziehbar und robust.
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
- RasPi Zero Hub – Architektur & Datenfluss
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.