Exemple #1
0
    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()
Exemple #2
0
    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()
Exemple #3
0
    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)
Exemple #4
0
    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="")
Exemple #5
0
 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