ISO 19650-3 shifts the frame from project delivery to asset operation. The Asset Information Model is defined as the persistent body of information required to support the management, maintenance, and operation of an asset throughout its operational life. The critical word is persistent. The PIM is a transient accumulation — it grows during the project and is handed over at completion. The AIM is the enduring record. It does not sit in a project folder that gets archived when the contractor demobilises. It is the live, queryable data layer that the asset owner, the facilities manager, and increasingly the autonomous maintenance agent interact with for the remaining decades of the asset's service life.
The second image makes the AIM tangible. Each labelled component — Roof Panel Glass, Support Column Recycled Plastic, Digital Display LCD, LED Luminaire, Foundation Pole Concrete — is not an annotation on a drawing. It is a discrete, addressable asset record. The label is a human-readable rendering of a structured data object: a JSON document with typed fields for classification code, material specification, maintenance interval, warranty expiry, supplier reference, and sensor binding endpoint. The ISO 19650 data schema cylinder at the bottom of the image is not a conceptual metaphor. It represents a literal schema commitment — a database with a defined structure that every component record must conform to before it is accepted into the AIM.
Facilities management data requirements per component are specific and non-negotiable. The Roof Panel Glass needs a maintenance interval (cleaning cycle in days), a material spec (toughened laminated glass to BS EN 12150), a warranty expiry date, a supplier reference for replacement procurement, and optionally a sensor binding point for a structural deflection monitor. The LED Luminaire needs a maintenance interval (lamp replacement cycle), a lux output specification, a warranty period, a supplier reference, and a sensor endpoint for real-time lux telemetry. The Foundation Pole Concrete needs a maintenance interval (inspection cycle), a concrete mix class (C40/50 to BS EN 206), a design life, and a corrosion monitoring endpoint. Each component is a typed record; the AIM is the collection of those records under a unified schema.
Pydantic makes this schema executable. A Pydantic model is not a documentation exercise — it is a runtime validation contract. Define an `AssetComponent` model with fields typed as `str`, `int`, `date`, `Optional[HttpUrl]`, and every record ingested into the AIM is validated at write time. Malformed data — a missing classification code, a maintenance interval encoded as a string instead of an integer, a warranty date in the wrong format — is rejected before it enters the database. The schema is the quality gate, and it runs automatically on every write.
```python
# aim_model.py — Pydantic AIM schema
# AssetRecord and AssetComponent models with ISO 19650-aligned fields
# Includes from_step_json() classmethod for ingesting step_parser output
from datetime import date
from typing import Optional
from pydantic import BaseModel, HttpUrl
class AssetComponent(BaseModel):
component_id: str
classification_code: str # Uniclass 2015
material_spec: str # BS EN reference
maintenance_interval_days: int
warranty_expiry: date
supplier_reference: Optional[str] = None
sensor_endpoint: Optional[HttpUrl] = None
class AssetRecord(BaseModel):
asset_identifier: str
asset_name: str
components: list[AssetComponent]
schema_version: str = "1.0"
@classmethod
def from_step_json(cls, step_data: dict, fm_data: dict) -> "AssetRecord":
components = []
for name, props in step_data.items():
fm = fm_data.get(name, {})
components.append(AssetComponent(
component_id=name,
classification_code=fm.get("classification", ""),
material_spec=fm.get("material", ""),
maintenance_interval_days=fm.get("interval", 365),
warranty_expiry=fm.get("warranty", date.today()),
))
return cls(
asset_identifier=step_data.get("_id", "unknown"),
asset_name=step_data.get("_name", "Unnamed"),
components=components,
)
```
The Gantt-style chart projects the maintenance schedule across all AIM components over a five-year horizon. Each bar represents a component's recurring maintenance cycle, derived directly from the `maintenance_interval_days` field in the AIM record. This is not a manually created FM schedule — it is a computed artefact, regenerated on demand from the data.
## The Asset Information Model (AIM): The Operational Record That Lasts Decades
ISO 19650-3 shifts focus from project delivery to asset operation. The Asset Information Model is the persistent body of data required to manage, maintain, and operate an asset throughout its service life—potentially 30, 50, or more years. The key word is persistent. The PIM grows during the project and is handed over at completion; it's temporary. The AIM is the enduring record that the asset owner, facilities manager, and automated maintenance systems interact with for the entire operational life.
The labeled bus stop diagram makes the AIM tangible. Each labeled component—Roof Panel Glass, Support Column Recycled Plastic, Digital Display LCD, LED Luminaire, Foundation Pole Concrete—isn't an annotation on a drawing. It's a discrete, addressable asset record. The label is a human-readable rendering of a structured JSON object with typed fields for classification code, material specification, maintenance interval, warranty expiry, supplier reference, and sensor binding endpoint. The ISO 19650 schema cylinder at the bottom isn't a metaphor; it represents an actual database schema that every component record must conform to.
Facilities management data per component is specific and non-negotiable. Roof Panel Glass needs: a cleaning maintenance interval (how often, in days), a material specification (toughened laminated glass to BS EN 12150), warranty expiry date, supplier contact for replacement, and optionally a sensor endpoint for a structural monitoring device. LED Luminaire needs: lamp replacement interval, lux output specification, warranty period, supplier reference, and a sensor endpoint for real-time brightness telemetry. Foundation Pole Concrete needs: inspection interval, concrete mix class (C40/50 to BS EN 206), design life, and a sensor endpoint for corrosion monitoring. Each component is a typed record; the AIM is the collection under a unified schema.
Pydantic (a Python data validation tool) makes this schema executable. It's not documentation—it's a runtime validation contract. Define an `AssetComponent` model with typed fields (`str`, `int`, `date`, `URL`), and every record written to the AIM is validated automatically. Malformed data—a missing classification code, a maintenance interval as text instead of a number, a warranty date in the wrong format—is rejected before it enters the database. The schema is the quality gate, running automatically on every write.
```python
# aim_model.py — Pydantic AIM schema
# AssetRecord and AssetComponent models with ISO 19650-aligned fields
# Includes from_step_json() classmethod for ingesting step_parser output
from datetime import date
from typing import Optional
from pydantic import BaseModel, HttpUrl
class AssetComponent(BaseModel):
component_id: str
classification_code: str # Uniclass 2015
material_spec: str # BS EN reference
maintenance_interval_days: int
warranty_expiry: date
supplier_reference: Optional[str] = None
sensor_endpoint: Optional[HttpUrl] = None
class AssetRecord(BaseModel):
asset_identifier: str
asset_name: str
components: list[AssetComponent]
schema_version: str = "1.0"
@classmethod
def from_step_json(cls, step_data: dict, fm_data: dict) -> "AssetRecord":
components = []
for name, props in step_data.items():
fm = fm_data.get(name, {})
components.append(AssetComponent(
component_id=name,
classification_code=fm.get("classification", ""),
material_spec=fm.get("material", ""),
maintenance_interval_days=fm.get("interval", 365),
warranty_expiry=fm.get("warranty", date.today()),
))
return cls(
asset_identifier=step_data.get("_id", "unknown"),
asset_name=step_data.get("_name", "Unnamed"),
components=components,
)
```
A Gantt-style chart projects the maintenance schedule across all components over five years. Each bar represents a component's recurring maintenance cycle, derived directly from the `maintenance_interval_days` field. This isn't a manually created schedule; it's computed automatically from the data every time.
## Asset Information Model: The Living Operational Record
**The Shift in Perspective**: ISO 19650-3 moves from project delivery (PIM) to asset operation (AIM). The PIM is transient—it grows during construction and is handed over at completion. The AIM is persistent—it is the live, queryable data layer that asset owners, facilities managers, and autonomous agents interact with for the remaining decades of the asset's operational life.
**Operational Structure**: Each component is a discrete, typed JSON record: Roof Panel Glass (toughened laminated glass per BS EN 12150, cleaning cycle 90 days, warranty expires 2034-Q3, sensor-bound for structural deflection); LED Luminaire (lux output 250 cd/m², lamp replacement cycle 180 days, real-time telemetry endpoint); Foundation Pole Concrete (C40/50 concrete per BS EN 206, inspection cycle 365 days, corrosion monitoring sensor). The AIM is the collection of these records under a unified schema enforced by Pydantic at write time.
**The Quality Mechanism**: Schema enforcement at runtime means malformed data—missing classification codes, maintenance intervals as strings instead of integers, warranty dates in wrong format—is rejected before it enters the database. The schema becomes the quality gate. Every write is validated; every record entering the AIM is certified conformant.
**Strategic Impact**: A computed maintenance schedule regenerated on demand from `maintenance_interval_days` fields replaces manual FM spreadsheets. Predictive capital planning—warranty expiry alerts, maintenance clustering, lifecycle cost projection—flows from validated component-level data. Sensor binding endpoints enable threshold-based work order generation, turning reactive maintenance into data-driven operations.