From 635c0162dcbc3bce09b3d5124299090634bddd50 Mon Sep 17 00:00:00 2001 From: p_monsalvete Date: Fri, 19 May 2023 15:04:02 -0400 Subject: [PATCH] added distribution_systems_electrical_consumption --- hub/city_model_structure/building.py | 79 ++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 4 deletions(-) diff --git a/hub/city_model_structure/building.py b/hub/city_model_structure/building.py index 04c4703a..4c92b4ec 100644 --- a/hub/city_model_structure/building.py +++ b/hub/city_model_structure/building.py @@ -51,6 +51,7 @@ class Building(CityObject): self._heating_consumption = dict() self._cooling_consumption = dict() self._domestic_hot_water_consumption = dict() + self._distribution_systems_electrical_consumption = dict() self._onsite_electrical_production = dict() self._eave_height = None self._energy_systems = None @@ -533,7 +534,7 @@ class Building(CityObject): @property def heating_consumption(self): """ - Get energy consumption for heating according to the heating system installed + Get energy consumption for heating according to the heating system installed in Wh return: dict """ if len(self._heating_consumption) == 0: @@ -547,7 +548,7 @@ class Building(CityObject): @property def cooling_consumption(self): """ - Get energy consumption for cooling according to the cooling system installed + Get energy consumption for cooling according to the cooling system installed in Wh return: dict """ if len(self._cooling_consumption) == 0: @@ -561,7 +562,7 @@ class Building(CityObject): @property def domestic_hot_water_consumption(self): """ - Get energy consumption for domestic according to the domestic hot water system installed + Get energy consumption for domestic according to the domestic hot water system installed in Wh return: dict """ if len(self._domestic_hot_water_consumption) == 0: @@ -572,6 +573,76 @@ class Building(CityObject): self._domestic_hot_water_consumption[domestic_hot_water_demand_key] = final_energy_consumed return self._domestic_hot_water_consumption + def _calculate_working_hours(self): + _working_hours = {} + for internal_zone in self.internal_zones: + for thermal_zone in internal_zone.thermal_zones: + _working_hours_per_thermal_zone = {} + for schedule in thermal_zone.thermal_control.hvac_availability_schedules: + _working_hours_per_schedule = [0] * len(schedule.values) + for i, value in enumerate(schedule.values): + if value > 0: + _working_hours_per_schedule[i] = 1 + for day_type in schedule.day_types: + _working_hours_per_thermal_zone[day_type] = _working_hours_per_schedule + if len(_working_hours) == 0: + _working_hours = _working_hours_per_thermal_zone + else: + for key in _working_hours.keys(): + saved_values = _working_hours_per_thermal_zone[key] + for i, value in enumerate(_working_hours[key]): + if saved_values[i] == 1: + _working_hours[key][i] = 1 + _total_hours = 0 + for key in _working_hours: + _total_hours += _working_hours[key] * cte.DAYS_A_YEAR[key] + return _total_hours + + @property + def distribution_systems_electrical_consumption(self): + """ + Get total electricity consumption for distribution and emission systems in Wh + return: dict + """ + if len(self._distribution_systems_electrical_consumption) == 0: + _peak_load = self.heating_peak_load[cte.YEAR]['heating peak loads'][0] + _peak_load_type = cte.HEATING + if _peak_load < self.cooling_peak_load[cte.YEAR]['cooling peak loads'][0]: + _peak_load = self.cooling_peak_load[cte.YEAR]['cooling peak loads'][0] + _peak_load_type = cte.COOLING + + _consumption_fix_flow = 0 + for energy_system in self.energy_systems: + emission_system = energy_system.emission_system.generic_emission_system + parasitic_energy_consumption = emission_system.parasitic_energy_consumption + distribution_system = energy_system.distribution_system.generic_distribution_system + consumption_variable_flow = distribution_system.distribution_consumption_variable_flow + for demand_type in energy_system.demand_types: + if demand_type.lower() == cte.HEATING: + if _peak_load_type == cte.HEATING: + _consumption_fix_flow = distribution_system.distribution_consumption_fix_flow + for heating_demand_key in self.heating: + _consumption = [0]*len(self.heating) + _demand = self.heating[heating_demand_key][cte.INSEL_MEB] + for i in range(0, len(_consumption)): + _consumption[i] += (parasitic_energy_consumption + consumption_variable_flow) * _demand[i] + self._distribution_systems_electrical_consumption[heating_demand_key] = _consumption + if demand_type.lower() == cte.COOLING: + if _peak_load_type == cte.COOLING: + _consumption_fix_flow = distribution_system.distribution_consumption_fix_flow + for demand_key in self.cooling: + _consumption = self._distribution_systems_electrical_consumption[demand_key] + _demand = self.cooling[demand_key][cte.INSEL_MEB] + for i in range(0, len(_consumption)): + _consumption[i] += (parasitic_energy_consumption + consumption_variable_flow) * _demand[i] + self._distribution_systems_electrical_consumption[demand_key] = _consumption + + for key in self._distribution_systems_electrical_consumption: + for i in range(0, len(self._distribution_systems_electrical_consumption[key])): + self._distribution_systems_electrical_consumption[key][i] += _peak_load * _consumption_fix_flow \ + * self._calculate_working_hours() + return self._distribution_systems_electrical_consumption + def _calculate_consumption(self, consumption_type, demand): # todo: modify when COP depends on the hour coefficient_of_performance = 0 @@ -597,7 +668,7 @@ class Building(CityObject): @property def onsite_electrical_production(self): """ - Get total electricity produced onsite + Get total electricity produced onsite in Wh return: dict """ # Add other systems whenever new ones appear