enok leser en bygningsbeskrivelse i TOML, henter typisk klimaår for kommunen, simulerer 8760 timer etter NS-EN ISO 52016-1 og skriver energirapport, CSV og JSON. Motor - Femnodemodell for opake bygningsdeler, tonodemodell for vinduer, luftnode og strålingsnode per sone, implisitt løsning per time med egen tett LU-løser. - Varme- og kjølebehov ved eksakt interpolasjon mellom to løsninger, siden systemet er lineært. Vinduslufting for bygninger uten kjøleanlegg. - Solberegning etter ISO 52010-1, kontrollert mot pvlib med avvik under 1 prosent. Beregningsgang - Beregningspunktene A til E: netto, brutto, tilført, levert per energibærer og vektet levert energi, med solceller, klimakorrigering og effektbehov. - Energikarakter etter Enovas skala fra 1.1.2026, med arealkorreksjon. Inndata - TOML med scenarier for tiltak, og import fra IFC, gbXML og regneark. - Normerte verdier, karakterskala, vektingsfaktorer og klimadata i data/, som kan overstyres med --data. Kontroll - Stasjonært varmetap mot U·A·ΔT innenfor 2 prosent, energibalansen innenfor 2 prosent, varmetapsbudsjettet for TEK17-referansebygget identisk med publisert tabell. Kjent avvik i romoppvarming mot Simien 8 er dokumentert i README. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
109 lines
4.0 KiB
YAML
109 lines
4.0 KiB
YAML
name: rapport
|
|
|
|
# Bygger energirapporter for alle bygningene i `bygninger/` og legger dem ved utgivelsen.
|
|
#
|
|
# Legg én fil per bygning i `bygninger/`:
|
|
# * `bygning.toml` — ferdig bygningsbeskrivelse
|
|
# * `bygning.ifc` — IFC-eksport fra Vectorworks («Export IFC Project»)
|
|
# * `bygning.gbxml` — gbXML fra BIM-verktøy som støtter det
|
|
# * `bygning.csv` — regneark fra Vectorworks («Export Worksheet»)
|
|
#
|
|
# IFC-, gbXML- og CSV-filer importeres automatisk til TOML dersom det ikke allerede finnes en
|
|
# TOML-fil med samme navn. Importerte filer må vanligvis suppleres med ventilasjon,
|
|
# lekkasjetall og varmekilder før tallene er til å stole på; importen skriver merknader om det.
|
|
|
|
on:
|
|
push:
|
|
tags: ['v*', 'rapport-*']
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
rapporter:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Installer Rust og Typst
|
|
run: |
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
TYPST=0.15.1
|
|
curl -sSL "https://github.com/typst/typst/releases/download/v${TYPST}/typst-x86_64-unknown-linux-musl.tar.xz" \
|
|
| tar -xJ --strip-components=1 -C /usr/local/bin typst-x86_64-unknown-linux-musl/typst
|
|
|
|
- name: Hurtiglager for klimadata og cargo
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
~/.cargo/registry
|
|
~/.cargo/git
|
|
~/.cache/enok
|
|
target
|
|
key: enok-rapport-${{ runner.os }}-${{ hashFiles('Cargo.lock') }}
|
|
restore-keys: enok-rapport-${{ runner.os }}-
|
|
|
|
- name: Bygg enok
|
|
run: cargo build --release --locked
|
|
|
|
- name: Importer BIM-filer som ikke har en TOML fra før
|
|
run: |
|
|
shopt -s nullglob nocaseglob
|
|
for f in bygninger/*.ifc bygninger/*.gbxml bygninger/*.xml bygninger/*.csv; do
|
|
toml="${f%.*}.toml"
|
|
if [ ! -f "$toml" ]; then
|
|
echo "Importerer $f"
|
|
./target/release/enok import "$f" --ut "$toml"
|
|
fi
|
|
done
|
|
|
|
- name: Beregn og lag rapporter
|
|
run: |
|
|
shopt -s nullglob
|
|
mkdir -p dist
|
|
feil=0
|
|
for t in bygninger/*.toml; do
|
|
navn="$(basename "$t" .toml)"
|
|
echo "::group::$navn"
|
|
if ./target/release/enok beregn "$t" --ut "ut/$navn"; then
|
|
cp "ut/$navn/rapport.pdf" "dist/$navn-energirapport.pdf"
|
|
cp "ut/$navn/resultat.json" "dist/$navn-resultat.json"
|
|
cp "ut/$navn/maaned.csv" "dist/$navn-maaned.csv"
|
|
gzip -c "ut/$navn/timeserie.csv" > "dist/$navn-timeserie.csv.gz"
|
|
else
|
|
echo "Beregningen av $navn feilet"
|
|
feil=1
|
|
fi
|
|
echo "::endgroup::"
|
|
done
|
|
ls -la dist
|
|
exit $feil
|
|
|
|
- name: Last opp som byggeartefakt
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: energirapporter
|
|
path: dist/
|
|
|
|
- name: Legg ved utgivelsen
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
env:
|
|
TOKEN: ${{ secrets.GITEA_TOKEN }}
|
|
SERVER: ${{ github.server_url }}
|
|
REPO: ${{ github.repository }}
|
|
TAG: ${{ github.ref_name }}
|
|
run: |
|
|
set -euo pipefail
|
|
api="$SERVER/api/v1/repos/$REPO/releases"
|
|
id=$(curl -sS --fail -H "Authorization: token $TOKEN" "$api/tags/$TAG" | jq -r '.id // empty')
|
|
if [ -z "$id" ]; then
|
|
id=$(curl -sS --fail -X POST -H "Authorization: token $TOKEN" -H 'Content-Type: application/json' \
|
|
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":\"Energirapporter generert av enok.\"}" \
|
|
"$api" | jq -r '.id')
|
|
fi
|
|
for f in dist/*; do
|
|
echo "Laster opp $(basename "$f")"
|
|
curl -sS --fail -H "Authorization: token $TOKEN" \
|
|
--form "attachment=@$f" \
|
|
"$api/$id/assets?name=$(basename "$f")" > /dev/null
|
|
done
|