diff --git a/mkdocs.yml b/mkdocs.yml index 13fe0f1c9..c86bb14ae 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -24,6 +24,7 @@ theme: features: - content.code.annotate - content.code.copy + - navigation.indexes - navigation.instant - navigation.tabs - navigation.top @@ -115,7 +116,6 @@ plugins: - https://typing-extensions.readthedocs.io/en/stable/objects.inv - https://watchfiles.helpmanual.io/objects.inv - search - - section-index # Preview controls watch: diff --git a/src/frequenz/sdk/timeseries/_formula_engine/_formula_generators/_consumer_power_formula.py b/src/frequenz/sdk/timeseries/_formula_engine/_formula_generators/_consumer_power_formula.py index 2dc18f3fc..393a4d82c 100644 --- a/src/frequenz/sdk/timeseries/_formula_engine/_formula_generators/_consumer_power_formula.py +++ b/src/frequenz/sdk/timeseries/_formula_engine/_formula_generators/_consumer_power_formula.py @@ -106,7 +106,7 @@ def non_consumer_component(component: Component) -> bool: # push all grid meters for idx, grid_meter in enumerate(grid_meters): if idx > 0: - builder.push_oper("-") + builder.push_oper("+") builder.push_component_metric( grid_meter.component_id, nones_are_zeros=False ) diff --git a/tests/timeseries/test_logical_meter.py b/tests/timeseries/test_logical_meter.py index 4eed54828..c2bfce7a1 100644 --- a/tests/timeseries/test_logical_meter.py +++ b/tests/timeseries/test_logical_meter.py @@ -21,7 +21,7 @@ # pylint: disable=protected-access -class TestLogicalMeter: +class TestLogicalMeter: # pylint: disable=too-many-public-methods """Tests for the logical meter.""" async def test_grid_power_1(self, mocker: MockerFixture) -> None: @@ -423,6 +423,22 @@ async def test_consumer_power_no_grid_meter(self, mocker: MockerFixture) -> None await mockgrid.mock_resampler.send_meter_power([20.0, 2.0, 3.0, 4.0, 5.0]) assert (await consumer_power_receiver.receive()).value == Power.from_watts(20.0) + async def test_consumer_power_2_grid_meters( + self, + mocker: MockerFixture, + ) -> None: + """Test the grid power formula with grid meters.""" + mockgrid = MockMicrogrid(grid_meter=False) + # with no further sucessor these will be detected as grid meters + mockgrid.add_consumer_meters(2) + await mockgrid.start(mocker) + + logical_meter = microgrid.logical_meter() + grid_consumption_recv = logical_meter.grid_consumption_power.new_receiver() + + await mockgrid.mock_resampler.send_meter_power([1.0, 2.0]) + assert (await grid_consumption_recv.receive()).value == Power.from_watts(3.0) + async def test_consumer_power_no_grid_meter_no_consumer_meter( self, mocker: MockerFixture ) -> None: