Documentation · Quickstart · Tutorials · PyPI
popo
Low-voltage network simulation and state estimation for distributed energy resource studies.
popo is Swahili for bat. It is a companion to twiga, Swahili for giraffe: twiga sees far, which is forecasting ahead in time; popo sees in the dark, which is inferring the state of a network that is not measured.
Low-voltage distribution is largely unobservable. There are measurements at the secondary substation and very little downstream, yet the decisions that matter, how much solar or how many electric vehicles a feeder can take, depend on what is happening at every customer terminal. This library is about reconstructing that from what little is metered, and about simulating what a network would do under a given level of DER uptake.
Install
The solvers are optional, because reading a network definition or checking a voltage limit against a standard needs neither:
uv add popo-flow # core: networks, standards, results
uv add popo-flow[opendss] # + time-series power flow
uv add popo-flow[estimation] # + weighted-least-squares state estimation
uv add popo-flow[all]
The distribution is named popo-flow because popo was already taken on PyPI;
the package itself is still imported as import popo.
What is in it
| module | purpose |
|---|---|
popo.network |
load an OpenDSS circuit as Python records, inspect topology, transformers and loads |
popo.powerflow |
time-series solves with convergence reported, result tables, penetration sweeps |
popo.scenarios |
household, PV, EV and storage scenarios, Volt-VAr and Volt-Watt control |
popo.standards |
EN 50160, ANSI C84.1, IEEE 1547 and EREC G99; verdicts, violations and events |
popo.estimation |
weighted-least-squares state estimation from a sparse measurement set |
popo.profiles |
household, PV and EV profile pools |
popo.plotting |
network diagrams, figure style and tables |
Learn it
The documentation has a quickstart, a user guide for each module and three tutorials that run end to end on real feeders:
- OpenDSS LV modelling: build an LV circuit, read it back as records and tables, and check it against EN 50160.
- Time series and DER: hosting capacity on a real 188-customer UK feeder, every customer's voltage alongside the substation's, and Volt-VAr, Volt-Watt and storage compared.
- LV state estimation: how much has to be measured to know every customer's voltage.
Development
uv sync --all-extras --group docs # environment with both solvers and the docs tooling
make test # suite with the coverage gate, solvers deselected
make test-solver # only the tests that need OpenDSS or pandapower
make lint # ruff check
make fmt # ruff format
make typecheck # ty
make docs # build the docs, warnings as errors
make docs-serve # serve the docs locally, rebuilding on change
Commits follow conventional commits,
checked by commitizen through a pre-commit hook. Install the hooks once with
uv run pre-commit install --install-hooks -t pre-commit -t commit-msg.
Status
Alpha: the API may change before 1.0. Changes are listed in the changelog.
Citation
If you use popo in your work, please cite it:
Faustine, A. (2026). popo: low-voltage network simulation and state estimation (Version 0.2.0) [Computer software]. https://sambaiga.github.io/popo-docs
@software{faustine2026popo,
author = {Faustine, Anthony},
title = {popo: Low-Voltage Network Simulation and State Estimation},
year = {2026},
version = {0.2.0},
url = {https://sambaiga.github.io/popo-docs},
note = {Python package \texttt{popo-flow}}
}
Licence
Apache-2.0.
Metadata
Release files for popo-flow 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| popo_flow-0.2.0.tar.gz | 949.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| popo_flow-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.2 MB
Release files / popo_flow-0.2.0.tar.gz
| Download URL | popo_flow-0.2.0.tar.gz |
|---|---|
| Size | 949.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1875f76e994d5e49c0541b2b535fcd3490f6f27b7bf2e95f88022db2f4ec6ba5
|
|
BLAKE2b-256 checksum How to use checksums |
4dbc65eec1cba8e678433b8527cb5d3543106a113a14dbc4905dc29e1989758f
|
| 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 Oct 13, 2026.
Transparency logRelease files / popo_flow-0.2.0-py3-none-any.whl
| Download URL | popo_flow-0.2.0-py3-none-any.whl |
|---|---|
| Size | 274.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e6a4bb54ef92f5c7fb12fdf8ff612d1b384a650914c6cfebbac87a656255751a
|
|
BLAKE2b-256 checksum How to use checksums |
f5156d837d449e9803747cda83d704f1f8f93015d3af17e48110b51868d81f4a
|
| 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 Oct 13, 2026.
Transparency log