Schwarmspeicher Electrify
🔋 Schwarmspeicher Electrify |
Ăśberblick
Schwarmspeicher Electrify unterstützt den gesamten Projektlebenszyklus: Standortidentifikation, Genehmigungen, Projektsteuerung und Dokumentation — für beide Use-Cases parallel, über einen Umschalter in der Seitenleiste.
- Frontend: React 18 · Vite · React Query · Axios-Client (nginx-Reverse-Proxy)
- Backend: FastAPI · SQLite (WAL-Modus) · JWT-Authentifizierung
- Datenquellen: RIMO/SQL-Server (Fahrer-Stammdaten) · Microsoft Fabric (SharePoint, KM-Formular-Mails) · GPS-AT/Tesla-APIs (Kilometerstände)
- Orchestrierung: eigenständige Cron-Skripte auf dem Server, unabhängig vom Docker-Container
Architektur

Zusätzlich übernimmt nginx im Frontend-Container TLS-Terminierung und same-origin-Routing (/auth, /rest, /storage, /realtime, /functions → supabase-kong) — dadurch läuft die App ohne CORS- oder Private-Network-Access-Probleme im Browser
Technologie-Stack
Frontend: React 18 · TypeScript · Vite · Tailwind CSS · shadcn/ui · React Router · React Query · Leaflet + leaflet.markercluster (Kartendarstellung) · Recharts (Diagramme) · XLSX (Excel-Import/-Export)
Backend: Supabase (self-hosted) — PostgreSQL, Authentication, Storage, Edge Functions, Row Level Security (RLS)
Hauptfunktionen
1. Dashboard
Zentrale Ăśbersicht ĂĽber Projekte, Status, Kennzahlen und Projektfortschritt.
- Schwarmspeicher: Dashboard.tsx — Pipeline-Summary, kW/kWh-KPIs, Plan-vs-Ist-Charts pro Meilenstein
- PV-Co-Location: CoLocationDashboard.tsx — gleiche Struktur, Einheiten angepasst (kWp/kW), zweite Übersichtskarte zeigt Standortpartner-Anzahl statt Gemeinden
2. Projektverwaltung / Standortverwaltung
Standorte anlegen, bearbeiten, importieren, Historie, Dokumente, sortierbare Tabelle mit Meilenstein-Filter, Bulk-Bearbeitung, Als-abgebrochen-markieren/Reaktivieren.
- Schwarmspeicher: ProjectTable, StandortDetail, CreateStandortFormNew, StandortImportDialog, StandortDokumente, AbbruchDialog, MeilensteinQuickEdit, MeilensteinMatrix, BulkEditStandortDialog
- PV-Co-Location: CoLocationProjectTable, CoLocationStandortDetail, CreateCoLocationForm, CoLocationImportDialog, CoLocationStandortDokumente, CoLocationAbbruchDialog, CoLocationMeilensteinQuickEdit, CoLocationMeilensteinMatrix, CoLocationBulkEditDialog
Import-Dialoge (beide Use-Cases) unterstützen: direkte Koordinatenspalten, DMS-Format, Koordinatenpaare im Adressfeld, Gemeinde-Auflösung per PLZ, mehrstufige strukturierte Geocoding-Anfragen (inkl. Konskriptionsnummern) mit Validierung gegen Gemeinde-Zentroide, sowie automatische Erkennung der Kopfzeile.
3. Gemeinden
Verwaltung der Gemeinden (CreateGemeindeForm, nur Schwarmspeicher). Edge Function fetch-noe-gemeinden lädt NÖ-Gemeinden.
4. Kartenansicht
Interaktive Karte aller Standorte (Leaflet + Clustering), Adresssuche, Vollbildmodus, Flächenauswahl (Shift+Ziehen), Trafokarte-NÖ-Layer mit Legende.
- Schwarmspeicher: ProjectMap
- PV-Co-Location: CoLocationMap
- Gemeinsam genutzt: LocationPickerMap (Einzelstandort-Kartenauswahl), src/lib/mapCoordinates.ts (dedupeCoordinates — verhindert sofortiges Auftrennen bei identischen Koordinaten)
5. Potenzialanalyse
Bewertung möglicher Standorte (PotenzialTabelle, PotenzialPage) — nur Schwarmspeicher, kein Pendant bei PV-Co-Location.
6. Pipeline
- Schwarmspeicher: VorprojektePipeline, VorprojektTimeline
- PV-Co-Location: CoLocationPipeline (Felder an kWp/BESS-kW angepasst; kein Pendant zu VorprojektTimeline)
7. Meilensteinverwaltung
Projektfortschritt ĂĽber Meilensteine, matrixartige Ăśbersicht mit Bulk-Setzen, Gruppierung.
- Schwarmspeicher: MeilensteinMatrix, MeilensteinQuickEdit (inkl. Sonderfall-Dialog NetzvertragAnpassungDialog)
- PV-Co-Location: CoLocationMeilensteinMatrix, CoLocationMeilensteinQuickEdit — eigene Meilensteinkette: Vollmacht gestellt → Vollmacht erhalten → Netzantrag gestellt → Netzvertrag erhalten → Pachtvertrag unterschrieben → Standort gebaut → Standort live Trading (Kurzbeschriftungen: VM ges. / VM erh. / NA gest. / NV erh. / PV unt. / Gebaut / Trading)
8. Stockend
Zeigt Standorte, bei denen die Lead-Time zwischen zwei Meilensteinen ĂĽberschritten ist, konfigurierbare Regeln.
- Schwarmspeicher: StuckPage
- PV-Co-Location: CoLocationStuckPage (eigene, getrennt gespeicherte Lead-Time-Regeln entlang der neuen Meilensteinkette)
9. Forecast
Monatliche Zielvorgaben, Plan-vs-Ist-Charts pro Kennzahl.
- Schwarmspeicher: ForecastPage (kW und kWh pro Monat/Meilenstein, nach Land AT/DE getrennt)
- PV-Co-Location: CoLocationForecastPage — 4 KPI-Charts entlang Netzantrag gestellt / Netzvertrag erhalten / Standort gebaut / Standort live Trading (kein Land-Split)
10. Aufgabenverwaltung
Projektbezogene Aufgaben, jeweils eigene, komplett getrennte Liste pro Use-Case.
- Schwarmspeicher: TaskManager, TasksPage, Hook useTasks()
- PV-Co-Location: CoTaskManager, CoLocationTasksPage, Hook useCoTasks()
11. Dokumentenverwaltung
Zu jedem Standort und jedem Standortpartner können Dokumente hochgeladen werden.
- Schwarmspeicher: StandortDokumente, PartnerDokumente, Hook useDokumente()
- PV-Co-Location: CoLocationStandortDokumente, CoLocationPartnerDokumente, Hook useCoDokumente() — eigener Storage-Bucket co-dokumente
12. Standortpartner
Verwaltung von Projektpartnern, eigene, komplett getrennte Partnerliste pro Use-Case.
- Schwarmspeicher: StandortpartnerManager, StandortpartnerTable
- PV-Co-Location: CoLocationStandortpartnerManager, CoLocationStandortpartnerTable
13. Benutzerverwaltung
Anmeldung, Passwortänderung, Rollen (admin/user). Komponenten: AuthProvider, ProtectedRoute, BenutzerPage, LoginPage. Läuft über die Edge Function manage-users (Supabase Admin-API, prüft Admin-Rechte serverseitig). Nach Login wird immer auf "/" weitergeleitet, unabhängig von der zuvor besuchten URL.
14. Audit Log
Nachvollziehbarkeit von Änderungen (AuditLogPage), tabellenübergreifend über beide Use-Cases.
15. Landingpage „Fläche verpachten"
Öffentlich erreichbare Seite ohne Login unter /flaeche-verpachten — für Grundstückseigentümer, die eine Fläche für einen Batteriespeicher zur Verfügung stellen wollen. Kartenbasierte Standortauswahl, Formular mit Honeypot-Spamschutz.
- Legt ĂĽber die Edge Function public-lead-intake automatisch einen neuen Eintrag in der Schwarmspeicher-Pipeline (vorprojekte) an
- E-Mail-Benachrichtigung optional (RESEND_API_KEY + LEAD_NOTIFY_EMAIL) — Anfrage wird auch ohne E-Mail-Konfiguration zuverlässig gespeichert
⚠️ Hinweis: Platzhalter-Firmendaten
|
Routing
| Pfad | Seite | Use-Case | Login nötig |
| / | Dashboard | Schwarmspeicher | ja |
| /projekte | Standorte | Schwarmspeicher | ja |
| /pipeline | Vorprojekte | Schwarmspeicher | ja |
| /potenzial | Potenzialanalyse | Schwarmspeicher | ja |
| /karte | Kartenansicht | Schwarmspeicher | ja |
| /forecast | Forecast | Schwarmspeicher | ja |
| /tasks | Aufgaben | Schwarmspeicher | ja |
| /stockend | Stockende Standorte | Schwarmspeicher | ja |
| /benutzer | Benutzerverwaltung | – (Admin) | ja |
| /historie | Audit Log | – (Admin) | ja |
| /pv-colocation | Dashboard | PV-Co-Location | ja |
| /pv-colocation/projekte | Standorte | PV-Co-Location | ja |
| /pv-colocation/pipeline | Vorprojekte | PV-Co-Location | ja |
| /pv-colocation/karte | Kartenansicht | PV-Co-Location | ja |
| /pv-colocation/forecast | Forecast | PV-Co-Location | ja |
| /pv-colocation/tasks | Aufgaben | PV-Co-Location | ja |
| /pv-colocation/stockend | Stockende Standorte | PV-Co-Location | ja |
| /flaeche-verpachten | Landingpage „Fläche verpachten" | — | NEIN – öffentlich |
Datenzugriff
Der Zugriff erfolgt über Custom Hooks, die sämtliche Kommunikation mit Supabase kapseln:
// Schwarmspeicher useStandorte()Â Â useGemeinden()Â Â useVorprojekte() useTasks()Â Â Â Â Â Â usePotenzialDaten()Â Â useStandortpartner() useMonatsziele() useDokumente()Â Â useIsAdmin() // PV-Co-Location useCoLocationStandorte()Â Â Â Â Â Â Â useCoLocationStandortpartner() useCoVorprojekte()Â Â useCoTasks()Â Â useCoMonatsziele()Â Â useCoDokumente() // Use-Case-ĂĽbergreifend useUseCase()Â Â useAuth() |
Supabase
Authentication: Login, Passwortänderung, Rollenverwaltung.
Datenbank: Wird ĂĽber SQL-Migrationen verwaltet (supabase/migrations/), inkl. komplettes PV-Co-Location-Schema: co_standorte, co_standortpartner, co_prozessschritte, co_vorprojekte, co_monatsziele, co_dokumente, co_tasks.
Edge Functions:
- fetch-noe-gemeinden — lädt Gemeinden aus Niederösterreich
- manage-users — Benutzerverwaltung, prüft Admin-Berechtigung serverseitig
- public-lead-intake — nimmt Anfragen der öffentlichen Landingpage entgegen
Storage: zwei Buckets — dokumente (Schwarmspeicher) und co-dokumente (PV-Co-Location).
Use-Case-Umschalter
Zwei Buttons oben in der Seitenleiste ("Schwarmspeicher" / "PV-Co-Location"). Welcher Use-Case aktiv angezeigt wird, leitet sich direkt aus der aktuellen URL ab (Hook useUseCase.tsx, /pv-colocation/*-Pfade vs. Rest) — nicht aus einem gespeicherten Zustand. Dadurch zeigt die Seitenleiste nach Login oder direktem Aufruf eines Links immer konsistent den richtigen Use-Case.
Offene Punkte / zu verifizieren
⚠️ Vor einem breiteren Rollout klären
|
Server
Das Projekt liegt unter /mnt/data/schwarmspeicher/schwarmspeicher-electrify_lokal und läuft in einem eigenständigen Docker-Compose-Stack (schwarmspeicher-electrify_lokal).
Erreichbar unter:
- VPN: http://schwarmspeicher.spl-tele.com:8200 (SPL-TELE-Netzwerk)
- Ă–ffentlich: https://schwarmspeicher.electrify.at:8200 (Wildcard-Zertifikat *.electrify.at, Let's Encrypt, gĂĽltig bis 26.10.2026)
Supabase (Postgres, Auth, Kong, Storage, Edge Functions) läuft als eigener Docker-Compose-Stack im selben Docker-Netzwerk wie der Frontend-Container. Edge Functions werden über einen zentralen main-Router an die jeweilige Unterfunktion weitergereicht; das Verzeichnis liegt unter /mnt/data/supabase/docker/docker/volumes/functions/.