Spaxiom Logo
Spaxiom Use Case - Appendix A.2

Rotating Machinery & Industrial Assets

Using Spaxiom for Predictive Maintenance with Vibration & Acoustic Analysis

Joe Scanlin

November 2025

About Spaxiom & INTENT

Spaxiom is a sensor abstraction layer and runtime that translates billions of heterogeneous sensor streams into structured, semantic events. It provides a spatial-temporal DSL for defining zones, entities, and conditions, making it easy to build context-aware applications across industries.

INTENT (Intelligent Network for Temporal & Embodied Neuro-symbolic Tasks) is Spaxiom's high-level event vocabulary. Instead of overwhelming AI agents with raw sensor data, Spaxiom emits compact, meaningful events that agents can immediately understand and act upon.

TL;DR

Industrial facilities have critical rotating equipment like pumps, compressors, and turbines that cost millions if they fail unexpectedly. Today's predictive maintenance relies on vendor-specific tools, manual analysis, and complex vibration data that's hard to interpret. The challenge is that each vendor's vibration analyzer, acoustic sensor, and electrical monitor uses proprietary formats that don't integrate with each other, making it impossible for AI agents to get a unified view of machine health.

Spaxiom acts as a "machinery health cortex" that combines vibration sensors, acoustic monitoring, temperature readings, and electrical measurements into one unified system. Instead of engineers having to analyze complex frequency spectrums, Spaxiom translates everything into simple health scores and actionable alerts like "bearing degradation detected in Pump P-101" or "imbalance warning in Compressor C-204." This helps maintenance teams catch problems early, schedule repairs at optimal times, and prevent catastrophic failures that shut down production.

A.2 Rotating Machinery & Industrial Assets (Vibration / Acoustic)

Critical rotating equipment (pumps, fans, compressors, gearboxes, turbines) is instrumented heavily in modern industrial facilities. Traditional "predictive maintenance" stacks often revolve around vendor-specific vibration analyzers, ad-hoc thresholds, and periodic offline analysis. However, the semantics of what operators actually care about are higher-level:

Spaxiom can serve as a machinery health cortex, fusing vibration, acoustic, electrical, and thermal measurements into structured INTENT events that agents and engineers can reason over consistently across vendors and plants.

Sensors and deployment

For a rotating asset m (e.g., pump P-101), typical sensors include:

Spaxiom does not need to operate at raw waveform level; instead, it consumes features precomputed either at the edge or inside a preprocessor:

INTENT events and health indices

From these features, Spaxiom defines higher-level INTENT events such as:

For a machine m and window [t0, t1], suppose we have:

Normalized feature integrals. Define normalized, windowed feature integrals:

V1Xm = (1/Δt) ∫t0t1 v1Xm(t)/σ1Xm,base dt,     VBDm = (1/Δt) ∫t0t1 vBDm(t)/σBDm,base dt

where Δt = t1 - t0 and σ·m,base are baseline (healthy) standard deviations.

Similarly define:

Km = (1/Δt) ∫t0t1 km(t) dt,     Texcessm = (1/Δt) ∫t0t1 max(0, Tm(t) - Tbasem(Lm(t))) dt

where Tbasem(L) is the expected temperature as a function of load (learned from historical data).

Composite health score. We can define a simple machine health "anomaly score":

Hm = w1V1Xm + w2VBDm + w3Km + w4Texcessm

with weights wi ≥ 0 tuned per machine or class. High Hm indicates abnormal behavior over the window.

Discrete INTENT events. We can then create discrete INTENT events when:

Hm > τwarnm   or   Hm > τalarmm

yielding MachineHealthWarning or MachineHealthAlarm for machine m.

Spaxiom-style implementation sketch

In the DSL, a rotating machine entity might encapsulate feature histories and health computation:

from spaxiom import Condition
from spaxiom.temporal import within
from spaxiom.logic import on

class RotatingMachine:
    def __init__(self, name, feat_source):
        self.name = name
        self.feat_source = feat_source  # e.g., streaming feature vectors

        # Baseline stats & thresholds (could be learned)
        self.sigma_1x = 0.12
        self.sigma_bd = 0.08
        self.warn_threshold = 2.0
        self.alarm_threshold = 4.0

    def feature_history(self, window_s: float):
        """
        Returns a list of (dt, features) where features is a dict like:
        {
            "v_1x": ...,
            "v_bd": ...,
            "kurtosis": ...,
            "temp": ...,
            "load": ...,
        }
        """
        return self.feat_source.history(window_s=window_s)

    def expected_temp(self, load: float) -> float:
        # Simple linear model as placeholder; could be learned per machine
        return 40.0 + 25.0 * load

    def health_score(self, window_s: float) -> float:
        series = self.feature_history(window_s)
        if not series:
            return 0.0

        sum_v1x = sum_vbd = sum_k = sum_texcess = 0.0
        total_dt = 0.0

        for dt, f in series:
            v1x = f["v_1x"] / max(self.sigma_1x, 1e-6)
            vbd = f["v_bd"] / max(self.sigma_bd, 1e-6)
            k   = f["kurtosis"]
            temp = f["temp"]
            load = f["load"]

            texcess = max(0.0, temp - self.expected_temp(load))

            sum_v1x     += v1x * dt
            sum_vbd     += vbd * dt
            sum_k       += k * dt
            sum_texcess += texcess * dt
            total_dt    += dt

        if total_dt <= 0:
            return 0.0

        V1x = sum_v1x / total_dt
        Vbd = sum_vbd / total_dt
        K   = sum_k / total_dt
        Tex = sum_texcess / total_dt

        w1, w2, w3, w4 = 0.4, 0.3, 0.2, 0.1
        return w1 * V1x + w2 * Vbd + w3 * K + w4 * Tex

# Example machine instance
pump_101 = RotatingMachine("P-101", feat_source=pump_101_feat_stream)

# Conditions that trigger warnings/alarms over the last 24 hours
warn_condition = Condition(
    lambda: pump_101.health_score(window_s=24 * 3600) > pump_101.warn_threshold
)
alarm_condition = Condition(
    lambda: pump_101.health_score(window_s=24 * 3600) > pump_101.alarm_threshold
)

@on(within(3600, warn_condition))   # evaluate every hour
def pump_warning_agent():
    score = pump_101.health_score(window_s=24 * 3600)
    emit_intent_event({
        "type": "MachineHealthWarning",
        "machine": pump_101.name,
        "score": score,
        "window_h": 24,
    })
    # Optional: hand off to LLM for recommended maintenance actions.

@on(within(600, alarm_condition))   # evaluate every 10 minutes
def pump_alarm_agent():
    score = pump_101.health_score(window_s=24 * 3600)
    emit_intent_event({
        "type": "MachineHealthAlarm",
        "machine": pump_101.name,
        "score": score,
        "window_h": 24,
    })
    # Optionally, trigger interlocks, derates, or automated shutdown logic.

This sketch illustrates how Spaxiom:

Rotating Machinery Health Score and Components (Pump P-101)
1X Vibration (V1Xm)
Bearing Defect (VBDm)
Kurtosis (Km)
Temp Excess (Texcessm)
Health Score (Hm)
Vibration Components 3.0 2.0 1.0 0 Kurtosis & Temperature Excess 3.0 2.0 1.0 0 Composite Health Score Hm 5.0 3.75 2.5 1.25 0 0d 3d 6d 9d 12d 15d Alarm (4.0) Warn (2.0) ⚠ Warning 🚨 Alarm Bearing degradation →

Figure A.2: Rotating machinery health score and components for Pump P-101 over 15 days. Panel 1 shows normalized 1X vibration (orange) and bearing-band vibration (red), with bearing defects gradually increasing. Panel 2 shows spectral kurtosis (blue) and temperature excess (green), both rising as bearing condition deteriorates. Panel 3 shows the composite health score Hm (purple) crossing the warning threshold at day 9 and alarm threshold at day 11, triggering corresponding INTENT events.