Files
boc/INFRASTRUCTURE_OBJECT_MODEL.md
T

725 lines
18 KiB
Markdown
Raw Normal View History

# 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