Added water to water heat pump

This commit is contained in:
Peter Yefi 2021-12-15 09:19:10 +00:00
parent 179efbc4fb
commit 02882f5e1c
9 changed files with 241 additions and 220 deletions

View File

@ -6,7 +6,8 @@ Contributor Peter Yefi peteryefi@gmail.com
""" """
from city_model_structure.city_object import CityObject from city_model_structure.city_object import CityObject
from city_model_structure.energy_systems.heat_pump import HeatPump from city_model_structure.energy_systems.air_source_hp import AirSourceHP
from city_model_structure.energy_systems.water_to_water_hp import WaterToWaterHP
class EnergySystem(CityObject): class EnergySystem(CityObject):
@ -16,25 +17,43 @@ class EnergySystem(CityObject):
def __init__(self, name, lod, surfaces, city_lower_corner): def __init__(self, name, lod, surfaces, city_lower_corner):
super().__init__(name, lod, surfaces, city_lower_corner) super().__init__(name, lod, surfaces, city_lower_corner)
self._heat_pump = None self._air_source_hp = None
self._water_to_water_hp = None
self._type = 'energy_system' self._type = 'energy_system'
@property @property
def heat_pump(self) -> HeatPump: def air_source_hp(self) -> AirSourceHP:
""" """
Heat pump energy system Heat pump energy system
:return: :return:
""" """
return self._heat_pump return self._air_source_hp
@heat_pump.setter @air_source_hp.setter
def heat_pump(self, value): def air_source_hp(self, value):
""" """
Set heat pumm for energy system Set heat pump for energy system
:param value: HeatPump :param value: AirSourceHP
""" """
if self._heat_pump is None: if self._air_source_hp is None:
self._heat_pump = value self._air_source_hp = value
@property
def water_to_water_hp(self) -> WaterToWaterHP:
"""
Water to water heat pump energy system
:return:
"""
return self._water_to_water_hp
@water_to_water_hp.setter
def water_to_water_hp(self, value):
"""
Set water to water heat pump for energy system
:param value: WaterToWaterHP
"""
if self._water_to_water_hp is None:
self._water_to_water_hp = value
@property @property
def type(self) -> str: def type(self) -> str:

View File

@ -0,0 +1,190 @@
"""
heat_pump module defines a heat pump
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Contributor Peter Yefi peteryefi@gmail.com
"""
from typing import List
from typing import Dict
class HeatPump:
"""
HeatPump class
"""
def __init__(self):
self._model = None
self._cooling_capacity = None
self._cooling_comp_power = None
self._cooling_capacity_coff = None
self._cooling_comp_power_coff = None
self._heating_capacity = None
self._heating_comp_power = None
self._heating_capacity_coff = None
self._heating_comp_power_coff = None
@property
def model(self) -> str:
"""
Get model name
:return: str
"""
return self._model
@model.setter
def model(self, value):
"""
Set model (name, indicated in capacity)
:param value: str
"""
if self._model is None:
self._model = value
@property
def cooling_capacity(self) -> List[float]:
"""
Get cooling capacity in kW
:return: [[float]]
"""
return self._cooling_capacity
@cooling_capacity.setter
def cooling_capacity(self, value):
"""
Set cooling capacity in kW
:param value: [[float]]
"""
if self._cooling_capacity is None:
self._cooling_capacity = value
@property
def cooling_comp_power(self) -> List[float]:
"""
Get cooling compressor power input in kW
:return: [[float]]
"""
return self._cooling_comp_power
@cooling_comp_power.setter
def cooling_comp_power(self, value):
"""
Set the cooling compressor in kW
:param value: [[float]]
:return:
"""
if self._cooling_comp_power is None:
self._cooling_comp_power = value
@property
def cooling_capacity_coff(self) -> List[float]:
"""
Get cooling capacity coefficients
:return: [float]
"""
return self._cooling_capacity_coff
@cooling_capacity_coff.setter
def cooling_capacity_coff(self, value):
"""
Set the value for cooling capacity coefficients
:param value: [float]
:return:
"""
if self._cooling_capacity_coff is None:
self._cooling_capacity_coff = value
@property
def cooling_comp_power_coff(self) -> List[float]:
"""
Get cooling compressor power coefficients
:return: [float]
"""
return self._cooling_comp_power_coff
@cooling_comp_power_coff.setter
def cooling_comp_power_coff(self, value):
"""
Set the value for cooling compressor power coefficients
:param value: [float]
:return:
"""
if self._cooling_comp_power_coff is None:
self._cooling_comp_power_coff = value
@property
def heating_capacity(self) -> List[float]:
"""
Get heating capacity kW
:return: [[float]]
"""
return self._heating_capacity
@heating_capacity.setter
def heating_capacity(self, value):
"""
Set the heating capacity in kW
:param value: [[float]]
:return:
"""
if self._heating_capacity is None:
self._heating_capacity = value
@property
def heating_comp_power(self) -> List[float]:
"""
Get heating compressor power kW
:return: [[float]]
"""
return self._heating_comp_power
@heating_comp_power.setter
def heating_comp_power(self, value):
"""
Set the heating compressor power in kW
:param value: [[float]]
:return:
"""
if self._heating_comp_power is None:
self._heating_comp_power = value
@property
def heating_comp_power_coff(self) -> List[float]:
"""
Get heating compressor power coefficients
:return: [float]
"""
return self._heating_comp_power_coff
@heating_comp_power_coff.setter
def heating_comp_power_coff(self, value):
"""
Set the value for heating compressor power coefficients
:param value: [float]
:return:
"""
if self._heating_comp_power_coff is None:
self._heating_comp_power_coff = value
@property
def heating_capacity_coff(self) -> List[float]:
"""
Get heating capacity coefficients
:return: [float]
"""
return self._heating_capacity_coff
@heating_capacity_coff.setter
def heating_capacity_coff(self, value):
"""
Set the value for heating capacity coefficients
:param value: [float]
:return:
"""
if self._heating_capacity_coff is None:
self._heating_capacity_coff = value

View File

@ -1,190 +0,0 @@
"""
heat_pump module defines a heat pump
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
Contributor Peter Yefi peteryefi@gmail.com
"""
from typing import List
from typing import Dict
class HeatPump:
"""
HeatPump class
"""
def __init__(self):
self._model = None
self._cooling_capacity = None
self._cooling_comp_power = None
self._cooling_capacity_coff = None
self._cooling_comp_power_coff = None
self._heating_capacity = None
self._heating_comp_power = None
self._heating_capacity_coff = None
self._heating_comp_power_coff = None
@property
def model(self) -> str:
"""
Get model name
:return: str
"""
return self._model
@model.setter
def model(self, value):
"""
Set model (name, indicated in capacity)
:param value: str
"""
if self._model is None:
self._model = value
@property
def cooling_capacity(self) -> List[float]:
"""
Get cooling capacity in kW
:return: [[float]]
"""
return self._cooling_capacity
@cooling_capacity.setter
def cooling_capacity(self, value):
"""
Set cooling capacity in kW
:param value: [[float]]
"""
if self._cooling_capacity is None:
self._cooling_capacity = value
@property
def cooling_comp_power(self) -> List[float]:
"""
Get cooling compressor power input in kW
:return: [[float]]
"""
return self._cooling_comp_power
@cooling_comp_power.setter
def cooling_comp_power(self, value):
"""
Set the cooling compressor in kW
:param value: [[float]]
:return:
"""
if self._cooling_comp_power is None:
self._cooling_comp_power = value
@property
def cooling_capacity_coff(self) -> List[float]:
"""
Get cooling capacity coefficients
:return: [float]
"""
return self._cooling_capacity_coff
@cooling_capacity_coff.setter
def cooling_capacity_coff(self, value):
"""
Set the value for cooling capacity coefficients
:param value: [float]
:return:
"""
if self._cooling_capacity_coff is None:
self._cooling_capacity_coff = value
@property
def cooling_comp_power_coff(self) -> List[float]:
"""
Get cooling compressor power coefficients
:return: [float]
"""
return self._cooling_comp_power_coff
@cooling_comp_power_coff.setter
def cooling_comp_power_coff(self, value):
"""
Set the value for cooling compressor power coefficients
:param value: [float]
:return:
"""
if self._cooling_comp_power_coff is None:
self._cooling_comp_power_coff = value
@property
def heating_capacity(self) -> List[float]:
"""
Get heating capacity kW
:return: [[float]]
"""
return self._heating_capacity
@heating_capacity.setter
def heating_capacity(self, value):
"""
Set the heating capacity in kW
:param value: [[float]]
:return:
"""
if self._heating_capacity is None:
self._heating_capacity = value
@property
def heating_comp_power(self) -> List[float]:
"""
Get heating compressor power kW
:return: [[float]]
"""
return self._heating_comp_power
@heating_comp_power.setter
def heating_comp_power(self, value):
"""
Set the heating compressor power in kW
:param value: [[float]]
:return:
"""
if self._heating_comp_power is None:
self._heating_comp_power = value
@property
def heating_comp_power_coff(self) -> List[float]:
"""
Get heating compressor power coefficients
:return: [float]
"""
return self._heating_comp_power_coff
@heating_comp_power_coff.setter
def heating_comp_power_coff(self, value):
"""
Set the value for heating compressor power coefficients
:param value: [float]
:return:
"""
if self._heating_comp_power_coff is None:
self._heating_comp_power_coff = value
@property
def heating_capacity_coff(self) -> List[float]:
"""
Get heating capacity coefficients
:return: [float]
"""
return self._heating_capacity_coff
@heating_capacity_coff.setter
def heating_capacity_coff(self, value):
"""
Set the value for heating capacity coefficients
:param value: [float]
:return:
"""
if self._heating_capacity_coff is None:
self._heating_capacity_coff = value

View File

@ -1,13 +1,12 @@
""" """
XlsxHeatPumpParameters import the heat pump information AirSourceHeatPumpParameters import the heat pump information
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Peter Yefi peteryefi@gmail.com Copyright © 2021 Project Author Peter Yefi peteryefi@gmail.com
Contributor Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
import pandas as pd import pandas as pd
from typing import Dict from typing import Dict
from city_model_structure.energy_systems.heat_pump import HeatPump from city_model_structure.energy_systems.air_source_hp import AirSourceHP
from city_model_structure.energy_system import EnergySystem from city_model_structure.energy_system import EnergySystem
from scipy.optimize import curve_fit from scipy.optimize import curve_fit
import numpy as np import numpy as np
@ -15,14 +14,14 @@ from typing import List
import itertools import itertools
class XlsxHeatPumpParameters: class AirSourceHeatPumpParameters:
""" """
XlsxHeatPumpParameters class AirSourceHeatPumpParameters class
""" """
def __init__(self, city, base_path): def __init__(self, city, base_path):
self._city = city self._city = city
self._base_path = (base_path / 'heat_pumps/Air source.xlsx') self._base_path = (base_path / 'heat_pumps/air_source.xlsx')
def _read_file(self) -> Dict: def _read_file(self) -> Dict:
""" """
@ -31,6 +30,7 @@ class XlsxHeatPumpParameters:
:return : Dict :return : Dict
""" """
xl_file = pd.ExcelFile(self._base_path) xl_file = pd.ExcelFile(self._base_path)
heat_pump_dfs = {sheet_name: xl_file.parse(sheet_name) heat_pump_dfs = {sheet_name: xl_file.parse(sheet_name)
for sheet_name in xl_file.sheet_names} for sheet_name in xl_file.sheet_names}
@ -38,8 +38,10 @@ class XlsxHeatPumpParameters:
heating_data = {} heating_data = {}
for sheet, dataframe in heat_pump_dfs.items(): for sheet, dataframe in heat_pump_dfs.items():
if sheet == "Summary":
continue if 'Summary' in sheet:
continue
# Remove nan rows and columns and extract cooling and heating data # Remove nan rows and columns and extract cooling and heating data
# for each sheet # for each sheet
df = heat_pump_dfs[sheet].dropna(axis=1, how='all') df = heat_pump_dfs[sheet].dropna(axis=1, how='all')
@ -65,10 +67,10 @@ class XlsxHeatPumpParameters:
""" """
Enriches the city with information from file Enriches the city with information from file
""" """
heap_pump_data = self._read_file() heat_pump_data = self._read_file()
for (k_cool, v_cool), (k_heat, v_heat) in \ for (k_cool, v_cool), (k_heat, v_heat) in \
zip(heap_pump_data["cooling"].items(), heap_pump_data["heating"].items()): zip(heat_pump_data["cooling"].items(), heat_pump_data["heating"].items()):
heat_pump = HeatPump() heat_pump = AirSourceHP()
heat_pump.model = k_cool heat_pump.model = k_cool
h_data = self._extract_heat_pump_data(v_heat) h_data = self._extract_heat_pump_data(v_heat)
c_data = self._extract_heat_pump_data(v_cool) c_data = self._extract_heat_pump_data(v_cool)
@ -82,7 +84,7 @@ class XlsxHeatPumpParameters:
heat_pump.heating_comp_power_coff = self._compute_coefficients(h_data[1]) heat_pump.heating_comp_power_coff = self._compute_coefficients(h_data[1])
energy_system = EnergySystem('{} capacity heat pump'.format(heat_pump.model), 0, [], None) energy_system = EnergySystem('{} capacity heat pump'.format(heat_pump.model), 0, [], None)
energy_system.heat_pump = heat_pump energy_system.air_source_hp = heat_pump
self._city.add_city_object(energy_system) self._city.add_city_object(energy_system)
return self._city return self._city

View File

@ -7,7 +7,7 @@ import pandas as pd
from unittest import TestCase from unittest import TestCase
from imports.geometry_factory import GeometryFactory from imports.geometry_factory import GeometryFactory
from imports.energy_systems_factory import EnergySystemsFactory from imports.energy_systems_factory import EnergySystemsFactory
from city_model_structure.energy_systems.heat_pump import HeatPump from city_model_structure.energy_systems.air_source_hp import AirSourceHP
from exports.energy_systems_factory import EnergySystemsExportFactory from exports.energy_systems_factory import EnergySystemsExportFactory
import os import os
@ -25,15 +25,15 @@ class TestEnergySystemsFactory(TestCase):
city_file = "../unittests/tests_data/C40_Final.gml" city_file = "../unittests/tests_data/C40_Final.gml"
self._output_path = "../unittests/tests_data/user_output.csv" self._output_path = "../unittests/tests_data/user_output.csv"
self._city = GeometryFactory('citygml', city_file).city self._city = GeometryFactory('citygml', city_file).city
EnergySystemsFactory('xlsx heat pump', self._city).enrich() EnergySystemsFactory('air source hp', self._city).enrich()
def test_heat_pump_import(self): def test_air_source_heat_pump_import(self):
self.assertIsNotNone(self._city.energy_systems, 'City has energy systems') self.assertIsNotNone(self._city.energy_systems, 'City has energy systems')
self.assertIsInstance(self._city.energy_systems[0].heat_pump, HeatPump) self.assertIsInstance(self._city.energy_systems[0].air_source_hp, AirSourceHP)
self.assertEqual(self._city.energy_systems[0].heat_pump.model, '012') self.assertEqual(self._city.energy_systems[0].air_source_hp.model, '012')
self.assertEqual(self._city.energy_systems[len(self._city.energy_systems) - 1].heat_pump.model, '140') self.assertEqual(self._city.energy_systems[len(self._city.energy_systems) - 1].air_source_hp.model, '140')
def test_heat_pump_export(self): def test_air_source_heat_pump_export(self):
# User defined paramenters # User defined paramenters
user_input = { user_input = {
'StartYear': 2020, 'StartYear': 2020,