Skip to content

fix(opendss): restore OpenDSSDirect.py as a dev dependency - #3075

Merged
vogt31337 merged 3 commits into
e2nIEE:developfrom
Houmgaor:fix/opendss-dev-dependency-windows-crash
Jul 17, 2026
Merged

fix(opendss): restore OpenDSSDirect.py as a dev dependency#3075
vogt31337 merged 3 commits into
e2nIEE:developfrom
Houmgaor:fix/opendss-dev-dependency-windows-crash

Conversation

@Houmgaor

@Houmgaor Houmgaor commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Summary

Root cause

Traced on a real windows-latest GitHub Actions runner (throwaway diagnostic branch, since removed): dss_python_backend (OpenDSSDirect.py's Free-Pascal-compiled native backend) raises an internal, first-chance Windows structured exception during its own module init — one its own Pascal runtime normally catches and handles silently as part of normal startup. pytest enables Python's faulthandler by default, which installs a Windows vectored exception handler that intercepts that first-chance exception before the Pascal runtime's own handler gets it, and reports it as a fatal crash (Windows fatal exception: code 0xe0465043) — killing the whole process instead of a clean, catchable ImportError. A plain python -c "import opendssdirect" never enables faulthandler, so it never sees this, exactly matching the upstream report (dss-extensions/OpenDSSDirect.py#148) that a REPL import works fine but pytest crashes.

Confirmed empirically, both isolated and end-to-end, on windows-latest:

  • pytest with the default faulthandler plugin: reproduces the crash every time.
  • pytest -p no:faulthandler: completely clean, no exception, test passes.
  • The proposed fix (bracket only the import with faulthandler.disable()/.enable(), faulthandler plugin left on for everything else): clean pass, no exception.
  • Sanity check: after re-enabling faulthandler post-import, a real segfault elsewhere in the same process is still caught and reported correctly — the fix doesn't blind pytest to genuine crashes.
  • End-to-end: the actual, unmodified pandapower/test/converter/test_from_opendss.py — not a hand-rolled repro — run against a real pandapower[dev] install on windows-latest: 19 passed, no skip, no crash.

Test plan

  • pytest pandapower/test/converter/test_from_opendss.py passes locally with opendssdirect.py installed (Linux, Python 3.14.6) — 19/19
  • Real end-to-end run of the unmodified test file on windows-latest with uv sync --extra dev (this PR's actual pyproject.toml + code) — 19/19, no skip, no crash
  • Sanity check that faulthandler still catches a genuine segfault after being re-enabled
  • This repo's own CI (Linux-only for the PR-gating pipeline) — should now actually exercise the OpenDSS converter and report real coverage instead of 0%

cc @vogt31337

It was dropped from the all/dev extras in e2nIEE#3062 because installing it
alongside pytest~=9.1 crashes the pytest process on Windows (upstream
bug: dss-extensions/OpenDSSDirect.py#148). That left the OpenDSS
converter with 0% coverage in CI, since opendssdirect was never
installed to begin with.

The crash is Windows-specific: it reproduces with pytest==9.1.1 +
OpenDSSDirect.py==0.9.4 on Windows but not on Linux, where this
repo's PR-gating CI actually runs. Restore the dependency and skip
test_from_opendss.py on win32 before it ever imports opendssdirect,
instead of avoiding the dependency for every platform.
@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 72.12%. Comparing base (412cad8) to head (2560281).

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #3075      +/-   ##
===========================================
+ Coverage    71.63%   72.12%   +0.48%     
===========================================
  Files          355      355              
  Lines        39370    39376       +6     
===========================================
+ Hits         28204    28399     +195     
+ Misses       11166    10977     -189     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

vogt31337
vogt31337 previously approved these changes Jul 16, 2026
Replaces the Windows platform-skip with an actual fix. Traced the
crash on a real windows-latest GitHub Actions runner (Houmgaor#diag-
opendss-windows-crash): dss_python_backend's Free Pascal runtime
raises an internal first-chance SEH exception during its own module
init that it normally handles and silences itself. pytest enables
Python's faulthandler by default, which installs a Windows vectored
exception handler that intercepts that first-chance exception before
Pascal's own handler gets it, and reports it as a fatal crash. A
plain `python -c "import opendssdirect"` never enables faulthandler,
so it never sees this -- matching the upstream report exactly.

Bracketing just the import with faulthandler.disable()/.enable()
eliminates the false crash entirely (verified: clean pytest pass, no
exception message) while leaving faulthandler protecting the rest of
the run (verified: a real segfault after the import is still caught
and reported).

See dss-extensions/OpenDSSDirect.py#148
The CHANGELOG entry still described the old Windows platform-skip;
update it to match the actual fix.
@sonarqubecloud

Copy link
Copy Markdown

@Houmgaor

Copy link
Copy Markdown
Contributor Author

@vogt31337 thanks for your quick review, I diagnosed the minimal fix in the meantime, so there are some new commits posterior to your review.

Let me know if all seems good.

@vogt31337
vogt31337 merged commit 4f139fa into e2nIEE:develop Jul 17, 2026
26 of 33 checks passed
KS-HTK added a commit that referenced this pull request Aug 6, 2026
* updated docstings (#2934)

deprecated unused keyword args

* Feature/get all elements (#2939)

* adding first draft of simple_hl_plot a function to easily highlight buses and lines paired with a hover functionality

* added function to get a dataframe of all elements in the net

* add test
clean comments
renaming

* add changelog entry

* ltds_fix (#2938)

* updated ltds notebooks

* updated ltds notebooks, fixed LTDS converter

* added pytest split to tutorial_test pipeline (#2935)

* added pytest split to tutorial_test pipeline

* added notebook test times

* fixed many links (#2937)

other formatting

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix copyright text formatting in LICENSE file (#2914)

* Fix copyright text formatting in LICENSE file

* Refactor copyright notice in LICENSE

Updated copyright notice formatting in LICENSE file following [upstream changes](licensee/licensee#950) to handle multi-line attribution.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* added PowerElectronicsConnection to the LTDS converter, updated LTDS notebooks (PowerElectronicsConnection) (#2942)

Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>

* ltds_pce (#2944)

* added PowerElectronicsConnection to the LTDS converter, updated LTDS notebooks (PowerElectronicsConnection)

* updated LTDS notebooks for mapping Excel data

* ltds_notebook (#2949)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* ltds_notebook (#2950)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* Feature check vkr percent (#2948)

* added check to check if vkr_percent values are reasonable.

* added changelog entry.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Feature additional diagnostic functions (#2952)

* added more diagnostic functions.

* added changelog entry.

* fixed a small bug, used the wrong value in the reactance field.

* Correct loading_percent description in motor_par.csv (#2947)

Updated the description of loading_percent.

* ucte2pp conversion fixes (#2823)

* consider empty R dataframe in ucte conversion

* convert impedances and trafos with G/B=NaN to G/B=0

* change fillna for trafos and impedances to the ucte_parser

* fillna df if 0

* fix nan values in impedances and trafos

* ucte2pp: averaging voltages and clean up parser

* changelog entries for ucte2pp fixes

* average voltage setpoints using topological search instead of ucte name

* empty space at EOF

* fix codacy issue

* remove create_switch from pp_import_functions

* fix create_vsc functions

* change symmetrical tap changer to 90 degree tap step degree

* correct handling of symmetrical PSTs in ucte2pp

* comment averaging function based on PR review

* changes ucte converter

* ucte2pp: add flag for voltage harmonization, with default false

* fix test

* fix tests and restrict tolerances a bit

---------

Co-authored-by: mrichter <mario.richter@iee.fraunhofer.de>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix 2733 (#2951)

* change patch sizes for plot (#2733)

* fix patch sizes for plot only once (#2733)

`get_collection_sizes()` takes arguments to adjust the relative size of
an element.

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix runopp(init="results") so the OPF solver preserves the model initial vector (#2902)

* Fix runopp(init=results) warm-start handling in pips OPF

* Update CHANGELOG for upcoming release fixes and features

---------

Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Feature/highlight plot (#2833)

* integrated highlighting feature into simple_plot

* integrated hover feature into simple_plot

* update plotting tutorial

* adjust color

* Fix unit g0_us (#2958)

attribute name g0_us_per_km is incorrectly named as g0_nf_per_km in add_zero_impedance_parameters function.

* updated branding with versions from marketing (#2953)

* [IMPROVEMENT] fix `bool` parameters input in `read_excel` and add `add_basic_std_types` parameter (#2961)

* Add basic std types flag to from_excel

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix reading bool

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix backward compatibility

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Silence sonarcloud and codacy

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove ruff ignore

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* added permissions block to all workflows (#2964)

* updated the issue templates to use the issue types instead of labels and title (#2966)

minor changes in forms layouts

* Feature/revised issue templates (#2967)

* updated the issue templates to use the issue types instead of labels and title
minor changes in forms layouts

* fix for config not parsing by github (hopefully)
added documentation template
added emoji to template title for more visual guidance

* uniform formatting for templates

* added missing blank line at end of file

* display logger message only if GetActiveScenario() isn't None (#2969)

Only display a logger message if GetActiveScenario is not None
Added else case with a info message if no study case / scenario is active.

* Update docstring (#2970)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* ltds_notebook (#2972)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* Update lightsim2grid version (#2976)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* fix cmin for low voltage 10% tolerance (#2913)

* fix(cmin): fix cmin for low voltage 10% tolerance

* [Fix] Fix `reindex_buses` against creating duplicate indecies (#2963)

* Fix reindex_buses

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Add allow_duplicate_index argument

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix unused import

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix test

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* feature/doc strings update (#2979)

* added/reformatted many docstrings

* added show_plot=False to test_plotting_toolbox

* refactored docstrings and added types

* fixed f-string in groups.py

* fixed incorrect type

* fixed incorrect type

* fixed missing import

* fixed import issue with specific lightsim2grid versions

* fixed mypy issues in contingency
refactored test in test_contingency

* fixed mypy issues

* updated var name

* updated the contributing.rst (#2973)

* updated the contributing.rst

* removed raw directive

* changed contributing to markdown for better github compatibility
replaced contributing on readTheDocs by link to GitHub

* Added a section on changelog to the contributing.md
Added a changelog entry to the changelog

* Update CHANGELOG.rst

* [Feature]: Toggle Colormap for simple_plot (#2971)

* colormap-integration in simple_plot

* adjust colors
*add docstrings
*add second button to better visualize options for the user

* change ext_grid color

* some formatting

* only plot colormap if buses or lines are available (fix tutorial-test error)

* removed some spaces
removed some whitelines
added results to hover info

* add changelog entry

* adepted authors

* adapted zorder
make plotting bus-switches optional

* typo

* small adaptions

* small adjustments

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* ltds_notebook (#2980)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* update LTDS Jupiter Notebook respecting new Excel format

---------

Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>

* Fix diagnostic report (#2983)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Tutorials for UKPN (#2984)

* Fix tutorial on power flow

* Updated Jupyter notebooks for UKPN

* Fix on tutorial directory

* [Fix] `DiscreteTapControl` to work with negative `tap_step_percent` (#2990)

* abs tap_step_percent

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Add changelog, test case

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove code duplication

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* updated the notebook to ignore warnings instead of capturing all output and only displaying specifics. (#2996)

* voltage dependend loads create differing results (#2991)

* fixed issue with voltage dependent loads.

* fixed typo in import

* removed unused imports

* Fixed test now failing due to nan instead of 0 for in_service=False

* Fixed juliacall version leading to errror in pandamodels-storage.ipynb (#3011)

* fix failing runpp(net, consider_line_temperature=True)  (#3004)

* fix failing runpp(net, consider_line_temperature=True) for grids with a mix of lines with alpha and without
added warning

* adapt test

* some structuring

* import default ALPHA

* rename ALPHA to ALPHA_TDPF due to duplicate (branch cols)

* fix NameError

* Fix: Apply transformer correction factor K_T only for max case (IEC 60909-0:2016)  (#2962)

* Fixing usage of transformer impedance correction factor in min case of short-circuit calculations,
Adapting tests

* take case from net._options for trafo k_t fix (calculation only for max case)

* case was missing.

* fixed a broken test.

* fix test_all_currents.py

* min and max test case for test_trafo_impedace fixed

* Fix SyntaxError: invalid escape sequences in test_group.py (Python 3.14)

Use raw strings (r"...") for all regex match patterns containing escape
sequences like \(, \[, and \. which are SyntaxError in Python 3.14.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Christian Bredtmann <christian.bredtmann@envelio.de>
Co-authored-by: pawellytaev <pawel.lytaev@uni-kassel.de>
Co-authored-by: envelio-cb <88880102+envelio-cb@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: Reinhold Bertram <reinhold.bertram@envelio.de>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: IEECNB215543\gbanerjee <gourab.banerjee@iee.fraunhofer.de>

* docs: fix separated spelling in docs (#3008)

Signed-off-by: Yoshiki <yosinn1@gmail.com>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Adaptions to PowerFactory2pp Converter (#3005)

Changes in PowerFactory2pp converter 

* Fixed test now failing due to nan instead of 0 for in_service=False

* get coords from (sub)stations
unpack only 2 coordinates, third one is 0
return None,None is no ext_grid can be created

* replace tuple with list to consolidate the code and fit the GeoJson standard

* tuple list ..

* cim2pp: mapping SV data to the assets with flag use_sv_data_for_assets=True (#3024)

* cim2pp: mapping SV data to the assets with flag use_sv_data_for_assets=True

* add GeographicalRegion from eqbd profile (#3025)

* add GeographicalRegion from eqbd profile

* add GeographicalRegion to cim_classes

* Check if static generator has connected bus before importing it from powerfactory (#2975)

* When importing static generators from powerfactory, first check if they are connected to a bus. If not, do not import them (previously, this was not checked for static gens that are reference machines, which led to import errors)

* Update to changelog

* simplified check for av_mode constq

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: pawellytaev <86314586+pawellytaev@users.noreply.github.com>

* fix warning in LTDS yupiter notebook (#3033)

* Speed up CGMES import (parser + trafo tap characteristic table) (#3020)

* Speed up CGMES trafo tap characteristic table build

Replace the per-group itertuples loop in _create_trafo_characteristic_table
with vectorized factorize and column-wise DataFrame construction. Output is
unchanged; convert time drops significantly on large CGMES networks.

* Speed up CGMES XML parsing with single-pass tag grouping
Group profile children by tag in one pass instead of calling findall per
element type, and streamline _parse_element attribute handling. Parsed CIM
tables and converted networks are unchanged on large CGMES test cases.

---------

Co-authored-by: Šime Pavlić <simepavlic@Simes-MacBook-Pro.local>
Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>
Co-authored-by: mrifraunhofer <94368111+mrifraunhofer@users.noreply.github.com>

* update scipy-stubs in toml (#3038)

* limited scipy-stubs to <1.18 for python<3.12 support

* Fixed SQL Injection possiblilities and some assertion in code (#3035)

* fixed sql injection possibility

* removed assertion from code

* update from_jao.py

* Update run_import.py

* Update sql_io.py

* fixed issue in from_jao

* fixed duplicate definition of test_dir/test_path
fixed sqlite table query

* fixed issues with psycopg version 3 being installed but version 2 being used.

* simplified pipeline to use env vars to pass args to test_sql_io

* fixed upload_sql_table
added changelog entries

* fixed sql using param for table or column names

* improved use of psql.Identifier

* improved use of psql.Identifier

* fixed import error when type checking
fixed issue with to_sql_str

* fixed missing comma in pyproject.toml

* improved SQL Query construction

* fixed issue with DEFAULT in query as Literal and not SQL Directive

* fixed issue with None being passed as str

* import fail will no longer result in successful pipeline as postgresql not available will fail now.

* fixed type being handled as string instead of sql directive

* fixed missing dsn and schema for availability test

* fixed issue where .as_string was called on a string

* fixed issue where to_sql_str was used for int values

* Issues/fixing critical codacy (#3040)

* fixed cp1 eur passed in kw instead of mw

* fixed typo in bug-report template

* removed unreachable return

* fixed typo in create_buses_dc

* Feature/integrate helm solver (#2067)

* added a new powerflow method, HELM. Provided by HELMpy package.

* added some tests for the new powerflow method.

* added a new powerflow method, HELM. Provided by HELMpy package.

* updated doc string.

* added a new powerflow method, HELM. Provided by HELMpy package.

* added a new powerflow method, HELM. Provided by HELMpy package.

* changed the standard iterations for helm, since helmpy crashes after 40 iterations with an index error.

* made some modifications to adapt the values to what helmpy awaits.

* added MBASE, since pandapower sometimes doesn't set this value.

* added the 9case testcase.

* fixed the helm integration into pandapower, the shunts needed to be scaled differently, the slack angle was ignored and the result extraction wasn't correct.

* updated the integration to use pv_bus_model=2 since it is the default.

* typing fixes.

* added some doc about helm.

* added more typing exclusion for mypy.

* added install git, since sphinx needs it to pull packages.

* added helm to algorithm literal and moved the import to the test.

* update of pipeline.

* added missing empty line

* updated docs and removed uv from pipeline.

* added install git.

* Update github_test_action.yml

updated docs pipeline to only install docs requirements

* added vscode workspace to gitignore.

* made some minor fixes to spelling and copyright headers.

* minor fixes for codacy.

---------

Co-authored-by: Jan Wiemer <32835953+jwiemer112@users.noreply.github.com>
Co-authored-by: Roman Bolgaryn <roman.bolgaryn@iee.fraunhofer.de>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Fixed issues in diagnostic functions + more tests (#3052)

* parametrized the diagnostic test.
added more diag functions to the no issues test.

* fixed diagnostic_functions and added tests.

* fixed continuous bus indices being tested incorrectly.
closes #3042

* Hardening from_json (#3050)

* first version to fix #3049

* fix for broken de-/serialization of (Log)SplineCharateristic.

* hardening from_json deserialiser.

* changed parameter to skip_checks.

* missed one refactor.

* fix for LSC, overwrote the setted values...

* needed to allow more modules.

* added more fixes needed for older networks, and added _eq_ method, since otherwise comparisons between SC / LSC fail.

* added an _eq_ and _hash_ function to SC and LSC

* had to fix LSC again, since it created the log10 of the values, which were already log10(x)

* had to add _eq_ and _hash_ to fuse and ocrelay otherwise they would not have worked as well.

* Fix 3ph loadflow with `gen` element (#3010)

* Fix gen 3ph result table

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix gen build

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove change to diagnostic

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove change to diagnostic

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Enhance ImportError logging in run_pandamodels.py

Improve error handling for ImportError in _call_pandamodels function.

* Simplify ImportError handling for juliacall

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Neutral earthing impedance (rn_ohm) and zigzag earthing transformers in the zero-sequence short circuit (#3016)

* [ADDED] neutral earthing impedance (rn_ohm) and zigzag earthing transformers in zero-sequence short circuit

- add rn_ohm (resistive neutral earthing) to create_transformer /
  create_transformer_from_parameters and the bulk variants; apply the neutral
  earthing impedance 3*(rn_ohm + j*xn_ohm) to the zero-sequence impedance of all
  earthed-star vector groups, after the IEC transformer correction factor.
  Previously xn_ohm was only considered for power-station-unit transformers, and
  only as a reactance, so a neutral earthing resistor (NER/NGR) could not be
  modelled for ordinary earthed transformers.
- add zigzag earthing transformer vector groups ZNyn / ZNd / ZNy / ZN. Per the
  YNzn zero-sequence model the zigzag winding completely decouples the primary
  and secondary zero sequences and presents a shunt-to-ground: the HV-winding
  leakage portion (si0_hv_partial) in series with 3*Z_N at the star point. An
  earthed-wye secondary (ZNyn) gets its own decoupled zero-sequence path to
  ground (LV leakage portion + zero-sequence magnetising); a delta / unearthed
  secondary (ZNd / ZNy) has none.
- add unit tests in test_1ph: neutral earthing adds exactly 3*Z_N to the zero
  sequence; zigzag earthing of a delta-fed system, with the NER limiting it and
  the primary/secondary decoupling.
- update changelog.

Enables IEC 60909 single-phase earth-fault studies on delta-fed systems earthed
through a neutral earthing resistor and/or a zigzag earthing transformer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fixed naming convention issues.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* add init_pq option for PandaModels opf warm starts (#2985)

* add init_pq option for PandaModels opf warm starts

* add changelog, fix float assertion

* New parameter wasn't handed over properly. Also logic in add_pm_gen_start_values_from_results seemed buggy. Return values which were nowehere used and empty return statements.

* Handed **kwargs to opf options / to _runpm

---------

Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* Fix generalized OPF cost Hessian evaluation (#3055)

* Fix generalized OPF cost Hessian evaluation

* cleaning the comments

* Move OPF cost function regression test into coverage suite

* Add changelog entry for OPF cost function fix

* Cover OPF generalized cost with empty Hessian

* Resolve changelog conflict

* Resolve changelog conflict

* Resolve changelog conflict

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Add an OpenDSS → pandapower converter (from_opendss) (#3056)

* Add OpenDSS -> pandapower converter (from_opendss)

Balanced positive-sequence importer that reads an OpenDSS feeder through
OpenDSSDirect.py and maps buses, lines (LineCode carried through as
std_type), two-winding and center-tapped split-phase service transformers
(imported at their solved tap), loads, shunt capacitors, switches and the
source. The returned net carries an opendss_import report with element
counts, per-bus phase counts, the OpenDSS-solved voltages and the
approximations made.

Positive-sequence is exact for symmetric (e.g. European 3-phase 4-wire)
feeders and a documented approximation for unsymmetrical North-American
topology, which runpp_3ph cannot represent (#873). Adds an "opendss"
optional-dependency extra, unit tests (inline circuits), docs and a
changelog entry.

Revisits #1442.

* Add the opendss extra to the "all" dependency group

Per maintainer feedback on #3043: a new production dependency group should
be included in "all". Drops the now-redundant explicit opendss entry from
"dev" (it inherits from "all").

* Address Codacy and SonarCloud static-analysis findings

- __init__.py: replace the wildcard re-export with an explicit
  `from ... import from_opendss` plus __all__ (pyflakes F401/F403), and
  add the package docstring (pydocstyle D104).
- from_dss.py: convert the docstrings to the numpy section style expected
  by pydocstyle (D213/D203/D406/D407/D413/D417).
- from_dss.py: avoid a floating-point equality check when detecting a
  missing voltage base (Sonar S1244), use dict() instead of a dict
  comprehension (S7500), and reword a comment that read like code (S125).

No behaviour change; the 9 converter tests still pass.

* Avoid pydocstyle D211/D212 vs D203/D213 conflict in the converter

The repository's static-analysis config enables both members of the
mutually-exclusive pydocstyle pairs (blank-line-before-class-docstring and
multi-line-summary-placement), so a multi-line module docstring or a class
docstring cannot satisfy it. Use a one-line module docstring with the
rationale moved to comments, and drop the docstring on the private
_ImportReport dataclass (a private class needs none). No behaviour change.

* fixed comment issues, which failed sphinx build.

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* More plotly results annotations (#2375)

* add more hoverinfo to plot

* overwrite pandapower version to make tests work

* fix wrong filepaths in test_file_io

* change back to original _version.py

* fixed unit issue and added typing.

* reverted changes to test_file_io.py

---------

Co-authored-by: Heiner Früh <heiner.frueh@stuttgart-netze.de>
Co-authored-by: Heiner <heiner.frueh@ieh.uni-stuttgart.de>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* fix(converter): Kron-reduce explicit-neutral OpenDSS LineCodes in from_opendss (#3058)

* fix(converter): Kron-reduce explicit-neutral OpenDSS LineCodes

from_opendss silently mis-computed positive-sequence resistance for
3-phase-plus-neutral matrix LineCodes (the standard 4-wire European LV
format): Lines.R1()/X1()/C1() do not Kron-reduce the neutral out of a
>3-conductor matrix before forming the sequence value, so the imported
line carried neither the declared conductor's impedance nor a value
derivable from it.

Found while validating the converter against a real, independently
sourced Portuguese LV network (Koirala et al., "Non-Synthetic European
Low Voltage Test System", 2020) -- a genuine 4-wire matrix LineCode
corpus outside the 3-conductor feeders the converter had been exercised
against so far.

Adds `_kron_positive_sequence`, used only for >3-conductor lines; the
common <=3-conductor path is untouched. Two regression fixtures cover
zero-mutual (the real-world pattern found) and asymmetric neutral
coupling (proves an actual reduction happens, not a pass-through).

* fix: R1/X1/C1 are stale for any matrix-defined line, not just >3-cond

The Kron-reduction fix only guarded lines with more than 3 conductors,
diagnosed from the first reproduction (an explicit-neutral European
LineCode). Checking OpenDSS's own Pascal source shows the real trigger
is broader: TLineObj/TLineCodeObj hard-code R1 := 0.0580, X1 := 0.1206
at construction, and switching to a matrix definition (rmatrix=/
xmatrix=) sets SymComponentsModel := FALSE but never clears or
recomputes those fields. OpenDSS's own text property interface knows
this and reports them as '----' once matrix mode is active, but the
direct numeric getters this converter calls don't perform the same
guard -- so any matrix-defined line, not just 4-conductor ones,
silently gets the stale default. Confirmed empirically: a plain
3-conductor matrix LineCode with no neutral at all returned the same
0.058/0.1206 instead of its declared values.

Widens the fix to always derive R1/X1/C1 from the declared matrix
(Kron-eliminating conductors beyond the first 3 only when there are
more than 3) instead of trusting OpenDSS's getters at all -- verified
to exactly reproduce the declared value for symmetric-components-
defined lines too, so this is safe universally. Generalizes the
self/mutual averaging to the actual conductor count instead of
hard-coding 3, since the previous formula would have silently
mis-handled 1- and 2-conductor matrix lines (a common SMART-DS/
IEEE-test-feeder pattern for single-phase laterals) had it ever been
reached. Adds two more regression tests for those cases.

* [FEATURE] Simple Redispatch solver using pandamodels.jl (#3059)

* added a redispatch solver via pandamodels.jl

* fixed changelog.

* updated pandamodels.jl version.

* changed default to actual floats not ints.

* fixed tests, since comparison failed due to nan values.

* pp.create.create_transformers value initialization not working (#2894)

* pp.create.create_transformers value initialization not working (#2886)
* create_transformers now forwards tap and optional std-type params.
* updated tests verifying these fields.

* pp.create.create_transformers value initialization not working (#2886)
* Remove unnecessary shift_degree extraction.
* Remove redundant tap_changer_type value check.
* Pass std_params directly to params dict instead of extracting individually.
* test_create should use tolist() instead of "value".
* npt.NDArray should use "integer" as a numpy.

* pp.create.create_transformers value initialization not working (#2886)
* Remove redundant tap_changer_type value check reverted.
* UT added for std_type override when create_transformers is used.

* pp.create.create_transformers value initialization not working (#2886)
* fix: prevent duplicate kwargs when using standard types
* refactor: undo unrelated test changes

* fixed return type and fixed potential None error.

* fixed test test_create_transformers_for_single_override_std_type.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Add compute_switch_flows() for zero-impedance bus-bus switches (#2956)

After runpp(), bus-bus switches with z_ohm=0 have NaN in res_switch
because Pandapower fuses their buses into a single internal node.
This makes it impossible to determine the power flow through
individual bus couplers, bus-section switches, or similar zero-
impedance switching devices.

This commit adds a new toolbox function compute_switch_flows(net)
that populates res_switch (p_from_mw, q_from_mvar, p_to_mw,
q_to_mvar, i_ka, loading_percent) for these switches using a
post-hoc nodal balance approach:

1. Identify fused-bus groups from _pd2ppc_lookups["bus"]
2. Calculate net local injection at each bus from res_* tables
   (loads, generators, shunts, wards, and outgoing branch flows)
3. Build the zero-impedance switch tree within each fused group
4. DFS from leaves to root to accumulate subtree demand and
   derive individual switch flows

The function raises ValueError if zero-impedance switches form a
cycle within a fused group, since the flow split is physically
indeterminate without impedance information.

Switches with z_ohm > 0 are not modified, as they already have
results from the Newton-Raphson solver.

Also adds documentation (toolbox.rst, switch.rst, CHANGELOG.rst)
and 17 tests covering single couplers, chains, branching trees,
cycle detection, sign convention, cross-validation, and loading
percent.

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Do not open networks from files with older format version than the installed pandapower version (#2912)

* do not open networks with newer format versions than the currently installed pandapower version

* usage of possibility to open newer networks in all file io-functions

# Conflicts:
#	pandapower/convert_format.py
#	pandapower/file_io.py

* small bug fix

* add test for new behavior (do not open newer networks)

* added changelog entry

* removed TODO, small correction in file_io.py

* fixed an error in file_io.py, prob due to a merge error on my part.

* fixed docstring.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* bump version.

* fixed upload pipeline.

* bump version. Needed to remove direct dependency to helmpy, needs to be installed manually.

* fixed a misleading logger.warning message.

* bump version.

* [Fix] unsafe json load (#3061)

* block deserializing arbitrary objects from json

* remove dead code (geo data fallback)

* surface DeserializationNotAllowed exception

* allow deserializing Enums defined in pandapower

---------

Co-authored-by: SRDM <42580302+SimonRubenDrauz@users.noreply.github.com>

* upgrade of all fixed versions (#3062)

* upgrade of all versions, but opendss killed the pipeline see dss-extensions/OpenDSSDirect.py#148

* excluded an incompatible scipy version.

* added support for python 3.10 of sphinx.

* fixed version for networkx

* some more version fixes.

* fixed some typing issues.

* fixed a bug in this timeseries notebook.

* bump version.

* updated the Logo paths and e2n Link in accordance with PR #15 on pandapower-homepage (#3066)

* feat(opendss): import series Reactor elements as branches (#3067)

Found while test-importing more real feeder libraries (EPRI's Ckt5/Ckt7)
for validation beyond the original PR's four families: EPRI models the
substation's Thevenin-equivalent source impedance as a bus-to-bus Reactor
(SourceBus -> feeder head), not a Transformer, a topology from_opendss
did not yet cover.

_add_reactors treats a series (two-bus) Reactor as a fixed-impedance line
(R/X from dss.Reactors.R()/X(), rated at CktElement.NormalAmps()). A shunt
reactor (single bus, to ground) is a different element and is skipped
with a warning rather than misread as a second branch.

4 new regression tests on an inline synthetic feeder.

* fix(opendss): restore OpenDSSDirect.py as a dev dependency (#3075)

* fix(opendss): restore OpenDSSDirect.py as a dev dependency

It was dropped from the all/dev extras in #3062 because installing it
alongside pytest~=9.1 crashes the pytest process on Windows (upstream
bug: dss-extensions/OpenDSSDirect.py#148). That left the OpenDSS
converter with 0% coverage in CI, since opendssdirect was never
installed to begin with.

The crash is Windows-specific: it reproduces with pytest==9.1.1 +
OpenDSSDirect.py==0.9.4 on Windows but not on Linux, where this
repo's PR-gating CI actually runs. Restore the dependency and skip
test_from_opendss.py on win32 before it ever imports opendssdirect,
instead of avoiding the dependency for every platform.

* fix(opendss): disable faulthandler around the opendssdirect import

Replaces the Windows platform-skip with an actual fix. Traced the
crash on a real windows-latest GitHub Actions runner (Houmgaor#diag-
opendss-windows-crash): dss_python_backend's Free Pascal runtime
raises an internal first-chance SEH exception during its own module
init that it normally handles and silences itself. pytest enables
Python's faulthandler by default, which installs a Windows vectored
exception handler that intercepts that first-chance exception before
Pascal's own handler gets it, and reports it as a fatal crash. A
plain `python -c "import opendssdirect"` never enables faulthandler,
so it never sees this -- matching the upstream report exactly.

Bracketing just the import with faulthandler.disable()/.enable()
eliminates the false crash entirely (verified: clean pytest pass, no
exception message) while leaving faulthandler protecting the rest of
the run (verified: a real segfault after the import is still caught
and reported).

See dss-extensions/OpenDSSDirect.py#148

* docs(changelog): update entry to describe the faulthandler fix

The CHANGELOG entry still described the old Windows platform-skip;
update it to match the actual fix.

* removed support for 3.10

* added fixes that exist on feature/v4.0.0 to simplify merging in the future (#3072)

* added skip for test that relies on newer version of pgm-io

* fixed mypy issues

* added typing and fixed docstring

* fixed redefinition of var type

* fixed incorrect use of skipif

* fixed use of object as fallback for geoseries when typechecking

* fixed typing in groups.py

* fixed occurences of create_empty_network

* removed duplicate ukpn tutorials

* fixed missing import in plotly_traces.ipynb

* fixed opf test failing

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>
Signed-off-by: Yoshiki <yosinn1@gmail.com>
Co-authored-by: Jan Wiemer <32835953+jwiemer112@users.noreply.github.com>
Co-authored-by: mrifraunhofer <94368111+mrifraunhofer@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>
Co-authored-by: Bryn Pickering <17178478+brynpickering@users.noreply.github.com>
Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>
Co-authored-by: Arisaka97 <solitaire2312@gmail.com>
Co-authored-by: pawellytaev <86314586+pawellytaev@users.noreply.github.com>
Co-authored-by: mrichter <mario.richter@iee.fraunhofer.de>
Co-authored-by: Moritz <29129441+MoritzHauff@users.noreply.github.com>
Co-authored-by: Jeremias Lang <158100420+jerelang@users.noreply.github.com>
Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: Engr. Ahmad Furqan <ahmadfurqanc@gmail.com>
Co-authored-by: nis-nurr <rijad.nuridini@nis.ch>
Co-authored-by: marcopau <77792704+marcopau@users.noreply.github.com>
Co-authored-by: envelio-js <johannes.sorg@envelio.de>
Co-authored-by: Christian Bredtmann <christian.bredtmann@envelio.de>
Co-authored-by: pawellytaev <pawel.lytaev@uni-kassel.de>
Co-authored-by: envelio-cb <88880102+envelio-cb@users.noreply.github.com>
Co-authored-by: Reinhold Bertram <reinhold.bertram@envelio.de>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: IEECNB215543\gbanerjee <gourab.banerjee@iee.fraunhofer.de>
Co-authored-by: yosinn1-blip <yosinn1@gmail.com>
Co-authored-by: Frank Marten <79512075+fmarten99@users.noreply.github.com>
Co-authored-by: Šime Pavlić <pavlicsime1994@gmail.com>
Co-authored-by: Šime Pavlić <simepavlic@Simes-MacBook-Pro.local>
Co-authored-by: Roman Bolgaryn <roman.bolgaryn@iee.fraunhofer.de>
Co-authored-by: stardeltapower <65967874+stardeltapower@users.noreply.github.com>
Co-authored-by: Ehsanpoly <90526732+Ehsanpoly@users.noreply.github.com>
Co-authored-by: Houmgaor <35099109+Houmgaor@users.noreply.github.com>
Co-authored-by: Heiner <heiner.frueh@gmx.de>
Co-authored-by: Heiner Früh <heiner.frueh@stuttgart-netze.de>
Co-authored-by: Heiner <heiner.frueh@ieh.uni-stuttgart.de>
Co-authored-by: Nemanja Stankić <36014264+belobradi@users.noreply.github.com>
Co-authored-by: Pascal Ehlert <pascal@ehlert-it.de>
Co-authored-by: Daniel Lohmeier <31214121+dlohmeier@users.noreply.github.com>
Co-authored-by: Joschka Thurner <joschka.thurner@retoflow.de>
Co-authored-by: SRDM <42580302+SimonRubenDrauz@users.noreply.github.com>
Ehsanpoly added a commit to Ehsanpoly/pandapower that referenced this pull request Aug 9, 2026
* updated docstings (e2nIEE#2934)

deprecated unused keyword args

* Feature/get all elements (e2nIEE#2939)

* adding first draft of simple_hl_plot a function to easily highlight buses and lines paired with a hover functionality

* added function to get a dataframe of all elements in the net

* add test
clean comments
renaming

* add changelog entry

* ltds_fix (e2nIEE#2938)

* updated ltds notebooks

* updated ltds notebooks, fixed LTDS converter

* added pytest split to tutorial_test pipeline (e2nIEE#2935)

* added pytest split to tutorial_test pipeline

* added notebook test times

* fixed many links (e2nIEE#2937)

other formatting

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix copyright text formatting in LICENSE file (e2nIEE#2914)

* Fix copyright text formatting in LICENSE file

* Refactor copyright notice in LICENSE

Updated copyright notice formatting in LICENSE file following [upstream changes](licensee/licensee#950) to handle multi-line attribution.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* added PowerElectronicsConnection to the LTDS converter, updated LTDS notebooks (PowerElectronicsConnection) (e2nIEE#2942)

Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>

* ltds_pce (e2nIEE#2944)

* added PowerElectronicsConnection to the LTDS converter, updated LTDS notebooks (PowerElectronicsConnection)

* updated LTDS notebooks for mapping Excel data

* ltds_notebook (e2nIEE#2949)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* ltds_notebook (e2nIEE#2950)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* Feature check vkr percent (e2nIEE#2948)

* added check to check if vkr_percent values are reasonable.

* added changelog entry.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Feature additional diagnostic functions (e2nIEE#2952)

* added more diagnostic functions.

* added changelog entry.

* fixed a small bug, used the wrong value in the reactance field.

* Correct loading_percent description in motor_par.csv (e2nIEE#2947)

Updated the description of loading_percent.

* ucte2pp conversion fixes (e2nIEE#2823)

* consider empty R dataframe in ucte conversion

* convert impedances and trafos with G/B=NaN to G/B=0

* change fillna for trafos and impedances to the ucte_parser

* fillna df if 0

* fix nan values in impedances and trafos

* ucte2pp: averaging voltages and clean up parser

* changelog entries for ucte2pp fixes

* average voltage setpoints using topological search instead of ucte name

* empty space at EOF

* fix codacy issue

* remove create_switch from pp_import_functions

* fix create_vsc functions

* change symmetrical tap changer to 90 degree tap step degree

* correct handling of symmetrical PSTs in ucte2pp

* comment averaging function based on PR review

* changes ucte converter

* ucte2pp: add flag for voltage harmonization, with default false

* fix test

* fix tests and restrict tolerances a bit

---------

Co-authored-by: mrichter <mario.richter@iee.fraunhofer.de>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix 2733 (e2nIEE#2951)

* change patch sizes for plot (e2nIEE#2733)

* fix patch sizes for plot only once (e2nIEE#2733)

`get_collection_sizes()` takes arguments to adjust the relative size of
an element.

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix runopp(init="results") so the OPF solver preserves the model initial vector (e2nIEE#2902)

* Fix runopp(init=results) warm-start handling in pips OPF

* Update CHANGELOG for upcoming release fixes and features

---------

Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Feature/highlight plot (e2nIEE#2833)

* integrated highlighting feature into simple_plot

* integrated hover feature into simple_plot

* update plotting tutorial

* adjust color

* Fix unit g0_us (e2nIEE#2958)

attribute name g0_us_per_km is incorrectly named as g0_nf_per_km in add_zero_impedance_parameters function.

* updated branding with versions from marketing (e2nIEE#2953)

* [IMPROVEMENT] fix `bool` parameters input in `read_excel` and add `add_basic_std_types` parameter (e2nIEE#2961)

* Add basic std types flag to from_excel

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix reading bool

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix backward compatibility

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Silence sonarcloud and codacy

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove ruff ignore

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* added permissions block to all workflows (e2nIEE#2964)

* updated the issue templates to use the issue types instead of labels and title (e2nIEE#2966)

minor changes in forms layouts

* Feature/revised issue templates (e2nIEE#2967)

* updated the issue templates to use the issue types instead of labels and title
minor changes in forms layouts

* fix for config not parsing by github (hopefully)
added documentation template
added emoji to template title for more visual guidance

* uniform formatting for templates

* added missing blank line at end of file

* display logger message only if GetActiveScenario() isn't None (e2nIEE#2969)

Only display a logger message if GetActiveScenario is not None
Added else case with a info message if no study case / scenario is active.

* Update docstring (e2nIEE#2970)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* ltds_notebook (e2nIEE#2972)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* Update lightsim2grid version (e2nIEE#2976)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* fix cmin for low voltage 10% tolerance (e2nIEE#2913)

* fix(cmin): fix cmin for low voltage 10% tolerance

* [Fix] Fix `reindex_buses` against creating duplicate indecies (e2nIEE#2963)

* Fix reindex_buses

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Add allow_duplicate_index argument

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix unused import

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix test

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* feature/doc strings update (e2nIEE#2979)

* added/reformatted many docstrings

* added show_plot=False to test_plotting_toolbox

* refactored docstrings and added types

* fixed f-string in groups.py

* fixed incorrect type

* fixed incorrect type

* fixed missing import

* fixed import issue with specific lightsim2grid versions

* fixed mypy issues in contingency
refactored test in test_contingency

* fixed mypy issues

* updated var name

* updated the contributing.rst (e2nIEE#2973)

* updated the contributing.rst

* removed raw directive

* changed contributing to markdown for better github compatibility
replaced contributing on readTheDocs by link to GitHub

* Added a section on changelog to the contributing.md
Added a changelog entry to the changelog

* Update CHANGELOG.rst

* [Feature]: Toggle Colormap for simple_plot (e2nIEE#2971)

* colormap-integration in simple_plot

* adjust colors
*add docstrings
*add second button to better visualize options for the user

* change ext_grid color

* some formatting

* only plot colormap if buses or lines are available (fix tutorial-test error)

* removed some spaces
removed some whitelines
added results to hover info

* add changelog entry

* adepted authors

* adapted zorder
make plotting bus-switches optional

* typo

* small adaptions

* small adjustments

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* ltds_notebook (e2nIEE#2980)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* update LTDS Jupiter Notebook respecting new Excel format

---------

Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>

* Fix diagnostic report (e2nIEE#2983)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Tutorials for UKPN (e2nIEE#2984)

* Fix tutorial on power flow

* Updated Jupyter notebooks for UKPN

* Fix on tutorial directory

* [Fix] `DiscreteTapControl` to work with negative `tap_step_percent` (e2nIEE#2990)

* abs tap_step_percent

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Add changelog, test case

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove code duplication

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* updated the notebook to ignore warnings instead of capturing all output and only displaying specifics. (e2nIEE#2996)

* voltage dependend loads create differing results (e2nIEE#2991)

* fixed issue with voltage dependent loads.

* fixed typo in import

* removed unused imports

* Fixed test now failing due to nan instead of 0 for in_service=False

* Fixed juliacall version leading to errror in pandamodels-storage.ipynb (e2nIEE#3011)

* fix failing runpp(net, consider_line_temperature=True)  (e2nIEE#3004)

* fix failing runpp(net, consider_line_temperature=True) for grids with a mix of lines with alpha and without
added warning

* adapt test

* some structuring

* import default ALPHA

* rename ALPHA to ALPHA_TDPF due to duplicate (branch cols)

* fix NameError

* Fix: Apply transformer correction factor K_T only for max case (IEC 60909-0:2016)  (e2nIEE#2962)

* Fixing usage of transformer impedance correction factor in min case of short-circuit calculations,
Adapting tests

* take case from net._options for trafo k_t fix (calculation only for max case)

* case was missing.

* fixed a broken test.

* fix test_all_currents.py

* min and max test case for test_trafo_impedace fixed

* Fix SyntaxError: invalid escape sequences in test_group.py (Python 3.14)

Use raw strings (r"...") for all regex match patterns containing escape
sequences like \(, \[, and \. which are SyntaxError in Python 3.14.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Christian Bredtmann <christian.bredtmann@envelio.de>
Co-authored-by: pawellytaev <pawel.lytaev@uni-kassel.de>
Co-authored-by: envelio-cb <88880102+envelio-cb@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: Reinhold Bertram <reinhold.bertram@envelio.de>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: IEECNB215543\gbanerjee <gourab.banerjee@iee.fraunhofer.de>

* docs: fix separated spelling in docs (e2nIEE#3008)

Signed-off-by: Yoshiki <yosinn1@gmail.com>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Adaptions to PowerFactory2pp Converter (e2nIEE#3005)

Changes in PowerFactory2pp converter

* Fixed test now failing due to nan instead of 0 for in_service=False

* get coords from (sub)stations
unpack only 2 coordinates, third one is 0
return None,None is no ext_grid can be created

* replace tuple with list to consolidate the code and fit the GeoJson standard

* tuple list ..

* cim2pp: mapping SV data to the assets with flag use_sv_data_for_assets=True (e2nIEE#3024)

* cim2pp: mapping SV data to the assets with flag use_sv_data_for_assets=True

* add GeographicalRegion from eqbd profile (e2nIEE#3025)

* add GeographicalRegion from eqbd profile

* add GeographicalRegion to cim_classes

* Check if static generator has connected bus before importing it from powerfactory (e2nIEE#2975)

* When importing static generators from powerfactory, first check if they are connected to a bus. If not, do not import them (previously, this was not checked for static gens that are reference machines, which led to import errors)

* Update to changelog

* simplified check for av_mode constq

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: pawellytaev <86314586+pawellytaev@users.noreply.github.com>

* fix warning in LTDS yupiter notebook (e2nIEE#3033)

* Speed up CGMES import (parser + trafo tap characteristic table) (e2nIEE#3020)

* Speed up CGMES trafo tap characteristic table build

Replace the per-group itertuples loop in _create_trafo_characteristic_table
with vectorized factorize and column-wise DataFrame construction. Output is
unchanged; convert time drops significantly on large CGMES networks.

* Speed up CGMES XML parsing with single-pass tag grouping
Group profile children by tag in one pass instead of calling findall per
element type, and streamline _parse_element attribute handling. Parsed CIM
tables and converted networks are unchanged on large CGMES test cases.

---------

Co-authored-by: Šime Pavlić <simepavlic@Simes-MacBook-Pro.local>
Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>
Co-authored-by: mrifraunhofer <94368111+mrifraunhofer@users.noreply.github.com>

* update scipy-stubs in toml (e2nIEE#3038)

* limited scipy-stubs to <1.18 for python<3.12 support

* Fixed SQL Injection possiblilities and some assertion in code (e2nIEE#3035)

* fixed sql injection possibility

* removed assertion from code

* update from_jao.py

* Update run_import.py

* Update sql_io.py

* fixed issue in from_jao

* fixed duplicate definition of test_dir/test_path
fixed sqlite table query

* fixed issues with psycopg version 3 being installed but version 2 being used.

* simplified pipeline to use env vars to pass args to test_sql_io

* fixed upload_sql_table
added changelog entries

* fixed sql using param for table or column names

* improved use of psql.Identifier

* improved use of psql.Identifier

* fixed import error when type checking
fixed issue with to_sql_str

* fixed missing comma in pyproject.toml

* improved SQL Query construction

* fixed issue with DEFAULT in query as Literal and not SQL Directive

* fixed issue with None being passed as str

* import fail will no longer result in successful pipeline as postgresql not available will fail now.

* fixed type being handled as string instead of sql directive

* fixed missing dsn and schema for availability test

* fixed issue where .as_string was called on a string

* fixed issue where to_sql_str was used for int values

* Issues/fixing critical codacy (e2nIEE#3040)

* fixed cp1 eur passed in kw instead of mw

* fixed typo in bug-report template

* removed unreachable return

* fixed typo in create_buses_dc

* Feature/integrate helm solver (e2nIEE#2067)

* added a new powerflow method, HELM. Provided by HELMpy package.

* added some tests for the new powerflow method.

* added a new powerflow method, HELM. Provided by HELMpy package.

* updated doc string.

* added a new powerflow method, HELM. Provided by HELMpy package.

* added a new powerflow method, HELM. Provided by HELMpy package.

* changed the standard iterations for helm, since helmpy crashes after 40 iterations with an index error.

* made some modifications to adapt the values to what helmpy awaits.

* added MBASE, since pandapower sometimes doesn't set this value.

* added the 9case testcase.

* fixed the helm integration into pandapower, the shunts needed to be scaled differently, the slack angle was ignored and the result extraction wasn't correct.

* updated the integration to use pv_bus_model=2 since it is the default.

* typing fixes.

* added some doc about helm.

* added more typing exclusion for mypy.

* added install git, since sphinx needs it to pull packages.

* added helm to algorithm literal and moved the import to the test.

* update of pipeline.

* added missing empty line

* updated docs and removed uv from pipeline.

* added install git.

* Update github_test_action.yml

updated docs pipeline to only install docs requirements

* added vscode workspace to gitignore.

* made some minor fixes to spelling and copyright headers.

* minor fixes for codacy.

---------

Co-authored-by: Jan Wiemer <32835953+jwiemer112@users.noreply.github.com>
Co-authored-by: Roman Bolgaryn <roman.bolgaryn@iee.fraunhofer.de>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Fixed issues in diagnostic functions + more tests (e2nIEE#3052)

* parametrized the diagnostic test.
added more diag functions to the no issues test.

* fixed diagnostic_functions and added tests.

* fixed continuous bus indices being tested incorrectly.
closes e2nIEE#3042

* Hardening from_json (e2nIEE#3050)

* first version to fix e2nIEE#3049

* fix for broken de-/serialization of (Log)SplineCharateristic.

* hardening from_json deserialiser.

* changed parameter to skip_checks.

* missed one refactor.

* fix for LSC, overwrote the setted values...

* needed to allow more modules.

* added more fixes needed for older networks, and added _eq_ method, since otherwise comparisons between SC / LSC fail.

* added an _eq_ and _hash_ function to SC and LSC

* had to fix LSC again, since it created the log10 of the values, which were already log10(x)

* had to add _eq_ and _hash_ to fuse and ocrelay otherwise they would not have worked as well.

* Fix 3ph loadflow with `gen` element (e2nIEE#3010)

* Fix gen 3ph result table

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix gen build

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove change to diagnostic

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove change to diagnostic

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Enhance ImportError logging in run_pandamodels.py

Improve error handling for ImportError in _call_pandamodels function.

* Simplify ImportError handling for juliacall

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Neutral earthing impedance (rn_ohm) and zigzag earthing transformers in the zero-sequence short circuit (e2nIEE#3016)

* [ADDED] neutral earthing impedance (rn_ohm) and zigzag earthing transformers in zero-sequence short circuit

- add rn_ohm (resistive neutral earthing) to create_transformer /
  create_transformer_from_parameters and the bulk variants; apply the neutral
  earthing impedance 3*(rn_ohm + j*xn_ohm) to the zero-sequence impedance of all
  earthed-star vector groups, after the IEC transformer correction factor.
  Previously xn_ohm was only considered for power-station-unit transformers, and
  only as a reactance, so a neutral earthing resistor (NER/NGR) could not be
  modelled for ordinary earthed transformers.
- add zigzag earthing transformer vector groups ZNyn / ZNd / ZNy / ZN. Per the
  YNzn zero-sequence model the zigzag winding completely decouples the primary
  and secondary zero sequences and presents a shunt-to-ground: the HV-winding
  leakage portion (si0_hv_partial) in series with 3*Z_N at the star point. An
  earthed-wye secondary (ZNyn) gets its own decoupled zero-sequence path to
  ground (LV leakage portion + zero-sequence magnetising); a delta / unearthed
  secondary (ZNd / ZNy) has none.
- add unit tests in test_1ph: neutral earthing adds exactly 3*Z_N to the zero
  sequence; zigzag earthing of a delta-fed system, with the NER limiting it and
  the primary/secondary decoupling.
- update changelog.

Enables IEC 60909 single-phase earth-fault studies on delta-fed systems earthed
through a neutral earthing resistor and/or a zigzag earthing transformer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fixed naming convention issues.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* add init_pq option for PandaModels opf warm starts (e2nIEE#2985)

* add init_pq option for PandaModels opf warm starts

* add changelog, fix float assertion

* New parameter wasn't handed over properly. Also logic in add_pm_gen_start_values_from_results seemed buggy. Return values which were nowehere used and empty return statements.

* Handed **kwargs to opf options / to _runpm

---------

Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* Fix generalized OPF cost Hessian evaluation (e2nIEE#3055)

* Fix generalized OPF cost Hessian evaluation

* cleaning the comments

* Move OPF cost function regression test into coverage suite

* Add changelog entry for OPF cost function fix

* Cover OPF generalized cost with empty Hessian

* Resolve changelog conflict

* Resolve changelog conflict

* Resolve changelog conflict

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Add an OpenDSS → pandapower converter (from_opendss) (e2nIEE#3056)

* Add OpenDSS -> pandapower converter (from_opendss)

Balanced positive-sequence importer that reads an OpenDSS feeder through
OpenDSSDirect.py and maps buses, lines (LineCode carried through as
std_type), two-winding and center-tapped split-phase service transformers
(imported at their solved tap), loads, shunt capacitors, switches and the
source. The returned net carries an opendss_import report with element
counts, per-bus phase counts, the OpenDSS-solved voltages and the
approximations made.

Positive-sequence is exact for symmetric (e.g. European 3-phase 4-wire)
feeders and a documented approximation for unsymmetrical North-American
topology, which runpp_3ph cannot represent (e2nIEE#873). Adds an "opendss"
optional-dependency extra, unit tests (inline circuits), docs and a
changelog entry.

Revisits e2nIEE#1442.

* Add the opendss extra to the "all" dependency group

Per maintainer feedback on e2nIEE#3043: a new production dependency group should
be included in "all". Drops the now-redundant explicit opendss entry from
"dev" (it inherits from "all").

* Address Codacy and SonarCloud static-analysis findings

- __init__.py: replace the wildcard re-export with an explicit
  `from ... import from_opendss` plus __all__ (pyflakes F401/F403), and
  add the package docstring (pydocstyle D104).
- from_dss.py: convert the docstrings to the numpy section style expected
  by pydocstyle (D213/D203/D406/D407/D413/D417).
- from_dss.py: avoid a floating-point equality check when detecting a
  missing voltage base (Sonar S1244), use dict() instead of a dict
  comprehension (S7500), and reword a comment that read like code (S125).

No behaviour change; the 9 converter tests still pass.

* Avoid pydocstyle D211/D212 vs D203/D213 conflict in the converter

The repository's static-analysis config enables both members of the
mutually-exclusive pydocstyle pairs (blank-line-before-class-docstring and
multi-line-summary-placement), so a multi-line module docstring or a class
docstring cannot satisfy it. Use a one-line module docstring with the
rationale moved to comments, and drop the docstring on the private
_ImportReport dataclass (a private class needs none). No behaviour change.

* fixed comment issues, which failed sphinx build.

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* More plotly results annotations (e2nIEE#2375)

* add more hoverinfo to plot

* overwrite pandapower version to make tests work

* fix wrong filepaths in test_file_io

* change back to original _version.py

* fixed unit issue and added typing.

* reverted changes to test_file_io.py

---------

Co-authored-by: Heiner Früh <heiner.frueh@stuttgart-netze.de>
Co-authored-by: Heiner <heiner.frueh@ieh.uni-stuttgart.de>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* fix(converter): Kron-reduce explicit-neutral OpenDSS LineCodes in from_opendss (e2nIEE#3058)

* fix(converter): Kron-reduce explicit-neutral OpenDSS LineCodes

from_opendss silently mis-computed positive-sequence resistance for
3-phase-plus-neutral matrix LineCodes (the standard 4-wire European LV
format): Lines.R1()/X1()/C1() do not Kron-reduce the neutral out of a
>3-conductor matrix before forming the sequence value, so the imported
line carried neither the declared conductor's impedance nor a value
derivable from it.

Found while validating the converter against a real, independently
sourced Portuguese LV network (Koirala et al., "Non-Synthetic European
Low Voltage Test System", 2020) -- a genuine 4-wire matrix LineCode
corpus outside the 3-conductor feeders the converter had been exercised
against so far.

Adds `_kron_positive_sequence`, used only for >3-conductor lines; the
common <=3-conductor path is untouched. Two regression fixtures cover
zero-mutual (the real-world pattern found) and asymmetric neutral
coupling (proves an actual reduction happens, not a pass-through).

* fix: R1/X1/C1 are stale for any matrix-defined line, not just >3-cond

The Kron-reduction fix only guarded lines with more than 3 conductors,
diagnosed from the first reproduction (an explicit-neutral European
LineCode). Checking OpenDSS's own Pascal source shows the real trigger
is broader: TLineObj/TLineCodeObj hard-code R1 := 0.0580, X1 := 0.1206
at construction, and switching to a matrix definition (rmatrix=/
xmatrix=) sets SymComponentsModel := FALSE but never clears or
recomputes those fields. OpenDSS's own text property interface knows
this and reports them as '----' once matrix mode is active, but the
direct numeric getters this converter calls don't perform the same
guard -- so any matrix-defined line, not just 4-conductor ones,
silently gets the stale default. Confirmed empirically: a plain
3-conductor matrix LineCode with no neutral at all returned the same
0.058/0.1206 instead of its declared values.

Widens the fix to always derive R1/X1/C1 from the declared matrix
(Kron-eliminating conductors beyond the first 3 only when there are
more than 3) instead of trusting OpenDSS's getters at all -- verified
to exactly reproduce the declared value for symmetric-components-
defined lines too, so this is safe universally. Generalizes the
self/mutual averaging to the actual conductor count instead of
hard-coding 3, since the previous formula would have silently
mis-handled 1- and 2-conductor matrix lines (a common SMART-DS/
IEEE-test-feeder pattern for single-phase laterals) had it ever been
reached. Adds two more regression tests for those cases.

* [FEATURE] Simple Redispatch solver using pandamodels.jl (e2nIEE#3059)

* added a redispatch solver via pandamodels.jl

* fixed changelog.

* updated pandamodels.jl version.

* changed default to actual floats not ints.

* fixed tests, since comparison failed due to nan values.

* pp.create.create_transformers value initialization not working (e2nIEE#2894)

* pp.create.create_transformers value initialization not working (e2nIEE#2886)
* create_transformers now forwards tap and optional std-type params.
* updated tests verifying these fields.

* pp.create.create_transformers value initialization not working (e2nIEE#2886)
* Remove unnecessary shift_degree extraction.
* Remove redundant tap_changer_type value check.
* Pass std_params directly to params dict instead of extracting individually.
* test_create should use tolist() instead of "value".
* npt.NDArray should use "integer" as a numpy.

* pp.create.create_transformers value initialization not working (e2nIEE#2886)
* Remove redundant tap_changer_type value check reverted.
* UT added for std_type override when create_transformers is used.

* pp.create.create_transformers value initialization not working (e2nIEE#2886)
* fix: prevent duplicate kwargs when using standard types
* refactor: undo unrelated test changes

* fixed return type and fixed potential None error.

* fixed test test_create_transformers_for_single_override_std_type.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Add compute_switch_flows() for zero-impedance bus-bus switches (e2nIEE#2956)

After runpp(), bus-bus switches with z_ohm=0 have NaN in res_switch
because Pandapower fuses their buses into a single internal node.
This makes it impossible to determine the power flow through
individual bus couplers, bus-section switches, or similar zero-
impedance switching devices.

This commit adds a new toolbox function compute_switch_flows(net)
that populates res_switch (p_from_mw, q_from_mvar, p_to_mw,
q_to_mvar, i_ka, loading_percent) for these switches using a
post-hoc nodal balance approach:

1. Identify fused-bus groups from _pd2ppc_lookups["bus"]
2. Calculate net local injection at each bus from res_* tables
   (loads, generators, shunts, wards, and outgoing branch flows)
3. Build the zero-impedance switch tree within each fused group
4. DFS from leaves to root to accumulate subtree demand and
   derive individual switch flows

The function raises ValueError if zero-impedance switches form a
cycle within a fused group, since the flow split is physically
indeterminate without impedance information.

Switches with z_ohm > 0 are not modified, as they already have
results from the Newton-Raphson solver.

Also adds documentation (toolbox.rst, switch.rst, CHANGELOG.rst)
and 17 tests covering single couplers, chains, branching trees,
cycle detection, sign convention, cross-validation, and loading
percent.

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Do not open networks from files with older format version than the installed pandapower version (e2nIEE#2912)

* do not open networks with newer format versions than the currently installed pandapower version

* usage of possibility to open newer networks in all file io-functions

# Conflicts:
#	pandapower/convert_format.py
#	pandapower/file_io.py

* small bug fix

* add test for new behavior (do not open newer networks)

* added changelog entry

* removed TODO, small correction in file_io.py

* fixed an error in file_io.py, prob due to a merge error on my part.

* fixed docstring.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* bump version.

* fixed upload pipeline.

* bump version. Needed to remove direct dependency to helmpy, needs to be installed manually.

* fixed a misleading logger.warning message.

* bump version.

* [Fix] unsafe json load (e2nIEE#3061)

* block deserializing arbitrary objects from json

* remove dead code (geo data fallback)

* surface DeserializationNotAllowed exception

* allow deserializing Enums defined in pandapower

---------

Co-authored-by: SRDM <42580302+SimonRubenDrauz@users.noreply.github.com>

* upgrade of all fixed versions (e2nIEE#3062)

* upgrade of all versions, but opendss killed the pipeline see dss-extensions/OpenDSSDirect.py#148

* excluded an incompatible scipy version.

* added support for python 3.10 of sphinx.

* fixed version for networkx

* some more version fixes.

* fixed some typing issues.

* fixed a bug in this timeseries notebook.

* bump version.

* updated the Logo paths and e2n Link in accordance with PR e2nIEE#15 on pandapower-homepage (e2nIEE#3066)

* feat(opendss): import series Reactor elements as branches (e2nIEE#3067)

Found while test-importing more real feeder libraries (EPRI's Ckt5/Ckt7)
for validation beyond the original PR's four families: EPRI models the
substation's Thevenin-equivalent source impedance as a bus-to-bus Reactor
(SourceBus -> feeder head), not a Transformer, a topology from_opendss
did not yet cover.

_add_reactors treats a series (two-bus) Reactor as a fixed-impedance line
(R/X from dss.Reactors.R()/X(), rated at CktElement.NormalAmps()). A shunt
reactor (single bus, to ground) is a different element and is skipped
with a warning rather than misread as a second branch.

4 new regression tests on an inline synthetic feeder.

* fix(opendss): restore OpenDSSDirect.py as a dev dependency (e2nIEE#3075)

* fix(opendss): restore OpenDSSDirect.py as a dev dependency

It was dropped from the all/dev extras in e2nIEE#3062 because installing it
alongside pytest~=9.1 crashes the pytest process on Windows (upstream
bug: dss-extensions/OpenDSSDirect.py#148). That left the OpenDSS
converter with 0% coverage in CI, since opendssdirect was never
installed to begin with.

The crash is Windows-specific: it reproduces with pytest==9.1.1 +
OpenDSSDirect.py==0.9.4 on Windows but not on Linux, where this
repo's PR-gating CI actually runs. Restore the dependency and skip
test_from_opendss.py on win32 before it ever imports opendssdirect,
instead of avoiding the dependency for every platform.

* fix(opendss): disable faulthandler around the opendssdirect import

Replaces the Windows platform-skip with an actual fix. Traced the
crash on a real windows-latest GitHub Actions runner (Houmgaor#diag-
opendss-windows-crash): dss_python_backend's Free Pascal runtime
raises an internal first-chance SEH exception during its own module
init that it normally handles and silences itself. pytest enables
Python's faulthandler by default, which installs a Windows vectored
exception handler that intercepts that first-chance exception before
Pascal's own handler gets it, and reports it as a fatal crash. A
plain `python -c "import opendssdirect"` never enables faulthandler,
so it never sees this -- matching the upstream report exactly.

Bracketing just the import with faulthandler.disable()/.enable()
eliminates the false crash entirely (verified: clean pytest pass, no
exception message) while leaving faulthandler protecting the rest of
the run (verified: a real segfault after the import is still caught
and reported).

See dss-extensions/OpenDSSDirect.py#148

* docs(changelog): update entry to describe the faulthandler fix

The CHANGELOG entry still described the old Windows platform-skip;
update it to match the actual fix.

* removed support for 3.10

* added fixes that exist on feature/v4.0.0 to simplify merging in the future (e2nIEE#3072)

* added skip for test that relies on newer version of pgm-io

* fixed mypy issues

* added typing and fixed docstring

* fixed redefinition of var type

* fixed incorrect use of skipif

* fixed use of object as fallback for geoseries when typechecking

* fixed typing in groups.py

* fixed occurences of create_empty_network

* removed duplicate ukpn tutorials

* fixed missing import in plotly_traces.ipynb

* fixed opf test failing

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>
Signed-off-by: Yoshiki <yosinn1@gmail.com>
Co-authored-by: Jan Wiemer <32835953+jwiemer112@users.noreply.github.com>
Co-authored-by: mrifraunhofer <94368111+mrifraunhofer@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>
Co-authored-by: Bryn Pickering <17178478+brynpickering@users.noreply.github.com>
Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>
Co-authored-by: Arisaka97 <solitaire2312@gmail.com>
Co-authored-by: pawellytaev <86314586+pawellytaev@users.noreply.github.com>
Co-authored-by: mrichter <mario.richter@iee.fraunhofer.de>
Co-authored-by: Moritz <29129441+MoritzHauff@users.noreply.github.com>
Co-authored-by: Jeremias Lang <158100420+jerelang@users.noreply.github.com>
Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: Engr. Ahmad Furqan <ahmadfurqanc@gmail.com>
Co-authored-by: nis-nurr <rijad.nuridini@nis.ch>
Co-authored-by: marcopau <77792704+marcopau@users.noreply.github.com>
Co-authored-by: envelio-js <johannes.sorg@envelio.de>
Co-authored-by: Christian Bredtmann <christian.bredtmann@envelio.de>
Co-authored-by: pawellytaev <pawel.lytaev@uni-kassel.de>
Co-authored-by: envelio-cb <88880102+envelio-cb@users.noreply.github.com>
Co-authored-by: Reinhold Bertram <reinhold.bertram@envelio.de>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: IEECNB215543\gbanerjee <gourab.banerjee@iee.fraunhofer.de>
Co-authored-by: yosinn1-blip <yosinn1@gmail.com>
Co-authored-by: Frank Marten <79512075+fmarten99@users.noreply.github.com>
Co-authored-by: Šime Pavlić <pavlicsime1994@gmail.com>
Co-authored-by: Šime Pavlić <simepavlic@Simes-MacBook-Pro.local>
Co-authored-by: Roman Bolgaryn <roman.bolgaryn@iee.fraunhofer.de>
Co-authored-by: stardeltapower <65967874+stardeltapower@users.noreply.github.com>
Co-authored-by: Ehsanpoly <90526732+Ehsanpoly@users.noreply.github.com>
Co-authored-by: Houmgaor <35099109+Houmgaor@users.noreply.github.com>
Co-authored-by: Heiner <heiner.frueh@gmx.de>
Co-authored-by: Heiner Früh <heiner.frueh@stuttgart-netze.de>
Co-authored-by: Heiner <heiner.frueh@ieh.uni-stuttgart.de>
Co-authored-by: Nemanja Stankić <36014264+belobradi@users.noreply.github.com>
Co-authored-by: Pascal Ehlert <pascal@ehlert-it.de>
Co-authored-by: Daniel Lohmeier <31214121+dlohmeier@users.noreply.github.com>
Co-authored-by: Joschka Thurner <joschka.thurner@retoflow.de>
Co-authored-by: SRDM <42580302+SimonRubenDrauz@users.noreply.github.com>
KS-HTK added a commit that referenced this pull request Aug 10, 2026
* updated docstings (#2934)

deprecated unused keyword args

* Feature/get all elements (#2939)

* adding first draft of simple_hl_plot a function to easily highlight buses and lines paired with a hover functionality

* added function to get a dataframe of all elements in the net

* add test
clean comments
renaming

* add changelog entry

* ltds_fix (#2938)

* updated ltds notebooks

* updated ltds notebooks, fixed LTDS converter

* added pytest split to tutorial_test pipeline (#2935)

* added pytest split to tutorial_test pipeline

* added notebook test times

* fixed many links (#2937)

other formatting



* Fix copyright text formatting in LICENSE file (#2914)

* Fix copyright text formatting in LICENSE file

* Refactor copyright notice in LICENSE

Updated copyright notice formatting in LICENSE file following [upstream changes](licensee/licensee#950) to handle multi-line attribution.

---------



* added PowerElectronicsConnection to the LTDS converter, updated LTDS notebooks (PowerElectronicsConnection) (#2942)



* ltds_pce (#2944)

* added PowerElectronicsConnection to the LTDS converter, updated LTDS notebooks (PowerElectronicsConnection)

* updated LTDS notebooks for mapping Excel data

* ltds_notebook (#2949)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* ltds_notebook (#2950)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* Feature check vkr percent (#2948)

* added check to check if vkr_percent values are reasonable.

* added changelog entry.

---------



* Feature additional diagnostic functions (#2952)

* added more diagnostic functions.

* added changelog entry.

* fixed a small bug, used the wrong value in the reactance field.

* Correct loading_percent description in motor_par.csv (#2947)

Updated the description of loading_percent.

* ucte2pp conversion fixes (#2823)

* consider empty R dataframe in ucte conversion

* convert impedances and trafos with G/B=NaN to G/B=0

* change fillna for trafos and impedances to the ucte_parser

* fillna df if 0

* fix nan values in impedances and trafos

* ucte2pp: averaging voltages and clean up parser

* changelog entries for ucte2pp fixes

* average voltage setpoints using topological search instead of ucte name

* empty space at EOF

* fix codacy issue

* remove create_switch from pp_import_functions

* fix create_vsc functions

* change symmetrical tap changer to 90 degree tap step degree

* correct handling of symmetrical PSTs in ucte2pp

* comment averaging function based on PR review

* changes ucte converter

* ucte2pp: add flag for voltage harmonization, with default false

* fix test

* fix tests and restrict tolerances a bit

---------




* Fix 2733 (#2951)

* change patch sizes for plot (#2733)

* fix patch sizes for plot only once (#2733)

`get_collection_sizes()` takes arguments to adjust the relative size of
an element.

---------



* Fix runopp(init="results") so the OPF solver preserves the model initial vector (#2902)

* Fix runopp(init=results) warm-start handling in pips OPF

* Update CHANGELOG for upcoming release fixes and features

---------




* Feature/highlight plot (#2833)

* integrated highlighting feature into simple_plot

* integrated hover feature into simple_plot

* update plotting tutorial

* adjust color

* Fix unit g0_us (#2958)

attribute name g0_us_per_km is incorrectly named as g0_nf_per_km in add_zero_impedance_parameters function.

* updated branding with versions from marketing (#2953)

* [IMPROVEMENT] fix `bool` parameters input in `read_excel` and add `add_basic_std_types` parameter (#2961)

* Add basic std types flag to from_excel



* Fix reading bool



* Fix backward compatibility



* Silence sonarcloud and codacy



* Remove ruff ignore

---------



* added permissions block to all workflows (#2964)

* updated the issue templates to use the issue types instead of labels and title (#2966)

minor changes in forms layouts

* Feature/revised issue templates (#2967)

* updated the issue templates to use the issue types instead of labels and title
minor changes in forms layouts

* fix for config not parsing by github (hopefully)
added documentation template
added emoji to template title for more visual guidance

* uniform formatting for templates

* added missing blank line at end of file

* display logger message only if GetActiveScenario() isn't None (#2969)

Only display a logger message if GetActiveScenario is not None
Added else case with a info message if no study case / scenario is active.

* Update docstring (#2970)



* ltds_notebook (#2972)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* Update lightsim2grid version (#2976)



* fix cmin for low voltage 10% tolerance (#2913)

* fix(cmin): fix cmin for low voltage 10% tolerance

* [Fix] Fix `reindex_buses` against creating duplicate indecies (#2963)

* Fix reindex_buses



* Add allow_duplicate_index argument



* Fix unused import



* Fix test



---------



* feature/doc strings update (#2979)

* added/reformatted many docstrings

* added show_plot=False to test_plotting_toolbox

* refactored docstrings and added types

* fixed f-string in groups.py

* fixed incorrect type

* fixed incorrect type

* fixed missing import

* fixed import issue with specific lightsim2grid versions

* fixed mypy issues in contingency
refactored test in test_contingency

* fixed mypy issues

* updated var name

* updated the contributing.rst (#2973)

* updated the contributing.rst

* removed raw directive

* changed contributing to markdown for better github compatibility
replaced contributing on readTheDocs by link to GitHub

* Added a section on changelog to the contributing.md
Added a changelog entry to the changelog

* Update CHANGELOG.rst

* [Feature]: Toggle Colormap for simple_plot (#2971)

* colormap-integration in simple_plot

* adjust colors
*add docstrings
*add second button to better visualize options for the user

* change ext_grid color

* some formatting

* only plot colormap if buses or lines are available (fix tutorial-test error)

* removed some spaces
removed some whitelines
added results to hover info

* add changelog entry

* adepted authors

* adapted zorder
make plotting bus-switches optional

* typo

* small adaptions

* small adjustments

---------



* ltds_notebook (#2980)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* update LTDS Jupiter Notebook respecting new Excel format

---------



* Fix diagnostic report (#2983)



* Tutorials for UKPN (#2984)

* Fix tutorial on power flow

* Updated Jupyter notebooks for UKPN

* Fix on tutorial directory

* [Fix] `DiscreteTapControl` to work with negative `tap_step_percent` (#2990)

* abs tap_step_percent



* Add changelog, test case



* Remove code duplication



---------



* updated the notebook to ignore warnings instead of capturing all output and only displaying specifics. (#2996)

* voltage dependend loads create differing results (#2991)

* fixed issue with voltage dependent loads.

* fixed typo in import

* removed unused imports

* Fixed test now failing due to nan instead of 0 for in_service=False

* Fixed juliacall version leading to errror in pandamodels-storage.ipynb (#3011)

* fix failing runpp(net, consider_line_temperature=True)  (#3004)

* fix failing runpp(net, consider_line_temperature=True) for grids with a mix of lines with alpha and without
added warning

* adapt test

* some structuring

* import default ALPHA

* rename ALPHA to ALPHA_TDPF due to duplicate (branch cols)

* fix NameError

* Fix: Apply transformer correction factor K_T only for max case (IEC 60909-0:2016)  (#2962)

* Fixing usage of transformer impedance correction factor in min case of short-circuit calculations,
Adapting tests

* take case from net._options for trafo k_t fix (calculation only for max case)

* case was missing.

* fixed a broken test.

* fix test_all_currents.py

* min and max test case for test_trafo_impedace fixed

* Fix SyntaxError: invalid escape sequences in test_group.py (Python 3.14)

Use raw strings (r"...") for all regex match patterns containing escape
sequences like \(, \[, and \. which are SyntaxError in Python 3.14.



---------










* docs: fix separated spelling in docs (#3008)




* Adaptions to PowerFactory2pp Converter (#3005)

Changes in PowerFactory2pp converter

* Fixed test now failing due to nan instead of 0 for in_service=False

* get coords from (sub)stations
unpack only 2 coordinates, third one is 0
return None,None is no ext_grid can be created

* replace tuple with list to consolidate the code and fit the GeoJson standard

* tuple list ..

* cim2pp: mapping SV data to the assets with flag use_sv_data_for_assets=True (#3024)

* cim2pp: mapping SV data to the assets with flag use_sv_data_for_assets=True

* add GeographicalRegion from eqbd profile (#3025)

* add GeographicalRegion from eqbd profile

* add GeographicalRegion to cim_classes

* Check if static generator has connected bus before importing it from powerfactory (#2975)

* When importing static generators from powerfactory, first check if they are connected to a bus. If not, do not import them (previously, this was not checked for static gens that are reference machines, which led to import errors)

* Update to changelog

* simplified check for av_mode constq

---------




* fix warning in LTDS yupiter notebook (#3033)

* Speed up CGMES import (parser + trafo tap characteristic table) (#3020)

* Speed up CGMES trafo tap characteristic table build

Replace the per-group itertuples loop in _create_trafo_characteristic_table
with vectorized factorize and column-wise DataFrame construction. Output is
unchanged; convert time drops significantly on large CGMES networks.

* Speed up CGMES XML parsing with single-pass tag grouping
Group profile children by tag in one pass instead of calling findall per
element type, and streamline _parse_element attribute handling. Parsed CIM
tables and converted networks are unchanged on large CGMES test cases.

---------





* update scipy-stubs in toml (#3038)

* limited scipy-stubs to <1.18 for python<3.12 support

* Fixed SQL Injection possiblilities and some assertion in code (#3035)

* fixed sql injection possibility

* removed assertion from code

* update from_jao.py

* Update run_import.py

* Update sql_io.py

* fixed issue in from_jao

* fixed duplicate definition of test_dir/test_path
fixed sqlite table query

* fixed issues with psycopg version 3 being installed but version 2 being used.

* simplified pipeline to use env vars to pass args to test_sql_io

* fixed upload_sql_table
added changelog entries

* fixed sql using param for table or column names

* improved use of psql.Identifier

* improved use of psql.Identifier

* fixed import error when type checking
fixed issue with to_sql_str

* fixed missing comma in pyproject.toml

* improved SQL Query construction

* fixed issue with DEFAULT in query as Literal and not SQL Directive

* fixed issue with None being passed as str

* import fail will no longer result in successful pipeline as postgresql not available will fail now.

* fixed type being handled as string instead of sql directive

* fixed missing dsn and schema for availability test

* fixed issue where .as_string was called on a string

* fixed issue where to_sql_str was used for int values

* Issues/fixing critical codacy (#3040)

* fixed cp1 eur passed in kw instead of mw

* fixed typo in bug-report template

* removed unreachable return

* fixed typo in create_buses_dc

* Feature/integrate helm solver (#2067)

* added a new powerflow method, HELM. Provided by HELMpy package.

* added some tests for the new powerflow method.

* added a new powerflow method, HELM. Provided by HELMpy package.

* updated doc string.

* added a new powerflow method, HELM. Provided by HELMpy package.

* added a new powerflow method, HELM. Provided by HELMpy package.

* changed the standard iterations for helm, since helmpy crashes after 40 iterations with an index error.

* made some modifications to adapt the values to what helmpy awaits.

* added MBASE, since pandapower sometimes doesn't set this value.

* added the 9case testcase.

* fixed the helm integration into pandapower, the shunts needed to be scaled differently, the slack angle was ignored and the result extraction wasn't correct.

* updated the integration to use pv_bus_model=2 since it is the default.

* typing fixes.

* added some doc about helm.

* added more typing exclusion for mypy.

* added install git, since sphinx needs it to pull packages.

* added helm to algorithm literal and moved the import to the test.

* update of pipeline.

* added missing empty line

* updated docs and removed uv from pipeline.

* added install git.

* Update github_test_action.yml

updated docs pipeline to only install docs requirements

* added vscode workspace to gitignore.

* made some minor fixes to spelling and copyright headers.

* minor fixes for codacy.

---------





* Fixed issues in diagnostic functions + more tests (#3052)

* parametrized the diagnostic test.
added more diag functions to the no issues test.

* fixed diagnostic_functions and added tests.

* fixed continuous bus indices being tested incorrectly.
closes #3042

* Hardening from_json (#3050)

* first version to fix #3049

* fix for broken de-/serialization of (Log)SplineCharateristic.

* hardening from_json deserialiser.

* changed parameter to skip_checks.

* missed one refactor.

* fix for LSC, overwrote the setted values...

* needed to allow more modules.

* added more fixes needed for older networks, and added _eq_ method, since otherwise comparisons between SC / LSC fail.

* added an _eq_ and _hash_ function to SC and LSC

* had to fix LSC again, since it created the log10 of the values, which were already log10(x)

* had to add _eq_ and _hash_ to fuse and ocrelay otherwise they would not have worked as well.

* Fix 3ph loadflow with `gen` element (#3010)

* Fix gen 3ph result table



* Fix gen build



* Remove change to diagnostic



* Remove change to diagnostic



* Enhance ImportError logging in run_pandamodels.py

Improve error handling for ImportError in _call_pandamodels function.

* Simplify ImportError handling for juliacall

---------




* Neutral earthing impedance (rn_ohm) and zigzag earthing transformers in the zero-sequence short circuit (#3016)

* [ADDED] neutral earthing impedance (rn_ohm) and zigzag earthing transformers in zero-sequence short circuit

- add rn_ohm (resistive neutral earthing) to create_transformer /
  create_transformer_from_parameters and the bulk variants; apply the neutral
  earthing impedance 3*(rn_ohm + j*xn_ohm) to the zero-sequence impedance of all
  earthed-star vector groups, after the IEC transformer correction factor.
  Previously xn_ohm was only considered for power-station-unit transformers, and
  only as a reactance, so a neutral earthing resistor (NER/NGR) could not be
  modelled for ordinary earthed transformers.
- add zigzag earthing transformer vector groups ZNyn / ZNd / ZNy / ZN. Per the
  YNzn zero-sequence model the zigzag winding completely decouples the primary
  and secondary zero sequences and presents a shunt-to-ground: the HV-winding
  leakage portion (si0_hv_partial) in series with 3*Z_N at the star point. An
  earthed-wye secondary (ZNyn) gets its own decoupled zero-sequence path to
  ground (LV leakage portion + zero-sequence magnetising); a delta / unearthed
  secondary (ZNd / ZNy) has none.
- add unit tests in test_1ph: neutral earthing adds exactly 3*Z_N to the zero
  sequence; zigzag earthing of a delta-fed system, with the NER limiting it and
  the primary/secondary decoupling.
- update changelog.

Enables IEC 60909 single-phase earth-fault studies on delta-fed systems earthed
through a neutral earthing resistor and/or a zigzag earthing transformer.



* fixed naming convention issues.

---------




* add init_pq option for PandaModels opf warm starts (#2985)

* add init_pq option for PandaModels opf warm starts

* add changelog, fix float assertion

* New parameter wasn't handed over properly. Also logic in add_pm_gen_start_values_from_results seemed buggy. Return values which were nowehere used and empty return statements.

* Handed **kwargs to opf options / to _runpm

---------




* Fix generalized OPF cost Hessian evaluation (#3055)

* Fix generalized OPF cost Hessian evaluation

* cleaning the comments

* Move OPF cost function regression test into coverage suite

* Add changelog entry for OPF cost function fix

* Cover OPF generalized cost with empty Hessian

* Resolve changelog conflict

* Resolve changelog conflict

* Resolve changelog conflict

---------



* Add an OpenDSS → pandapower converter (from_opendss) (#3056)

* Add OpenDSS -> pandapower converter (from_opendss)

Balanced positive-sequence importer that reads an OpenDSS feeder through
OpenDSSDirect.py and maps buses, lines (LineCode carried through as
std_type), two-winding and center-tapped split-phase service transformers
(imported at their solved tap), loads, shunt capacitors, switches and the
source. The returned net carries an opendss_import report with element
counts, per-bus phase counts, the OpenDSS-solved voltages and the
approximations made.

Positive-sequence is exact for symmetric (e.g. European 3-phase 4-wire)
feeders and a documented approximation for unsymmetrical North-American
topology, which runpp_3ph cannot represent (#873). Adds an "opendss"
optional-dependency extra, unit tests (inline circuits), docs and a
changelog entry.

Revisits #1442.

* Add the opendss extra to the "all" dependency group

Per maintainer feedback on #3043: a new production dependency group should
be included in "all". Drops the now-redundant explicit opendss entry from
"dev" (it inherits from "all").

* Address Codacy and SonarCloud static-analysis findings

- __init__.py: replace the wildcard re-export with an explicit
  `from ... import from_opendss` plus __all__ (pyflakes F401/F403), and
  add the package docstring (pydocstyle D104).
- from_dss.py: convert the docstrings to the numpy section style expected
  by pydocstyle (D213/D203/D406/D407/D413/D417).
- from_dss.py: avoid a floating-point equality check when detecting a
  missing voltage base (Sonar S1244), use dict() instead of a dict
  comprehension (S7500), and reword a comment that read like code (S125).

No behaviour change; the 9 converter tests still pass.

* Avoid pydocstyle D211/D212 vs D203/D213 conflict in the converter

The repository's static-analysis config enables both members of the
mutually-exclusive pydocstyle pairs (blank-line-before-class-docstring and
multi-line-summary-placement), so a multi-line module docstring or a class
docstring cannot satisfy it. Use a one-line module docstring with the
rationale moved to comments, and drop the docstring on the private
_ImportReport dataclass (a private class needs none). No behaviour change.

* fixed comment issues, which failed sphinx build.

---------



* More plotly results annotations (#2375)

* add more hoverinfo to plot

* overwrite pandapower version to make tests work

* fix wrong filepaths in test_file_io

* change back to original _version.py

* fixed unit issue and added typing.

* reverted changes to test_file_io.py

---------





* fix(converter): Kron-reduce explicit-neutral OpenDSS LineCodes in from_opendss (#3058)

* fix(converter): Kron-reduce explicit-neutral OpenDSS LineCodes

from_opendss silently mis-computed positive-sequence resistance for
3-phase-plus-neutral matrix LineCodes (the standard 4-wire European LV
format): Lines.R1()/X1()/C1() do not Kron-reduce the neutral out of a
>3-conductor matrix before forming the sequence value, so the imported
line carried neither the declared conductor's impedance nor a value
derivable from it.

Found while validating the converter against a real, independently
sourced Portuguese LV network (Koirala et al., "Non-Synthetic European
Low Voltage Test System", 2020) -- a genuine 4-wire matrix LineCode
corpus outside the 3-conductor feeders the converter had been exercised
against so far.

Adds `_kron_positive_sequence`, used only for >3-conductor lines; the
common <=3-conductor path is untouched. Two regression fixtures cover
zero-mutual (the real-world pattern found) and asymmetric neutral
coupling (proves an actual reduction happens, not a pass-through).

* fix: R1/X1/C1 are stale for any matrix-defined line, not just >3-cond

The Kron-reduction fix only guarded lines with more than 3 conductors,
diagnosed from the first reproduction (an explicit-neutral European
LineCode). Checking OpenDSS's own Pascal source shows the real trigger
is broader: TLineObj/TLineCodeObj hard-code R1 := 0.0580, X1 := 0.1206
at construction, and switching to a matrix definition (rmatrix=/
xmatrix=) sets SymComponentsModel := FALSE but never clears or
recomputes those fields. OpenDSS's own text property interface knows
this and reports them as '----' once matrix mode is active, but the
direct numeric getters this converter calls don't perform the same
guard -- so any matrix-defined line, not just 4-conductor ones,
silently gets the stale default. Confirmed empirically: a plain
3-conductor matrix LineCode with no neutral at all returned the same
0.058/0.1206 instead of its declared values.

Widens the fix to always derive R1/X1/C1 from the declared matrix
(Kron-eliminating conductors beyond the first 3 only when there are
more than 3) instead of trusting OpenDSS's getters at all -- verified
to exactly reproduce the declared value for symmetric-components-
defined lines too, so this is safe universally. Generalizes the
self/mutual averaging to the actual conductor count instead of
hard-coding 3, since the previous formula would have silently
mis-handled 1- and 2-conductor matrix lines (a common SMART-DS/
IEEE-test-feeder pattern for single-phase laterals) had it ever been
reached. Adds two more regression tests for those cases.

* [FEATURE] Simple Redispatch solver using pandamodels.jl (#3059)

* added a redispatch solver via pandamodels.jl

* fixed changelog.

* updated pandamodels.jl version.

* changed default to actual floats not ints.

* fixed tests, since comparison failed due to nan values.

* pp.create.create_transformers value initialization not working (#2894)

* pp.create.create_transformers value initialization not working (#2886)
* create_transformers now forwards tap and optional std-type params.
* updated tests verifying these fields.

* pp.create.create_transformers value initialization not working (#2886)
* Remove unnecessary shift_degree extraction.
* Remove redundant tap_changer_type value check.
* Pass std_params directly to params dict instead of extracting individually.
* test_create should use tolist() instead of "value".
* npt.NDArray should use "integer" as a numpy.

* pp.create.create_transformers value initialization not working (#2886)
* Remove redundant tap_changer_type value check reverted.
* UT added for std_type override when create_transformers is used.

* pp.create.create_transformers value initialization not working (#2886)
* fix: prevent duplicate kwargs when using standard types
* refactor: undo unrelated test changes

* fixed return type and fixed potential None error.

* fixed test test_create_transformers_for_single_override_std_type.

---------




* Add compute_switch_flows() for zero-impedance bus-bus switches (#2956)

After runpp(), bus-bus switches with z_ohm=0 have NaN in res_switch
because Pandapower fuses their buses into a single internal node.
This makes it impossible to determine the power flow through
individual bus couplers, bus-section switches, or similar zero-
impedance switching devices.

This commit adds a new toolbox function compute_switch_flows(net)
that populates res_switch (p_from_mw, q_from_mvar, p_to_mw,
q_to_mvar, i_ka, loading_percent) for these switches using a
post-hoc nodal balance approach:

1. Identify fused-bus groups from _pd2ppc_lookups["bus"]
2. Calculate net local injection at each bus from res_* tables
   (loads, generators, shunts, wards, and outgoing branch flows)
3. Build the zero-impedance switch tree within each fused group
4. DFS from leaves to root to accumulate subtree demand and
   derive individual switch flows

The function raises ValueError if zero-impedance switches form a
cycle within a fused group, since the flow split is physically
indeterminate without impedance information.

Switches with z_ohm > 0 are not modified, as they already have
results from the Newton-Raphson solver.

Also adds documentation (toolbox.rst, switch.rst, CHANGELOG.rst)
and 17 tests covering single couplers, chains, branching trees,
cycle detection, sign convention, cross-validation, and loading
percent.



* Do not open networks from files with older format version than the installed pandapower version (#2912)

* do not open networks with newer format versions than the currently installed pandapower version

* usage of possibility to open newer networks in all file io-functions

# Conflicts:
#	pandapower/convert_format.py
#	pandapower/file_io.py

* small bug fix

* add test for new behavior (do not open newer networks)

* added changelog entry

* removed TODO, small correction in file_io.py

* fixed an error in file_io.py, prob due to a merge error on my part.

* fixed docstring.

---------




* bump version.

* fixed upload pipeline.

* bump version. Needed to remove direct dependency to helmpy, needs to be installed manually.

* fixed a misleading logger.warning message.

* bump version.

* [Fix] unsafe json load (#3061)

* block deserializing arbitrary objects from json

* remove dead code (geo data fallback)

* surface DeserializationNotAllowed exception

* allow deserializing Enums defined in pandapower

---------



* upgrade of all fixed versions (#3062)

* upgrade of all versions, but opendss killed the pipeline see dss-extensions/OpenDSSDirect.py#148

* excluded an incompatible scipy version.

* added support for python 3.10 of sphinx.

* fixed version for networkx

* some more version fixes.

* fixed some typing issues.

* fixed a bug in this timeseries notebook.

* bump version.

* updated the Logo paths and e2n Link in accordance with PR #15 on pandapower-homepage (#3066)

* feat(opendss): import series Reactor elements as branches (#3067)

Found while test-importing more real feeder libraries (EPRI's Ckt5/Ckt7)
for validation beyond the original PR's four families: EPRI models the
substation's Thevenin-equivalent source impedance as a bus-to-bus Reactor
(SourceBus -> feeder head), not a Transformer, a topology from_opendss
did not yet cover.

_add_reactors treats a series (two-bus) Reactor as a fixed-impedance line
(R/X from dss.Reactors.R()/X(), rated at CktElement.NormalAmps()). A shunt
reactor (single bus, to ground) is a different element and is skipped
with a warning rather than misread as a second branch.

4 new regression tests on an inline synthetic feeder.

* fix(opendss): restore OpenDSSDirect.py as a dev dependency (#3075)

* fix(opendss): restore OpenDSSDirect.py as a dev dependency

It was dropped from the all/dev extras in #3062 because installing it
alongside pytest~=9.1 crashes the pytest process on Windows (upstream
bug: dss-extensions/OpenDSSDirect.py#148). That left the OpenDSS
converter with 0% coverage in CI, since opendssdirect was never
installed to begin with.

The crash is Windows-specific: it reproduces with pytest==9.1.1 +
OpenDSSDirect.py==0.9.4 on Windows but not on Linux, where this
repo's PR-gating CI actually runs. Restore the dependency and skip
test_from_opendss.py on win32 before it ever imports opendssdirect,
instead of avoiding the dependency for every platform.

* fix(opendss): disable faulthandler around the opendssdirect import

Replaces the Windows platform-skip with an actual fix. Traced the
crash on a real windows-latest GitHub Actions runner (Houmgaor#diag-
opendss-windows-crash): dss_python_backend's Free Pascal runtime
raises an internal first-chance SEH exception during its own module
init that it normally handles and silences itself. pytest enables
Python's faulthandler by default, which installs a Windows vectored
exception handler that intercepts that first-chance exception before
Pascal's own handler gets it, and reports it as a fatal crash. A
plain `python -c "import opendssdirect"` never enables faulthandler,
so it never sees this -- matching the upstream report exactly.

Bracketing just the import with faulthandler.disable()/.enable()
eliminates the false crash entirely (verified: clean pytest pass, no
exception message) while leaving faulthandler protecting the rest of
the run (verified: a real segfault after the import is still caught
and reported).

See dss-extensions/OpenDSSDirect.py#148

* docs(changelog): update entry to describe the faulthandler fix

The CHANGELOG entry still described the old Windows platform-skip;
update it to match the actual fix.

* removed support for 3.10

* added fixes that exist on feature/v4.0.0 to simplify merging in the future (#3072)

* added skip for test that relies on newer version of pgm-io

* fixed mypy issues

* added typing and fixed docstring

* fixed redefinition of var type

* fixed incorrect use of skipif

* fixed use of object as fallback for geoseries when typechecking

* fixed typing in groups.py

* fixed occurences of create_empty_network

* removed duplicate ukpn tutorials

* fixed missing import in plotly_traces.ipynb

* fixed opf test failing

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>
Signed-off-by: Yoshiki <yosinn1@gmail.com>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: Jan Wiemer <32835953+jwiemer112@users.noreply.github.com>
Co-authored-by: mrifraunhofer <94368111+mrifraunhofer@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>
Co-authored-by: Bryn Pickering <17178478+brynpickering@users.noreply.github.com>
Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>
Co-authored-by: Arisaka97 <solitaire2312@gmail.com>
Co-authored-by: pawellytaev <86314586+pawellytaev@users.noreply.github.com>
Co-authored-by: mrichter <mario.richter@iee.fraunhofer.de>
Co-authored-by: Moritz <29129441+MoritzHauff@users.noreply.github.com>
Co-authored-by: Jeremias Lang <158100420+jerelang@users.noreply.github.com>
Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: Engr. Ahmad Furqan <ahmadfurqanc@gmail.com>
Co-authored-by: nis-nurr <rijad.nuridini@nis.ch>
Co-authored-by: marcopau <77792704+marcopau@users.noreply.github.com>
Co-authored-by: envelio-js <johannes.sorg@envelio.de>
Co-authored-by: Christian Bredtmann <christian.bredtmann@envelio.de>
Co-authored-by: pawellytaev <pawel.lytaev@uni-kassel.de>
Co-authored-by: envelio-cb <88880102+envelio-cb@users.noreply.github.com>
Co-authored-by: Reinhold Bertram <reinhold.bertram@envelio.de>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: IEECNB215543\gbanerjee <gourab.banerjee@iee.fraunhofer.de>
Co-authored-by: yosinn1-blip <yosinn1@gmail.com>
Co-authored-by: Frank Marten <79512075+fmarten99@users.noreply.github.com>
Co-authored-by: Šime Pavlić <pavlicsime1994@gmail.com>
Co-authored-by: Šime Pavlić <simepavlic@Simes-MacBook-Pro.local>
Co-authored-by: Roman Bolgaryn <roman.bolgaryn@iee.fraunhofer.de>
Co-authored-by: stardeltapower <65967874+stardeltapower@users.noreply.github.com>
Co-authored-by: Houmgaor <35099109+Houmgaor@users.noreply.github.com>
Co-authored-by: Heiner <heiner.frueh@gmx.de>
Co-authored-by: Heiner Früh <heiner.frueh@stuttgart-netze.de>
Co-authored-by: Heiner <heiner.frueh@ieh.uni-stuttgart.de>
Co-authored-by: Nemanja Stankić <36014264+belobradi@users.noreply.github.com>
Co-authored-by: Pascal Ehlert <pascal@ehlert-it.de>
Co-authored-by: Daniel Lohmeier <31214121+dlohmeier@users.noreply.github.com>
Co-authored-by: Joschka Thurner <joschka.thurner@retoflow.de>
Co-authored-by: SRDM <42580302+SimonRubenDrauz@users.noreply.github.com>
KS-HTK added a commit that referenced this pull request Aug 21, 2026
* updated docstings (#2934)

deprecated unused keyword args

* Feature/get all elements (#2939)

* Hallo

* Hallo Leute

* adding first draft of simple_hl_plot a function to easily highlight buses and lines paired with a hover functionality

* added function to get a dataframe of all elements in the net

* add test
clean comments
renaming

* add test

* add docu

* add changelog entry

* ltds_fix (#2938)

* updated ltds notebooks

* updated ltds notebooks, fixed LTDS converter

* added pytest split to tutorial_test pipeline (#2935)

* added pytest split to tutorial_test pipeline

* added notebook test times

* fixed many links (#2937)

other formatting

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix copyright text formatting in LICENSE file (#2914)

* Fix copyright text formatting in LICENSE file

* Refactor copyright notice in LICENSE

Updated copyright notice formatting in LICENSE file following [upstream changes](licensee/licensee#950) to handle multi-line attribution.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* added PowerElectronicsConnection to the LTDS converter, updated LTDS notebooks (PowerElectronicsConnection) (#2942)

Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>

* ltds_pce (#2944)

* added PowerElectronicsConnection to the LTDS converter, updated LTDS notebooks (PowerElectronicsConnection)

* updated LTDS notebooks for mapping Excel data

* ltds_notebook (#2949)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* ltds_notebook (#2950)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* Feature check vkr percent (#2948)

* added check to check if vkr_percent values are reasonable.

* added changelog entry.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Feature additional diagnostic functions (#2952)

* added more diagnostic functions.

* added changelog entry.

* fixed a small bug, used the wrong value in the reactance field.

* Correct loading_percent description in motor_par.csv (#2947)

Updated the description of loading_percent.

* ucte2pp conversion fixes (#2823)

* consider empty R dataframe in ucte conversion

* convert impedances and trafos with G/B=NaN to G/B=0

* change fillna for trafos and impedances to the ucte_parser

* fillna df if 0

* fix nan values in impedances and trafos

* ucte2pp: averaging voltages and clean up parser

* changelog entries for ucte2pp fixes

* average voltage setpoints using topological search instead of ucte name

* empty space at EOF

* fix codacy issue

* remove create_switch from pp_import_functions

* fix create_vsc functions

* changelog :)

* change symmetrical tap changer to 90 degree tap step degree

* correct handling of symmetrical PSTs in ucte2pp

* comment averaging function based on PR review

* changes ucte converter

* ucte2pp: add flag for voltage harmonization, with default false

* fix test

* fix tests and restrict tolerances a bit

---------

Co-authored-by: mrichter <mario.richter@iee.fraunhofer.de>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix 2733 (#2951)

* change patch sizes for plot (#2733)

* fix patch sizes for plot only once (#2733)

`get_collection_sizes()` takes arguments to adjust the relative size of
an element.

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Fix runopp(init="results") so the OPF solver preserves the model initial vector (#2902)

* Fix runopp(init=results) warm-start handling in pips OPF

* Update CHANGELOG for upcoming release fixes and features

---------

Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Feature/highlight plot (#2833)

* integrated highlighting feature into simple_plot

* integrated hover feature into simple_plot

* update plotting tutorial

* adjust color

* Fix unit g0_us (#2958)

attribute name g0_us_per_km is incorrectly named as g0_nf_per_km in add_zero_impedance_parameters function.

* updated branding with versions from marketing (#2953)

* [IMPROVEMENT] fix `bool` parameters input in `read_excel` and add `add_basic_std_types` parameter (#2961)

* Add basic std types flag to from_excel

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix reading bool

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix backward compatibility

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Silence sonarcloud and codacy

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove ruff ignore

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* added permissions block to all workflows (#2964)

* updated the issue templates to use the issue types instead of labels and title (#2966)

minor changes in forms layouts

* Feature/revised issue templates (#2967)

* updated the issue templates to use the issue types instead of labels and title
minor changes in forms layouts

* fix for config not parsing by github (hopefully)
added documentation template
added emoji to template title for more visual guidance

* uniform formatting for templates

* added missing blank line at end of file

* display logger message only if GetActiveScenario() isn't None (#2969)

Only display a logger message if GetActiveScenario is not None
Added else case with a info message if no study case / scenario is active.

* Update docstring (#2970)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* ltds_notebook (#2972)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* Update lightsim2grid version (#2976)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* fix cmin for low voltage 10% tolerance (#2913)

* fix(cmin): fix cmin for low voltage 10% tolerance

* [Fix] Fix `reindex_buses` against creating duplicate indecies (#2963)

* Fix reindex_buses

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Add allow_duplicate_index argument

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix unused import

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix test

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* feature/doc strings update (#2979)

* added/reformatted many docstrings

* added show_plot=False to test_plotting_toolbox

* refactored docstrings and added types

* fixed f-string in groups.py

* fixed incorrect type

* fixed incorrect type

* fixed missing import

* fixed import issue with specific lightsim2grid versions

* fixed mypy issues in contingency
refactored test in test_contingency

* fixed mypy issues

* updated var name

* updated the contributing.rst (#2973)

* updated the contributing.rst

* removed raw directive

* changed contributing to markdown for better github compatibility
replaced contributing on readTheDocs by link to GitHub

* Added a section on changelog to the contributing.md
Added a changelog entry to the changelog

* Update CHANGELOG.rst

* [Feature]: Toggle Colormap for simple_plot (#2971)

* colormap-integration in simple_plot

* adjust colors
*add docstrings
*add second button to better visualize options for the user

* change ext_grid color

* some formatting

* only plot colormap if buses or lines are available (fix tutorial-test error)

* removed some spaces
removed some whitelines
added results to hover info

* add changelog entry

* adepted authors

* adapted zorder
make plotting bus-switches optional

* typo

* small adaptions

* small adjustments

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* ltds_notebook (#2980)

* updated ltds notebooks

* updated LTDS notebooks for mapping Excel data

* updated LTDS notebooks for mapping Excel data

* UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* fix UKPN Jupiter Notebook

* update LTDS Jupiter Notebook respecting new Excel format

---------

Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>

* Fix diagnostic report (#2983)

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Tutorials for UKPN (#2984)

* Fix tutorial on power flow

* Updated Jupyter notebooks for UKPN

* Fix on tutorial directory

* [Fix] `DiscreteTapControl` to work with negative `tap_step_percent` (#2990)

* abs tap_step_percent

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Add changelog, test case

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove code duplication

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* updated the notebook to ignore warnings instead of capturing all output and only displaying specifics. (#2996)

* voltage dependend loads create differing results (#2991)

* fixed issue with voltage dependent loads.

* fixed typo in import

* removed unused imports

* Fixed test now failing due to nan instead of 0 for in_service=False

* Fixed juliacall version leading to errror in pandamodels-storage.ipynb (#3011)

* fix failing runpp(net, consider_line_temperature=True)  (#3004)

* fix failing runpp(net, consider_line_temperature=True) for grids with a mix of lines with alpha and without
added warning

* adapt test

* some structuring

* import default ALPHA

* rename ALPHA to ALPHA_TDPF due to duplicate (branch cols)

* fix NameError

* Fix: Apply transformer correction factor K_T only for max case (IEC 60909-0:2016)  (#2962)

* Fixing usage of transformer impedance correction factor in min case of short-circuit calculations,
Adapting tests

* take case from net._options for trafo k_t fix (calculation only for max case)

* case was missing.

* fixed a broken test.

* fix test_all_currents.py

* min and max test case for test_trafo_impedace fixed

* Fix SyntaxError: invalid escape sequences in test_group.py (Python 3.14)

Use raw strings (r"...") for all regex match patterns containing escape
sequences like \(, \[, and \. which are SyntaxError in Python 3.14.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Christian Bredtmann <christian.bredtmann@envelio.de>
Co-authored-by: pawellytaev <pawel.lytaev@uni-kassel.de>
Co-authored-by: envelio-cb <88880102+envelio-cb@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: Reinhold Bertram <reinhold.bertram@envelio.de>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: IEECNB215543\gbanerjee <gourab.banerjee@iee.fraunhofer.de>

* docs: fix separated spelling in docs (#3008)

Signed-off-by: Yoshiki <yosinn1@gmail.com>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Adaptions to PowerFactory2pp Converter (#3005)

Changes in PowerFactory2pp converter 

* Fixed test now failing due to nan instead of 0 for in_service=False

* get coords from (sub)stations
unpack only 2 coordinates, third one is 0
return None,None is no ext_grid can be created

* replace tuple with list to consolidate the code and fit the GeoJson standard

* tuple list ..

* cim2pp: mapping SV data to the assets with flag use_sv_data_for_assets=True (#3024)

* cim2pp: mapping SV data to the assets with flag use_sv_data_for_assets=True

* add GeographicalRegion from eqbd profile (#3025)

* add GeographicalRegion from eqbd profile

* add GeographicalRegion to cim_classes

* Check if static generator has connected bus before importing it from powerfactory (#2975)

* When importing static generators from powerfactory, first check if they are connected to a bus. If not, do not import them (previously, this was not checked for static gens that are reference machines, which led to import errors)

* Update to changelog

* simplified check for av_mode constq

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: pawellytaev <86314586+pawellytaev@users.noreply.github.com>

* fix warning in LTDS yupiter notebook (#3033)

* Speed up CGMES import (parser + trafo tap characteristic table) (#3020)

* Speed up CGMES trafo tap characteristic table build

Replace the per-group itertuples loop in _create_trafo_characteristic_table
with vectorized factorize and column-wise DataFrame construction. Output is
unchanged; convert time drops significantly on large CGMES networks.

* Speed up CGMES XML parsing with single-pass tag grouping
Group profile children by tag in one pass instead of calling findall per
element type, and streamline _parse_element attribute handling. Parsed CIM
tables and converted networks are unchanged on large CGMES test cases.

---------

Co-authored-by: Šime Pavlić <simepavlic@Simes-MacBook-Pro.local>
Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>
Co-authored-by: mrifraunhofer <94368111+mrifraunhofer@users.noreply.github.com>

* update scipy-stubs in toml (#3038)

* limited scipy-stubs to <1.18 for python<3.12 support

* Fixed SQL Injection possiblilities and some assertion in code (#3035)

* fixed sql injection possibility

* removed assertion from code

* update from_jao.py

* Update run_import.py

* Update sql_io.py

* fixed issue in from_jao

* fixed duplicate definition of test_dir/test_path
fixed sqlite table query

* fixed issues with psycopg version 3 being installed but version 2 being used.

* simplified pipeline to use env vars to pass args to test_sql_io

* fixed upload_sql_table
added changelog entries

* fixed sql using param for table or column names

* improved use of psql.Identifier

* improved use of psql.Identifier

* fixed import error when type checking
fixed issue with to_sql_str

* fixed missing comma in pyproject.toml

* improved SQL Query construction

* fixed issue with DEFAULT in query as Literal and not SQL Directive

* fixed issue with None being passed as str

* import fail will no longer result in successful pipeline as postgresql not available will fail now.

* fixed type being handled as string instead of sql directive

* fixed missing dsn and schema for availability test

* fixed issue where .as_string was called on a string

* fixed issue where to_sql_str was used for int values

* Issues/fixing critical codacy (#3040)

* fixed cp1 eur passed in kw instead of mw

* fixed typo in bug-report template

* removed unreachable return

* fixed typo in create_buses_dc

* Feature/integrate helm solver (#2067)

* added a new powerflow method, HELM. Provided by HELMpy package.

* added some tests for the new powerflow method.

* added a new powerflow method, HELM. Provided by HELMpy package.

* updated doc string.

* added a new powerflow method, HELM. Provided by HELMpy package.

* added a new powerflow method, HELM. Provided by HELMpy package.

* changed the standard iterations for helm, since helmpy crashes after 40 iterations with an index error.

* made some modifications to adapt the values to what helmpy awaits.

* added MBASE, since pandapower sometimes doesn't set this value.

* added the 9case testcase.

* fixed the helm integration into pandapower, the shunts needed to be scaled differently, the slack angle was ignored and the result extraction wasn't correct.

* updated the integration to use pv_bus_model=2 since it is the default.

* typing fixes.

* added some doc about helm.

* added more typing exclusion for mypy.

* added install git, since sphinx needs it to pull packages.

* added helm to algorithm literal and moved the import to the test.

* update of pipeline.

* added missing empty line

* updated docs and removed uv from pipeline.

* added install git.

* Update github_test_action.yml

updated docs pipeline to only install docs requirements

* added vscode workspace to gitignore.

* made some minor fixes to spelling and copyright headers.

* minor fixes for codacy.

---------

Co-authored-by: Jan Wiemer <32835953+jwiemer112@users.noreply.github.com>
Co-authored-by: Roman Bolgaryn <roman.bolgaryn@iee.fraunhofer.de>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* Fixed issues in diagnostic functions + more tests (#3052)

* parametrized the diagnostic test.
added more diag functions to the no issues test.

* fixed diagnostic_functions and added tests.

* fixed continuous bus indices being tested incorrectly.
closes #3042

* Hardening from_json (#3050)

* first version to fix #3049

* fix for broken de-/serialization of (Log)SplineCharateristic.

* hardening from_json deserialiser.

* changed parameter to skip_checks.

* missed one refactor.

* fix for LSC, overwrote the setted values...

* needed to allow more modules.

* added more fixes needed for older networks, and added _eq_ method, since otherwise comparisons between SC / LSC fail.

* added an _eq_ and _hash_ function to SC and LSC

* had to fix LSC again, since it created the log10 of the values, which were already log10(x)

* had to add _eq_ and _hash_ to fuse and ocrelay otherwise they would not have worked as well.

* Fix 3ph loadflow with `gen` element (#3010)

* Fix gen 3ph result table

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Fix gen build

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove change to diagnostic

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Remove change to diagnostic

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>

* Enhance ImportError logging in run_pandamodels.py

Improve error handling for ImportError in _call_pandamodels function.

* Simplify ImportError handling for juliacall

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Neutral earthing impedance (rn_ohm) and zigzag earthing transformers in the zero-sequence short circuit (#3016)

* [ADDED] neutral earthing impedance (rn_ohm) and zigzag earthing transformers in zero-sequence short circuit

- add rn_ohm (resistive neutral earthing) to create_transformer /
  create_transformer_from_parameters and the bulk variants; apply the neutral
  earthing impedance 3*(rn_ohm + j*xn_ohm) to the zero-sequence impedance of all
  earthed-star vector groups, after the IEC transformer correction factor.
  Previously xn_ohm was only considered for power-station-unit transformers, and
  only as a reactance, so a neutral earthing resistor (NER/NGR) could not be
  modelled for ordinary earthed transformers.
- add zigzag earthing transformer vector groups ZNyn / ZNd / ZNy / ZN. Per the
  YNzn zero-sequence model the zigzag winding completely decouples the primary
  and secondary zero sequences and presents a shunt-to-ground: the HV-winding
  leakage portion (si0_hv_partial) in series with 3*Z_N at the star point. An
  earthed-wye secondary (ZNyn) gets its own decoupled zero-sequence path to
  ground (LV leakage portion + zero-sequence magnetising); a delta / unearthed
  secondary (ZNd / ZNy) has none.
- add unit tests in test_1ph: neutral earthing adds exactly 3*Z_N to the zero
  sequence; zigzag earthing of a delta-fed system, with the NER limiting it and
  the primary/secondary decoupling.
- update changelog.

Enables IEC 60909 single-phase earth-fault studies on delta-fed systems earthed
through a neutral earthing resistor and/or a zigzag earthing transformer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fixed naming convention issues.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* add init_pq option for PandaModels opf warm starts (#2985)

* add init_pq option for PandaModels opf warm starts

* add changelog, fix float assertion

* New parameter wasn't handed over properly. Also logic in add_pm_gen_start_values_from_results seemed buggy. Return values which were nowehere used and empty return statements.

* Handed **kwargs to opf options / to _runpm

---------

Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* Fix generalized OPF cost Hessian evaluation (#3055)

* Fix generalized OPF cost Hessian evaluation

* cleaning the comments

* Move OPF cost function regression test into coverage suite

* Add changelog entry for OPF cost function fix

* Cover OPF generalized cost with empty Hessian

* Resolve changelog conflict

* Resolve changelog conflict

* Resolve changelog conflict

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Add an OpenDSS → pandapower converter (from_opendss) (#3056)

* Add OpenDSS -> pandapower converter (from_opendss)

Balanced positive-sequence importer that reads an OpenDSS feeder through
OpenDSSDirect.py and maps buses, lines (LineCode carried through as
std_type), two-winding and center-tapped split-phase service transformers
(imported at their solved tap), loads, shunt capacitors, switches and the
source. The returned net carries an opendss_import report with element
counts, per-bus phase counts, the OpenDSS-solved voltages and the
approximations made.

Positive-sequence is exact for symmetric (e.g. European 3-phase 4-wire)
feeders and a documented approximation for unsymmetrical North-American
topology, which runpp_3ph cannot represent (#873). Adds an "opendss"
optional-dependency extra, unit tests (inline circuits), docs and a
changelog entry.

Revisits #1442.

* Add the opendss extra to the "all" dependency group

Per maintainer feedback on #3043: a new production dependency group should
be included in "all". Drops the now-redundant explicit opendss entry from
"dev" (it inherits from "all").

* Address Codacy and SonarCloud static-analysis findings

- __init__.py: replace the wildcard re-export with an explicit
  `from ... import from_opendss` plus __all__ (pyflakes F401/F403), and
  add the package docstring (pydocstyle D104).
- from_dss.py: convert the docstrings to the numpy section style expected
  by pydocstyle (D213/D203/D406/D407/D413/D417).
- from_dss.py: avoid a floating-point equality check when detecting a
  missing voltage base (Sonar S1244), use dict() instead of a dict
  comprehension (S7500), and reword a comment that read like code (S125).

No behaviour change; the 9 converter tests still pass.

* Avoid pydocstyle D211/D212 vs D203/D213 conflict in the converter

The repository's static-analysis config enables both members of the
mutually-exclusive pydocstyle pairs (blank-line-before-class-docstring and
multi-line-summary-placement), so a multi-line module docstring or a class
docstring cannot satisfy it. Use a one-line module docstring with the
rationale moved to comments, and drop the docstring on the private
_ImportReport dataclass (a private class needs none). No behaviour change.

* fixed comment issues, which failed sphinx build.

---------

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* More plotly results annotations (#2375)

* add more hoverinfo to plot

* overwrite pandapower version to make tests work

* fix wrong filepaths in test_file_io

* change back to original _version.py

* fixed unit issue and added typing.

* reverted changes to test_file_io.py

---------

Co-authored-by: Heiner Früh <heiner.frueh@stuttgart-netze.de>
Co-authored-by: Heiner <heiner.frueh@ieh.uni-stuttgart.de>
Co-authored-by: Mike Vogt <mike.vogt@iee.fraunhofer.de>

* fix(converter): Kron-reduce explicit-neutral OpenDSS LineCodes in from_opendss (#3058)

* fix(converter): Kron-reduce explicit-neutral OpenDSS LineCodes

from_opendss silently mis-computed positive-sequence resistance for
3-phase-plus-neutral matrix LineCodes (the standard 4-wire European LV
format): Lines.R1()/X1()/C1() do not Kron-reduce the neutral out of a
>3-conductor matrix before forming the sequence value, so the imported
line carried neither the declared conductor's impedance nor a value
derivable from it.

Found while validating the converter against a real, independently
sourced Portuguese LV network (Koirala et al., "Non-Synthetic European
Low Voltage Test System", 2020) -- a genuine 4-wire matrix LineCode
corpus outside the 3-conductor feeders the converter had been exercised
against so far.

Adds `_kron_positive_sequence`, used only for >3-conductor lines; the
common <=3-conductor path is untouched. Two regression fixtures cover
zero-mutual (the real-world pattern found) and asymmetric neutral
coupling (proves an actual reduction happens, not a pass-through).

* fix: R1/X1/C1 are stale for any matrix-defined line, not just >3-cond

The Kron-reduction fix only guarded lines with more than 3 conductors,
diagnosed from the first reproduction (an explicit-neutral European
LineCode). Checking OpenDSS's own Pascal source shows the real trigger
is broader: TLineObj/TLineCodeObj hard-code R1 := 0.0580, X1 := 0.1206
at construction, and switching to a matrix definition (rmatrix=/
xmatrix=) sets SymComponentsModel := FALSE but never clears or
recomputes those fields. OpenDSS's own text property interface knows
this and reports them as '----' once matrix mode is active, but the
direct numeric getters this converter calls don't perform the same
guard -- so any matrix-defined line, not just 4-conductor ones,
silently gets the stale default. Confirmed empirically: a plain
3-conductor matrix LineCode with no neutral at all returned the same
0.058/0.1206 instead of its declared values.

Widens the fix to always derive R1/X1/C1 from the declared matrix
(Kron-eliminating conductors beyond the first 3 only when there are
more than 3) instead of trusting OpenDSS's getters at all -- verified
to exactly reproduce the declared value for symmetric-components-
defined lines too, so this is safe universally. Generalizes the
self/mutual averaging to the actual conductor count instead of
hard-coding 3, since the previous formula would have silently
mis-handled 1- and 2-conductor matrix lines (a common SMART-DS/
IEEE-test-feeder pattern for single-phase laterals) had it ever been
reached. Adds two more regression tests for those cases.

* [FEATURE] Simple Redispatch solver using pandamodels.jl (#3059)

* added a redispatch solver via pandamodels.jl

* fixed changelog.

* updated pandamodels.jl version.

* changed default to actual floats not ints.

* fixed tests, since comparison failed due to nan values.

* pp.create.create_transformers value initialization not working (#2894)

* pp.create.create_transformers value initialization not working (#2886)
* create_transformers now forwards tap and optional std-type params.
* updated tests verifying these fields.

* pp.create.create_transformers value initialization not working (#2886)
* Remove unnecessary shift_degree extraction.
* Remove redundant tap_changer_type value check.
* Pass std_params directly to params dict instead of extracting individually.
* test_create should use tolist() instead of "value".
* npt.NDArray should use "integer" as a numpy.

* pp.create.create_transformers value initialization not working (#2886)
* Remove redundant tap_changer_type value check reverted.
* UT added for std_type override when create_transformers is used.

* pp.create.create_transformers value initialization not working (#2886)
* fix: prevent duplicate kwargs when using standard types
* refactor: undo unrelated test changes

* fixed return type and fixed potential None error.

* fixed test test_create_transformers_for_single_override_std_type.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Add compute_switch_flows() for zero-impedance bus-bus switches (#2956)

After runpp(), bus-bus switches with z_ohm=0 have NaN in res_switch
because Pandapower fuses their buses into a single internal node.
This makes it impossible to determine the power flow through
individual bus couplers, bus-section switches, or similar zero-
impedance switching devices.

This commit adds a new toolbox function compute_switch_flows(net)
that populates res_switch (p_from_mw, q_from_mvar, p_to_mw,
q_to_mvar, i_ka, loading_percent) for these switches using a
post-hoc nodal balance approach:

1. Identify fused-bus groups from _pd2ppc_lookups["bus"]
2. Calculate net local injection at each bus from res_* tables
   (loads, generators, shunts, wards, and outgoing branch flows)
3. Build the zero-impedance switch tree within each fused group
4. DFS from leaves to root to accumulate subtree demand and
   derive individual switch flows

The function raises ValueError if zero-impedance switches form a
cycle within a fused group, since the flow split is physically
indeterminate without impedance information.

Switches with z_ohm > 0 are not modified, as they already have
results from the Newton-Raphson solver.

Also adds documentation (toolbox.rst, switch.rst, CHANGELOG.rst)
and 17 tests covering single couplers, chains, branching trees,
cycle detection, sign convention, cross-validation, and loading
percent.

Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* Do not open networks from files with older format version than the installed pandapower version (#2912)

* do not open networks with newer format versions than the currently installed pandapower version

* usage of possibility to open newer networks in all file io-functions

# Conflicts:
#	pandapower/convert_format.py
#	pandapower/file_io.py

* small bug fix

* add test for new behavior (do not open newer networks)

* added changelog entry

* removed TODO, small correction in file_io.py

* fixed an error in file_io.py, prob due to a merge error on my part.

* fixed docstring.

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* bump version.

* fixed upload pipeline.

* bump version. Needed to remove direct dependency to helmpy, needs to be installed manually.

* fixed a misleading logger.warning message.

* bump version.

* [Fix] unsafe json load (#3061)

* block deserializing arbitrary objects from json

* remove dead code (geo data fallback)

* surface DeserializationNotAllowed exception

* allow deserializing Enums defined in pandapower

---------

Co-authored-by: SRDM <42580302+SimonRubenDrauz@users.noreply.github.com>

* upgrade of all fixed versions (#3062)

* upgrade of all versions, but opendss killed the pipeline see dss-extensions/OpenDSSDirect.py#148

* excluded an incompatible scipy version.

* added support for python 3.10 of sphinx.

* fixed version for networkx

* some more version fixes.

* fixed some typing issues.

* fixed a bug in this timeseries notebook.

* bump version.

* updated the Logo paths and e2n Link in accordance with PR #15 on pandapower-homepage (#3066)

* feat(opendss): import series Reactor elements as branches (#3067)

Found while test-importing more real feeder libraries (EPRI's Ckt5/Ckt7)
for validation beyond the original PR's four families: EPRI models the
substation's Thevenin-equivalent source impedance as a bus-to-bus Reactor
(SourceBus -> feeder head), not a Transformer, a topology from_opendss
did not yet cover.

_add_reactors treats a series (two-bus) Reactor as a fixed-impedance line
(R/X from dss.Reactors.R()/X(), rated at CktElement.NormalAmps()). A shunt
reactor (single bus, to ground) is a different element and is skipped
with a warning rather than misread as a second branch.

4 new regression tests on an inline synthetic feeder.

* fix(opendss): restore OpenDSSDirect.py as a dev dependency (#3075)

* fix(opendss): restore OpenDSSDirect.py as a dev dependency

It was dropped from the all/dev extras in #3062 because installing it
alongside pytest~=9.1 crashes the pytest process on Windows (upstream
bug: dss-extensions/OpenDSSDirect.py#148). That left the OpenDSS
converter with 0% coverage in CI, since opendssdirect was never
installed to begin with.

The crash is Windows-specific: it reproduces with pytest==9.1.1 +
OpenDSSDirect.py==0.9.4 on Windows but not on Linux, where this
repo's PR-gating CI actually runs. Restore the dependency and skip
test_from_opendss.py on win32 before it ever imports opendssdirect,
instead of avoiding the dependency for every platform.

* fix(opendss): disable faulthandler around the opendssdirect import

Replaces the Windows platform-skip with an actual fix. Traced the
crash on a real windows-latest GitHub Actions runner (Houmgaor#diag-
opendss-windows-crash): dss_python_backend's Free Pascal runtime
raises an internal first-chance SEH exception during its own module
init that it normally handles and silences itself. pytest enables
Python's faulthandler by default, which installs a Windows vectored
exception handler that intercepts that first-chance exception before
Pascal's own handler gets it, and reports it as a fatal crash. A
plain `python -c "import opendssdirect"` never enables faulthandler,
so it never sees this -- matching the upstream report exactly.

Bracketing just the import with faulthandler.disable()/.enable()
eliminates the false crash entirely (verified: clean pytest pass, no
exception message) while leaving faulthandler protecting the rest of
the run (verified: a real segfault after the import is still caught
and reported).

See dss-extensions/OpenDSSDirect.py#148

* docs(changelog): update entry to describe the faulthandler fix

The CHANGELOG entry still described the old Windows platform-skip;
update it to match the actual fix.

* added fixes that exist on feature/v4.0.0 to simplify merging in the future (#3072)

* fixed opf test failing (#3086)

* fixed use of bus_geodata in create_dcline_collection (#3087)

* Fixed tutorial plotting pyqt. (#3094)

* Fixed tutorial plotting pyqt by updating access of line geodata and size of buses.

* Updated changelog.

* Fix errors in impedance element documentation (#3096)

Two documentation errors in the impedance element, both verified against
_calc_impedance_parameters_from_dataframe in build_branch.py:

- doc/elements/impedance.rst: the asymmetric to-from impedance z_tf was written
  as (rft_pu + j*xtf_pu); it should use rtf_pu, matching the code
  (rji = rtf_pu; r_t = rji * sn_net / sn_impedance). The from-to impedance z_ft
  on the line above correctly uses rft_pu.

- doc/elements/impedance_par.csv: the to-bus shunt parameters gt_pu, bt_pu,
  gt0_pu and bt0_pu were described as being at the from_bus; they are at the
  to_bus (gj = gt_pu, bj = bt_pu, which become the to-bus shunt g_t/b_t in the
  code), as the t suffix and the from-bus entries gf_pu/bf_pu indicate.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* removed scipy limits to allow for support in qgis (#3088)

* updated contributing link in readme.rst (#3101)

* fix elmzpu in station controller (#3100)

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>

* mypy check previously excluded folders (#2787)

* mypy check plotting

* mypy fix matplotlib type hint

* mypy run on entire codebase

* mypy type annotation for cim_classes.py ns_dict

* fix trailing whitespaces

* fixed mypy issues in jao converter and minor other mypy issues

* fixed mypy issues in cim converter

* fixed issue in utility_functions
added geopandas stubs to requirements for typing

* fixed issue in ucte_parser

* fixed mypy issues in auxiliary.py

* fixed mypy issues in patch_makers.py

* fixed mypy issues

* fixed mypy issues in create functions

* fixed mypy issues in plotting

* fixed mypy issues in grid_modification.py and groups.py

* fixed remaining mypy issues

* fixed bug introduced while fixing mypy issues

* fixed more mypy issues

* added lxml-stubs to typing requirements

---------

Co-authored-by: KS_HTK <2981026+KS-HTK@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>

* fixed pandera version

* fixed mypy issues

* fixed typing issue

* removed duplicate ukpn tutorials

---------

Signed-off-by: furqan463 <ahmadfurqanc@gmail.com>
Signed-off-by: Yoshiki <yosinn1@gmail.com>
Co-authored-by: Jan Wiemer <32835953+jwiemer112@users.noreply.github.com>
Co-authored-by: mrifraunhofer <94368111+mrifraunhofer@users.noreply.github.com>
Co-authored-by: V3 <mike.vogt@iee.fraunhofer.de>
Co-authored-by: Bryn Pickering <17178478+brynpickering@users.noreply.github.com>
Co-authored-by: David Heck <david.heck@iee.fraunhofer.de>
Co-authored-by: Arisaka97 <solitaire2312@gmail.com>
Co-authored-by: pawellytaev <86314586+pawellytaev@users.noreply.github.com>
Co-authored-by: mrichter <mario.richter@iee.fraunhofer.de>
Co-authored-by: Moritz <29129441+MoritzHauff@users.noreply.github.com>
Co-authored-by: Jeremias Lang <158100420+jerelang@users.noreply.github.com>
Co-authored-by: jereOG <jerelang@users.noreply.github.com>
Co-authored-by: Engr. Ahmad Furqan <ahmadfurqanc@gmail.com>
Co-authored-by: nis-nurr <rijad.nuridini@nis.ch>
Co-authored-by: marcopau <77792704+marcopau@users.noreply.github.com>
Co-authored-by: envelio-js <johannes.sorg@envelio.de>
Co-authored-by: Christian Bredtmann <christian.bredtmann@envelio.de>
Co-authored-by: pawellytaev <pawel.lytaev@uni-kassel.de>
Co-authored-by: envelio-cb <88880102+envelio-cb@users.noreply.github.com>
Co-authored-by: Reinhold Bertram <reinhold.bertram@envelio.de>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: IEECNB215543\gbanerjee <gourab.banerjee@iee.fraunhofer.de>
Co-authored-by: yosinn1-blip <yosinn1@gmail.com>
Co-authored-by: Frank Marten <79512075+fmarten99@users.noreply.github.com>
Co-authored-by: Šime Pavlić <pavlicsime1994@gmail.com>
Co-authored-by: Šime Pavlić <simepavlic@Simes-MacBook-Pro.local>
Co-authored-by: Roman Bolgaryn <roman.bolgaryn@iee.fraunhofer.de>
Co-authored-by: stardeltapower <65967874+stardeltapower@users.noreply.github.com>
Co-authored-by: Ehsanpoly <90526732+Ehsanpoly@users.noreply.github.com>
Co-authored-by: Houmgaor <35099109+Houmgaor@users.noreply.github.com>
Co-authored-by: Heiner <heiner.frueh@gmx.de>
Co-authored-by: Heiner Früh <heiner.frueh@stuttgart-netze.de>
Co-authored-by: Heiner <heiner.frueh@ieh.uni-stuttgart.de>
Co-authored-by: Nemanja Stankić <36014264+belobradi@users.noreply.github.com>
Co-authored-by: Pascal Ehlert <pascal@ehlert-it.de>
Co-authored-by: Daniel Lohmeier <31214121+dlohmeier@users.noreply.github.com>
Co-authored-by: Joschka Thurner <joschka.thurner@retoflow.de>
Co-authored-by: SRDM <42580302+SimonRubenDrauz@users.noreply.github.com>
Co-authored-by: schafbergert <146320543+schafbergert@users.noreply.github.com>
Co-authored-by: Travis <travisyjcao@gmail.com>
Co-authored-by: Clemens Korner <clemens.korner@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants