Asoba Ona Documentation

Ona Intelligence Layer

Backend infrastructure that absorbs unreliable energy data and exposes stable intelligence your systems can depend on.

Ona Intelligence Layer


Overview

Ona is an intelligence layer for energy systems. It connects to your inverters and energy assets via standard APIs, serving as complete middleware for the data pipelines necessary to run ML/AI models. These models can be called via API or SDK, embedded directly within your existing business logic.

This is a platform that supports your technical roadmap, rather than forcing you to adjust your business logic to fit the platform’s idiosyncrasies. Integrate once, consume intelligence through the interfaces you already use.

Ona is not a single product — it is three layers that work together:


Capability Matrix

Where each capability lives in the stack. ● Full · ◐ Partial · ○ Absent

Capability ODSE SDK Core Platform
Ingestion & Data      
Inverter telemetry (HTTP poll, 8 vendors)
On-prem agent / push API for closed networks
SCADA / IEC 61850 substation connector
MQTT / OPC-UA industrial connector
Smart-meter / AMR ingest (Eskom-compatible)
Bulk historical CSV import + reject reports
Standardised data schemas (ODSE-equivalent)
Detection & Analytics      
Fault register + state-machine + revenue-impact (ZAR)
Predictive-maintenance signals (snapshot)
Performance-opportunity engine (11 deterministic detectors)
Plant soiling & cleaning recovery-gain audit
Asset prognostics (remaining-useful-life / degradation)
BESS state-of-health + warranty triggers
Generation + revenue forecasting (P50/P90)
Drone / thermal imagery diagnostics
Operations / CMMS      
Work-order / CMMS workflow (open → close + chain audit)
Parts inventory & stock movements
Technician roster, skills & dispatch
Preventive-maintenance scheduler
Field-mobile / offline PWA for technicians
Site commissioning chain (acceptance → handover)
Access & UX      
Dashboards, KPI roll-ups, exports
Multi-tenant auth + roles + RBAC
Contractor / asset-owner self-service portal (tokenised)
Public SDK for third-party integrators

Notes:


How the Layers Work Together

Raw telemetry arrives in inconsistent formats across OEMs and protocols. ODSE absorbs that at the ingestion boundary — enforcing schema contracts, normalising across Huawei, Enphase, SCADA, MQTT, OPC-UA, and Eskom AMR formats, flagging data quality issues before they propagate. Nothing reaches the analytics layer without passing through that schema validation.

The Core Platform runs the intelligence stack on top of clean, schema-validated data: fault detection and OODA diagnostics, soiling and recovery-gain analysis, asset prognostics, BESS state-of-health, P50/P90 forecasting, and a model training pipeline with challenger/production promotion and auditable rollback.

The SDK exposes that intelligence through stable API contracts. Your systems integrate once against the SDK surface. The underlying models improve, retrain, and iterate without breaking your integration.


What It Replaces

Without this stack, teams build:

Ona centralises all of this behind a single integration boundary, with schema enforcement at ingestion and stable API contracts at consumption.


What It Is Not


Integration

Install the SDK from GitHub and set your API key (contact support@asoba.org to get one).

# JavaScript
git clone https://github.com/AsobaCloud/sdk.git && cd sdk/javascript && npm install

# Python
git clone https://github.com/AsobaCloud/sdk.git && cd sdk/python && pip3 install -e .

Inverter Telemetry API

Query and stream live power output, energy, and state data from solar inverters.

Python:

from ona_platform import OnaClient
from ona_platform.models.telemetry import TimeRange
import os

client = OnaClient(
    inverter_telemetry_endpoint=os.environ["INVERTER_TELEMETRY_ENDPOINT"],
    inverter_telemetry_api_key=os.environ["INVERTER_TELEMETRY_API_KEY"],
)

# Query historical data
records = client.inverter_telemetry.get_inverter_telemetry(
    asset_id="INV-1000000054495190",
    site_id="Sibaya",
    time_range=TimeRange(start="2025-11-01T00:00:00", end="2025-11-01T12:00:00"),
    resolution="5min",
    limit=100,
)

# Stream live data
for record in client.inverter_telemetry.stream_inverter(
    asset_id="INV-1000000054495190",
    site_id="Sibaya",
    polling_interval=30,
):
    print(f"{record.timestamp}: {record.power} kW")

JavaScript:

const { OnaSDK } = require('./src/index');

const sdk = new OnaSDK({
  endpoints: { inverterTelemetry: process.env.INVERTER_TELEMETRY_ENDPOINT },
  inverterTelemetryApiKey: process.env.INVERTER_TELEMETRY_API_KEY,
});

const records = await sdk.inverterTelemetry.getInverterTelemetry({
  asset_id: "INV-1000000054495190",
  site_id: "Sibaya",
  time_range: { start: "2025-11-01T00:00:00", end: "2025-11-01T12:00:00" },
  limit: 100,
});

for await (const record of sdk.inverterTelemetry.streamInverter({
  asset_id: "INV-1000000054495190",
  site_id: "Sibaya",
  polling_interval: 30,
})) {
  console.log(`${record.timestamp}: ${record.power} kW`);
}

OODA Terminal Alerts API

Query and stream fault detection and diagnostic alerts from terminal devices.

Python:

from ona_platform.models.ooda import TimeRange

client = OnaClient(
    ooda_terminal_endpoint=os.environ["OODA_TERMINAL_ENDPOINT"],
    ooda_terminal_api_key=os.environ["OODA_TERMINAL_API_KEY"],
)

alerts = client.ooda_terminal.get_terminal_alerts(
    terminal_device_id="TERM-1000000054495190",
    site_id="Sibaya",
    time_range=TimeRange(start="2025-11-01T00:00:00", end="2025-11-01T12:00:00"),
)

for alert in client.ooda_terminal.stream_terminal(
    terminal_device_id="TERM-1000000054495190",
    site_id="Sibaya",
    polling_interval=30,
):
    print(f"{alert.timestamp}: [{alert.alert_severity}] {alert.message}")

JavaScript:

const sdk = new OnaSDK({
  endpoints: { oodaTerminal: process.env.OODA_TERMINAL_ENDPOINT },
  oodaTerminalApiKey: process.env.OODA_TERMINAL_API_KEY,
});

for await (const alert of sdk.oodaTerminal.streamTerminal({
  terminal_device_id: "TERM-1000000054495190",
  site_id: "Sibaya",
  polling_interval: 30,
})) {
  console.log(`${alert.timestamp}: [${alert.alert_severity}] ${alert.message}`);
}

Live Endpoints

API Endpoint
Inverter Telemetry https://af5jy5ob3e.execute-api.af-south-1.amazonaws.com/prod
OODA Terminal Alerts https://3lpq00xevg.execute-api.af-south-1.amazonaws.com/prod
Partner API https://8el3o25tc1.execute-api.af-south-1.amazonaws.com/prod

Deployment Options

SaaS (Managed Infrastructure)

Cloud-hosted with managed infrastructure.

On-Premises (Self-Hosted)

Local installation for data sovereignty requirements.


Getting Started

Week 1–2: Integration

Connect SCADA/inverters via ODSE connectors, ingest historical data, establish performance baselines.

Week 3–12: Optimisation

Real-time monitoring goes live. Weekly performance reports as models continuously improve.

Week 13: Decision

Executive ROI analysis. Automatic conversion upon meeting metrics, followed by scale-up.


Support & Resources

Documentation

Support


Get Help & Stay Updated

Contact Support

For technical assistance, feature requests, or any other questions, please reach out to our dedicated support team.

Email Support Join Discord

Subscribe to Updates

* indicates required