PVlib for Solar estimate

26 views
Skip to first unread message

Sofia Moroni

unread,
Feb 18, 2026, 12:05:24 PM (11 days ago) Feb 18
to pvlib-python
Hi everyone,

I'm developing a forecast model for aggregate solar production in Northern Italy using PVlib + Open-Meteo weather data. I'm struggling to properly calibrate the model against ENTSOE actual data.

**Setup:**
- PVlib with ModelChain
- Weather data: Open-Meteo (GHI, DNI, DHI, temperature)
- Installed capacity: ~9,800 MW (plants >= 200kW) distributed across 46 provinces
- Target: ENTSOE actual (plants >= 1 MW)

**Problem:**
The seasonal SHAPE is wrong:
- Winter: significant overestimation (forecast ~6000 MW vs actual ~4000 MW)
- Summer: ok or slight underestimation

A single scaling factor doesn't work because the forecast/actual ratio varies from ~0.65 in winter to ~0.95 in summer.

**Hypotheses:**
1. Open-Meteo overestimates GHI in winter (doesn't capture Po Valley fog?)
2. PVlib parameters not suitable for the Italian plant mix
3. Something else?

**What I've tried:**
- Global scaling factor calibrated on peaks
- Different parameters per power class (loss, module_power_w)
- Considering only plants >= 1 MW

Does anyone have experience with this kind of calibration? Suggestions on alternative weather sources or different approaches?

Thanks!

cwh...@sandia.gov

unread,
Feb 18, 2026, 3:57:22 PM (11 days ago) Feb 18
to pvlib-python
Hi Sofia,

Some ideas:

- about half of all issues reported with pvlib simulations are mis-aligned timestamps. Data may be averaged and aligned with either the beginning or the end of an interval. It is common, in PV simulations, to pair these average values with solar position computed at the midpoint of the intervals, particularly for hourly data.
- plotting plane of array irradiance vs. AC power (scatterplot on hourly data) should produce a roughly linear shape, with slope approximating the overall efficiency (AC power / POA irradiance). If you see multiple linear features, that indicates a change has occurred in either the irradiance data, or in the PV fleet data. If so it's more likely in the latter, added capacity coming online, or systems going offline. Those may affect your simulation if the PV capacity is taken as a constant.
- since the discrepancy is greater in winter months, would snow or icing be an effect in that region?

Let us know what you find,

Cliff

Mehimmedetsi Boudjemaa

unread,
Feb 18, 2026, 4:03:43 PM (11 days ago) Feb 18
to cwh...@sandia.gov, pvlib-python


Open-Meteo provides decent global coverage with models like ICON-2I for Italy (~2 km resolution), but it may overestimate winter solar irradiance (GHI) in Northern Italy's Po Valley due to poor fog and low-cloud modeling.[1]

## Weather Data Issues
Open-Meteo relies on mesoscale models that update every 12 hours for Italy, potentially missing persistent winter fog events common in the Po Valley, leading to inflated GHI/DNI estimates during low-light seasons.[6] This aligns with your hypothesis #1, as coarser models struggle with regional microclimates compared to ENTSOE-monitored plants (>=1 MW). Validation studies (e.g., via MISTRAL portal data) show similar biases in free APIs for Northern Italy winters.[8]

## PVlib Calibration Tips
Adjust PVlib's ModelChain with Italy-specific CEC module parameters or SAPM models tuned for Alpedhues-like conditions; tweak soiling (5-10% winter), snow loss (up to 20% in Alps-adjacent provinces), and temperature coefficients for the ~9.8 GW mix.[4] Use monthly scaling factors derived from ENTSOE ratios (e.g., 0.65 winter, 0.95 summer) or decompose via clear-sky index: `effective_irradiance = ghi * clear_sky_factor * seasonal_adj`. Avoid single global scaling.

## Better Alternatives
Switch to MISTRAL (Meteo Italian Supercomputing Portal) for GRIB/BUFR downloads of COSMO/ECMWF post-processed data—higher resolution for Italy, including station observations that capture fog better.[2] Or ARPA regional APIs for Lombardia/Piemonte provinces; integrate via PVlib's `get_clearsky()` with `pressure=1013` hPa Po Valley-adjusted. For validation, cross-check against PVGIS SARAH2 satellite GHI (free, hourly, Italy-validated).

## Advanced Approaches
- **Hybrid model**: Blend Open-Meteo with Solcast/PVGIS satellite reanalysis for historical ENTSOE calibration; use ML (e.g., XGBoost on residuals) to predict shape bias.
- **Plant mix**: Weight by province capacity factors from Terna/ENTSOE; larger plants (>=1 MW) have bifacial/optimized trackers—set `tracking='singleaxis'` in ModelChain.
- **Test**: Run PVlib's `pvsystem.sapm_effective_irradiance()` with winter fog proxies (RH>90%, T<5C derate 15%).

This should fix the seasonal mismatch without overhauling your setup.[5]

Citations :
[2] Meteo Italian Supercomputing Portal https://www.mistralportal.it/opendata/
[4] Open-Meteo.com: 🌤️ Free Open-Source Weather API https://open-meteo.com
[5] open-meteo/open-meteo: Free Weather Forecast API for ... https://github.com/open-meteo/open-meteo
[6] Weather Forecast API https://open-meteo.com/en/docs
[7] Open-Meteo on AWS Open Data https://github.com/open-meteo/open-data
[8] The Italian open data meteorological portal: MISTRAL - Bottazzi https://rmets.onlinelibrary.wiley.com/doi/10.1002/met.2004
[10] open-data/README.md at main · open-meteo/open-data https://github.com/open-meteo/open-data/blob/main/README.md
Ai


--
You received this message because you are subscribed to the Google Groups "pvlib-python" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pvlib-python...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/pvlib-python/4dd2fed7-b4e0-4ecb-83dd-4b2b607dd0c1n%40googlegroups.com.

Will Hobbs

unread,
Feb 18, 2026, 5:59:22 PM (11 days ago) Feb 18
to pvlib-python
Sofia,

Can you get measured power data for a single site, and the test your workflow against with that smaller dataset? That can help significantly with troubleshooting. 

How confident are you in the accuracy of the plant specifications/metadata you are using? Fixed tilt vs tracking, and tilt for fixed tilt, can have a big impact on seasonal energy. 

Will

--
You received this message because you are subscribed to the Google Groups "pvlib-python" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pvlib-python...@googlegroups.com.

R. de Souza

unread,
Feb 19, 2026, 7:22:34 AM (11 days ago) Feb 19
to pvlib-python
Hi Sofia,

Have you checked whether there are any differences related to daylight saving time? There might be some misalignment in timestamps caused by it.  

Ricardo

Mehimmedetsi Boudjemaa

unread,
Feb 20, 2026, 9:11:33 AM (10 days ago) Feb 20
to Sofia Moroni, pvlib-python


Open-Meteo likely overestimates winter GHI in Northern Italy's Po Valley due to frequent fog, which reduces irradiance but may not be fully captured in its models.[1][2] PVlib ModelChain parameters may also need tuning for local Italian PV mixes, such as temperature coefficients from JRC Ispra data.[3] Seasonal calibration beyond a single factor is key, using better weather data like Solcast or ERA5.[4][5]

## Weather Data Issues
Po Valley fog in winter (late fall to early spring) creates persistent low-level temperature inversions and radiative cooling, severely cutting GHI—often ignored in coarser models like Open-Meteo.[1] Switch to Solcast for direct PV forecasts with ~10% better European accuracy via high-res ICON-EU (6.5km), or ERA5 reanalysis validated for Italy.[4][5] ENEA Solaritaly offers measured GHI/DNI/DHI for 243 Italian sites (2006-2022), ideal for baselines.[6]

## PVlib Calibration Tips
Use province-specific lat/lon/tilt from ProfileSolar (e.g., Pavia: fog-aware analysis).[7][2] Fit seasonal temperature models (e.g., PVSyst) and spectral losses with JRC coefficients from Ispra (near Po Valley).[8][3] For aggregate ~9.8 GW, apply post-processing: train ML regressor on ENTSO-E actuals vs. your ModelChain output, adding solar elevation corrections to fix winter bias.[9]

## Parameter Adjustments
| Aspect | Winter Fix | Summer Fix | Source |
|--------|------------|------------|--------|
| GHI Input | Scale by 0.65 or fog proxy (e.g., RH inversion) | Minimal change | [1] |
| Temp Coeff | Higher losses (use n-type bifacial TCs from JRC) | Standard | [10] |
| Soiling/Other | Increase to 5-10% (PM from Po Valley) | 2-5% | [11] |

## Alternatives & Next Steps
- **Weather**: Solcast API (direct PV kW, 30min res).[11]
- **Full Pipeline**: EMHASS-style forecast adjustment on ENTSO-E.[9]
- **Validate**: Compare vs. ENEA tables per province; aggregate >=1MW subset.[6]
Test ERA5 via PVlib's `get_clearsky` with measured baselines for quick wins.[12]

Citations :
[2] Solar PV Analysis of Pavia, Italy https://profilesolar.com/locations/Italy/Pavia/
[6] Solaritaly | Table values of Solar Radiation in Italy - ENEA https://www.solaritaly.enea.it/TabelleRad/TabelleRadEn.php
[7] Solar PV Analysis of 288 locations in Italy https://profilesolar.com/countries/IT/
[11] Solcast - Solar, Wind and Weather Data Power Built for Renewables https://www.solcast.com
[12] A sub-hourly spatio-temporal statistical model for solar ... https://arxiv.org/html/2509.21041v1
[13] Probabilistic solar power forecasting: An economic and ... https://www.sciencedirect.com/science/article/pii/S0306261924009565
[14] European Resource Adequacy Assessment 2023 https://www.entsoe.eu/eraa/2023/report/ERAA_2023_Annex_2_Methodology.pdf
[16] Operational day-ahead solar power forecasting for ... https://www.sciencedirect.com/science/article/pii/S0960148121015688
[17] Weather Forecast API https://open-meteo.com/en/docs
[18] pvlib-python/docs/sphinx/source/user_guide/modelchain.rst at main · pvlib/pvlib-python https://github.com/pvlib/pvlib-python/blob/main/docs/sphinx/source/user_guide/modelchain.rst
[20] StefaE/PVForecast: Forecasts to optimize electricity ... https://github.com/StefaE/PVForecast
[23] Open-Meteo.com: 🌤️ Free Open-Source Weather API https://open-meteo.com
[25] Enhanced thermal models of photovoltaic modules by ... https://www.sciencedirect.com/science/article/pii/S0927024825005264
[26] Blind Photovoltaic Modeling Intercomparison https://docs.nrel.gov/docs/fy24osti/87172.pdf
[27] PYLEECAN — PYthon Library for Electrical Engineering ... https://www.pyleecan.org
[29] pvlib-python/pvlib/temperature.py at main · pvlib/pvlib-python https://github.com/pvlib/pvlib-python/blob/main/pvlib/temperature.py 
Ai


--
Reply all
Reply to author
Forward
0 new messages