Skip to content

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.

ParameterTypeDefaultDescription
latitudefloatrequiredSite latitude (-90 to 90)
longitudefloatrequiredSite longitude (-180 to 180)
capacity_mwfloatrequiredDC peak power (MW)
panel_typestring"CSi"Panel technology: CSi, CdTe, KANENA
slopefloat35.0Panel tilt angle (0-90 degrees)
azimuthfloat180.0Panel orientation (degrees, 180 = South)
trackingstring"fixed"Mounting type (see below)
latitude_optimalboolfalseAuto-optimize tilt for latitude
system_lossfloat0.0System losses as fraction (0-1)
inverter_limitfloatAC clipping limit (MW)
inverter_efficiencyfloat0.9Inverter efficiency (0-1)
clearsky_modelstring"simple"Clearsky model: simple or enhanced

Tracking types:

ValueDescription
fixedFixed tilt at specified slope and azimuth
horizontalSingle-axis horizontal tracking
tilted_horizontalSingle-axis tilted horizontal tracking
verticalSingle-axis vertical tracking
dualDual-axis tracking (follows sun in both axes)

Panel technologies:

TypeDescription
CSiCrystalline silicon — most common, good all-round performance
CdTeCadmium telluride — thin film, better in high temperatures
KANENAKaneka thin film — lightweight, lower efficiency
Example: Generate a solar profile
bash
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.

ParameterTypeDefaultDescription
latitudefloatrequiredSite latitude (-90 to 90)
longitudefloatrequiredSite longitude (-180 to 180)
capacity_mwfloatrequiredTotal farm capacity (MW)
turbine_modelstring"Vestas_V112_3MW"Turbine model (see below)
hub_heightfloatHub height in meters (uses turbine default if omitted)
interpolationstring"logarithmic"Wind speed height interpolation: logarithmic or power
smoothboolfalseApply Gaussian smoothing to power curve
system_lossfloat0.0System losses as fraction (0-1)

Available turbine models:

Onshore turbines
ModelCapacity
Vestas_V112_3MW3 MW
Vestas_V90_3MW3 MW
Vestas_V80_2MW_gridstreamer2 MW
Vestas_V66_1750kW1.75 MW
Vestas_V47_660kW660 kW
Vestas_V25_200kW200 kW
Enercon_E126_7500kW7.5 MW
Enercon_E101_3000kW3 MW
Enercon_E82_3000kW3 MW
Siemens_SWT_107_3600kW3.6 MW
Siemens_SWT_2300kW2.3 MW
Suzlon_S82_1.5_MW1.5 MW
Bonus_B1000_1000kW1 MW
NREL_ReferenceTurbine_2020ATB_4MW4 MW
NREL_ReferenceTurbine_2020ATB_5.5MW5.5 MW
NREL_ReferenceTurbine_2020ATB_7MW7 MW
Offshore turbines
ModelCapacity
Vestas_V112_3MW_offshore3 MW
Vestas_V164_7MW_offshore7 MW
NREL_ReferenceTurbine_5MW_offshore5 MW
NREL_ReferenceTurbine_2020ATB_12MW_offshore12 MW
NREL_ReferenceTurbine_2020ATB_15MW_offshore15 MW
NREL_ReferenceTurbine_2020ATB_18MW_offshore18 MW
Example: Generate a wind profile
bash
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.

YearFileData Sources
2023europe-2023-sarah3-era5.ncSARAH-3 irradiance + ERA5 wind/temperature
2024europe-2024-sarah3-era5.ncSARAH-3 irradiance + ERA5 wind/temperature
2025europe-2025-sarah3-era5.ncSARAH-3 irradiance + ERA5 wind/temperature

Which data is used for which profile type:

VariableSourceUsed by
Surface solar irradiance (direct/diffuse)SARAH-3PV profiles
2m temperatureERA5PV profiles (temperature correction)
Wind speed (10m, 100m)ERA5Wind profiles
Surface roughness lengthERA5Wind profiles (logarithmic interpolation)

List available cutouts via the API:

bash
curl http://localhost:8000/profiles/cutouts

Get metadata for a specific year (coverage area, resolution, time range):

bash
curl http://localhost:8000/profiles/cutouts/2024/info

Using 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.

json
{
  "params": {
    "solarInstalledCapacity": 10,
    "windInstalledCapacity": 5
  },
  "run": {
    "strategy": "rolling_lp",
    "profile_id": "a1b2c3d4-uuid",
    "wind_profile_id": "e5f6g7h8-uuid",
    "enabled_markets": ["day_ahead", "intraday"]
  }
}
ParameterDescription
profile_idSolar production profile UUID (overrides scenario solar data)
wind_profile_idWind 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.

bash
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, or date
  • Output: solar_output_mw, wind_output_mw, output_mw, power, or output

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:

MetricDescription
max_mwPeak output power
mean_mwAverage output power
total_mwhTotal annual energy production
capacity_factorAverage output / installed capacity
full_load_hoursEquivalent hours at full capacity
peak_hoursHours with output > 50% capacity
zero_hoursHours with zero output

Monthly breakdowns are also available, providing seasonal production patterns.

bash
# 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.

bash
# 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/stats

Managing Profiles

OperationEndpointMethod
Generate/profilesPOST
Import CSV/profiles/uploadPOST
List/profilesGET
Get metadata/profiles/{id}GET
Update/profiles/{id}PUT
Delete/profiles/{id}DELETE
Get timeseries/profiles/{id}/dataGET
Export CSV/profiles/{id}/exportGET

See the API Reference for full endpoint details.