Skip to content

Commit 323ad4c

Browse files
Merge remote-tracking branch 'origin/codex/fehler-im-ladealgorithmus-untersuchen' into feat/optimization-interval-15min
# Conflicts: # CHANGELOG.md
2 parents 4093f6c + cc58360 commit 323ad4c

27 files changed

Lines changed: 2434 additions & 259 deletions

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
88

99
### Added
1010

11+
- New PV forecast providers giving operators more cloud forecast sources to choose from in
12+
addition to Akkudoktor, VRM and Import:
13+
- `PVForecastPVNode` — native 15-minute forecasts from the pvnode.com API.
14+
- `PVForecastForecastSolar` — forecasts from the free Forecast.Solar API.
15+
- `PVForecastSolcast` — forecasts from the Solcast rooftop-site API.
1116
- 15-minute optimization interval for the genetic optimizer. `optimization.interval`
1217
now accepts 900 (15 min) in addition to the default 3600 (1 hour), letting the
1318
optimizer schedule on a quarter-hour grid for 15-minute dynamic electricity
1419
tariffs. Device power caps and the solution/plan serializers are slot-aware; the
15-
default 3600 s interval keeps the previous hourly behaviour.
20+
default 3600 s interval keeps the previous hourly behaviour. The new sub-hourly PV
21+
providers (pvnode, Forecast.Solar, Solcast) feed their native resolution straight
22+
into the quarter-hour grid.
1623

1724
## 0.3.0 (2026-03-17)
1825

docs/_generated/configelecprice.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
| energycharts | `EOS_ELECPRICE__ENERGYCHARTS` | `ElecPriceEnergyChartsCommonSettings` | `rw` | `required` | Energy Charts provider settings. |
1414
| provider | `EOS_ELECPRICE__PROVIDER` | `Optional[str]` | `rw` | `None` | Electricity price provider id of provider to be used. |
1515
| providers | | `list[str]` | `ro` | `N/A` | Available electricity price provider ids. |
16+
| tibber | `EOS_ELECPRICE__TIBBER` | `ElecPriceTibberCommonSettings` | `rw` | `required` | Tibber electricity price provider settings. |
1617
| vat_rate | `EOS_ELECPRICE__VAT_RATE` | `Optional[float]` | `rw` | `1.19` | VAT rate factor applied to electricity price when charges are used. |
1718
:::
1819
<!-- pyml enable line-length -->
@@ -39,6 +40,10 @@
3940
},
4041
"energycharts": {
4142
"bidding_zone": "DE-LU"
43+
},
44+
"tibber": {
45+
"access_token": null,
46+
"home_id": null
4247
}
4348
}
4449
}
@@ -68,9 +73,14 @@
6873
"energycharts": {
6974
"bidding_zone": "DE-LU"
7075
},
76+
"tibber": {
77+
"access_token": null,
78+
"home_id": null
79+
},
7180
"providers": [
7281
"ElecPriceAkkudoktor",
7382
"ElecPriceEnergyCharts",
83+
"ElecPriceTibber",
7484
"ElecPriceFixed",
7585
"ElecPriceImport"
7686
]
@@ -79,6 +89,37 @@
7989
```
8090
<!-- pyml enable line-length -->
8191

92+
### Common settings for the Tibber electricity price provider
93+
94+
<!-- pyml disable line-length -->
95+
:::{table} elecprice::tibber
96+
:widths: 10 10 5 5 30
97+
:align: left
98+
99+
| Name | Type | Read-Only | Default | Description |
100+
| ---- | ---- | --------- | ------- | ----------- |
101+
| access_token | `Optional[str]` | `rw` | `None` | Tibber API access token. |
102+
| home_id | `Optional[str]` | `rw` | `None` | Tibber home id to read prices from. |
103+
:::
104+
<!-- pyml enable line-length -->
105+
106+
<!-- pyml disable no-emphasis-as-heading -->
107+
**Example Input/Output**
108+
<!-- pyml enable no-emphasis-as-heading -->
109+
110+
<!-- pyml disable line-length -->
111+
```json
112+
{
113+
"elecprice": {
114+
"tibber": {
115+
"access_token": "tibber_pat_...",
116+
"home_id": "00000000-0000-0000-0000-000000000000"
117+
}
118+
}
119+
}
120+
```
121+
<!-- pyml enable line-length -->
122+
82123
### Common settings for Energy Charts electricity price provider
83124

84125
<!-- pyml disable line-length -->

docs/_generated/configexample.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@
110110
},
111111
"energycharts": {
112112
"bidding_zone": "DE-LU"
113+
},
114+
"tibber": {
115+
"access_token": null,
116+
"home_id": null
113117
}
114118
},
115119
"ems": {
@@ -187,7 +191,10 @@
187191
"provider": "PVForecastAkkudoktor",
188192
"provider_settings": {
189193
"PVForecastImport": null,
190-
"PVForecastVrm": null
194+
"PVForecastVrm": null,
195+
"PVForecastPVNode": null,
196+
"PVForecastForecastSolar": null,
197+
"PVForecastSolcast": null
191198
},
192199
"planes": [
193200
{

docs/_generated/configpvforecast.md

Lines changed: 117 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@
3131
"provider": "PVForecastAkkudoktor",
3232
"provider_settings": {
3333
"PVForecastImport": null,
34-
"PVForecastVrm": null
34+
"PVForecastVrm": null,
35+
"PVForecastPVNode": null,
36+
"PVForecastForecastSolar": null,
37+
"PVForecastSolcast": null
3538
},
3639
"planes": [
3740
{
@@ -96,7 +99,10 @@
9699
"provider": "PVForecastAkkudoktor",
97100
"provider_settings": {
98101
"PVForecastImport": null,
99-
"PVForecastVrm": null
102+
"PVForecastVrm": null,
103+
"PVForecastPVNode": null,
104+
"PVForecastForecastSolar": null,
105+
"PVForecastSolcast": null
100106
},
101107
"planes": [
102108
{
@@ -148,6 +154,9 @@
148154
"providers": [
149155
"PVForecastAkkudoktor",
150156
"PVForecastVrm",
157+
"PVForecastPVNode",
158+
"PVForecastForecastSolar",
159+
"PVForecastSolcast",
151160
"PVForecastImport"
152161
],
153162
"planes_peakpower": [
@@ -183,6 +192,105 @@
183192
```
184193
<!-- pyml enable line-length -->
185194

195+
### Common settings for the Solcast PV forecast provider
196+
197+
<!-- pyml disable line-length -->
198+
:::{table} pvforecast::provider_settings::PVForecastSolcast
199+
:widths: 10 10 5 5 30
200+
:align: left
201+
202+
| Name | Type | Read-Only | Default | Description |
203+
| ---- | ---- | --------- | ------- | ----------- |
204+
| api_key | `str` | `rw` | `` | Solcast API key (Bearer auth). Required. |
205+
| site_id | `str` | `rw` | `` | Solcast rooftop site (resource) id. Required. |
206+
:::
207+
<!-- pyml enable line-length -->
208+
209+
<!-- pyml disable no-emphasis-as-heading -->
210+
**Example Input/Output**
211+
<!-- pyml enable no-emphasis-as-heading -->
212+
213+
<!-- pyml disable line-length -->
214+
```json
215+
{
216+
"pvforecast": {
217+
"provider_settings": {
218+
"PVForecastSolcast": {
219+
"api_key": "your-solcast-key",
220+
"site_id": "abcd-1234-efgh-5678"
221+
}
222+
}
223+
}
224+
}
225+
```
226+
<!-- pyml enable line-length -->
227+
228+
### Common settings for the Forecast.Solar PV forecast provider
229+
230+
<!-- pyml disable line-length -->
231+
:::{table} pvforecast::provider_settings::PVForecastForecastSolar
232+
:widths: 10 10 5 5 30
233+
:align: left
234+
235+
| Name | Type | Read-Only | Default | Description |
236+
| ---- | ---- | --------- | ------- | ----------- |
237+
| api_key | `Optional[str]` | `rw` | `None` | Forecast.Solar API key. Optional — the public endpoint works without a key (lower rate limit). |
238+
:::
239+
<!-- pyml enable line-length -->
240+
241+
<!-- pyml disable no-emphasis-as-heading -->
242+
**Example Input/Output**
243+
<!-- pyml enable no-emphasis-as-heading -->
244+
245+
<!-- pyml disable line-length -->
246+
```json
247+
{
248+
"pvforecast": {
249+
"provider_settings": {
250+
"PVForecastForecastSolar": {
251+
"api_key": null
252+
}
253+
}
254+
}
255+
}
256+
```
257+
<!-- pyml enable line-length -->
258+
259+
### Common settings for the pvnode.com PV forecast provider
260+
261+
<!-- pyml disable line-length -->
262+
:::{table} pvforecast::provider_settings::PVForecastPVNode
263+
:widths: 10 10 5 5 30
264+
:align: left
265+
266+
| Name | Type | Read-Only | Default | Description |
267+
| ---- | ---- | --------- | ------- | ----------- |
268+
| api_key | `str` | `rw` | `` | pvnode.com API key (Bearer auth). Required. |
269+
| forecast_days | `int` | `rw` | `2` | Forecast horizon in days (1-7, capped by the pvnode plan). |
270+
| site_id | `Optional[str]` | `rw` | `None` | pvnode.com site id of the saved plant ('Anlagen-ID'). When set, the saved (possibly calibrated) site is used. Leave empty to send the configured pvforecast.planes inline instead. |
271+
:::
272+
<!-- pyml enable line-length -->
273+
274+
<!-- pyml disable no-emphasis-as-heading -->
275+
**Example Input/Output**
276+
<!-- pyml enable no-emphasis-as-heading -->
277+
278+
<!-- pyml disable line-length -->
279+
```json
280+
{
281+
"pvforecast": {
282+
"provider_settings": {
283+
"PVForecastPVNode": {
284+
"api_key": "pvn_live_xxxxxxxxxxxxxxxx",
285+
"site_id": "abcd-1234",
286+
"forecast_days": 2
287+
}
288+
}
289+
}
290+
}
291+
```
292+
<!-- pyml enable line-length -->
293+
186294
### Common settings for PV forecast VRM API
187295

188296
<!-- pyml disable line-length -->
@@ -258,7 +366,10 @@
258366

259367
| Name | Type | Read-Only | Default | Description |
260368
| ---- | ---- | --------- | ------- | ----------- |
369+
| PVForecastForecastSolar | `Optional[akkudoktoreos.prediction.pvforecastforecastsolar.PVForecastForecastSolarCommonSettings]` | `rw` | `None` | PVForecastForecastSolar settings |
261370
| PVForecastImport | `Optional[akkudoktoreos.prediction.pvforecastimport.PVForecastImportCommonSettings]` | `rw` | `None` | PVForecastImport settings |
371+
| PVForecastPVNode | `Optional[akkudoktoreos.prediction.pvforecastpvnode.PVForecastPVNodeCommonSettings]` | `rw` | `None` | PVForecastPVNode settings |
372+
| PVForecastSolcast | `Optional[akkudoktoreos.prediction.pvforecastsolcast.PVForecastSolcastCommonSettings]` | `rw` | `None` | PVForecastSolcast settings |
262373
| PVForecastVrm | `Optional[akkudoktoreos.prediction.pvforecastvrm.PVForecastVrmCommonSettings]` | `rw` | `None` | PVForecastVrm settings |
263374
:::
264375
<!-- pyml enable line-length -->
@@ -273,7 +384,10 @@
273384
"pvforecast": {
274385
"provider_settings": {
275386
"PVForecastImport": null,
276-
"PVForecastVrm": null
387+
"PVForecastVrm": null,
388+
"PVForecastPVNode": null,
389+
"PVForecastForecastSolar": null,
390+
"PVForecastSolcast": null
277391
}
278392
}
279393
}

docs/_generated/openapi.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Akkudoktor-EOS
22

3-
**Version**: `v0.3.0.dev2604141105859917`
3+
**Version**: `v0.3.0.dev2607071966322885`
44

55
<!-- pyml disable line-length -->
66
**Description**: This project provides a comprehensive solution for simulating and optimizing an energy system based on renewable energy sources. With a focus on photovoltaic (PV) systems, battery storage (batteries), load management (consumer requirements), heat pumps, electric vehicles, and consideration of electricity price data, this system enables forecasting and optimization of energy flow and costs over a specified period.

docs/akkudoktoreos/prediction.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ Configuration options:
373373

374374
- `PVForecastAkkudoktor`: Retrieves from Akkudoktor.net.
375375
- `PVForecastVrm`: Retrieves data from the VRM API by Victron Energy.
376+
- `PVForecastPVNode`: Retrieves native 15-minute forecasts from the pvnode.com API.
377+
- `PVForecastForecastSolar`: Retrieves forecasts from the free Forecast.Solar API.
378+
- `PVForecastSolcast`: Retrieves forecasts from the Solcast rooftop-site API.
376379
- `PVForecastImport`: Imports from a file or JSON string or by endpoint data provision.
377380

378381
- `planes[].surface_tilt`: Tilt angle from horizontal plane. Ignored for two-axis tracking.
@@ -401,6 +404,12 @@ Configuration options:
401404
- `planes[].strings_per_inverter`: Number of the strings of the inverter of this plane.
402405
- `provider_settings.import_file_path`: Path to the file to import PV forecast data from.
403406
- `provider_settings.import_json`: JSON string, dictionary of PV forecast value lists.
407+
- `provider_settings.PVForecastPVNode.api_key`: pvnode.com API key.
408+
- `provider_settings.PVForecastPVNode.site_id`: pvnode.com saved-site id. Leave empty for inline mode.
409+
- `provider_settings.PVForecastPVNode.forecast_days`: Forecast horizon in days (1-7).
410+
- `provider_settings.PVForecastForecastSolar.api_key`: Forecast.Solar API key (optional).
411+
- `provider_settings.PVForecastSolcast.api_key`: Solcast API key.
412+
- `provider_settings.PVForecastSolcast.site_id`: Solcast rooftop resource (site) id.
404413

405414
---
406415

@@ -604,6 +613,84 @@ The PV forecast data must be provided in one of the formats described in
604613
The data may additionally or solely be provided by the
605614
**PUT** `/v1/prediction/import/PVForecastImport` endpoint.
606615

616+
### PVForecastPVNode Provider
617+
618+
The `PVForecastPVNode` provider retrieves native 15-minute PV power forecasts from the
619+
[pvnode.com](https://pvnode.com) V2 API. Register a site in the pvnode web app and store the API
620+
key together with the site id in the EOS configuration (saved-site mode). Alternatively, leave the
621+
site id empty to send the configured `planes` geometry inline.
622+
623+
```python
624+
{
625+
"pvforecast": {
626+
"provider": "PVForecastPVNode",
627+
"provider_settings": {
628+
"PVForecastPVNode": {
629+
"api_key": "your-pvnode-key",
630+
"site_id": "your-site-id",
631+
"forecast_days": 2
632+
}
633+
}
634+
}
635+
}
636+
```
637+
638+
The prediction keys for the PV forecast data are:
639+
640+
- `pvforecast_ac_power`: Total AC power (W).
641+
- `pvforecast_dc_power`: Total DC power (W).
642+
643+
### PVForecastForecastSolar Provider
644+
645+
The `PVForecastForecastSolar` provider retrieves PV power forecasts from the free
646+
[Forecast.Solar](https://forecast.solar) API. No API key is required for the public endpoint; an
647+
optional key raises the rate limit. The location is taken from `general.latitude`/`longitude` and
648+
the system geometry from the configured `planes` (one request per plane, summed per timestamp).
649+
650+
```python
651+
{
652+
"pvforecast": {
653+
"provider": "PVForecastForecastSolar",
654+
"provider_settings": {
655+
"PVForecastForecastSolar": {
656+
"api_key": null
657+
}
658+
}
659+
}
660+
}
661+
```
662+
663+
The prediction keys for the PV forecast data are:
664+
665+
- `pvforecast_ac_power`: Total AC power (W).
666+
- `pvforecast_dc_power`: Total DC power (W).
667+
668+
### PVForecastSolcast Provider
669+
670+
The `PVForecastSolcast` provider retrieves PV power forecasts from the
671+
[Solcast](https://solcast.com) rooftop-site API. Register a rooftop site in the Solcast web app and
672+
store the API key together with the resource (site) id in the EOS configuration. Note that the free
673+
tier limits the number of API calls per day.
674+
675+
```python
676+
{
677+
"pvforecast": {
678+
"provider": "PVForecastSolcast",
679+
"provider_settings": {
680+
"PVForecastSolcast": {
681+
"api_key": "your-solcast-key",
682+
"site_id": "your-resource-id"
683+
}
684+
}
685+
}
686+
}
687+
```
688+
689+
The prediction keys for the PV forecast data are:
690+
691+
- `pvforecast_ac_power`: Total AC power (W).
692+
- `pvforecast_dc_power`: Total DC power (W).
693+
607694
## Weather Prediction
608695

609696
Prediction keys:

0 commit comments

Comments
 (0)