strompreis-keysCLI. Verwaltung von API-Keys:create,list,verify,revoke. Keys werden einmalig beim Erzeugen angezeigt, danach nur gemasked. Tiers (free/pro/enterprise) und Daily-Limits konfigurierbar.- B2C überarbeitet. Templates nach
b2c/templates/(Jinja2) ausgelagert, Affiliate-IDs/URLs kommen aus Env-Variablen statt hartcodierter Platzhalter. Savings-Modell dokumentiert; Konstanten via Env tunable. PLZ-Feld entfernt (wurde ohnehin nicht genutzt). Impressum/Datenschutz-Links für DSGVO. database.get_api_keys()unddatabase.revoke_api_key()als Wiederverwendbare Helper für CLI und künftige Admin-UI.
- MCP Python SDK Integration. Server läuft jetzt auf dem offiziellen
mcp.server.fastmcp.FastMCP. Vorteile: korrekte Protocol-Version, automatisch generierte Tool-Schemas aus Type-Hints, alle Transporte (stdio/SSE/streamable-http) out-of-the-box. - Resources API. Zusätzlich zu den Tools gibt es nun read-only URIs:
strompreis://prices/live— aktuelle SMARD-Seriestrompreis://prices/history— DB-Historie (30 Tage)strompreis://db/status— DB-Gesundheit als JSON
- Tests (55). Vollständiges pytest-Scaffold: SMARD-Client, Database (inkl. v1→v2 Migration), Forecast (Auktion vs. Statistik), Server-Tools und -Resources. Alle Tests offline via Fixtures.
- CI (GitHub Actions). Lint (ruff + format-check) und Test-Matrix (Python 3.11/3.12/3.13) bei jedem Push/PR.
- Structured logging via
logging-Modul (statt print), konfigurierbar überSTROMPREIS_LOG_LEVEL. - Multi-Transport.
STROMPREIS_TRANSPORT=stdio|sse|streamable-http.
- Einheitenkonvertierung korrigiert. SMARD veröffentlicht Day-Ahead-Preise
als
EUR/MWh × 1000. Die frühere Rechnung/1000(forecast) bzw./10(B2C) lieferte teils um Faktor 10/1000 falsche ct/kWh-Werte. Neu gibt es eine zentraleeur_mwh_to_ct_kwh()-Hilfsfunktion. - Dedup auf
price_data.timestamp_utcist jetztUNIQUE. Vorher hat der 15-min-Cron dieselben Stundenwerte immer wieder eingefügt. Bestehende v1-Datenbanken werden beim Start automatisch migriert (Schema-Version 2). notifications/initializedantwortet nicht mehr. (Im SDK automatisch korrekt gehandhabt.)store_priceszählt jetzt wirklich neue Zeilen, nicht mehrtotal_changes.database.init_db()committet Migrationen korrekt. Bisher lief_migrate()außerhalb des Commit-Scopes; auf frischen DBs wurde der Schema-Version-Bump verworfen.store_pricestoleriert fehlende optionale Felder (load/wind/solar).
- Forecast nutzt Day-Ahead-Auktionspreise. Innerhalb des
Auktionshorizonts (~24–36 h) liefert
price_forecastdie echten, verbindlichen Börsenpreise mitconfidence = 1.0undsource: "auction". Erst dahinter greift die statistische Schätzung (source: "statistical"). - Rate-Limits sind persistent in der DB, nicht mehr In-Memory.
db_statuszeigt jetzt die echten Abrufzahlen inkl. keyless-Quote. - Generation-Data (Solar/Wind/Load) wird gecacht (5 min TTL).
- certifi als Abhängigkeit für HTTPS ohne System-CA-Store.
- Migration bestehender Datenbanken passiert automatisch beim ersten Start. Duplikate werden auf den jeweils neuesten Eintrag pro Timestamp kollabiert; Daten gehen nicht verloren.
- Einheitenkonvertierung korrigiert. SMARD veröffentlicht Day-Ahead-Preise
als
EUR/MWh × 1000. Die frühere Rechnung/1000(forecast) bzw./10(B2C) lieferte teils um Faktor 10/1000 falsche ct/kWh-Werte. Neu gibt es eine zentraleeur_mwh_to_ct_kwh()-Hilfsfunktion. - Dedup auf
price_data.timestamp_utcist jetztUNIQUE. Vorher hat der 15-min-Cron dieselben Stundenwerte immer wieder eingefügt. Bestehende v1-Datenbanken werden beim Start automatisch migriert (Schema-Version 2). notifications/initializedantwortet nicht mehr. JSON-RPC-Notifications dürfen laut Spec keine Response erhalten; manche Clients stolperten darüber.store_priceszählt jetzt wirklich neue Zeilen, nicht mehrtotal_changes(was durch die Dedup-Logik falsch war).
- Forecast nutzt Day-Ahead-Auktionspreise. Innerhalb des
Auktionshorizonts (~24–36 h) liefert
price_forecastdie echten, verbindlichen Börsenpreise mitconfidence = 1.0undsource: "auction". Erst dahinter greift die statistische Schätzung (source: "statistical").best_hours()zeigt pro Stunde die Herkunft an (✓ / ~). - Rate-Limits sind persistent in der DB, nicht mehr In-Memory. Keyless-Modus
zählt Aufrufe mit
api_key = NULLinusage_log— überlebt Server-Restarts und mehrere Prozesse.db_statuszeigt jetzt die echten Abrufzahlen. - Generation-Data (Solar/Wind/Load) wird gecacht (5 min TTL), analog zu Prices. Reduziert SMARD-Abrufe des Collectors deutlich.
- certifi als Abhängigkeit, damit HTTPS auch auf Systemen ohne System-CA-Store funktioniert.
source-Feld in jedem Forecast-Eintrag ("auction"|"statistical").
- Migration bestehender Datenbanken passiert automatisch beim ersten Start. Duplikate werden auf den jeweils neuesten Eintrag pro Timestamp kollabiert; Daten gehen nicht verloren.