예제 #1
0
    def _gather_device_statistics(cls, area: Area, subdict: Dict,
                                  flat_result_dict: Dict):
        if not hasattr(area.parent, "past_markets") or len(
                area.parent.past_markets) == 0:
            return None

        if area.strategy is not None:
            cls._device_price_stats(area, subdict)
            cls._device_energy_stats(area, subdict)

        if isinstance(area.strategy, PVStrategy):
            cls._pv_production_stats(area, subdict)

        elif isinstance(area.strategy, StorageStrategy):
            cls._soc_stats(area, subdict)

        elif isinstance(area.strategy, LoadHoursStrategy):
            cls._load_profile_stats(area, subdict)

        elif type(area.strategy) == FinitePowerPlant:
            market = list(area.parent.past_markets)[-1]
            create_or_update_subdict(
                subdict, "production_kWh",
                {market.time_slot: area.strategy.energy_per_slot_kWh})
            cls._calc_min_max_from_sim_dict(subdict, "production_kWh")

        flat_result_dict[area.uuid] = subdict.copy()
예제 #2
0
    def _calc_min_max_from_sim_dict(subdict: Dict, key: str):

        min_trade_stats_daily = {}
        max_trade_stats_daily = {}
        indict = subdict[key]

        trade_stats_daily = dict(
            (k.format(TIME_FORMAT), []) for k, v in indict.items())
        for time, value in indict.items():
            value = [] if value is None else value
            value = [value] if not isinstance(value, list) else value
            trade_stats_daily[time.format(TIME_FORMAT)] += value

        for time_str, value in trade_stats_daily.items():
            min_trade_stats_daily[time_str] = limit_float_precision(min(value)) \
                if len(value) > 0 else FILL_VALUE
            max_trade_stats_daily[time_str] = limit_float_precision(max(value)) \
                if len(value) > 0 else FILL_VALUE

        min_trade_stats = dict(
            (time, min_trade_stats_daily[time.format(TIME_FORMAT)])
            for time in indict.keys())
        max_trade_stats = dict(
            (time, max_trade_stats_daily[time.format(TIME_FORMAT)])
            for time in indict.keys())

        create_or_update_subdict(subdict, f"min_{key}", min_trade_stats)
        create_or_update_subdict(subdict, f"max_{key}", max_trade_stats)
예제 #3
0
    def _soc_stats(cls, area: Area, subdict: Dict):
        key_name = "soc_history_%"
        market = list(area.parent.past_markets)[-1]
        create_or_update_subdict(subdict, key_name, {
            market.time_slot:
            area.strategy.state.charge_history[market.time_slot]
        })

        cls._calc_min_max_from_sim_dict(subdict, key_name)
예제 #4
0
    def calculate_stats_for_device(cls, area, market, subdict):
        key_name = "trade_energy_kWh"
        traded_energy = 0
        for t in market.trades:
            if t.seller == area.name:
                traded_energy -= t.offer.energy
            if t.buyer == area.name:
                traded_energy += t.offer.energy

        create_or_update_subdict(subdict, key_name,
                                 {market.time_slot: traded_energy})
        cls._calc_min_max_from_sim_dict(subdict, key_name)
예제 #5
0
    def _pv_production_stats(cls, area: Area, subdict: Dict):
        key_name = "pv_production_kWh"
        market = list(area.parent.past_markets)[-1]

        create_or_update_subdict(
            subdict, key_name, {
                market.time_slot:
                area.strategy.energy_production_forecast_kWh.get(
                    market.time_slot, 0)
            })

        cls._calc_min_max_from_sim_dict(subdict, key_name)
예제 #6
0
    def _load_profile_stats(cls, area: Area, subdict: Dict):
        key_name = "load_profile_kWh"
        market = list(area.parent.past_markets)[-1]
        if market.time_slot in area.strategy.state.desired_energy_Wh:
            create_or_update_subdict(
                subdict, key_name, {
                    market.time_slot:
                    area.strategy.state.desired_energy_Wh.get(
                        market.time_slot, 0) / 1000.
                })
        else:
            create_or_update_subdict(subdict, key_name, {market.time_slot: 0})

        cls._calc_min_max_from_sim_dict(subdict, key_name)
예제 #7
0
    def _device_price_stats(cls, area: Area, subdict: Dict):
        key_name = "trade_price_eur"
        market = list(area.parent.past_markets)[-1]
        trade_price_list = []
        for t in market.trades:
            if t.seller == area.name or t.buyer == area.name:
                trade_price_list.append(t.offer.energy_rate / 100.0)

        if trade_price_list:
            create_or_update_subdict(subdict, key_name,
                                     {market.time_slot: trade_price_list})
        else:
            create_or_update_subdict(subdict, key_name,
                                     {market.time_slot: FILL_VALUE})

        cls._calc_min_max_from_sim_dict(subdict, key_name)
    def calculate_stats_for_device(cls, area_dict, subdict, core_stats,
                                   current_market_slot):
        key_name = "trade_energy_kWh"
        if core_stats[area_dict['uuid']] == {}:
            return
        area_core_trades = core_stats[area_dict['uuid']].get('trades', [])

        traded_energy = 0
        for t in area_core_trades:
            if t['seller'] == area_dict['name']:
                traded_energy -= t['energy']
            if t['buyer'] == area_dict['name']:
                traded_energy += t['energy']

        create_or_update_subdict(subdict, key_name,
                                 {current_market_slot: traded_energy})
        cls._calc_min_max_from_sim_dict(subdict, key_name)
예제 #9
0
    def calculate_stats_for_infinite_bus(cls, area, market, subdict):
        sold_key_name = "sold_trade_energy_kWh"
        bought_key_name = "bought_trade_energy_kWh"
        sold_traded_energy = 0
        bought_traded_energy = 0

        for t in market.trades:
            if t.seller == area.name:
                sold_traded_energy += t.offer.energy
            if t.buyer == area.name:
                bought_traded_energy += t.offer.energy

        create_or_update_subdict(subdict, sold_key_name,
                                 {market.time_slot: sold_traded_energy})
        cls._calc_min_max_from_sim_dict(subdict, sold_key_name)
        create_or_update_subdict(subdict, bought_key_name,
                                 {market.time_slot: bought_traded_energy})
        cls._calc_min_max_from_sim_dict(subdict, bought_key_name)
    def _device_price_stats(cls, area_dict: Dict, subdict: Dict, core_stats,
                            current_market_slot):
        key_name = "trade_price_eur"
        if core_stats[area_dict['uuid']] == {}:
            return
        area_core_trades = core_stats[area_dict['uuid']].get('trades', [])
        trade_price_list = []
        for t in area_core_trades:
            if t['seller'] == area_dict['name'] or t['buyer'] == area_dict[
                    'name']:
                trade_price_list.append(t['energy_rate'] / 100.0)
        if trade_price_list:
            create_or_update_subdict(subdict, key_name,
                                     {current_market_slot: trade_price_list})
        else:
            create_or_update_subdict(subdict, key_name,
                                     {current_market_slot: FILL_VALUE})

        cls._calc_min_max_from_sim_dict(subdict, key_name)
    def _populate_area_stats(cls,
                             area_dict: Dict,
                             subdict: Dict,
                             core_stats=None,
                             current_market_slot=None):
        key_name = cls._compute_key_name_for_node(area_dict)
        if not key_name:
            return

        if core_stats is None:
            core_stats = {}
        if core_stats[area_dict['uuid']] == {}:
            return

        create_or_update_subdict(
            subdict, key_name,
            {current_market_slot: core_stats[area_dict["uuid"]][key_name]})

        cls._calc_min_max_from_sim_dict(subdict, key_name)
    def calculate_stats_for_infinite_bus(cls, area_dict, subdict, core_stats,
                                         current_market_slot):
        sold_key_name = "sold_trade_energy_kWh"
        bought_key_name = "bought_trade_energy_kWh"
        sold_traded_energy = 0
        bought_traded_energy = 0
        if core_stats[area_dict['uuid']] == {}:
            return
        area_core_trades = core_stats[area_dict['uuid']].get('trades', [])

        for t in area_core_trades:
            if t['seller'] == area_dict['name']:
                sold_traded_energy += t['energy']
            if t['buyer'] == area_dict['name']:
                bought_traded_energy += t['energy']
        create_or_update_subdict(subdict, sold_key_name,
                                 {current_market_slot: sold_traded_energy})
        cls._calc_min_max_from_sim_dict(subdict, sold_key_name)
        create_or_update_subdict(subdict, bought_key_name,
                                 {current_market_slot: bought_traded_energy})
        cls._calc_min_max_from_sim_dict(subdict, bought_key_name)