# 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) ```yaml 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 ```yaml 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 ```yaml 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 ```yaml 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 ```python 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 ```yaml 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 ```yaml 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) ```cypher // 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 1. **Tillståndsfrågor** - "Visa alla broar i dåligt skick" - "Hitta objekt med korrosionsrisk > 7" 2. **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" 3. **Kontradiktionsfrågor** - "Kommunen rapporterar 12 broar i gott skick — visa observationer" - "Trafikverket säkerhetsklass 3 — visa objekt med risk > 8" 4. **Geografiska frågor** - "Alla objekt inom 500m av väg E6 med underhållsbehov" - "Värmekarta: korrosionsrisk per kommun" 5. **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" 1. **Före observation** - Objekt: `COM-FAC-WIN-GLA-2847` (existerar eller skapas) - Metadata: `{material: "glass", dimensions: {w: 4.2, h: 2.1}}` 2. **Observation** - `OBS-2026-0012847`: `{type: "dirt_accumulation", code: "2100", confidence: 0.94}` - Bilder, GPS, timestamp 3. **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` --- ## Integration med aamos-ledger ### Objekt som tillgångar ```yaml # 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) ```json { "$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