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 COMMUNITY + +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 COMMUNITY + +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 COMMUNITY + +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