
Part 1 exposes the semantic chasm between BIM, ERP and shop-floor data, defining multi-dimensional data planes and a reference architecture for cross-domain conversions and analytics in heavy industry at scale.
Most heavy-industry enterprises are not suffering from a lack of data or connectivity; they are suffering from Cross-Domain Entropic Misalignment ; a deep, structural mismatch between how their core systems represent reality.
BIM data models the world as a largely static, object-oriented 3D spatial hierarchy: elements, spaces, systems and assemblies anchored in geometry and topology. ERP, by contrast, models the world as transactional, row-oriented ledgers: journal entries, orders, cost lines and master data records optimized for financial integrity and auditability.
Shop-floor systems: MES, SCADA, PLCs, historians and IoT platforms see the world as continuous, high-velocity scalar time-series arrays, often minimally contextualized beyond tag names and equipment IDs.
The fundamental blocker is not “missing integrations,” but that these three representational planes 3D object hierarchies, relational ledgers and streaming time-series are semantically orthogonal and rarely reconciled into a coherent multi-dimensional data plane.
Dropping an AI agent blindly onto these un-reconciled layers almost guarantees severe semantic drift in production: models infer patterns on BIM features that are never joined to financial reality, or on OT signals that are detached from actual assets, contracts or work packages.
To overcome Cross-Domain Entropic Misalignment, you need a reference architecture that explicitly bridges these structural abstractions harmonising schemas, resolving entities and building a semantic backbone that AI and analytics can safely navigate across BIM, ERP and shop-floor domains.
BIM–ERP integration has been discussed for years, but largely remains limited to narrow integrations (e.g., cost codes, basic quantity take-offs) compared to ERP’s maturity in other domains.
BIM evolved around design and lifecycle of physical assets, while ERP evolved around business processes, finance and resource planning, yet both aim to reconcile scattered project and asset information.
Research highlights persistent blockers: semantic mismatches (“project,” “asset,” “activity” mean different things in different systems), inconsistent IDs, and lack of robust mappings between BIM entities (IFC elements, spaces, systems) and ERP concepts (WBS, cost center, material code, work order).
When you add shop-floor systems (MES, SCADA, historians, IoT gateways) that are optimized for real-time control, not analytics, the integration challenge becomes multidimensional.

In a BIM–ERP–OT context, “AI-ready” data has specific, testable properties, not just a buzzword label.
AI-ready data is:
Systematic reviews of BIM and IFC data for AI show that the industry is at an “intermediate” readiness level, mainly because time-series support, geometric feature extraction and toolchains to convert IFC into ML-friendly data structures are still immature.
Despite differing jargon and tools, construction, automotive and manufacturing share similar data integration patterns.
In each case, success depends on a cross-domain semantic backbone and a cloud-native data platform that respects OT constraints while enabling at-scale analytics.

The target architecture is not “just” a data platform : it is an Edge-to-Cloud Semantic Data Plane that sits between BIM, ERP, shop-floor systems and all downstream consumers, enforcing deterministic semantics at ingress.
Rather than simply aggregating data, this plane acts as a Deterministic Ingress Pipeline that converts non-aligned physical and transactional inputs 3D BIM objects, ERP ledger rows and OT time-series tags into unified, versioned semantic models before any analytics or feature extraction pipelines run.
Conceptually, the architecture still has five layers, but each layer is explicitly part of the semantic data plane:
At the edge, we have heterogeneous producers:
These systems remain vendor- and domain-specific; the semantic data plane does not attempt to replace them but to normalize their outputs.
The ingress layer is where raw payloads are intercepted, normalized and mapped into semantic coordinates:
In other words, ingress is not “dump whatever you have to the lake”; it is a deterministic, rule-driven transformation that aligns SCADA tags, BIM element IDs and ERP keys to canonical asset, location, work package and event identities as they cross the boundary into the semantic plane.
Within the cloud lakehouse, the semantic data plane is materialized as:
This layer is where Cross-Domain Entropic Misalignment is actively countered: object-oriented BIM, ledger-oriented ERP and time-series OT are fused into semantically consistent multi-dimensional data planes.
On top of the harmonised planes:
Finally, the data plane feeds semantic-aware consumers:
By treating the architecture as an Edge-to-Cloud Semantic Data Plane with deterministic ingress, instead of a generic data platform, you ensure that every SCADA tag, BIM object and ERP transaction is semantically grounded before it ever reaches an AI model, dramatically reducing semantic drift and deployment failures in production.
Instead of a SHA-256 hash, we use UUIDv5 for deterministic, namespace-based asset identifiers: the same (namespace, name) pair always yields the same UUID, which is ideal for multi-language, multi-pipeline environments.
We then enforce integrity with Delta Lake constraints (NOT NULL, CHECK) to prevent partial or malformed identities from entering the semantic plane.
Unit-of-measure (UOM) normalization is moved out of hardcoded when() chains into a centralized, queryable UOM Ontology table:
import uuid
from pyspark.sql import functions as F
from pyspark.sql.types import StringType, DoubleType
# Bronze: raw ERP assets and OT telemetry
bronze_erp_assets = spark.read.table("bronze.erp_assets")
bronze_ot_telemetry = spark.read.table("bronze.ot_telemetry")
# Fixed namespace UUID for ERP asset identities (generated once)
ERP_ASSET_NAMESPACE = uuid.UUID("4bdbe8ec-5cb5-11ea-bc55-0242ac130003")
@F.udf(returnType=StringType())
def uuid_v5_erp_asset(plant_code: str, erp_asset_code: str) -> str:
if plant_code is None or erp_asset_code is None:
return None # rejected by Delta NOT NULL constraint downstream
name = f"{plant_code}/{erp_asset_code}"
return str(uuid.uuid5(ERP_ASSET_NAMESPACE, name))
# Silver: cleaned ERP assets with deterministic namespace-based IDs
silver_assets = (
bronze_erp_assets
.withColumn("asset_id",
uuid_v5_erp_asset(F.col("plant_code"),
F.col("erp_asset_code")))
.withColumn("source_system", F.lit("ERP"))
.withColumn("is_active",
F.when(F.col("status") == F.lit("ACTIVE"), F.lit(True))
.otherwise(F.lit(False)))
)
silver_assets.write.mode("overwrite").saveAsTable("silver.asset_master")
# UOM Ontology: raw_unit -> canonical_unit + conversion_factor
uom_ontology = spark.read.table("silver.uom_ontology")
# Schema example:
# raw_unit STRING, canonical_unit STRING, conversion_factor_to_canonical DOUBLE
# Silver: cleaned OT telemetry, normalized timestamps and units via ontology
silver_telemetry = (
bronze_ot_telemetry.alias("t")
.withColumn("timestamp_utc", F.to_utc_timestamp("ts", "UTC"))
.join(
uom_ontology.alias("u"),
F.col("t.unit") == F.col("u.raw_unit"),
"left"
)
.withColumn("canonical_unit",
F.coalesce(F.col("u.canonical_unit"), F.col("t.unit")))
.withColumn("value_std",
F.when(F.col("u.conversion_factor_to_canonical").isNotNull(),
F.col("t.value") * F.col("u.conversion_factor_to_canonical"))
.otherwise(F.col("t.value")))
)
silver_telemetry.write.mode("overwrite").saveAsTable("silver.telemetry")
# Gold: asset-health features (example)
gold_asset_health = (
silver_telemetry.alias("t")
.join(silver_assets.alias("a"),
F.col("t.asset_code") == F.col("a.erp_asset_code"), "inner")
.groupBy("a.asset_id")
.agg(
F.max("t.timestamp_utc").alias("last_seen_ts"),
F.avg("t.value_std").alias("avg_temp_c"),
F.stddev("t.value_std").alias("std_temp_c")
)
)
gold_asset_health.write.mode("overwrite").saveAsTable("gold.asset_health_features")
To make the silver layer a semantic gate, you can add constraints on silver.asset_master and silver.telemetry:
-- Asset master constraints: enforce identity and basic semantics
ALTER TABLE silver.asset_master
ADD CONSTRAINT chk_asset_id_not_null CHECK (asset_id IS NOT NULL);
ALTER TABLE silver.asset_master
ADD CONSTRAINT chk_status_valid CHECK (
status IN ('ACTIVE', 'INACTIVE', 'RETIRED')
);
-- Telemetry constraints: ensure canonical_unit/value_std populated
ALTER TABLE silver.telemetry
ADD CONSTRAINT chk_canonical_unit_not_null CHECK (
canonical_unit IS NOT NULL
);
ALTER TABLE silver.telemetry
ADD CONSTRAINT chk_value_std_not_null CHECK (
value_std IS NOT NULL
);
This example shows how canonical IDs and harmonized units form the basis for AI-ready features, independent of ERP or OT vendor.
Your architecture must satisfy three fundamental goals:
1. Interoperability
2. Semantic alignment and entity resolution
3. Scalability and AI-readiness
In Part 2, we will go deep on canonical models, schema harmonisation and entity resolution the core semantic work that makes AI-ready architectures sustainable.