3649bf4e22
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>
49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { resolveRange } from '@/lib/ranges';
|
|
import { fetchVerbrauch } from '@/lib/influx';
|
|
import { RangeKey } from '@/types/strom';
|
|
|
|
const VALID_RANGES: RangeKey[] = ['24h', '7d', '31d', '365d'];
|
|
|
|
// GET /api/verbrauch?range=24h&date=YYYY-MM-DD
|
|
// ?range=7d&date=YYYY-MM-DD
|
|
// ?range=31d&month=YYYY-MM
|
|
// ?range=365d&year=YYYY
|
|
export async function GET(request: NextRequest) {
|
|
const sp = request.nextUrl.searchParams;
|
|
const range = sp.get('range') as RangeKey | null;
|
|
|
|
if (!range || !VALID_RANGES.includes(range)) {
|
|
return NextResponse.json(
|
|
{ success: false, error: `Ungueltiger range-Parameter. Erlaubt: ${VALID_RANGES.join(', ')}` },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
try {
|
|
const resolved = resolveRange(range, {
|
|
date: sp.get('date'),
|
|
month: sp.get('month'),
|
|
year: sp.get('year'),
|
|
});
|
|
const data = await fetchVerbrauch(resolved);
|
|
|
|
return NextResponse.json(
|
|
{ success: true, data },
|
|
{
|
|
headers: {
|
|
'Cache-Control': 'no-store, no-cache, must-revalidate',
|
|
'Pragma': 'no-cache',
|
|
'Expires': '0',
|
|
},
|
|
}
|
|
);
|
|
} catch (error) {
|
|
console.error('InfluxDB error:', error);
|
|
return NextResponse.json(
|
|
{ success: false, error: 'Fehler beim Laden der Verbrauchsdaten.' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|