Modified on: Tue, 16 Jun, 2026

Module: bazeanalytics.solar.inverter_soiling

This technical note focuses on the Inverter-Based Soiling Detection & Loss Quantification Framework (no soiling sensor needed), which detects PV module soiling, estimates its rate, identifies cleaning events, and quantifies the resulting energy loss using inverter data alone.

Soiling reduces the amount of irradiance reaching the PV modules surface, directly impacting energy production. The objective of the soiling framework is to estimate the soiling level, S(t), over time, and from it the associated power, energy, and revenue losses. There are multiple approaches for soiling detection, including:

  • Inverter-Based Methods (covered in this document)
  • Soiling Station Methods (will be covered in the respective Algorithm and Technical Note)
  • Module Temperature-Based Models

This document describes an Inverter-Based Method, using the inverter's AC/DC measurements as a virtual reference. For every inverter, it produces:

Output Meaning Update frequency
Soiling KPI Daily cleanliness indicator (1.0 = clean baseline) Daily
Wash detection Calendar of detected cleaning events (manual or natural) Daily
Soiling rate Daily speed of dirt accumulation (e.g. 0.05% per day) Daily
Soiling level Cumulative dirt accumulation since last cleaning Daily
Soiling ratio Cleanliness factor (1 - level), fraction of nominal output Daily
Soiling power loss Instantaneous kW lost to soiling, used for revenue-impact calculations At inverter sampling rate

The target output of the pipeline is:

S(t) = Estimated Soiling Level at time t

1. The Soiling Signal

1.1. Overview

A naive approach is to compare the inverter's AC output to its DC input. The flaw: soiling reduces both equally (less light reaches the panel -> less DC -> less AC), so the ratio stays roughly constant. Soiling is invisible in the AC/DC ratio.

Instead of measured DC, the algorithm compares actual AC against the DC power a clean panel would have produced under the observed irradiance and temperature. The resulting ratio is the Energy Performance Index (EPI), which quantifies how efficiently the system converts available solar energy into power:

EPI = AC_actual / DC_expected

where:

  • AC_actual = measured inverter AC active power.
  • DC_expected = modelled clean-panel DC power, derived from a physical performance model (POA irradiance, module temperature, PV module datasheet parameter).

  • Clean panels: EPI is close to the inverter's nominal efficiency (~0.95-0.98) - under optimal conditions - see 1.2 for more information.

  • Dirty panels: AC drops while expected DC stays the same -> EPI drops.
  • The drop is the soiling signal.

1.2. Confounding Effects and Corrections

The raw EPI is potentially contaminated by several other effects that must be removed before the residual signal can be attributed to soiling:

Effect Treatment
Inverter efficiency drift (temperature, loading) Rolling-baseline normalization
String failures, module defects (DC-side issues) Division by a prepared DC health KPI
Inverter clipping, curtailment, night, faults Operating-status exclusion masks
Wiring losses, mismatch Absorbed into the model (assumed stable)
Sensor noise, cloud transients Tukey outlier filter + POA-weighted aggregation

After all corrections, the only remaining time-varying signal is soiling.


2. Procedure

The soiling level S(t) is built in five stages. Each stage runs independently per inverter, which enables a localized soiling detection (e.g. a single row affected by construction dust) compared to site-wide patterns (e.g. seasonal dust accumulation).

+-------------------------------------------------------------------------------+
|  1. Daily Cleanliness Indicator                                               |
|     Inverter data & irradiance & DC health  ->  Daily KPI                      |
|     (1.0 = clean baseline; lower = soiled)                                    |
+------------------------------+------------------------------------------------+
                               v
+-------------------------------------------------------------------------------+
|  2. Cleaning-Event Detection                                                  |
|     Daily KPI  ->  Wash-day flag (0 / 1 per day)                               |
|     - Sharp upward KPI jumps that pass absolute and relative thresholds.      |
+------------------------------+------------------------------------------------+
                               v
+-------------------------------------------------------------------------------+
|  3. Soiling-Rate Estimation                                                   |
|     Daily KPI & wash days  ->  Daily soiling rate (loss per day)               |
|     - Robust slope (Theil-Sen) of Daily KPI between consecutive cleanings,    |
|       smoothed with a 7-day EWMA*. Cross-validated against the rdtools        |
|       SRR** (Stochastic Rate and Recovery) reference method.                  |
+------------------------------+------------------------------------------------+
                               v
+-------------------------------------------------------------------------------+
|  4. Cumulative Soiling Level                                                  |
|     - Regular day:    S(t_i) = S(t_{i-1}) + soiling_rate                      |
|     - Cleaning day:   S(t_i) = S(t_{i-1}) x (1 - reset_fraction)              |
+------------------------------+------------------------------------------------+
                               v
+-------------------------------------------------------------------------------+
|  5. Soiling Power Loss                                                        |
|     AC_actual & S(t) & status flags  ->  Soiling power loss (kW)                |
|     - Soiling_loss_power [kW] = P_clean - P_actual, forced to 0 during night, |
|       curtailment, clipping, and other abnormal operating states.             |
+-------------------------------------------------------------------------------+

3. From Soiling Level to Soiling Loss Calculation

Once S(t) is estimated, soiling-based power losses are computed from the per-sample power loss produced by stage of the procedure above.

The soiling power loss is back-calculated from the measured AC power and the soiling level S(t). The "clean" power - what the inverter would produce if the panels were clean - is recovered from the actual power as:

P_clean = P_actual / (1 - S(t))

The lost power is then the difference between the clean and actual power:

Soiling_loss_power [kW] = P_clean - P_actual

This back-calculation uses the measured AC power as the reference, avoiding any additional inverter-efficiency assumption that would be required to convert an expected DC power to an AC loss. Losses are clipped to >= 0 and forced to 0 during night, curtailment, clipping, and other abnormal operating states (see Section 2, stage 5).

While the total soiling energy loss over a period is the integral of the power loss over time:

Soiling_loss_energy [kWh] = Sigma_(i=1)^n (Soiling_loss_power_i x delta t_i)

These per-inverter quantities are aggregated to plant level and surfaced through the reporting widgets:

  • Soiling Level [%]: the mean or weighted average of S(t) across all inverters:

S_plant(t) = 1/N Sigma S_i(t) where S(t) is the soiling level at time t as defined in Section 1 and Section 2.

The connection between this soiling procedure and the event detection framework is described in the respective technical note: Solar Events Detection.