12 Commits

Author SHA1 Message Date
admin 6e5f0bbe8d V 1.1.10:
31d geht jetzt wirklich über 31 Tage
2026-07-01 13:24:51 +02:00
admin bb827f197d Fix: Container-Zeitzone Europe/Berlin (Januar fehlte, Ladetage nicht markiert)
Ursache: Container lief in UTC, waehrend die Flux-Aggregation Europe/Berlin
nutzt. Dadurch lagen die in JS (Lokalzeit) berechneten Monats-/Tagesgrenzen
eine Stunde neben den Flux-Balken:
- Januar-Balken (Berlin = 31.12. 23:00 UTC) lag vor 'start' (UTC) und wurde
  weggefiltert.
- Ladetag-Zeitstempel (UTC-Mitternacht) passten nicht auf die Verbrauchsbalken
  (Berliner Mitternacht) -> keine Markierung.

Fix: tzdata ins Image + TZ=Europe/Berlin (Dockerfile und compose). Damit
stimmt die JS-Lokalzeit mit der Flux-Location ueberein. Verifiziert: im
Container ergibt new Date(2026,0,1) den Berliner Monatsanfang.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 17:13:06 +02:00
admin 67fa2de818 Fix: InfluxDB-Host im smarthome-Netz heisst 'influxdb'
INFLUX_URL in docker-compose.prod.yml auf http://influxdb:8086 korrigiert
(verursachte 500 bei allen API-Routen, da Host 'influx' nicht aufloesbar).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 17:07:33 +02:00
admin ead1846767 deploy.sh: schlanker Build ohne separaten buildx-Builder
Statt eines docker-container-Builders (eigener, volllaufender Cache ->
"no space left on device") wird das Image jetzt mit "docker build
--platform linux/amd64" im Standard-Image-Store gebaut und per
"docker push" hochgeladen. Verifiziert: Image ist linux/amd64.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:43:53 +02:00
admin 165d97a02f deploy.sh: nur fuer linux/amd64 bauen
Statt multiplatform (amd64/arm64) wird das Image nur fuer linux/amd64
gebaut und gepusht (nuccy ist amd64).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:39:23 +02:00
admin 6fdf29f040 Docker-Deployment fuer nuccy
- Dockerfile (Next.js standalone, Multi-Stage) + .dockerignore
- deploy.sh fuer strom-next angepasst (Registry docker.citysensor.de,
  multiplatform build & push)
- docker-compose.prod.yml: Netzwerk 'smarthome' (external), InfluxDB als
  Host 'influx', alle Env-Defaults gesetzt, INFLUX_TOKEN aus .env
- .env.production.example (nur Token/Port), public/ fuer den Image-Build
- README: Deploy-Anleitung

Lokal verifiziert: Image baut, Container startet und liefert HTTP 200.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:34:24 +02:00
admin 8873ffe9d3 Crash endgueltig ausschliessen: keine Element-Destrukturierung mehr
Summenzeile (VerbrauchCharts) und Balken-Einfaerbung (BarChart) greifen die
Werte jetzt per Index mit Array.isArray-Guard ab, statt Elemente per [x,y] zu
destrukturieren. Damit kann "(destructured parameter) is not iterable" auch bei
unerwarteten Datenelementen nicht mehr auftreten.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:03:03 +02:00
admin d711c14b59 Fix: Darstellung robust gegen unerwartete Datenelemente
TypeError "(destructured parameter) is not iterable" bei der Summenberechnung
(data.reduce mit [, v]) konnte die Seite crashen, wenn data ein Element
enthielt, das kein [number, number]-Tupel ist.

Loesung: Daten beim Laden in fetchData validieren (nur valide Tupel werden
uebernommen). Damit sind sowohl die Summenzeile als auch BarChart robust.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 15:53:14 +02:00
admin a3a8743998 Navigations-Pfeile an allen Datumseingaben
Links/Rechts-Pfeile (zurueck/vorwaerts) neben jeder Datumsauswahl fuer
schnelle Navigation. Schrittweite je nach Auswahl: Tag (24h, 7d), Monat
(31d), Jahr (365d). Nach dem Klick wird direkt neu geladen.

- Vorwaerts-Pfeil wird deaktiviert, sobald der aktuelle Zeitraum erreicht
  ist (keine Navigation in die Zukunft)
- bei leerem 24h-Feld (rollierend) wird ab heute gerechnet

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 15:47:04 +02:00
admin c7f69ba7b9 Lade-Erkennung: kurze Einbrueche ueberbruecken
Statt durchgehend (stateDuration, das bei jedem Einbruch zurueckgesetzt
wurde) werden jetzt Minuten ueber der Schwelle zu Sessions zusammengefasst
und Einbrueche bis LADEN_MAX_GAP_MIN (Default 10 min) ueberbrueckt. Eine
Session ab LADEN_MIN_HOURS gilt als Ladung.

Damit werden z.B. Ladungen mit kurzem Leistungs-Einbruch (Bsp. 2026-06-20,
~14:58-17:01 mit Einbruch um 16:35) korrekt erkannt.

- Erkennung in Node auf Minuten-Mittelwerten (aggregateWindow mean, Pushdown
  -> schneller als zuvor, ~5s statt ~13s je Monat)
- Tages-Zuordnung Berlin-genau, passt exakt zu den 31d-Balken
- neuer Env-Parameter LADEN_MAX_GAP_MIN

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 15:23:59 +02:00
admin 46c8057155 E-Auto-Lade-Erkennung im 31d-Diagramm
Markiert im 31d-Diagramm die Tage rot, an denen das E-Auto geladen wurde:
Leistung (Feld 'leistung', W) lag laenger als LADEN_MIN_HOURS (Default 2h)
ununterbrochen ueber LADEN_THRESHOLD_KW (Default 11 kW).

- Erkennung serverseitig per Flux stateDuration auf den Sekundendaten
  (24h Vorlauf fuer ueber Mitternacht laufende Ladungen an der Monatsgrenze)
- /api/laden?month=YYYY-MM, Ergebnis gecacht (abgeschlossene Monate dauerhaft,
  laufender Monat 5 min) -> ~15s nur beim ersten Aufruf
- Markierung wird asynchron nachgeladen, Balken erscheinen sofort
- Schwelle/Dauer per Env (LADEN_THRESHOLD_KW, LADEN_MIN_HOURS) einstellbar
- BarChart: optionales highlight-Set faerbt passende Balken

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:49:44 +02:00
admin 3649bf4e22 Initiale Version: Stromverbrauch-Web-App (strom-next)
Next.js-App zur Visualisierung des Stromverbrauchs aus InfluxDB
(Bucket strom, measurement vzlogger, Feld arbeit = kumulativer
Zaehlerstand in Wh).

- 4 Balken-Diagramme: 24h (stuendlich), Woche (stuendlich),
  31 Tage (taeglich), Jahr (pro Monat, immer 12 Monate)
- Verbrauch via difference des Zaehlerstands, zeitzonen-korrekt
- 24h liest Rohdaten (aktuell), 7d/31d/365d den stuendlichen
  Downsampling-Rollup (arbeit_hourly) -> sub-sekunde
- Gesamtverbrauch je Zeitraum unter dem Chart
- Design/Layout angelehnt an Werte-Log "Verlauf"

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:05:27 +02:00