- Add NFC ePassport roadmap (ICAO 9303, eIDAS) - Add TensorFlow.js edge face detection (BlazeFace) - Add structured audit logger (GDPR-compliant) - Risk scoring support Part of KYC Apple Native UX v1.1.0
18 KiB
Infrastructure Object Model (IOM) v1.0
Ett universellt språk för fysisk infrastruktur — från observation till kunskapsgraf. Status: Aktiv utveckling | Senast uppdaterad: 2026-06-26 Produktionspaus: HÄVD 2026-06-25
Sammanfattning
IOM är en tio-lagers modell för att representera, identifiera, observera och analysera fysisk infrastruktur. Modellen är inspirerad av industriella artikelnummeringssystem (Volkswagen-koncernen) och anpassad för den byggda miljön.
Kärnprincip: Objektet förändras aldrig. Endast observationerna förändras.
Lager 1 — Objektshierarkin (Taxonomi)
Struktur
Domän
├── System
│ ├── Delsystem
│ │ ├── Objekt
│ │ │ ├── Komponent
│ │ │ │ └── Detalj
Exempel: Transport
TRN (Transport)
├── BRG (Broar)
│ ├── CBR (Betongbro)
│ │ ├── ABT (Brofäste)
│ │ │ ├── FND (Fundament)
│ │ │ ├── DRN (Dränering)
│ │ │ └── BLT (Bultförband)
│ │ ├── DCK (Brodäck)
│ │ │ ├── SUR (Betongyta)
│ │ │ ├── EXP (Expansionsfog)
│ │ │ └── RAL (Räcke)
│ │ └── PIE (Brobane)
│ │ ├── SUB (Påle)
│ │ └── CAP (Pålhuv)
Exempel: Energi
ENE (Energi)
├── DST (Distribution)
│ ├── TRS (Transformatorstation)
│ │ ├── TRN (Transformator)
│ │ ├── FND (Fundament)
│ │ ├── FNC (Stängsel)
│ │ │ ├── GAT (Grind)
│ │ │ └── SGN (Skyltning)
│ │ └── BSH (Busset)
│ ├── EVC (Laddinfrastruktur)
│ │ ├── CHA (Laddstation)
│ │ │ ├── FND (Fundament)
│ │ │ ├── POL (Stolpe)
│ │ │ ├── DSP (Display)
│ │ │ ├── RFID (RFID-läsare)
│ │ │ ├── TRM (Kortterminal)
│ │ │ ├── CBL (CCS-kabel)
│ │ │ ├── T2C (Type2-kabel)
│ │ │ ├── CAM (Kamera)
│ │ │ ├── LGT (Belysning)
│ │ │ ├── SGN (Skylt)
│ │ │ └── BOL (Skyddspollare)
│ │ └── CAB (Kabelskåp)
Kodstandard
- 3 bokstäver per nivå
- Versaler (A-Z)
- Unika inom förälder
- Engelska förkortningar (industristandard)
Lager 2 — Global Object ID (GOID)
Format
[DOM]-[SYS]-[SUB]-[OBJ]-[COMP]-[DET]-[SEQ]
Exempel
| ID | Tolkning |
|---|---|
TRN-BRG-ABT-CON-001 |
Transport → Bro → Brofäste → Betong → Instans 1 |
ENE-EVC-CHA-AC22-003 |
Energi → Laddinfra → Laddstation → AC 22kW → Gen 3 |
TRN-ROD-SGN-WAR-2847 |
Transport → Väg → Varningsskylt → Vägarbete → Instans 2847 |
Regler
- Permanent: ID ändras aldrig efter tilldelning
- Unikt globalt: Ingen kollision mellan domäner
- Sekvens: Löpnummer inom lägsta nivå
- Revision: Hanteras separat (se Lager 6)
Lager 3 — Objektets DNA (Metadata)
Obligatoriska fält
| Fält | Typ | Exempel |
|---|---|---|
goid |
string | "TRN-BRG-ABT-CON-001" |
object_type |
enum | "abutment" |
material |
array | ["concrete_c35", "reinforcement_b500b"] |
dimensions |
object | {length: 12.5, width: 3.2, height: 2.1, unit: "m"} |
manufacturer |
string | "Skanska Concrete AB" |
manufacturing_year |
integer | 2018 |
installation_date |
date | "2019-03-15" |
design_lifespan |
integer (år) | 50 |
owner |
entity-ref | "kommun:stockholm" |
maintainer |
entity-ref | "entreprenor:ncc" |
standard |
string | "Eurocode 2" |
certification |
string | "CE-markt, EN 206" |
Materialkatalog (urval)
concrete:
- C20/25
- C30/37
- C35/45
- C40/50
steel:
- B500B
- S355
- galvanised_steel
composite:
- carbon_fiber
- glass_fiber
- aramid
timber:
- oak
- pine
- larch
- glulam
stone:
- granite
- marble
- sandstone
Lager 4 — Komponentstruktur (BOM)
Koncept: Infrastructure Bill of Materials
Varje objekt har en komplett komponentlista — precis som inom fordonsindustrin.
Exempel: Gatlykta
goid: "TRN-LGT-STR-LED-0001"
name: "Gatlykta Drottningholm"
components:
- goid: "TRN-LGT-FND-CON-0001"
name: "Fundament"
quantity: 1
unit: "st"
- goid: "TRN-LGT-BLT-GAL-0001"
name: "Förankringsbultar M24"
quantity: 4
unit: "st"
- goid: "TRN-LGT-POL-GAL-0001"
name: "Stolpe 6m"
quantity: 1
unit: "st"
- goid: "TRN-LGT-COV-ALU-0001"
name: "Kopplingslucka"
quantity: 1
unit: "st"
- goid: "TRN-LGT-ELC-COP-0001"
name: "Elanslutning"
quantity: 1
unit: "st"
- goid: "TRN-LGT-FUS-STD-0001"
name: "Säkring"
quantity: 1
unit: "st"
- goid: "TRN-LGT-ARM-LED-0001"
name: "Armatur LED"
quantity: 1
unit: "st"
- goid: "TRN-LGT-DRV-LED-0001"
name: "Drivdon"
quantity: 1
unit: "st"
- goid: "TRN-LGT-SNS-PHO-0001"
name: "Fotocell"
quantity: 1
unit: "st"
- goid: "TRN-LGT-SGN-REF-0001"
name: "Märkskylt"
quantity: 1
unit: "st"
Regler
- Varje komponent är ett eget objekt med eget GOID
- Komponenter kan ha egna komponenter (nästling)
- Kvantitet och enhet specificeras alltid
- Komponentens livslängd kan skilja sig från förälderns
Lager 5 — Standardiserade egenskaper
Grundschema (alla objekt)
| Egenskap | Typ | Beskrivning |
|---|---|---|
material |
array | Materialkomposition |
dimension |
object | Längd, bredd, höjd, diameter |
color |
string | RAL-kod eller beskrivning |
geometry |
geojson | Punkt, linje eller polygon |
location |
object | {lat, lng, elevation, accuracy} |
orientation |
float | Grader från nord (0-360) |
condition |
integer 1-5 | Skickgradering |
risk_level |
integer 1-5 | Sammanlagd risk |
age_years |
integer | Beräknad ålder |
function_status |
enum | "operational", "degraded", "failed", "unknown" |
accessibility |
enum | "public", "restricted", "private" |
Skickgradering (1-5)
| Nivå | Beskrivning | Åtgärdstid |
|---|---|---|
| 1 | Utmärkt | Ingen åtgärd |
| 2 | Gott | Planerat underhåll |
| 3 | Tillfredsställande | Underhåll inom 12 mån |
| 4 | Dåligt | Åtgärd inom 3 mån |
| 5 | Kritiskt | Omedelbar åtgärd |
Lager 6 — Observationer
Kärnprincip
Objektet förändras aldrig. Observationerna förändras.
Struktur
observation:
id: "OBS-2026-0012847"
timestamp: "2026-06-26T09:15:00Z"
observer: "zoomer:anna_k" # eller sensor, ai, etc.
object_goid: "TRN-BRG-ABT-CON-001"
# Vad observerades
findings:
- type: "crack"
code: "1300" # Se Lager 7
description: "Spricka i betong"
measurement: "3 mm"
location: "northeast_corner"
confidence: 0.98 # AI-konfidens
- type: "corrosion"
code: "1100"
description: "Ytrost på armering"
measurement: "15% coverage"
confidence: 0.87
# Media
media:
- type: "image"
url: "https://.../img_2847.jpg"
timestamp: "2026-06-26T09:15:03Z"
geotag: {lat: 59.3293, lng: 18.0686}
- type: "depth_map"
url: "https://.../depth_2847.bin"
# Kontext
weather:
temperature: 22
conditions: "sunny"
# AI-analys
ai_analysis:
model: "infrastructure-v3.2"
overall_condition: 3
recommended_action: "schedule_inspection"
next_observation_due: "2026-09-26"
Historikexempel
object: "TRN-BRG-ABT-CON-001"
observations:
- id: "OBS-2027-004921"
date: "2027-08-14"
findings: [{type: "crack", measurement: "3 mm", confidence: 0.98}]
condition: 3
- id: "OBS-2028-006633"
date: "2028-03-22"
findings:
- {type: "crack", measurement: "5 mm", confidence: 0.95}
- {type: "corrosion", measurement: "light", confidence: 0.82}
- {type: "water_leakage", confidence: 0.91}
condition: 4
- id: "OBS-2030-009104"
date: "2030-06-10"
findings: [{type: "repaired", confidence: 1.0}]
condition: 2
notes: "Renoverad: spricka injekterad, armering rengjord och skyddad"
Lager 7 — Felklassificering
Hierarkisk kodstruktur
1000 — Korrosion
├── 1100 — Ytrost
├── 1200 — Genomrost
└── 1250 — Galvanisk korrosion
1300 — Betongspricka
├── 1310 — Plastisk krympning
├── 1320 — Temperaturspricka
└── 1330 — Lastspricka
1400 — Påkörningsskada
├── 1410 — Ytskada
├── 1420 — Deformation
└── 1430 — Genomskjutning
1500 — Saknad komponent
├── 1510 — Stöld
├── 1520 — Ej installerad
└── 1530 — Avlägsnad
1600 — Lutning / Deformation
├── 1610 — Sättning
├── 1620 — Böjning
└── 1630 — Vridning
1700 — Vibration
├── 1710 — Mekanisk
└── 1720 — Aerodynamisk
1800 — Vegetation
├── 1810 — Blockerande
├── 1820 — Rotinträngning
└── 1830 — Fuktbevarande
1900 — Blockering
├── 1910 — Fysisk
├── 1920 — Digital
└── 1930 — Organisk
Användning
- AI väljer kod, inte beskrivning
- Mänsklig granskare kan justera
- Koder är flerspråkiga (samma kod, lokal beskrivning)
- Historik spåras per kod
Lager 8 — Riskmodell
Riskdimensioner
| Dimension | Skala | Exempel: Livboj saknas |
|---|---|---|
safety |
0-10 | 10 (direkt livsfara) |
economic |
0-10 | 2 (låg kostnad) |
environmental |
0-10 | 0 (ingen miljöpåverkan) |
operational |
0-10 | 1 (minimal driftpåverkan) |
legal |
0-10 | 8 (regleringsbrott) |
aesthetic |
0-10 | 3 (liten visuell påverkan) |
Sammanlagd risk
def calculate_risk(observation, object_context):
"""
Viktad summa baserad på objektstyp och miljö.
En brofästes säkerhetsrisk väger tyngre än en gatlyktas.
"""
weights = object_context.risk_weights # Definierad per objekttyp
total = sum(
observation.risk_scores[dim] * weights[dim]
for dim in RISK_DIMENSIONS
) / sum(weights.values())
return min(10, max(0, total))
Riskmatris (exempel)
| Objekt | Säkerhet | Ekonomi | Miljö | Drift | Juridik | Estetik | Total |
|---|---|---|---|---|---|---|---|
| Brofäste, spricka 5mm | 8 | 6 | 2 | 5 | 4 | 1 | 5.2 |
| Gatlykta, trasig | 2 | 3 | 1 | 2 | 1 | 4 | 2.2 |
| Laddstation, kabel skadad | 9 | 5 | 1 | 7 | 6 | 2 | 6.3 |
Lager 9 — Relationer (Kunskapsgraf)
Relationstyper
relations:
# Fysiska
connected_to: "Ansluten till"
part_of: "Del av"
contains: "Innehåller"
supports: "Bär upp"
crosses: "Korsar"
adjacent_to: "Gränsar till"
# Logiska
depends_on: "Beror på"
replaces: "Ersätter"
compatible_with: "Kompatibel med"
# Organisatoriska
owned_by: "Ägs av"
maintained_by: "Underhålls av"
operated_by: "Driftsätts av"
insured_by: "Försäkrad av"
# Temporala
preceded_by: "Föregicks av"
succeeded_by: "Efterträddes av"
Exempel: Bro som kunskapsgraf
object: "TRN-BRG-ABT-CON-001"
relations:
- type: "part_of"
target: "TRN-BRG-CON-001"
target_name: "Bromöllan bro"
- type: "connected_to"
target: "TRN-ROD-ASP-001"
target_name: "Europaväg 6"
- type: "crosses"
target: "ENV-WAT-RIV-001"
target_name: "Rönne å"
- type: "owned_by"
target: "org:trafikverket"
- type: "maintained_by"
target: "org:skanska"
- type: "contains"
target: "TRN-BRG-ABT-DRN-001"
target_name: "Brofäste dränering"
Grafquery (exempel)
// Hitta alla objekt som underhålls av samma entreprenör
// och har risknivå > 7
MATCH (o:Object)-[:maintained_by]->(e:Entity {name: "Skanska"})
MATCH (o)<-[:observed_on]-(obs:Observation)
WHERE obs.risk_level > 7
RETURN o.goid, o.name, obs.risk_level, obs.date
ORDER BY obs.risk_level DESC
Lager 10 — Digital tvilling
Koncept
Varje stad blir en levande graf där:
- Noder = objekt (Lager 1-5)
- Kanter = relationer (Lager 9)
- Tidsdimension = observationer (Lager 6)
- Egenskaper = tillstånd (Lager 5, 7, 8)
Hierarkisk vy
Stad (Stockholm)
└── Transportnät
└── Broar (47 st)
└── Bromöllan bro
└── Brofäste #1 (TRN-BRG-ABT-CON-001)
├── Betong: C35
├── Spricka (OBS-2028-006633)
│ ├── 5 mm
│ ├── AI confidence: 95%
│ └── Risk: 5.2
├── Renovering (OBS-2030-009104)
│ └── Status: reparerad
└── Rekommendation
└── Nästa inspektion: 2031-06-10
Frågetyper som möjliggörs
-
Tillståndsfrågor
- "Visa alla broar i dåligt skick"
- "Hitta objekt med korrosionsrisk > 7"
-
Prediktiva frågor
- "Vilka objekt kommer troligen behöva åtgärd inom 12 månader?"
- "Trend för sprickbredd i brofästen byggda 2015-2020"
-
Kontradiktionsfrågor
- "Kommunen rapporterar 12 broar i gott skick — visa observationer"
- "Trafikverket säkerhetsklass 3 — visa objekt med risk > 8"
-
Geografiska frågor
- "Alla objekt inom 500m av väg E6 med underhållsbehov"
- "Värmekarta: korrosionsrisk per kommun"
-
Ekonomiska frågor
- "Uppskattad underhållskostnad nästa 5 år"
- "Avskrivningsvärde för objekt byggda 2000-2010"
Integration med quiXzoom
Dataflöde
Zoomer tar bild
↓
AI klassificerar → Felkod (Lager 7)
↓
Objekt identifieras → GOID (Lager 2) eller skapas
↓
Observation skapas → Lager 6
↓
Risk beräknas → Lager 8
↓
Relationer uppdateras → Lager 9
↓
Digital tvilling uppdateras → Lager 10
Exempel: Mission "Smutsiga skyltfönster"
-
Före observation
- Objekt:
COM-FAC-WIN-GLA-2847(existerar eller skapas) - Metadata:
{material: "glass", dimensions: {w: 4.2, h: 2.1}}
- Objekt:
-
Observation
OBS-2026-0012847:{type: "dirt_accumulation", code: "2100", confidence: 0.94}- Bilder, GPS, timestamp
-
Efter observation
- Objektets tillstånd:
condition: 3 - Risk:
aesthetic: 7(påverkar butikens image) - Relation:
owned_by → "org:hm_stores" - Nästa observation:
+30 dagar
- Objektets tillstånd:
Integration med aamos-ledger
Objekt som tillgångar
# IOM → Ledger
asset:
goid: "TRN-BRG-ABT-CON-001"
account: "1220" # Anläggningstillgångar
acquisition_value: 4500000 # SEK, men visas som USD i rapporter
depreciation_rate: 2 # 50 år
annual_depreciation: 90000
# Kopplat till IOM
object_type: "abutment"
installation_date: "2019-03-15"
design_lifespan: 50
# Bokföring
transactions:
- date: "2019-03-15"
type: "acquisition"
amount: 4500000
- date: "2026-12-31"
type: "depreciation"
amount: 90000
- date: "2030-06-10"
type: "maintenance"
amount: 350000
note: "Sprickreparation"
Observationer som bokföringshändelser
| Observation | Bokföringshändelse |
|---|---|
| Renovering | Underhållskostnad (konto 6110) |
| Komponentbyte | Nyanskaffning eller underhåll |
| Skada (försäkringsärende) | Försäkringsersättning |
| Risknivå > 8 | Avskrivningsprövning |
| Objekt avvecklat | Avyttring eller skrotning |
Bilaga A: Domänkoder (urval)
| Kod | Domän | Beskrivning |
|---|---|---|
| TRN | Transport | Vägar, järnvägar, broar, tunnlar |
| ENE | Energi | El, gas, värme, laddinfrastruktur |
| TEL | Telekom | Master, kablar, fiber, 5G |
| VAS | Vatten & Avlopp | Ledningar, pumpstationer, reningsverk |
| HAM | Hamn & Sjöfart | Kajer, farleder, bouyer |
| TRS | Tåg & Spår | Räls, kontaktledning, signaler |
| OFF | Offentligt | Pumpar, nödtelefoner, toaletter |
| BEL | Belysning | Gatubelysning, trafiksignaler |
| BYG | Byggnad | Fasader, tak, entréer, fönster |
| KRI | Kritisk infra | Försvar, sjukhus, datacenter |
Bilaga B: JSON-Schema (observation)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "IOM Observation",
"type": "object",
"required": ["id", "timestamp", "object_goid", "findings"],
"properties": {
"id": {"type": "string", "pattern": "^OBS-[0-9]{4}-[0-9]{7}$"},
"timestamp": {"type": "string", "format": "date-time"},
"observer": {"type": "string"},
"object_goid": {"type": "string", "pattern": "^[A-Z]{3}(-[A-Z]{3})+-[0-9]+$"},
"findings": {
"type": "array",
"items": {
"type": "object",
"required": ["type", "code"],
"properties": {
"type": {"type": "string"},
"code": {"type": "string", "pattern": "^[0-9]{4}$"},
"description": {"type": "string"},
"measurement": {"type": "string"},
"confidence": {"type": "number", "minimum": 0, "maximum": 1}
}
}
},
"media": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {"enum": ["image", "video", "depth_map", "thermal", "lidar"]},
"url": {"type": "string", "format": "uri"},
"timestamp": {"type": "string", "format": "date-time"}
}
}
},
"ai_analysis": {
"type": "object",
"properties": {
"model": {"type": "string"},
"overall_condition": {"type": "integer", "minimum": 1, "maximum": 5},
"recommended_action": {"type": "string"},
"next_observation_due": {"type": "string", "format": "date"}
}
}
}
}
Version
- Version: 1.0.0
- Datum: 2026-06-26
- Författare: Erik Svensson / Landvex
- Nästa granskning: 2026-07-26