Skip to main content

oomi-influx

Headless ETL tool that pulls 15-minute electricity consumption data from the Oomi customer portal and writes it directly to InfluxDB 2.x.

No browser. No GUI. Designed to run unattended on a Raspberry Pi or any Linux server.

How it works

Oomi's portal runs on Salesforce Experience Cloud and exposes no public API. oomi-influx replays the same HTTP calls the browser makes:

  1. Form-POST login → Salesforce session ID
  2. Frontdoor handshake → community session cookie + Aura token
  3. POST to the Aura API (oomi_ConsumptionController.getConsumption) → NDJSON

Each consumption slot is a 15-minute UTC-timestamped record written to InfluxDB as:

InfluxDB concept Value
Measurement electricity_consumption (configurable)
Tag metering_point=<value> (configurable)
Fields consumption_kwh, consumption_wh, resolution (configurable)

Requirements

  • uv
  • An Oomi customer account with smart meter access
  • InfluxDB 2.x instance

Installation

Install as a persistent uv tool (puts oomi-influx on your PATH):

uv tool install oomi-influx

To try it without installing:

uvx oomi-influx --help

Configuration

Create a directory to hold the configuration, then run the interactive setup wizard from it. The wizard logs in, fetches your meter details automatically, and writes .env to the current directory:

mkdir ~/oomi-config && cd ~/oomi-config
oomi-influx configure

The wizard uses any existing .env values as defaults, so re-running it only asks you to confirm or change individual values.

.env is read from the working directory. Always run oomi-influx from the directory that contains your .env, or set the variables in your environment directly.

Environment variables

oomi-influx configure writes all required variables to .env for you. If you prefer to set them manually, create .env in your config directory with the following variables:

Oomi

Variable Description
OOMI_USERNAME Your Oomi login email
OOMI_PASSWORD Your Oomi password
OOMI_GSRN Your meter EAN (18-digit; fetched automatically by configure)
OOMI_CUSTOMER_ID Salesforce customer identifier (fetched automatically by configure)

InfluxDB

Variable Description Default
INFLUX_URL InfluxDB base URL —
INFLUX_TOKEN API token with write access to the bucket —
INFLUX_ORG Organisation name —
INFLUX_BUCKET Destination bucket —
INFLUX_MEASUREMENT Measurement name electricity_consumption
INFLUX_TAG_KEY Tag key metering_point
INFLUX_TAG_VALUE Tag value (your meter identifier) —
INFLUX_FIELD_KWH Field name for kWh value consumption_kwh
INFLUX_FIELD_WH Field name for Wh value consumption_wh
INFLUX_FIELD_RESOLUTION Field name for slot resolution resolution

Never commit .env — it is git-ignored. The repository is public.

Usage

Fetch consumption data (stdout)

# Last 7 days (default)
oomi-influx fetch consumption

# Specific range
oomi-influx fetch consumption --start 2026-05-01T00:00:00Z --end 2026-05-14T00:00:00Z

Output is NDJSON on stdout, one record per line:

{"timestamp": "2026-05-14T06:00:00+00:00", "kwh": 0.662}

Write consumption data to InfluxDB

# Last 7 days (default)
oomi-influx write consumption

# Specific range
oomi-influx write consumption --start 2026-05-01T00:00:00Z --end 2026-05-14T00:00:00Z

# Reconciliation pass: re-fetch a wider window to pick up slots the DSO
# backfilled after the fact (writes are idempotent, so this is safe to repeat)
oomi-influx write consumption --lookback-days 60

Fetches from Oomi and writes directly to the configured InfluxDB bucket in one step.

Running on a schedule

systemd timer (recommended for servers)

Create /etc/systemd/system/oomi-influx.service:

[Unit]
Description=Fetch and write Oomi consumption data to InfluxDB

[Service]
Type=oneshot
User=<your-user>
WorkingDirectory=/home/<your-user>/oomi-config
ExecStart=oomi-influx write consumption

Create /etc/systemd/system/oomi-influx.timer:

[Unit]
Description=Run oomi-influx every hour

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl enable --now oomi-influx.timer

WorkingDirectory should point to the directory that contains your .env. oomi-influx is the binary installed by uv tool install — confirm its path with which oomi-influx and use the full path if systemd cannot find it.

cron

# ┌─ minute (0 = top of the hour)
# │  ┌─ hour (every hour)
# │  │  ┌─ day of month (every day)
# │  │  │  ┌─ month (every month)
# │  │  │  │  ┌─ day of week (every day)
# │  │  │  │  │
  0  *  *  *  *  cd ~/oomi-config && oomi-influx write consumption

Contributing

See CONTRIBUTING.md for development setup, testing, and how to work with Claude Code AI skills used in this project.

Metadata

Release files for oomi-influx 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oomi-influx 0.5.0
File Size Uploaded
oomi_influx-0.5.0.tar.gz 83.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oomi-influx 0.5.0
File Interpreter ABI Platform
oomi_influx-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 96.6 kB

Release files / oomi_influx-0.5.0.tar.gz

Download URL oomi_influx-0.5.0.tar.gz
Size 83.0 kB
Tags Source
SHA-256 checksum
How to use checksums
8ff5d7e10fa4a998c9267ff39e9d7e71b43a217f64402c836902fb353acf576f
BLAKE2b-256 checksum
How to use checksums
ea8cff44539650107baa6f08e510c911cee54620aa4ddca3f3bd4c6f20211fdf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.

Transparency log

Release files / oomi_influx-0.5.0-py3-none-any.whl

Download URL oomi_influx-0.5.0-py3-none-any.whl
Size 13.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a25a9612a0d70652454ca53769af6c1f4a1c1da530f1e332b8a1d050508ed17b
BLAKE2b-256 checksum
How to use checksums
d5522fa9b0a5ca2b7f67aef9d8304daa84a675ed7a957923d13997f22f0bcb4d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 12, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page