Asoba Ona Documentation

Contributing to ODS-E

ODS-E is an open specification and we welcome contributions from the energy data community. Whether you’re fixing a typo, adding support for a new OEM, or improving documentation, this guide will help you get started.


Environment Setup

Prerequisites

Getting Started

# Fork and clone the repository
git clone https://github.com/<your-username>/odse.git
cd odse

# Install in development mode with dev dependencies
pip install -e ".[dev]"

# Install pre-commit hooks
pre-commit install

# Verify your setup
odse --version
pytest

Development Tools

Tool Purpose Command
pytest Run tests pytest
ruff Linting ruff check .
black Formatting black .
pre-commit Git hooks Runs automatically on commit

All of these run automatically in CI, but running them locally before pushing saves time.


Ways to Contribute

Documentation Improvements

The lowest barrier way to contribute. Documentation lives alongside the code and is always in need of:

How to start: Look for issues labelled docs or good-first-issue, or simply open a PR with your improvement.

Adding & Labelling Issues

Good issue reports are extremely valuable. When filing an issue:

Bug reports should include:

Feature requests should include:

Label taxonomy:

Label Use for
bug Something isn’t working correctly
enhancement New feature or improvement
docs Documentation changes only
oem-transform New or updated OEM transform
good-first-issue Suitable for newcomers
help-wanted Maintainers would appreciate help

Adding Transforms for New OEMs

This is the most impactful type of contribution. Each new OEM transform makes ODS-E useful to a wider community.

Before you start:

  1. Check existing transforms to see if your OEM is already supported
  2. Search open issues and PRs to avoid duplicate work
  3. Open an issue describing the OEM and data format you plan to support

Submission checklist:

Naming convention:

transforms/
├── oem-product.yaml          # e.g., huawei-fusionsolar.yaml
tests/transforms/
├── test_oem_product.py       # e.g., test_huawei_fusionsolar.py
├── fixtures/
│   ├── oem-product-input.*   # Sample input
│   └── oem-product-expected.json  # Expected output

For full details on the YAML spec format, field mappings, and error code mappings, see the Transform Specifications page.

Updating Existing OEM Transforms

OEMs periodically change their export formats, API responses, or error codes. When you encounter a change:

  1. Identify the change — What fields moved, were added, or changed format?
  2. Update the YAML spec — Modify the relevant transforms/*.yaml file
  3. Update error code mappings — If new error codes appeared, classify them into the 7-category error taxonomy
  4. Add regression tests — Ensure the old format still works (if the OEM supports both) and the new format is handled correctly
  5. Document the change — Note the OEM firmware/software version where the format changed

PR Protocol

Workflow

  1. Fork the repository
  2. Branch from main with a descriptive name
  3. Commit your changes with clear messages
  4. Push to your fork
  5. Open a PR against main

Branch Naming

Type Pattern Example
New transform feat/oem-name feat/sma-sunny-portal
Bug fix fix/issue-number fix/42-huawei-timestamp
Documentation docs/description docs/enphase-examples

Commit Messages

Use conventional commits and reference the issue number:

feat: add SMA Sunny Portal transform (#58)
fix: handle Huawei timezone offset in CSV export (#42)
docs: add Enphase Envoy API examples (#61)

PR Requirements

Every PR must:


Good vs Bad Contributions

What makes a good contribution

What makes a bad contribution

Data Privacy

When including sample data in your contribution:


Getting Help

If you’re stuck, have questions, or want to discuss an idea before starting work:


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