FRESAB Driftportal
Öppet API v1
Logga in

Läs anläggningens data

Portalen samlar in mätvärden från undercentraler och gör dem läsbara för andra system: ordersystem, BI-verktyg, energitjänster och fastighetsägarens egna portaler. Det finns inga webhooks — motparten hämtar det den behöver, när den behöver det.

GET https://portal.fresab.se/api/v1/varden?kalla=<källa>
Authorization: Bearer <nyckel>

Allt är JSON. Fel har formen { "error": "…" } med status 400, 401, 403, 404, 413, 422, 429 eller 500. Varje lista bär trunkerad: true när ett tak slog till, och ?format=csv ger csv med punkt som decimaltecken och ISO-tid där det finns.

Nyckel per motpart

Varje integration får sin egen nyckel. Nyckeln bär tre rättigheter och en lista med de anläggningar den ser — tom lista betyder alla anläggningar hos den som utfärdade den. Nyckeln lagras bara som SHA-256, så klartexten visas en enda gång när den skapas. Den har en giltighetstid och ett tak per minut, båda satta när den utfärdas. Databasen filtrerar dessutom varje läsning på nyckelns anläggningar (RLS), inte bara API-lagret.

RättighetGer
lassignalkatalog, senaste värden, historik, larmlista, skrivlogg
skrivbegära börvärden (läggs i kö, utförs på plats)
pushleverera egna mätvärden till en källa av typen push

Nycklar utfärdas av FRESAB på begäran av anläggningens ägare. Ring 010-200 81 32 och berätta vilket system som ska integreras och vad det behöver läsa.

Regler

Åtta regler gäller alla ändpunkter lika, och de prövas i den här ordningen på varje anrop. En klient som följer dem pollar med andrad_efter och If-None-Match och får i normalfallet 304 eller en tom lista — det kostar en nyckelslagning och en indexerad fråga, inte tusentals rader.

  1. 1
    En nyckel per motpart

    Rättigheter, anläggningar och giltighetstid sitter på nyckeln. Nyckeln kan gå ut på ett datum utan att någon behöver spärra den.

    Spärrad eller utgången nyckel: 401. Saknad rättighet: 403.

  2. 2
    Tak per minut

    Standard 120 anrop per kalenderminut och nyckel. Räknas före rättighetskontrollen, så avvisade anrop kostar också. Behöver ni mer, säg till — taket sätts per nyckel.

    Över taket: 429 med Retry-After i sekunder. Varje svar bär X-RateLimit-Limit, -Remaining och -Reset.

  3. 3
    ETag på alla GET

    Spara ETag ur svaret och skicka tillbaka den som If-None-Match nästa gång.

    Oförändrat svar: 304 utan kropp. Det sparar överföringen — databasfrågan körs ändå för att veta om något ändrats.

  4. 4
    Hämta delta, inte allt

    andrad_efter på varden och larm ger bara det som rört sig; svaret bär hamtad (serverns tid) att skicka tillbaka nästa gång. Historik fortsätts med nasta_fran.

    En pollande motpart får ett tomt svar när ingenting hänt — inte hela listan varje minut.

  5. 5
    Listor har tak

    Varje lista säger trunkerad: true när taket slog till. limit höjer till max, efter och nasta_fran fortsätter där förra svaret slutade.

    Ett svar som tystnat vid 5000 rader ska aldrig se ut som ett svar med 5000 rader i databasen.

  6. 6
    Räkna aldrig på quality bad

    stale är ett reservvärde när insamlingen tystnat; bad med error är ett värde som finns men inte ska litas på.

    Ett avbrottsvärde från en oansluten givare ser ut som 177,8 °C. Det är inte en temperatur.

  7. 7
    Ingenting i molnet skriver till en PLC

    En skrivbegäran köas och utförs på plats genom vaktkedjan nedan.

    202 Accepted med id; utfallet hämtas på /skrivningar/{id}.

  8. 8
    Inga webhooks

    Motparten hämtar det den behöver, när den behöver det. Larm levereras som mejl av larmvakten.

    Ett larmsystem pollar larm?aktiv=true&andrad_efter=… — med ETag blir det ett 304 i minuten.

GET https://portal.fresab.se/api/v1/varden?kalla=<källa>&andrad_efter=2026-09-25T06:00:00Z
Authorization: Bearer <nyckel>
If-None-Match: W/"3f9c1a2b0e7d4c5b6a81"

HTTP/1.1 304 Not Modified
ETag: W/"3f9c1a2b0e7d4c5b6a81"
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
X-RateLimit-Reset: 1790316060

Ändpunkter

GET/api/v1kräver ingen nyckel

Självbeskrivning: vilka ändpunkter som finns. Kräver ingen nyckel.

GET/api/v1/anlaggningarkräver rättigheten las

Börja här: anläggningarna nyckeln ser, med adress, koordinater och källor. Källornas namn är det som används som kalla= i alla andra anrop.

GET/api/v1/punkterkräver rättigheten las

Signalkatalogen: namn, enhet, datatyp, kadensgrupp, gränser, avbrottsvärden och om punkten är skrivbar.

  • kallabara en källa, på namn
  • gruppbara en kadensgrupp (fast, meter, alarm …)
  • skrivbar=truebara punkter som går att skriva
  • limit, eftertak (standard 5000) och fortsättning efter en tagg inom en källa
GET/api/v1/vardenkräver rättigheten las

Senaste värde per punkt, med katalogmetadata.

  • kallaen källa
  • tagkommaseparerad lista taggar
  • gruppen kadensgrupp
  • andrad_efterISO-tid: bara punkter vars senaste värde är nyare — svaret bär hamtad att skicka tillbaka nästa gång
  • limit, eftertak (standard 2000) och fortsättning efter en tagg inom en källa
  • format=csvcsv i stället för JSON
GET/api/v1/serierkräver rättigheten las

Historik för en eller flera punkter på samma källa, i stigande tidsordning. Rådata gallras efter 90 dygn; timme och dygn sparas. Flera taggar svarar med en post per tagg under 'serier'.

  • kalla + tagpunkten — eller flera, kommaseparerade (max 100) — eller
  • punkt_idpunktens id ur katalogen
  • fran, tillISO-tid, standard senaste 24 h
  • stegra (standard), timme eller dygn — aggregaten ger medel, min, max, sista och antal
  • limitmax rader (standard 2000, tak 10000), räknat över alla taggar
  • format=csvcsv i stället för JSON
POST/api/v1/vardenkräver rättigheten push

Levererar mätvärden till en källa av typen push. Punkter som saknas i katalogen skapas automatiskt. Max 1000 värden per anrop.

POST/api/v1/skrivningarkräver rättigheten skriv

Begär ett börvärde. Svaret är 202 Accepted med ett id och status vantar — se vaktkedjan nedan.

GET/api/v1/skrivningarkräver rättigheten las

Skrivloggen: vem som begärde vad, när, och hur det gick.

  • kallaen källa
  • statusvantar, skriven, avvisad, misslyckad, aterstalld
  • limitmax rader
GET/api/v1/larmkräver rättigheten las

Larmlistan med klass (A akut, B fel, C information) och tidpunkt.

  • aktiv=truebara aktiva larm
  • klassA, B eller C
  • andrad_efterISO-tid: bara larm som ändrats efter tidpunkten — svaret bär hamtad
POST/api/v1/larmkräver rättigheten skriv

Kvitterar ett aktivt larm.

Lita på värdena — och inte

Varje värde bär ett quality: good är en färsk avläsning, stale är ett reservvärde när insamlingen tystnat, och bad betyder att värdet finns men inte ska litas på — till exempel ett avbrottsvärde från en givare som inte är inkopplad. Räkna aldrig på ett bad-värde. Är error satt står skälet där.

Mätarställningar (MWh, m³) är ackumulerande räknare. Förbrukning är skillnaden mellan två ställningar — läs steg=dygn och använd sist, inte medel. En skillnad som blir negativ betyder mätarbyte eller överrullning, inte minusförbrukning.

Att begära ett börvärde

Ingenting i molnet skriver till en PLC. En begäran läggs i kö och hämtas av insamlaren på plats, som utför den genom sin vaktkedja:

  1. punkten är märkt skrivbar i katalogen
  2. värdet ligger inom punktens min och max
  3. ändringstakten håller sig under punktens tak
  4. spärrtaggen (till exempel värmepumpens blockerande A-larm) är noll och färsk
  5. enheten ekar skrivningen och återläsningen stämmer

Utfallet blir skriven, avvisad (vakten sa nej, med motivering) eller misslyckad (fältet svarade inte som väntat), och hämtas på GET /api/v1/skrivningar/{id}. Varje begäran loggas med vem, vad och när, och loggen går inte att redigera.

curl -X POST https://portal.fresab.se/api/v1/skrivningar \
  -H "Authorization: Bearer <nyckel>" \
  -H "Content-Type: application/json" \
  -d '{"kalla":"<källa>","tag":"<tagg>","varde":35,"skal":"effekttak"}'

HTTP/1.1 202 Accepted
{ "id": "…", "status": "vantar" }

Historik och upplösning

stegGerStandardspann
ravarje avläsning24 h
timmemedel, min, max, sista, antal per timme (UTC)30 dygn
dygnsamma per lokalt dygn (Europe/Stockholm)365 dygn

Finns fler rader än limit är trunkerad: true och nasta_fran sista tidsstämpeln, att skicka som fran i nästa anrop. Insamlingen loggar vid förändring, så en punkt som stått still saknar rader — värdet gällde ändå hela tiden.

Att leverera egna mätvärden

Har ni själva mätvärden som hör till anläggningen — inomhustemperaturer, undermätare, närvaro — kan de pushas in i portalen och visas tillsammans med resten. Källan skapas av admin, och nya punkter dyker upp i katalogen automatiskt.

curl -X POST https://portal.fresab.se/api/v1/varden \
  -H "Authorization: Bearer <nyckel>" \
  -H "Content-Type: application/json" \
  -d '{"kalla":"<källa>","varden":[
        {"tag":"medel_inne_temp","value":21.4,"unit":"°C","ts":"2026-09-23T10:00:00Z"},
        {"tag":"lgh_12_temp","value":20.9,"unit":"°C"}
      ]}'

ts utelämnad betyder nu. value: null lagras som quality bad. Svaret listar nya punkter och avvisade rader.