DH40 — Datenfluss

English version · Projektübersicht · VPS-Demo-Parität · VPS-Betrieb · Test-Labor Mac + VPS

Wie Sensor-, App- und Gesundheitsdaten in DeinHaus 4.0 fließen — vom Raspberry Pi im Haushalt über die THD-Server bis zu Forschungs-Tools.

Referenz-Stack: dh40-software-and-hardware-architecture-master/wohnung/docker/ (Edge) und …/thd/ (zentral).


Überblick

Es gibt vier parallele Datenpfade (zwei am Haushalt-Edge, ein Cloud-Gesundheitsimport, ein Jetson-Forschungspfad):

Pfad Speicher Zweck Nutzer
Lokale Zeitreihen InfluxDB 1.8 (sensors) Live-Charts, kurze Historie auf dem Tablet dh40-app Wohndaten, optional Chronograf
Zentrale Studienpipeline HiveMQ → MariaDB Langzeitspeicherung, Exporte, ML THD-Forschung, dh40-spark, Streamlit, …
Withings-Gesundheit Withings-Cloud → MariaDB (dh40_withings / database_science) Gewicht, Schlaf, Aktivität von Studiengeräten THD-Forschung, Streamlit — keine lokalen Influx-Charts
Kamera / Notfall-ML Lokale Logs auf Jetson (nur Forschung) Sturz-/Präsenz-/Audio-Notfall-Prototypen Notebooks, MA — nicht Produktions-Pi-Stack

Tablet und Labor-UI lesen lokale Sensordaten (MQTT + Influx). Z-Wave- und Button-Daten werden über VPN + MQTT-Bridge zum THD repliziert. Withings umgeht die Pi-Datenebene — siehe §3. Kameras sind ein separates Forschungsspoor auf Jetson — siehe §4.

flowchart TB subgraph edge["Haushalt Edge (Raspberry Pi)"] ZW[zwavejs2mqtt / Sensoren] MQ[Mosquitto] TG[Telegraf] INFL[(InfluxDB)] CFG[config-provider] APP[dh40-app] LAB[laborvisualisierung] ZW -->|zwavejs2mqtt/… TCP 1883| MQ MQ --> TG --> INFL APP -->|Flux HTTPS :8087| INFL APP -->|mqtts WSS :8883| MQ APP -->|homeid, Withings| CFG LAB -->|mqtts WSS :8883| MQ APP -->|app/button_*| MQ end subgraph uplink["Sicherer Uplink"] VPN[OpenVPN-Client] CERTS[dh40-ca + MQTT-Zertifikate] end subgraph thd["TH Deggendorf"] HIVE[HiveMQ] H2D[MQTT → DB-Konnektoren] MDB[(MariaDB)] EXP[Exporte / VPN-Portal] HIVE --> H2D --> MDB MDB --> EXP end subgraph research["Forschung (offline)"] SPARK[dh40-spark] SDS[sensor-data-science] ST[dh40-streamlit] EXP --> SPARK EXP --> SDS EXP --> ST end MQ -->|Bridge TLS VPN| HIVE VPN --- edge CERTS --- MQ

1. Sensordaten (Edge)

Quelle

MQTT-Topics

Muster zwavejs2mqtt/<gateway>/<node>/…. Beispiele:

Topic-Muster Messgröße Nutzung
…/Air_temperature Raumtemperatur Wohndaten, Labor
…/Humidity Luftfeuchtigkeit Wohndaten, Labor
…/+/Door_state Tür/Fenster Wohndaten, Labor
…/+/Motion_sensor_status Bewegung Heatmap, Labor
…/Power Leistung Steckdose Wohndaten
…/level, …/isLow Batterie Wohndaten

Vollständige Bridge-Liste: wohnung/docker/mosquitto2mosquitto/config/mosquitto.conf.

Nachrichtenformat (JSON für Telegraf)

{
  "time": 1719000000000,
  "value": "22.5",
  "nodeName": "Raumklimasensor",
  "nodeLocation": "Wohnzimmer"
}

Tags über topic_parsing: sensor_id, measured, measured_detail.

Nach InfluxDB

MQTT (1883) → Telegraf → Measurement mqtt_consumer

Nach MariaDB (Studie)

Derselbe MQTT-Strom wird per Bridge zu THD HiveMQ gesendet (TLS, Zertifikate, Präfix data/<home_id>/). Konnektoren schreiben in dh40 (roh).


2. Tablet-App (dh40-app)

Config

Anfrage Produktion Inhalt
…/homeid.txt Port 8080 Wohnungs-ID oder DEMODEMO
…/config.json Port 8080 Withings-OAuth-Tokens (Legacy — siehe §3)

Button-Log (Aktivitätsprotokoll)

Topic Inhalt
app/button_press Einzelner Tipp
app/full_button_log Periodischer Bulk-Export

Produktion: mqtts://<pi>:8883. Topics werden zur Bridge nach THD gespiegelt.

Wohndaten-Charts

Abfrage per Influx Flux (nicht MQTT): Temperatur, Feuchte, Leistung, VOC, CO₂, Bewegung, Türen, Akkus — 24h / 7d / 30d.


3. Withings-Gesundheitsdaten

Withings-Geräte verbinden sich nicht mit dem Raspberry Pi und nutzen kein lokales MQTT oder Influx. Sie koppeln mit dem Smartphone des Teilnehmers und der Withings-Cloud (Health Mate). Die Studie importiert Gesundheitsmetriken per zentralem Batch-Job am THD — parallel, aber getrennt von der Z-Wave-Edge-Pipeline.

Repos: dh40-withings-mariadb-main, dh40-withings-auth-server-main, dh40_config_provider_poc-main, dh40-app-withings-poc-master (nur POC).

flowchart TB subgraph participant["Teilnehmer"] DEV[Withings Waage / Uhr / Schlafmatte] HM[Withings Health Mate App] DEV <-->|Wi‑Fi / BT| HM HM <-->|Withings-Cloud| WC[Withings REST API] end subgraph edge["Haushalt Edge (Pi) — nur Config"] CFG[config-provider :8080] APP[dh40-app Tablet] APP -->|GET homeid.txt| CFG APP -.->|optional config.json POC| CFG APP -->|Deep-Link withings://home| HM end subgraph setup["Einmaliges OAuth (pro Home-ID)"] AUTH[dh40-withings-auth-server] AUTH -->|refresh_token| TOK[Withings-Tokens/home_id/credentials.json] end subgraph thd["TH Deggendorf — täglicher Import"] CRON[dh40-withings-mariadb Cron] CRON -->|HTTPS + OAuth| WC CRON --> RAW[(MariaDB dh40_withings)] CRON --> WH[(MariaDB dh40_warehouse / database_science)] end WC --- participant TOK --> CRON

Geräte und Teilnehmer-UX

Komponente Rolle
Withings-Hardware Waage, Uhr, Schlafanalyse, …
Health Mate App Kopplung und Alltagsnutzung
dh40-app „Gesundheitsdaten“ Verlinkt Health Mate — keine Withings-Charts in dh40-app
Wohndaten-Charts Nur Influx (Z-Wave-Umweltsensoren)

OAuth-Einrichtung (einmal pro Studien-Haushalt)

  1. Forschungsteam startet dh40-withings-auth-server (Flask) oder gleichwertigen OAuth-Flow.
  2. Teilnehmer autorisiert die DH40-Withings-Anwendung im Browser.
  3. Callback liefert refresh_token und access_token.
  4. Tokens liegen am THD unter Withings-Tokens/<home_id>/credentials.json.

Der Pi-config-provider kann config.json mit OAuth-Feldern ausliefern — für dh40-app-withings-poc. In der Haupt-dh40-app ist fetchWithingsConfig deaktiviert; der Produktionsimport hängt nicht vom Tablet ab.

Zentraler Batch-Import (dh40-withings-mariadb)

Läuft auf THD Docker, nicht auf dem Pi:

Zeitplan Skript Aktion
Täglich 17:00 withings_to_db.py Pro Withings-Tokens/<home_id>/ Withings-API aufrufen und Zeilen anfügen
Täglich 00:00 sensor_data_transfer.py Nicht Withings — Z-Wave-Warehouse-Tabellen
API-Aufruf MariaDB-Tabelle Inhalt
measure_get_meas withings_measures Gewicht, Puls, Körperzusammensetzung, …
sleep_get_summary withings_sleepsum Nächtliche Schlaf-Aggregate
sleep_get withings_sleep Zeitreihen: Schlafzustand, HR, RR, Schnarchen

Schreibziele: dh40_withings (roh) und dh40_warehouse / database_science.

Withings vs. Z-Wave

Z-Wave Withings
Gerät → Hub Z-Wave-USB → Pi Handy → Withings-Cloud
Edge-Protokoll MQTT am Pi Keins am Pi
Lokaler Speicher InfluxDB Keiner
Tablet-Charts Wohndaten (Flux) Nur Health Mate
Zentral MQTT-Bridge → dh40 API-Pull → withings_*
Timing Nahezu live Täglicher Cron

Mosquitto-Bridge-Hinweis

Die Pi-Bridge hat eine eingehende Regel data/<home_id>/withings/# (HiveMQ → lokaler Mosquitto). Das ist nicht der Hauptimport; Produktionsdaten kommen über withings_to_db.py am THD.

Forschungsnutzung

Withings-Tabellen in database_science für dh40-streamlit, sensor-data-science, dh40-spark — über THD-VPN-Exporte (https://dh40-vpn.th-deg.de:8443).


4. Kamera und Notfallerkennung (Forschung)

Video- und Audio-Notfallerkennung in DH40 sind Forschungs-Nebenprojekte — sie sind nicht im Standard-Pi-Stack (wohnung/docker/), nicht auf der öffentlichen VPS-Demo und im Archiv nicht an dh40-app-Charts oder die HiveMQ-Studien-Bridge angebunden.

Repos: dh40-camera-module-master, dh40-emergency-detection-main, dh40-smart-mirror-2-main (Messe-Emotionsdemo).

flowchart LR subgraph research["Forschungs-Edge (Jetson Nano — optional)"] CAM[USB-Webcam /dev/video0] JET[Jetson Docker] MP[MediaPipe Pose + Sturzregeln] SSD[jetson-inference Personen] AUD[USB-Mikro / ESP32-Audio WIP] CAM --> JET JET --> MP JET --> SSD AUD -.-> JET MP -->|stdout / MQTT-Stub| LOG[Konsole / lokale Logs] SSD -->|CSV| LOG end subgraph prod["Produktions-Studienstack — getrennt"] PI[Raspberry Pi MQTT + Influx] APP[dh40-app Wohndaten] PI --> APP end research -.-x prod

Projekte im Überblick

Projekt Hardware Eingabe Ausgabe (heute) Status
dh40-camera-module Jetson + Webcam Live-Video print('Fall detected'); MQTT auskommentiert in main.py Forschungsprototyp
dh40-camera-module / jetson Jetson + jetson-inference Videostream detections.csv SSD-Demo
dh40-emergency-detection Jetson + Mikro + Webcam Audio + Video Notebooks, lokale CSV Laufende Forschung / MA
dh40-smart-mirror-2 Jetson + Webcam Gesicht Emotions-Overlay am Spiegel Messe-Demonstrator

Ablauf dh40-camera-module (Video-Sturzerkennung)

Typisches Labor-Setup laut Repo-README:

  1. Jetson Nano mit USB-Kamera, Docker + NVIDIA-Runtime.
  2. mediapipe/start.sh startet Pose-Schätzung (pose_estimation.py / main.py).
  3. MediaPipe Pose extrahiert Körper-Landmarks pro Frame.
  4. FallDetector wertet Bewegung, Winkel und Bounding-Box über ein kurzes Frame-Fenster aus.
  5. Bei validiertem Sturz: stdout (Fall detected). MQTT-Code ist vorbereitet, aber auskommentiert.

Edge-ML auf dem Jetson — kein Video-Streaming zum Tablet oder THD.

dh40-emergency-detection (Audio + Video)

Spur Ansatz
Audio Mel-Spektrogramm + CNN (ESC-50 + Sturzgeräusche)
Video MediaPipe-Sturzerkennung zum Vergleich
Ausblick MA ESP32-Mikrofon-Netzwerk statt einzelnem Jetson

Keine Anbindung an Mosquitto, InfluxDB oder MariaDB im Archiv.

vs. Produktion und Überwachungskameras

Pi-Produktion Kamera-Forschung Ring & Co.
Gerät Raspberry Pi Jetson Nano Kamera + Cloud
Daten MQTT-Events Lokale Video-ML Video-Streams
Tablet dh40-app Kein Viewer Vendor-App
Studien-DB MQTT-Bridge Nicht angebunden Vendor-Cloud
Zweck Ambient-Sensing-Studie Sturz-/Notfall-ML-Forschung Sicherheitsüberwachung

Anbindung an den Pi-MQTT-Bus?

Prinzipiell könnte ein Custom-Publisher (z. B. fall_detected) an Mosquitto senden — main.py skizziert paho.mqtt. Im Archiv ist das nicht umgesetzt. Video wird nicht in Influx oder MariaDB gespeichert.

Forschungsnutzung

Ergebnisse in lokalen Logs, CSV und Notebooks — kein automatischer Pfad zu Spark/Streamlit, außer man exportiert manuell.


5. Laborvisualisierung

Abonniert MQTT (WebSocket) für Live-Kacheln auf dem Grundriss — ohne Influx.


Mechanismus Rolle
dh40-ca OpenVPN-Clientzertifikat pro Wohnungs-ID
OpenVPN Pi im THD-Netz (z. B. 10.8.0.1)
MQTT-Bridge-Zertifikate TLS zu HiveMQ
dh40_web.crt Lokales HTTPS auf dem Pi

Ohne VPN und vertrauenswürdige Zertifikate läuft die Bridge nicht.


7. TH Deggendorf (zentral)

flowchart LR BR[Mosquitto-Bridge] -->|data/home_id/…| HIVE[HiveMQ] HIVE --> W2D[hivemq2db / Konnektoren] W2D --> RAW[(MariaDB dh40)] W2D --> SCI[(MariaDB database_science)] WITH[dh40-withings-mariadb] --> SCI
Datenbank Inhalt
dh40 Rohe MQTT-/Sensordaten
database_science Aufbereitete Features, App-Logs, Withings

Exporte: https://dh40-vpn.th-deg.de:8443 (THD-VPN). Siehe dh40-spark-main/data/README.md.


8. Forschung (Batch)

Projekt Eingabe Rolle
dh40-spark DB-Exporte PySpark / Jupyter
sensor-data-science CSV Tages-Features + Schlaf
dh40-streamlit CSV / Withings Exploration

Getrennt vom Live-Edge-Stack — arbeitet auf Exporten, nicht auf Live-MQTT.


9. Öffentliche VPS-Demo (_demo/)

Simuliert den Haushalt-Edge für Demos — keine Verbindung zu HiveMQ/MariaDB.

flowchart LR SIM[mqtt-simulator] MQ[Mosquitto] TG[Telegraf] INFL[(InfluxDB)] CADDY[Caddy HTTPS] APP[dh40-app /app] LAB[lab /lab] SIM -->|zwavejs2mqtt/…| MQ MQ --> TG --> INFL CADDY -->|/influx Flux| INFL CADDY -->|/mqtt WSS| MQ CADDY -->|/config| CFG[homeid + config.json] APP --> CADDY LAB --> CADDY
Produktion Demo
zwavejs2mqtt mqtt-simulator
config-provider :8080 Caddy /config/
influxdb-proxy :8087 Caddy /influx/
mqtts :8883 wss://<domain>/mqtt
30d Influx-Historie influx-seed (einmalig)
OpenVPN + Bridge nicht deployed

Details: demo-production-parity.md, vps-operations_de.md.


10. Kurzreferenz

Client Protokoll Ziel Daten
dh40-app HTTPS config-provider Home-ID, Withings-Config (Legacy)
dh40-app Flux/HTTPS Influx-Proxy Wohndaten
dh40-app WSS/MQTT Mosquitto Button-Log
dh40-app Deep-Link Health Mate Withings-UI öffnen
laborvis WSS/MQTT Mosquitto Live-Sensoren
Telegraf TCP/MQTT Mosquitto Alle Sensor-Topics
Mosquitto-Bridge TLS/MQTT HiveMQ Z-Wave + Button-Replikation
dh40-withings-mariadb HTTPS REST Withings API Messungen + Schlaf → MariaDB
Forscher HTTPS (VPN) dh40-vpn.th-deg.de DB-Exporte (inkl. withings_*)

Siehe auch