██████╗ ██╗ ██╗██╗ ██╗██╗ ██╗██████╗
██╔══██╗██║ ██║██║ ██║██║ ██║██╔══██╗
██║ ██║██║ ██║███████║██║ ██║██████╔╝
██║ ██║╚██╗ ██╔╝██╔══██║██║ ██║██╔══██╗
██████╔╝ ╚████╔╝ ██║ ██║╚██████╔╝██████╔╝
╚═════╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Hack the Grid
The unofficial DV interface — Direct Marketing Interface for Victron
Digitale Direktvermarktungsschnittstelle auf Basis der PLEXLOG Modbus-Register, zugeschnitten auf Victron ESS-Systeme mit LUOX Energy (ehem. Lumenaza) als Direktvermarkter.
| Status | main -- Version 0.4.0 |
| Getestet mit | LUOX Energy, Victron Ekrano-GX, Fronius AC-PV |
| Lizenz | Energy Community License (ECL-1.0) |
DVhub ersetzt bzw. ergänzt einen physischen Plexlog als DV-Schnittstelle. Die Modbus-Kommunikation des Direktvermarkters wird in Software nachgebildet, während die Live-Daten direkt vom Victron-GX-System kommen.
- DV-Schnittstelle und Web-Leitstand in einer Anwendung
- Dashboard mit Energy-Flow-Visualisierung, Live-Werten, Day-Ahead-Preisen und Steuerung
- Historie mit 5 Finanz-Karten (Energiekosten, Einnahmen, Cashflow, Vermiedene Kosten, Gesamtbilanz)
- Kleine Börsenautomatik für automatische Entladung in Hochpreisphasen
- DVhub Price API (api.dvhub.de) als zentraler Preisfeed für alle 44 EPEX-Preiszonen
- Setup — Victron-Anlage verbinden mit einem Klick
- Einstellungen mit 4-Tab-Layout, kompakten Group-Cards und Sticky-Save-Bar
- Victron-Anbindung per Modbus TCP oder MQTT
- PostgreSQL-Telemetrie mit Rollups, Preis-Backfill und optionalem VRM-Nachimport
- Integrationsplattform für EOS, EMHASS, Home Assistant und Loxone
- Schnellstart
- Was DVhub kann
- Oberflächen
- Integrationen
- Direktvermarktung kompakt
- Installation im Detail
- API und Konfiguration
- Lizenz
Stable (empfohlen):
curl -fsSL https://raw.githubusercontent.com/chloepriceless/dvhub/main/install.sh | sudo bashDev (Bleeding Edge — aktuelle Commits von main):
curl -fsSL https://raw.githubusercontent.com/chloepriceless/dvhub/main/install.sh | sudo bash -s -- --channel devDer Installer:
- installiert Node.js und PostgreSQL
- legt PostgreSQL-User und Datenbank
dvhuban (Peer-Auth via Unix-Socket) - klont das Repo nach
/opt/dvhub - nutzt die App unter
/opt/dvhub/dvhub - migriert alte Installationen aus
/opt/dvhub/dv-control-webapp - richtet einen systemd-Service ein
- nutzt eine externe Config-Datei unter
/etc/dvhub/config.json - aktiviert Health-Checks und optionalen Restart aus der GUI
- startet
dvhub.servicenach dem Update automatisch neu - Stable-Channel (Standard): checkt den neuesten Release-Tag aus
- Dev-Channel (
--channel dev): checktorigin/mainHEAD aus - Update-Channel ist über die Tools-Seite umschaltbar
Wenn die Config-Datei noch fehlt oder ungültig ist, öffnet DVhub beim ersten Aufruf automatisch den Setup-Assistenten.
- Dashboard:
http://<host>:8080/ - Historie:
http://<host>:8080/history.html - Einstellungen:
http://<host>:8080/settings.html - Setup:
http://<host>:8080/setup.html - Tools:
http://<host>:8080/tools.html
- DV-Modbus-Server auf Standard-Port
1502mit FC3/FC4 Read und FC6/FC16 Write - DV-Signalerkennung inklusive Lease-Logik und sicherer Rückkehr in Freigabe
- Victron-Steuerung für Grid Setpoint, Charge Current und Min SOC
- Negativpreis-Schutz mit automatischer Reaktion auf EPEX-Preise
- Day-Ahead-Preis-Engine mit Heute-/Morgen-Daten, Hover-Details und Chart-Auswahl
- Zentraler Preisfeed über api.dvhub.de mit allen 44 EPEX Day-Ahead Bidding Zones
- Dynamischer Preiszonen-Selektor in Einstellungen und Setup mit Live-Abdeckungsinfo
- Schedule-System mit Defaults, manuellen Writes und Chart-zu-Schedule-Auswahl
- Kosten- und Preislogik für Netz, PV und Akku über
userEnergyPricing - Datumsbasierte Bezugspreise über
userEnergyPricing.periods - Paragraph 14a Modul 3 mit konfigurierbaren Preisfenstern
- Kleine Börsenautomatik für automatische Entladung in Hochpreisphasen mit energiebasierter Slot-Allokation
- PostgreSQL-Telemetrie mit Persistenz, Rollups, historischem Nachimport und History-Analyse
- Modbus TCP oder MQTT als Victron-Transport
- Externe Konfiguration statt fest eingebauter Runtime-Dateien
- systemd-ready für dauerhaften Betrieb
- Health-/Service-Status direkt in Einstellungen und Tools
Das Dashboard bündelt die laufenden Betriebsdaten:
- DV-Schaltstatus
- Börsenpreis mit Negativpreis-Schutz
- Netzleistung pro Phase
- Victron-Zusatzwerte wie SOC, Akku-Leistung und PV
- Kostenübersicht für den aktuellen Tag
- Day-Ahead-Chart mit Hover, Highlight und Schedule-Auswahl
- Kleine Börsenautomatik mit Planungsanzeige, Chart-Highlighting und Statusübersicht
- Steuerung mit aktiven Werten, Defaults und manuellen Writes
- letzte Events aus dem Systemlog
Die Einstellungsseite ist in kompakte Arbeitsbereiche gegliedert:
- Schnellstart
- Anlage verbinden
- Steuerung
- Preise & Daten
- Erweitert
Dazu kommen Import/Export, Health-Checks, Service-Status und optional ein Restart-Button. Die EPEX-Preiszone wird über einen dynamischen Selektor gewählt, der die verfügbaren Zonen samt Abdeckung direkt von der DVhub Price API lädt.
Der First-Run-Setup-Assistent führt Schritt für Schritt durch:
- HTTP-Port und API-Token
- Victron-Verbindung per Modbus oder MQTT
- Meter- und DV-Basiswerte
- EPEX-Grunddaten mit dynamischem Preiszonen-Selektor
- Review-Schritt mit Validierung vor dem Speichern
- Anzeige vererbter Meter- und DV-Register-Verbindungen im Review
Die Wartungsseite enthält:
- DV-Schaltsignal-Log mit Filterfunktion (Schaltbefehle, Modbus/Setpoint-Writes, Victron-Writes, Börsenautomatik)
- Modbus Register Scan
- Schedule JSON Bearbeitung
- Health-/Service-Status
- Config Import/Export
- VRM History-Import für Telemetrie-Nachfüllung
- API-Dokumentation (Swagger UI)
Die History-Seite bündelt die PostgreSQL-Telemetrie zu einer eigenen Analyseansicht:
- Tag-, Wochen-, Monats- und Jahresansicht
- Bezug, Einspeisung, Kosten, Erlöse und Netto je Zeitraum
- Preisvergleich zwischen historischem Marktpreis und eigenem Bezugspreis
- Preisliste und Aggregat-Preishinweis in der Tagesansicht
- Solar-Zusammenfassung mit Jahres-Marktwert in der Jahresansicht
- Energie-Balkendiagramme in Wochen-/Monats-/Jahresansicht
- Kennzeichnung unvollständiger Slots bei fehlenden Marktpreisen oder Tarifzeiträumen
- gezielter Preis-Backfill nur für Telemetrie-Buckets ohne historischen Marktpreis
DVhub stellt Daten bereit oder nimmt Optimierungsergebnisse entgegen für:
- Home Assistant
- Loxone
- EOS (Akkudoktor)
- EMHASS
Zusätzlich kann DVhub historische Daten per VRM nachladen, wenn neue Installationen ältere Werte auffüllen sollen oder Lücken entstanden sind.
Für Marktpreise nutzt DVhub den zentralen DVhub Price Feed (api.dvhub.de) mit Fallback auf Energy Charts.
DVhub betreibt unter api.dvhub.de einen zentralen Preisfeed für EPEX Day-Ahead Preise:
- 44 Bidding Zones (AT, BE, BG, CH, CZ, DE-LU, DK1, DK2, ES, FI, FR, NL, NO1-5, PL, SE1-4, ...)
- Historische Daten ab 2020 mit stündlicher Auflösung (vor 01.10.2024) und 15-Minuten-Auflösung (ab 01.10.2024)
- Täglich aktualisiert um 13:30 und 15:00 CET
- Primärquelle: Energy Charts (Fraunhofer ISE / SMARD.de)
- Fallback: ENTSO-E Transparency Platform
DVhub-Instanzen holen ihre Preise automatisch von dieser API. Kein Port muss freigegeben werden.
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/api/zones |
Alle verfügbaren Preiszonen mit Abdeckungsinfo |
GET |
/api/prices?start=...&end=...&zone=DE-LU |
Preise für Zeitraum und Zone |
GET |
/api/prices/latest?zone=DE-LU |
Letzte 48 Stunden |
GET |
/api/prices/stats?zone=DE-LU |
Abdeckungsstatistiken |
GET |
/api/prices/gaps?zone=DE-LU |
Fehlende Daten finden |
POST |
/api/backfill |
Backfill für eine Zone anstoßen |
Eine Direktvermarktungs-Schnittstelle verbindet den Direktvermarkter mit deiner Anlage, damit:
- Live-Werte abgefragt werden können
- Steuersignale bei negativen Preisen oder Vermarktungsvorgaben ankommen
Der Direktvermarkter kann so Einspeisung bewerten, regeln und wirtschaftlich steuern.
Der physische Plexlog kann Live-Daten liefern, aber die Steuerung moderner Victron-Setups ist in der Praxis oft unflexibel oder nicht vollständig nutzbar. DVhub liest die Daten direkt vom GX-Gerät und beantwortet die PLEXLOG-kompatiblen Modbus-Anfragen in Software.
Nach dem Solarspitzengesetz benötigen PV-Anlagen ab 25 kWp typischerweise eine DV-Schnittstelle für die Direktvermarktung. Kleinere Anlagen können freiwillig teilnehmen.
Mit der diskutierten Pauschaloption / MiSpeL wird Direktvermarktung auch für kleinere Anlagen mit Speicher attraktiver, weil Speicher flexibler aus PV und Netz geladen werden dürfen und die Vermarktung wirtschaftlich interessanter wird.
Stand März 2026:
- BNetzA-Festlegung soll bis 30. Juni 2026 finalisiert werden
- die EU-beihilferechtliche Genehmigung steht noch aus
- die Konsultationsphase wurde im Oktober 2025 abgeschlossen
- BNetzA MiSpeL Festlegungsverfahren
- BNetzA MiSpeL Artikel/Überblick
- BNetzA Pressemitteilung (19.09.2025)
- Anlage 2: Pauschaloption Eckpunkte (PDF)
- BMWK FAQ Solarspitzengesetz
Für LUOX brauchst du in der Praxis:
- Meldung, dass eine PLEXLOG-kompatible DV-Schnittstelle vorhanden ist
- OpenVPN-Tunnel zu LUOX
- Portforwarding von Port
502aus dem Tunnel auf Port1502von DVhub
Unifi-Hinweis: Falls die GUI das Tunnel-Portforwarding nicht sauber abbildet, hilft das Skript 20-dv-modbus.sh für die iptables-Regeln.
- Node.js 22+
- PostgreSQL 14+ (für Telemetrie)
- Victron GX-Gerät im lokalen Netz
sudo apt update
sudo apt install -y curl ca-certificates git postgresql
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
sudo apt install -y tcpdump jq
sudo mkdir -p /opt/dvhub /etc/dvhub /var/lib/dvhub
sudo useradd -r -s /usr/sbin/nologin dvhub
sudo git clone https://github.com/chloepriceless/dvhub.git /opt/dvhubDanach:
sudo chown -R dvhub:dvhub /opt/dvhub /etc/dvhub /var/lib/dvhub
cd /opt/dvhub/dvhub
npm install --omit=dev
sudo cp config.example.json /etc/dvhub/config.json
sudo mkdir -p /etc/dvhub/hersteller
sudo cp hersteller/victron.json /etc/dvhub/hersteller/victron.json
sudo nano /etc/dvhub/config.jsonTechnische Victron-Werte wie Register, Port, Unit-ID oder Timeout werden nicht mehr in /etc/dvhub/config.json gepflegt.
Diese Werte liegen im Herstellerprofil unter /etc/dvhub/hersteller/victron.json.
Nur bei MQTT-Nutzung zusätzlich:
npm install mqttDatei: /etc/systemd/system/dvhub.service
[Unit]
Description=DVhub DV Control
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=dvhub
Group=dvhub
WorkingDirectory=/opt/dvhub/dvhub
ExecStart=/usr/bin/node --experimental-sqlite /opt/dvhub/dvhub/server.js
Environment=NODE_ENV=production
Environment=DV_APP_CONFIG=/etc/dvhub/config.json
Environment=DV_ENABLE_SERVICE_ACTIONS=1
Environment=DV_SERVICE_NAME=dvhub.service
Environment=DV_SERVICE_USE_SUDO=1
Environment=DV_DATA_DIR=/var/lib/dvhub
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.targetService aktivieren:
sudo systemctl daemon-reload
sudo systemctl enable --now dvhubSYSTEMCTL_PATH="$(command -v systemctl)"
echo "dvhub ALL=(root) NOPASSWD: ${SYSTEMCTL_PATH} restart dvhub.service" | sudo tee /etc/sudoers.d/dvhub-service-actions >/dev/null
echo "dvhub ALL=(root) NOPASSWD: ${SYSTEMCTL_PATH} is-active dvhub.service" | sudo tee -a /etc/sudoers.d/dvhub-service-actions >/dev/null
echo "dvhub ALL=(root) NOPASSWD: ${SYSTEMCTL_PATH} show dvhub.service *" | sudo tee -a /etc/sudoers.d/dvhub-service-actions >/dev/null
sudo chmod 440 /etc/sudoers.d/dvhub-service-actionscd /opt/dvhub/dvhub
DV_APP_CONFIG=/etc/dvhub/config.json DV_DATA_DIR=/var/lib/dvhub npm start| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/dv/control-value |
DV Status: 0 = Abregelung, 1 = Einspeisung erlaubt |
GET |
/api/status |
Vollständiger Systemstatus |
GET |
/api/costs |
Tages-Kostenübersicht |
GET |
/api/log |
Letzte 300 Event-Log Einträge |
GET |
/api/config |
Aktuelle Konfiguration |
POST |
/api/config |
Konfiguration aktualisieren |
POST |
/api/config/import |
Config aus JSON importieren |
GET |
/api/config/export |
Config als JSON exportieren |
GET |
/api/admin/health |
Health-Check Status |
POST |
/api/admin/service/restart |
systemd-Service neu starten |
GET |
/api/discovery/systems |
Netzwerk-Systemerkennung |
EPEX / Preise:
| Methode | Pfad | Beschreibung |
|---|---|---|
POST |
/api/epex/refresh |
EPEX-Preise manuell aktualisieren |
GET |
/api/epex/zones |
Verfügbare Preiszonen von api.dvhub.de |
GET |
/api/epex/gaps?zone=DE-LU |
Fehlende Preisdaten für Zone |
POST |
/api/epex/backfill |
Backfill fehlender Preise anstoßen |
History / Telemetrie:
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/api/history/summary?view=day&date=YYYY-MM-DD |
Historische Zusammenfassung |
POST |
/api/history/import |
Historische Telemetrie importieren |
GET |
/api/history/import/status |
Import-Status |
POST |
/api/history/backfill/vrm |
VRM Full/Gap-Backfill |
POST |
/api/history/backfill/prices |
Preis-Backfill via Energy Charts |
Schedule / Steuerung:
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/api/schedule |
Aktuelle Schedule-Regeln und Config |
POST |
/api/schedule/rules |
Schedule-Regeln aktualisieren |
POST |
/api/schedule/config |
Default-Werte aktualisieren |
GET |
/api/schedule/automation/config |
Kleine Börsenautomatik Config |
POST |
/api/schedule/automation/config |
Kleine Börsenautomatik anpassen |
POST |
/api/control/write |
Manueller Write (gridSetpoint, chargeCurrent, minSoc) |
Modbus Scan:
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/api/meter/scan |
Scan-Ergebnisse abrufen |
POST |
/api/meter/scan |
Modbus Register-Scan starten |
Integrationen:
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/api/integration/home-assistant |
Home Assistant JSON |
GET |
/api/integration/loxone |
Loxone Textformat |
GET |
/api/integration/eos |
EOS Messwerte + EPEX-Preise |
POST |
/api/integration/eos/apply |
EOS Optimierung anwenden |
GET |
/api/integration/emhass |
EMHASS Messwerte + Preisarrays |
POST |
/api/integration/emhass/apply |
EMHASS Optimierung anwenden |
Keepalive:
| Methode | Pfad | Beschreibung |
|---|---|---|
GET |
/api/keepalive/modbus |
Letzte Modbus-Abfrage |
GET |
/api/keepalive/pulse |
60s Uptime-Pulse |
| Sektion | Beschreibung |
|---|---|
manufacturer |
Aktives Herstellerprofil, aktuell victron |
victron |
Anlagenadresse, Transport (Modbus/MQTT) |
schedule |
Zeitplan-Regeln, Defaults und Kleine Börsenautomatik (smallMarketAutomation) |
epex |
Preiszone (bzn), Zeitzone, Price API URL |
telemetry |
PostgreSQL-Verbindung, Rollups, Retention, VRM-History-Import |
userEnergyPricing |
Preislogik für Netz, PV und Akku, Perioden, Marktwerte, Paragraph 14a |
dvControl |
DV-Steuerung und Negativpreis-Schutz |
scan |
Modbus Scan-Parameter |
Zusätzlich erwartet DVhub ein Herstellerprofil neben der Betriebs-Config:
| Datei | Zweck |
|---|---|
/etc/dvhub/hersteller/victron.json |
Victron-spezifische Kommunikations- und Registerwerte |
Unter userEnergyPricing.periods lassen sich mehrere Tarifzeiträume definieren:
- Zeiträume sind tageweise und inklusive
startDatebisendDate - Zeiträume dürfen sich nicht überschneiden
- pro Zeitraum ist
fixedoderdynamicmöglich - wenn kein Zeitraum passt, greift die bestehende Legacy-Preislogik als Fallback
Unter userEnergyPricing stehen für die History-Marktprämie zwei zusätzliche Felder bereit:
marketValueMode:annualfür das bisherige Verhalten odermonthlyfür MonatsmarktwertepvPlants: Liste der PV-Anlagen mitkwpundcommissionedAt
- Änderungen an Victron-Registern, Port, Unit-ID oder Timeout erfolgen nur in
/etc/dvhub/hersteller/victron.json - Die normale
config.jsonbleibt damit klein und enthält nur Betriebs- und Anlagenwerte dvControl.enabledist standardmäßig deaktiviert und muss aktiv gesetzt werdenuserEnergyPricingerlaubt festen Endkundenpreis oder dynamische Preisbestandteile auf Basis von EPEX- im MQTT-Modus wird
victron.mqtt.portalIdbenötigt; ohne eigenen Broker nutzt DVhub den GX-Host npm install mqttwird nur für MQTT-Betrieb benötigt- EPEX-Preise werden primär von api.dvhub.de geholt, Fallback auf Energy Charts direkt
Responsive Dashboard (iPhone 15 Pro Max):
- Hamburger-Navigation (CSS-only Checkbox-Hack, kein JS)
- Flow-Diagramm skaliert auf 430px Viewport
- Netzphasen-Detail unterhalb des Diagramms auf Mobile
- Touch-optimierte Karten (44px Targets), kompakte Tabellen
- Tier-Felder gestapelt (Label oben, Input darunter)
- Keine horizontalen Scrollbars, keine versteckten Spalten
PV-Export-Modus (ehem. DC-Export-Modus):
- Umbenannt: DC-Export-Modus -> PV-Export-Modus
- Nutzt jetzt pvTotalW (DC + AC) statt nur DC-PV fuer Grid Setpoint
- Negativpreis-Schutz: Export pausiert automatisch bei EPEX < 0 ct/kWh
- Bei Preis >= 0 wird sofort weiter exportiert
Dashboard-Verbesserungen:
- PV-Karte zeigt PV Gesamt als Hauptwert (DC-PV + AC-PV)
- AC-PV-Wert wird aus Gesamtleistung und DC-PV berechnet
- Tooltip-Icons (i) fuer alle Einstellungsfelder mit Help-Text
Einstellungen:
- Sinnvolle Defaults bei Erstinstallation (Strompreise, Batterie, Boersenautomatik)
- PV-Kopplungsauswahl (AC/DC/AC+DC) mit Modbus-Endpunkt pro Hersteller
- Standort-Eingabe mit OpenStreetMap-Picker (Koordinaten per Klick)
- MILP als Default-Engine fuer Boersenautomatik
Update-Channel-System:
- Neuer Update-Channel: Stable (Release-Tags) oder Dev (Bleeding Edge main HEAD)
- Channel wählbar über Tools-Seite oder Installer (
--channel dev) - Stable folgt Git-Tags, Dev folgt origin/main — sauber umschaltbar
- Installer schreibt
updateChannelin die Config
PostgreSQL Auto-Schema:
- Datenbank-Tabellen werden beim ersten Start automatisch erstellt (CREATE TABLE IF NOT EXISTS)
- Neue Installationen funktionieren ohne manuelle Schema-Migration
- Installer installiert PostgreSQL, legt User/DB an und konfiguriert Peer-Auth via Unix-Socket
Bugfixes:
- Fix: startAutomaticMarketValueBackfill ruft getTelemetryBounds jetzt korrekt mit await auf
- Fix: Unhandled Rejection bei leerer Datenbank behoben
- Fix: Telemetrie-Init mit async Connectivity-Check und graceful Error-Handling
Schedule-gesteuerte DC-Einspeisung:
- feedExcessDcPv (Register 2707/2708) ist jetzt über Schedule-Regeln steuerbar
- Default: EIN (Überschuss wird eingespeist), abschaltbar per Schedule-Regel oder manuell
- Negativer Preisschutz und DV forcedOff überschreiben weiterhin (höchste Priorität)
- Nach DV-Freigabe oder Lease-Ablauf wird der Schedule-Zustand respektiert statt blind einzuschalten
- Neuer Default-Config-Wert: defaultFeedExcessDcPv (änderbar über Dashboard)
- Dashboard zeigt DC-Einspeisungs-Status mit Quelle (Schedule/Default/DV/Negativpreis)
dcExportMode nur noch per Schedule:
- dcExportMode (dynamischer Grid Setpoint = -(PV - Buffer)) erfordert jetzt eine aktive Schedule-Regel
- Statische Aktivierung über Config (enabled/priceThresholdCtKwh) entfernt
- Verhindert unbeabsichtigte Batterie-Entladeblockade durch dauerhaften DC-Export
- SOC-Guard bleibt aktiv (Batterie laden vor Abend-Peak)
applyDvVictronControl Fix:
- Register 2707 wird jetzt auch beim Einschalten (feedIn=true) aktiv geschrieben
- Vorher wurde nur beim Abschalten geschrieben, Einschalten war ein No-Op
DVhub Price API:
- Zentraler Preisfeed unter api.dvhub.de für alle 44 EPEX Day-Ahead Bidding Zones
- Historische Daten ab 2020, stündlich vor 01.10.2024, 15-Minuten danach
- ENTSO-E Transparency Platform als Primärquelle, Energy Charts als Fallback
- fetchEpexDay() nutzt primär api.dvhub.de mit automatischem Fallback auf Energy Charts
- Neue Proxy-Endpunkte:
/api/epex/zones,/api/epex/gaps,/api/epex/backfill - CORS-Support für DVhub-Instanzen
- Swagger UI API-Dokumentation unter api.dvhub.de/docs
- EPEX Spot Day-Ahead Live-Chart unter api.dvhub.de/spot und dvhub.de/spot
- Backfill-API nur aus dem LAN erreichbar (POST /api/backfill)
Preiszonen-Selektor:
- Dynamischer Dropdown in Einstellungen und Setup-Wizard
- Lädt verfügbare Zonen mit Abdeckungsinfo direkt von der Price API
- Neuer Config-Typ
dynamicSelectfür API-gestützte Auswahlfelder - Neues Config-Feld
epex.priceApiUrl(Standard: https://api.dvhub.de)
PostgreSQL-Migration:
- Telemetrie-Backend von SQLite auf PostgreSQL umgestellt
- Neuer
telemetry-store-pg.jsmit Connection-Pooling - Neuer
db-client.jsfür zentrale Datenbankverbindung - Migrationsscript
scripts/migrate-sqlite-to-pg.shmit SQLite-Backup - Config-Sektion
telemetry.databasefür PostgreSQL-Verbindungsdaten
Kleine Börsenautomatik - Plan-Lock:
- Bugfix: Laufende Entladung wird nicht mehr durch Re-Planning abgebrochen
- Plan-Lock-Mechanismus verhindert Neuberechnung während aktiver Slot-Ausführung
- SoC-basierte Regeneration nur noch außerhalb der Entlade-/Cooldown-Phasen
- Cooldown-Lock bis 30 Minuten nach letztem Slot-Ende bei vorhandenen Zukunfts-Slots
DV-Schaltsignal-Log:
- Neue Wartungsseiten-Ansicht für alle DV-Steuersignale
- Filterfunktionen: Schaltbefehle, Modbus/Setpoint-Writes, Victron-Writes, Börsenautomatik
- Erweiterte Signal-Typen: control_write, sma_plan_applied, schedule_auto_disabled, schedule_stop_soc_reached
- Farbcodierung: Rot für Fehler/Abregelung, Grün für Freigabe/Plan, Blau für Writes
Weitere Änderungen:
- InfluxDB-Konfiguration entfernt (nicht mehr benötigt)
- History-Import verwendet korrekte Datenbankabstraktion
Kleine Börsenautomatik (neu):
- Automatische Entladung in Hochpreisphasen basierend auf Day-Ahead-Preisen
- Energiebasierte Slot-Allokation statt fester Slot-Anzahl
- Multi-Stage Chain-Varianten für mehrstufige Entladestrategien
- Chart-Highlighting der geplanten Entlade-Slots im Day-Ahead-Chart
- Konfigurierbares Suchfenster, Min-SOC, Max-Entladeleistung und Aggressivitätsprämie
History und Marktwerte:
- Marktwerte für Wochen- und Monatsansichten nachladen
- Lokale Persistenz der Marktwert-Referenzdaten
- Solar-Zusammenfassung mit Jahres-Marktwert in der Jahresansicht
- Energie-Balkendiagramme in Wochen-/Monats-/Jahresansicht
- VRM Full-Backfill durchläuft jetzt auch alte Lücken am Anfang
Security-Hardening:
- Timing-Safe Token-Vergleich (
crypto.timingSafeEqual) - Content-Security-Policy Header
- API-Responses redaktieren sensible Felder
- Config-Datei wird mit
0600-Berechtigung geschrieben - SQL-Injection-Schutz in
countRows()per Table-Allowlist
This project is licensed under the Energy Community License (ECL-1.0).
The goal of this license is to support the renewable energy community while preventing commercial reselling of the software.
- Operating energy systems using this software
- Generating revenue from energy production
- Hiring companies for installation or administration
- Community modifications and forks
- Selling the software itself
- Selling hardware with the software preinstalled
- Commercial SaaS offerings based on this software
- Bundling the software into commercial products
If your company wants to integrate this software into a commercial product, please request a commercial license.



