# Mitt anlegg

> Registrer solcelleanlegget ditt, send inn faktiske produksjonstall (fil eller løpende), og få en prognose tilpasset akkurat ditt anlegg. Vi tolker filen for deg, kontrollerer den mot sola, og kalibrerer prognosen for skygge, tap og vekselretterbegrensning.

Kilde: https://solkart.no/api/dokumentasjon/anlegg · Sist oppdatert 2026-10-06 · Base-URL https://api.solkart.no · OpenAPI: https://solkart.no/openapi.json

## Hva du får

Prognosen fra Solkart regner produksjonen ut fra innstrålingen og anleggets takflater. Det virkelige anlegget avviker alltid litt: skygge fra trær og naboer, tap i kabler og vekselretter, smuss, eller en vekselretter som er mindre enn panelene og kapper toppen. Med Mitt anlegg sender du inn hva anlegget faktisk har produsert, og prognosen for anlegget tilpasses.

- Last opp en fil i nesten hvilket som helst format — eksport fra vekselretter-appen (Fronius, SolarEdge, Huawei, SMA, APsystems, Enphase …), fra nettselskapet, eller et regneark. **SunPoint datatolkning** finner ut hvilke kolonner som er tid og produksjon, tidssone, enhet og om det er en tellerstand.
- Tolkningen **kontrolleres mot sola**: produksjon om natta, en døgnkurve som topper seg på feil tid, høyere effekt enn anlegget kan gi, eller tall som ser ut som eksport til nettet. Feil tidssone og W lest som kW rettes automatisk og vises åpent.
- Send tall **løpende**, typisk én gang i døgnet — som fil i samme format (legges inn uten spørsmål) eller som JSON til `/maalinger`.
- Prognosen for anlegget (`/api/forecast?anlegg_id=`) har både den **tilpassede** og den **opprinnelige** produksjonen.

!!! note "Pilot"
    Mitt anlegg er i lukket pilot. Under piloten kreves i tillegg headeren `X-Anlegg-Beta` med tilgangskoden du har fått. Alle kall krever en API-nøkkel; anleggene tilhører nøkkelen.

Personvern: data lagres i EU, kan slettes når som helst, og slettes automatisk etter 365 dager uten bruk. Se [personvernerklæringen](/mitt-anlegg-personvern).

## Kom i gang

```bash
# 1. Registrer anlegget (samtykke kreves)
curl -X POST https://api.solkart.no/api/anlegg \
  -H "X-API-Key: $SOLKART_API_KEY" -H "X-Anlegg-Beta: $BETA" -H "Content-Type: application/json" \
  -d '{ "navn": "Låvetaket", "latitude": 60.79, "longitude": 11.07, "samtykke": true,
        "flater": [ { "name": "Sør", "kwp": 48, "tilt_deg": 20, "azimuth_deg": 180 } ] }'

# 2. Last opp en eksport (fila som kropp)
curl -X POST "https://api.solkart.no/api/anlegg/anl_…/produksjon?filnavn=eksport.csv" \
  -H "X-API-Key: $SOLKART_API_KEY" -H "X-Anlegg-Beta: $BETA" --data-binary @eksport.csv

# 3. Se tolkningen, og bekreft den
curl -X POST https://api.solkart.no/api/anlegg/anl_…/produksjon/opp_…/bekreft \
  -H "X-API-Key: $SOLKART_API_KEY" -H "X-Anlegg-Beta: $BETA"

# 4. Prognose for anlegget
curl "https://api.solkart.no/api/forecast?anlegg_id=anl_…" -H "X-API-Key: $SOLKART_API_KEY"
```

## POST /api/anlegg: registrer et anlegg

| Felt | Type | Påkrevd | Standard | Beskrivelse |
|---|---|---|---|---|
| `latitude`, `longitude` | tall | ja | | Posisjon i Norge (WGS84). `lat`/`lon` godtas også. |
| `flater[]` | liste | ja | | Én oppføring per takflate: `name`, `kwp`, `tilt_deg` (0–90), `azimuth_deg` (0–360, 180 = sør). `arrays` godtas også. |
| `samtykke` | `true` | ja | | Bekrefter at du har lest personvernerklæringen og har rett til å laste opp tallene. |
| `navn` | streng | nei | «Mitt anlegg» | |
| `ytelsesfaktor` | 0,5–1 | nei | 0,85 | Systemvirkningsgrad (som `performance_ratio` i prognosen). |
| `privat` | boolsk | nei | `false` | Anlegget står på en bolig. |

Svar `201` med anlegget og `id` (`anl_…`). `400` med `code` ved manglende samtykke (`CONSENT_REQUIRED`), koordinater (`COORDINATES`) eller flater (`ARRAYS`).

`GET /api/anlegg` lister anleggene til nøkkelen. `GET /api/anlegg/{id}` gir anlegget, datagrunnlaget (`data.timer`, `fra`, `til`, `kwh_totalt`), gjeldende `kalibrering` og de siste opplastingene.

## POST /api/anlegg/{id}/produksjon: last opp en fil

Fila sendes som rå kropp (`--data-binary`, valgfritt `?filnavn=`) eller som `multipart/form-data` med feltet `fil`. CSV/TXT/TSV (alle vanlige skilletegn, desimalkomma, UTF-8 eller Windows-1252), Excel (`.xlsx`, `.xls`) og JSON (liste med objekter). Maks 10 MB.

Svar `201`:

```json
{
  "opplasting_id": "opp_7c1e…",
  "status": "venter",
  "tolkning": {
    "beskrivelse": "Fila er en eksport fra en vekselretter-portal. Tabellen starter på linje 6 …",
    "usikkerheter": ["Viser telleren produksjonen fra hele anlegget, eller bare fra én vekselretter?"],
    "sikkerhet": 0.88,
    "kilde": "SunPoint datatolkning",
    "detaljer": { "tid": { "format": "MMM D, YYYY HH:mm", "tidssone": "UTC", "stempel": "start" },
                  "verdi": { "enhet": "Wh", "storrelse": "teller" }, "intervall_min": 60 }
  },
  "endringer": ["Tidene er flyttet +1 time(r), fordi produksjonen ellers toppet seg på feil tid av døgnet."],
  "kontroll": {
    "status": "ok",
    "funn": [],
    "oppsummering": { "fra": "2026-06-01T00:00:00.000Z", "til": "2026-06-22T00:00:00.000Z",
                      "timer": 504, "kwh_totalt": 742.3, "andel_av_klarvaer": 0.7, "tyngdepunkt_avvik_timer": 0 }
  },
  "forhandsvisning": [ { "dato": "2026-06-01", "malt_kwh": 41.2, "klarvaer_kwh": 58.9 } ]
}
```

| Felt | Beskrivelse |
|---|---|
| `tolkning.beskrivelse` | Hvordan fila er lest, i klartekst. |
| `tolkning.usikkerheter` | Spørsmål til deg om det som ikke kunne avgjøres fra fila. |
| `tolkning.kilde` | `SunPoint datatolkning`, `regelbasert` (reserve) eller `lagret tolkning` (samme format som en fil du har bekreftet før). |
| `endringer` | Rettelser kontrollen gjorde og fant bekreftet, med begrunnelse. |
| `kontroll.status` | `ok`, `advarsel` eller `feil`. Med `feil` kan opplastingen ikke bekreftes. |
| `kontroll.funn[]` | `kode`, `alvor` og `tekst`: `natt`, `tid`, `topp_hoy`, `topp_lav`, `niva_hoy`, `niva_lav`, `negative`, `dekning`, `ikke_produksjon`. |
| `forhandsvisning[]` | Målt produksjon per døgn mot hva anlegget kan gi i rent klarvær (siste 60 døgn). |

Fila lagres ikke som produksjon før den er **bekreftet**: `POST …/produksjon/{opplasting}/bekreft` (eller `…/avvis`). Med `?bekreft=true` på opplastingen bekreftes den i samme kall når kontrollen ikke finner feil.

!!! note "Lagret tolkning"
    Når du har bekreftet en fil, huskes tolkningen. Neste fil med de samme kolonneoverskriftene tolkes likt, uten AI, og legges inn automatisk (`status: "bekreftet"`, `lagt_inn_automatisk: true`) — så lenge kontrollen ikke finner feil og ingen rettelser trengs. Daglige eksporter i samme format går altså rett inn.

Samme time sendt på nytt erstatter den gamle verdien, så overlappende filer gir ikke dobbelt telling.

## POST /api/anlegg/{id}/maalinger: løpende innsending

For systemer som sender tall jevnlig, typisk én gang i døgnet med døgnets timer. Fast format, ingen tolkning, svar på millisekunder.

```bash
curl -X POST https://api.solkart.no/api/anlegg/anl_…/maalinger \
  -H "X-API-Key: $SOLKART_API_KEY" -H "X-Anlegg-Beta: $BETA" -H "Content-Type: application/json" \
  -d '{ "enhet": "kWh",
        "verdier": [ { "tid": "2026-10-06T10:00:00Z", "verdi": 3.21 },
                     { "tid": "2026-10-06T11:00:00Z", "verdi": 4.05 } ] }'
```

| Felt | Type | Standard | Beskrivelse |
|---|---|---|---|
| `verdier[]` | liste | påkrevd | `{ "tid", "verdi" }` (også `time`/`value`) eller `[tid, verdi]`. Høyst 20 000 per kall. |
| `enhet` | `W`, `kW`, `MW`, `Wh`, `kWh`, `MWh` | `kWh` | |
| `storrelse` | `energi`, `effekt` | `energi` for Wh-enheter, ellers `effekt` | Energi i intervallet, eller gjennomsnittlig effekt. |
| `intervall_min` | heltall | 60 | Lengden på hvert intervall. 15-minuttersverdier summeres til timer. |
| `stempel` | `start`, `slutt` | `start` | Om `tid` er starten eller slutten av intervallet. |
| `tidssone` | `UTC`, `Europe/Oslo`, `+01:00` | `UTC` | Brukes bare for tider uten sone. |

Svar `201` med `lagret`, `fra`, `til`. Verdier som ikke kan stemme — mer enn ~1,15 × kWp på en time, eller negative — gir `422` med `problemer[]`, og ingenting lagres. Fra ett døgn med data kjøres også den fulle kontrollen.

## Prognose for anlegget

`GET /api/forecast?anlegg_id={id}` (eller `"anlegg_id"` i JSON-kroppen) bruker anleggets posisjon og takflater. Alle vanlige parametre virker (`daily`, `snow`, `nowcast` …). I tillegg:

| Felt | Beskrivelse |
|---|---|
| `pv_timeseries`, `pv_system` | Produksjonen **tilpasset** anlegget (når kalibreringen er i bruk). |
| `pv_timeseries_ukorrigert`, `pv_system.ukorrigert` | Den **opprinnelige** produksjonen, uten tilpasning. |
| `kalibrering` | `brukt`, `faktor`, `klipp_kw`, `metode`, `forelopig`, `grunn` (i klartekst), `oppdatert`. |
| `anlegg` | `id` og `navn`. |

Med `kalibrering=false` (spørrestreng eller kropp) er hovedserien den opprinnelige, og den tilpassede utelates.

## Kalibreringen

Kalibreringen oppdateres hver natt for anlegg som har fått nye tall (første gang med en gang). Trinn 1, som er i bruk nå:

- **Ytelse fra klare dager.** På dager med rent klarvær følger produksjonen klarværsmodellen tett, og forholdet mellom målt og modellert viser om anlegget gir mer eller mindre enn konfigurasjonen sier. Faktoren tilpasses på annenhver klare dag og testes på resten; den brukes bare når avviket er over 10 % og slår den ukorrigerte modellen på testdagene. Krever minst 6 klare dager. Merket `forelopig`: klarværsmodellen har selv noen prosents usikkerhet.
- **Vekselretterbegrensning.** Når toppen flater ut på samme verdi mens sola fortsatt stiger, er vekselretteren mindre enn panelene. Grensen (`klipp_kw`) legges på prognosen.

Neste trinn bruker den faktiske innstrålingen for de samme timene i stedet for klarvær, og korrigerer for skygge etter solens posisjon.

## Slett

`DELETE /api/anlegg/{id}` sletter anlegget, alle opplastede filer og alle produksjonstall straks. Det kan ikke angres. Anlegg som ikke er brukt på 365 dager, slettes automatisk.

## Feil

| Status | Kode | Når |
|---|---|---|
| 401 | `API_KEY_REQUIRED` | Mangler API-nøkkel. |
| 403 | `BETA` | Mangler eller feil `X-Anlegg-Beta` under piloten. |
| 404 | | Anlegget finnes ikke, eller tilhører en annen nøkkel. |
| 409 | `FAILED_CHECKS` | Opplastingen kan ikke bekreftes fordi kontrollen fant feil. |
| 413 | | Fila er over 10 MB, eller mer enn 20 000 verdier. |
| 422 | `UNREADABLE`, `NOT_INTERPRETED`, `FAILED_CHECKS` | Fila kunne ikke leses eller tolkes, eller målingene ble avvist. |
