test / test (push) Successful in 2m2s
Kjørebrukeren gitea-runner har rustup installert, men ingen standardkjede satt. Cargo svarte derfor at den ikke visste hvilken versjon den skulle bruke, og alle tre arbeidsflytene feilet. Arbeidsflytene setter nå en standardkjede selv om det mangler, i stedet for at kjøreren må ordnes for hånd. Gitea har heller ingen «releases/latest/download»-sti slik GitHub har. Taggen slås opp i API-et først. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
301 lines
12 KiB
Markdown
301 lines
12 KiB
Markdown
# enok
|
||
|
||
Årlig energiberegning og energirapport for bygninger etter **NS 3031:2025**, med
|
||
timesoppløsning gjennom hele året og energikarakter etter Enovas skala som gjelder fra
|
||
1. januar 2026.
|
||
|
||
Programmet tar en beskrivelse av bygningen — geometri, konstruksjoner, vinduer, ventilasjon,
|
||
varmekilder og drift — og et typisk klimaår, og gir 8760 timesverdier, et fullt energibudsjett
|
||
fra netto energibehov til vektet levert energi, en energikarakter og en ferdig rapport i PDF.
|
||
|
||
```
|
||
enok beregn bygninger/nordhusstykket-5.toml
|
||
```
|
||
|
||
```
|
||
Nordhusstykket 5 (Småhus, 140 m², byggeår 1948)
|
||
Klimadata: Indre Østfold
|
||
|
||
Varmetapstall 3,00 W/(m²K)
|
||
Netto energibehov 352,2 kWh/(m²·år)
|
||
Levert energi 328,5 kWh/(m²·år)
|
||
Vektet levert energi 328,5 kWh/(m²·år)
|
||
Energikarakter F
|
||
|
||
Tiltak:
|
||
Isolerte varmerør og kjellervegger 311,9 kWh/(m²·år) F
|
||
Nye vinduer 305,6 kWh/(m²·år) E
|
||
Etterisolert klimaskjerm 207,0 kWh/(m²·år) D
|
||
Væske-vann-varmepumpe 162,7 kWh/(m²·år) C
|
||
Full pakke 68,5 kWh/(m²·år) A
|
||
```
|
||
|
||
## Hva programmet gjør
|
||
|
||
**Beregningsmetode.** Dynamisk timesberegning etter NS-EN ISO 52016-1, slik NS 3031:2025
|
||
krever. Hver opake bygningsdel modelleres med fem noder der varmekapasiteten fordeles etter
|
||
masseplassering, vinduer med to noder, og sonen har en luftnode og en strålingsnode som
|
||
fordeler langbølget utveksling mellom innvendige overflater. Systemet løses implisitt for hver
|
||
time. Varme- og kjølebehovet bestemmes ved å løse uten tilført effekt og med en prøveeffekt;
|
||
siden systemet er lineært treffer interpolasjonen settpunktet nøyaktig.
|
||
|
||
**Beregningspunkter.** Budsjettet følger NS 3031:2025 fra A til E: netto energibehov,
|
||
brutto etter distribusjons- og akkumuleringstap, tilført energi etter systemvirkningsgrad og
|
||
årsvarmefaktor for hver varmekilde, levert energi per energibærer med fradrag for
|
||
egenprodusert solstrøm, og til slutt vektet levert energi.
|
||
|
||
**Energikarakter.** Vektet levert energi per kvadratmeter oppvarmet BRA slås opp i Enovas
|
||
skala, med arealkorreksjonen som gjelder for småhus og boligblokk. Vektingsfaktorene er
|
||
elektrisitet 1,0, fjernvarme og biobrensel 0,45, eksportert energi 0. Vedovn regnes å dekke
|
||
inntil 10 prosent av romoppvarmingen.
|
||
|
||
**Klimadata.** Timesverdier for alle norske kommuner fra datasettet som ble laget til
|
||
NS 3031:2025 (CERRA 1991–2020, CC-BY-4.0). Beregnes bygningen i lokalt klima, korrigeres de
|
||
klimaavhengige energipostene til referanseklima Oslo med klimakorrigeringsfaktorene fra
|
||
standardens tillegg, slik energimerkeforskriften krever. Arkivet lastes ned én gang og
|
||
hurtiglagres.
|
||
|
||
**Grunnen og kjelleren.** Flater mot grunnen regnes etter NS-EN ISO 13370: jordas varmemotstand
|
||
gjør at en uisolert grunnmur taper langt mindre enn U-verdien alene tilsier, og en kjellervegg
|
||
deles i en del over terreng, som er en vanlig yttervegg, og en nedgravd del. En uoppvarmet
|
||
kjeller eller et kaldt loft kan modelleres som en egen sone. Temperaturen der regnes ut time
|
||
for time av sonens varmebalanse etter NS-EN ISO 13789, med varme fra rommene over og fra
|
||
varmerør og beredere som står der. Uisolerte rør i kjelleren teller dermed både som tap fra
|
||
varmeanlegget og som varme som holder etasjeskilleren varm.
|
||
|
||
**Overoppheting.** Bygninger uten kjøleanlegg luftes gjennom vinduer. Uten det ville en tett
|
||
bygning med store vindusflater fått urealistisk høye innetemperaturer om våren og høsten, og
|
||
lagret solvarme ville kunstig redusert oppvarmingsbehovet. Grensen settes til den normerte
|
||
settpunkttemperaturen for kjøling, og luftingen koster ingen energi.
|
||
|
||
**Tiltak.** Scenarier i samme fil gir før-og-etter-tall og karakterer i én tabell.
|
||
|
||
## Installasjon
|
||
|
||
```sh
|
||
cargo install --path .
|
||
```
|
||
|
||
Typst må være installert for PDF-rapporten. Uten Typst kjører du med `--ingen-pdf`; da skrives
|
||
`rapport.typ` som du kan kompilere senere.
|
||
|
||
## Bruk
|
||
|
||
| Kommando | Hva den gjør |
|
||
| --- | --- |
|
||
| `enok beregn FIL.toml` | Beregner og skriver rapport, CSV og JSON til `ut/<navn>/` |
|
||
| `enok import FIL` | Leser IFC, gbXML eller regneark og skriver `bygning.toml` |
|
||
| `enok klima --liste` | Lister alle kommuner med klimadata |
|
||
| `enok klima --kommune Oslo` | Viser nøkkeltall for ett klimasted |
|
||
| `enok skala smaahus --areal 140` | Viser karakterskalaen med arealkorreksjon |
|
||
|
||
Nyttige valg til `beregn`: `--ingen-pdf`, `--ingen-timeserie`, `--enova-xml`,
|
||
`--uten-scenarier`, `--ut KATALOG`.
|
||
|
||
### Utdata
|
||
|
||
| Fil | Innhold |
|
||
| --- | --- |
|
||
| `rapport.pdf` | Energirapport med karakter, varmetapsbudsjett, energibudsjett og figurer |
|
||
| `rapport.typ`, `stil.typ` | Typst-kilde, slik at rapporten kan tilpasses |
|
||
| `resultat.json` | Hele resultatet, inkludert forutsetninger og månedsverdier |
|
||
| `timeserie.csv` | 8760 rader med temperaturer, laster, sol og energistrømmer |
|
||
| `maaned.csv` | Månedssummer |
|
||
| `enova-2014.xml` | XML for energimerkesystemet, med `--enova-xml` |
|
||
|
||
## Bygningsbeskrivelsen
|
||
|
||
En bygning beskrives i TOML. Alt som utelates fylles med normerte verdier for
|
||
bygningskategorien, eller med typiske verdier for byggeåret, og rapporten viser hva som er
|
||
antatt og hvor det kommer fra.
|
||
|
||
```toml
|
||
[bygning]
|
||
navn = "Nordhusstykket 5"
|
||
kategori = "smaahus"
|
||
byggeaar = 1948
|
||
oppvarmet_bra = 140.0
|
||
|
||
[klima]
|
||
kommune = "Indre Østfold"
|
||
|
||
[[flate]]
|
||
navn = "Yttervegg sør"
|
||
type = "vegg"
|
||
areal = 26.0
|
||
orientering = 180 # grader fra nord med klokka
|
||
u_verdi = 1.0 # eller `lag = [{ materiale = "tre", tykkelse = 0.02 }, …]`
|
||
masseklasse = "lett"
|
||
mot = "ute" # ute | grunn | uoppvarmet
|
||
|
||
[[vindu]]
|
||
navn = "Vinduer sør"
|
||
areal = 6.0
|
||
orientering = 180
|
||
u_verdi = 2.80
|
||
g_verdi = 0.76
|
||
|
||
[infiltrasjon]
|
||
n50 = 8.0
|
||
|
||
[[sone]] # uoppvarmet kjeller, med egen temperaturberegning
|
||
navn = "Kjeller"
|
||
volum = 165.0
|
||
andel_distribusjonstap = 1.0 # uisolerte varmerør avgir varmen sin her
|
||
|
||
[[sone.flate]]
|
||
navn = "Kjellermur"
|
||
type = "vegg"
|
||
areal = 108.0
|
||
u_verdi = 3.13
|
||
mot = "grunn"
|
||
dybde = 1.6 # nedgravd høyde
|
||
over_terreng = 0.6 # høyden som står over terreng
|
||
|
||
[ventilasjon]
|
||
type = "naturlig" # naturlig | avtrekk | balansert
|
||
|
||
[[oppvarming.kilde]]
|
||
type = "el_kjel" # direkte_el, luft_luft_vp, vaeske_vann_vp, vedovn, fjernvarme, …
|
||
andel_rom = 0.75
|
||
andel_tappevann = 1.0
|
||
|
||
[[scenario]]
|
||
navn = "Nye vinduer"
|
||
endringer.vindu = [{ navn = "Vinduer sør", u_verdi = 0.80, g_verdi = 0.50 }]
|
||
```
|
||
|
||
Scenarier flettes inn i bygningsbeskrivelsen: tabeller flettes rekursivt, elementer i lister
|
||
matches på `navn` eller `type`, nye elementer legges til, og `slett = true` fjerner et element.
|
||
|
||
Ferdige eksempler ligger i `eksempler/`.
|
||
|
||
## Import fra Vectorworks og andre BIM-verktøy
|
||
|
||
| Format | Slik henter du det | Hva som kommer med |
|
||
| --- | --- | --- |
|
||
| IFC | *Fil → Eksporter → Export IFC Project* | Flater, areal, U-verdier fra egenskapssett, himmelretning fra plassering, vinduer og dører koblet til vegg |
|
||
| gbXML | Verktøy som eksporterer gbXML | Rom, flater, åpninger, konstruksjoner med lag |
|
||
| Regneark | *Fil → Eksporter → Export Worksheet* | Enkel CSV med én rad per bygningsdel |
|
||
|
||
Himmelretningene i IFC utledes av elementenes plassering: veggens lokale akse gir planet, og
|
||
ytre normal velges som den som peker bort fra bygningens tyngdepunkt, korrigert for prosjektets
|
||
sanne nord. Kontroller dem mot tegningen etter import.
|
||
|
||
Ingen av formatene beskriver ventilasjon, lekkasjetall eller varmekilder. Importen skriver
|
||
merknader øverst i TOML-filen om hva som må fylles ut.
|
||
|
||
Regnearkformatet er bevisst enkelt, slik at det kan settes opp som en rapport i BIM-verktøyet:
|
||
|
||
```csv
|
||
type,navn,areal,u_verdi,orientering,helning,mot,g_verdi,antall
|
||
bygning,Nordhusstykket 5,140,,,,smaahus,1948,
|
||
vegg,Yttervegg sør,26,1.0,180,90,ute,,
|
||
gulv,Mot kjeller,98,0.8,,180,uoppvarmet,,
|
||
vindu,Stue sør,3.0,2.8,180,90,,0.76,2
|
||
```
|
||
|
||
## Rapporter fra byggeserveren
|
||
|
||
Arbeidsflytene i `.gitea/workflows/` kjører på vertskjøreren `fish` og utløses når en
|
||
utgivelse publiseres, på samme måte som de andre prosjektene.
|
||
|
||
| Fil | Hva den gjør |
|
||
| --- | --- |
|
||
| `test.yml` | Formatering, clippy og tester på hver push |
|
||
| `release.yml` | Bygger enok og legger binærfilen ved utgivelsen |
|
||
| `rapport.yml` | Lager energirapport for hver bygning i `bygninger/` og legger PDF, JSON og CSV ved utgivelsen |
|
||
|
||
IFC-, gbXML- og CSV-filer i `bygninger/` importeres automatisk til TOML dersom det ikke
|
||
allerede finnes en TOML-fil med samme navn. Se `bygninger/LES-MEG.md`.
|
||
|
||
### Energirapport fra et byggeprosjekt
|
||
|
||
Et prosjektlager med sin egen IFC-modell og `bygning.toml` trenger ikke Rust. Det henter
|
||
binærfilen fra enoks utgivelse:
|
||
|
||
```yaml
|
||
name: Energirapport
|
||
on:
|
||
release:
|
||
types: [published]
|
||
jobs:
|
||
rapport:
|
||
runs-on: fish
|
||
defaults:
|
||
run:
|
||
shell: fish {0}
|
||
steps:
|
||
- uses: https://gitea.com/actions/checkout@v6
|
||
- name: Hent enok og lag rapporten
|
||
env:
|
||
TOKEN: ${{ github.token }}
|
||
run: |
|
||
# Gitea har ingen «latest/download»-sti, så taggen slås opp først.
|
||
set TAG (curl -sS --fail --header "Authorization: token $TOKEN" \
|
||
"$GITHUB_SERVER_URL/api/v1/repos/klingenbergbygg/enok/releases/latest" | jq -r '.tag_name')
|
||
curl -sSL --fail -o enok --header "Authorization: token $TOKEN" \
|
||
"$GITHUB_SERVER_URL/klingenbergbygg/enok/releases/download/$TAG/enok"
|
||
chmod +x enok
|
||
./enok beregn bygning.toml --ut dist
|
||
```
|
||
|
||
## Kontroll av beregningen
|
||
|
||
Motoren er kontrollert mot uavhengige referanser:
|
||
|
||
| Kontroll | Resultat |
|
||
| --- | --- |
|
||
| Solinnstråling på skrå og orienterte flater, mot pvlib (Hay–Davies) | avvik under 1 % for alle himmelretninger i Oslo-klima |
|
||
| Stasjonært varmetap mot U·A·ΔT | innenfor 2 % |
|
||
| Grunnmodellen mot NS-EN ISO 13370 | kompakthet, dybde og isolasjon virker som standarden beskriver |
|
||
| Kjellermodellen mot NS-EN ISO 13789 | varme rør hever kjellertemperaturen og reduserer romoppvarmingen |
|
||
| Årlig energibalanse | går opp innenfor 2 % |
|
||
| Varmebehov som funksjon av temperaturdifferanse | eksakt lineært |
|
||
| Varmetapsbudsjett for TEK17-referansebygget | identisk med publisert tabell, 0,69 W/(m²K) |
|
||
| Normerte energiposter for småhus | varmtvann 25,1, belysning 11,4, teknisk utstyr 17,5 kWh/(m²·år) |
|
||
|
||
### Kjent avvik
|
||
|
||
Standard Norges lanseringseksempel for NS 3031:2025 oppgir 46,2 kWh/(m²·år) romoppvarming og
|
||
106,4 kWh/(m²·år) netto energibehov for TEK17-referansebygget beregnet med Simien 8. enok
|
||
beregner 27,2 og 86,7 for den samme bygningen.
|
||
|
||
Varmetapsbudsjettet, de normerte energipostene, solinnstrålingen og energibalansen stemmer
|
||
hver for seg, så avviket ligger i hvor stor del av solvarmen som nyttiggjøres. NS 3031:2025
|
||
Tillegg A er ikke offentlig tilgjengelig, så de normerte solfaktorene, skjermingsforutsetningene
|
||
og timesprofilene Simien bruker, lar seg ikke etterprøve her. `tests/referansebygg.rs` låser
|
||
dagens verdier slik at endringer i motoren blir synlige, og oppdateres når standardens
|
||
forutsetninger er tilgjengelige.
|
||
|
||
Bruk derfor tallene til å sammenligne tiltak mot hverandre og til å se hvor varmen forsvinner.
|
||
Til en energiattest som skal leveres til Enova må resultatet kontrolleres mot et validert
|
||
beregningsprogram.
|
||
|
||
## Datagrunnlag
|
||
|
||
Alle normerte verdier ligger i `data/` og kan overstyres med `--data KATALOG`.
|
||
|
||
| Fil | Innhold og kilde |
|
||
| --- | --- |
|
||
| `skala.toml` | Energikarakterskalaen fra 1.1.2026, Enova SF via Multiconsult-notatet «Grunnlag for ny energikarakterskala», 19.12.2025 |
|
||
| `vekting.toml` | Vektingsfaktorer etter energimerkeforskriften § 10a med NVEs veileder |
|
||
| `normerte/*.toml` | Normerte laster, driftstider og settpunkt. Utgangspunktet er NS 3031:2014 Tillegg A; varmtvann er oppdatert til NS 3031:2025-verdien for småhus. Timesprofiler fra NS 3031:2025 kan legges inn i `profil_*`-feltene |
|
||
| `varmepumpe_spf.toml` | Veiledende årsvarmefaktorer, NS 3031:2014 tabell B.9-3 |
|
||
| `materialer.toml` | Materialdata og typiske U-verdier per byggeperiode |
|
||
| `klimakorreksjon.csv` | Klimakorrigeringsfaktorer, Standard Norge SN/K 34, doi 10.5281/zenodo.15041587 |
|
||
|
||
Klimadata: «TMY files for Norway based on CERRA data from 1991-2020», doi
|
||
10.5281/zenodo.14779899, CC-BY-4.0.
|
||
|
||
## Regelverk
|
||
|
||
- Forskrift om energimerking av bygninger og energivurdering av varme- og klimaanlegg,
|
||
§§ 10a og 10b, med NVEs veileder
|
||
- NS 3031:2025 *Bygningers energiytelse — Beregning av energi- og effektbehov*
|
||
- NS-EN ISO 52016-1:2017 og NS-EN ISO 52010-1:2017
|
||
|
||
## Lisens
|
||
|
||
MIT.
|