Shading & Horizon
pvnode combines several shading mechanisms. Some are applied automatically, others you configure on the site or per string. This page explains where each one lives and how to set it.
Shading is split between the site and its strings. Terrain horizon and sky obstructions
are site-wide (config.shading); row shading (gcr) and near-field shading
(near_field_shading) are set per string.
Terrain horizon (automatic)
Far shading from terrain — mountains, hills, ridgelines — is active by default. When a site is created, pvnode derives a horizon profile from the coordinates using high-resolution terrain data (25 m in Europe, 30 m globally) and applies it to every forecast and historical query.
You don't configure anything for this. If you ever need to disable it, set use_terrain_horizon to false in the site config:
Disable terrain horizon
Sky obstructions (site-wide)
Use sky_obstruction to define nearby objects that block parts of the sky dome — buildings,
trees, walls. Each obstruction is three values separated by colons:
| Value | Description |
|---|---|
| Start azimuth | Angle in degrees from north where the obstruction begins (0–360). |
| End azimuth | Angle in degrees from north where the obstruction ends (0–360). |
| Elevation | Maximum angle above the horizon the obstruction covers (0–90). |
Join multiple obstructions with underscores _. Up to 10 are allowed. They must be ordered
by ascending azimuth and must not overlap — each obstruction's start azimuth has to be
greater than or equal to the previous one's end azimuth (and within each triple, az_start must
be less than az_end).
Two obstructions: an NE segment and an SW segment
This describes a 20°-high obstruction across the north-east (azimuth 0°–90°) and a 30°-high obstruction across the south-west (180°–270°).
Row shading — Ground Coverage Ratio (per string)
For ground-mounted systems, rows of modules shade the rows behind them at low sun angles. This
is controlled per string with gcr (ground coverage ratio):
Code
GCR = 0(or unset) — no row shading.GCR = 0.5— modules cover half the ground area.- Higher values = tighter row spacing = more inter-row shading.
A ground-mounted string with row shading
Because gcr lives on the string, each sub-array can have its own row geometry.
Near-field shading (per string)
near_field_shading captures time-of-day and seasonal shading on a string — e.g. a chimney
that shades the array every winter morning. It's set per string so different sub-arrays can have
different shading patterns.
The format uses three time blocks joined with underscores, each holding four colon-separated values (one per season). Each value is the shading percentage × 10.
Time blocks:
| Block | Time of day |
|---|---|
| 1st | Morning (6 AM – 10 AM) |
| 2nd | Midday (11 AM – 2 PM) |
| 3rd | Afternoon (3 PM – 8 PM) |
Values per block: Winter : Spring : Summer : Autumn.
Near-field shading on a string
This means:
- Morning: 70 % shading in winter, 20 % spring, 30 % summer, 10 % autumn.
- Midday: 10 % in winter and spring, none in summer and autumn.
- Afternoon: no shading in any season.
Summary
| Mechanism | Where | Field | Default |
|---|---|---|---|
| Terrain horizon | Site (config.shading) | use_terrain_horizon | on |
| Sky obstructions | Site (config.shading) | sky_obstruction | none |
| Row shading | String | gcr | none |
| Near-field | String | near_field_shading | none |
Exact value ranges and defaults are in the API Reference.