diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index ffeaa94..1f1a0a1 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -13,7 +13,9 @@ ## New Features - +- `generate-config` now derives a `generation` component type, with its + `AC_POWER_ACTIVE` formula taken from `ComponentGraph.producer_formula()`, so + the aggregated producer power is emitted alongside `consumption`. ## Bug Fixes diff --git a/src/frequenz/gridpool/config/_load.py b/src/frequenz/gridpool/config/_load.py index 0dc5a01..12abe30 100644 --- a/src/frequenz/gridpool/config/_load.py +++ b/src/frequenz/gridpool/config/_load.py @@ -266,6 +266,12 @@ def as_formula(derived: str) -> dict[str, str] | None: component=None, formula=as_formula(graph.consumer_formula()), ), + "generation": ComponentTypeConfig( + meter=None, + inverter=None, + component=None, + formula=as_formula(graph.producer_formula()), + ), "grid": ComponentTypeConfig( meter=grid_meter_ids(graph) or None, inverter=None, diff --git a/src/frequenz/gridpool/config/_microgrid.py b/src/frequenz/gridpool/config/_microgrid.py index 82c3b6a..a3d9390 100644 --- a/src/frequenz/gridpool/config/_microgrid.py +++ b/src/frequenz/gridpool/config/_microgrid.py @@ -13,7 +13,9 @@ from ._fields import toml_datetime_metadata -ComponentType = Literal["grid", "pv", "battery", "consumption", "chp", "ev"] +ComponentType = Literal[ + "grid", "pv", "battery", "consumption", "generation", "chp", "ev" +] """Valid component types.""" ComponentCategory = Literal["meter", "inverter", "component"] diff --git a/tests/test_load.py b/tests/test_load.py index 5548acb..bba596a 100644 --- a/tests/test_load.py +++ b/tests/test_load.py @@ -77,8 +77,11 @@ async def test_load_microgrids_from_api_derives_formulas_and_ids() -> None: assert cfg.ctype["pv"].inverter == [4] assert cfg.ctype["pv"].meter == [2] assert cfg.ctype["grid"].meter == [2, 3] + assert cfg.ctype["generation"].formula == { + "AC_POWER_ACTIVE": "COALESCE(#4, #2, 0.0)" + } # Component types absent from the microgrid are not created. - assert set(cfg.ctype) == {"grid", "consumption", "pv"} + assert set(cfg.ctype) == {"grid", "consumption", "generation", "pv"} async def test_load_microgrids_from_api_allows_missing_enterprise_id() -> None: @@ -201,4 +204,5 @@ async def test_derive_component_configs_builds_formulas_and_ids() -> None: assert configs["pv"].inverter == [4] assert configs["pv"].meter == [2] assert configs["grid"].meter == [2, 3] - assert set(configs) == {"grid", "consumption", "pv"} + assert configs["generation"].formula == {"AC_POWER_ACTIVE": "COALESCE(#4, #2, 0.0)"} + assert set(configs) == {"grid", "consumption", "generation", "pv"}