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

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):

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.

S
Description
Logged jedes Laden an der Wallbox
Readme 113 KiB
Languages
TypeScript 43.4%
Python 39.1%
Shell 8.5%
Dockerfile 4.9%
CSS 2.1%
Other 2%