IAES Specification v2.0
Complete technical reference for the Industrial Asset Event Standard.
March 2026
1. Purpose
IAES defines how industrial asset signals, diagnoses, and maintenance intents are represented and transferred across heterogeneous operational systems.
IAES is not a product. It is a data contract. Any system — sensor platform, AI engine, CMMS, historian, or dashboard — can produce or consume IAES events without knowing the implementation details of the other side.
2. Principles
- Vendor neutrality — No dependency on SAP, PI System, Odoo, or any specific vendor.
- Legacy compatibility — Events map cleanly to CMMS, historians, SCADA, and IoT platforms.
- Event-oriented — Each object represents something that happened (measurement, diagnosis, intent).
- Complete traceability — Every event traces back to its origin via event_id, correlation_id, source_event_id.
- Extensibility — The data payload and metadata field allow new fields without breaking consumers.
3. Terminology
| Term | Definition |
|---|---|
| Event | A single occurrence: a measurement, a diagnosis, a maintenance intent, or a completion report. |
| Producer | Any system that creates IAES events (sensor platforms, AI engines, manual entry tools). |
| Consumer | Any system that receives and acts on IAES events (CMMS, dashboards, historians, ERPs). |
| Envelope | The common wrapper that every IAES event shares: spec_version, event_type, event_id, timestamps, asset identity, and the data payload. |
| Correlation | A shared correlation_id that links related events across the lifecycle (measurement → health → work order → completion). |
| Source | The source field identifying the originating system in dot-notation: vendor.system.subsystem. |
| Intent | A maintenance.work_order_intent event that recommends a maintenance action. It is not a work order — the consumer decides whether to create one. |
| Health Index | A normalized 0.0 – 1.0 score representing the overall health of an asset (1.0 = perfect, 0.0 = failed). |
| RUL | Remaining Useful Life. An estimate of how many days an asset can continue operating before failure. |
4. Common Envelope
Every IAES event is wrapped in a common envelope. The envelope carries identity, traceability, and routing information. The event-specific payload lives inside the data field.
{
"spec_version": "2.0",
"event_type": "asset.health",
"event_id": "uuid",
"correlation_id": "uuid",
"source_event_id": "uuid | null",
"batch_id": "string | null",
"timestamp": "RFC 3339",
"source": "vendor.system.subsystem",
"content_hash": "sha256_16char",
"asset": {
"asset_id": "string",
"asset_name": "string | null",
"plant": "string | null",
"area": "string | null"
},
"data": {}
}
Field Definitions
| Field | Type | Required | Description |
|---|---|---|---|
spec_version |
string |
Yes | IAES specification version. This release is "2.0"; each major’s envelope accepts that major’s versions and no others. |
dataschema |
URI |
No | Canonical URI of the schema the data payload was written against, following the CloudEvents attribute of the same name. Derivable from event_type, so both SDKs set it automatically for published types and omit it otherwise. Added in v1.4. |
event_type |
string |
Yes | Dot-notation event type, matching ^[a-z][a-z0-9_]*\.[a-z][a-z0-9_.]*$. Open: a producer MAY define its own in a namespace it controls, and a consumer MUST NOT error on one it does not recognise. The published types are the interoperability defaults, not the limit. |
event_id |
string (UUID v4) |
Yes | Unique identifier for this event. Generated by the producer. |
correlation_id |
string (UUID v4) |
Yes | Shared identifier that links related events in a chain (measurement → health → work order → completion). |
source_event_id |
string | null |
No | The event_id of the event that directly triggered this one. Null for the first event in a chain. |
batch_id |
string | null |
No | Optional identifier for grouping events that were produced together (e.g. a batch of measurements from one collection run). |
timestamp |
string (RFC 3339) |
Yes | When the event occurred. Must include timezone (preferably UTC). Example: 2026-03-08T14:32:00Z. |
source |
string |
Yes | Dot-notation identifier of the producing system: vendor.system.subsystem. Example: wertek.vibration.ai_engine. |
content_hash |
string |
Yes | First 16 characters of the SHA-256 hash of the canonical JSON data payload. Used for deduplication. |
asset |
object |
Yes | Asset identity block. Must contain at least asset_id. |
data |
object |
Yes | Event-specific payload. Structure depends on event_type. |
Asset Identity
The asset block identifies the target asset. Only asset_id is required; the remaining fields provide human-readable context and hierarchical location.
{
"asset": {
"asset_id": "PUMP-001",
"asset_name": "Main Cooling Water Pump",
"plant": "Plant A - Monterrey",
"area": "Cooling Tower Area"
}
}
5. Event Types
IAES v2.0 defines 7 event types organized into 3 domains: asset signals, maintenance actions, and sensor lifecycle.
asset.measurement v1.0
A single measurement reading from an asset. This is the most fundamental event type — it captures raw sensor data from vibration, temperature, current, pressure, or any other measurable quantity.
| Field | Type | Required | Description |
|---|---|---|---|
measurement_type |
string |
Yes | Type of measurement (e.g. vibration_velocity, temperature, current_rms, pressure). |
value |
number |
Yes | The measured value. |
unit |
string |
Yes | Unit of measurement (e.g. mm/s, °C, A, bar). |
sensor_id |
string |
No | Identifier of the sensor that took the measurement. |
location |
string |
No | Measurement location on the asset (e.g. bearing_drive_end, motor_frame). |
units_qualifier |
string |
No | Qualifier for the unit value (e.g. rms, peak, peak_to_peak). v1.2 |
sampling_rate_hz |
number |
No | Sampling rate in Hz used for the acquisition. v1.2 |
acquisition_duration_s |
number |
No | Duration of the acquisition window in seconds. v1.2 |
{
"spec_version": "2.0",
"event_type": "asset.measurement",
"event_id": "e7f1a2b3-c4d5-4e6f-8a9b-0c1d2e3f4a5b",
"correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"source_event_id": null,
"batch_id": null,
"timestamp": "2026-03-08T14:32:00Z",
"source": "wertek.vibration.collector",
"content_hash": "a3f8c1e2b4d6f790",
"asset": {
"asset_id": "PUMP-001",
"asset_name": "Main Cooling Water Pump",
"plant": "Plant A - Monterrey",
"area": "Cooling Tower Area"
},
"data": {
"measurement_type": "vibration_velocity",
"value": 4.2,
"unit": "mm/s",
"units_qualifier": "rms",
"sensor_id": "SENSOR-045",
"location": "bearing_drive_end",
"sampling_rate_hz": 25600,
"acquisition_duration_s": 2.0
}
}
asset.health v1.0
A health assessment for an asset. Produced by AI engines, rule-based systems, or human experts. Links to the measurement(s) that triggered it via source_event_id and correlation_id.
| Field | Type | Required | Description |
|---|---|---|---|
health_index |
number |
Yes | Normalized health score from 0.0 (failed) to 1.0 (perfect). |
anomaly_score |
number |
No | Anomaly detection score from 0.0 (normal) to 1.0 (highly anomalous). |
severity |
string |
Yes | One of: info, low, medium, high, critical. |
failure_mode |
string |
No | Detected failure mode from the taxonomy (see Appendix A). Example: bearing_inner_race. |
fault_confidence |
number |
No | Confidence in the failure mode classification, 0.0 to 1.0. |
rul_days |
number |
No | Estimated Remaining Useful Life in days. |
recommended_action |
string |
No | Human-readable recommended action. |
estimated_downtime_hours |
number |
No | Estimated downtime if the recommended action is taken. |
iso_13374_status |
string |
No | ISO 13374 health status level (see Appendix C). v1.2 |
iso_14224 |
object |
No | ISO 14224 classification object (see Appendix B). v1.2 |
condition_trend |
string |
No | Temporal trend of the condition: worsening, stable, or improving. IAES’s own values; the ISO 13374 attribution was withdrawn in 2.0. Used for incident lifecycle tracking (onset/escalation/recovery). v1.3 |
{
"spec_version": "2.0",
"event_type": "asset.health",
"event_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"source_event_id": "e7f1a2b3-c4d5-4e6f-8a9b-0c1d2e3f4a5b",
"batch_id": null,
"timestamp": "2026-03-08T14:32:05Z",
"source": "wertek.vibration.ai_engine",
"content_hash": "f7e6d5c4b3a29180",
"asset": {
"asset_id": "PUMP-001",
"asset_name": "Main Cooling Water Pump",
"plant": "Plant A - Monterrey",
"area": "Cooling Tower Area"
},
"data": {
"health_index": 0.16,
"anomaly_score": 0.92,
"severity": "critical",
"failure_mode": "bearing_inner_race",
"fault_confidence": 0.87,
"rul_days": 5,
"recommended_action": "Replace bearing immediately",
"estimated_downtime_hours": 4,
"iso_13374_status": "imminent_failure",
"iso_14224": {
"mechanism_code": "1.1",
"mechanism_label": "Mechanical wear",
"detection_method": "2",
"detection_label": "Condition monitoring"
}
}
}
maintenance.work_order_intent v1.0
A recommendation to create a maintenance work order. This is an intent, not a work order itself. The receiving CMMS decides whether to accept, modify, or reject it. This decoupling is fundamental to IAES — the AI or rule engine recommends, the CMMS decides.
| Field | Type | Required | Description |
|---|---|---|---|
title |
string |
Yes | Short title for the work order. |
description |
string |
No | Detailed description of the issue and recommended action. |
priority |
string |
Yes | One of: low, medium, high, emergency. |
recommended_due_days |
number |
No | Suggested deadline in days from now. |
triggered_by |
string |
No | What triggered this intent (e.g. ai_diagnosis, threshold_rule, manual). |
severity (in asset.health) describes the condition of the asset. priority (in work_order_intent) describes the urgency of the maintenance action. A high severity issue on a non-critical pump might only warrant a medium priority work order if a backup pump is available.
{
"spec_version": "2.0",
"event_type": "maintenance.work_order_intent",
"event_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"source_event_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"batch_id": null,
"timestamp": "2026-03-08T14:32:10Z",
"source": "wertek.vibration.ai_engine",
"content_hash": "d4e5f6a7b8c9d0e1",
"asset": {
"asset_id": "PUMP-001",
"asset_name": "Main Cooling Water Pump",
"plant": "Plant A - Monterrey",
"area": "Cooling Tower Area"
},
"data": {
"title": "Bearing failure predicted",
"description": "Inner race defect detected by AI diagnosis",
"priority": "emergency",
"recommended_due_days": 3,
"triggered_by": "ai_diagnosis"
}
}
maintenance.completion v1.1
Reports the completion (or cancellation/deferral) of a maintenance activity. Links back to the original work order via correlation_id and provides outcome data for reliability analytics.
| Field | Type | Required | Description |
|---|---|---|---|
status |
string |
Yes | One of: completed, partially_completed, cancelled, deferred. |
work_order_id |
string |
Yes | The CMMS work order ID that was executed. |
actual_duration_seconds |
number |
No | Actual time spent on the maintenance activity, in seconds. |
technician_id |
string |
No | Identifier of the technician who performed the work. |
checklist_completion_pct |
number |
No | Percentage of checklist items completed (0–100). |
completion_notes |
string |
No | Free-text notes from the technician. |
spare_parts_count |
number |
No | Number of distinct spare parts used. |
failure_confirmed |
boolean |
No | Whether the predicted failure was confirmed during maintenance. |
failure_mode |
string |
No | Confirmed failure mode (may differ from the predicted one). |
iso_14224 |
object |
No | ISO 14224 classification of the confirmed failure (see Appendix B). v1.2 |
{
"spec_version": "2.0",
"event_type": "maintenance.completion",
"event_id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
"correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"source_event_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"batch_id": null,
"timestamp": "2026-03-09T10:15:00Z",
"source": "wertek.cmms.work_orders",
"content_hash": "e5f6a7b8c9d0e1f2",
"asset": {
"asset_id": "PUMP-001",
"asset_name": "Main Cooling Water Pump",
"plant": "Plant A - Monterrey",
"area": "Cooling Tower Area"
},
"data": {
"status": "completed",
"work_order_id": "WO-2026-0042",
"actual_duration_seconds": 7200,
"technician_id": "TECH-003",
"checklist_completion_pct": 100,
"completion_notes": "Bearing replaced. Post-repair vibration 0.8 mm/s.",
"spare_parts_count": 1,
"failure_confirmed": true,
"failure_mode": "bearing_inner_race"
}
}
asset.hierarchy v1.1
Declares or updates the hierarchical position of an asset within an organization. Used to synchronize asset trees across systems (CMMS, historians, digital twins).
| Field | Type | Required | Description |
|---|---|---|---|
hierarchy_level |
string |
Yes | One of: organization, plant, area, equipment. |
relationship_type |
string |
Yes | One of: parent_of, child_of, sibling_of, depends_on. |
parent_asset_id |
string |
No | The asset_id of the parent node in the hierarchy. |
asset_type |
string |
No | Equipment type classification (e.g. motor, pump, compressor). |
serial_number |
string |
No | Manufacturer serial number. |
manufacturer |
string |
No | Equipment manufacturer name. |
model |
string |
No | Equipment model designation. |
location |
string |
No | Physical location description. |
is_active |
boolean |
No | Whether the asset is currently active/in-service. |
{
"spec_version": "2.0",
"event_type": "asset.hierarchy",
"event_id": "f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f809a1b",
"correlation_id": "f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f809a1b",
"source_event_id": null,
"batch_id": null,
"timestamp": "2026-03-07T09:00:00Z",
"source": "wertek.cmms.asset_registry",
"content_hash": "a7b8c9d0e1f2a3b4",
"asset": {
"asset_id": "MOTOR-042",
"asset_name": "Pump Drive Motor 42",
"plant": "Plant A - Monterrey",
"area": "Turbine Hall"
},
"data": {
"hierarchy_level": "equipment",
"relationship_type": "child_of",
"parent_asset_id": "AREA-TURBINAS",
"asset_type": "motor",
"serial_number": "WEG-2024-78432",
"manufacturer": "WEG",
"model": "W22 Premium 75HP",
"is_active": true
}
}
sensor.registration v1.1
Declares or updates a sensor's lifecycle state. Tracks sensors from discovery through calibration to decommissioning, enabling fleet management and audit trails for measurement provenance.
| Field | Type | Required | Description |
|---|---|---|---|
sensor_id |
string |
Yes | Unique identifier for the sensor. |
registration_status |
string |
Yes | One of: discovered, registered, calibrated, decommissioned. |
sensor_model |
string |
No | Model name or designation of the sensor. |
device_serial |
string |
No | Hardware serial number of the device. |
firmware_version |
string |
No | Current firmware version running on the sensor. |
measurement_capabilities |
string[] |
No | List of measurement types this sensor can produce. |
calibration_date |
string |
No | Date of last calibration (RFC 3339 date). |
communication_protocol |
string |
No | Communication protocol used (e.g. mqtt, modbus_tcp, opcua). |
{
"spec_version": "2.0",
"event_type": "sensor.registration",
"event_id": "a8b9c0d1-e2f3-4a4b-5c6d-7e8f9a0b1c2d",
"correlation_id": "a8b9c0d1-e2f3-4a4b-5c6d-7e8f9a0b1c2d",
"source_event_id": null,
"batch_id": null,
"timestamp": "2026-03-05T11:20:00Z",
"source": "wertek.iot.gateway",
"content_hash": "b8c9d0e1f2a3b4c5",
"asset": {
"asset_id": "MOTOR-042",
"asset_name": "Pump Drive Motor 42",
"plant": "Plant A - Monterrey",
"area": "Turbine Hall"
},
"data": {
"sensor_id": "MCSA-T41-001",
"registration_status": "registered",
"sensor_model": "Wertek MCSA CT Module",
"device_serial": "T41-2026-00042",
"firmware_version": "1.0.3",
"measurement_capabilities": ["current_waveform", "current_spectrum", "current_rms", "thd"],
"calibration_date": "2026-03-05",
"communication_protocol": "mqtt"
}
}
maintenance.spare_part_usage v1.1
Records the consumption of a spare part during a maintenance activity. Links to the work order via work_order_id and enables inventory tracking, cost analytics, and procurement automation.
| Field | Type | Required | Description |
|---|---|---|---|
work_order_id |
string |
Yes | The CMMS work order ID this part was used in. |
spare_part_id |
string |
Yes | Internal spare part identifier. |
quantity_used |
number |
Yes | Number of units consumed. |
part_number |
string |
No | Manufacturer part number. |
part_name |
string |
No | Human-readable part name. |
unit_cost |
number |
No | Cost per unit. |
currency |
string |
No | ISO 4217 currency code (e.g. USD, MXN, EUR). |
total_cost |
number |
No | Total cost (unit_cost × quantity_used). |
{
"spec_version": "2.0",
"event_type": "maintenance.spare_part_usage",
"event_id": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8091",
"correlation_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"source_event_id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f80",
"batch_id": null,
"timestamp": "2026-03-09T10:15:30Z",
"source": "wertek.cmms.inventory",
"content_hash": "f6a7b8c9d0e1f2a3",
"asset": {
"asset_id": "PUMP-001",
"asset_name": "Main Cooling Water Pump",
"plant": "Plant A - Monterrey",
"area": "Cooling Tower Area"
},
"data": {
"work_order_id": "WO-2026-0042",
"spare_part_id": "SP-SKF-6205",
"quantity_used": 1,
"part_number": "SKF 6205-2RS",
"part_name": "Deep groove ball bearing 6205-2RS",
"unit_cost": 28.50,
"currency": "USD",
"total_cost": 28.50
}
}
6. Severity Standard
IAES defines five severity levels. They describe the condition of the asset, not the urgency of the maintenance response — priority on maintenance.work_order_intent carries that, and the two catalogues share the words low, medium and high while meaning different things by them. Neither may be presented as the other.
| Level | Meaning |
|---|---|
info | Informational, no action needed |
low | Minor, schedule for next planned maintenance |
medium | Moderate, plan intervention within weeks |
high | Significant, plan intervention within days |
critical | Immediate action required |
IAES defines no mapping from health_index to severity. The schema constrains health_index to the range 0–1 and severity to those five values, and leaves the relationship to the producer: a vibration model working from published evaluation zones and an oil-analysis model will divide the range differently, and both conform. A page of this site used to publish one such division as though the specification required it. It did not, and the ranges were a vendor's calibration; they are gone.
7. Idempotency
IAES provides three mechanisms for deduplication and idempotent processing:
event_id— Every event has a globally unique UUID. Consumers must track processed event IDs to avoid reprocessing.content_hash— A deterministic hash of thedatapayload. Two events with the same content_hash for the same asset and event type are semantically identical.correlation_id— Links related events. If a consumer already has a work order for a given correlation_id, it should not create a duplicate.
content_hash Computation
The content_hash is computed as follows:
- Serialize the
dataobject as canonical JSON (keys sorted alphabetically, no whitespace). - Compute the SHA-256 hash of the resulting string.
- Take the first 16 hexadecimal characters.
content_hash + asset.asset_id + event_type combination.
8. Producers
IAES events are produced by systems capable of interpreting operational signals — not by the signals themselves.
A PLC, sensor, or gateway knows vibration_rms = 4.6. That is telemetry, not a diagnosis. IAES begins where interpretation begins: an AI model that classifies a bearing fault, a rule engine that triggers on a threshold, or a technician who hears cavitation.
Intelligence layer producers
| Source | Example source value |
Typical events |
|---|---|---|
| AI diagnosis engine | vendor.vibration | asset.health |
| Rule/threshold engine | acme.rule_engine | asset.health |
| Manual inspection | operator.manual_inspection | asset.health, asset.measurement |
| Technician assessment | operator.field_assessment | asset.health |
| Lab analysis | lab.oil_analysis | asset.measurement |
| Maintenance application | vendor.cmms | maintenance.work_order_intent |
Signal sources (upstream of IAES)
Operational systems such as PLCs, SCADA platforms, sensor gateways, and historians typically emit raw signals or measurements. These are converted into IAES events by downstream intelligence layers.
Industrial Signals IAES Events
(PLC / Sensors / SCADA) (semantic, interpreted)
│ │
▼ ▼
Telemetry Layer ┌──────────────┐
(OPC UA / Modbus / MQTT) │ CMMS │
│ │ Dashboards │
▼ │ Historians │
Intelligence Layer ──────>│ Integrations │
(AI / rules / human) └──────────────┘
An edge device MAY produce IAES events directly if it has sufficient intelligence (e.g. edge AI, embedded rule engine). But the typical flow is: signals are ingested by an intelligence layer, which then emits IAES events.
The source field is what makes IAES vendor-neutral. A technician with a stethoscope and an AI model both produce the same asset.health event — the consumer doesn't need to know the difference.
9. Producer Guidelines
Required
- Generate a unique
event_id(UUID v4) for every event. - Set
spec_versionto"2.0"(or the version you implement). - Compute and include a valid
content_hashfor every event. - Use RFC 3339 timestamps in UTC with a timezone designator. RFC 3339 is a profile of ISO 8601: ordinal dates, week dates and some offset forms are valid ISO 8601 and are not valid RFC 3339. No schema enforces this in either direction, because
formatis an annotation in Draft 2020-12. - Include all required fields for the chosen
event_type.
Recommended
- Set
correlation_id=event_idfor the first event in a chain; propagate the samecorrelation_idfor subsequent linked events. - Set
source_event_idto theevent_idof the directly upstream event. - Use the dot-notation format for
source:vendor.system.subsystem. - Use failure modes from Appendix A when applicable.
- Include ISO 14224 and ISO 13374 fields when the data is available to maximize interoperability.
10. Consumer Guidelines
Required
- Validate
spec_versionand reject events from unsupported versions. - Implement deduplication using
event_idorcontent_hash(see Section 7). - Ignore unknown fields in
datawithout raising errors (forward compatibility).
Recommended
- Use
correlation_idto group related events for display and analytics. - Map IAES severity to your system's native priority/urgency model.
- Store the full IAES event as an audit record, even after mapping to native format.
- Implement retry logic with exponential backoff for transient processing failures.
- Log rejected or malformed events for troubleshooting.
Severity Mapping Reference
| IAES Severity | SAP PM | MaintainX | Odoo | General |
|---|---|---|---|---|
info |
Priority 4 | None | 0 (Normal) | Informational |
low |
Priority 3 | Low | 0 (Normal) | Low |
medium |
Priority 2 | Medium | 1 (Urgent) | Medium |
high |
Priority 1 | High | 2 (Very Urgent) | High |
critical |
Priority 1 + Breakdown | Critical | 3 (Emergency) | Critical / Emergency |
11. Typical Flow
A typical IAES event chain follows this pattern. All events in the chain share the same correlation_id, and each event references its direct predecessor via source_event_id.
// All events share the same correlation_id correlation_id: "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d" // Event chain via source_event_id: measurement (event_id: AAA, source_event_id: null) ↓ health (event_id: BBB, source_event_id: AAA) ↓ wo_intent (event_id: CCC, source_event_id: BBB) ↓ completion (event_id: DDD, source_event_id: CCC) ↓ spare_part (event_id: EEE, source_event_id: DDD)
12. Event Type Usage Guide
When to use each event type, who produces it, and who consumes it.
| Event Type | Typical Producer | Typical Consumer | Use When | Do NOT Use When |
|---|---|---|---|---|
asset.measurement | Sensor gateway, edge device, historian bridge | AI/ML engine, rule engine, data lake, digital twin | A sensor reading needs to be shared across systems (vibration, temperature, power factor, THD, current, voltage, pressure) | Storing raw waveforms (use a blob store). Logging routine telemetry internally (use your time-series DB directly). |
asset.health | AI model, rule engine, expert inspector, SCADA alarm mapper | CMMS (work order creation), dashboard (KPIs), alert engine, incident tracker | An actionable condition assessment exists — fault detected, health index calculated, alarm threshold crossed, recovery confirmed | Routine "all clear" polling. Use only when a condition state changes or is actively abnormal. |
maintenance.work_order_intent | AI engine, alert rule, human operator, planning system | CMMS (SAP PM, Odoo, MaintainX, Fracttal), dispatcher, approval workflow | A work order SHOULD be created based on a diagnosis, alert, or schedule | Acknowledging work already in progress (use maintenance.completion). |
maintenance.completion | CMMS, mobile app, technician handoff | AI model (retraining feedback), historian (close loop), dashboard | A work order has been completed, cancelled, or deferred — closes the observation-to-action loop | Partial status updates mid-execution (not yet supported in v1.3). |
asset.hierarchy | CMMS, ERP, asset register, BIM system | Digital twin, dashboard, graph database | Asset tree structure changes — new equipment, relocation, parent/child relationships | Routine sync of unchanged hierarchy (use idempotent upsert, not repeated events). |
sensor.registration | Edge gateway, IoT platform, device manager | Asset register, provisioning system, monitoring dashboard | A sensor is discovered, registered, calibrated, or decommissioned for the first time or changes state | Every reading cycle. Emit once per state change, not per reading. |
maintenance.spare_part_usage | CMMS, warehouse system, technician app | Inventory system, cost analytics, procurement | Spare parts were consumed during a maintenance action | Generic inventory movements unrelated to maintenance (use your ERP). |
Guidance:
asset.measurementandsensor.registrationare high-frequency by nature. Consumers building intelligence dashboards SHOULD filter byasset.healthandmaintenance.*event types for actionable signal. Raw measurements belong in time-series storage, not intelligence layers.
13. System Compatibility
IAES events are designed to map naturally to common industrial systems. The table below shows how IAES concepts map to each platform.
| System | IAES Mapping | Transport |
|---|---|---|
| SAP PM | Notification (health), Work Order (intent), Confirmation (completion), BOM (spare parts) | RFC / OData / IDoc |
| PI System (OSIsoft) | PI Points (measurement values), Event Frames (health), AF Elements (hierarchy) | PI Web API / OMF |
| AVEVA Data Hub | Streams (measurements), Assets (hierarchy), Events (health/completion) | REST API |
| Odoo | Maintenance Request (intent), Equipment (hierarchy), Product (spare parts) | XML-RPC / JSON-RPC |
| MaintainX | Work Order (intent), Parts (spare parts), Asset (hierarchy), Meter Reading (measurement) | REST API |
| Fracttal | Work Order (intent), Asset (hierarchy), Variable Reading (measurement) | REST API |
| Grafana | Time series (measurements), Annotations (health/intent events) | Data source plugin / HTTP API |
| MQTT Broker | Topic per event_type: iaes/{org_id}/{asset_id}/{event_type} |
MQTT 3.1.1 / 5.0 |
14. Versioning
Governance, the compatibility policy, and the change process are normative and live in GOVERNANCE.md. This section summarises how versions are numbered; GOVERNANCE.md states what implementers may rely on, which changes are compatible, how long a version is supported, and how a change is proposed.
IAES uses semantic versioning for the specification itself:
spec_versionin every event envelope identifies which version of the spec was used to produce it.- Minor versions (1.1, 1.2) add new optional fields, new event types, or new
triggered_byvalues. They never remove existing fields or change required fields. Consumers built for 1.0 SHOULD accept events from 1.x without error. - Major versions (2.0) may introduce breaking changes: removing fields, changing required fields, renaming event types, or changing envelope structure. Consumers MAY reject events from unsupported major versions.
- Producers MUST set
spec_versionto the version they implement. - Consumers SHOULD accept events where the major version matches, even if the minor version is higher than what they support.
Version history
| Version | Date | Changes |
|---|---|---|
| 1.0 | March 2026 | Initial release. 3 event types, common envelope, JSON Schema. |
| 1.1 | March 2026 | 4 new event types (maintenance.completion, asset.hierarchy, sensor.registration, maintenance.spare_part_usage), batch_id envelope field, failure mode taxonomy (Appendix A). |
| 1.2 | March 2026 | ISO alignment: units_qualifier, sampling_rate_hz, acquisition_duration_s on asset.measurement (ISO 17359); iso_13374_status on asset.health (ISO 13374); iso_14224 object on asset.health + maintenance.completion (ISO 14224). All new fields optional — full backward compatibility. Appendix B (ISO 14224 codes), Appendix C (ISO 13374 mapping). |
| 1.3 | March 2026 | State transition model: condition_trend field on asset.health (worsening, stable, improving) based on ISO 13374-4 §5.3. Formalized recovery event pattern. State Transition Guidance in Architecture Guide (ISO 13374-4, ISO 17359, ISO 14224, ISO 55000). Recovery event example. All new fields optional — full backward compatibility. |
| 1.4 | September 2026 | Governance and compatibility policy become normative (GOVERNANCE.md): stated stewardship, BACKWARD compatibility as the default mode, a 24-month support window, canonical and resolvable $id versioned by URI, and an RFC-based change process. Scope boundaries made explicit: IAES defines no asset hierarchy, no equipment catalog, and no commercial terms. No schema changed in this release. Schema identity corrected under GOVERNANCE.md §5.1: the eight schemas declared $id under https://iaes.wertek.ai/schema/v1/, a host that has never resolved (verified 2026-09-03: no DNS answer). They now declare https://iaes.dev/schema/v1/, which is served. The old base is permanently reserved and will not be reassigned. Schema content is otherwise unchanged. New optional envelope field dataschema: the canonical URI of the schema the payload was written against, following the CloudEvents attribute of the same name. Derivable from event_type, so both SDKs set it automatically for published event types and omit it otherwise. Optional and additive: fully backward compatible. event_type opened: it was a closed enumeration of seven values while this same document ordered consumers to tolerate values they do not recognise — a contradiction that made unknown types impossible to produce. It is now a dot-notation pattern with the published types as examples. Widening, therefore backward compatible: every previously valid value still validates, and the compatibility guard verifies that rather than assuming it. |
| 2.0 | September 2026 | First MAJOR release. Two things make it major, and only one can affect a producer's existing output. (1) Timestamps must be RFC 3339, not merely ISO 8601 — a narrowing, since ordinal dates, week dates and some offset forms are valid ISO 8601 and not valid RFC 3339. No schema enforces it in either direction, because format is an annotation in Draft 2020-12, so it will not surface as a validation failure. (2) The eight schemas publish under https://iaes.dev/schema/v2/, and the envelope constrains spec_version to ^2\.[0-9]+$. The eight /schema/v1/ URIs continue to resolve, permanently, to the schemas the 1.x line published: a representation served under a major's URI stays that major's and is never regenerated from a later release. A consumer validates an event against the schemas of the major the event declares, which is how a 2.0 consumer reads a 1.4 event. Wire contract stabilized (rfc/IAES-RFC-002.md): severity is not priority and neither may be presented as the other; the ISO 13374 attributions on iso_13374_status and condition_trend are withdrawn — the values are IAES's own and the field names are kept for compatibility; an absent optional field is not an assertion, so a producer MUST omit rather than substitute and a consumer MUST NOT read absence as a default; measurement_type is open and any published list is advisory. None of those invalidates a 1.4 event: everything schema-valid under 1.4 stays schema-valid, and a 1.4 producer that keeps substituting stays conforming to 1.4 — it simply cannot declare 2.0. Governance became testable (RFC-003 through RFC-007): a criterion for changes to producer and consumer obligations (§4.4), one for changes to the policy itself and the rule that a release takes the maximum level of the changes it carries (§4.5), two classes of conformance with an SDK profile that is claimed and checked rather than granted (§9), and the ratification of everything that had accumulated since 1.4. Migration: declare 2.0, point at /schema/v2/, emit RFC 3339 timestamps, take the 2.0.x packages, and stop substituting values for optional fields the caller did not supply. from_object is the canonical constructor name; from_dict and fromJSON keep working as deprecated aliases. |
15. References
What this specification depends on, and how much of that dependency its machine-validity artifact actually checks. Measured from the artifacts on 2026-09-06.
Two questions, and they are independent:
- Normative for meaning — must the value satisfy this document for the event to conform to IAES? That is decided by this specification.
- Enforced by the schema — does the schema reject a value that does not? That is decided by JSON Schema and by what the schemas actually declare.
They are not the same question, and where they disagree the disagreement is the defect.
| Document | Normative for meaning | Enforced by the schema |
|---|---|---|
| RFC 3339 | Yes. timestamp MUST be UTC with a timezone designator; calibration_date is a date. | No. Declared with format, which Draft 2020-12 treats as an annotation. |
| RFC 4122 | Yes for event_id, correlation_id and source_event_id. | No. Same reason. |
| RFC 3986 | Yes for dataschema, which carries a URI. | No. Same reason. |
| RFC 2119, RFC 8174 | Yes. How MUST, SHOULD and MAY are to be read here. | Not applicable. Not a schema constraint. |
| ISO 4217 | Yes. currency is an ISO 4217 code. | Partly. ^[A-Z]{3}$ checks the shape, not membership: ZZZ and QQQ pass. |
| ISO 14224 | No. Mentioned for the iso_14224 object and Appendix B. | No. |
| ISO 17359 | No. Mentioned for units_qualifier and the acquisition fields. | No. |
| ISO 13374 series | No. Mentioned for iso_13374_status, condition_trend and Appendix C. | No. |
| ISO 55000 | No. Mentioned as asset management context. | No. |
An event can be schema-valid and non-conforming
Broken rather than read, against the validator this repository publishes:
timestamp = "banana" accepted event_id = "no-uuid" accepted correlation_id = "12345" accepted dataschema = "esto no es uri" accepted
Each of those satisfies the schema and violates this specification. An implementer can run the official validator, get green, and produce something this document forbids. That gap is the finding, not the accepted values.
Switching JSON Schema's format assertion on does not close it. Measured with the checker enabled, uuid is rejected while date-time and uri are still accepted, because their checkers live in optional packages — so whether an event is valid would depend on which packages the reader happens to have installed, and two conforming readers would disagree about the same bytes.
Why this is not simply fixed
The schemas already assert event_type, source, spec_version and currency with pattern, which every validator applies, while merely annotating the six identifier and date fields. No document says why the two groups are treated differently.
Adding a pattern to close the gap is not available inside 1.x: GOVERNANCE.md §4.2 lists adding a pattern where none existed as a narrowing change, therefore MAJOR, and the compatibility guard implements that. Values that validate today would stop validating.
So this is a decision with real consequences and it belongs in a memo, not in a references table. This section records the measurement the memo will need.
Three of these documents were unnamed until 2026-09-06. The schemas have always used uuid, uri, date-time and date, so the specification has always meant to depend on the documents that define them; it named none of them, and named ISO 8601, which JSON Schema does not use and which the editor does not hold. An implementer could satisfy the schema and had nowhere to read why.
The ISO 13374 entries say series rather than a part on purpose. The unqualified citations cover at least two different subjects — health status levels and a six-block processing model — which cannot both be the same part, and the editor holds only ISO 13374-4. A citation that does not identify a document cannot be checked. rfc/IAES-RFC-002.md withdrew the ISO 13374 attributions in 2.0; the field names are retained for compatibility with 1.x, and the values are declared as IAES's own.
Appendix A: Failure Mode Taxonomy
Standardized failure mode values for the failure_mode field in asset.health and maintenance.completion events. Organized by equipment domain.
Rotating Equipment
| Value | Description |
|---|---|
bearing_inner_race | Inner race defect on rolling element bearing |
bearing_outer_race | Outer race defect on rolling element bearing |
bearing_ball_spin | Ball spin / rolling element defect |
bearing_cage | Cage / retainer defect |
bearing_lubrication | Inadequate or degraded lubrication |
misalignment_angular | Angular misalignment between coupled shafts |
misalignment_parallel | Parallel (offset) misalignment |
unbalance | Mass unbalance on rotating component |
looseness_mechanical | Mechanical looseness (base, bolts, foundation) |
looseness_structural | Structural looseness or resonance |
gear_wear | Gear tooth wear or pitting |
gear_broken_tooth | Broken or chipped gear tooth |
belt_wear | Belt wear, cracking, or glazing |
belt_misalignment | Belt/pulley misalignment |
cavitation | Cavitation in pumps or hydraulic systems |
shaft_crack | Shaft crack or fatigue |
resonance | Structural or natural frequency resonance |
Electrical
| Value | Description |
|---|---|
stator_winding | Stator winding insulation degradation or short |
rotor_bar | Broken rotor bar(s) in induction motor |
eccentricity_static | Static air gap eccentricity |
eccentricity_dynamic | Dynamic air gap eccentricity |
phase_unbalance | Voltage or current phase unbalance |
harmonic_distortion | Excessive harmonic distortion (THD) |
insulation_degradation | General insulation resistance degradation |
vfd_fault | Variable frequency drive fault or malfunction |
Fluid & Thermal
| Value | Description |
|---|---|
overheating | Abnormal temperature rise beyond operating limits |
thermal_gradient | Abnormal temperature differential across component |
leak_external | External fluid/gas leak |
leak_internal | Internal seal or valve leak |
blockage | Flow restriction or blockage in piping/filter |
corrosion | Internal or external corrosion |
erosion | Material erosion from fluid flow |
fouling | Surface fouling or deposit buildup |
Appendix B: ISO 14224 Codes
The iso_14224 object provides optional failure coding based on ISO 14224:2016 classification (Petroleum, petrochemical and natural gas industries — Collection and exchange of reliability and maintenance data). This object can appear in asset.health and maintenance.completion events.
iso_14224 Object Structure
{
"iso_14224": {
"mechanism_code": "string",
"mechanism_label": "string",
"cause_code": "string | null",
"cause_label": "string | null",
"detection_method": "string | null",
"detection_label": "string | null"
}
}
Failure Mechanism Codes
| Code | Mechanism |
|---|---|
1.1 | Mechanical wear |
1.2 | Fatigue |
1.3 | Corrosion |
1.4 | Erosion |
1.5 | Deformation |
1.6 | Fracture |
1.7 | Material degradation |
2.1 | Electrical short circuit |
2.2 | Open circuit |
2.3 | Insulation breakdown |
2.4 | Earth / ground fault |
3.1 | Blockage / plugged |
3.2 | Leakage |
3.3 | Vibration |
3.4 | Overheating |
9.0 | Other / unknown |
Failure Cause Codes
| Code | Cause |
|---|---|
A | Design-related |
B | Fabrication / manufacturing |
C | Installation / commissioning |
D | Operation / maintenance |
E | Management / organizational |
F | Miscellaneous / other |
Detection Method Codes
| Code | Detection Method |
|---|---|
1 | Periodic maintenance |
2 | Condition monitoring |
3 | Corrective maintenance |
4 | Inspection / testing |
5 | Production interference |
6 | Casual observation |
7 | Demand / operational test |
9 | Other / unknown |
Appendix C: ISO 13374 Mapping
ISO 13374 (Condition monitoring and diagnostics of machines) defines a 6-block processing model for condition monitoring. IAES maps naturally to this standard. The iso_13374_status field in asset.health events provides explicit alignment.
iso_13374_status Levels
| iso_13374_status | Description | Nearest IAES Severity |
|---|---|---|
normal |
Operating within acceptable parameters | info |
satisfactory |
Minor deviations, within limits | low |
unsatisfactory |
Outside normal limits, monitoring required | medium |
unacceptable |
Exceeds limits, corrective action needed | high |
imminent_failure |
Failure expected imminently | critical |
failed |
Equipment has failed | critical |
Usage Example
{
"event_type": "asset.health",
"data": {
"health_index": 0.16,
"severity": "critical",
"failure_mode": "bearing_inner_race",
"iso_13374_status": "imminent_failure",
"iso_14224": {
"mechanism_code": "1.1",
"mechanism_label": "Mechanical wear",
"cause_code": "D",
"cause_label": "Operation / maintenance",
"detection_method": "2",
"detection_label": "Condition monitoring"
}
}
}
ISO 13374 Processing Model → IAES Events
| ISO 13374 Block | Function | IAES Event |
|---|---|---|
| Block 1: Data Acquisition | Sensor data collection | sensor.registration |
| Block 2: Data Manipulation | Signal processing, filtering | asset.measurement |
| Block 3: State Detection | Threshold comparison, anomaly detection | asset.health (health_index, anomaly_score) |
| Block 4: Health Assessment | Diagnosis, severity, failure mode | asset.health (severity, failure_mode, rul_days) |
| Block 5: Prognostics | RUL estimation, trend prediction | asset.health (rul_days, recommended_action) |
| Block 6: Advisory Generation | Recommended actions, work orders | maintenance.work_order_intent |
Version History
| Version | Date | Changes |
|---|---|---|
| v1.0 | January 2026 | Initial release. 3 event types: asset.measurement, asset.health, maintenance.work_order_intent. Common envelope, severity levels, idempotency, producer/consumer guidelines. |
| v1.1 | February 2026 | Added 4 event types: maintenance.completion, asset.hierarchy, sensor.registration, maintenance.spare_part_usage. Added batch_id to envelope. Failure Mode Taxonomy (Appendix A). |
| v1.2 | March 2026 | Standards vocabulary: units_qualifier, sampling_rate_hz, acquisition_duration_s (ISO 17359) on measurements. iso_13374_status (ISO 13374) on health. iso_14224 object (ISO 14224) on health and completion. All new fields optional — fully backward compatible. Added Appendix B (ISO 14224 codes) and Appendix C (ISO 13374 mapping). |
| v1.3 | March 2026 | State transition intelligence: condition_trend field on asset.health (worsening/stable/improving) per ISO 13374-4 §5.3. Recovery event pattern (onset → escalation → recovery via shared correlation_id). Envelope spec_version changed from enum to pattern (^1\.[0-9]+$) for future-proof minor versions. New example: recovery-event.json. All new fields optional — fully backward compatible. |
License
IAES is an open specification licensed under CC BY 4.0. Implementations may be proprietary.
IAES v2.0 — September 2026 Created by the Wertek AI team. Implementations are listed in README.md. None of them is privileged: conformance is measured on the wire, not against any one of them.