Skip to main content

HERMESS

Hybrid EMT/RMS Modern Electric power System Simulator

docs tests license: GPL v3+

Documentation


About

hermess is a dynamic simulation tool for power systems modeled by nonlinear Differential-Algebraic Equations (DAEs). It integrates the dynamic evolution equations of the components together with the algebraic network equations to produce time-domain trajectories of the bus voltages and of every device's internal states.

This repository is the simulation-only build of PowerDynamicEstimator: the dynamic state estimation (DSE) layer has been removed, leaving a focused, self-contained power-system dynamic simulator. The Python package is still importable as hermess.

Features

  • Time-domain simulation of nonlinear DAE power system models
  • Synchronous machine models (transient and subtransient, including Sauer–Pai formulations) with pluggable AVR, governor, PSS and (multi-mass) shaft strategies
  • Grid-forming and grid-following converter (inverter) models with composable control strategies
  • Static loads (constant power / impedance / ZIP) and infinite bus
  • Quasi-static or fully dynamic (differential) network/line models
  • Disturbances: bus/line faults, line switching, and load steps
  • Configurable reference-frame handling (centre-of-inertia, single-machine, nominal, distributed)
  • Small-signal eigenvalue / participation-factor analysis at the operating point
  • Multiple integration schemes (idas, cvodes, collocation, rk)
  • Supports 50 Hz and 60 Hz systems
  • User-defined dynamic and static models can be integrated
  • Available as a Python package: hermess

Installation

From PyPI

pip install hermess

With the optional desktop GUI:

pip install "hermess[gui]"

From source (with venv), for development

  1. Clone the repository and cd into it.
  2. Create and activate a virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
  1. Install the package:
pip install -e .

From source (with conda)

  1. Clone the repository and cd into it.

  2. Create the conda environment:

conda env create -f environment.yaml
conda activate hermess

Usage

Running a simulation

The package installs a hermess command (equivalently python -m hermess):

hermess list                                # the ready-made systems
hermess run 3bus --t-end 5                  # simulate one and plot the trajectories
hermess run ieee39_conv --small-signal      # the shipped demo scenario

hermess run accepts --t-end, --ts, --no-plot, --small-signal and --system-root for systems of your own; any other simulation setting is reachable with --set KEY=VALUE (see hermess run --help).

From Python, to run a system without editing config.py:

import hermess

hermess.list_systems()                        # the ready-made systems
dae = hermess.simulate("3bus", T_end=5.0)    # run one; returns the finished model

User-written models are selectable from a system file once registered, and the same call takes devices and every pluggable strategy (AVR, governor, PSS, shaft, converter filter / angle / voltage / inner / PLL):

hermess.register(VSMAngle, "VSM")   # now:  angle = "VSM"  in sim_param.txt
hermess.registered("angle")         # what can be selected today

Graphical interface

An optional desktop GUI covers the interactive workflow: select a shipped or user-written system, adjust the simulation options, run with live progress, and inspect the one-line diagram, the time-domain trajectories, the small-signal modes and the initial power flow. Systems can also be built graphically, by placing buses, lines and devices on the canvas with parameter forms generated from the models; the result is saved as an ordinary system folder. Results export as plot-ready CSV.

pip install "hermess[gui]"   # from source: pip install -e ".[gui]", or uv sync --extra gui
hermess-gui

HERMESS GUI

See the GUI guide for a tour.

Examples

You can check out the available examples in the ./examples directory to get started, and the documentation for the full usage guide and API reference.

Important Notes

Parameters

System dynamic and static parameters, including the topology, are specified in the ./hermess/systems subfolder. You can define the loads, generators, converters, and their characteristics at specific nodes in the power system. The component parameters live in sim_param.txt and the disturbances in sim_dist.txt within each system folder.

Simulation Settings

Adjust parameters related to the simulation (time step, end time, integration scheme, reference-frame mode, plotting, small-signal analysis, etc.) in the ./hermess/config.py file.

Limitations

  • Injector Limitation: Currently, the platform supports only one injector per node due to initialization ambiguity. To handle multiple injectors per node, you can create a new node connected via a branch with very small impedance.

Authors and copyright

© 2024-2026 ETH Zurich

Created by: Milos Katanic (original author of PowerDynamicEstimator) and Maitraya Avadhut Desai (simulation-only fork and maintainer).

HERMESS is a simulation-only fork of PowerDynamicEstimator (https://doi.org/10.5905/ethz-1007-842); the dynamic state estimation has been removed. See AUTHORS and CONTRIBUTORS for the full list of authors and contributors, and CONTRIBUTING.md if you would like to contribute.

Acknowledgments

PowerDynamicEstimator, from which this build is derived, was developed at the Power Systems Laboratory at ETH Zurich, supported as part of NCCR Automation, a National Centre of Competence in Research funded by the Swiss National Science Foundation (grant number 51NF40_225155).

Citing

If you use HERMESS in academic work, please cite the software release in the ETH Research Collection (see also CITATION.cff):

M. A. Desai, M. Katanic, and G. Hug, "HERMESS: Hybrid EMT/RMS Modern Electric power System Simulator," version 1.0.0, ETH Zurich Research Collection, 2026, doi: 10.3929/ethz-c-000805609.

and the paper describing the underlying models:

M. Katanic, J. Lygeros, and G. Hug, "Recursive dynamic state estimation for power systems with an incomplete nonlinear DAE model," IET Generation, Transmission & Distribution, vol. 18, no. 22, pp. 3657-3668, 2024, doi: 10.1049/gtd2.13308.

License

This software is free software, released by ETH Zurich under the GNU General Public License v3.0 or later (GPL-3.0-or-later). See LICENSE.txt for the full license text. It is distributed WITHOUT ANY WARRANTY; see the license for details.

hermess/tests/references/ additionally contains third-party benchmark data redistributed under its own license (BSD-3-Clause, from the PowerSimulationsDynamics.jl project); the license text and provenance live next to the data.

Metadata

Release files for hermess 1.7.2

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

Source distribution (sdist)

Source distribution for hermess 1.7.2
File Size Uploaded
hermess-1.7.2.tar.gz 5.0 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for hermess 1.7.2
File Interpreter ABI Platform
hermess-1.7.2-py3-none-any.whl Python 3 none any Details

Total release size: 5.4 MB

Release files / hermess-1.7.2.tar.gz

Download URL hermess-1.7.2.tar.gz
Size 5.0 MB
Tags Source
SHA-256 checksum
How to use checksums
db8aedc491e97a3832d5af2aaf2817a8f2827231fbdd785263df7aec88d7ed09
BLAKE2b-256 checksum
How to use checksums
0122a6ad9401d1571708331e8456dd28ee413af0582208a5f1f4ad890741fca1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / hermess-1.7.2-py3-none-any.whl

Download URL hermess-1.7.2-py3-none-any.whl
Size 400.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5b26be856d2df77e4aa4eb1b04ca24b8750ec26c3cc807f44a086a22e2bb25ea
BLAKE2b-256 checksum
How to use checksums
82e0e2982e3637a79c1883159cfac9f6e2c48f193085f3d7e631be7ad7dde8ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

1.7.2 This release

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

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