← Back
Home › Systems › Industry and field operations

enterprise-asset-management

Keeps physical assets such as pumps, vehicles and track working over their whole life by turning maintenance plans into work orders that use labor and spare parts.

IBM Maximo, SAP PM, IFS

Open the enterprise-asset-management pageenterprise-asset-man… Barcode symbologiesdata-structures: Encode/decode 1D and 2D barcodes (Code 128, DataMatrix, QR) with their error correctionDurable workflow executiondistributed: Ordinary code made crash-proof by logging every side-effect result and replaying the code from that log; activities run at least once, workflow logic must be deterministic.›Offline mutation queuedistributed: Apply actions locally at once and queue them durably; on reconnect replay the queue idempotently, then re-apply unconfirmed ones on the server state.›Fault tree analysisembedded: Write the unwanted top event as AND/OR logic over component failures, reduce it to minimal cut sets, then compute its probability and each failure's share.›Opc uaembedded: OPC UA industrial protocol: address space, subscriptions and monitored items, security modesInventory reservationfinance: Reserving stock with TTL holds, release on timeout and no overselling under contentionLinear referencinggeometry: Locate events and attributes along a route by measure (distance from start) and project points onto routes, with calibration pointsMqtt protocolnetworking: MQTT pub/sub: topics, QoS 0/1/2, retained messages, sessions and keepaliveInventory policies safety stockoptimization: (s,S), base-stock, EOQ and newsvendor policies with safety stock from demand uncertaintyTamper-evident audit logsecurity: An append-only log whose Merkle root, signed per batch, lets anyone verify an entry is present and history was never rewritten, with log-size proofs.›Croston methodstatistics: Forecasting intermittent demand by separately smoothing demand sizes and intervals (Croston, SBA, TSB)Remaining useful lifeestimationstatistics: Degradation and survival models predicting time to failure from condition dataWeibull reliability analysisstatistics: Fit Weibull shape and scale to failure and right-censored times (MLE or rank regression) to get hazard rate, MTBF and B10 lifeClosure tablestorage: Storing trees and hierarchies in relational tables (closure table, materialized path) for fast subtree queriesOptimistic concurrency controlstorage: Run transactions without locks, record what they read, and validate at commit that nothing changed; fastest when conflicts are rare.›Business day calendarssystems: Holiday calendars, business-day adjustment rules (following, modified following) and settlement cyclesCalendar date arithmeticsystems: Civil dates, time zones (tzdb), DST gaps, month-end anchoring and duration mathEvent condition action rulessystems: Event-condition-action rule engines for automations, edit checks and alertsHierarchical state machinesystems: Nest states so a substate inherits its parent's reactions and only overrides what differs, with ordered entry and exit actions along the path.›Recurrence rule expansionsystems: Expand an RFC 5545 RRULE lazily, in local wall-clock time, into concrete instants; store the rule, materialise only a bounded horizon.›Durable job queuedistributed: Persisted tasks that workers lease for a visibility timeout, ack on success and retry with backoff; at-least-once execution that survives worker and queue crashes.›Record replaydistributed: Record every nondeterministic input (time, randomness, I/O, model and tool outputs, per-tick player input) and re-execute deterministically for debugging, replays and state rebuildEvent sourcingfinance: Persist state changes as an append-only stream of immutable events per entity; current state is a fold over them, guarded by expected-version appends.›Exponential backoff with jittersystems: Retry after delays that grow geometrically and are randomized, so failed clients spread out instead of hammering a recovering service in synchronized waves.›BFS and DFSgraphs: The two basic graph traversals; BFS gives hop distances and levels, DFS gives discovery/finish order for cycles, components and topological order.›Binary decision diagramsoptimization: A reduced ordered BDD stores a Boolean function as a shared DAG that is unique per variable order, so equivalence is one integer compare and counting is one pass.›Idempotency keysfinance: Client-chosen unique key per logical operation, stored with a request fingerprint and the final response, so retries replay the first result instead of acting twice.›Conditional writesdistributed: Put-if-absent / if-match compare-and-swap on objects or keys as a commit primitiveHierarchical timing wheelsystems: Timers bucketed by expiry into wheels of slots, coarser wheels for far deadlines: O(1) insert and cancel for millions of timeouts.›Monte Carlo integrationnumerics: Estimate an expectation by averaging random samples; error falls as σ/√N in any dimension, and variance reduction (antithetic, control variates, importance sampling) shrinks σ.›Time-series forecasting(baselines, model families, ba…statistics: The end-to-end recipe: fix horizon and uncertainty, beat naive baselines, choose a model family, and validate with rolling-origin backtests and scale-free metrics.›Merkle treedata-structures: Hash tree for verifying and diffing large datasets with logarithmic proofs+ 9 moreDead-letter queuedistributed: A side queue for messages that keep failing: after N delivery attempts or a permanent error, park them with the reason so the main queue keeps moving.›Write-ahead logstorage: Append each change to a checksummed sequential log and fsync it before touching data pages; the basis of crash durability in nearly every database.›Leasesdistributed: A lock that expires on its own: bounded-time ownership that survives crashes and partitions, given bounded clock drift and fencing tokens on writes.›Sparse matrices (CSR)numerics: Compressed sparse row stores only nonzeros as row pointers, column indices and values; SpMV streams them once, so it is memory-bandwidth bound.›PRNGs (PCG, xoshiro)numerics: Small, fast, statistically strong non-cryptographic generators: PCG32 and xoshiro256**, with seeding, parallel streams and unbiased ranges.›Cryptographic hashes (SHA-2,BLAKE3)security: Collision-resistant fingerprints of data; SHA-256 for interoperability, BLAKE3 for speed, HMAC/HKDF for keyed uses.›Slab allocatorsystems: Pre-carve pages into equal-size slots per size class with an in-place free list: O(1) alloc and free, no external fragmentation, cache-warm reuse.›Rejection samplingml-training: Best-of-n and filtered sampling: generate many candidates, keep those passing a verifier or reward thresholdArimastatistics: ARIMA/SARIMA forecasting: differencing, AR and MA terms, order selection, maximum-likelihood fitExponential smoothing (ETS,Holt-Winters)statistics: Forecast by keeping a few running states (level, trend, seasonal) updated by a fraction of each forecast error; O(1) memory per series and a strong baseline.›STL decomposition(seasonal-trend with loess)statistics: Split a series into trend, seasonal and remainder with iterated loess smoothing; the seasonal shape may drift and robust weights keep outliers out of it.›Time-series cross-validation(rolling origin)statistics: Estimate forecast error by repeatedly training on the past and testing on the next h steps, moving the origin forward; never trains on the future.›+ 6 moreCRC32C checksumshardware-os: The Castagnoli CRC-32 with dedicated instructions on x86 (SSE4.2) and ARMv8. It is the standard fast integrity check for storage blocks, logs and network frames.›fsync, O_DSYNC and O_DIRECThardware-os: What fsync, fdatasync, O_DSYNC, O_DIRECT and F_FULLFSYNC really guarantee on Linux and macOS, and the exact call sequences for crash-safe files.›Fencing tokensdistributed: A number that grows with every lock grant and is checked by the protected resource, so a paused ex-holder's late write is rejected.›Finite differencesnumerics: Replace derivatives with weighted differences of grid values; simple stencils plus a stability condition (CFL) turn PDEs like heat, advection and waves into array loops.›L-BFGSnumerics: Quasi-Newton minimizer that approximates the inverse Hessian from the last m gradient differences via the two-loop recursion; O(m·n) memory and work per step.›Kalman filterrobotics: Optimal recursive estimator for a linear system with Gaussian noise: fuses a motion model with noisy measurements into a state estimate plus its covariance.›Robust statisticsstatistics: Location and scale estimates (median, MAD, trimmed mean, Huber M-estimator) that stay correct when a minority of the data is garbage.›Evaluation metricsmachine-learning: Precision, recall, ROC AUC, average precision, log loss, NDCG and pass@k computed correctly, plus paired confidence intervals for comparing models.›+ 1 moreSIMD programminghardware-os: Process 4-16 lanes per instruction with AVX2, AVX-512 or NEON via Rust std::arch, with runtime dispatch and a portable fallback.›Explicit Eulernumerics: Step an ODE forward by its current slope, y += h·f(t, y); first-order, one evaluation per step, the baseline every other integrator is measured against.›Thomas tridiagonal solvernumerics: O(n) tridiagonal linear solve used in implicit finite-difference and spline schemesLoss functionsmachine-learning: The scalar a model minimizes: cross-entropy for classes and tokens, MSE or Huber for values, each with a stable form and simple gradient.›Bootstrap confidence intervalsstatistics: Resampling-based confidence intervals for arbitrary statistics

How it is built

Architecture overview

Enterprise asset management (EAM) keeps physical assets (pumps, vehicles, buildings, rail track, pipelines) working over their whole life. It grew out of the computerised maintenance management system (CMMS) and adds life-cycle, warranty, mobile and portal functions on top of maintenance planning (source: Wikipedia, Enterprise asset management). A commercial suite such as IBM Maximo describes the same scope as asset and work management, monitoring with sensor and meter data, prediction, and investment planning (source: IBM, Maximo product page).

At the centre is one small loop: an asset (a node in a hierarchy) has a plan (time- or meter-based rules), the plan produces work orders, the work orders consume labour and spare parts, and the history of finished work feeds back into reliability analysis that changes the plan. Everything else is an input to that loop (sensor readings, failures reported by people) or an output of it (cost, compliance records). The design problems are therefore data-shaped rather than algorithmic: a deep, changing asset tree; generation of recurring work from rules; a work-order state machine with approvals; intermittent, hard-to-forecast demand for spare parts; field crews without network; and an audit trail that stands up to a regulator.

Parts:

 sensors / PLCs ─OPC UA, MQTT─► gateway ─► rule engine ──────────────┐   (condition met → request)
                                              ▲                      ▼
 PM plans (time / meter) ─► generator job ───►│          work request ─► work order (state machine, approvals)
 (recurrence rules,                           │                          │        │            │
  calendars)                    asset registry (tree) ◄── history ◄──────┘        │            │
                                   ▲        │                                      ▼            ▼
                       reliability analysis ┘                      parts reservation     crew schedule
                       (Weibull, RUL, fault tree)                  (stock, safety level)  (skills, calendars)
                                   ▲                                      │            │
                                   └──────────── actuals (time, parts, failure codes) ◄─┘
                                                                       ▲
                                         mobile app (offline queue, barcode scan) ┘
                          every write ─► audit log (hash chain)

How the parts fit together

Asset registry

Assets form a tree (site, building, line, machine, component), and the same piece of equipment often also belongs to a second view (a process system, a cost centre). Work, cost and failures must roll up the tree, so queries such as "all open work under this line, at any depth" are the common ones. A closure table (closure-table, no page yet) stores every ancestor-descendant pair, which makes subtree queries a single join; the price is that moving a subtree rewrites its rows, acceptable because assets move rarely. The alternative, recursive queries on a parent column, is simpler but slower on deep trees. A tree rebuilt at every read does not scale to hundreds of thousands of assets.

Linear assets (a rail line, a pipeline, a road) are not points. Their locations are given as a distance along the route, and a defect or a repair is a point or a stretch on it; when the route is realigned, the stored measures are recalculated, which is a known maintenance burden of the method (source: Wikipedia, Linear referencing, block linear-referencing, no page yet). Point assets such as a lift or a transformer are geo-referenced and placed on a map with a Geospatial cell index (geohash, S2, H3). Edits to one asset by several users use Optimistic concurrency control: a version number on the row, so a stale save fails visibly instead of silently overwriting.

Preventive planning

A preventive-maintenance (PM) plan states a frequency (calendar, runtime or both), a lead time and a work-order template. The generator expands the rule into dates (Recurrence rule expansion, which handles "last Friday of the month" and exceptions), uses calendar rules (calendar-date-arithmetic, business-day-calendars, both no page yet) to move a due date off a holiday or a shutdown, and creates the next work order from the template. For meter-based plans the trigger is a counter reading rather than a date: the plan keeps the reading at last completion and the interval, and a new reading that crosses the threshold generates the order.

The generator is a periodic job that must be idempotent: re-running it after a crash must not create the same order twice. A Durable job queue with a natural key (plan id plus due date) gives that. A common design choice is to generate orders a fixed horizon ahead (for example the next two months) rather than all at once, so a plan change only needs to revisit orders not yet released.

Work management

A work order has a life: requested, approved, planned, scheduled, in progress, completed, closed or cancelled. Rules differ by state (a cancelled order cannot take new actuals; a closed one is frozen), and a parent order can have child orders and tasks with their own states, so a flat status column is not enough. A Hierarchical state machine encodes this, with nested states for the shared behaviour (everything "open" accepts comments) and transitions guarded by role and by content (an order cannot close without a failure code). Long approval chains, waits for parts, and retries run on Durable workflow execution, so a deploy or a crash does not lose an order half-way through approval.

Event-condition-action rules (event-condition-action-rules, no page yet) add the reactive glue: "when a reading exceeds X and no open order exists for this asset, create a corrective request". They are kept as data so planners can edit them without a release. Scheduling the crew is a job-shop style problem with skills, calendars and priorities (Job-shop scheduling); most products ship a manual board with checks rather than a solver, and a solver is added where shutdown windows are tight.

Condition monitoring

Sensors reach the system through industrial protocols. OPC UA (opc-ua, no page yet) is the machine-vendor-neutral standard for reading structured values from controllers, and MQTT (mqtt-protocol, no page yet), a publish-subscribe protocol, is the usual link for lightweight sensor feeds (source: OASIS MQTT 5.0 specification; OPC Foundation reference). A gateway at the plant reads or subscribes, adds an asset id and timestamp, and forwards.

The raw stream is far too large to keep as is: Windowed stream aggregation reduces it to per-asset windows (mean, max, count over threshold). Thresholds on a window are the simplest rule; a Control charts (Shewhart, CUSUM, EWMA) approach catches drift that a fixed threshold misses, and Time-series anomaly detection covers the case where "normal" depends on load. The output is a request through the rule engine, never a work order written directly, so the same approval and de-duplication rules apply.

Reliability analytics

Completed work orders with failure codes are the data. The Weibull distribution (weibull-reliability-analysis, no page yet) is the standard failure-time model; its shape parameter tells whether the failure rate falls, stays constant or rises with age, and the constant case is the exponential model (source: NIST/SEMATECH e-Handbook of Statistical Methods, Weibull page). Fitted per component class, it tells the planner whether time-based replacement helps at all: when the rate is constant, replacing early does not reduce failures. Weibull's original paper is the classic reference (Weibull 1951).

Remaining-useful-life estimation (remaining-useful-life-estimation, no page yet) uses a monitored degradation signal to predict when a threshold will be crossed; Si et al. 2011 review the statistical data-driven approaches. Fault tree analysis works top-down for safety-critical systems: it combines component failure probabilities into the probability of a system-level event and identifies single points of failure. These analyses feed reliability-centred maintenance, a method that asks, per failure mode, what task (if any) is worth doing (source: Wikipedia, Reliability-centered maintenance, which cites SAE JA1011 as the minimum criteria for an RCM process). Their output is a change in a plan's interval or task list, which closes the loop.

Spares and inventory

Parts are different from ordinary retail stock: most are used rarely and irregularly, and a missing one can stop a plant. Demand with many zero periods defeats ordinary smoothing; Croston's method (croston-method, no page yet) forecasts the demand size and the interval between demands separately (Croston 1972), and Syntetos and Boylan showed the original estimator is biased and proposed a correction. The forecast feeds a reorder point and safety stock (inventory-policies-safety-stock, no page yet; see also Wikipedia, Reorder point).

Planned work reserves its parts in advance so a second order cannot claim the same stock (inventory-reservation, no page yet); the reservation is released if the order is cancelled. A barcode or QR scan identifies the part or the asset at the point of use (barcode-symbologies, no page yet), which cuts keying errors in the field. For the general time-series side see Time-series forecasting (baselines, model families, backtests).

Mobile client and audit

A technician works in a plant room with no coverage. Each action (start work, add time, scan a part, close the order) is recorded locally and queued with an id, then delivered exactly once when the network returns (Offline mutation queue), with changes flowing back down by cursor (Incremental sync cursors). Conflicts are rare because one order has one assignee, and versions from the registry catch the rest.

Maintenance records are evidence: a regulator may ask who inspected a lifting device and when. A Tamper-evident audit log chains every write with a hash, so edits or deletions afterwards are detectable. Access follows roles and plant scope (Authorization models (RBAC, ABAC, ReBAC)): a planner sees their site, a contractor sees only assigned orders.

Data and control flow

A preventive order, end to end:

  1. The nightly generator reads active PM plans, expands recurrence rules for the horizon and adjusts for calendars.
  2. For each due date it enqueues a job keyed by plan id and date; the job creates a draft order from the template and attaches the asset.
  3. The order enters the state machine; approval runs as a workflow with timers and reminders.
  4. On approval the planner assigns a crew and slot; parts are reserved.
  5. The technician opens the order on the handheld, scans the asset, logs time and parts, enters a failure code if one was found, and closes it; the app queues these offline.
  6. The server applies the mutations, releases or consumes the reservation, writes history to the asset, and appends the audit entries.
  7. Completion starts the clock for the next occurrence (for plans scheduled "from completion").

A condition-triggered request:

  1. A sensor value arrives through the gateway and is aggregated into a window.
  2. The rule engine evaluates the rule: threshold or control-chart signal, and no open order for this asset.
  3. It creates a request with the evidence (window, values) attached; a planner approves it into a work order.
  4. After the work, the failure code and readings go to reliability analytics.

Scaling

  1. Asset tree size and depth: with hundreds of thousands of assets, subtree reads dominate. Levers: closure table, cached rollups per node, and loading the tree lazily in the client.
  2. Sensor volume: tens of thousands of tags at one-second rates. Levers: aggregate at the gateway, store only windows and events, and keep raw data in a time-series store with short retention.
  3. Plan expansion: many plans times a long horizon. Lever: generate only the near horizon and re-run daily.
  4. Mobile sync: large downloads on weak links. Levers: scope the downloaded data to the crew's sites and assigned orders, sync by cursor, compress.
  5. Multi-site tenancy: sites with different calendars and languages. Lever: partition by site, with the tree as the shared parent.

Failure modes

FailureSymptomCauseFix
Duplicate preventive ordersthe same inspection appears twicegenerator re-run without idempotencyjob key of plan and date; unique constraint
Orders never generatedthe maintenance backlog looks emptyplan expansion failed silently (invalid rule, time zone)alert on a plan with no future order; test rules at save
Wrong due date at month end or holidaysorder lands on a closed daycalendar arithmetic ignores working days or time zonesexplicit calendar rules; store dates, not instants, for calendar-based plans
Meter plan never firesa machine runs far past its intervalmeter readings not entered or resetalert on stale meters; validate monotonic readings
Alarm stormhundreds of auto requests from one faultrules have no de-duplication per assetone open request per asset and rule; hold-off window
Stale asset savea later edit silently overwrites an earlier oneno version checkoptimistic concurrency with a version field
Double-booked parttwo orders reserve the last itemreservation without a transactional checkreserve inside a transaction against available stock
Offline conflictthe technician's close is rejected after syncorder was cancelled or reassigned meanwhileshow the conflict, keep the local record, let the planner decide
Spare-part stock-outan order waits for a part nobody stockedsmoothing on intermittent demand under-forecastsintermittent-demand method; criticality-based minimum stock
Altered historyan auditor cannot trust past recordsrows editable by admins without tracehash-chained audit log; correction as a new entry

Real implementations

Large suites are proprietary; the open projects below cover the core loop (assets, work orders, preventive plans) and the protocol layers.

namewhat it isrepolicencenotes
IBM Maximocommercial EAM suite: asset and work management, monitoring, prediction— (closed source)—scope per IBM product page
Atlas CMMSself-hosted CMMS: work orders, assets, preventive maintenance, mobile appsGrashjs/cmmsAGPL-3.0web and mobile, Docker deployment
ERPNextopen ERP with an Asset module (register, depreciation, maintenance, movement)frappe/erpnextGPL-3.0asset docs: docs.frappe.io
openMAINTopen-source CMMS built on the CMDBuild configuration platform, with GIS and BIM supportopenmaint.orgsee sitemaintained by PAT srl; source link not given on the home page
open62541OPC UA implementation in C for clients and serversopen62541/open62541MPL-2.0the plant-side protocol layer
Eclipse MiloOPC UA implementation in Javaeclipse-milo/miloEPL-2.0server and client SDK
NanoMQlightweight MQTT broker for the edgenanomq/nanomqMITgateway-side broker
Eclipse Dittodigital-twin framework: a model of each device and its stateeclipse-ditto/dittoEPL-2.0can hold the live state next to the asset record

The alternative: a pure CMMS keeps only the work-order loop (equipment list, PM schedule, parts) and leaves finance, life-cycle and condition monitoring to other systems. It is quicker to introduce for one plant, but the asset record is split across tools; full EAM pays back when one asset tree has to serve operations, finance and compliance together.

Sources

  • Wikipedia, Enterprise asset management (scope; origin in CMMS). page
  • IBM, Maximo product page (suite scope). page
  • Wikipedia, Linear referencing (measures along a route; maintenance burden). page
  • Wikipedia, Reliability-centered maintenance (RCM questions, task types, SAE JA1011). page
  • NIST/SEMATECH, e-Handbook of Statistical Methods, Weibull distribution. page
  • W. Weibull, A Statistical Distribution Function of Wide Applicability, Journal of Applied Mechanics, 1951. DOI (publisher returns 403 to scripts; confirmed via Crossref)
  • J. D. Croston, Forecasting and Stock Control for Intermittent Demands, Journal of the Operational Research Society, 1972. DOI (same note)
  • A. A. Syntetos and J. E. Boylan, On the bias of intermittent demand estimates, International Journal of Production Economics, 2001. DOI
  • X.-S. Si, W. Wang, C.-H. Hu and D.-H. Zhou, Remaining useful life estimation: a review on the statistical data driven approaches, European Journal of Operational Research, 2011. DOI
  • Wikipedia, Reorder point. page
  • OASIS, MQTT Version 5.0. spec
  • OPC Foundation, OPC UA reference. reference
  • ERPNext Asset documentation. docs
  • openMAINT. site
  • Repositories in the table above (licences from the GitHub API or the project's README).

Similar systems

Share the most building blocks with this one.