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 Node-RED 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/sdk                 # TypeScript / Node.js
npm install node-red-contrib-iaes     # Node-RED

Publish Events

The SDK includes a Client that sends IAES events to any compliant endpoint via HTTPS.

Python:

from iaes import Client, AssetMeasurement

client = Client("https://your-endpoint.example.com", api_key="your-key")
event = AssetMeasurement(
    asset_id="MOTOR-001",
    measurement_type="vibration_velocity",
    value=4.2,
    unit="mm/s",
    source="acme.sensors.plant1",
)
result = client.publish(event)

TypeScript:

import { IaesClient, AssetMeasurement } from "@iaes/sdk";

const client = new IaesClient("https://your-endpoint.example.com", {
  apiKey: "your-key",
});
const event = new AssetMeasurement({
  asset_id: "MOTOR-001",
  measurement_type: "vibration_velocity",
  value: 4.2,
  unit: "mm/s",
  source: "acme.sensors.plant1",
});
const result = await client.publish(event);

The endpoint URL is any IAES-compliant receiver — your own backend, a cloud broker, or a third-party integration.

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/sdk"

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.

Node-RED

node-red-contrib-iaes provides 7 nodes for visual IAES workflows:

Node Purpose
iaes-measurement Create asset.measurement events from sensor inputs
iaes-health Create asset.health events from AI models or expert rules
iaes-work-order Create maintenance.work_order_intent events
iaes-validate Validate any IAES envelope against JSON Schema
iaes-sparkplug Bridge Sparkplug B payloads to/from IAES format
iaes-publish Publish IAES events to any compliant HTTP endpoint
iaes-route Route events by type, severity, or custom expressions
npm install node-red-contrib-iaes

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 — 7 nodes
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.2.1.tar.gz (98.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.2.1-py3-none-any.whl (25.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: iaes-0.2.1.tar.gz
  • Upload date:
  • Size: 98.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.2.1.tar.gz
Algorithm Hash digest
SHA256 015e33b19c404f315731a24015ae87dadc03a4be1be8a218d65cbb6426e4ab86
MD5 e1f02c26639f0c548cc2fe28058dd5d3
BLAKE2b-256 683cdf4425105f02a2231c909d2889e7d0c85a7f6c62963ed8f201eb6c4b0d2b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: iaes-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 25.2 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.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 51fa23fc54b93732f52ddeb051add8a09214dc7dd37f9cf49f929aba17df2d96
MD5 b04c13be545d417a1f3a3625371b47c0
BLAKE2b-256 0f367eab9573c8a8444428b0a40523a2a7607b442c606cae6a9400fe4efb9ecd

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