frequenz-gridpool 0.4.1__tar.gz → 0.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. {frequenz_gridpool-0.4.1/src/frequenz_gridpool.egg-info → frequenz_gridpool-0.4.2}/PKG-INFO +7 -7
  2. frequenz_gridpool-0.4.2/RELEASE_NOTES.md +17 -0
  3. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/pyproject.toml +6 -6
  4. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz/gridpool/_graph_generator.py +25 -0
  5. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz/gridpool/_microgrid_config.py +12 -3
  6. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2/src/frequenz_gridpool.egg-info}/PKG-INFO +7 -7
  7. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz_gridpool.egg-info/requires.txt +6 -6
  8. frequenz_gridpool-0.4.1/RELEASE_NOTES.md +0 -17
  9. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/LICENSE +0 -0
  10. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/MANIFEST.in +0 -0
  11. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/README.md +0 -0
  12. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/setup.cfg +0 -0
  13. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz/gridpool/__init__.py +0 -0
  14. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz/gridpool/cli/__init__.py +0 -0
  15. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz/gridpool/cli/__main__.py +0 -0
  16. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz/gridpool/cli/_render_graph.py +0 -0
  17. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz/gridpool/conftest.py +0 -0
  18. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz/gridpool/py.typed +0 -0
  19. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz_gridpool.egg-info/SOURCES.txt +0 -0
  20. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz_gridpool.egg-info/dependency_links.txt +0 -0
  21. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz_gridpool.egg-info/entry_points.txt +0 -0
  22. {frequenz_gridpool-0.4.1 → frequenz_gridpool-0.4.2}/src/frequenz_gridpool.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frequenz-gridpool
3
- Version: 0.4.1
3
+ Version: 0.4.2
4
4
  Summary: High-level interface to grid pools for the Frequenz platform.
5
5
  Author-email: Frequenz Energy-as-a-Service GmbH <floss@frequenz.com>
6
6
  License-Expression: MIT
@@ -40,26 +40,26 @@ Requires-Dist: isort==8.0.1; extra == "dev-formatting"
40
40
  Provides-Extra: dev-mkdocs
41
41
  Requires-Dist: Markdown==3.10.2; extra == "dev-mkdocs"
42
42
  Requires-Dist: black==26.3.1; extra == "dev-mkdocs"
43
- Requires-Dist: mike==2.1.4; extra == "dev-mkdocs"
43
+ Requires-Dist: mike==2.2.0; extra == "dev-mkdocs"
44
44
  Requires-Dist: mkdocs-gen-files==0.6.1; extra == "dev-mkdocs"
45
45
  Requires-Dist: mkdocs-literate-nav==0.6.3; extra == "dev-mkdocs"
46
46
  Requires-Dist: mkdocs-macros-plugin==1.5.0; extra == "dev-mkdocs"
47
47
  Requires-Dist: mkdocs-material==9.7.6; extra == "dev-mkdocs"
48
- Requires-Dist: mkdocstrings[python]==1.0.3; extra == "dev-mkdocs"
48
+ Requires-Dist: mkdocstrings[python]==1.0.4; extra == "dev-mkdocs"
49
49
  Requires-Dist: mkdocstrings-python==2.0.3; extra == "dev-mkdocs"
50
50
  Requires-Dist: frequenz-repo-config[lib]==0.17.0; extra == "dev-mkdocs"
51
51
  Provides-Extra: dev-mypy
52
- Requires-Dist: mypy==1.20.0; extra == "dev-mypy"
52
+ Requires-Dist: mypy==1.20.2; extra == "dev-mypy"
53
53
  Requires-Dist: types-networkx>=3.6.1.20251220; extra == "dev-mypy"
54
- Requires-Dist: types-Markdown==3.10.2.20260211; extra == "dev-mypy"
54
+ Requires-Dist: types-Markdown==3.10.2.20260408; extra == "dev-mypy"
55
55
  Requires-Dist: frequenz-gridpool[dev-mkdocs,dev-noxfile,dev-pytest]; extra == "dev-mypy"
56
56
  Provides-Extra: dev-noxfile
57
- Requires-Dist: nox==2026.2.9; extra == "dev-noxfile"
57
+ Requires-Dist: nox==2026.4.10; extra == "dev-noxfile"
58
58
  Requires-Dist: frequenz-repo-config[lib]==0.17.0; extra == "dev-noxfile"
59
59
  Provides-Extra: dev-pylint
60
60
  Requires-Dist: frequenz-gridpool[dev-mkdocs,dev-noxfile,dev-pytest]; extra == "dev-pylint"
61
61
  Provides-Extra: dev-pytest
62
- Requires-Dist: pytest==9.0.2; extra == "dev-pytest"
62
+ Requires-Dist: pytest==9.0.3; extra == "dev-pytest"
63
63
  Requires-Dist: pylint==4.0.5; extra == "dev-pytest"
64
64
  Requires-Dist: frequenz-repo-config[extra-lint-examples]==0.17.0; extra == "dev-pytest"
65
65
  Requires-Dist: pytest-mock==3.15.1; extra == "dev-pytest"
@@ -0,0 +1,17 @@
1
+ # Frequenz Gridpool Library Release Notes
2
+
3
+ ## Summary
4
+
5
+ <!-- Here goes a general summary of what this release is about -->
6
+
7
+ ## Upgrading
8
+
9
+ <!-- Here goes notes on how to upgrade from previous versions, including deprecations and what they should be replaced with -->
10
+
11
+ ## New Features
12
+
13
+ - If there are unconnected breakers at a site, they are now hidden from the component graph. If there are breakers with connections to other components, they are still sent to the component graph. This is a temporary measure until the graph traversal supports breakers.
14
+
15
+ ## Bug Fixes
16
+
17
+ - Fixed auto-formula population to only fill formulas for component types already present in a microgrid configuration. This prevents creating placeholder entries with `None` formulas for component types that are not configured.
@@ -59,24 +59,24 @@ dev-formatting = ["black == 26.3.1", "isort == 8.0.1"]
59
59
  dev-mkdocs = [
60
60
  "Markdown == 3.10.2",
61
61
  "black == 26.3.1",
62
- "mike == 2.1.4",
62
+ "mike == 2.2.0",
63
63
  "mkdocs-gen-files == 0.6.1",
64
64
  "mkdocs-literate-nav == 0.6.3",
65
65
  "mkdocs-macros-plugin == 1.5.0",
66
66
  "mkdocs-material == 9.7.6",
67
- "mkdocstrings[python] == 1.0.3",
67
+ "mkdocstrings[python] == 1.0.4",
68
68
  "mkdocstrings-python == 2.0.3",
69
69
  "frequenz-repo-config[lib] == 0.17.0",
70
70
  ]
71
71
  dev-mypy = [
72
- "mypy == 1.20.0",
72
+ "mypy == 1.20.2",
73
73
  "types-networkx>=3.6.1.20251220",
74
- "types-Markdown == 3.10.2.20260211",
74
+ "types-Markdown == 3.10.2.20260408",
75
75
  # For checking the noxfile, docs/ script, and tests
76
76
  "frequenz-gridpool[dev-mkdocs,dev-noxfile,dev-pytest]",
77
77
  ]
78
78
  dev-noxfile = [
79
- "nox == 2026.2.9",
79
+ "nox == 2026.4.10",
80
80
  "frequenz-repo-config[lib] == 0.17.0",
81
81
  ]
82
82
  dev-pylint = [
@@ -85,7 +85,7 @@ dev-pylint = [
85
85
  "frequenz-gridpool[dev-mkdocs,dev-noxfile,dev-pytest]",
86
86
  ]
87
87
  dev-pytest = [
88
- "pytest == 9.0.2",
88
+ "pytest == 9.0.3",
89
89
  "pylint == 4.0.5", # We need this to check for the examples
90
90
  "frequenz-repo-config[extra-lint-examples] == 0.17.0",
91
91
  "pytest-mock == 3.15.1",
@@ -3,8 +3,11 @@
3
3
 
4
4
  """Formula generation from assets API component/connection configurations."""
5
5
 
6
+ import logging
7
+
6
8
  from frequenz.client.assets import AssetsApiClient
7
9
  from frequenz.client.assets.electrical_component import (
10
+ Breaker,
8
11
  ComponentConnection,
9
12
  ElectricalComponent,
10
13
  )
@@ -12,6 +15,8 @@ from frequenz.client.common.microgrid import MicrogridId
12
15
  from frequenz.client.common.microgrid.electrical_components import ElectricalComponentId
13
16
  from frequenz.microgrid_component_graph import ComponentGraph
14
17
 
18
+ _logger = logging.getLogger(__name__)
19
+
15
20
 
16
21
  class ComponentGraphGenerator:
17
22
  """Generates component graphs for microgrids using the Assets API."""
@@ -57,6 +62,26 @@ class ComponentGraphGenerator:
57
62
  if any(c is None for c in connections):
58
63
  raise ValueError("Failed to load all electrical component connections.")
59
64
 
65
+ breakers = [c for c in components if isinstance(c, Breaker)]
66
+ connected_breakers = [
67
+ b
68
+ for b in breakers
69
+ if any(
70
+ b.id in (c.source, c.destination) for c in connections if c is not None
71
+ )
72
+ ]
73
+
74
+ if connected_breakers:
75
+ _logger.warning(
76
+ "The following breakers are connected to other components, "
77
+ + "which is not supported by the component graph generator and may "
78
+ + "lead to graph traversal issues: %s",
79
+ [b.id for b in connected_breakers],
80
+ )
81
+ elif breakers:
82
+ _logger.debug("Dropping unconnected breakers: %s", [b.id for b in breakers])
83
+ components = [c for c in components if not isinstance(c, Breaker)]
84
+
60
85
  graph = ComponentGraph[
61
86
  ElectricalComponent, ComponentConnection, ElectricalComponentId
62
87
  ](components, connections)
@@ -441,10 +441,13 @@ class MicrogridConfig:
441
441
  assets_url, auth_key=assets_auth_key, sign_secret=assets_sign_secret
442
442
  ) as assets_client:
443
443
  for microgrid_id, config in microgrid_configs.items():
444
+ relevant_ctypes = set(config.ctype.keys())
445
+
444
446
  await populate_missing_formulas(
445
447
  microgrid_id=int(microgrid_id),
446
448
  config=config,
447
449
  assets_client=assets_client,
450
+ component_types=relevant_ctypes,
448
451
  )
449
452
 
450
453
  return microgrid_configs
@@ -454,6 +457,7 @@ async def populate_missing_formulas(
454
457
  microgrid_id: int,
455
458
  config: "MicrogridConfig",
456
459
  assets_client: AssetsApiClient,
460
+ component_types: set[str] | None = None,
457
461
  ) -> None:
458
462
  """Populate missing component formulas from the assets API graph.
459
463
 
@@ -471,6 +475,8 @@ async def populate_missing_formulas(
471
475
  Microgrid configuration object to update in place.
472
476
  assets_client:
473
477
  Assets API client used to fetch the component graph.
478
+ component_types:
479
+ Optional set of component types to consider when populating formulas.
474
480
 
475
481
  Returns:
476
482
  None. The configuration is modified in place.
@@ -502,12 +508,15 @@ async def populate_missing_formulas(
502
508
  "AC_ENERGY_ACTIVE_DELIVERED",
503
509
  )
504
510
 
511
+ # Default: only populate component types already present in the config.
512
+ allowed_ctypes = component_types or set(config.ctype.keys())
513
+
505
514
  for ctype, formula in auto_formulas.items():
515
+ if ctype not in allowed_ctypes:
516
+ continue
517
+
506
518
  cfg = config.ctype.get(ctype)
507
519
  if cfg is None:
508
- config.ctype[ctype] = ComponentTypeConfig(
509
- formula={metric: formula for metric in metrics}
510
- )
511
520
  continue
512
521
 
513
522
  if cfg.formula is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frequenz-gridpool
3
- Version: 0.4.1
3
+ Version: 0.4.2
4
4
  Summary: High-level interface to grid pools for the Frequenz platform.
5
5
  Author-email: Frequenz Energy-as-a-Service GmbH <floss@frequenz.com>
6
6
  License-Expression: MIT
@@ -40,26 +40,26 @@ Requires-Dist: isort==8.0.1; extra == "dev-formatting"
40
40
  Provides-Extra: dev-mkdocs
41
41
  Requires-Dist: Markdown==3.10.2; extra == "dev-mkdocs"
42
42
  Requires-Dist: black==26.3.1; extra == "dev-mkdocs"
43
- Requires-Dist: mike==2.1.4; extra == "dev-mkdocs"
43
+ Requires-Dist: mike==2.2.0; extra == "dev-mkdocs"
44
44
  Requires-Dist: mkdocs-gen-files==0.6.1; extra == "dev-mkdocs"
45
45
  Requires-Dist: mkdocs-literate-nav==0.6.3; extra == "dev-mkdocs"
46
46
  Requires-Dist: mkdocs-macros-plugin==1.5.0; extra == "dev-mkdocs"
47
47
  Requires-Dist: mkdocs-material==9.7.6; extra == "dev-mkdocs"
48
- Requires-Dist: mkdocstrings[python]==1.0.3; extra == "dev-mkdocs"
48
+ Requires-Dist: mkdocstrings[python]==1.0.4; extra == "dev-mkdocs"
49
49
  Requires-Dist: mkdocstrings-python==2.0.3; extra == "dev-mkdocs"
50
50
  Requires-Dist: frequenz-repo-config[lib]==0.17.0; extra == "dev-mkdocs"
51
51
  Provides-Extra: dev-mypy
52
- Requires-Dist: mypy==1.20.0; extra == "dev-mypy"
52
+ Requires-Dist: mypy==1.20.2; extra == "dev-mypy"
53
53
  Requires-Dist: types-networkx>=3.6.1.20251220; extra == "dev-mypy"
54
- Requires-Dist: types-Markdown==3.10.2.20260211; extra == "dev-mypy"
54
+ Requires-Dist: types-Markdown==3.10.2.20260408; extra == "dev-mypy"
55
55
  Requires-Dist: frequenz-gridpool[dev-mkdocs,dev-noxfile,dev-pytest]; extra == "dev-mypy"
56
56
  Provides-Extra: dev-noxfile
57
- Requires-Dist: nox==2026.2.9; extra == "dev-noxfile"
57
+ Requires-Dist: nox==2026.4.10; extra == "dev-noxfile"
58
58
  Requires-Dist: frequenz-repo-config[lib]==0.17.0; extra == "dev-noxfile"
59
59
  Provides-Extra: dev-pylint
60
60
  Requires-Dist: frequenz-gridpool[dev-mkdocs,dev-noxfile,dev-pytest]; extra == "dev-pylint"
61
61
  Provides-Extra: dev-pytest
62
- Requires-Dist: pytest==9.0.2; extra == "dev-pytest"
62
+ Requires-Dist: pytest==9.0.3; extra == "dev-pytest"
63
63
  Requires-Dist: pylint==4.0.5; extra == "dev-pytest"
64
64
  Requires-Dist: frequenz-repo-config[extra-lint-examples]==0.17.0; extra == "dev-pytest"
65
65
  Requires-Dist: pytest-mock==3.15.1; extra == "dev-pytest"
@@ -22,30 +22,30 @@ isort==8.0.1
22
22
  [dev-mkdocs]
23
23
  Markdown==3.10.2
24
24
  black==26.3.1
25
- mike==2.1.4
25
+ mike==2.2.0
26
26
  mkdocs-gen-files==0.6.1
27
27
  mkdocs-literate-nav==0.6.3
28
28
  mkdocs-macros-plugin==1.5.0
29
29
  mkdocs-material==9.7.6
30
- mkdocstrings[python]==1.0.3
30
+ mkdocstrings[python]==1.0.4
31
31
  mkdocstrings-python==2.0.3
32
32
  frequenz-repo-config[lib]==0.17.0
33
33
 
34
34
  [dev-mypy]
35
- mypy==1.20.0
35
+ mypy==1.20.2
36
36
  types-networkx>=3.6.1.20251220
37
- types-Markdown==3.10.2.20260211
37
+ types-Markdown==3.10.2.20260408
38
38
  frequenz-gridpool[dev-mkdocs,dev-noxfile,dev-pytest]
39
39
 
40
40
  [dev-noxfile]
41
- nox==2026.2.9
41
+ nox==2026.4.10
42
42
  frequenz-repo-config[lib]==0.17.0
43
43
 
44
44
  [dev-pylint]
45
45
  frequenz-gridpool[dev-mkdocs,dev-noxfile,dev-pytest]
46
46
 
47
47
  [dev-pytest]
48
- pytest==9.0.2
48
+ pytest==9.0.3
49
49
  pylint==4.0.5
50
50
  frequenz-repo-config[extra-lint-examples]==0.17.0
51
51
  pytest-mock==3.15.1
@@ -1,17 +0,0 @@
1
- # Frequenz Gridpool Library Release Notes
2
-
3
- ## Summary
4
-
5
- <!-- Here goes a general summary of what this release is about -->
6
-
7
- ## Upgrading
8
-
9
- * Default formulas for AC active power and energy are removed.
10
-
11
- ## New Features
12
-
13
- <!-- Here goes the main new features and examples or instructions on how to use them -->
14
-
15
- ## Bug Fixes
16
-
17
- <!-- Here goes notable bug fixes that are worth a special mention or explanation -->