From 6895549481f5970d5cf0ebf9cf2b277041759357 Mon Sep 17 00:00:00 2001 From: faizan2590 Date: Wed, 14 Oct 2020 12:57:34 +0200 Subject: [PATCH 1/7] D3ASIM-2859: Switching MMR's role from grid_connected to islanded via area_reconfigure_event --- src/d3a/models/strategy/market_maker_strategy.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/d3a/models/strategy/market_maker_strategy.py b/src/d3a/models/strategy/market_maker_strategy.py index 914289f17..027800013 100644 --- a/src/d3a/models/strategy/market_maker_strategy.py +++ b/src/d3a/models/strategy/market_maker_strategy.py @@ -19,6 +19,7 @@ from d3a.models.read_user_profile import read_and_convert_identity_profile_to_float from d3a_interface.constants_limits import GlobalConfig, ConstSettings from d3a_interface.device_validator import validate_market_maker +from d3a_interface.utils import key_in_dict_and_not_none class MarketMakerStrategy(CommercialStrategy): @@ -41,3 +42,9 @@ def event_market_cycle(self): def event_activate(self): pass + + def area_reconfigure_event(self, *args, **kwargs): + super().area_reconfigure_event(*args, **kwargs) + if key_in_dict_and_not_none(kwargs, 'grid_connected') and \ + type(kwargs['grid_connected']) == bool: + self._grid_connected = kwargs['grid_connected'] From dbc3a7374ea5c80aa59633c229a55129b9c84b75 Mon Sep 17 00:00:00 2001 From: faizan2590 Date: Thu, 15 Oct 2020 10:36:23 +0200 Subject: [PATCH 2/7] D3ASIM-2859: WIP --- src/d3a/models/area/__init__.py | 36 +++++++++++++++++++++++++++++---- src/d3a/setup/d3a-settings.json | 7 +++---- tests/test_live_events.py | 4 ++++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/d3a/models/area/__init__.py b/src/d3a/models/area/__init__.py index e9cc48932..93d460861 100644 --- a/src/d3a/models/area/__init__.py +++ b/src/d3a/models/area/__init__.py @@ -117,6 +117,8 @@ def __init__(self, name: str = None, children: List["Area"] = None, log.debug(f"External connection {external_connection_available} for area {self.name}") self.redis_ext_conn = RedisMarketExternalConnection(self) \ if external_connection_available is True else None + self.str_buffer = None + self.str_kwargs_buffer = None def get_state(self): if self.strategy is not None: @@ -134,10 +136,25 @@ def restore_state(self, saved_state): self.stats.restore_state(saved_state) def area_reconfigure_event(self, **kwargs): - if self.strategy is not None: - self.strategy.area_reconfigure_event(**kwargs) - return - + if key_in_dict_and_not_none(kwargs, 'type'): + from d3a.models.strategy.market_maker_strategy import MarketMakerStrategy + from d3a.models.strategy.infinite_bus import InfiniteBusStrategy + if kwargs['type'] == "MarketMaker": + strategy_obj = MarketMakerStrategy + del kwargs['type'] + del kwargs['number_of_clones'] + del kwargs['energy_rate_profile_uuid'] + self.str_buffer = strategy_obj(**kwargs) + elif kwargs['type'] == "InfiniteBus": + strategy_obj = InfiniteBusStrategy + del kwargs['type'] + del kwargs['number_of_clones'] + del kwargs['energy_rate_profile_uuid'] + del kwargs['buying_rate_profile_uuid'] + self.str_buffer = strategy_obj(**kwargs) + elif self.strategy is not None: + # self.strategy.area_reconfigure_event(**kwargs) + self.str_kwargs_buffer = kwargs grid_fee_constant = kwargs["grid_fee_constant"] \ if key_in_dict_and_not_none(kwargs, 'grid_fee_constant') \ else self.grid_fee_constant @@ -325,6 +342,17 @@ def _consume_commands_from_aggregator(self): self.strategy.trigger_aggregator_commands) def tick(self): + if self.str_buffer is not None: + self.strategy = self.str_buffer + self.strategy.area = self.parent + self.strategy.owner = self + self.strategy.event_activate() + self.strategy.event_market_cycle() + self.str_buffer = None + elif self.str_kwargs_buffer is not None: + self.strategy.area_reconfigure_event(**self.str_kwargs_buffer) + self.str_kwargs_buffer = None + self._consume_commands_from_aggregator() if ConstSettings.IAASettings.MARKET_TYPE == 2 or \ diff --git a/src/d3a/setup/d3a-settings.json b/src/d3a/setup/d3a-settings.json index 58acf2c48..7e6d7c49a 100644 --- a/src/d3a/setup/d3a-settings.json +++ b/src/d3a/setup/d3a-settings.json @@ -5,7 +5,7 @@ "tick_length": "15s", "market_count": 1, "cloud_coverage": 0, - "start_date": "2020-10-12" + "start_date": "2020-10-15" }, "advanced_settings": { "GeneralSettings": { @@ -21,7 +21,6 @@ "EXPORT_ENERGY_TRADE_PROFILE_HR": false, "EXPORT_OFFER_BID_TRADE_HR": false, "RUN_REAL_TIME": false, - "KEEP_PAST_MARKETS": false, "EVENT_DISPATCHING_VIA_REDIS": false, "RATE_CHANGE_PER_UPDATE_LIMIT": [ 0, @@ -188,8 +187,8 @@ 3 ], "PAY_AS_CLEAR_AGGREGATION_ALGORITHM": 1, - "MIN_OFFER_AGE": 0, - "MIN_BID_AGE": 0, + "MIN_OFFER_AGE": 2, + "MIN_BID_AGE": 2, "AlternativePricing": { "COMPARE_PRICING_SCHEMES": false, "PRICING_SCHEME": 0, diff --git a/tests/test_live_events.py b/tests/test_live_events.py index 3bc18b8f0..b434813ca 100644 --- a/tests/test_live_events.py +++ b/tests/test_live_events.py @@ -91,7 +91,9 @@ def test_update_area_event_is_updating_the_parameters_of_a_load(self): self.area_grid.activate() self.live_events.add_event(event_dict) + self.live_events.handle_all_events(self.area_grid) + self.area1.tick() assert self.area1.strategy.avg_power_W == 234 assert self.area1.strategy.hrs_per_day[0] == 6 assert self.area1.strategy.hrs_of_day == [0, 1, 2, 3, 4, 5, 6, 7] @@ -113,6 +115,7 @@ def test_update_area_event_is_updating_the_parameters_of_a_pv(self): self.live_events.add_event(event_dict) self.live_events.handle_all_events(self.area_grid) + self.area2.tick() assert self.area2.strategy.panel_count == 12 assert set(self.area2.strategy.offer_update.initial_rate.values()) == {68} assert set(self.area2.strategy.offer_update.final_rate.values()) == {42} @@ -136,6 +139,7 @@ def test_update_area_event_is_updating_the_parameters_of_a_storage(self): self.live_events.add_event(event_dict) self.live_events.handle_all_events(self.area_grid) + self.area3.tick() assert self.area3.strategy.cap_price_strategy is False assert set(self.area3.strategy.offer_update.initial_rate.values()) == {123} assert set(self.area3.strategy.offer_update.final_rate.values()) == {120} From f568c03360ec4fa6aca48b8bf93a6fa552c68924 Mon Sep 17 00:00:00 2001 From: faizan2590 Date: Fri, 16 Oct 2020 09:01:55 +0200 Subject: [PATCH 3/7] D3ASIM-2859: Moving strategy update imp to UpdateAreaEvent. --- src/d3a/d3a_core/live_events.py | 17 ++++++++++++++++ src/d3a/models/area/__init__.py | 36 +++++++-------------------------- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/d3a/d3a_core/live_events.py b/src/d3a/d3a_core/live_events.py index 2d072d20e..8c7939364 100644 --- a/src/d3a/d3a_core/live_events.py +++ b/src/d3a/d3a_core/live_events.py @@ -4,6 +4,9 @@ from d3a.d3a_core.area_serializer import area_from_dict from d3a.d3a_core.exceptions import D3AException from d3a.models.area.event_dispatcher import DispatcherFactory +from d3a_interface.utils import key_in_dict_and_not_none +from d3a.models.strategy.market_maker_strategy import MarketMakerStrategy +from d3a.models.strategy.infinite_bus import InfiniteBusStrategy class LiveEventException(D3AException): @@ -46,6 +49,20 @@ def __init__(self, area_uuid, area_params): def apply(self, area): if area.uuid != self.area_uuid: return False + if key_in_dict_and_not_none(self.area_params, 'type'): + if self.area_params['type'] == "MarketMaker": + strategy_obj = MarketMakerStrategy + del self.area_params['type'] + del self.area_params['number_of_clones'] + del self.area_params['energy_rate_profile_uuid'] + self.area_params = {'strategy_object': strategy_obj(**self.area_params)} + elif self.area_params['type'] == "InfiniteBus": + strategy_obj = InfiniteBusStrategy + del self.area_params['type'] + del self.area_params['number_of_clones'] + del self.area_params['energy_rate_profile_uuid'] + del self.area_params['buying_rate_profile_uuid'] + self.area_params = {'strategy_object': strategy_obj(**self.area_params)} area.area_reconfigure_event(**self.area_params) diff --git a/src/d3a/models/area/__init__.py b/src/d3a/models/area/__init__.py index 93d460861..1e6b57273 100644 --- a/src/d3a/models/area/__init__.py +++ b/src/d3a/models/area/__init__.py @@ -136,25 +136,14 @@ def restore_state(self, saved_state): self.stats.restore_state(saved_state) def area_reconfigure_event(self, **kwargs): - if key_in_dict_and_not_none(kwargs, 'type'): - from d3a.models.strategy.market_maker_strategy import MarketMakerStrategy - from d3a.models.strategy.infinite_bus import InfiniteBusStrategy - if kwargs['type'] == "MarketMaker": - strategy_obj = MarketMakerStrategy - del kwargs['type'] - del kwargs['number_of_clones'] - del kwargs['energy_rate_profile_uuid'] - self.str_buffer = strategy_obj(**kwargs) - elif kwargs['type'] == "InfiniteBus": - strategy_obj = InfiniteBusStrategy - del kwargs['type'] - del kwargs['number_of_clones'] - del kwargs['energy_rate_profile_uuid'] - del kwargs['buying_rate_profile_uuid'] - self.str_buffer = strategy_obj(**kwargs) + if key_in_dict_and_not_none(kwargs, 'strategy_object'): + self.strategy = kwargs['strategy_object'] + self.strategy.area = self.parent + self.strategy.owner = self + self.strategy.event_activate() + self.strategy.event_market_cycle() elif self.strategy is not None: - # self.strategy.area_reconfigure_event(**kwargs) - self.str_kwargs_buffer = kwargs + self.strategy.area_reconfigure_event(**kwargs) grid_fee_constant = kwargs["grid_fee_constant"] \ if key_in_dict_and_not_none(kwargs, 'grid_fee_constant') \ else self.grid_fee_constant @@ -342,17 +331,6 @@ def _consume_commands_from_aggregator(self): self.strategy.trigger_aggregator_commands) def tick(self): - if self.str_buffer is not None: - self.strategy = self.str_buffer - self.strategy.area = self.parent - self.strategy.owner = self - self.strategy.event_activate() - self.strategy.event_market_cycle() - self.str_buffer = None - elif self.str_kwargs_buffer is not None: - self.strategy.area_reconfigure_event(**self.str_kwargs_buffer) - self.str_kwargs_buffer = None - self._consume_commands_from_aggregator() if ConstSettings.IAASettings.MARKET_TYPE == 2 or \ From a7bf3cbc7bbc980caef3c571962a8e0a023f9b1b Mon Sep 17 00:00:00 2001 From: faizan2590 Date: Fri, 16 Oct 2020 10:13:15 +0200 Subject: [PATCH 4/7] D3ASIM-2859: Minor refactoring. --- src/d3a/d3a_core/live_events.py | 6 +++--- src/d3a/models/area/__init__.py | 2 -- tests/test_live_events.py | 4 ---- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/d3a/d3a_core/live_events.py b/src/d3a/d3a_core/live_events.py index 8c7939364..e91105357 100644 --- a/src/d3a/d3a_core/live_events.py +++ b/src/d3a/d3a_core/live_events.py @@ -53,17 +53,17 @@ def apply(self, area): if self.area_params['type'] == "MarketMaker": strategy_obj = MarketMakerStrategy del self.area_params['type'] - del self.area_params['number_of_clones'] del self.area_params['energy_rate_profile_uuid'] self.area_params = {'strategy_object': strategy_obj(**self.area_params)} elif self.area_params['type'] == "InfiniteBus": strategy_obj = InfiniteBusStrategy - del self.area_params['type'] - del self.area_params['number_of_clones'] del self.area_params['energy_rate_profile_uuid'] del self.area_params['buying_rate_profile_uuid'] self.area_params = {'strategy_object': strategy_obj(**self.area_params)} + del self.area_params['type'] + del self.area_params['number_of_clones'] + area.area_reconfigure_event(**self.area_params) return True diff --git a/src/d3a/models/area/__init__.py b/src/d3a/models/area/__init__.py index 7c8f0bb63..3a88217d1 100644 --- a/src/d3a/models/area/__init__.py +++ b/src/d3a/models/area/__init__.py @@ -117,8 +117,6 @@ def __init__(self, name: str = None, children: List["Area"] = None, log.debug(f"External connection {external_connection_available} for area {self.name}") self.redis_ext_conn = RedisMarketExternalConnection(self) \ if external_connection_available is True else None - self.str_buffer = None - self.str_kwargs_buffer = None def get_state(self): if self.strategy is not None: diff --git a/tests/test_live_events.py b/tests/test_live_events.py index b434813ca..3bc18b8f0 100644 --- a/tests/test_live_events.py +++ b/tests/test_live_events.py @@ -91,9 +91,7 @@ def test_update_area_event_is_updating_the_parameters_of_a_load(self): self.area_grid.activate() self.live_events.add_event(event_dict) - self.live_events.handle_all_events(self.area_grid) - self.area1.tick() assert self.area1.strategy.avg_power_W == 234 assert self.area1.strategy.hrs_per_day[0] == 6 assert self.area1.strategy.hrs_of_day == [0, 1, 2, 3, 4, 5, 6, 7] @@ -115,7 +113,6 @@ def test_update_area_event_is_updating_the_parameters_of_a_pv(self): self.live_events.add_event(event_dict) self.live_events.handle_all_events(self.area_grid) - self.area2.tick() assert self.area2.strategy.panel_count == 12 assert set(self.area2.strategy.offer_update.initial_rate.values()) == {68} assert set(self.area2.strategy.offer_update.final_rate.values()) == {42} @@ -139,7 +136,6 @@ def test_update_area_event_is_updating_the_parameters_of_a_storage(self): self.live_events.add_event(event_dict) self.live_events.handle_all_events(self.area_grid) - self.area3.tick() assert self.area3.strategy.cap_price_strategy is False assert set(self.area3.strategy.offer_update.initial_rate.values()) == {123} assert set(self.area3.strategy.offer_update.final_rate.values()) == {120} From 6b7ab7d4b31e1bf70e153da5502978085fabbbd6 Mon Sep 17 00:00:00 2001 From: faizan2590 Date: Mon, 19 Oct 2020 13:14:36 +0200 Subject: [PATCH 5/7] D3ASIM-2859: Adapting to PR comments and adding unittest to validate non-strategy areas cannot be switched to strategy area via UpdateAreaEvent. --- src/d3a/d3a_core/d3a_jobs.py | 2 +- src/d3a/d3a_core/live_events.py | 14 ++++---- src/d3a/models/area/__init__.py | 8 +++-- tests/test_live_events.py | 58 +++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 9 deletions(-) diff --git a/src/d3a/d3a_core/d3a_jobs.py b/src/d3a/d3a_core/d3a_jobs.py index d78c1a770..ad3258cb1 100644 --- a/src/d3a/d3a_core/d3a_jobs.py +++ b/src/d3a/d3a_core/d3a_jobs.py @@ -41,7 +41,7 @@ def decompress_and_decode_queued_strings(queued_string): @job('d3a') def start(scenario, settings, events, aggregator_device_mapping): - logging.getLogger().setLevel(logging.ERROR) + logging.getLogger().setLevel(logging.INFO) scenario = decompress_and_decode_queued_strings(scenario) logging.getLogger().error(f"Scenario details are : {0}: {scenario}") diff --git a/src/d3a/d3a_core/live_events.py b/src/d3a/d3a_core/live_events.py index e91105357..d3c244cd1 100644 --- a/src/d3a/d3a_core/live_events.py +++ b/src/d3a/d3a_core/live_events.py @@ -50,20 +50,22 @@ def apply(self, area): if area.uuid != self.area_uuid: return False if key_in_dict_and_not_none(self.area_params, 'type'): + if area.strategy is None: + return False if self.area_params['type'] == "MarketMaker": strategy_obj = MarketMakerStrategy del self.area_params['type'] - del self.area_params['energy_rate_profile_uuid'] + self.area_params.pop('number_of_clones', None) + self.area_params.pop('energy_rate_profile_uuid', None) self.area_params = {'strategy_object': strategy_obj(**self.area_params)} elif self.area_params['type'] == "InfiniteBus": strategy_obj = InfiniteBusStrategy - del self.area_params['energy_rate_profile_uuid'] - del self.area_params['buying_rate_profile_uuid'] + del self.area_params['type'] + self.area_params.pop('number_of_clones', None) + self.area_params.pop('energy_rate_profile_uuid', None) + self.area_params.pop('buying_rate_profile_uuid', None) self.area_params = {'strategy_object': strategy_obj(**self.area_params)} - del self.area_params['type'] - del self.area_params['number_of_clones'] - area.area_reconfigure_event(**self.area_params) return True diff --git a/src/d3a/models/area/__init__.py b/src/d3a/models/area/__init__.py index 3a88217d1..35da7582c 100644 --- a/src/d3a/models/area/__init__.py +++ b/src/d3a/models/area/__init__.py @@ -136,12 +136,16 @@ def restore_state(self, saved_state): def area_reconfigure_event(self, **kwargs): if key_in_dict_and_not_none(kwargs, 'strategy_object'): self.strategy = kwargs['strategy_object'] - self.strategy.area = self.parent - self.strategy.owner = self + self.activate() + # self.strategy.area = self.parent + # self.strategy.owner = self self.strategy.event_activate() self.strategy.event_market_cycle() + return elif self.strategy is not None: self.strategy.area_reconfigure_event(**kwargs) + return + grid_fee_constant = kwargs["grid_fee_constant"] \ if key_in_dict_and_not_none(kwargs, 'grid_fee_constant') \ else self.grid_fee_constant diff --git a/tests/test_live_events.py b/tests/test_live_events.py index 3bc18b8f0..ac11ac3f9 100644 --- a/tests/test_live_events.py +++ b/tests/test_live_events.py @@ -3,6 +3,8 @@ from d3a.models.strategy.load_hours import LoadHoursStrategy from d3a.models.strategy.pv import PVStrategy from d3a.models.strategy.storage import StorageStrategy +from d3a.models.strategy.market_maker_strategy import MarketMakerStrategy +from d3a.models.strategy.infinite_bus import InfiniteBusStrategy from d3a.models.area import Area from d3a.models.config import SimulationConfig from d3a.models.appliance.switchable import SwitchableAppliance @@ -169,6 +171,62 @@ def test_update_area_event_is_updating_the_parameters_of_an_area(self): assert self.area_house1.export_capacity_kWh == \ 765 * self.config.slot_length.total_minutes() / 60.0 + def test_update_area_event_can_switch_strategy_from_market_maker_to_infinite_bus(self): + self.strategy_mmr = MarketMakerStrategy(energy_rate=30) + self.area_mmr = Area("mmr", None, None, self.strategy_mmr, SwitchableAppliance(), + self.config, None, grid_fee_percentage=0) + self.area_mmr.parent = self.area_grid + self.area_grid.children.append(self.area_mmr) + + event_dict = { + "eventType": "update_area", + "area_uuid": self.area_mmr.uuid, + "area_representation": {'type': 'InfiniteBus'} + } + + self.area_grid.activate() + + self.live_events.add_event(event_dict) + self.live_events.handle_all_events(self.area_grid) + assert type(self.area_mmr.strategy) == InfiniteBusStrategy + + def test_update_area_event_can_switch_strategy_from_infinite_bus_to_market_maker(self): + self.strategy_mmr = InfiniteBusStrategy(energy_sell_rate=30, energy_buy_rate=25) + self.area_mmr = Area("mmr", None, None, self.strategy_mmr, SwitchableAppliance(), + self.config, None, grid_fee_percentage=0) + self.area_mmr.parent = self.area_grid + self.area_grid.children.append(self.area_mmr) + + event_dict = { + "eventType": "update_area", + "area_uuid": self.area_mmr.uuid, + "area_representation": {'type': 'MarketMaker'} + } + + self.area_grid.activate() + + self.live_events.add_event(event_dict) + self.live_events.handle_all_events(self.area_grid) + assert type(self.area_mmr.strategy) == MarketMakerStrategy + + def test_update_area_event_cannot_switch_non_strategy_area_to_any_strategy(self): + self.area_mmr = Area("mmr", None, None, None, SwitchableAppliance(), + self.config, None, grid_fee_percentage=0) + self.area_mmr.parent = self.area_grid + self.area_grid.children.append(self.area_mmr) + + event_dict = { + "eventType": "update_area", + "area_uuid": self.area_mmr.uuid, + "area_representation": {'type': 'MarketMaker'} + } + + self.area_grid.activate() + + self.live_events.add_event(event_dict) + self.live_events.handle_all_events(self.area_grid) + assert self.area_mmr.strategy is None + def test_create_area_event_failing_due_to_wrong_parameter_settings_no_exception_raised(self): event_dict = { "eventType": "create_area", From a0f6d4d9a7d2065d20a0720d298e31c24e120fb3 Mon Sep 17 00:00:00 2001 From: faizan2590 Date: Wed, 21 Oct 2020 19:17:26 +0200 Subject: [PATCH 6/7] D3ASIM-2859: Adapting to PR comments. --- src/d3a/d3a_core/d3a_jobs.py | 2 +- src/d3a/d3a_core/live_events.py | 26 +++++++++++++++----------- src/d3a/models/area/__init__.py | 12 ++---------- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/d3a/d3a_core/d3a_jobs.py b/src/d3a/d3a_core/d3a_jobs.py index ad3258cb1..d78c1a770 100644 --- a/src/d3a/d3a_core/d3a_jobs.py +++ b/src/d3a/d3a_core/d3a_jobs.py @@ -41,7 +41,7 @@ def decompress_and_decode_queued_strings(queued_string): @job('d3a') def start(scenario, settings, events, aggregator_device_mapping): - logging.getLogger().setLevel(logging.INFO) + logging.getLogger().setLevel(logging.ERROR) scenario = decompress_and_decode_queued_strings(scenario) logging.getLogger().error(f"Scenario details are : {0}: {scenario}") diff --git a/src/d3a/d3a_core/live_events.py b/src/d3a/d3a_core/live_events.py index d3c244cd1..48a7e51a8 100644 --- a/src/d3a/d3a_core/live_events.py +++ b/src/d3a/d3a_core/live_events.py @@ -49,27 +49,31 @@ def __init__(self, area_uuid, area_params): def apply(self, area): if area.uuid != self.area_uuid: return False + self.sanitize_live_event_paramters_for_strategy_update() if key_in_dict_and_not_none(self.area_params, 'type'): if area.strategy is None: return False if self.area_params['type'] == "MarketMaker": - strategy_obj = MarketMakerStrategy del self.area_params['type'] - self.area_params.pop('number_of_clones', None) - self.area_params.pop('energy_rate_profile_uuid', None) - self.area_params = {'strategy_object': strategy_obj(**self.area_params)} + area.strategy = MarketMakerStrategy(**self.area_params) elif self.area_params['type'] == "InfiniteBus": - strategy_obj = InfiniteBusStrategy del self.area_params['type'] - self.area_params.pop('number_of_clones', None) - self.area_params.pop('energy_rate_profile_uuid', None) - self.area_params.pop('buying_rate_profile_uuid', None) - self.area_params = {'strategy_object': strategy_obj(**self.area_params)} - - area.area_reconfigure_event(**self.area_params) + area.strategy = InfiniteBusStrategy(**self.area_params) + else: + return False + area.activate() + area.strategy.event_activate() + area.strategy.event_market_cycle() + else: + area.area_reconfigure_event(**self.area_params) return True + def sanitize_live_event_paramters_for_strategy_update(self): + self.area_params.pop('number_of_clones', None) + self.area_params.pop('energy_rate_profile_uuid', None) + self.area_params.pop('buying_rate_profile_uuid', None) + def __repr__(self): return f"" diff --git a/src/d3a/models/area/__init__.py b/src/d3a/models/area/__init__.py index b603d89d4..d308909a9 100644 --- a/src/d3a/models/area/__init__.py +++ b/src/d3a/models/area/__init__.py @@ -134,17 +134,9 @@ def restore_state(self, saved_state): self.stats.restore_state(saved_state) def area_reconfigure_event(self, **kwargs): - if key_in_dict_and_not_none(kwargs, 'strategy_object'): - self.strategy = kwargs['strategy_object'] - self.activate() - # self.strategy.area = self.parent - # self.strategy.owner = self - self.strategy.event_activate() - self.strategy.event_market_cycle() - return - elif self.strategy is not None: + if self.strategy is not None: self.strategy.area_reconfigure_event(**kwargs) - return + return True grid_fee_constant = kwargs["grid_fee_constant"] \ if key_in_dict_and_not_none(kwargs, 'grid_fee_constant') \ From 728da13979f653551d8ce30a0a76326082e0306e Mon Sep 17 00:00:00 2001 From: faizan2590 Date: Mon, 26 Oct 2020 17:58:17 +0100 Subject: [PATCH 7/7] D3ASIM-2859: Adapting to PR comment. --- src/d3a/d3a_core/live_events.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/d3a/d3a_core/live_events.py b/src/d3a/d3a_core/live_events.py index 48a7e51a8..b9fcb4d47 100644 --- a/src/d3a/d3a_core/live_events.py +++ b/src/d3a/d3a_core/live_events.py @@ -4,7 +4,6 @@ from d3a.d3a_core.area_serializer import area_from_dict from d3a.d3a_core.exceptions import D3AException from d3a.models.area.event_dispatcher import DispatcherFactory -from d3a_interface.utils import key_in_dict_and_not_none from d3a.models.strategy.market_maker_strategy import MarketMakerStrategy from d3a.models.strategy.infinite_bus import InfiniteBusStrategy @@ -50,14 +49,13 @@ def apply(self, area): if area.uuid != self.area_uuid: return False self.sanitize_live_event_paramters_for_strategy_update() - if key_in_dict_and_not_none(self.area_params, 'type'): + area_type = self.area_params.pop("type", None) + if area_type is not None: if area.strategy is None: return False - if self.area_params['type'] == "MarketMaker": - del self.area_params['type'] + if area_type == "MarketMaker": area.strategy = MarketMakerStrategy(**self.area_params) - elif self.area_params['type'] == "InfiniteBus": - del self.area_params['type'] + elif area_type == "InfiniteBus": area.strategy = InfiniteBusStrategy(**self.area_params) else: return False