Swiss ZEV & vZEV · self-hosted · AGPL-3.0

From quarter-hourly meter data to a paid invoice.

OpenZEV runs the whole operating cycle of a Swiss energy community: import the load curves, split the solar between neighbours timestamp by timestamp, price it against real tariffs, and send a QR-bill invoice that reconciles.

Energy balance · demo community · Q3 2026

PV 1888.85 kWh Grid 738.9 kWh 625.8 kWh used locally 33.1 % self-consumed 1263.05 kWh exported to grid
Local consumption Grid exchange Production

The same split the billing engine performs — min(production, consumption) per 15-minute interval — is what every invoice line is derived from.

Resolution
15-minute intervals
Documents
PDF/A-3b + QR-bill
Languages
DE · FR · IT · EN
Deploy
Docker & Helm

What it does

Everything between the meter and the money.

A ZEV is only simple until you have to bill one. OpenZEV covers the parts that actually consume the evenings: reconciling imports, keeping tariff history straight, and producing documents a participant will accept.

Metering & imports

Load curves in, validated.

Import from the formats utilities actually send, and see what will land before it does.

  • CSV and Excel with configurable column mapping, plus SDAT-CH for utility workflows
  • Preview-based validation with a per-row import protocol
  • Data-quality checks that flag readings nobody would be billed for
  • Consumption and production analysis by period or daily profile
Tariffs & billing

Priced the way the tariff really works.

Allocation runs per timestamp, not per month — so high/low bands and spot prices land correctly.

  • Versioned tariffs with high/low bands, seasonal periods and validity windows
  • Dynamic price series, including the BFE reference market price
  • Import a grid operator's machine-readable tariff file (Art. 7b StromVV)
  • Per-timestamp local-pool split across every participant
Documents

Swiss-ready output.

Invoices as PDF/A-3b with a QR-bill payment slip, plus annual statements and participation contracts — each issued version kept exactly as it was sent.

Community

Roles and scope.

Admins, ZEV owners and participants see different products. Metering points carry validity-based assignments, so a participant moving out mid-period bills correctly.

Planning

Before you found one.

A feasibility calculator estimates savings, payback, ROI and NPV — and can prefill from a real community's participants and measured self-consumption.

Operations

Built to be run by one person.

  • Audit log across every privileged action, scoped to what you may see
  • Asynchronous email delivery with per-invoice history and retry
  • API keys for scripting, with read-only scope and their own rate budget
  • Export or move a whole community between instances as a versioned archive

Invoice lifecycle

One state at a time, and it is always visible.

Every invoice moves through the same chain. Transitions lock the row and decide against committed state, so two people working the same billing run cannot overwrite each other.

Draft

Generated from the period's readings and tariffs. Re-generate freely.

Approved

Figures accepted. The PDF is rendered off-request and attached.

Sent

Emailed to the participant; delivery and failures both recorded.

Cancelled branches off any stage and is never a deletion — the document and its number stay, because an invoice a participant already holds cannot be unsent.

Screenshots

The working interface.

From the demo community that ships with the project — seeded with one command.

Overview

Opens on what is due.

Billing periods are listed oldest first with the action each one needs, so a session starts on the work rather than on a search. The period still collecting data says so and asks for nothing.

OpenZEV overview screen listing billing periods by status, each with its next action
Energy balance

Where the solar actually went.

Production, consumption, self-consumption and grid exchange for the selected period, with a Sankey diagram tracing every kWh from producer to participant. Filter by participant, or change resolution down to the interval.

Energy balance screen with KPI tiles and a Sankey diagram of energy flow between producer, participants and the grid
Billing

A billing run on one screen.

Every participant's invoice for the period with its metering completeness, status, total and PDF state — and batch actions for the steps you would otherwise repeat once per household.

Billing screen listing each participant's invoice with status badges, totals and batch actions
Tariffs

Price history you can audit.

Tariffs are versioned series, not editable rows. Each version keeps its own bands and validity, so an invoice raised last year still prices at last year's rate — and the chart shows exactly when each change took effect.

Tariff detail drawer showing version history, a price history chart and the high and low tariff bands

Quick start

Running locally in about a minute.

Pick the path that matches where you want it to live. All three pull prebuilt images from GHCR.

Try it

Demo community

Starts the stack and seeds a full community — participants, meters, tariffs and readings — so there is something to look at.

# clone, then:
scripts/start-demo-environment.sh

# → http://localhost:8080
# admin@openzev.local / admin1234
Self-host

Docker Compose

The full stack — frontend, API, Celery worker and beat, PostgreSQL and Redis — with no demo data.

docker compose up -d --build

# frontend  :8080
# api       :8001

docker compose down
Kubernetes

Helm chart

Deploys frontend, backend, worker and beat with an Ingress and a media PVC. Bring your own PostgreSQL and Redis.

helm repo add openzev \
  https://splattner.github.io/openzev
helm repo update
helm install openzev openzev/openzev \
  -n openzev --create-namespace
Images ghcr.io/splattner/openzev-{backend,frontend,fullstack} Signed release manifests and SBOM attestations Databases PostgreSQL, MariaDB or SQLite via DATABASE_URL

Under it

A boring stack, on purpose.

Nothing here is exotic. It is meant to still start in three years.

Backend
Django, Django REST Framework, SimpleJWT
Frontend
React, TypeScript, Vite, React Query, i18next
Async
Celery worker and beat on Redis
Data
PostgreSQL, MariaDB or SQLite
API
OpenAPI schema with Swagger and ReDoc
Deploy
Docker Compose or the Helm chart
Licence
AGPL-3.0 — run it, change it, host it. If you offer a modified version to others over a network, they get the source too.

Read this before you bill someone with it

OpenZEV is built for self-hosters who enjoy running their own stack, and is shipped as-is with no warranty. Check your imports, your tariffs and your invoices before they reach a participant — responsibility for what the numbers say stays with you.

It is also built with substantial AI assistance, down to the specs, ADRs and user documentation. Some choices will look unconventional to an experienced team. That is the trade the project makes: it is optimised for learning, experimentation, and running one real ZEV — not for enterprise process.