Initial commit: Auto-Charger Logging Web-App

MQTT-Collector (Python/paho-mqtt) speichert abgeschlossene go-e
Wallbox-Ladungen in SQLite; Next.js-Web-App zeigt sie als Tabelle mit
Energie-Summen (Monat/Jahr/gesamt) im werte-next-Design. Zwei
Docker-Container mit gemeinsamem DB-Volume.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-03 19:12:04 +02:00
commit 7dd3215520
26 changed files with 8022 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
# 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
Eine Ladung lässt sich per `mosquitto_pub` simulieren (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.