Files
admin ca708b5dda docs: Test-Abschnitt reparieren + sim_charge.py aufnehmen
- README: leerer Code-Block im Abschnitt "Test ohne Auto" ersetzt durch
  sim_charge.py-Beispiele und die mosquitto_pub-Sequenz.
- collector/sim_charge.py: Test-Skript zum Simulieren einer Ladung über MQTT.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 13:13:41 +02:00

78 lines
3.3 KiB
Markdown

# Auto-Charger Log
Kleine Web-App, die die Ladevorgänge des Autos protokolliert. Die Daten kommen
per MQTT von der **go-e Wallbox** (Device-ID `310014`), werden in einer
**SQLite**-Datenbank gespeichert und als Tabelle mit Energie-Summen angezeigt.
Läuft als zwei Docker-Container auf einem lokalen Server.
## Architektur
| Container | Stack | Aufgabe |
|-------------|--------------------------------|----------------------------------------------------|
| `collector` | Python + `paho-mqtt` | MQTT abonnieren, abgeschlossene Ladungen → SQLite |
| `web` | Next.js 16 / React 19 / Tailwind 4 | SQLite (read-only) lesen, Tabelle + Summen anzeigen |
Beide teilen sich das Volume `./data` mit der Datei `charges.db`. Der Collector
besitzt alle Schreibzugriffe, die Web-App liest nur.
## MQTT-Daten (go-e API v2)
Basis-Topic `go-eCharger/310014/<key>`:
- `car` — Fahrzeug-Status (`1`=Idle, `2`=Charging, `3`=WaitCar, `4`=Complete).
Steuert die Session-Erkennung: Start bei Wechsel nach `2`, Abschluss bei
Wechsel nach `1` oder `4`.
- `wh` — geladene Energie der aktuellen Ladung in Wh.
- `cdi` — Objekt `{"type":1,"value":<ms>}` mit der Ladedauer in Millisekunden.
## Einrichtung
```bash
cp .env.example .env
# MQTT_USER / MQTT_PASS in .env eintragen
docker compose up --build
```
Web-App danach unter `http://<server>:8082/` (Port via `WEB_PORT` in `.env`).
## Konfiguration (`.env`)
| Variable | Bedeutung | Default |
|-------------------|--------------------------------------------|----------------------|
| `MQTT_HOST` | MQTT-Broker | `nuccy` |
| `MQTT_PORT` | MQTT-Port | `1883` |
| `MQTT_USER/PASS` | MQTT-Credentials | – |
| `MQTT_TOPIC_BASE` | Basis-Topic der Wallbox | `go-eCharger/310014` |
| `DB_PATH` | Pfad der SQLite-DB im Container | `/data/charges.db` |
| `TZ` | Zeitzone (für Monats-/Jahres-Summen) | `Europe/Berlin` |
| `WEB_PORT` | Host-Port der Web-App | `8082` |
## Test ohne Auto
Am einfachsten über das mitgelieferte Skript `collector/sim_charge.py` (liest
Broker/Topic aus `.env`, sendet `car=2 → wh → cdi → car=4`):
```bash
.venv/bin/python collector/sim_charge.py # 5230 Wh, 3600 s
.venv/bin/python collector/sim_charge.py --wh 8000 --duration 5400
.venv/bin/python collector/sim_charge.py --end idle # mit car=1 beenden
```
Alternativ direkt per `mosquitto_pub` (Reihenfolge beachten):
```bash
mosquitto_pub -h nuccy -t go-eCharger/310014/car -m 2
mosquitto_pub -h nuccy -t go-eCharger/310014/wh -m 7350
mosquitto_pub -h nuccy -t go-eCharger/310014/cdi -m '{"type":1,"value":3600000}'
mosquitto_pub -h nuccy -t go-eCharger/310014/car -m 4
```
Erwartung: eine neue Zeile (Dauer 1:00, Energie 7,35 kWh); die Summen
aktualisieren sich beim Neuladen der Seite.
## Bekannte Einschränkung
Der Collector hält den Session-Zustand nur im Speicher. Startet er mitten in
einer laufenden Ladung, wird genau diese eine Ladung ggf. nicht (vollständig)
erfasst.