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ättighet | Ger |
|---|---|
| las | signalkatalog, senaste värden, historik, larmlista, skrivlogg |
| skriv | begära börvärden (läggs i kö, utförs på plats) |
| push | leverera 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.
- 1En 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.
- 2Tak 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.
- 3ETag 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.
- 4Hä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.
- 5Listor 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.
- 6Rä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.
- 7Ingenting 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}.
- 8Inga 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
/api/v1kräver ingen nyckelSjälvbeskrivning: vilka ändpunkter som finns. Kräver ingen nyckel.
/api/v1/anlaggningarkräver rättigheten lasBö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.
/api/v1/punkterkräver rättigheten lasSignalkatalogen: namn, enhet, datatyp, kadensgrupp, gränser, avbrottsvärden och om punkten är skrivbar.
kallabara en källa, på namngruppbara en kadensgrupp (fast, meter, alarm …)skrivbar=truebara punkter som går att skrivalimit, eftertak (standard 5000) och fortsättning efter en tagg inom en källa
/api/v1/vardenkräver rättigheten lasSenaste värde per punkt, med katalogmetadata.
kallaen källatagkommaseparerad lista taggargruppen kadensgruppandrad_efterISO-tid: bara punkter vars senaste värde är nyare — svaret bär hamtad att skicka tillbaka nästa gånglimit, eftertak (standard 2000) och fortsättning efter en tagg inom en källaformat=csvcsv i stället för JSON
/api/v1/serierkräver rättigheten lasHistorik 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) — ellerpunkt_idpunktens id ur katalogenfran, tillISO-tid, standard senaste 24 hstegra (standard), timme eller dygn — aggregaten ger medel, min, max, sista och antallimitmax rader (standard 2000, tak 10000), räknat över alla taggarformat=csvcsv i stället för JSON
/api/v1/vardenkräver rättigheten pushLevererar mätvärden till en källa av typen push. Punkter som saknas i katalogen skapas automatiskt. Max 1000 värden per anrop.
/api/v1/skrivningarkräver rättigheten skrivBegär ett börvärde. Svaret är 202 Accepted med ett id och status vantar — se vaktkedjan nedan.
/api/v1/skrivningarkräver rättigheten lasSkrivloggen: vem som begärde vad, när, och hur det gick.
kallaen källastatusvantar, skriven, avvisad, misslyckad, aterstalldlimitmax rader
/api/v1/larmkräver rättigheten lasLarmlistan med klass (A akut, B fel, C information) och tidpunkt.
aktiv=truebara aktiva larmklassA, B eller Candrad_efterISO-tid: bara larm som ändrats efter tidpunkten — svaret bär hamtad
/api/v1/larmkräver rättigheten skrivKvitterar 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:
- punkten är märkt skrivbar i katalogen
- värdet ligger inom punktens min och max
- ändringstakten håller sig under punktens tak
- spärrtaggen (till exempel värmepumpens blockerande A-larm) är noll och färsk
- 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
| steg | Ger | Standardspann |
|---|---|---|
| ra | varje avläsning | 24 h |
| timme | medel, min, max, sista, antal per timme (UTC) | 30 dygn |
| dygn | samma 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.