Esempio n. 1
0
def baa():
    lower_market = FakeBalancingMarket([BalancingOffer('id', pendulum.now(), 2, 2, 'other'),
                                        BalancingOffer('id', pendulum.now(), 2, -2, 'other')])
    higher_market = FakeBalancingMarket([])
    owner = FakeArea('owner')
    baa = BalancingAgent(owner=owner, lower_market=lower_market, higher_market=higher_market)
    return baa
Esempio n. 2
0
def baa2():
    lower_market = FakeBalancingMarket([
        BalancingOffer('id', 2, 0.2, 'other'),
        BalancingOffer('id', 2, -0.2, 'other')
    ])
    higher_market = FakeBalancingMarket([])
    owner = FakeArea('owner')
    baa = BalancingAgent(owner=owner,
                         lower_market=lower_market,
                         higher_market=higher_market)
    return baa
Esempio n. 3
0
    def balancing_offer(self, price: float, energy: float, seller: str,
                        original_offer_price=None, offer_id=None, from_agent: bool = False,
                        adapt_price_with_fees: bool = False, dispatch_event=True,
                        seller_origin=None, attributes: Dict = None,
                        requirements: List[Dict] = None) -> BalancingOffer:
        if seller not in DeviceRegistry.REGISTRY.keys() and not from_agent:
            raise DeviceNotInRegistryError(f"Device {seller} "
                                           f"not in registry ({DeviceRegistry.REGISTRY}).")
        if self.readonly:
            raise MarketReadOnlyException()
        if energy == 0:
            raise InvalidOffer()
        if adapt_price_with_fees:
            if self._is_constant_fees:
                price = price + self.fee_class.grid_fee_rate * energy
            else:
                price = price * (1 + self.fee_class.grid_fee_rate)

        if offer_id is None:
            offer_id = str(uuid.uuid4())

        offer = BalancingOffer(
            offer_id, self.now, price, energy, seller,
            seller_origin=seller_origin, attributes=attributes,
            requirements=requirements)
        self.offers[offer.id] = offer

        self.offer_history.append(offer)
        log.debug(f"[BALANCING_OFFER][NEW][{self.time_slot_str}] {offer}")
        if dispatch_event is True:
            self._notify_listeners(MarketEvent.BALANCING_OFFER, offer=offer)
        return offer
Esempio n. 4
0
    def balancing_offer(self,
                        price: float,
                        energy: float,
                        seller: str,
                        from_agent: bool = False,
                        iaa_fee: bool = False,
                        seller_origin=None) -> BalancingOffer:
        if seller not in DeviceRegistry.REGISTRY.keys() and not from_agent:
            raise DeviceNotInRegistryError(
                f"Device {seller} "
                f"not in registry ({DeviceRegistry.REGISTRY}).")
        if self.readonly:
            raise MarketReadOnlyException()
        if energy == 0:
            raise InvalidOffer()
        if iaa_fee:
            price = price * (
                1 + self.transfer_fee_ratio) + self.transfer_fee_const * energy

        offer = BalancingOffer(str(uuid.uuid4()),
                               price,
                               energy,
                               seller,
                               seller_origin=seller_origin)
        self.offers[offer.id] = offer
        self._sorted_offers = \
            sorted(self.offers.values(), key=lambda o: o.price / o.energy)
        self.offer_history.append(offer)
        log.debug(f"[BALANCING_OFFER][NEW][{self.time_slot_str}] {offer}")
        self._notify_listeners(MarketEvent.BALANCING_OFFER, offer=offer)
        return offer
Esempio n. 5
0
    def accept_offer(self, offer_or_id, buyer, energy=None, time=None,
                     trade_rate: float = None):
        if time is None:
            time = self.time_slot
        offer = offer_or_id
        if (offer.energy > 0 and energy < 0) or (offer.energy < 0 and energy > 0):
            raise InvalidBalancingTradeException("BalancingOffer and energy "
                                                 "are not compatible")

        if abs(energy) < abs(offer.energy):
            residual_energy = offer.energy - energy
            residual = BalancingOffer('res', pendulum.now(), offer.price, residual_energy,
                                      offer.seller)
            traded = BalancingOffer(offer.id, pendulum.now(), offer.price, energy, offer.seller)
            return BalancingTrade('trade_id', time, traded, traded.seller, buyer, residual)
        else:
            return BalancingTrade('trade_id', time, offer, offer.seller, buyer)
Esempio n. 6
0
 def balancing_offer(self,
                     price: float,
                     energy: float,
                     seller: str,
                     from_agent: bool = False) -> BalancingOffer:
     if seller not in DeviceRegistry.REGISTRY.keys() and not from_agent:
         raise DeviceNotInRegistryError(
             f"Device {seller} "
             f"not in registry ({DeviceRegistry.REGISTRY}).")
     if self.readonly:
         raise MarketReadOnlyException()
     if energy == 0:
         raise InvalidOffer()
     offer = BalancingOffer(str(uuid.uuid4()), price, energy, seller, self)
     self.offers[offer.id] = offer
     self._sorted_offers = \
         sorted(self.offers.values(), key=lambda o: o.price / o.energy)
     log.info(f"[BALANCING_OFFER][NEW][{self.time_slot_str}] {offer}")
     self._notify_listeners(MarketEvent.BALANCING_OFFER, offer=offer)
     return offer
 def balancing_offer(self, price, energy, seller):
     offer = BalancingOffer('id', price, energy, seller)
     self.created_balancing_offers.append(offer)
     offer.id = 'id'
     return offer
Esempio n. 8
0
 def balancing_offer(self, price, energy, seller, market=None):
     offer = BalancingOffer('id', now(), price, energy, seller, market)
     self.created_balancing_offers.append(offer)
     offer.id = 'id'
     return offer