Skip to main content

Industrial Asset Event Standard — vendor-neutral event models for industrial asset intelligence

Project description

IAES — Industrial Asset Event Standard

A vendor-neutral event format for industrial asset measurements, diagnoses, and maintenance intents.

PyPI npm License: CC BY 4.0

Industrial systems speak different languages. A vibration sensor outputs raw waveforms. An AI model outputs health scores. SAP expects maintenance notifications. PI System expects tag values. MaintainX expects user variables.

IAES provides the neutral layer in between — one event format that any producer can emit and any consumer can understand.

Sensors --> Intelligence --> IAES --> Connectors --> Enterprise Systems

Install

pip install iaes            # Python
npm install iaes            # TypeScript / Node.js

Examples

Vibration measurement

from iaes import AssetMeasurement

event = AssetMeasurement(
    asset_id="MOTOR-001",
    measurement_type="vibration_velocity",
    value=4.2,
    unit="mm/s",
    source="acme.sensors.plant1",
    units_qualifier="rms",           # ISO 17359
    sampling_rate_hz=25600,
)
payload = event.to_dict()  # IAES wire format, ready for json.dumps()
import { AssetMeasurement } from "iaes"

const event = new AssetMeasurement({
  asset_id: "MOTOR-001",
  measurement_type: "vibration_velocity",
  value: 4.2,
  unit: "mm/s",
  source: "acme.sensors.plant1",
  units_qualifier: "rms",
  sampling_rate_hz: 25600,
})
const payload = JSON.stringify(event)  // toJSON() called automatically

Energy / power quality

from iaes import AssetMeasurement

pf_event = AssetMeasurement(
    asset_id="SUBSTATION-A",
    measurement_type="power_factor",
    value=0.82,
    unit="ratio",
    source="ion8650.meter_01",
)

thd_event = AssetMeasurement(
    asset_id="SUBSTATION-A",
    measurement_type="thd_voltage",
    value=6.3,
    unit="%",
    source="ion8650.meter_01",
)

AI health diagnosis

from iaes import AssetHealth, Severity

event = AssetHealth(
    asset_id="MOTOR-001",
    health_index=0.16,
    severity=Severity.CRITICAL,
    failure_mode="bearing_inner_race",
    rul_days=5,
    recommended_action="Replace bearing immediately",
    source="ai.vibration_model",
    iso_13374_status="unacceptable",   # ISO 13374
    iso_14224={                         # ISO 14224
        "mechanism_code": "1.1",
        "cause_code": "1",
        "detection_method": "VIB",
    },
)

Work order intent

from iaes import WorkOrderIntent

event = WorkOrderIntent(
    asset_id="MOTOR-001",
    title="Replace bearing DE — AI diagnosis critical",
    priority="high",
    triggered_by="ai_diagnosis",
    recommended_due_days=3,
    source="ai.vibration_model",
    source_event_id="<health_event_id>",  # links to the diagnosis
)

Maintenance completion

from iaes import MaintenanceCompletion

event = MaintenanceCompletion(
    asset_id="MOTOR-001",
    work_order_id="WO-2026-0042",
    status="completed",
    actual_duration_seconds=7200,
    failure_confirmed=True,
    failure_mode="bearing_inner_race",
    source="cmms.sap_pm",
)

Validate

from iaes import validate, ValidationError

try:
    validate(event.to_dict())
    print("Valid IAES event")
except ValidationError as e:
    print(e)

Requires: pip install iaes[validate]

Deserialize

import json
from iaes import from_dict

# Any IAES envelope -> correct model instance
wire = json.loads(mqtt_message)
event = from_dict(wire)  # AssetMeasurement, AssetHealth, etc.
print(event.asset_id, event.value)

Event Types (v1.2)

Event Type Python TypeScript Purpose
asset.measurement AssetMeasurement AssetMeasurement Sensor reading (vibration, temperature, pressure, current, power factor, THD...)
asset.health AssetHealth AssetHealth AI diagnosis or expert assessment (health index, fault, RUL)
maintenance.work_order_intent WorkOrderIntent WorkOrderIntent Intent to create a work order
maintenance.completion MaintenanceCompletion MaintenanceCompletion Work order completion acknowledgment
asset.hierarchy AssetHierarchy AssetHierarchy Asset hierarchy sync (org > plant > area > equipment)
sensor.registration SensorRegistration SensorRegistration Sensor discovery and lifecycle
maintenance.spare_part_usage SparePartUsage SparePartUsage Spare parts consumed during maintenance

Enums

All enums accept either the enum constant or a plain string:

AssetHealth(asset_id="M-001", severity=Severity.CRITICAL)
AssetHealth(asset_id="M-001", severity="critical")  # also works
Enum Values
Severity info, low, medium, high, critical
MeasurementType vibration_velocity, vibration_acceleration, temperature, current, voltage, power, pressure, flow, speed, power_factor, thd_voltage, thd_current, frequency, ...
UnitsQualifier rms, peak, peak_to_peak, average, true_rms
ISO13374Status unknown, normal, satisfactory, unsatisfactory, unacceptable, imminent_failure, failed
WorkOrderPriority low, medium, high, emergency
CompletionStatus completed, partially_completed, cancelled, deferred
HierarchyLevel organization, plant, area, equipment
RelationshipType parent_of, child_of, sibling_of, depends_on
RegistrationStatus discovered, registered, calibrated, decommissioned

Wire Format

Every event serializes to the same envelope structure:

{
  "spec_version": "1.2",
  "event_type": "asset.measurement",
  "event_id": "a9e3c4b2-...",
  "correlation_id": "3b2f9d8c-...",
  "timestamp": "2026-03-08T12:00:00+00:00",
  "source": "acme.sensors.plant1",
  "content_hash": "8a3f9c2e1b4d7e6f",
  "asset": {
    "asset_id": "MOTOR-001",
    "asset_name": "Motor Bomba P-101",
    "plant": "Pesqueria",
    "area": "Turbinas"
  },
  "data": {
    "measurement_type": "vibration_velocity",
    "value": 4.2,
    "unit": "mm/s",
    "units_qualifier": "rms",
    "sampling_rate_hz": 25600
  }
}

content_hash is a 16-char SHA-256 prefix of the data payload, computed identically in Python and TypeScript for cross-language idempotency.

ISO Standards Alignment

Standard IAES Fields Purpose
ISO 17359 units_qualifier, sampling_rate_hz, acquisition_duration_s Condition monitoring measurement metadata
ISO 13374 iso_13374_status 7-level condition status (normal to failed)
ISO 14224 iso_14224 object Failure mechanism, cause, and detection codes
ISO 55000 Architectural Asset management principles embedded in design

All ISO fields are optional. v1.0/v1.1 events remain fully valid.

Zero Dependencies

The core SDK uses only standard library. No runtime dependencies.

Core Validation
Python stdlib only pip install iaes[validate] adds jsonschema
TypeScript Node.js crypto only ajv optional

Cross-Language Compatibility

Both SDKs produce identical wire format and identical content_hash for the same data. Events created in Python validate in TypeScript and vice versa. This is tested on every commit.

Resources

Design Principles

  1. Vendor neutrality — No dependency on any specific platform or system
  2. Legacy compatibility — Maps cleanly to CMMS, historians, SCADA, IoT
  3. Event-oriented — Each object represents something that happened
  4. Complete traceabilityevent_id + correlation_id + source_event_id chain
  5. Extensibilitydata payload allows new fields without breaking consumers

System Compatibility

System IAES Mapping
SAP PM Maintenance Notification / Order
PI System / AVEVA Tag value writes / SDS streams
Odoo maintenance.request
MaintainX User Variables
Fracttal Custom fields + OT
Node-RED node-red-contrib-iaes (coming soon)
MQTT / Kafka JSON payload on any topic

License

IAES is an open specification. The specification text and JSON schemas are licensed under CC BY 4.0. Implementations may use any license.


IAES v1.2 — March 2026

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

iaes-0.1.0.tar.gz (48.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

iaes-0.1.0-py3-none-any.whl (21.8 kB view details)

Uploaded Python 3

File details

Details for the file iaes-0.1.0.tar.gz.

File metadata

  • Download URL: iaes-0.1.0.tar.gz
  • Upload date:
  • Size: 48.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for iaes-0.1.0.tar.gz
Algorithm Hash digest
SHA256 1bb70465d573a6bfe00987d7589d1f7e065d76d611c3f07181772fc8108476db
MD5 754f37cf71e58a97d6ab05cdd0188012
BLAKE2b-256 15338d19e18a7aa621e0da36a728774697d07367ec29c20bde219cfaae796a7c

See more details on using hashes here.

File details

Details for the file iaes-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: iaes-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 21.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for iaes-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f932f194141f7b929d8e2ef21d8bf067af4dbe96df820a7fd0d3d27bcd1934bc
MD5 fe846b449d18f44355ed087348b52a6a
BLAKE2b-256 b6583a44a45dda1de1b476262a6da0b751e90603fd6a8f69131baa0e212f0945

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page