# Standorte & Solarflächen

Ein **Standort (Site)** beschreibt eine PV-Anlage einmal vollständig. Danach fragen Sie
Prognosen und historische Daten nur noch über die `site_id` ab — ohne die Konfiguration jedes
Mal mitzuschicken.

:::tip
Diese Seite erklärt das **Datenmodell**. Die konkreten Endpunkte (Anlegen, Aktualisieren,
Löschen, Abrufen) finden Sie in der [API-Referenz](/api). Programmatische Verwaltung beschreibt
die [Sites API](/de/v2/enterprise/sites-api).
:::

## Aufbau eines Standorts

Ein Standort besteht aus drei Teilen:

1. **Lage** — `latitude`, `longitude` (Pflicht). `elevation`, `timezone` und der Geländehorizont
   werden automatisch ermittelt.
2. **Strings** — eine Liste von PV-Strings (Teilanlagen) mit eigener Geometrie.
3. **Config** — optionale, anlagenweite Feinkonfiguration. Nur explizit gesetzte Werte werden
   gespeichert; alles andere folgt den aktuellen Systemstandards.

```json title="Standort anlegen (Body)"
{
  "name": "Dach Süd",
  "latitude": 48.8566,
  "longitude": 2.3522,
  "strings": [
    {
      "slope": 30,
      "orientation": 180,
      "power_kw": 8
    },
    {
      "slope": 30,
      "orientation": 90,
      "power_kw": 4
    }
  ],
  "config": {
    "modules": {
      "technology": "topcon"
    },
    "tracking": {
      "type": "fixed"
    }
  }
}
```

## PV-Strings

Jeder String ist eine eigenständige Teilanlage. Der Standort summiert die Leistung aller Strings. Beim Anlegen einer
Site wird automatisch ein Standardstring (10kWp, 180° Süd, 30° Neigung) hinterlegt, den Sie jederzeit bearbeiten können.

| Feld                 | Bedeutung                                                                        |
|----------------------|----------------------------------------------------------------------------------|
| `id`                 | Stabile String-ID (z. B. `str_9f3a1c08`). Vom Server vergeben, schreibgeschützt. |
| `slope`              | Modulneigung in Grad (0 = horizontal, 90 = senkrecht).                           |
| `orientation`        | Azimut in Grad (0 = N, 90 = O, 180 = S, 270 = W).                                |
| `power_kw`           | Peak-Leistung des Strings in kW.                                                 |
| `gcr`                | Ground Coverage Ratio für Reihenverschattung (optional).                         |
| `near_field_shading` | Nahfeld-Verschattung des Strings (optional).                                     |

:::note
Jeder String erhält eine **stabile `id`** (z. B. `str_9f3a1c08`), die der Server vergibt und mit der
Site zurückgibt. Sie ist der Verknüpfungsschlüssel für String-Daten — der `strings`-Block der
Prognose/Historie führt sie als `string_id`, und Messwert-Uploads werden darüber adressiert.

Die `id` ist **schreibgeschützt**: beim Anlegen wird sie ignoriert. Bei einem PATCH der `strings`
(der das gesamte Array ersetzt) **geben Sie die `id` jedes Strings mit zurück, um ihn zu behalten** —
samt der daran hängenden Daten, z. B. Messwerte. Ein String ohne mitgesendete `id` gilt als
entfernt; einer ganz ohne `id` als neu. Strings tragen weiterhin einen positionsbasierten
`string_index`; lesen Sie Standort und Prognose daher vom selben Zeitpunkt, damit die Reihenfolge
konsistent bleibt.
:::

## Konfiguration (Config)

Die anlagenweite Config ist in Gruppen organisiert. Alle Felder sind optional — fehlt eine
Gruppe, gelten die Systemstandards.

| Gruppe     | Inhalt                                                                                                  |
|------------|---------------------------------------------------------------------------------------------------------|
| `modules`  | Modultechnik (`monosi`, `multisi`, `perc`, `topcon`, `cdte`), Temperaturkoeffizient, Installationsjahr. |
| `mounting` | Montageart (`open`, `mix`, `isol`) und Höhe über Grund.                                                 |
| `inverter` | Wechselrichter-Clipping (max/min in % der DC-Nennleistung).                                             |
| `losses`   | Verluste & Gewinne: Kabel, Konversion, Albedo, Schnee-Abrutschen, Diffusmodell.                         |
| `shading`  | Geländehorizont nutzen (`use_terrain_horizon`) und Himmelshindernisse (`sky_obstruction`).              |
| `tracking` | Tracker-Typ (`fixed`, `single_axis`, `dual_axis`) und Achsenparameter.                                  |

:::note
**Sparse Storage:** Es werden nur die Werte gespeichert, die Sie explizit setzen. Verbessern wir
einen Standard global (z. B. ein neues Einstrahlungsmodell), profitieren bestehende Standorte
automatisch.
:::

Die genauen Wertebereiche und Defaults jeder Gruppe stehen in der [API-Referenz](/api).

## Automatisch ermittelte Felder

Aus den Koordinaten werden beim Anlegen (und bei Standortänderung) automatisch bestimmt und
gespeichert:

- **`elevation`** — Höhe über NN in Metern.
- **`timezone`** — IANA-Zeitzone (z. B. `Europe/Berlin`), Basis für lokale Zeitstempel.
- **Geländehorizont** — fließt in die Verschattungsrechnung ein.

## Temporäre Standorte

Mit `temporary: true` beim Erstellen markieren Sie einen Standort als temporär/experimentell. Diese Funktion
erfordert einen passenden Plan. Ein temporärer Standort wird **31 Tage** nach dem Erstellen automatisch gelöscht.
Um ihn zu behalten, stellen Sie ihn vorher über die Web App oder über `POST /sites/{id}/restore` wieder her — das bricht
die vorgemerkte Löschung ab und macht den Standort dauerhaft.

## Limits

| Limit           | Verhalten                                                            |
|-----------------|----------------------------------------------------------------------|
| Standort-Limit  | Maximale Anzahl Standorte (kann `unmetered` sein).                   |
| String-Limit    | Maximale Strings pro Standort.                                       |
| Standortwechsel | Fest **1 Standortwechsel pro 30 Tage** je Standort (planunabhängig). |

## Löschen & Wiederherstellen

Gelöschte Standorte werden zunächst als „pending deletion" markiert (`deleted_at` gesetzt) und
erst **30 Tage später** endgültig entfernt. Innerhalb dieser Frist lassen sie sich wiederherstellen.
Details in der [API-Referenz](/api).
