# Tag og solceller pr. BFE

`GET /v1/dhm/tag/:bfe/sol` · DHM

Hver tagflade målt i højdemodellen, med skygge måned for måned, paneler der kan ligge der, produktion og tre anlæg med økonomi.

Bygger på samme tagfit som [`/v1/dhm/bygninger`](https://grundfast.dk/docs/api/dhm-bygninger): RANSAC-planer i overflademodellen (0,4 m) inden for GeoDanmark-omridset. Hver celle gives til den flade, der forklarer den, så hver flade får sit sande areal (planareal ÷ cos hældning), sin retning, tagfod, top og spær. Celler, ingen flade forklarer — skorsten, kviste, træ over taget — står i `uden_flade_m2` og får ingen paneler.

Skyggen er målt, ikke antaget: fra op til fem punkter på fladen marcheres der stråler gennem overflademodellen ud til 100 m i 72 retninger, og horisonten blokerer den direkte sol time for time i et typisk år fra PVGIS. Ydelsen pr. kWp kommer fra PVGIS (EU JRC) for fladens hældning og retning og ganges med månedens skyggefaktor.

Panelerne pakkes i fladens eget plan med fast panel (1,762 × 1,134 m, 440 Wp) og 0,30 m fri kant. Tre anlæg: `maks` (alle paneler på flader over 650 kWh/kWp), `foreslaaet` (bedste flade først, til produktionen dækker forbruget) og `lille` (halvdelen). Økonomien bruger Energinets day-ahead-priser for prisområdet, vægtet med hvornår solen skinner på adressen.

En tagform, højdemodellen ikke kan navngive, får `beregnet: false` og en `aarsag` — vi gætter aldrig et tag ud fra årstal eller materiale. Alle antagelser står i `forudsaetninger`, og de økonomiske kan overskrives på forespørgslen.

**Godkendelse:** `Authorization: Bearer gf_live_…` (eller `gf_test_…`)

**Afregning:** Ét kald — også selvom svaret samler DHM, GeoDanmark, BBR, PVGIS og Energi Data Service.

## Parametre

| Navn | Placering | Type | Påkrævet | Beskrivelse |
| --- | --- | --- | --- | --- |
| `bfe` | path | integer | ja | BFE-nummeret på ejendommen. |
| `bygning` | query | string | nej | Kun denne bygning (BBR-UUID). Uden: alle bygninger, de fire største tage beregnet. |
| `forbrug_kwh` | query | integer | nej | Husstandens årsforbrug, som det foreslåede anlæg dimensioneres efter. Standard 4500. |
| `egetforbrug_andel` | query | number | nej | Andel af produktionen, der bruges i huset, når anlægget producerer præcis forbruget. Standard 0,35. |
| `pris_kr_pr_kwp` | query | integer | nej | Installeret pris pr. kWp inkl. moms. Standard 8.500 kr. |
| `pris_fast_kr` | query | integer | nej | Fast del af prisen (inverter, stillads, tilslutning) inkl. moms. Standard 12.000 kr. |
| `tillaeg_kr_kwh` | query | number | nej | Hvad en købt kWh koster oven i spotprisen, ekskl. moms (nettarif, afgifter, handelstillæg). Standard 0,60 kr. |

## Eksempel

```bash
curl "https://api.grundfast.dk/v1/dhm/tag/5651067/sol?forbrug_kwh=5500" \
  -H "Authorization: Bearer $GRUNDFAST_API_KEY"
```

## Svar (200)

```json
{
  "bfe_nummer": 4045894,
  "prisomraade": "DK1",
  "antal": 1,
  "bygninger": [
    {
      "bbr_uuid": "0a3f5097-5b4e-42b8-9e44-0003ba298018",
      "bbr": {
        "anvendelse": "Fritliggende enfamiliehus",
        "opfoerelsesaar": 1974,
        "tagdaekning": "Tegl",
        "bebygget_areal_m2": 140
      },
      "tagform": "saddeltag",
      "konfidens": 0.78,
      "haeldning_grader": 37.5,
      "terraen_m": 40,
      "beregnet": true,
      "aarsag": null,
      "tag_aarsag": null,
      "fodaftryk_m2": 140,
      "uden_flade_m2": 0,
      "tagmaal": {
        "tagfod_m": 28.8,
        "rygning_m": 14.4,
        "spaer_m": 6.6,
        "tagflade_m2": 185,
        "tagflade_inkl_udhaeng_m2": 201.9
      },
      "flader": [
        {
          "nr": 1,
          "haeldning_grader": 37.1,
          "aspekt_grader": 180,
          "retning": "S",
          "areal_m2": 93.8,
          "areal_vandret_m2": 74.9,
          "tagfod_m": 14.4,
          "top_m": 14.4,
          "spaer_m": 6.6,
          "skygge": {
            "aar_pct": 4.4,
            "maaned_pct": [
              22,
              17.6,
              2.2,
              1.3,
              1.4,
              1.4,
              1.6,
              1.5,
              1.7,
              12.4,
              28.1,
              19.2
            ],
            "horisont_grader": [
              37.4,
              37.4,
              37.4,
              29.5,
              29.5,
              26.1,
              24.2,
              18.6,
              11.6,
              4.1,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              19.1,
              25.5,
              24.1,
              21.8,
              19.1,
              0,
              0,
              0,
              0,
              7.4,
              13.9,
              20.5,
              26.1,
              29.5,
              29.5,
              36.9,
              37.4
            ]
          },
          "kwh_pr_kwp": 902,
          "kwh_pr_kwp_uden_skygge": 943,
          "maaned_kwh_pr_kwp": [
            17.2,
            31.4,
            82.7,
            117.2,
            129.6,
            129.1,
            122.1,
            107.7,
            84.8,
            48.5,
            19.1,
            12.6
          ],
          "paneler": {
            "antal": 35,
            "retning": "liggende",
            "kwp": 15.4,
            "kwh_aar": 13894,
            "placering": [
              [
                [
                  9.1733889,
                  56.4111018,
                  2.92
                ],
                [
                  9.1733604,
                  56.4111018,
                  2.92
                ],
                [
                  9.1733604,
                  56.4111099,
                  3.6
                ],
                [
                  9.173389,
                  56.4111099,
                  3.6
                ]
              ]
            ]
          }
        },
        {
          "nr": 2,
          "haeldning_grader": 38,
          "aspekt_grader": 0,
          "retning": "N",
          "areal_m2": 91.2,
          "areal_vandret_m2": 71.8,
          "tagfod_m": 14.4,
          "top_m": 14.4,
          "spaer_m": 6.6,
          "skygge": {
            "aar_pct": 0,
            "maaned_pct": [
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0
            ],
            "horisont_grader": [
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              7.1,
              13.7,
              20.2,
              25.6,
              29.2,
              29.2,
              36.3,
              37,
              37,
              37,
              37,
              29.2,
              29.2,
              25.6,
              24,
              17.9,
              11.3,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0,
              0
            ]
          },
          "kwh_pr_kwp": 443,
          "kwh_pr_kwp_uden_skygge": 443,
          "maaned_kwh_pr_kwp": [
            4.9,
            10.8,
            24.1,
            42.3,
            77,
            90.9,
            83.4,
            55.6,
            29.4,
            15.6,
            6,
            3.1
          ],
          "paneler": {
            "antal": 31,
            "retning": "liggende",
            "kwp": 13.6,
            "kwh_aar": 6043,
            "placering": [
              [
                [
                  9.1731687,
                  56.4111898,
                  2.89
                ],
                [
                  9.1731973,
                  56.4111897,
                  2.89
                ],
                [
                  9.1731972,
                  56.4111817,
                  3.59
                ],
                [
                  9.1731687,
                  56.4111818,
                  3.59
                ]
              ]
            ]
          }
        }
      ],
      "anlaeg": {
        "lille": {
          "paneler": 6,
          "kwp": 2.6,
          "kwh_aar": 2382,
          "maaned_kwh": [
            46,
            83,
            218,
            309,
            342,
            341,
            322,
            284,
            224,
            128,
            50,
            33
          ],
          "fordeling": [
            {
              "flade": 1,
              "paneler": 6
            }
          ],
          "oekonomi": {
            "pris_kr": 34400,
            "egetforbrug_andel": 0.48,
            "egetforbrug_kwh": 1146,
            "salg_kwh": 1236,
            "vaerdi_aar1_kr": 2249,
            "tilbagebetaling_aar": 15.9
          }
        },
        "foreslaaet": {
          "paneler": 12,
          "kwp": 5.3,
          "kwh_aar": 4764,
          "maaned_kwh": [
            91,
            166,
            437,
            619,
            685,
            682,
            645,
            569,
            448,
            256,
            101,
            67
          ],
          "fordeling": [
            {
              "flade": 1,
              "paneler": 12
            }
          ],
          "oekonomi": {
            "pris_kr": 56900,
            "egetforbrug_andel": 0.34,
            "egetforbrug_kwh": 1620,
            "salg_kwh": 3143,
            "vaerdi_aar1_kr": 3892,
            "tilbagebetaling_aar": 15.1
          }
        },
        "maks": {
          "paneler": 35,
          "kwp": 15.4,
          "kwh_aar": 13894,
          "maaned_kwh": [
            266,
            484,
            1274,
            1805,
            1997,
            1988,
            1880,
            1658,
            1306,
            748,
            294,
            194
          ],
          "fordeling": [
            {
              "flade": 1,
              "paneler": 35
            }
          ],
          "oekonomi": {
            "pris_kr": 142900,
            "egetforbrug_andel": 0.2,
            "egetforbrug_kwh": 2767,
            "salg_kwh": 11126,
            "vaerdi_aar1_kr": 9583,
            "tilbagebetaling_aar": 15.5
          }
        }
      },
      "anlaeg_aarsag": null
    }
  ],
  "elpris": {
    "prisomraade": "DK1",
    "fra": "2025-10-05",
    "til": "2026-10-05",
    "gennemsnit_kr_kwh": 0.77,
    "solvaegtet_kr_kwh": 0.53,
    "kilde": "Energi Data Service (Energinet), DayAheadPrices — CC BY 4.0"
  },
  "forudsaetninger": {
    "panel": {
      "laengde_m": 1.762,
      "bredde_m": 1.134,
      "effekt_wp": 440,
      "kantafstand_m": 0.3,
      "mellemrum_m": 0.02
    },
    "forbrug_kwh": 4500,
    "egetforbrug_andel": 0.35,
    "egetforbrug_regel": "andel = egetforbrug_andel × kvadratroden af (forbrug_kwh / produktion), højst 0,8",
    "pris_fast_kr": 12000,
    "pris_kr_pr_kwp": 8500,
    "tillaeg_kr_kwh": 0.6,
    "moms_andel": 0.25,
    "salgsgebyr_kr_kwh": 0.02,
    "degradering_pr_aar": 0.005,
    "horisont_aar": 30,
    "min_kwh_pr_kwp": 650,
    "systemtab_pct": 14,
    "udhaeng_m": 0.3,
    "horisont_afstand_m": 100,
    "observator_over_flade_m": 0.3,
    "albedo": 0.2,
    "noter": [
      "Panel: 1,76 × 1,13 m, 440 Wp, 0,3 m fri kant til tagets kanter, skorstene og kviste.",
      "Hældning, retning og flader er målt i Danmarks Højdemodel (0,4 m celler) inden for GeoDanmarks omrids — ikke på taget. En flade, højdemodellen ikke kan navngive, får ingen tal.",
      "Skygge fra bygninger, træer og terræn op til 100 m væk er målt i overflademodellen, som er fløjet én gang; løvfald om vinteren er ikke med, så vinterskyggen fra løvtræer er sat for højt."
    ]
  },
  "metode": {
    "tagflader": "RANSAC-planer fra /v1/dhm/bygninger; hver 0,4 m-celle i omridset tildeles den definerende flade, der forklarer den inden for 0,35 m",
    "skygge": "Horisont målt ved ray-marching i overflademodellen (0,8 m) ud til 100 m fra op til fem punkter på fladen; direkte stråling blokeres time for time i et typisk år, diffus reduceres med den skjulte del af himlen foran fladen",
    "instraaling": "PVGIS PVcalc (månedligt gennemsnit, 1 kWp, uden PVGIS-horisont) ganget med månedens skyggefaktor fra PVGIS TMY",
    "paneler": "Fladens målte celler i fladens eget plan, formindsket med kantafstanden; rækker fra tagfoden og op, stående og liggende afprøvet",
    "elpris": "Day-ahead-priser for prisområdet over de seneste 365 dage, vægtet time for time med adressens typiske solindstråling"
  },
  "ufuldstaendig": false,
  "kilder": [
    {
      "navn": "Danmarks Højdemodel (Klimadatastyrelsen) via Dataforsyningen",
      "brug": "Tagflader, hældning, retning og horisont",
      "vilkaar": "Frie data"
    },
    {
      "navn": "GeoDanmark",
      "brug": "Bygningernes omrids",
      "vilkaar": "CC BY 4.0 — @geodanmark"
    },
    {
      "navn": "PVGIS (EU Joint Research Centre)",
      "brug": "Indstråling og ydelse pr. kWp",
      "vilkaar": "PVGIS © European Union, 2001-2026 (EU Joint Research Centre) — genbrug tilladt med kildeangivelse"
    },
    {
      "navn": "Energi Data Service (Energinet)",
      "brug": "Day-ahead-elpriser",
      "vilkaar": "CC BY 4.0"
    },
    {
      "navn": "BBR",
      "brug": "Anvendelse, opførelsesår og tagdækning",
      "vilkaar": "Frie data"
    }
  ],
  "attribution": "@geodanmark",
  "meta": {
    "kilde": "Dataforsyningen DHM + GeoDanmark + PVGIS + Energi Data Service via Grundfast",
    "grundfast_version": "0.1.0"
  }
}
```

## Vigtige felter

| Felt | Type | Betydning |
| --- | --- | --- |
| `bygninger[].flader[]` | object[] | Én pr. målt tagflade: `haeldning_grader`, `aspekt_grader`/`retning`, `areal_m2` (sandt) og `areal_vandret_m2`, `tagfod_m`, `top_m`, `spaer_m`, `skygge`, `kwh_pr_kwp` (med skygge) og `kwh_pr_kwp_uden_skygge` (PVGIS’ eget tal), `maaned_kwh_pr_kwp` og `paneler`. |
| `bygninger[].flader[].skygge` | object | `aar_pct` og `maaned_pct`: andel af indstrålingen, den målte horisont tager. `horisont_grader`: 36 vinkler (10° ad gangen fra nord med uret) til den højeste forhindring set fra fladens midte. |
| `bygninger[].flader[].paneler.placering` | number[][][] | Hvert panels fire hjørner som `[lon, lat, h]`; `h` er meter over bygningens `terraen_m` — klar til at tegne i et kort eller en 3D-model. |
| `bygninger[].tagmaal` | object \| null | Til tækkemanden: `tagfod_m` (samlet), `rygning_m` (`null` på fladt og ensidigt tag), `spaer_m`, `tagflade_m2` og `tagflade_inkl_udhaeng_m2` med det antagne udhæng ved tagfod og gavle. |
| `bygninger[].anlaeg` | object \| null | `lille`, `foreslaaet` og `maks`: `paneler`, `kwp`, `kwh_aar`, `maaned_kwh`, `fordeling` pr. flade og `oekonomi` (pris, egetforbrug, værdi år 1, `tilbagebetaling_aar`). `null` med `anlaeg_aarsag`, når ingen flade egner sig. |
| `bygninger[].aarsag` | string \| null | Hvorfor en bygning ikke er beregnet: `tag_ikke_maalt` (se `tag_aarsag`), `for_lille`, `uden_for_budget` (spørg med `bygning=`), `horisont_utilgaengelig` eller `instraaling_utilgaengelig`. |
| `elpris` | object \| null | Prisområde, periode, gennemsnitlig og solvægtet day-ahead-pris i kr./kWh. `null`, når priserne ikke kunne hentes — så er `oekonomi` også `null`, mens produktionen står. |
| `forudsaetninger` | object | Hver antagelse tallene hviler på — panel, kantafstand, forbrug, priser, egetforbrugsreglen, degradering, udhæng, horisontafstand — og `noter` i klar tekst til at vise ved siden af tallene. |
| `kilder` | object[] | Kilderne med vilkår. PVGIS må genbruges med kildeangivelse; GeoDanmark kræver `@geodanmark`, hvor omridsene vises. |

## Fejl

| Status | Betydning |
| --- | --- |
| 400 | BFE-nummeret er ikke et positivt heltal, eller en antagelse ligger uden for sit interval. |
| 401 | Nøglen mangler eller er ugyldig. |
| 404 | BFE-nummeret findes ikke, eller `bygning` er ikke en bygning på ejendommen. |
| 429 | Burst-grænsen eller månedskvoten er nået. Se `Retry-After`. |
| 502 | Højdemodellen kunne ikke nås for nogen af bygningerne. En delvis fejl er en 200 med `beregnet: false` og en `aarsag` på de berørte bygninger. |
| 503 | DHM-, GeoDanmark- eller PVGIS-kilden er ikke konfigureret i dette miljø. |

> Et overslag fra luften — ikke en besigtigelse og ikke et tilbud. Højdemodellen er fløjet én gang, så løvtræers vinterskygge er sat for højt; taget, spærene og tilladelserne skal stadig ses af en fagperson. Lokalplanens ord om solceller står i [`/v1/plan/ejendom/:bfe/citater`](https://grundfast.dk/docs/api/plan-citater).
