2121import time_machine
2222from frequenz .channels import Receiver , Sender
2323from frequenz .client .common .microgrid .components import ComponentId
24- from frequenz .client .microgrid .component import (
25- Battery ,
26- Component ,
27- ComponentCategory ,
28- InverterType ,
29- )
30- from frequenz .microgrid_component_graph import (
31- FormulaGenerationError ,
32- InvalidGraphError ,
33- )
24+ from frequenz .client .microgrid .component import Battery , Component
3425from frequenz .quantities import Energy , Percentage , Power , Temperature
3526from pytest_mock import MockerFixture
3627
4637from frequenz .sdk .timeseries import Bounds , ResamplerConfig2 , Sample
4738from frequenz .sdk .timeseries ._base_types import SystemBounds
4839from frequenz .sdk .timeseries .battery_pool import BatteryPool
49- from tests .utils .graph_generator import GraphGenerator
5040
5141from ...timeseries .mock_microgrid import MockMicrogrid
5242from ...utils .component_data_streamer import MockComponentDataStreamer
@@ -503,10 +493,6 @@ async def run_test_battery_status_channel(
503493 compare_messages (msg , all_pool_result )
504494
505495
506- @pytest .mark .skip (
507- reason = "Needs to be adapted to the new component graph behavior, see "
508- "https://github.com/frequenz-floss/frequenz-sdk-python/issues/1345"
509- )
510496async def test_battery_pool_power (mocker : MockerFixture ) -> None :
511497 """Test `BatteryPool.power` method."""
512498 mockgrid = MockMicrogrid (grid_meter = True , mocker = mocker )
@@ -518,165 +504,9 @@ async def test_battery_pool_power(mocker: MockerFixture) -> None:
518504 power_receiver = battery_pool .power .new_receiver ()
519505
520506 # send meter power [grid_meter, battery1_meter, battery2_meter]
521- await mockgrid .mock_resampler .send_meter_power ([100.0 , 2.0 , 3.0 ])
522- await mockgrid .mock_resampler .send_bat_inverter_power ([20.0 , 30.0 ])
507+ await mockgrid .mock_resampler .send_meter_power ([100.0 , 20.0 , 30.0 ])
523508 assert (await power_receiver .receive ()).value == Power .from_watts (50.0 )
524509
525- await mockgrid .mock_resampler .send_meter_power ([100.0 , - 2.0 , - 5.0 ])
526- await mockgrid .mock_resampler .send_bat_inverter_power ([- 20.0 , - 50.0 ])
527- assert (await power_receiver .receive ()).value == Power .from_watts (- 70.0 )
528-
529- await mockgrid .mock_resampler .send_meter_power ([100.0 , 2.0 , - 5.0 ])
530- await mockgrid .mock_resampler .send_bat_inverter_power ([20.0 , - 50.0 ])
531- assert (await power_receiver .receive ()).value == Power .from_watts (- 30.0 )
532-
533-
534- @pytest .mark .skip (
535- reason = "Needs to be adapted to the new component graph behavior, see "
536- "https://github.com/frequenz-floss/frequenz-sdk-python/issues/1345"
537- )
538- async def test_battery_pool_power_two_inverters_per_battery (
539- mocker : MockerFixture ,
540- ) -> None :
541- """Test power method with two inverters per battery."""
542- gen = GraphGenerator ()
543- bat = gen .component (ComponentCategory .BATTERY )
544- mockgrid = MockMicrogrid (
545- graph = gen .to_graph (
546- (ComponentCategory .METER , gen .battery_with_inverter (bat , 2 ))
547- ),
548- mocker = mocker ,
549- )
550- async with mockgrid , AsyncExitStack () as stack :
551- battery_pool = microgrid .new_battery_pool (priority = 5 )
552- stack .push_async_callback (battery_pool .stop )
553- power_receiver = battery_pool .power .new_receiver ()
554-
555- # send meter power [grid_meter, battery1_meter]
556- # Fallback formula - use only meter power, inverter and batteries are not used.
557- await mockgrid .mock_resampler .send_meter_power ([100.0 , 2.0 ])
558- await mockgrid .mock_resampler .send_bat_inverter_power ([20.0 , 30.0 ])
559- assert (await power_receiver .receive ()).value == Power .from_watts (50.0 )
560-
561- await mockgrid .mock_resampler .send_meter_power ([100.0 , - 5.0 ])
562- await mockgrid .mock_resampler .send_bat_inverter_power ([- 20.0 , - 50.0 ])
563- assert (await power_receiver .receive ()).value == Power .from_watts (- 70.0 )
564-
565- await mockgrid .mock_resampler .send_meter_power ([100.0 , - 5.0 ])
566- await mockgrid .mock_resampler .send_bat_inverter_power ([20.0 , - 50.0 ])
567- assert (await power_receiver .receive ()).value == Power .from_watts (- 30.0 )
568-
569-
570- @pytest .mark .skip (
571- reason = "Needs to be adapted to the new component graph behavior, see "
572- "https://github.com/frequenz-floss/frequenz-sdk-python/issues/1345"
573- )
574- async def test_batter_pool_power_two_batteries_per_inverter (
575- mocker : MockerFixture ,
576- ) -> None :
577- """Test power method with two batteries per inverter."""
578- gen = GraphGenerator ()
579- mockgrid = MockMicrogrid (
580- graph = gen .to_graph (
581- [
582- (
583- ComponentCategory .METER ,
584- (
585- ComponentCategory .INVERTER ,
586- [ComponentCategory .BATTERY , ComponentCategory .BATTERY ],
587- ),
588- ),
589- (
590- ComponentCategory .METER ,
591- (
592- ComponentCategory .INVERTER ,
593- [ComponentCategory .BATTERY , ComponentCategory .BATTERY ],
594- ),
595- ),
596- ]
597- ),
598- mocker = mocker ,
599- )
600-
601- async with mockgrid , AsyncExitStack () as stack :
602- battery_pool = microgrid .new_battery_pool (priority = 5 )
603- stack .push_async_callback (battery_pool .stop )
604- power_receiver = battery_pool .power .new_receiver ()
605-
606- # send meter power [battery1_meter, battery2_meter]
607- # Fallback formula - use only meter power, inverter and batteries are not used.
608- await mockgrid .mock_resampler .send_meter_power ([100.0 , 3.0 ])
609- await mockgrid .mock_resampler .send_bat_inverter_power ([20.0 , 30.0 ])
610- assert (await power_receiver .receive ()).value == Power .from_watts (50.0 )
611-
612- await mockgrid .mock_resampler .send_meter_power ([100.0 , - 5.0 ])
613- await mockgrid .mock_resampler .send_bat_inverter_power ([- 20.0 , - 50.0 ])
614- assert (await power_receiver .receive ()).value == Power .from_watts (- 70.0 )
615-
616- await mockgrid .mock_resampler .send_meter_power ([3.0 , - 5.0 ])
617- await mockgrid .mock_resampler .send_bat_inverter_power ([20.0 , - 50.0 ])
618- assert (await power_receiver .receive ()).value == Power .from_watts (- 30.0 )
619-
620-
621- async def test_batter_pool_power_no_batteries (mocker : MockerFixture ) -> None :
622- """Test power method with no batteries."""
623- graph_gen = GraphGenerator ()
624- mockgrid = MockMicrogrid (
625- graph = graph_gen .to_graph (
626- (
627- ComponentCategory .METER ,
628- [
629- graph_gen .component (ComponentCategory .INVERTER , InverterType .SOLAR ),
630- graph_gen .component (ComponentCategory .INVERTER , InverterType .SOLAR ),
631- ],
632- )
633- )
634- )
635- await mockgrid .start (mocker )
636- battery_pool = microgrid .new_battery_pool (priority = 5 )
637- power_receiver = battery_pool .power .new_receiver ()
638-
639- await mockgrid .mock_resampler .send_non_existing_component_value ()
640- assert (await power_receiver .receive ()).value == Power .from_watts (0 )
641-
642-
643- async def test_battery_pool_power_with_no_inverters (mocker : MockerFixture ) -> None :
644- """Test power method with no inverters."""
645- with pytest .raises (InvalidGraphError ):
646- mockgrid = MockMicrogrid (
647- graph = GraphGenerator ().to_graph (
648- (ComponentCategory .METER , ComponentCategory .BATTERY )
649- )
650- )
651- await mockgrid .start (mocker )
652-
653-
654- async def test_battery_pool_power_incomplete_bat_request (mocker : MockerFixture ) -> None :
655- """Test power method when not all requested ids are behind the same inverter."""
656- gen = GraphGenerator ()
657- bats = gen .components (
658- ComponentCategory .BATTERY , ComponentCategory .BATTERY , ComponentCategory .BATTERY
659- )
660-
661- mockgrid = MockMicrogrid (
662- graph = gen .to_graph (
663- (
664- ComponentCategory .METER ,
665- gen .batteries_with_inverter (bats , 2 ),
666- )
667- )
668- )
669- await mockgrid .start (mocker )
670-
671- with pytest .raises (FormulaGenerationError ):
672- # Request only two of the three batteries behind the inverters
673- battery_pool = microgrid .new_battery_pool (
674- priority = 5 , component_ids = set ([bats [1 ].id , bats [0 ].id ])
675- )
676- power_receiver = battery_pool .power .new_receiver ()
677- await mockgrid .mock_resampler .send_bat_inverter_power ([2.0 ])
678- assert (await power_receiver .receive ()).value == Power .from_watts (2.0 )
679-
680510
681511async def run_capacity_test ( # pylint: disable=too-many-locals
682512 fake_time : time_machine .Coordinates , setup_args : SetupArgs
0 commit comments