feat: add dvhubonline feed-in tariff provider (#1193)
Bump Version / Bump Version Workflow (push) Has been cancelled
CodeQL Advanced / Analyze (actions) (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
docker-build / platform-excludes (push) Has been cancelled
docker-build / build (push) Has been cancelled
docker-build / merge (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
Run Pytest on Pull Request / test (push) Has been cancelled
Close stale pull requests/issues / Find Stale issues and PRs (push) Has been cancelled

Fetches GET /api/prices?start&end&zone (15-min slots, EUR/MWh) and stores
the raw market price as feed_in_tariff_wh (EUR/Wh) — no import charges/VAT.

Slots beyond the day-ahead horizon are left to the consumer's forward-fill
(FeedInTariffImport behaviour).

5 unit tests + opt-in live smoke (EOS_DVHUB_ONLINE_LIVE=1, passing).

Signed-off-by: Christin <info@bikinibottom.capital>
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
This commit is contained in:
Bobby Noelte
2026-07-29 22:21:17 +02:00
committed by GitHub
parent 3c1f5d8bc0
commit 52fe489d4e
13 changed files with 381 additions and 22 deletions
+21 -18
View File
@@ -8,6 +8,7 @@ from akkudoktoreos.prediction.elecpricefixed import ElecPriceFixed
from akkudoktoreos.prediction.elecpriceimport import ElecPriceImport
from akkudoktoreos.prediction.elecpricetibber import ElecPriceTibber
from akkudoktoreos.prediction.feedintariffakkudoktor import FeedInTariffAkkudoktor
from akkudoktoreos.prediction.feedintariffdvhubonline import FeedInTariffDvhubOnline
from akkudoktoreos.prediction.feedintariffenergycharts import FeedInTariffEnergyCharts
from akkudoktoreos.prediction.feedintarifffixed import FeedInTariffFixed
from akkudoktoreos.prediction.feedintariffimport import FeedInTariffImport
@@ -50,6 +51,7 @@ def forecast_providers():
ElecPriceImport(),
ElecPriceTibber(),
FeedInTariffAkkudoktor(),
FeedInTariffDvhubOnline(),
FeedInTariffEnergyCharts(),
FeedInTariffFixed(),
FeedInTariffImport(),
@@ -106,24 +108,25 @@ def test_provider_sequence(prediction):
assert isinstance(prediction.providers[3], ElecPriceImport)
assert isinstance(prediction.providers[4], ElecPriceTibber)
assert isinstance(prediction.providers[5], FeedInTariffAkkudoktor)
assert isinstance(prediction.providers[6], FeedInTariffEnergyCharts)
assert isinstance(prediction.providers[7], FeedInTariffFixed)
assert isinstance(prediction.providers[8], FeedInTariffImport)
assert isinstance(prediction.providers[9], FeedInTariffTibber)
assert isinstance(prediction.providers[10], LoadAkkudoktor)
assert isinstance(prediction.providers[11], LoadAkkudoktorAdjusted)
assert isinstance(prediction.providers[12], LoadVrm)
assert isinstance(prediction.providers[13], LoadImport)
assert isinstance(prediction.providers[14], PVForecastAkkudoktor)
assert isinstance(prediction.providers[15], PVForecastVrm)
assert isinstance(prediction.providers[16], PVForecastPVNode)
assert isinstance(prediction.providers[17], PVForecastForecastSolar)
assert isinstance(prediction.providers[18], PVForecastSolcast)
assert isinstance(prediction.providers[19], PVForecastImport)
assert isinstance(prediction.providers[20], WeatherBrightSky)
assert isinstance(prediction.providers[21], WeatherClearOutside)
assert isinstance(prediction.providers[22], WeatherOpenMeteo)
assert isinstance(prediction.providers[23], WeatherImport)
assert isinstance(prediction.providers[6], FeedInTariffDvhubOnline)
assert isinstance(prediction.providers[7], FeedInTariffEnergyCharts)
assert isinstance(prediction.providers[8], FeedInTariffFixed)
assert isinstance(prediction.providers[9], FeedInTariffImport)
assert isinstance(prediction.providers[10], FeedInTariffTibber)
assert isinstance(prediction.providers[11], LoadAkkudoktor)
assert isinstance(prediction.providers[12], LoadAkkudoktorAdjusted)
assert isinstance(prediction.providers[13], LoadVrm)
assert isinstance(prediction.providers[14], LoadImport)
assert isinstance(prediction.providers[15], PVForecastAkkudoktor)
assert isinstance(prediction.providers[16], PVForecastVrm)
assert isinstance(prediction.providers[17], PVForecastPVNode)
assert isinstance(prediction.providers[18], PVForecastForecastSolar)
assert isinstance(prediction.providers[19], PVForecastSolcast)
assert isinstance(prediction.providers[20], PVForecastImport)
assert isinstance(prediction.providers[21], WeatherBrightSky)
assert isinstance(prediction.providers[22], WeatherClearOutside)
assert isinstance(prediction.providers[23], WeatherOpenMeteo)
assert isinstance(prediction.providers[24], WeatherImport)
def test_provider_by_id(prediction, forecast_providers):