# OpenMeteo
TESTING ETM CONSUMER
Obtenir les données météo courantes pour votre site.
Le plugin OpenMeteo fournit à la box les **prévisions météo et solaires** de votre
site : météo du jour et du lendemain, et production photovoltaïque prévue pour chaque
orientation de toiture. Les données viennent du service public
[Open-Meteo](https://open-meteo.com), interrogé directement par la box, **sans compte
ni clé d'API** et sans passer par un service ETM.
Paquet : `powersync-plugin-openmeteo`.
## 1. Ce que le plugin publie
Le plugin crée deux types d'objets :
- un **site** (`Open-Meteo site`) : météo de l'emplacement (température, nuages,
vent, humidité…), irradiance solaire prévue, lever et coucher du soleil, et une
observation satellite de l'heure écoulée ;
- un ou plusieurs **plans PV** (`Open-Meteo PV plane`), rattachés au site : un par
orientation de toiture. Chaque plan publie l'irradiance prévue sur ses panneaux et
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.
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
En mode installateur, ajoutez un appareil **Open-Meteo site** (voir
[Ajouter un appareil](../../installation/application.md)) et renseignez :
| Champ | Contenu |
| --- | --- |
| `Latitude`, `Longitude` | Position du site, en degrés décimaux |
| `Elevation (m, optional)` | Altitude du site en mètres. Facultative : laissée à `0`, Open-Meteo utilise l'altitude de son propre modèle de terrain. À renseigner en montagne ou en vallée encaissée, où la température prévue en dépend. |
Le site n'est pas découvert automatiquement : on le crée à la main, une fois par
emplacement.
## 3. Ajouter les plans PV
Une fois le site créé, ajoutez un appareil **Open-Meteo PV plane** : la découverte
propose un plan pour chaque site existant. Créez **un plan par orientation** — une
toiture est-ouest donne deux plans.
| Champ | Contenu |
| --- | --- |
| `Tilt (deg, 0=horizontal)` | Inclinaison des panneaux, en degrés : `0` = à plat, `90` = vertical |
| `Azimuth (deg geographic, 180=South)` | Orientation, en **convention géographique** : `180` = sud, `90` = est, `270` = ouest |
| `Peak power kWp` | Puissance crête des panneaux de ce plan |
| `Performance ratio (declared, not learned)` | Rendement global de l'installation, **déclaré** par l'installateur (il n'est pas appris par la box). Laissé à `1.0`, la production prévue est surestimée. |
Selon la version du plugin, deux champs issus de la fiche technique des modules
complètent le plan : `Power temperature coefficient (%/K, declared, not learned)`
(par défaut −0,37 %/K) et `NOCT (°C, declared, not learned)` (par défaut 45 °C). Ils servent à corriger la production prévue
quand les modules chauffent.
!!! warning "Attention à l'azimut"
D'autres outils comptent l'azimut à partir du sud (`0` = sud). Ici, `0` est le
**nord** : un azimut de `0` saisi pour une toiture plein sud donne une production
prévue fortement sous-estimée.
## 4. Une prévision, jamais une mesure
Tout ce que publie ce plugin est une **prévision météo** convertie en production, ou
une **observation satellite** datant d'environ une heure. Ce n'est jamais une mesure
de votre installation : la production réelle se lit sur l'onduleur ou le compteur.
C'est pourquoi les grandeurs sont nommées `forecast…` (prévision) ou `observed…`
(observation satellite) : il n'existe pas de `pvPower` dans ce plugin, seulement
`forecastPvPower`.
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, 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
météo elle-même est incertaine. Elle ne dit rien de la justesse de la production
prévue : par grand beau temps stable, elle est faible alors que la surestimation, elle,
est à son maximum.
## 5. Rafraîchissement et coupure internet
Les modèles météo ne publient pas plus souvent que cela : la prévision et
l'observation satellite sont relues **toutes les heures**, la dispersion **toutes les
3 heures**. L'action `Refresh` du site force les trois.
Si Open-Meteo ne répond pas, le plugin réessaie après 5 minutes, puis 10, 20, 40… sans
dépasser le rythme normal de la source, et reprend son rythme dès la première réponse.
Après **3 heures** sans prévision reçue, l'état `Forecast valid` passe à faux.
Une coupure internet ne bloque rien : la box continue de piloter avec ses mesures, la
sécurité reste assurée, et seules les prévisions se dégradent jusqu'au retour de la
connexion.
## 6. Ce qui quitte la box
Pour obtenir ses prévisions, la box envoie à Open-Meteo **uniquement** :
- les coordonnées du site, **arrondies à deux décimales** (environ 1 km) : assez
précises pour la météo, trop floues pour désigner une adresse ;
- l'altitude du site, si vous l'avez renseignée ;
- l'inclinaison et l'azimut de chaque plan PV.
Aucune mesure, aucune consommation et aucune donnée d'usage n'est transmise. La
puissance crête et le rendement restent sur la box : la conversion en production se
fait localement.
## 7. Usage commercial : instance Open-Meteo dédiée
L'API publique d'Open-Meteo est réservée à un **usage non commercial**. Pour un
déploiement commercial, les réglages du plugin permettent de pointer vers une instance
Open-Meteo auto-hébergée (`Base URL (forecast)`, `Base URL (satellite radiation)`,
`Base URL (ensemble spread)`) ou de renseigner une clé pour l'offre commerciale
d'Open-Meteo (`API key (commercial endpoint, optional)`). Sans modification, le plugin
interroge l'API publique.
## 8. Sources des données
Données météo de Météo-France, rayonnement satellite d'EUMETSAT, fournis par
[Open-Meteo](https://open-meteo.com) sous licence CC-BY 4.0.
---
## Référence
!!! info "Libellés de l'application"
Les clés et libellés ci-dessous sont ceux affichés par
l'application, **en anglais**. Ils sont laissés tels quels pour
que vous les retrouviez à l'identique à l'écran.
**Fabricant :** Open-Meteo
**Plugin :** `OpenMeteo`
#### Modèles pris en charge
| Modèle | Rôle | Transport | Ajout | Grandeurs |
| --- | --- | --- | --- | --- |
| **Open-Meteo site** | weather, daylightsensor | — | Manual | 29 |
| **Open-Meteo PV plane** | — | — | Auto-discovery | 15 |
#### Détail par modèle
??? abstract "Open-Meteo site — `openMeteoSite`"
_Réglages :_
| Clé | Libellé | Type | Plage | Défaut | Lecture seule |
| --- | --- | --- | --- | --- | --- |
| `name` | Name | QString | — | — | non |
| `latitude` | Latitude | double | — | `48.9` | non |
| `longitude` | Longitude | double | — | `7.85` | non |
| `elevation` | Elevation (m, optional) | double | — | `0` | non |
_Grandeurs mesurées :_
| Clé | Grandeur | Type | Unité |
| --- | --- | --- | --- |
| `weatherDescription` | Weather description | QString | — |
| `weatherCondition` | Weather condition | QString | — |
| `updateTime` | Last update | int | UnixTime |
| `temperature` | Temperature | double | DegreeCelsius |
| `temperatureMin` | Minimum temperature (today) | double | DegreeCelsius |
| `temperatureMax` | Maximum temperature (today) | double | DegreeCelsius |
| `humidity` | Humidity | int | Percentage |
| `pressure` | Pressure | double | HectoPascal |
| `windSpeed` | Wind speed | double | MeterPerSecond |
| `windDirection` | Wind direction | int | Degree |
| `cloudiness` | Cloudiness | int | Percentage |
| `snowfall` | Snowfall (preceding hour) | double | CentiMeter |
| `forecastGhi` | GHI forecast (W/m²) | double | — |
| `forecastDni` | DNI forecast (W/m²) | double | — |
| `forecastDhi` | DHI forecast (W/m²) | double | — |
| `terrestrialRadiation` | TOA radiation (W/m2) | double | — |
| `forecastGhiSumToday` | GHI sum forecast today (kWh/m²) | double | — |
| `observedGhi` | GHI observed, satellite (W/m²) | double | — |
| `observedClearSkyGhi` | Clear-sky GHI observed, satellite (W/m²) | double | — |
| `observedClearSkyIndex` | Clear-sky index kt (observed) | double | — |
| `sunriseTime` | Sunrise time | int | UnixTime |
| `sunsetTime` | Sunset time | int | UnixTime |
| `daylight` | Daylight | bool | — |
| `forecastModel` | Forecast model that answered | QString | — |
| `forecastValid` | Forecast valid | bool | — |
| `forecastTendencyToday` | Sky tendency forecast today | QString | — |
| `observedTime` | Satellite sample time | int | UnixTime |
| `forecastIssuedAt` | Model run initialisation — revision key | int | UnixTime |
| `forecastAvailableAt` | Model run publication — informational, never a revision key | int | UnixTime |
??? abstract "Open-Meteo PV plane — `openMeteoPvPlane`"
_Réglages :_
| Clé | Libellé | Type | Plage | Défaut | Lecture seule |
| --- | --- | --- | --- | --- | --- |
| `name` | Name | QString | — | — | non |
| `tilt` | Tilt (deg, 0=horizontal) | double | 0–90 | `30` | non |
| `azimuth` | Azimuth (deg geographic, 180=South) | double | 0–360 | `180` | non |
| `kwp` | Peak power kWp | double | — | `0` | non |
| `performanceRatio` | Performance ratio (declared, not learned) | double | 0.1–1.0 | `1.0` | non |
_Grandeurs mesurées :_
| Clé | Grandeur | Type | Unité |
| --- | --- | --- | --- |
| `forecastGtiSource` | GTI forecast, source quantity (W/m²) | double | — |
| `updateTime` | Last update | int | UnixTime |
| `forecastPvPower` | PV power forecast | double | Watt |
| `forecastEnergyNext3h` | PV energy forecast, next 3 h (rolling, may cross midnight) | double | KiloWattHour |
| `forecastEnergyNext6h` | PV energy forecast, next 6 h (rolling, may cross midnight) | double | KiloWattHour |
| `forecastEnergyNext12h` | PV energy forecast, next 12 h (rolling, may cross midnight) | double | KiloWattHour |
| `forecastEnergyRestOfDay` | PV energy forecast, now until sunset | double | KiloWattHour |
| `forecastEnergyTomorrow` | PV energy forecast, tomorrow | double | KiloWattHour |
| `forecastPeakTime` | Forecast peak irradiance time today | int | UnixTime |
| `observedGti` | GTI observed, satellite (W/m²) | double | — |
| `observedGtiTime` | Satellite sample time | int | UnixTime |
| `forecastWeatherSpreadTodayPercent` | GTI weather spread today — qualifies weather only, not PV accuracy | double | Percentage |
| `forecastWeatherSpreadTomorrowPercent` | GTI weather spread tomorrow — qualifies weather only, not PV accuracy | double | Percentage |
| `forecastSpreadModel` | Ensemble model used for spread | QString | — |
| `forecastCurveTransport` | Forecast curve — transport channel, not a value | QVariantMap | — |