Le miroir GitHub n'est pas encore synchronisé : les liens pointent sur git.etm-powersync.fr. INTERFACE.md n'est plus dans le dépôt public : la forme des méthodes NymeaEnergy.* se lit sur la box (JSONRPC.Introspect) ; GetOptimizerStatus n'est pas réservée à l'administrateur. Orthographe anglaise unifiée : optimizer, optimization. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ry3vBrJT1tHdxAaXdCWi6L
107 lines
5.1 KiB
Markdown
107 lines
5.1 KiB
Markdown
# PV production forecast
|
||
|
||
<span class="badge testing">BETA</span> <span class="badge community">COMMUNITY</span>
|
||
|
||
The box forecasts the production of your panels, hour by hour, until the end of the
|
||
next day, and shows it in the app next to the measured production. It is a feature of
|
||
the **Community** edition (GPL-3.0): it relies on the energy engine and the
|
||
[OpenMeteo](../appareils/tarifs/openmeteo.md) plugin, with no ETM service involved.
|
||
|
||
!!! info "Beta"
|
||
Delivered and running on our test installation, it is not yet published in a
|
||
channel of the APT repository.
|
||
|
||
## What you see in the app
|
||
|
||
- **The expected production curve**, hour by hour until the end of the next day,
|
||
overlaid on the measured production.
|
||
- **A weather range** around this curve (see below).
|
||
- **Hour-by-hour weather** on the "Journée" card: an icon (sun, clouds, rain…), day or
|
||
night, and the temperature.
|
||
|
||
## How the forecast is computed
|
||
|
||
For each declared PV plane — tilt, orientation, peak power (kWp) and system efficiency
|
||
—, the box converts the irradiance forecast by Open-Meteo into power. It then adds up
|
||
all the planes of the site.
|
||
|
||
Two corrections apply, both **deterministic**: public physical models, parameterised
|
||
from datasheets, with no learning at all.
|
||
|
||
- **Temperature correction**: a hot module produces less. The box estimates this from
|
||
the forecast temperature, the NOCT and the temperature coefficient of the modules.
|
||
- **Inverter ceiling**: the sum of the planes never exceeds the inverter's maximum AC
|
||
power, if it has been entered.
|
||
|
||
The forecast is recomputed whenever the weather models publish a new run — at most once
|
||
an hour.
|
||
|
||
### A forecast, and an optimistic ceiling
|
||
|
||
What the box shows is a **forecast**, not a measurement. It is also an **optimistic
|
||
ceiling**: shading (trees, chimney, neighbouring buildings) and soiled panels are not
|
||
modelled. Actual production below the curve is therefore normal and does not indicate a
|
||
fault.
|
||
|
||
### An hour without data is a gap, never a zero
|
||
|
||
If an hour is missing (internet down, weather service unavailable), the curve breaks.
|
||
The box never writes "0" instead: a zero would read as "no sun expected".
|
||
|
||
## The weather range
|
||
|
||
Around the curve, the app draws a band:
|
||
**forecast × (1 ± spread of the day's models)**. The spread measures how far several
|
||
weather models disagree about the day.
|
||
|
||
This band qualifies **the weather**, and only the weather. It says nothing about the
|
||
accuracy of the production forecast: shading and soiling are not in it. On a clear,
|
||
stable day it is narrow, precisely when the error from those factors is largest. It is
|
||
therefore neither an "expected error" nor a "confidence interval".
|
||
|
||
## Commissioning
|
||
|
||
1. Install the OpenMeteo plugin and create the **site** and its **PV planes** — see
|
||
[OpenMeteo](../appareils/tarifs/openmeteo.md).
|
||
2. **Designate the forecast site** in the app. Until one is designated, the forecast
|
||
card shows a notice and offers the available sites. All planes of the designated
|
||
site are added up.
|
||
3. Optional: enter the **inverter ceiling** (maximum AC power, in W). Without it, no
|
||
ceiling is applied.
|
||
|
||
## What the forecast does not do
|
||
|
||
This is the central rule of the Community edition: **without an optimizer, control is
|
||
rule-based** (solar surplus, load shedding, priorities). The PV forecast, the
|
||
[entered tariff](../tarifs.md) and the baseload are **displayed** and **recorded
|
||
locally**, but never used to decide. An automated test checks this: the engine makes
|
||
the same decisions with and without forecast, tariff and consumption profile.
|
||
|
||
The local record is used to measure forecast accuracy over time. Validation on a real
|
||
installation is under way; no accuracy figure is published before it is complete.
|
||
|
||
## Baseload forecast <span class="badge nightly">COMING</span>
|
||
|
||
The box will compute a household consumption profile, excluding controlled loads, from
|
||
its own measurements: a median for each hour of the day, separately for working days
|
||
and weekends. A profile needs at least **7 days** of measurements. Until then nothing
|
||
is shown: an absence, never a zero.
|
||
|
||
## Your data
|
||
|
||
Only the OpenMeteo plugin connects to the internet. It sends only the **site's
|
||
coordinates** (rounded to about 1 km in the plugin versions that carry this feature; version `1.15.2+etm1` in the testing channel sends them unrounded), its **altitude** if entered, and the
|
||
**orientation of the panels** (tilt, azimuth). Measurements, recorded forecasts, the
|
||
tariff and consumption stay on the box. Remote access is disabled by default: it opens
|
||
only if you enable it yourself in the app.
|
||
|
||
## What about an optimizer?
|
||
|
||
An optimizer, on the other hand, can use these forecasts to plan: the engine hands them
|
||
over, together with the entered tariff and the baseload, through an
|
||
[open, published protocol](../optimiseur/protocole.md). The optimizer runs at your place,
|
||
on the box or on a machine in your local network, and gets its data from the engine only;
|
||
its setpoints stay capped by the engine's bounds and safety. Connecting an optimizer is
|
||
being tested; the Community edition works entirely without one. See the
|
||
[Optimizer](../optimiseur/index.md) section.
|