diff --git a/docs/appareils/tarifs/openmeteo.de.md b/docs/appareils/tarifs/openmeteo.de.md
index 8624b2a..80fc38a 100644
--- a/docs/appareils/tarifs/openmeteo.de.md
+++ b/docs/appareils/tarifs/openmeteo.de.md
@@ -28,8 +28,9 @@ Das Plugin legt zwei Arten von Objekten an:
laufende Stunde, die nächsten 3, 6 und 12 Stunden, den Rest des Tages und den
Folgetag.
-Die ETM-PowerSync-App zeigt diese Prognosen neben den Messwerten an (erwartete
-Erzeugung in den Diagrammen, Wetter Stunde für Stunde).
+Die Energie-Engine addiert die Flächen des bestimmten Standorts, und die App zeigt die
+resultierende Kurve neben den Messwerten an, zusammen mit dem Wetter Stunde für Stunde –
+siehe [PV-Erzeugungsprognose](../../fonctionnalites/prevision-pv.md).
## 2. Standort hinzufügen
@@ -80,7 +81,9 @@ Deshalb heißen die Werte `forecast…` (Prognose) oder `observed…`
Die erwartete Erzeugung wird einfach berechnet: prognostizierte Einstrahlung ×
Spitzenleistung × angegebener Wirkungsgrad. Sie **berücksichtigt nicht** Verschattung,
-Verschmutzung der Module oder die Leistungsbegrenzung des Wechselrichters. Die
+Verschmutzung der Module und, auf Ebene des Plugins, die Leistungsbegrenzung des
+Wechselrichters (die Engine wendet die Wechselrichtergrenze auf die Summe der Flächen
+an, sofern sie angegeben ist). Die
Abweichung geht daher immer in dieselbe Richtung: **Die Prognose ist optimistisch.**
4 kW Prognose sind nicht 4 kW Erzeugung.
diff --git a/docs/appareils/tarifs/openmeteo.en.md b/docs/appareils/tarifs/openmeteo.en.md
index 30aa486..8dc0dad 100644
--- a/docs/appareils/tarifs/openmeteo.en.md
+++ b/docs/appareils/tarifs/openmeteo.en.md
@@ -27,8 +27,9 @@ The plugin creates two kinds of objects:
the expected production derived from it: for the current hour, the next 3, 6 and 12
hours, the rest of the day and tomorrow.
-The ETM-PowerSync app shows these forecasts next to the measurements (expected
-production on the charts, hour-by-hour weather).
+The energy engine adds up the planes of the designated site, and the app shows the
+resulting curve next to the measurements, with the hour-by-hour weather — see
+[PV production forecast](../../fonctionnalites/prevision-pv.md).
## 2. Adding the site
@@ -75,8 +76,9 @@ This is why the values are named `forecast…` or `observed…` (satellite obser
there is no `pvPower` in this plugin, only `forecastPvPower`.
The expected production is a simple calculation: forecast irradiance × peak power ×
-declared efficiency. It **does not account for** shading, soiled modules or inverter
-clipping. The error therefore always goes the same way: **the forecast is
+declared efficiency. It **does not account for** shading, soiled modules or, at plugin
+level, inverter clipping (the engine applies the inverter ceiling to the sum of the
+planes, if it has been entered). The error therefore always goes the same way: **the forecast is
optimistic**. 4 kW forecast is not 4 kW produced.
The **weather spread** published for today and tomorrow (in %) says how uncertain the
diff --git a/docs/appareils/tarifs/openmeteo.md b/docs/appareils/tarifs/openmeteo.md
index c3cbce4..c2f8eea 100644
--- a/docs/appareils/tarifs/openmeteo.md
+++ b/docs/appareils/tarifs/openmeteo.md
@@ -27,8 +27,9 @@ Le plugin crée deux types d'objets :
la production prévue qui en découle, pour l'heure courante, les 3, 6 et 12 heures à
venir, le reste de la journée et le lendemain.
-L'application ETM-PowerSync affiche ces prévisions à côté des mesures (production
-prévue sur les graphes, météo heure par heure).
+Le moteur d'énergie additionne les plans du site désigné et l'application affiche la
+courbe obtenue à côté des mesures, avec la météo heure par heure — voir
+[Prévision de production PV](../../fonctionnalites/prevision-pv.md).
## 2. Ajouter le site
@@ -78,7 +79,8 @@ C'est pourquoi les grandeurs sont nommées `forecast…` (prévision) ou `observ
La production prévue est calculée simplement : irradiance prévue × puissance crête ×
rendement déclaré. Elle **ne tient pas compte** de l'ombrage, de l'encrassement des
-panneaux ni de l'écrêtage de l'onduleur. L'écart va donc toujours dans le même sens :
+panneaux ni, au niveau du plugin, de l'écrêtage de l'onduleur (le moteur applique le
+plafond onduleur à la somme des plans, s'il est renseigné). L'écart va donc toujours dans le même sens :
**la prévision est optimiste**. 4 kW prévus ne sont pas 4 kW produits.
La **dispersion météo** publiée pour aujourd'hui et demain (en %) dit à quel point la
diff --git a/docs/faq.de.md b/docs/faq.de.md
index adbe282..7221a9a 100644
--- a/docs/faq.de.md
+++ b/docs/faq.de.md
@@ -4,16 +4,22 @@
## Schickt ETM PowerSync meine Daten in die Cloud?
-Nein. Die Optimierungslogik läuft lokal, auf Ihrer Hardware. Das ist eine
-Architekturentscheidung, keine Option.
+Nein. Die Steuerung läuft lokal auf der Box und arbeitet auch ohne Internet weiter.
+Die einzige Komponente, die sich von selbst mit dem Internet verbindet, ist das
+Wetter-Plugin OpenMeteo: Es sendet nur die Koordinaten des Standorts (auf etwa 1 km
+gerundet), seine Höhe und die Ausrichtung der Module. Messwerte, Verbrauch und Tarif
+bleiben bei Ihnen. Der Fernzugriff ist standardmäßig deaktiviert; er wird nur geöffnet,
+wenn Sie ihn selbst in der App aktivieren. Das ist eine Architekturentscheidung, keine
+Option.
## Ist das Projekt Open Source?
-Die Basis (`powersync-core`) und die Plugins stehen unter GPL-3.0. Der Konnektor zum
-Optimierer (`optimizer-plugin`) ebenfalls — alles, was mit nymea verbunden ist, ist es.
-Die **Fachlogik** der Optimierung dagegen (`powersync-optimizer`: Tarifabwägung,
-Predict AI) ist proprietär: sie läuft in einem separaten Prozess, erreichbar über einen
-Unix-Socket. Diese IPC-Grenze ist der Kern des Open-Core-Modells — das Plugin bleibt
+Die Basis (`powersync-core`) und die Plugins stehen unter GPL-3.0. Der in die
+Energie-Engine integrierte Optimierer-Client ebenfalls — alles, was mit nymea verbunden
+ist, ist es. Die **Fachlogik** der Optimierung dagegen (Tarifabwägung, an Ihrer Anlage
+gelernte Prognosen) ist proprietär: sie läuft in einem separaten Prozess, angebunden
+über eine offene, dokumentierte Schnittstelle. Die Optimierung läuft bei Ihnen, auf der
+Box oder auf einem Rechner in Ihrem lokalen Netz. Diese IPC-Grenze ist der Kern des Open-Core-Modells — das Plugin bleibt
frei, die Fachlogik bleibt proprietär.
## Was unterscheidet Community und Pro?
@@ -22,10 +28,12 @@ Zwei Editionen, nicht drei — die Prognoseschicht wird seit dem 14.10.2026 nich
getrennt angeboten, sie gehört zu Pro.
- **Community** — die GPL-3.0-Basis, selbst hostbar: regelbasierte Steuerung,
- Solarüberschuss, Lastabwurf, REST-/MQTT-API. Ohne Abonnement.
+ Solarüberschuss, Lastabwurf, [PV-Erzeugungsprognose](fonctionnalites/prevision-pv.md)
+ aus physikalischen Modellen (Beta, angezeigt, nicht für Entscheidungen verwendet),
+ REST-/MQTT-API. Ohne Abonnement.
- **Pro** — von ETM-Schurig installiert: zusätzlich Tarifabwägung und die
- Prognoseschicht (*Predict AI*: PV- und Verbrauchsprognose, thermische Trägheit der
- Wärmepumpe). **Ebenfalls ohne Abonnement**, und alles bleibt lokal.
+ Prognoseschicht (an Ihrer Anlage gelernte Erzeugungs- und Verbrauchsprognosen,
+ thermische Trägheit der Wärmepumpe). **Ebenfalls ohne Abonnement**, und alles bleibt lokal.
Tarifabwägung und Prognose stehen auf der **Roadmap**: die Open-Core-Grenze existiert
bereits, die Funktionen, die sie trennt, sind noch nicht alle ausgeliefert. Siehe
diff --git a/docs/faq.en.md b/docs/faq.en.md
index 33ca505..b7b5535 100644
--- a/docs/faq.en.md
+++ b/docs/faq.en.md
@@ -4,15 +4,21 @@
## Does ETM PowerSync send my data to the cloud?
-No. The optimisation logic runs locally, on your hardware. That is an architectural
-decision, not an option.
+No. Control runs locally, on the box, and keeps working without internet. The only
+component that connects to the internet on its own is the OpenMeteo weather plugin: it
+sends only the site's coordinates (rounded to about 1 km), its altitude and the
+orientation of the panels. Measurements, consumption and the tariff stay with you.
+Remote access is disabled by default; it opens only if you enable it yourself in the
+app. That is an architectural decision, not an option.
## Is the project open source?
-The foundation (`powersync-core`) and the plugins are under GPL-3.0. So is the connector
-to the optimiser (`optimizer-plugin`) — everything linked against nymea is. The
-optimisation **business logic**, however (`powersync-optimizer`: tariff arbitration,
-Predict AI), is proprietary: it runs in a separate process, reached over a Unix socket.
+The foundation (`powersync-core`) and the plugins are under GPL-3.0. So is the optimiser
+client built into the energy engine — everything linked against nymea is. The
+optimisation **business logic**, however (tariff arbitration, forecasts learned from
+your installation), is proprietary: it runs in a separate process, reached through an
+open, documented interface. Optimisation runs at your place, on the box or on a machine
+in your local network.
That IPC boundary is the heart of the Open Core model — the plugin stays free, the
business logic stays proprietary.
@@ -22,9 +28,12 @@ Two editions, not three — the prediction layer has not been sold separately si
2026-10-14; it is part of Pro.
- **Community** — the GPL-3.0 foundation, self-hostable: deterministic rule-based
- control, solar surplus, load shedding, REST/MQTT API. No subscription.
+ control, solar surplus, load shedding, [PV production forecast](fonctionnalites/prevision-pv.md)
+ from physical models (beta, displayed, not used to decide), REST/MQTT API. No
+ subscription.
- **Pro** — installed by ETM-Schurig: adds tariff arbitration and the prediction layer
- (*Predict AI*: PV and consumption forecasting, heat-pump thermal inertia). **No
+ (production and consumption forecasts learned from your installation, heat-pump
+ thermal inertia). **No
subscription either**, and everything stays local.
Tariff arbitration and prediction are on the **roadmap**: the Open Core boundary already
diff --git a/docs/faq.md b/docs/faq.md
index d12f330..5fc85ef 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -4,16 +4,21 @@
## ETM PowerSync envoie-t-il mes données dans le cloud ?
-Non. La logique d'optimisation s'exécute en local, sur votre matériel. C'est un choix
-d'architecture, pas une option.
+Non. Le pilotage tourne en local, sur la box, et continue sans internet. Le seul
+composant qui se connecte à internet de lui-même est le plugin météo OpenMeteo : il
+n'envoie que les coordonnées du site (arrondies à environ 1 km), son altitude et
+l'orientation des panneaux. Les mesures, la consommation et le tarif restent chez vous.
+L'accès à distance est désactivé par défaut ; il ne s'ouvre que si vous l'activez
+vous-même dans l'application. C'est un choix d'architecture, pas une option.
## Le projet est-il open source ?
-Le socle (`powersync-core`) et les plugins sont sous GPL-3.0. Le connecteur vers
-l'optimiseur (`optimizer-plugin`) est lui aussi GPL — tout ce qui est lié à nymea l'est.
-En revanche, la **logique métier** d'optimisation (`powersync-optimizer` : arbitrage
-tarifaire, Predict AI) est propriétaire : elle tourne dans un processus séparé, atteint
-via un socket Unix. Cette frontière IPC est le cœur du modèle Open Core — le plugin reste
+Le socle (`powersync-core`) et les plugins sont sous GPL-3.0. Le client de
+l'optimiseur, intégré au moteur d'énergie, est lui aussi GPL — tout ce qui est lié à
+nymea l'est. En revanche, la **logique métier** d'optimisation (arbitrage tarifaire,
+prévisions apprises sur votre installation) est propriétaire : elle tourne dans un
+processus séparé, joint par une interface ouverte et documentée. L'optimisation tourne
+chez vous, sur la box ou sur une machine de votre réseau local. Cette frontière IPC est le cœur du modèle Open Core — le plugin reste
libre, la logique métier reste propriétaire.
## Community et Pro, quelle différence ?
@@ -22,10 +27,12 @@ Deux éditions, pas trois — la couche prédictive n'est plus vendue à part de
2026-10-14, elle fait partie de Pro.
- **Community** — le socle GPL-3.0, auto-hébergeable : pilotage à règles déterministes,
- surplus solaire, délestage, API REST/MQTT. Sans abonnement.
+ surplus solaire, délestage, [prévision de production PV](fonctionnalites/prevision-pv.md)
+ calculée par des modèles physiques (en beta, affichée, pas utilisée pour décider),
+ API REST/MQTT. Sans abonnement.
- **Pro** — installée par ETM-Schurig : ajoute l'arbitrage tarifaire et la couche
- prédictive (*Predict AI* : prévision PV et de consommation, inertie thermique de la
- PAC). **Sans abonnement non plus**, et tout reste local.
+ prédictive (prévisions de production et de consommation apprises sur votre
+ installation, inertie thermique de la PAC). **Sans abonnement non plus**, et tout reste local.
L'arbitrage tarifaire et la prédiction sont en **roadmap** : la frontière Open Core
existe déjà, les fonctions qu'elle sépare ne sont pas toutes livrées. Voir
diff --git a/docs/fonctionnalites/index.de.md b/docs/fonctionnalites/index.de.md
index dd6ae3b..9e8be21 100644
--- a/docs/fonctionnalites/index.de.md
+++ b/docs/fonctionnalites/index.de.md
@@ -7,6 +7,9 @@
| [Solarüberschuss](surplus-solaire.md) | IN ARBEIT |
| [Lastabwurf / Lastmanagement](delestage.md) | IN ARBEIT |
| [Speicherverwaltung](gestion-batterie.md) | IN ARBEIT |
+| [PV-Erzeugungsprognose](prevision-pv.md) und Stundenwetter | BETA |
+| [Eingegebener Tarif](../tarifs.md) (Einheitstarif, Hoch-/Niedertarif) | BETA |
+| Prognostizierter Grundverbrauch | IN VORBEREITUNG |
| [JSON-RPC-API](../integrations/jsonrpc-api.md) / [MQTT](../integrations/mqtt.md) | VERFÜGBAR |
| Dynamische Tarife (DE) — §14a EnWG, EPEX Spot | ROADMAP |
| CO₂-Optimierung (SMARD) | ROADMAP |
diff --git a/docs/fonctionnalites/index.en.md b/docs/fonctionnalites/index.en.md
index f73b365..20bd031 100644
--- a/docs/fonctionnalites/index.en.md
+++ b/docs/fonctionnalites/index.en.md
@@ -7,6 +7,9 @@ An overview of the HEMS features and their real state.
| [Solar surplus](surplus-solaire.md) | IN PROGRESS |
| [Load shedding / management](delestage.md) | IN PROGRESS |
| [Battery management](gestion-batterie.md) | IN PROGRESS |
+| [PV production forecast](prevision-pv.md) and hourly weather | BETA |
+| [Entered tariff](../tarifs.md) (single rate, peak/off-peak) | BETA |
+| Baseload forecast | COMING |
| [JSON-RPC API](../integrations/jsonrpc-api.md) / [MQTT](../integrations/mqtt.md) | AVAILABLE |
| Dynamic tariffs — FR: Tempo, off-peak · DE: §14a EnWG, EPEX spot | ROADMAP |
| CO₂ optimisation — RTE (FR) / SMARD (DE) | ROADMAP |
diff --git a/docs/fonctionnalites/index.md b/docs/fonctionnalites/index.md
index 3b32dfe..60c143a 100644
--- a/docs/fonctionnalites/index.md
+++ b/docs/fonctionnalites/index.md
@@ -7,6 +7,9 @@ Vue d'ensemble des fonctions du HEMS et de leur état réel.
| [Surplus solaire](surplus-solaire.md) | EN COURS |
| [Délestage / Load management](delestage.md) | EN COURS |
| [Gestion batterie](gestion-batterie.md) | EN COURS |
+| [Prévision de production PV](prevision-pv.md) et météo horaire | BETA |
+| [Tarif saisi](../tarifs.md) (unique, heures pleines/creuses) | BETA |
+| Consommation de base prévue | À VENIR |
| [API JsonRPC](../integrations/jsonrpc-api.md) / [MQTT](../integrations/mqtt.md) | DISPONIBLE |
| Tarifs dynamiques (FR) | ROADMAP |
| Optimisation CO₂ (RTE) | ROADMAP |
diff --git a/docs/fonctionnalites/prevision-pv.de.md b/docs/fonctionnalites/prevision-pv.de.md
new file mode 100644
index 0000000..53d51a0
--- /dev/null
+++ b/docs/fonctionnalites/prevision-pv.de.md
@@ -0,0 +1,108 @@
+# PV-Erzeugungsprognose
+
+BETA
+
+Die Box prognostiziert die Erzeugung Ihrer Module Stunde für Stunde bis zum Ende des
+Folgetags und zeigt sie in der App neben der gemessenen Erzeugung an. Die Funktion
+gehört zur **Community**-Version (GPL-3.0): Sie beruht auf der Energie-Engine und dem
+Plugin [OpenMeteo](../appareils/tarifs/openmeteo.md), ohne jeden ETM-Dienst.
+
+!!! info "Beta"
+ Ausgeliefert und auf unserer Testanlage in Betrieb, aber noch in keinem Kanal des
+ APT-Repositorys veröffentlicht.
+
+## Was Sie in der App sehen
+
+- **Die Kurve der erwarteten Erzeugung**, Stunde für Stunde bis zum Ende des Folgetags,
+ über der gemessenen Erzeugung.
+- **Eine Wetterspanne** um diese Kurve (siehe unten).
+- **Das Wetter Stunde für Stunde** auf der Karte „Journée“: ein Symbol (Sonne, Wolken,
+ Regen …), Tag oder Nacht und die Temperatur.
+
+## Wie die Prognose berechnet wird
+
+Für jede angegebene PV-Fläche – Neigung, Ausrichtung, Spitzenleistung (kWp) und
+Systemwirkungsgrad – rechnet die Box die von Open-Meteo prognostizierte Einstrahlung in
+Leistung um. Anschließend addiert sie alle Flächen des Standorts.
+
+Zwei Korrekturen werden angewendet, beide **deterministisch**: öffentliche physikalische
+Modelle, parametriert mit Datenblattwerten, ganz ohne Lernen.
+
+- **Temperaturkorrektur**: Ein warmes Modul erzeugt weniger. Die Box schätzt das aus der
+ prognostizierten Temperatur, der NOCT und dem Temperaturkoeffizienten der Module.
+- **Wechselrichtergrenze**: Die Summe der Flächen überschreitet nie die maximale
+ AC-Leistung des Wechselrichters, sofern sie angegeben ist.
+
+Die Prognose wird bei jeder neuen Veröffentlichung der Wettermodelle neu berechnet,
+höchstens einmal pro Stunde.
+
+### Eine Prognose – und eine optimistische Obergrenze
+
+Was die Box anzeigt, ist eine **Prognose**, keine Messung. Sie ist zudem eine
+**optimistische Obergrenze**: Verschattung (Bäume, Schornstein, Nachbargebäude) und
+Verschmutzung der Module werden nicht modelliert. Eine tatsächliche Erzeugung unter der
+Kurve ist daher normal und kein Hinweis auf einen Defekt.
+
+### Eine Stunde ohne Daten ist eine Lücke, niemals eine Null
+
+Fehlt eine Stunde (Internet unterbrochen, Wetterdienst nicht erreichbar), wird die Kurve
+unterbrochen. Die Box schreibt dort nie „0“: Eine Null würde sich lesen wie „keine Sonne
+erwartet“.
+
+## Die Wetterspanne
+
+Um die Kurve zeichnet die App ein Band:
+**Prognose × (1 ± Streuung der Modelle des Tages)**. Die Streuung misst, wie stark
+mehrere Wettermodelle für den Tag auseinandergehen.
+
+Dieses Band beschreibt **das Wetter**, und nur das Wetter. Über die Genauigkeit der
+Erzeugungsprognose sagt es nichts: Verschattung und Verschmutzung sind darin nicht
+enthalten. Bei stabilem Sonnenwetter ist es schmal, während die Abweichung durch diese
+Faktoren gerade dann am größten ist. Es ist also weder ein „erwarteter Fehler“ noch ein
+„Konfidenzintervall“.
+
+## Inbetriebnahme
+
+1. Installieren Sie das OpenMeteo-Plugin und legen Sie den **Standort** und seine
+ **PV-Flächen** an – siehe [OpenMeteo](../appareils/tarifs/openmeteo.md).
+2. **Bestimmen Sie den Prognose-Standort** in der App. Solange keiner bestimmt ist,
+ zeigt die Prognosekarte einen Hinweis und schlägt die verfügbaren Standorte vor.
+ Alle Flächen des bestimmten Standorts werden addiert.
+3. Optional: Tragen Sie die **Wechselrichtergrenze** ein (maximale AC-Leistung in W).
+ Ohne sie wird keine Grenze angewendet.
+
+## Was die Prognose nicht tut
+
+Das ist die zentrale Regel der Community-Version: **Ohne Optimierer wird regelbasiert
+gesteuert** (Solarüberschuss, Lastabwurf, Prioritäten). Die PV-Prognose, der
+[eingegebene Tarif](../tarifs.md) und der Grundverbrauch werden **angezeigt** und
+**lokal aufgezeichnet**, aber nie für Entscheidungen verwendet. Ein automatischer Test
+prüft das: Die Engine trifft mit und ohne Prognose, Tarif und Verbrauchsprofil dieselben
+Entscheidungen.
+
+Die lokale Aufzeichnung dient dazu, die Genauigkeit der Prognosen über die Zeit zu
+messen. Die Validierung an einer realen Anlage läuft; vor ihrem Abschluss werden keine
+Genauigkeitszahlen veröffentlicht.
+
+## Prognostizierter Grundverbrauch IN VORBEREITUNG
+
+Die Box wird aus ihren eigenen Messungen ein Verbrauchsprofil des Haushalts berechnen,
+ohne die gesteuerten Lasten: einen Median je Tagesstunde, getrennt nach Werktagen und
+Wochenende. Ein Profil entsteht erst nach mindestens **7 Tagen** Messung. Bis dahin wird
+nichts angezeigt: eine Lücke, niemals eine Null.
+
+## Ihre Daten
+
+Nur das OpenMeteo-Plugin verbindet sich mit dem Internet. Es sendet ausschließlich die
+**Koordinaten des Standorts** (auf etwa 1 km gerundet), seine **Höhe**, sofern
+angegeben, und die **Ausrichtung der Module** (Neigung, Azimut). Messwerte,
+aufgezeichnete Prognosen, Tarif und Verbrauch bleiben auf der Box. Der Fernzugriff ist
+standardmäßig deaktiviert: Er wird nur geöffnet, wenn Sie ihn selbst in der App
+aktivieren.
+
+## Und ein Optimierer?
+
+Die Architektur sieht eine **offene, dokumentierte Schnittstelle** zu einem externen
+Optimierer vor, der diese Prognosen für die Planung nutzen könnte. Die Optimierung liefe
+bei Ihnen, auf der Box oder auf einem Rechner in Ihrem lokalen Netz. Diese Anbindung ist
+in Entwicklung; die Community-Version funktioniert vollständig ohne sie.
diff --git a/docs/fonctionnalites/prevision-pv.en.md b/docs/fonctionnalites/prevision-pv.en.md
new file mode 100644
index 0000000..cb03b8e
--- /dev/null
+++ b/docs/fonctionnalites/prevision-pv.en.md
@@ -0,0 +1,103 @@
+# PV production forecast
+
+BETA
+
+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 optimiser, 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 COMING
+
+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), 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 optimiser?
+
+The architecture provides an **open, documented interface** to an external optimiser,
+which could use these forecasts to plan. Optimisation would run at your place, on the
+box or on a machine in your local network. This connection is under development; the
+Community edition works entirely without it.
diff --git a/docs/fonctionnalites/prevision-pv.md b/docs/fonctionnalites/prevision-pv.md
new file mode 100644
index 0000000..afb2fd0
--- /dev/null
+++ b/docs/fonctionnalites/prevision-pv.md
@@ -0,0 +1,106 @@
+# Prévision de production PV
+
+BETA
+
+La box prévoit la production de vos panneaux, heure par heure, jusqu'à la fin du
+lendemain, et l'affiche dans l'application à côté de la production mesurée. C'est une
+fonction de la version **Community** (GPL-3.0) : elle repose sur le moteur d'énergie et
+sur le plugin [OpenMeteo](../appareils/tarifs/openmeteo.md), sans aucun service ETM.
+
+!!! info "Beta"
+ Livrée et en fonctionnement sur notre installation de test, elle n'est pas encore
+ publiée dans un canal du dépôt APT.
+
+## Ce que vous voyez dans l'application
+
+- **La courbe de production prévue**, heure par heure jusqu'à la fin du lendemain,
+ superposée à la production mesurée.
+- **Une fourchette météo** autour de cette courbe (voir plus bas).
+- **La météo heure par heure** sur la carte « Journée » : une icône (soleil, nuages,
+ pluie…), le jour ou la nuit, et la température.
+
+## Comment la prévision est calculée
+
+Pour chaque plan PV déclaré — inclinaison, orientation, puissance crête (kWc) et
+rendement du système —, la box convertit l'irradiance prévue par Open-Meteo en
+puissance. Elle additionne ensuite tous les plans du site.
+
+Deux corrections s'appliquent, toutes deux **déterministes** : des modèles physiques
+publics, paramétrés par les fiches techniques, sans aucun apprentissage.
+
+- **Correction de température** : un module chaud produit moins. La box l'estime à partir
+ de la température prévue, de la NOCT et du coefficient de température des modules.
+- **Plafond onduleur** : la somme des plans ne dépasse jamais la puissance AC maximale de
+ l'onduleur, si elle a été renseignée.
+
+La prévision est recalculée à chaque nouvelle publication des modèles météo, soit au plus
+une fois par heure.
+
+### Une prévision, et un plafond optimiste
+
+Ce que la box affiche est une **prévision**, pas une mesure. C'est aussi un **plafond
+optimiste** : l'ombrage (arbres, cheminée, bâtiments voisins) et l'encrassement des
+panneaux ne sont pas modélisés. Une production réelle sous la courbe est donc normale et
+ne signale pas une panne.
+
+### Une heure sans donnée est un trou, jamais un zéro
+
+Si une heure manque (internet coupé, service météo indisponible), la courbe s'interrompt.
+La box n'écrit jamais « 0 » à la place : un zéro se lirait comme « pas de soleil prévu ».
+
+## La fourchette météo
+
+Autour de la courbe, l'application trace une bande :
+**prévu × (1 ± dispersion des modèles du jour)**. La dispersion mesure à quel point
+plusieurs modèles météo divergent pour la journée.
+
+Cette bande qualifie **la météo**, et seulement la météo. Elle ne dit rien de la
+précision de la prévision de production : l'ombrage et l'encrassement n'y figurent pas.
+Par grand beau temps stable, elle est étroite alors que l'écart dû à ces facteurs est le
+plus fort. Ce n'est donc ni une « erreur attendue » ni un « intervalle de confiance ».
+
+## Mise en service
+
+1. Installez le plugin OpenMeteo et créez le **site** et ses **plans PV** — voir la
+ [fiche OpenMeteo](../appareils/tarifs/openmeteo.md).
+2. **Désignez le site de prévision** dans l'application. Tant qu'aucun site n'est
+ désigné, la carte de prévision affiche « Aucun site de prévision désigné » et
+ propose les sites disponibles. Tous les plans du site désigné sont additionnés.
+3. Facultatif : renseignez le **plafond onduleur** (puissance AC maximale, en W).
+ Sans lui, aucun plafond n'est appliqué.
+
+## Ce que la prévision ne fait pas
+
+C'est la règle centrale de la version Community : **sans optimiseur, le pilotage se fait
+par règles** (surplus solaire, délestage, priorités). La prévision PV, le
+[tarif saisi](../tarifs.md) et la consommation de base sont **affichés** et
+**enregistrés localement**, mais ils ne servent jamais à décider. Un test automatique
+le vérifie : le moteur prend les mêmes décisions avec ou sans prévision, tarif et profil
+de consommation.
+
+L'enregistrement local sert à mesurer la précision des prévisions dans le temps. La
+validation sur une installation réelle est en cours ; aucun chiffre de précision n'est
+publié avant qu'elle soit terminée.
+
+## Consommation de base prévue À VENIR
+
+La box calculera un profil de consommation du foyer, hors charges pilotées, à partir de
+ses propres mesures : une médiane par heure de la journée, séparée entre jours ouvrés
+et week-end. Il faut au moins **7 jours** de mesures avant qu'un profil existe.
+D'ici là, rien n'est affiché : une absence, jamais un zéro.
+
+## Vos données
+
+Seul le plugin OpenMeteo se connecte à internet. Il n'envoie que les **coordonnées du
+site** (arrondies à environ 1 km), son **altitude** si elle est renseignée, et
+l'**orientation des panneaux** (inclinaison, azimut). Les mesures, les prévisions
+enregistrées, le tarif et la consommation restent sur la box. L'accès à distance est
+désactivé par défaut : il ne s'ouvre que si vous l'activez vous-même dans
+l'application.
+
+## Et un optimiseur ?
+
+L'architecture prévoit une **interface ouverte et documentée** vers un optimiseur externe,
+qui pourrait utiliser ces prévisions pour planifier. L'optimisation tournerait chez vous,
+sur la box ou sur une machine de votre réseau local. Cette connexion est en cours de
+développement ; la version Community fonctionne entièrement sans elle.
diff --git a/docs/index.de.md b/docs/index.de.md
index d3c9cc6..457cb7f 100644
--- a/docs/index.de.md
+++ b/docs/index.de.md
@@ -2,7 +2,7 @@
**Lokales HEMS für PV-, Wärmepumpen- und Ladeinfrastruktur.** ETM PowerSync koordiniert
Photovoltaik, Speicher, Wärmepumpe und Wallbox unter einer einzigen Optimierungslogik —
-ausgeführt bei Ihnen, auf Ihrer Hardware, ohne erzwungene Cloud-Abhängigkeit.
+ausgeführt bei Ihnen, auf Ihrer Hardware, ohne Cloud-Abhängigkeit.
Aufgebaut auf [nymea.io](https://nymea.io), nach einer **Open-Core**-Architektur: eine
freie Basis (GPL-3.0) und eine proprietäre Optimierungsschicht.
diff --git a/docs/index.en.md b/docs/index.en.md
index 0a5cf42..a075177 100644
--- a/docs/index.en.md
+++ b/docs/index.en.md
@@ -2,7 +2,7 @@
**Local HEMS for solar PV, heat pump and EV charging installations.** ETM PowerSync
coordinates photovoltaics, battery, heat pump and EV charger under a single optimisation
-logic — running at your site, on your hardware, with no mandatory cloud dependency.
+logic — running at your site, on your hardware, with no cloud dependency.
Built on [nymea.io](https://nymea.io), following an **Open Core** architecture: a free
foundation (GPL-3.0) and a proprietary optimisation layer.
diff --git a/docs/index.md b/docs/index.md
index 2713b90..8c41322 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -2,7 +2,7 @@
**HEMS local pour installations PV, PAC et IRVE.** ETM PowerSync coordonne photovoltaïque,
batterie, pompe à chaleur et borne de recharge sous une seule logique d'optimisation —
-exécutée chez vous, sur votre matériel, sans dépendance cloud obligatoire.
+exécutée chez vous, sur votre matériel, sans dépendance au cloud.
Bâti sur [nymea.io](https://nymea.io), selon une architecture **Open Core** : un socle
libre (GPL-3.0) et une couche d'optimisation propriétaire.
diff --git a/docs/tarifs.de.md b/docs/tarifs.de.md
index 6d89257..2755974 100644
--- a/docs/tarifs.de.md
+++ b/docs/tarifs.de.md
@@ -1,4 +1,26 @@
-# Tarife [Roadmap]{.badge .road}
+# Tarife
+
+## Vom Installateur eingegebener Tarif BETA
+
+Der Installateur gibt den Strombezugstarif des Standorts ein; die Box speichert ihn.
+
+- **Einheitstarif**: ein Preis für den ganzen Tag.
+- **Hoch-/Niedertarif**: ein Preis je Zeitzone. Die Engine akzeptiert mehrere
+ Zeitfenster je Zone (zum Beispiel Niedertarif nachts und am frühen Nachmittag); die
+ Fenster müssen die 24 Stunden lückenlos und ohne Überschneidung abdecken.
+- Preise in **ct/kWh brutto**, der vollständig bezahlte Preis. Ein Einspeisetarif kann
+ hinzukommen (0, wenn nicht angegeben).
+- Die Uhrzeiten sind die der **Box** (ihre Zeitzone), nicht die des Telefons.
+
+In der App erfasst der Tarifbildschirm einen Einheitstarif oder Hoch-/Niedertarif mit
+einem Niedertarif-Fenster. Ein Tarif mit mehreren Fenstern wird dort nur angezeigt.
+
+!!! note "Bereitgestellt, nicht für Entscheidungen verwendet"
+ Die Engine **stellt** den Tarif **bereit** (Anzeige, lokale Aufzeichnung); sie
+ entscheidet nicht damit. Ohne Optimierer bleibt die Steuerung regelbasiert – siehe
+ [PV-Erzeugungsprognose](fonctionnalites/prevision-pv.md#was-die-prognose-nicht-tut).
+
+## Dynamische Tarife ROADMAP
Abwägung nach den **deutschen** Tarifsignalen: variable Tarife, Spot-Angebote (EPEX),
netzorientierte Steuerung steuerbarer Verbrauchseinrichtungen nach **§14a EnWG**.
diff --git a/docs/tarifs.en.md b/docs/tarifs.en.md
index 8d002ab..dca4860 100644
--- a/docs/tarifs.en.md
+++ b/docs/tarifs.en.md
@@ -1,4 +1,26 @@
-# Tariffs [Roadmap]{.badge .road}
+# Tariffs
+
+## Tariff entered by the installer BETA
+
+The installer enters the site's electricity purchase tariff; the box stores it.
+
+- **Single rate**: one price, all day.
+- **Peak / off-peak**: one price per period. The engine accepts several time ranges per
+ period (for example off-peak at night and in the early afternoon); the ranges must
+ cover the 24 hours with no gap and no overlap.
+- Prices in **euro cents per kWh, all taxes included** — the full price paid. A
+ feed-in tariff can be added (0 if not entered).
+- Times are those of the **box** (its time zone), not of the phone.
+
+In the app, the Tariff screen enters a single rate or peak/off-peak with one off-peak
+range. A tariff with several ranges is shown there read-only.
+
+!!! note "Exposed, not used to decide"
+ The engine **exposes** the tariff (display, local recording); it does not decide
+ with it. Without an optimiser, control stays rule-based — see
+ [PV production forecast](fonctionnalites/prevision-pv.md#what-the-forecast-does-not-do).
+
+## Dynamic tariffs ROADMAP
Arbitration on national tariff signals — **France**: Tempo (blue/white/red), off-peak
and peak hours, dynamic offers; CO₂ optimisation from the RTE eco2mix signal.
diff --git a/docs/tarifs.md b/docs/tarifs.md
index 8b1d815..baa3c5e 100644
--- a/docs/tarifs.md
+++ b/docs/tarifs.md
@@ -1,4 +1,27 @@
-# Tarifs [Roadmap]{.badge .road}
+# Tarifs
+
+## Tarif saisi par l'installateur BETA
+
+L'installateur saisit le tarif d'achat d'électricité du site ; la box le conserve.
+
+- **Tarif unique** : un seul prix, toute la journée.
+- **Heures pleines / heures creuses** : un prix par période. Le moteur accepte plusieurs
+ plages par période (par exemple des heures creuses la nuit et en début
+ d'après-midi) ; les plages doivent couvrir les 24 heures sans trou ni chevauchement.
+- Prix en **c€/kWh TTC**, le prix complet payé. Un tarif de revente peut s'y ajouter
+ (0 s'il n'est pas saisi).
+- Les heures sont celles de la **box** (son fuseau horaire), pas celles du téléphone.
+
+Dans l'application, l'écran Tarif saisit un tarif unique ou des heures pleines/creuses
+avec une plage d'heures creuses. Un tarif à plusieurs plages s'y affiche en lecture
+seule.
+
+!!! note "Exposé, pas utilisé pour décider"
+ Le moteur **expose** le tarif (affichage, enregistrement local) ; il ne décide pas
+ avec. Sans optimiseur, le pilotage reste à règles — voir
+ [Prévision de production PV](fonctionnalites/prevision-pv.md#ce-que-la-prevision-ne-fait-pas).
+
+## Tarifs dynamiques ROADMAP
Arbitrage sur les signaux tarifaires **français** : Tempo (bleu/blanc/rouge), heures
creuses/pleines, offres dynamiques. Optimisation CO₂ via le signal RTE eco2mix.
diff --git a/mkdocs.yml b/mkdocs.yml
index c3f32e7..c0ce722 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -95,6 +95,7 @@ plugins:
Surplus solaire: Solarüberschuss
Délestage: Lastabwurf
Gestion batterie: Speicherverwaltung
+ Prévision PV: PV-Prognose
Tarifs dynamiques: Dynamische Tarife
API JsonRPC: JSON-RPC-API
Référence API: API-Referenz
@@ -132,6 +133,7 @@ plugins:
Surplus solaire: Solar surplus
Délestage: Load shedding
Gestion batterie: Battery management
+ Prévision PV: PV forecast
Tarifs dynamiques: Dynamic tariffs
API JsonRPC: JSON-RPC API
Référence API: API reference
@@ -167,6 +169,7 @@ nav:
- Surplus solaire: fonctionnalites/surplus-solaire.md
- Délestage: fonctionnalites/delestage.md
- Gestion batterie: fonctionnalites/gestion-batterie.md
+ - Prévision PV: fonctionnalites/prevision-pv.md
- Tarifs dynamiques: tarifs.md
- Référence:
- reference.md