RasPi Zero Hub – Speicherung & externe Anbindungen
LINKS NOCH BEARBEITEN!!!!
In den vorherigen Beiträgen wurden die Architektur & Datenfluss, Sensorik & Messwert-Aufbereitung und die Laufzeit-Konfiguration per WebSocket beschrieben.
Dieser Beitrag behandelt den letzten Baustein der Software-Architektur: die persistente Speicherung der Daten sowie die optionale externe Anbindung.
Dabei geht es nicht nur darum, wo Daten gespeichert werden, sondern um das bewusste Zusammenspiel aus:
-
lokaler Stabilität
-
kontrollierter externer Weitergabe
-
technischer Absicherung
1. Grundprinzip: Lokal zuerst, extern optional
Ein zentrales Designziel des RasPi Zero Hub lautet:
Das System muss vollständig autark funktionieren.
Deshalb gilt:
-
Lokale Speicherung ist immer aktiv
-
Externe Speicherung ist optional und zusätzlich
Die externe API ersetzt niemals die lokale Datenbank.
2. Lokale Speicherung mit SQLite
SQLite ist für dieses Projekt ideal, weil:
-
keine zusätzliche Server-Software benötigt wird
-
die Datenbank liegt direkt auf dem Raspberry Pi
-
sie stabil, schnell und bewährt ist
Minimaler Speichervorgang
|
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 Speicherung erfüllt drei Aufgaben:
-
Nachvollziehbarkeit der Messungen
-
Ausfallsicherheit bei Netzwerkproblemen
-
Grundlage für spätere Auswertungen
3. Zeitgesteuerte Speicherung
Gespeichert wird nicht bei jedem Sensorzyklus, sondern intervallgesteuert.
|
1 2 3 4 5 6 7 8 9 |
if time.time() - letzte_datenspeicherung >= daten_speicherintervall: sensordaten_speichern( aktueller_timestamp, sensor_name, temp_innen, luftfeuchte_innen, bme_luftdruck ) letzte_datenspeicherung = time.time() |
Vorteile:
-
Begrenzung der Datenmenge
-
Schonung der SD-Karte
-
kontrollierte Datenstruktur
4. Übergang zur externen Speicherung
Ist die externe Speicherung aktiviert, werden dieselben Daten zusätzlich versendet.
Wichtig:
-
keine neuen Berechnungen
-
keine neue Logik
-
keine Abweichungen
|
1 2 3 4 |
if extern_datenbank_aktiv: if time.time() - letzte_externe_speicherung >= extern_datenbank_speicherintervall: sende_an_externe_api(datenpaket) letzte_externe_speicherung = time.time() |
Die Python-Anwendung agiert hier als Client.
5. Versand an die externe API
Die Übertragung erfolgt strukturiert und projektgebunden.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def sende_an_externe_api(daten): headers = { "Content-Type": "application/json", "X-API-KEY": extern_datenbank_api_key } response = requests.post( externe_api_url, json=daten, headers=headers, timeout=5 ) if response.status_code != 200: print("Fehler bei externer Speicherung:", response.status_code) |
Die API ist:
-
an einen API-Key gebunden
-
speziell für den RasPi Zero Hub ausgelegt
-
kein allgemeiner IoT-Dienst
Wichtig:
Der RasPi Zero Hub kann problemlos mit einer eigenen, selbst entwickelten API betrieben werden.
Die von mir bereitgestellte API ist ein optionales Angebot für Interessierte,
-
die keine eigene Online-Datenbank betreiben möchten
-
die sich keine eigene Datenbank-API programmieren wollen
-
oder die eine sofort nutzbare Infrastruktur bevorzugen
Weitere Informationen zur bereitgestellten API finden sich hier:
👉 https://raspizerohub.webnist.de/
Die Nutzung bleibt vollständig optional.
Die lokale Speicherung funktioniert unabhängig davon.
6. API-Key-Prüfung
Serverseitig erfolgt:
-
Validierung des API-Keys
-
Zuordnung zum Benutzer
-
Prüfung der Aktivierung
Ohne gültigen Key erfolgt keine Speicherung.
Das verhindert:
-
unkontrollierte Fremdnutzung
-
Datenmüll
-
stille Inkonsistenzen
7. Rate-Limit & Zeitstempel-Validierung
Rate-Limit
Mindestens 60 Sekunden Abstand zwischen zwei externen Speicherungen.
Das schützt:
-
Serverressourcen
-
Datenqualität
-
Systemstabilität
Zeitstempel-Prüfung
Der übermittelte Timestamp wird geprüft auf:
-
gültiges Format
-
plausible Zeit
-
keine Manipulation
Das Rate-Limit kann nicht durch manipulierte Zeitstempel umgangen werden.
8. Messwert-Mapping in der API
Die API speichert ausschließlich klar definierte Felder:
-
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
Die API:
-
interpretiert nichts
-
berechnet nichts
-
speichert nur
Die Auswertung erfolgt ausschließlich im Dashboard.
9. OpenWeather – externe Referenzdaten
Neben eigener Sensorik kann der RasPi Zero Hub OpenWeather-Daten abrufen.
Diese dienen:
-
als Vergleichswerte
-
zur Anzeige externer Temperatur
-
zur Referenz für Außenmessungen
Beispielhafter Abruf
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
def hole_openweather_daten(): url = ( f"https://api.openweathermap.org/data/2.5/weather?" f"lat={OWM_Lat}&lon={OWM_Lon}&appid={OWM_API_KEY}&units=metric" ) response = requests.get(url, timeout=5) if response.status_code == 200: daten = response.json() return { "owm_temp": daten["main"]["temp"], "owm_luftfeuchtigkeit": daten["main"]["humidity"] } return None |
Integration in den Ablauf
|
1 2 3 4 |
if OWM_API_Activ: owm_daten = hole_openweather_daten() if owm_daten: owm_temp = owm_daten["owm_temp"] |
Wichtig:
-
OpenWeather-Daten werden nicht gespeichert
-
Sie fließen nicht in Entscheidungslogik
-
Sie dienen ausschließlich der Anzeige und dem Vergleich
Das verhindert Vermischung von:
-
lokalen Messwerten
-
externen Referenzdaten
Damit bleibt die Datenbasis klar getrennt.
10. Zusammenspiel aller Ebenen
Der vollständige Ablauf:
Sensoren lesen
→ Werte aufbereiten
→ lokal speichern
→ optional extern speichern
→ optional externe Wetterdaten abrufen
→ Anzeige & Auswertung
Jede Ebene besitzt:
-
eine klar definierte Aufgabe
-
keine versteckten Abhängigkeiten
-
keine Doppelverantwortung
11. Fazit
Die Speicher- und Anbindungslogik des RasPi Zero Hub folgt einem klaren Leitgedanken:
Stabilität vor Komfort – Kontrolle vor Automatisierung.
Lokale Speicherung ist Pflicht.
Externe Anbindung ist Kür.
Beide ergänzen sich – ohne voneinander abhängig zu sein.
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
- RasPi Zero Hub – Sensorik & Messwert-Aufbereitung
- RasPi Zero Hub – Webinterface & Konfiguration per WebSocket
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.