mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2026-11-13 01:03:45 +01:00
feat(pvforecast): add adaptive per-plane PV learning and diagnostics (#1422)
PV arrays with different orientations and curtailment need separate plant calibration and weather correction. This opt-in provider publishes normal EOS AC/DC forecast keys at 15-minute resolution. - Preserve daily per-plane energy/shape calibration and validated short-term local/trend selection. Curtailment-sensitive arrays require a fresh release flag or an explicitly configured learning guard. - Add switchable empirical solar-angle response relative to separate eligible reference arrays, removing their common weather error. This learns angular residuals, not physical angles or a measured geometric horizon. - Archive actually received weather model inputs, first local receipt and frozen per-member PV candidates. Returned past weather is excluded; unknown source issuance remains explicit. Learn model weights and forecast-regime bias separately at 2–6, 6–24 and 24–48 hours. - New long-horizon candidates remain in shadow until their genuinely issued outputs improve equal-day MAE by the configured margin, win on at least 60% of validation days and pass a matched-support energy-bias guard. Insufficient evidence retains calibration. Daily yields still require complete local days, including DST. - Expose fitted parameters, independent training/validation day counts, errors, selected methods and persistence in the existing status API, with additional normal prediction keys for Grafana. Retain physical DC through angular/weather corrections an enforce individual inverter AC limits. Co-authored-by: Normann <github@koldrack.com> Co-authored-by: Christin <chrissi@von-perbandt.de> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: YMT <yn276364@dal.ca> Co-authored-by: sarankumar1325 <120080287+sarankumar1325@users.noreply.github.com>
This commit is contained in:
co-authored by
Normann
Christin
Claude Opus 5.5
YMT
sarankumar1325
parent
298d46a527
commit
f804d48072
@@ -328,6 +328,56 @@
|
||||
"calibration_min_factor": 0.5,
|
||||
"calibration_max_factor": 1.5
|
||||
},
|
||||
"adaptive": {
|
||||
"backend": "local",
|
||||
"resolution_minutes": 15,
|
||||
"forecast_days": null,
|
||||
"past_days": null,
|
||||
"weather_models": [
|
||||
"best_match",
|
||||
"icon_d2"
|
||||
],
|
||||
"transposition_model": "perez",
|
||||
"albedo": 0.25,
|
||||
"inverter_efficiency": 0.96,
|
||||
"temperature_coefficient": -0.36,
|
||||
"apply_iam": true,
|
||||
"shift_to_interval_start": true,
|
||||
"calibration_enabled": false,
|
||||
"calibration_days": 30,
|
||||
"calibration_reference_days": 30,
|
||||
"calibration_outage_filter_enabled": true,
|
||||
"calibration_outage_threshold": 0.55,
|
||||
"calibration_min_healthy_days": 3,
|
||||
"calibration_azimuth_bin_degrees": 45,
|
||||
"calibration_prior_kwh": 5.0,
|
||||
"calibration_min_factor": 0.5,
|
||||
"calibration_max_factor": 1.5,
|
||||
"regional_weather_model": "icon_d2",
|
||||
"regional_horizon_hours": 6,
|
||||
"learning_days": 21,
|
||||
"min_training_days": 5,
|
||||
"max_ac_power_w": 0,
|
||||
"nominal_total_peakpower_kw": null,
|
||||
"diagnostics_days": 7,
|
||||
"archive_retention_days": 60,
|
||||
"nowcast_enabled": true,
|
||||
"trend_enabled": true,
|
||||
"solar_response_enabled": true,
|
||||
"weather_response_enabled": true,
|
||||
"correction_mode": "auto",
|
||||
"validation_days": 7,
|
||||
"min_validation_days": 3,
|
||||
"min_validation_samples": 32,
|
||||
"min_validation_improvement": 0.02,
|
||||
"training_delay_minutes": 15,
|
||||
"total_measurement_key": null,
|
||||
"total_curtailment_sensitive": false,
|
||||
"total_curtailment_key": null,
|
||||
"total_learning_guard_key": null,
|
||||
"total_learning_guard_max": null,
|
||||
"total_learning_guard_max_gap_seconds": 600
|
||||
},
|
||||
"pvforecastimport": {
|
||||
"import_file_path": null,
|
||||
"import_json": null
|
||||
@@ -360,6 +410,16 @@
|
||||
},
|
||||
"planes": [
|
||||
{
|
||||
"name": null,
|
||||
"measurement_key": null,
|
||||
"nowcast_reference": false,
|
||||
"curtailment_sensitive": false,
|
||||
"parameters_estimated": false,
|
||||
"correction_group": null,
|
||||
"curtailment_key": null,
|
||||
"learning_guard_key": null,
|
||||
"learning_guard_max": null,
|
||||
"learning_guard_max_gap_seconds": 600,
|
||||
"surface_tilt": 10.0,
|
||||
"surface_azimuth": 180.0,
|
||||
"userhorizon": [
|
||||
@@ -382,6 +442,16 @@
|
||||
"strings_per_inverter": 2
|
||||
},
|
||||
{
|
||||
"name": null,
|
||||
"measurement_key": null,
|
||||
"nowcast_reference": false,
|
||||
"curtailment_sensitive": false,
|
||||
"parameters_estimated": false,
|
||||
"correction_group": null,
|
||||
"curtailment_key": null,
|
||||
"learning_guard_key": null,
|
||||
"learning_guard_max": null,
|
||||
"learning_guard_max_gap_seconds": 600,
|
||||
"surface_tilt": 20.0,
|
||||
"surface_azimuth": 90.0,
|
||||
"userhorizon": [
|
||||
|
||||
Reference in New Issue
Block a user