GruppeC/backend/README.md

65 lines
3.4 KiB
Markdown

# 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:
```bash
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):
```json
{"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):
```json
{"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):
```powershell
Invoke-RestMethod -Method Post -Uri http://localhost:3000/api/messwerte -ContentType "application/json" `
-Body '{"temperatur":22.5,"luftfeuchte":45,"eco2":1150,"tvoc":30}'
```