Profile Generator
The engine includes a profile generator that creates synthetic solar (PV) and wind production timeseries from weather data via the atlite library. The underlying data combines SARAH-3 satellite irradiance with ERA5 reanalysis (wind, temperature). Generated profiles are stored in SQLite and can be referenced in simulations by UUID.
Overview
Profiles can also be imported from CSV files instead of generated from weather data.
Profile Types
PV (Solar)
Solar profiles model photovoltaic generation using temperature-dependent panel efficiency (Huld 2010 model). The generator supports three panel technologies and multiple mounting options.
| Parameter | Type | Default | Description |
|---|---|---|---|
latitude | float | required | Site latitude (-90 to 90) |
longitude | float | required | Site longitude (-180 to 180) |
capacity_mw | float | required | DC peak power (MW) |
panel_type | string | "CSi" | Panel technology: CSi, CdTe, KANENA |
slope | float | 35.0 | Panel tilt angle (0-90 degrees) |
azimuth | float | 180.0 | Panel orientation (degrees, 180 = South) |
tracking | string | "fixed" | Mounting type (see below) |
latitude_optimal | bool | false | Auto-optimize tilt for latitude |
system_loss | float | 0.0 | System losses as fraction (0-1) |
inverter_limit | float | — | AC clipping limit (MW) |
inverter_efficiency | float | 0.9 | Inverter efficiency (0-1) |
clearsky_model | string | "simple" | Clearsky model: simple or enhanced |
Tracking types:
| Value | Description |
|---|---|
fixed | Fixed tilt at specified slope and azimuth |
horizontal | Single-axis horizontal tracking |
tilted_horizontal | Single-axis tilted horizontal tracking |
vertical | Single-axis vertical tracking |
dual | Dual-axis tracking (follows sun in both axes) |
Panel technologies:
| Type | Description |
|---|---|
CSi | Crystalline silicon — most common, good all-round performance |
CdTe | Cadmium telluride — thin film, better in high temperatures |
KANENA | Kaneka thin film — lightweight, lower efficiency |
Example: Generate a solar profile
curl -X POST http://localhost:8000/profiles \
-H "Content-Type: application/json" \
-d '{
"name": "Solar NL 10MW",
"profile_type": "pv",
"description": "10 MW fixed-tilt CSi in Netherlands",
"preload": true,
"cutout_year": 2024,
"config": {
"latitude": 52.0,
"longitude": 4.9,
"capacity_mw": 10.0,
"panel_type": "CSi",
"slope": 35.0,
"azimuth": 180.0,
"tracking": "fixed",
"system_loss": 0.1,
"inverter_limit": 9.0
}
}'Wind
Wind profiles model turbine output using manufacturer power curves. The generator supports 21 pre-configured turbine models with hub height interpolation.
| Parameter | Type | Default | Description |
|---|---|---|---|
latitude | float | required | Site latitude (-90 to 90) |
longitude | float | required | Site longitude (-180 to 180) |
capacity_mw | float | required | Total farm capacity (MW) |
turbine_model | string | "Vestas_V112_3MW" | Turbine model (see below) |
hub_height | float | — | Hub height in meters (uses turbine default if omitted) |
interpolation | string | "logarithmic" | Wind speed height interpolation: logarithmic or power |
smooth | bool | false | Apply Gaussian smoothing to power curve |
system_loss | float | 0.0 | System losses as fraction (0-1) |
Available turbine models:
Onshore turbines
| Model | Capacity |
|---|---|
Vestas_V112_3MW | 3 MW |
Vestas_V90_3MW | 3 MW |
Vestas_V80_2MW_gridstreamer | 2 MW |
Vestas_V66_1750kW | 1.75 MW |
Vestas_V47_660kW | 660 kW |
Vestas_V25_200kW | 200 kW |
Enercon_E126_7500kW | 7.5 MW |
Enercon_E101_3000kW | 3 MW |
Enercon_E82_3000kW | 3 MW |
Siemens_SWT_107_3600kW | 3.6 MW |
Siemens_SWT_2300kW | 2.3 MW |
Suzlon_S82_1.5_MW | 1.5 MW |
Bonus_B1000_1000kW | 1 MW |
NREL_ReferenceTurbine_2020ATB_4MW | 4 MW |
NREL_ReferenceTurbine_2020ATB_5.5MW | 5.5 MW |
NREL_ReferenceTurbine_2020ATB_7MW | 7 MW |
Offshore turbines
| Model | Capacity |
|---|---|
Vestas_V112_3MW_offshore | 3 MW |
Vestas_V164_7MW_offshore | 7 MW |
NREL_ReferenceTurbine_5MW_offshore | 5 MW |
NREL_ReferenceTurbine_2020ATB_12MW_offshore | 12 MW |
NREL_ReferenceTurbine_2020ATB_15MW_offshore | 15 MW |
NREL_ReferenceTurbine_2020ATB_18MW_offshore | 18 MW |
Example: Generate a wind profile
curl -X POST http://localhost:8000/profiles \
-H "Content-Type: application/json" \
-d '{
"name": "Wind NL 5MW",
"profile_type": "wind",
"cutout_year": 2024,
"config": {
"latitude": 52.0,
"longitude": 4.9,
"capacity_mw": 5.0,
"turbine_model": "Vestas_V90_3MW",
"hub_height": 80,
"interpolation": "logarithmic",
"system_loss": 0.05
}
}'Generation Process
Generation takes 30-60 seconds per profile. The mini-cutout optimization (3x3 grid around the target location) significantly reduces processing time compared to loading the full European cutout.
Weather Data
Profiles are generated from cutout files that combine two data sources:
- SARAH-3 (EUMETSAT CM SAF) — satellite-derived surface solar irradiance (direct and diffuse). Higher spatial resolution and more accurate for PV modeling than reanalysis products alone.
- ERA5 (ECMWF) — reanalysis data providing wind speed (10m and 100m), temperature, roughness length, and other atmospheric variables. Used for wind profile generation and PV temperature correction.
Each cutout merges both datasets into a single NetCDF file covering one full year of hourly data across a European domain. The atlite library handles the data fusion and variable selection depending on the profile type being generated.
| Year | File | Data Sources |
|---|---|---|
| 2023 | europe-2023-sarah3-era5.nc | SARAH-3 irradiance + ERA5 wind/temperature |
| 2024 | europe-2024-sarah3-era5.nc | SARAH-3 irradiance + ERA5 wind/temperature |
| 2025 | europe-2025-sarah3-era5.nc | SARAH-3 irradiance + ERA5 wind/temperature |
Which data is used for which profile type:
| Variable | Source | Used by |
|---|---|---|
| Surface solar irradiance (direct/diffuse) | SARAH-3 | PV profiles |
| 2m temperature | ERA5 | PV profiles (temperature correction) |
| Wind speed (10m, 100m) | ERA5 | Wind profiles |
| Surface roughness length | ERA5 | Wind profiles (logarithmic interpolation) |
List available cutouts via the API:
curl http://localhost:8000/profiles/cutoutsGet metadata for a specific year (coverage area, resolution, time range):
curl http://localhost:8000/profiles/cutouts/2024/infoUsing Profiles in Simulations
Reference a profile by its UUID in the simulation run configuration. The profile data replaces any scenario-level solar or wind data.
{
"params": {
"solarInstalledCapacity": 10,
"windInstalledCapacity": 5
},
"run": {
"strategy": "rolling_lp",
"profile_id": "a1b2c3d4-uuid",
"wind_profile_id": "e5f6g7h8-uuid",
"enabled_markets": ["day_ahead", "intraday"]
}
}| Parameter | Description |
|---|---|
profile_id | Solar production profile UUID (overrides scenario solar data) |
wind_profile_id | Wind production profile UUID (overrides scenario wind data) |
The simulation loads profile data from cache (or database on first access), converts it to numpy arrays, and uses it to model co-located renewable generation alongside battery trading.
Importing from CSV
Instead of generating from weather data, profiles can be imported from CSV files.
curl -X POST http://localhost:8000/profiles/upload \
-F "file=@solar_data.csv" \
-F "name=Imported Solar" \
-F "profile_type=pv" \
-F "latitude=52.0" \
-F "longitude=4.9" \
-F "capacity_mw=10.0"Accepted CSV columns:
- Timestamp:
timestamp,time,datetime, ordate - Output:
solar_output_mw,wind_output_mw,output_mw,power, oroutput
The importer auto-detects delimiter (, or ;) and resamples to 15-minute intervals if the input is at hourly or 30-minute resolution.
Profile Statistics
Every generated or imported profile includes computed statistics:
| Metric | Description |
|---|---|
max_mw | Peak output power |
mean_mw | Average output power |
total_mwh | Total annual energy production |
capacity_factor | Average output / installed capacity |
full_load_hours | Equivalent hours at full capacity |
peak_hours | Hours with output > 50% capacity |
zero_hours | Hours with zero output |
Monthly breakdowns are also available, providing seasonal production patterns.
# View profile metadata and statistics
curl http://localhost:8000/profiles/{profile_id}Caching
Profiles are cached in memory for fast access during simulations. The cache uses an LRU (Least Recently Used) eviction policy with a configurable memory limit (default: 500 MB).
Preloading: Mark profiles with preload: true to load them into cache on API startup. Preloaded profiles are never evicted.
# Enable preloading for a profile
curl -X POST http://localhost:8000/profiles/{profile_id}/preload \
-H "Content-Type: application/json" \
-d '{ "preload": true }'
# View cache statistics
curl http://localhost:8000/profiles/cache/statsManaging Profiles
| Operation | Endpoint | Method |
|---|---|---|
| Generate | /profiles | POST |
| Import CSV | /profiles/upload | POST |
| List | /profiles | GET |
| Get metadata | /profiles/{id} | GET |
| Update | /profiles/{id} | PUT |
| Delete | /profiles/{id} | DELETE |
| Get timeseries | /profiles/{id}/data | GET |
| Export CSV | /profiles/{id}/export | GET |
See the API Reference for full endpoint details.