def __init__( self, panel_count: int = 1, initial_selling_rate: float = ConstSettings.GeneralSettings. DEFAULT_MARKET_MAKER_RATE, final_selling_rate: float = ConstSettings.PVSettings. FINAL_SELLING_RATE, fit_to_limit: bool = True, update_interval=duration( minutes=ConstSettings.GeneralSettings.DEFAULT_UPDATE_INTERVAL), energy_rate_decrease_per_update: float = ConstSettings. GeneralSettings.ENERGY_RATE_DECREASE_PER_UPDATE, max_panel_power_W: float = None, use_market_maker_rate: bool = False): """ :param panel_count: Number of solar panels for this PV plant :param initial_selling_rate: Upper Threshold for PV offers :param final_selling_rate: Lower Threshold for PV offers :param fit_to_limit: Linear curve following initial_selling_rate & initial_selling_rate :param update_interval: Interval after which PV will update its offer :param energy_rate_decrease_per_update: Slope of PV Offer change per update :param max_panel_power_W: """ # If use_market_maker_rate is true, overwrite initial_selling_rate to market maker rate if use_market_maker_rate: initial_selling_rate = GlobalConfig.market_maker_rate try: validate_pv_device(panel_count=panel_count, max_panel_power_W=max_panel_power_W) except D3ADeviceException as e: raise D3ADeviceException(str(e)) if isinstance(update_interval, int): update_interval = duration(minutes=update_interval) BaseStrategy.__init__(self) self.offer_update = UpdateFrequencyMixin( initial_selling_rate, final_selling_rate, fit_to_limit, energy_rate_decrease_per_update, update_interval) for time_slot in generate_market_slot_list(): try: validate_pv_device( initial_selling_rate=self.offer_update. initial_rate[time_slot], final_selling_rate=self.offer_update.final_rate[time_slot]) except D3ADeviceException as e: raise D3ADeviceException(str(e)) self.panel_count = panel_count self.final_selling_rate = final_selling_rate self.max_panel_power_W = max_panel_power_W self.energy_production_forecast_kWh = {} # type: Dict[Time, float] self.state = PVState()
def __init__(self, panel_count: int = 1, initial_selling_rate: float = ConstSettings.GeneralSettings. DEFAULT_MARKET_MAKER_RATE, final_selling_rate: float = ConstSettings.PVSettings. SELLING_RATE_RANGE.final, fit_to_limit: bool = True, update_interval=None, energy_rate_decrease_per_update=None, max_panel_power_W: float = None, use_market_maker_rate: bool = False): """ :param panel_count: Number of solar panels for this PV plant :param initial_selling_rate: Upper Threshold for PV offers :param final_selling_rate: Lower Threshold for PV offers :param fit_to_limit: Linear curve following initial_selling_rate & initial_selling_rate :param update_interval: Interval after which PV will update its offer :param energy_rate_decrease_per_update: Slope of PV Offer change per update :param max_panel_power_W: """ if update_interval is None: update_interval = \ duration(minutes=ConstSettings.GeneralSettings.DEFAULT_UPDATE_INTERVAL) self.use_market_maker_rate = use_market_maker_rate validate_pv_device( panel_count=panel_count, max_panel_power_W=max_panel_power_W, fit_to_limit=fit_to_limit, energy_rate_decrease_per_update=energy_rate_decrease_per_update) if isinstance(update_interval, int): update_interval = duration(minutes=update_interval) BaseStrategy.__init__(self) self.offer_update = UpdateFrequencyMixin( initial_selling_rate, final_selling_rate, fit_to_limit, energy_rate_decrease_per_update, update_interval) self.panel_count = panel_count self.final_selling_rate = final_selling_rate self.max_panel_power_W = max_panel_power_W self.energy_production_forecast_kWh = {} # type: Dict[Time, float] self.state = PVState()
def area_reconfigure_event(self, validate=True, **kwargs): assert all(k in self.parameters for k in kwargs.keys()) if validate: validate_pv_device(**kwargs) for name, value in kwargs.items(): setattr(self, name, value) if 'initial_selling_rate' in kwargs and kwargs[ 'initial_selling_rate'] is not None: self.offer_update.initial_rate = read_arbitrary_profile( InputProfileTypes.IDENTITY, kwargs['initial_selling_rate']) if 'final_selling_rate' in kwargs and kwargs[ 'final_selling_rate'] is not None: self.offer_update.final_rate = read_arbitrary_profile( InputProfileTypes.IDENTITY, kwargs['final_selling_rate']) self._validate_rates() self.produced_energy_forecast_kWh() self.offer_update.update_offer(self)
def test_pv_device_setting(self): self.assertIsNone(validate_pv_device(panel_count=1)) with self.assertRaises(D3ADeviceException): validate_pv_device(panel_count=-1) self.assertIsNone(validate_pv_device(final_selling_rate=0)) with self.assertRaises(D3ADeviceException): validate_pv_device(final_selling_rate=-1) self.assertIsNone(validate_pv_device(initial_selling_rate=0)) with self.assertRaises(D3ADeviceException): validate_pv_device(initial_selling_rate=-20) self.assertIsNone( validate_pv_device(initial_selling_rate=11, final_selling_rate=10)) with self.assertRaises(D3ADeviceException): validate_pv_device(initial_selling_rate=10, final_selling_rate=11) self.assertIsNone( validate_pv_device(fit_to_limit=False, energy_rate_decrease_per_update=2)) with self.assertRaises(D3ADeviceException): validate_pv_device(fit_to_limit=True, energy_rate_decrease_per_update=2) self.assertIsNone( validate_pv_device(energy_rate_decrease_per_update=0)) with self.assertRaises(D3ADeviceException): validate_pv_device(energy_rate_decrease_per_update=-1) self.assertIsNone(validate_pv_device(max_panel_power_W=0)) with self.assertRaises(D3ADeviceException): validate_pv_device(max_panel_power_W=-5) self.assertIsNone( validate_pv_device(cloud_coverage=4, power_profile="")) with self.assertRaises(D3ADeviceException): validate_pv_device(cloud_coverage=3, power_profile="") with self.assertRaises(D3ADeviceException): validate_pv_device(cloud_coverage=2, power_profile="")
def _validate_rates(self): for time_slot in generate_market_slot_list(): validate_pv_device( initial_selling_rate=self.offer_update.initial_rate[time_slot], final_selling_rate=self.offer_update.final_rate[time_slot])
def test_pv_device_setting_fails(failing_arguments): """The PV device validation fails when incompatible arguments are provided.""" with pytest.raises(D3ADeviceException): validate_pv_device(**failing_arguments)
def test_pv_device_setting_succeeds(valid_arguments): """The PV device validation succeeds when valid arguments are provided.""" assert validate_pv_device(**valid_arguments) is None