GribStream

Prévision de production solaire

Ce tableau de bord estime la production horaire de panneaux solaires à partir du rayonnement à ondes courtes et de la température de l'air fournis par les modèles météorologiques. Il démarre avec une configuration résidentielle typique pour éviter un formulaire complet de conception photovoltaïque : Denver, une installation PV de 6 kW DC, une approximation à inclinaison fixe, 14% de pertes PV totales, 96% de rendement de l'onduleur et un rapport DC/AC de 1.2.

La prévision utilise GFS, HRRR ou NBM via /api/v2/[dataset]/timeseries. L'entrée météorologique principale est DSWRF en surface, le champ de rayonnement descendant à ondes courtes de la NOAA, combiné à la température à 2 m pour une correction simple liée à la température des panneaux. L'horizon reste limité à 24 ou 36 heures afin que les lignes retournées restent horaires.

Ce que font les contrôles

Comment lire les panneaux

Le calcul est volontairement léger. Il aide à comparer des profils de production pilotés par les conditions météorologiques, à évaluer rapidement une installation proposée et à montrer comment les expressions GribStream transforment des champs de prévision en métriques utilisables par une application. Ce n'est pas un modèle photovoltaïque suffisant pour une décision financière et cela ne remplace pas PVWatts, SAM, la modélisation de l'ombrage du site, les mesures d'encrassement des panneaux ni un modèle professionnel d'irradiance dans le plan des modules.

Le contrôle de géométrie des modules est volontairement conservateur. Un vrai calcul d'inclinaison et d'azimut nécessite position solaire, irradiance normale directe, irradiance horizontale diffuse, albédo, orientation des modules, géométrie des rangées et ombrage. Ici, le tableau de bord ne demande que DSWRF et la température à 2 m depuis GribStream ; la géométrie est donc exposée comme un multiplicateur explicite au lieu de cacher une fausse précision derrière un champ d'inclinaison.

Calculs et constantes

Le tableau de bord calcule tous les champs dérivés avec GribStream expressions. Avec les contrôles par défaut, les équations sont :

  1. temp_c = temp_k - 273.15
  2. poa_wm2 = ghi_wm2 * 1.0800
  3. cell_temp_c = temp_c + (poa_wm2 / 800.0) * 25.0000
  4. temperature_factor = max(0, 1 + (-0.3500 / 100) * (cell_temp_c - 25.0))
  5. loss_factor = max(0, 1 - 14.0000 / 100)
  6. dc_power_kw = 6.0000 * poa_wm2 / 1000.0 * temperature_factor * loss_factor
  7. ac_limit_kw = 6.0000 / 1.2000
  8. ac_power_kw = min(dc_power_kw * 96.0000 / 100, ac_limit_kw)
  9. hourly_energy_kwh = ac_power_kw, car le tableau de bord limite la requête à des lignes horaires.

Les constantes les plus importantes sont :

Ces constantes rendent la prévision explicable et facile à modifier, mais ne remplacent pas une fiche technique de module, un albédo mesuré, des mesures d'encrassement, une géométrie d'ombrage ou une simulation complète PVWatts/SAM.

Requête GribStream représentative

Cet exemple utilise la configuration par défaut pour Denver avec GFS : 6 kW avec approximation à inclinaison fixe. Le tableau de bord remplit les valeurs numériques depuis les variables Grafana et calcule les estimations PV dans un seul appel GribStream /timeseries.

curl -X POST 'https://gribstream.com/api/v2/gfs/timeseries' \
  -H 'Content-Type: application/json' \
  -H 'Accept: text/csv' \
  -H 'Authorization: Bearer [API_TOKEN]' \
  -d '{
    "fromTime": "2026-05-03T12:00:00Z",
    "untilTime": "2026-05-05T00:00:00Z",
    "minLeadTime": "0h",
    "maxLeadTime": "36h",
    "coordinates": [
      { "lat": 39.7392, "lon": -104.9903, "name": "Denver, CO" }
    ],
    "variables": [
      { "name": "DSWRF", "level": "surface", "alias": "ghi_wm2" },
      { "name": "TMP", "level": "2 m above ground", "alias": "temp_k" }
    ],
    "expressions": [
      { "expression": "temp_k - 273.15", "alias": "temp_c" },
      { "expression": "ghi_wm2 * 1.0800", "alias": "poa_wm2" },
      { "expression": "temp_c + (poa_wm2 / 800.0) * 25.0000", "alias": "cell_temp_c" },
      { "expression": "func.Max(0.0, 1 + (-0.3500 / 100.0) * (cell_temp_c - 25.0))", "alias": "temperature_factor" },
      { "expression": "func.Max(0.0, 1 - 14.0000 / 100.0)", "alias": "loss_factor" },
      { "expression": "6.0000 * poa_wm2 / 1000.0 * temperature_factor * loss_factor", "alias": "dc_power_kw" },
      { "expression": "6.0000 / 1.2000", "alias": "ac_limit_kw" },
      { "expression": "func.Min(dc_power_kw * 96.0000 / 100.0, ac_limit_kw)", "alias": "ac_power_kw" },
      { "expression": "ac_power_kw", "alias": "hourly_energy_kwh" },
      { "expression": "func.Max(0.0, (6.0000 - ac_power_kw) / 6.0000 * 100.0)", "alias": "unused_capacity_pct" }
    ]
  }'

Pourquoi les valeurs par défaut sont raisonnables

Contexte et références : expressions GribStream · inventaire GFS · inventaire HRRR · inventaire NBM · table NOAA GRIB2 du rayonnement à ondes courtes · API PVWatts V8 · définitions d'irradiance SAM · variables Grafana.