Asoba Ona Documentation

The Fragmented Grid: Why Energy Data Interoperability Is Costing Asset Operators Millions

Ona Protocol — Energy Data Interoperability

Introducing ODS-E — the Open Data Schema for Energy


You manage a 5 MW solar portfolio. Three sites. Huawei inverters at Site A, Enphase microinverters at Site B, Solarman loggers at Site C. Each OEM provides its own monitoring portal, its own data export format, its own error codes, and its own API with its own authentication flow and rate limits.

Every month, your engineering team writes and maintains three separate data pipelines. Every quarter, at least one OEM pushes an API update that breaks something. Every year, you lose energy production to faults that were detected in one system but couldn’t be correlated across the portfolio because the data doesn’t speak the same language.

This isn’t a technical inconvenience. It’s a structural tax on every distributed energy operator on the planet.

What the Fragmentation Actually Costs

Let’s put numbers to it. For a 5 MW operator managing 3 sites across 3 OEM platforms, the annual cost of data fragmentation breaks down into three categories: integration engineering, operational inefficiency, and lost revenue.

Integration Engineering

Building and maintaining a custom data pipeline for a single inverter OEM takes approximately 120–160 engineering hours for initial integration, covering API authentication, data mapping, error handling, and testing. At a blended rate of $85/hour for a mid-level data engineer in Southern Africa (or $150/hour in North America or Europe), that’s $10,200–$13,600 per OEM. Three OEMs means $30,600–$40,800 just to get data flowing.

Maintenance is the silent killer. OEM API versioning, schema changes, and authentication token rotations consume an estimated 40–60 hours per OEM per year. That’s another $10,200–$15,300 annually across three platforms — engineering time that produces zero new capability.

Operational Inefficiency

When error codes don’t map to a common taxonomy, fault triage becomes manual. A Huawei inverter_state: 512 and an Enphase reason: "power-clipping" might both indicate the same operational condition, but your monitoring system treats them as unrelated events. The result: false dispatch events where O&M crews are sent to sites that don’t need intervention, and missed dispatch events where real faults are buried in OEM-specific noise.

Industry data from IPP operations across Southern Africa shows that multi-OEM portfolios without unified monitoring experience 30–45% more false dispatch events than single-OEM sites. At an average truck roll cost of $350–$500 per dispatch (including travel, labor, and opportunity cost), a portfolio generating even 2–3 unnecessary dispatches per month burns $8,400–$18,000 annually.

Lost Revenue from Delayed Detection

This is the number that should keep asset managers up at night. When anomaly detection operates on fragmented data, Mean Time To Detect (MTTD) increases because each OEM pipeline has its own latency, its own data gaps, and its own alerting logic. For a 5 MW portfolio with a weighted average PPA rate of $0.08/kWh, every hour of undetected underperformance across the fleet costs approximately $400 in Energy-at-Risk.

Conservative modeling suggests that fragmented monitoring adds 4–8 hours of cumulative detection delay per fault event compared to a unified pipeline. With an average of 15–25 fault events per year across a 3-site portfolio, the annual Energy-at-Risk exposure is $24,000–$80,000.

Total Annual Cost of Fragmentation (5 MW, 3 Sites, 3 OEMs)

Category Low Estimate High Estimate
Initial integration (amortized over 3 years) $10,200 $13,600
Annual pipeline maintenance $10,200 $15,300
False dispatch events $8,400 $18,000
Energy-at-Risk from delayed detection $24,000 $80,000
Total $52,800 $126,900

Scale that to a 15 MW portfolio across 4 sites with 4 OEM platforms — which is common for mid-tier IPPs and ESCOs — and the numbers approach $200,000–$430,000 annually. That’s not a rounding error. That’s a material line item being absorbed as “the cost of doing business” because no open standard exists to eliminate it.

The Utility’s Blind Spot

The operator’s problem is expensive. The utility’s problem is dangerous.

Municipal and national utilities responsible for grid dispatch decisions need to forecast production from distributed energy resources (DERs) that export power to the grid. In South Africa alone, NERSA-registered embedded generators represent a growing and increasingly material share of daytime generation capacity. In Zimbabwe, ZERA’s regulatory framework is evolving to accommodate IPP exports into the ZESA transmission network. In both cases, the utility faces the same fundamental problem: they cannot accurately forecast what they cannot consistently measure.

Every IPP exporting to the grid sends production data in whatever format their monitoring platform generates. One submits Huawei CSV exports with 5-minute intervals. Another sends Enphase JSON payloads at 15-minute resolution. A third provides Solarman data with hourly aggregations and inconsistent timestamp formatting. The utility’s planning team receives data that looks similar but isn’t — different time resolutions, different error classifications, different units, different conventions for reporting zero-production periods versus offline periods versus communication failures.

The consequences cascade through the dispatch stack. Without reliable DER production forecasts, utilities over-procure baseload generation to hedge against uncertainty. This increases fuel costs for thermal plants and reduces the economic case for further renewable integration. When actual DER production exceeds the conservative forecast, the utility faces oversupply conditions that require curtailment — curtailing the very resources they should be incentivizing. When DER production underperforms the forecast (due to unreported faults or weather events the utility couldn’t correlate with site-level data), the resulting supply shortfall triggers expensive emergency procurement from peaking plants.

Regulatory frameworks like IEEE 2800 (for transmission-level interconnection) and FERC Order 2222 (for DER aggregation in wholesale markets) are beginning to mandate the kind of data standardization and interoperability that makes accurate forecasting possible. But mandates without standards are aspirational. A utility telling IPPs to “submit standardized production data” without specifying the schema, the error taxonomy, the timestamp format, and the validation rules is asking for exactly the fragmentation it already has — just wrapped in a compliance filing.

The missing piece is a data interchange standard that is open, machine-validatable, and specific enough to be useful while remaining flexible enough to accommodate the diversity of OEM ecosystems actually deployed in the field.

Why Existing Approaches Don’t Solve This

Three categories of solutions exist today. None of them address the structural problem.

Proprietary aggregation platforms like Enode, AlsoEnergy, and various SCADA middleware providers solve the API connectivity problem by building and maintaining OEM integrations as a service. This works — until you realize you’ve replaced vendor lock-in at the OEM layer with vendor lock-in at the aggregation layer. Your data flows through their proprietary schema, your analytics depend on their normalization logic, and switching providers means rebuilding your entire data pipeline. The lock-in is moved, not eliminated.

Manual export-and-transform workflows — downloading CSVs from each OEM portal, running Excel macros or Python scripts to normalize columns, and pasting the results into a master spreadsheet — are the reality for a startling number of sub-10 MW operators. This approach doesn’t scale, introduces human error at every step, and makes real-time monitoring impossible. But it persists because the engineering cost of building automated pipelines (see the cost model above) exceeds what many small operators can justify.

Custom middleware is what well-resourced operators build in-house. Every large IPP with a multi-OEM portfolio has some version of an internal data normalization layer. The problem is that every operator builds it independently, makes different design decisions about error mapping and timestamp handling, and maintains it as internal technical debt. There is no reuse across organizations, no shared validation logic, and no mechanism for one operator’s integration work to benefit the ecosystem.

The common thread: the industry keeps rebuilding the same data plumbing because no open standard exists at the interchange layer. Every organization that touches DER data — operators, utilities, ESCOs, insurers, researchers — is paying the fragmentation tax independently.

Introducing ODS-E

ODS-E (Open Data Schema for Energy) is an open specification for standardized energy asset data interchange. It defines a minimal, extensible JSON schema for production timeseries data, a standardized error taxonomy that maps across OEM-specific fault codes, and a declarative transform layer that converts proprietary OEM formats into the common schema.

The design philosophy is borrowed from successful open standards in other domains: define the smallest useful schema that enables interoperability, and make adoption as friction-free as possible.

The Core Schema

{
  "timestamp": "2026-02-05T14:00:00Z",
  "kWh": 847.5,
  "error_type": "normal",
  "PF": 0.98
}

Three required fields. That’s it.

timestamp — ISO 8601 with timezone. No ambiguity about local time vs. UTC, no implicit timezone assumptions, no inconsistent formatting between OEMs. Every record anchors to a single, unambiguous moment in time.

kWh — Active energy production. Non-negative. This is the fundamental unit of value in any solar asset — the energy that generates revenue under PPA or feed-in tariff contracts.

error_type — One of seven values: normal, warning, critical, fault, offline, standby, unknown. This taxonomy is the key innovation. Every OEM has its own error code system — Huawei uses numeric state codes, Enphase uses descriptive strings, Solarman uses bitfield flags. ODS-E doesn’t replace these; it maps them to a common classification that enables cross-OEM anomaly detection while preserving the original error code as an optional field for OEM-specific diagnostics.

Optional fields include kVArh (reactive energy), kVAh (apparent energy), PF (power factor), and error_code_original (the raw OEM error code). The schema is JSON Schema Draft 2020-12 compliant and machine-validatable.

The Transform Layer

Raw OEM data doesn’t arrive in ODS-E format. The transform layer bridges the gap. Each supported OEM has a declarative YAML transform specification that maps OEM-specific fields to the ODS-E schema and converts proprietary error codes to the standard taxonomy.

# huawei-to-ods.yaml (simplified)
transform:
  name: huawei-fusionsolar
  version: "1.0"
  output_mapping:
    timestamp: input.timestamp
    kWh: input.power * interval_hours
    error_type:
      function: map_error_code
      input: [inverter_state, run_state]
    error_code_mapping:
      normal: [0, 1, 2, 3, 256, 512]
      warning: [513, 514, 772]
      critical: [768, 770, 771]

Pre-built transforms ship for Huawei FusionSolar, Enphase Envoy, Solarman Logger, SolarEdge, Fronius, Switch Energy, SMA, FIMER Aurora Vision, SolisCloud, and SolaX Cloud. The transform specification format is documented and templated, so adding a new OEM is a matter of mapping fields and error codes — not writing a new integration from scratch.

Licensing

The specification, schemas, and transform definitions are licensed under CC-BY-SA 4.0. This means anyone can use, extend, and build upon the standard — but extensions must be published openly. This prevents the embrace-and-extend pattern where a dominant vendor adopts an open standard, adds proprietary extensions, and effectively re-fragments the ecosystem.

The reference implementation and tooling are licensed under Apache 2.0, allowing unrestricted commercial use without copyleft obligations. This removes adoption friction for commercial products and platforms that want to support ODS-E without licensing concerns.

How It Works: Three Scenarios

Scenario A: Validate a Single Record

Install the reference implementation and validate an ODS-E JSON file in five lines:

pip install odse
from ods_e import validate

# Validate a production data file
result = validate("site_a_production.json")

print(result.is_valid)    # True
print(result.record_count) # 8760
print(result.errors)       # []

If the data doesn’t conform — missing timestamps, negative kWh values, invalid error types — the validator returns structured errors that identify exactly which records failed and why.

Scenario B: Normalize a Multi-OEM Portfolio

This is the scenario from the cost model above. Three sites, three OEMs, one unified dataset:

from ods_e import transform

# Transform Huawei CSV export to ODS-E
site_a = transform("huawei_export.csv", source="huawei")

# Transform Enphase JSON API response to ODS-E
site_b = transform("enphase_telemetry.json", source="enphase")

# Transform Solarman logger CSV to ODS-E
site_c = transform("solarman_daily.csv", source="solarman")

# All three datasets now share identical schema and error taxonomy
combined = site_a + site_b + site_c

# Query across the entire portfolio
faults = [r for r in combined if r["error_type"] in ("critical", "fault")]
print(f"Portfolio-wide faults: {len(faults)}")

Before ODS-E, correlating a Huawei inverter_state: 768 with an Enphase reason: "grid-frequency-high" required manual lookup tables maintained by each operator. After ODS-E, both are classified as critical in the unified taxonomy, and the original OEM codes are preserved in error_code_original for diagnostic drill-down.

Scenario C: Utility-Scale DER Reporting

A grid operator requires all IPPs exporting to their network to submit production data in ODS-E format. The operator’s forecasting pipeline can now ingest data from any IPP regardless of their OEM platform:

from ods_e import validate, transform
import json

def ingest_ipp_submission(filepath: str, ipp_id: str):
    """
    Standard ingestion endpoint for IPP production data.
    Accepts either raw ODS-E JSON or OEM-specific formats
    with a declared source.
    """
    # Try direct ODS-E validation first
    result = validate(filepath)
    
    if result.is_valid:
        records = result.records
    else:
        # Fall back to OEM transform if source is declared
        metadata = json.load(open(filepath + ".meta"))
        records = transform(filepath, source=metadata["oem"])
    
    # Feed into forecasting pipeline
    store_production_data(ipp_id, records)
    update_dispatch_forecast(ipp_id)
    
    return {
        "ipp_id": ipp_id,
        "records_ingested": len(records),
        "time_range": f"{records[0]['timestamp']} to {records[-1]['timestamp']}",
        "error_summary": summarize_errors(records)
    }

The utility no longer needs to maintain custom parsers for each IPP’s data format. New IPPs connecting to the grid submit ODS-E-compliant data or declare their OEM source for automatic transformation. Forecasting accuracy improves because the input data is structurally consistent — same timestamp precision, same error classifications, same energy units.

Running the Transform Harness

The repository includes a transform harness for testing all OEM transforms against fixture data or live API endpoints:

# Test all transforms against included fixtures
PYTHONPATH=src/python python3 tools/transform_harness.py --mode fixture

# Mixed mode: live where configured, fixtures as fallback
cp .env.example .env
# Configure your OEM API credentials in .env
PYTHONPATH=src/python python3 tools/transform_harness.py --mode mixed

# Live-only for specific OEMs
PYTHONPATH=src/python python3 tools/transform_harness.py \
  --mode live --oems enphase,sma,fronius

Use Cases by Stakeholder

IPP Portfolio Managers

The immediate value is operational: one monitoring pipeline instead of three (or five, or ten). But the downstream effects compound. Unified error taxonomy enables portfolio-wide anomaly detection models that improve with scale — a fault pattern seen at one Huawei site informs detection at all Huawei sites, and the normalized classification enables cross-OEM pattern recognition that was previously impossible. PPA compliance reporting becomes a query against a single schema rather than a manual reconciliation across OEM exports.

ESCOs and O&M Providers

Client onboarding is the bottleneck. Every new client brings a different OEM ecosystem, and the ESCO’s first 2–4 weeks are consumed by data integration before any diagnostic or optimization work begins. ODS-E collapses this to hours — run the appropriate transform, validate the output, and begin analysis. For ESCOs managing 20+ client sites across multiple OEM platforms, the cumulative time savings translate directly to margin improvement and faster time-to-value for clients.

Grid Operators and Utilities

DER visibility is the prerequisite for everything else — accurate load forecasting, optimal dispatch, renewable curtailment minimization, and virtual power plant orchestration. ODS-E provides the standardized data submission format that makes DER visibility achievable at scale. Instead of mandating a specific OEM platform or building custom integrations for each IPP, the utility specifies ODS-E as the submission standard and lets the transform layer handle OEM diversity.

Insurance Underwriters and Asset Finance

Consistent, machine-validatable production data is the foundation of accurate risk assessment. When an underwriter evaluating a solar portfolio receives ODS-E-compliant data, they can apply the same risk models regardless of the underlying OEM platforms — comparing performance ratios, fault frequencies, and degradation curves across heterogeneous assets without manual data harmonization. This reduces underwriting cycle times and improves the accuracy of premium calculations.

Architecture

ODS-E sits between OEM data sources and downstream analytics, forecasting, and decision systems. It is not a platform, a database, or a SaaS product. It is a data interchange layer — a contract between data producers and data consumers.

┌─────────────┐  ┌─────────────┐  ┌─────────────┐
│   Huawei    │  │   Enphase   │  │  Solarman   │  ... OEM APIs / Exports
│ FusionSolar │  │   Envoy     │  │   Logger    │
└──────┬──────┘  └──────┬──────┘  └──────┬──────┘
       │                │                │
       ▼                ▼                ▼
┌─────────────────────────────────────────────────┐
│              ODS-E Transform Layer               │
│  Declarative YAML transforms per OEM             │
│  Error code mapping → standard taxonomy          │
│  Timestamp normalization → ISO 8601 UTC          │
│  JSON Schema validation                          │
└──────────────────────┬──────────────────────────┘
                       │
                       ▼
              ┌─────────────────┐
              │   ODS-E JSON    │  Standardized, validated,
              │   Records       │  interoperable data
              └────────┬────────┘
                       │
        ┌──────────────┼──────────────┐
        ▼              ▼              ▼
┌──────────────┐ ┌───────────┐ ┌────────────┐
│  Forecasting │ │  Anomaly  │ │ Compliance │  ... Downstream consumers
│  & Dispatch  │ │ Detection │ │ Reporting  │
└──────────────┘ └───────────┘ └────────────┘

Adoption Paths

Greenfield integration: Install the package, point it at your OEM data, and get ODS-E output. This is the five-minute path for developers evaluating the standard.

Retrofit into existing pipelines: Use the transform functions as a normalization step in your current ETL pipeline. ODS-E doesn’t require replacing your monitoring stack — it standardizes the data layer between ingestion and analytics.

Contributing new OEM transforms: The transform specification format is documented and templated. If your OEM isn’t supported, adding a new transform is a contribution to the repo — your mapping benefits every other operator using that OEM.

Governance and Sustainability

ODS-E is maintained by Asoba Corporation with an open governance model. The specification evolves through a public proposal process documented in the repository’s GOVERNANCE.md. Schema changes require backward compatibility or explicit versioning. Transform contributions are reviewed against the specification and tested via the transform harness before merge.

The CC-BY-SA licensing on the specification is a deliberate structural choice. It ensures that any organization extending ODS-E — adding new fields, new error types, or new transform specifications — must publish those extensions under the same license. This creates a one-way ratchet toward openness: the specification can grow but cannot be captured.

Get Started

Install the reference implementation:

pip install odse

Read the specification and transform guides:

Full DocumentationSchema ReferenceTransform Guide

Browse the source, file issues, contribute transforms:

github.com/AsobaCloud/odse

Join the community:

Discordsupport@asoba.co


ODS-E is an open standard maintained by Asoba Corporation. The specification is licensed under CC-BY-SA 4.0. The reference implementation is licensed under Apache 2.0.