Industrial Asset Event Standard
A vendor-neutral event format for industrial asset intelligence. Defines how signals, diagnoses, and maintenance intents are represented across heterogeneous operational systems.
What is IAES?
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.
source field is what makes the standard vendor-neutral.
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
datapayload andmetadatafield allow new fields without breaking consumers.
Terminology
| Term | Definition |
|---|---|
| Event | A self-contained JSON object describing something that happened to an industrial asset. |
| Producer | Any system that creates IAES events — sensor gateways, AI engines, rule engines, human inspectors, SCADA systems. |
| Consumer | Any system that receives and acts on IAES events — CMMS, historians, dashboards, digital twin platforms. |
| Envelope | The common wrapper fields shared by all IAES events (spec_version, event_type, event_id, etc.). |
| Correlation | A group of related events sharing the same correlation_id, representing a single observation-to-action flow. |
| Source | A dot-notation string identifying the producer of an event (e.g. wertek.ai.vibration, operator.field_assessment). |
| Intent | A declaration that an action should be considered, without prescribing how the consumer should act. Used in maintenance.work_order_intent. |
| Health Index | A normalized 0-1 score representing asset condition (0 = failed, 1 = healthy). |
| RUL | Remaining Useful Life — estimated days until the asset requires intervention. |
Common Envelope
Every IAES event shares this envelope structure:
{
"spec_version": "1.0",
"event_type": "asset.health",
"event_id": "uuid",
"correlation_id": "uuid",
"source_event_id": "uuid" | null,
"timestamp": "ISO 8601",
"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 spec version (currently "1.0") |
event_type |
string | yes | Dot-notation event type |
event_id |
UUID | yes | Unique identifier for this event |
correlation_id |
UUID | yes | Groups related events in a single flow |
source_event_id |
UUID | no | References the originating event |
timestamp |
ISO 8601 | yes | When the event occurred |
source |
string | yes | Dot-notation producer identity (e.g. wertek.ai.diagnosis, operator.manual_inspection) |
content_hash |
string | no | SHA-256 prefix (16 chars) of data payload for dedup |
asset |
object | yes | Asset identity (see Asset Identity below) |
data |
object | yes | Event-specific payload |
Asset Identity
{
"asset_id": "MOTOR-001",
"asset_name": "Motor Bomba P-101",
"plant": "Pesqueria",
"area": "Turbinas"
}
The standard deliberately does not define a full asset hierarchy. Different organizations model hierarchies differently (ISO 14224, ISA-95, custom). IAES only requires enough context to identify the asset.
Event Types (v1.0)
IAES v1.0 defines three event types covering the full observe → diagnose → act pipeline:
asset.measurement
Physical sensor reading. Raw data from vibration sensors, temperature probes, current transformers, or manual instruments.
asset.health
Diagnosis or health assessment. Produced by AI engines, rule engines, or human experts. Includes recommended actions.
maintenance.work_order_intent
Declares the intent to create a work order. The consumer (CMMS, ERP) decides how to act on the intent.
asset.measurement
A physical sensor reading.
{
"event_type": "asset.measurement",
"data": {
"measurement_type": "vibration_rms",
"value": 4.2,
"unit": "mm/s",
"sensor_id": "SENSOR-045",
"location": "bearing_drive_end"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
measurement_type | string | yes | Type of measurement (vibration_velocity, temperature, current, etc.) |
value | number | yes | Numeric value |
unit | string | yes | Engineering unit |
sensor_id | string | no | Physical sensor identifier |
location | string | no | Measurement point on the asset |
asset.health
AI diagnosis, rule engine alert, or human expert health assessment. Includes recommended action.
{
"event_type": "asset.health",
"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
}
}
| Field | Type | Required | Description |
|---|---|---|---|
health_index | float 0-1 | yes | Normalized health (0 = failed, 1 = healthy) |
anomaly_score | float 0-1 | no | Probability of anomaly |
severity | enum | yes | info, low, medium, high, critical |
failure_mode | string | no | Classified fault type |
fault_confidence | float 0-1 | no | Classification confidence |
rul_days | integer | no | Remaining Useful Life in days |
recommended_action | string | no | Human-readable action suggestion |
estimated_downtime_hours | float | no | Estimated repair duration |
maintenance.work_order_intent
Declares the intent to create a work order. The consumer decides whether and how to act.
{
"event_type": "maintenance.work_order_intent",
"data": {
"title": "Bearing failure predicted",
"description": "Inner race defect detected by AI diagnosis",
"priority": "critical",
"recommended_due_days": 3,
"triggered_by": "alert"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
title | string | yes | Work order title |
description | string | no | Detailed description |
priority | enum | yes | low, medium, high, emergency |
recommended_due_days | integer | no | Suggested deadline in days |
triggered_by | string | no | What caused this intent (alert, schedule, manual, threshold, ai_diagnosis) |
Severity Levels
IAES defines five severity levels:
Idempotency & Deduplication
Every event includes:
event_id— unique, never reusedcontent_hash— SHA-256 of thedatapayload (16-char prefix)correlation_id— groups related events in a flow
content_hash + asset.asset_id + event_type to detect duplicate events across retries.
Event Producers
IAES events are produced by systems capable of interpreting operational signals — not by the signals themselves. A PLC knows vibration_rms = 4.6. That is telemetry. IAES begins where interpretation begins.
Intelligence layer producers
Signal sources (upstream of IAES)
Operational systems such as PLCs, SCADA platforms, sensor gateways, and historians emit raw signals or measurements. These are converted into IAES events by downstream intelligence layers.
An edge device MAY produce IAES events directly if it has sufficient intelligence (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.
Producer Guidelines
Systems that emit IAES events MUST follow these rules:
Required behavior
- Set all required envelope fields. Every event MUST include
spec_version,event_type,event_id,correlation_id,timestamp,source,asset(with at leastasset_id), anddata. - Generate unique
event_idvalues. Each event MUST have a globally uniqueevent_id(UUID v4 recommended). Never reuse anevent_idacross events. - Use dot-notation for
source. Thesourcefield MUST follow the patternvendor.system[.subsystem]. Use lowercase, alphanumeric characters, dots, and underscores only. - Use ISO 8601 for timestamps. The
timestampfield MUST be in UTC with timezone designator (e.g.2026-03-06T17:50:17Z). - Do not assume consumer behavior. A
maintenance.work_order_intentdeclares intent — the producer MUST NOT assume the consumer will create a work order, or create it in any specific format.
Recommended behavior
- Set
correlation_idto group related events. When a measurement triggers a diagnosis that triggers a work order intent, all three events SHOULD share the samecorrelation_id. - Set
source_event_idfor causal chains. When an event is caused by another event, setsource_event_idto theevent_idof the cause. - Compute
content_hashfor deduplication. Producers SHOULD computecontent_hashas the first 16 characters of the SHA-256 hex digest of the serializeddatapayload (canonical JSON, sorted keys). - Include
asset_name,plant, andareawhen available. These fields are optional but significantly improve human readability in logs, dashboards, and audit trails. - Use standard
failure_modevalues when possible. Common values:bearing_inner_race,bearing_outer_race,misalignment,unbalance,looseness,cavitation,overheating,electrical_fault. Custom values are allowed.
Consumer Guidelines
Systems that receive IAES events MUST follow these rules:
Required behavior
- Tolerate unknown fields. Consumers MUST ignore fields in
datathat they do not recognize. Never reject an event because it contains extra fields. This is essential for forward compatibility. - Tolerate unknown
event_typevalues. If a consumer receives an event with anevent_typeit does not support (e.g. a futureasset.hierarchy), it MUST NOT error. It MAY log the event and skip processing. - Validate
spec_version. Consumers SHOULD checkspec_versionand MAY reject events from unsupported major versions.
Recommended behavior
- Deduplicate using
content_hash. Consumers SHOULD detect duplicate events usingcontent_hash+asset.asset_id+event_type. Ifcontent_hashis not present, fall back toevent_iduniqueness. - Use
correlation_idto reconstruct flows. Consumers that display or analyze event chains SHOULD group events bycorrelation_idand order bytimestamp. - Use
source_event_idfor traceability. When displaying a work order intent, consumers SHOULD link back to the health event that triggered it. - Map severity to native priority. Consumers SHOULD map IAES severity levels to their native priority system:
| IAES severity | SAP PM | MaintainX | Odoo | General |
|---|---|---|---|---|
info | — | — | — | No action |
low | Priority 4 | LOW | 0 (Not Urgent) | Low |
medium | Priority 3 | MEDIUM | 1 (Normal) | Medium |
high | Priority 2 | HIGH | 2 (Urgent) | High |
critical | Priority 1 | HIGH | 3 (Very Urgent) | Critical |
maintenance.work_order_intent is a suggestion, not a command. Consumers MAY apply filters, rules, or approval workflows before creating native work orders. The consumer is the authority on what gets created in its system.
Event Flow
A complete observation-to-action pipeline:
System Compatibility
| System | IAES Mapping |
|---|---|
| SAP PM | Maintenance Notification / Order |
| PI System | Tag value writes |
| AVEVA Data Hub | SDS Stream writes |
| Odoo | maintenance.request |
| MaintainX | User Variables |
| Fracttal | Custom fields + OT |
| Grafana | Dashboard metrics |
| Any MQTT broker | JSON payload |
Future (v1.1)
Planned additional event types:
| Event Type | Description |
|---|---|
asset.hierarchy | Full asset tree sync |
sensor.registration | Sensor discovery and onboarding |
maintenance.completion | Work order completion acknowledgment |
maintenance.spare_part_usage | Parts consumed during maintenance |
Versioning
IAES uses semantic versioning for the specification:
- Minor versions (1.1, 1.2) add new optional fields or event types. They never remove 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, or renaming event types. 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 | Date | Changes |
|---|---|---|
1.0 | March 2026 | Initial release. 3 event types, common envelope, JSON Schema. |