3.4 KiB
Backend (Empfang + Auslieferung des Frontends)
Minimaler Server mit Python-Bordmitteln (Python ≥ 3.8, kein pip install, läuft direkt unter Windows). Er nimmt die Messwerte des ESP8266 entgegen, hält die letzten 100 Messungen im Speicher und liefert zusätzlich das Frontend aus. Die Aggregationslogik (Präferenzen, CO2-Hard-Constraint, Sensor-Veto) ist hier noch nicht enthalten.
ESP8266 ──POST /api/messwerte──▶ backend/server.py ◀──GET /api/messwerte── Browser (frontend/)
▲ ◀──GET /api/messwerte── Unity-Zwilling
└───────────POST /api/steuerung─── Unity-Zwilling
Starten
Doppelklick auf start.bat oder:
python backend/server.py # Port 3000 (oder: python backend/server.py 8080)
python backend/simulator.py # optional: Fake-Sensordaten ohne Hardware
python backend/simulator.py --szenario demo # Szenarien nacheinander: normal, stickig, normal, hitze, kalt
Szenarien des Simulators: wechsel (Standard, Werte schwanken), normal, hitze (→ ca. 30 °C), stickig (→ ca. 1600 ppm), kalt (→ ca. 17 °C), demo. Die Werte ändern sich langsam wie in echt, damit man im Unity-Zwilling sieht, wann die Steuerung umschaltet.
Frontend: http://localhost:3000, im Hotspot von anderen Geräten: http://<Laptop-IP>:3000
Beim Start zeigt der Server die IP-Adressen des Laptops und prüft, ob SERVER_IP in firmware/dht11_lcd/wifi_config.h dazu passt („OK“ bzw. „ACHTUNG“). Jeder empfangene Messwert erscheint mit Absender-IP im Fenster (127.0.0.1 = Simulator, 172.20.10.x = ESP im Hotspot).
Firewall (einmalig)
Windows stuft den Handy-Hotspot meist als „öffentliches Netz“ ein und blockiert eingehende Verbindungen. firewall_freigeben.bat per Rechtsklick → „Als Administrator ausführen“ gibt Port 3000 frei.
Schnittstelle (Datenvertrag)
POST /api/messwerte, Content-Type: application/json, reines HTTP (kein TLS):
{"temperatur": 22.5, "luftfeuchte": 45.0, "eco2": 612, "tvoc": 30}
| Feld | Einheit | Quelle |
|---|---|---|
temperatur |
°C | DHT11 |
luftfeuchte |
% | DHT11 |
eco2 |
ppm | CCS811 |
tvoc |
ppb | CCS811 |
Alle Felder sind Zahlen; ein Feld darf fehlen oder null sein (z. B. CCS811 noch nicht bereit). Den Zeitstempel setzt der Server beim Empfang.
GET /api/messwerte liefert {"aktuell": {...} | null, "verlauf": [...]}.
Steuerbefehle vom Unity-Zwilling
POST /api/steuerung (sendet Unity im Modus „Backend“, sobald sich etwas ändert, sonst alle 10 s):
{"window": "open", "blind": 1.0, "heat": 0.0, "vent": 0.0, "light": 0.4, "beamer": 0, "szenario": "Hitze"}
| Feld | Bedeutung |
|---|---|
window |
closed, tilted oder open |
blind, heat, vent, light |
Sollwert 0 … 1 (Jalousie unten, Heizung, Lüftungsanlage, Licht) |
beamer |
0/1 |
szenario |
vom Zwilling erkanntes Szenario |
Der Server merkt sich nur den letzten Stand (GET /api/steuerung → {"aktuell": {...} | null}) und gibt ihn im Fenster aus. Echte Aktoren gibt es noch nicht.
Test ohne Hardware (PowerShell):
Invoke-RestMethod -Method Post -Uri http://localhost:3000/api/messwerte -ContentType "application/json" `
-Body '{"temperatur":22.5,"luftfeuchte":45,"eco2":1150,"tvoc":30}'