Merge remote-tracking branch 'origin/master'

This commit is contained in:
Guille Gutierrez 2021-06-03 16:26:08 -04:00
commit 8def8ece2d
34 changed files with 161 additions and 127 deletions

View File

@ -207,7 +207,7 @@ class ThermalZone:
@property @property
def usage_zones(self) -> List[UsageZone]: def usage_zones(self) -> List[UsageZone]:
""" """
Get thermal zone usages zones Get thermal zone usage zones
:return: [UsageZone] :return: [UsageZone]
""" """
return self._usage_zones return self._usage_zones
@ -215,7 +215,7 @@ class ThermalZone:
@usage_zones.setter @usage_zones.setter
def usage_zones(self, values): def usage_zones(self, values):
""" """
Set thermal zone usages zones Set thermal zone usage zones
:param values: [UsageZone] :param values: [UsageZone]
:return: None :return: None
""" """

View File

@ -52,7 +52,7 @@ class UsageZone:
@property @property
def internal_gains(self) -> List[InternalGains]: def internal_gains(self) -> List[InternalGains]:
""" """
Get usages zone internal gains Get usage zone internal gains
:return: [InternalGains] :return: [InternalGains]
""" """
return self._internal_gains return self._internal_gains
@ -60,7 +60,7 @@ class UsageZone:
@internal_gains.setter @internal_gains.setter
def internal_gains(self, value): def internal_gains(self, value):
""" """
Set usages zone internal gains Set usage zone internal gains
:param value: [InternalGains] :param value: [InternalGains]
:return: None :return: None
""" """
@ -69,7 +69,7 @@ class UsageZone:
@property @property
def heating_setpoint(self): def heating_setpoint(self):
""" """
Get usages zone heating set point in celsius grads Get usage zone heating set point in celsius grads
:return: float :return: float
""" """
return self._heating_setpoint return self._heating_setpoint
@ -77,7 +77,7 @@ class UsageZone:
@heating_setpoint.setter @heating_setpoint.setter
def heating_setpoint(self, value): def heating_setpoint(self, value):
""" """
Set usages zone heating set point in celsius grads Set usage zone heating set point in celsius grads
:param value: float :param value: float
:return: None :return: None
""" """
@ -86,7 +86,7 @@ class UsageZone:
@property @property
def heating_setback(self): def heating_setback(self):
""" """
Get usages zone heating setback in celsius grads Get usage zone heating setback in celsius grads
:return: float :return: float
""" """
return self._heating_setback return self._heating_setback
@ -94,7 +94,7 @@ class UsageZone:
@heating_setback.setter @heating_setback.setter
def heating_setback(self, value): def heating_setback(self, value):
""" """
Set usages zone heating setback in celsius grads Set usage zone heating setback in celsius grads
:param value: float :param value: float
:return: None :return: None
""" """
@ -103,7 +103,7 @@ class UsageZone:
@property @property
def cooling_setpoint(self): def cooling_setpoint(self):
""" """
Get usages zone cooling setpoint in celsius grads Get usage zone cooling setpoint in celsius grads
:return: float :return: float
""" """
return self._cooling_setpoint return self._cooling_setpoint
@ -111,7 +111,7 @@ class UsageZone:
@cooling_setpoint.setter @cooling_setpoint.setter
def cooling_setpoint(self, value): def cooling_setpoint(self, value):
""" """
Set usages zone cooling setpoint in celsius grads Set usage zone cooling setpoint in celsius grads
:param value: float :param value: float
:return: None :return: None
""" """
@ -120,7 +120,7 @@ class UsageZone:
@property @property
def hours_day(self): def hours_day(self):
""" """
Get usages zone usages hours per day Get usage zone usage hours per day
:return: float :return: float
""" """
return self._hours_day return self._hours_day
@ -128,7 +128,7 @@ class UsageZone:
@hours_day.setter @hours_day.setter
def hours_day(self, value): def hours_day(self, value):
""" """
Set usages zone usages hours per day Set usage zone usage hours per day
:param value: float :param value: float
:return: float :return: float
""" """
@ -137,7 +137,7 @@ class UsageZone:
@property @property
def days_year(self): def days_year(self):
""" """
Get usages zone usages days per year Get usage zone usage days per year
:return: float :return: float
""" """
return self._days_year return self._days_year
@ -145,7 +145,7 @@ class UsageZone:
@days_year.setter @days_year.setter
def days_year(self, value): def days_year(self, value):
""" """
Set usages zone usages days per year Set usage zone usage days per year
:param value: float :param value: float
:return: None :return: None
""" """
@ -154,7 +154,7 @@ class UsageZone:
@property @property
def mechanical_air_change(self): def mechanical_air_change(self):
""" """
Set usages zone mechanical air change in air change per hour (ACH) Set usage zone mechanical air change in air change per hour (ACH)
:return: float :return: float
""" """
return self._mechanical_air_change return self._mechanical_air_change
@ -162,7 +162,7 @@ class UsageZone:
@mechanical_air_change.setter @mechanical_air_change.setter
def mechanical_air_change(self, value): def mechanical_air_change(self, value):
""" """
Get usages zone mechanical air change in air change per hour (ACH) Get usage zone mechanical air change in air change per hour (ACH)
:param value: float :param value: float
:return: None :return: None
""" """
@ -171,7 +171,7 @@ class UsageZone:
@property @property
def usage(self): def usage(self):
""" """
Get usages zone usages Get usage zone usage
:return: str :return: str
""" """
return self._usage return self._usage
@ -179,7 +179,7 @@ class UsageZone:
@usage.setter @usage.setter
def usage(self, value): def usage(self, value):
""" """
Get usages zone usages Get usage zone usage
:param value: str :param value: str
:return: None :return: None
""" """

View File

@ -120,7 +120,7 @@ class Building(CityObject):
@property @property
def usage_zones(self) -> List[UsageZone]: def usage_zones(self) -> List[UsageZone]:
""" """
Get city object usages zones Get city object usage zones
:return: [UsageZone] :return: [UsageZone]
""" """
return self._usage_zones return self._usage_zones
@ -128,7 +128,7 @@ class Building(CityObject):
@usage_zones.setter @usage_zones.setter
def usage_zones(self, values): def usage_zones(self, values):
""" """
Set city objects usages zones Set city objects usage zones
:param values: [UsageZones] :param values: [UsageZones]
:return: None :return: None
""" """

View File

@ -44,6 +44,7 @@ class City:
self._buildings_clusters = None self._buildings_clusters = None
self._parts_consisting_buildings = None self._parts_consisting_buildings = None
self._city_objects_clusters = None self._city_objects_clusters = None
self._city_objects = None
def _get_location(self) -> Location: def _get_location(self) -> Location:
if self._location is None: if self._location is None:
@ -97,7 +98,15 @@ class City:
City objects belonging to the city City objects belonging to the city
:return: None or [CityObject] :return: None or [CityObject]
""" """
return self.buildings if self._city_objects is None:
if self.city_objects_clusters is None:
self._city_objects = []
else:
self._city_objects = self.city_objects_clusters
if self.buildings is not None:
for building in self.buildings:
self._city_objects.append(building)
return self._city_objects
@property @property
def buildings(self) -> Union[List[Building], None]: def buildings(self) -> Union[List[Building], None]:
@ -171,7 +180,6 @@ class City:
else: else:
raise NotImplementedError(new_city_object.type) raise NotImplementedError(new_city_object.type)
def remove_city_object(self, city_object): def remove_city_object(self, city_object):
""" """
Remove a CityObject from the city Remove a CityObject from the city
@ -313,6 +321,12 @@ class City:
City objects clusters belonging to the city City objects clusters belonging to the city
:return: None or [CityObjectsCluster] :return: None or [CityObjectsCluster]
""" """
if self.buildings_clusters is None:
self._city_objects_clusters = []
else:
self._city_objects_clusters = self.buildings_clusters
if self.parts_consisting_buildings is not None:
self._city_objects_clusters.append(self.parts_consisting_buildings)
return self._city_objects_clusters return self._city_objects_clusters
def add_city_objects_cluster(self, new_city_objects_cluster): def add_city_objects_cluster(self, new_city_objects_cluster):
@ -321,7 +335,6 @@ class City:
:param new_city_objects_cluster:CityObjectsCluster :param new_city_objects_cluster:CityObjectsCluster
:return: None :return: None
""" """
print(new_city_objects_cluster.type)
if new_city_objects_cluster.type == 'buildings': if new_city_objects_cluster.type == 'buildings':
if self._buildings_clusters is None: if self._buildings_clusters is None:
self._buildings_clusters = [] self._buildings_clusters = []

View File

@ -5,9 +5,12 @@ Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.mons
""" """
from abc import ABC from abc import ABC
from typing import List
from city_model_structure.attributes.sensor import Sensor
from city_model_structure.city_object import CityObject
class CityObjectsCluster(ABC): class CityObjectsCluster(ABC, CityObject):
""" """
CityObjectsCluster(ABC) class CityObjectsCluster(ABC) class
""" """
@ -15,6 +18,9 @@ class CityObjectsCluster(ABC):
self._name = name self._name = name
self._cluster_type = cluster_type self._cluster_type = cluster_type
self._city_objects = city_objects self._city_objects = city_objects
self._sensors = []
self._lod = ''
super(ABC, self).__init__(name, self._lod, None, None)
@property @property
def name(self): def name(self):
@ -34,3 +40,19 @@ class CityObjectsCluster(ABC):
else: else:
self._city_objects.append(city_object) self._city_objects.append(city_object)
return self._city_objects return self._city_objects
@property
def sensors(self) -> List[Sensor]:
"""
Sensor list belonging to the city objects cluster
:return: [Sensor]
"""
return self._sensors
@sensors.setter
def sensors(self, value):
"""
Sensor list belonging to the city objects cluster
:param value: [Sensor]
"""
self._sensors = value

View File

@ -166,7 +166,7 @@ class EnergyAde:
def _building_geometry(self, building, building_dic, city): def _building_geometry(self, building, building_dic, city):
building_dic['bldg:Building']['bldg:function'] = building.function building_dic['bldg:Building']['bldg:function'] = building.function
building_dic['bldg:Building']['bldg:usages'] = ', '.join([u.usage for u in building.usage_zones]) building_dic['bldg:Building']['bldg:usage'] = ', '.join([u.usage for u in building.usage_zones])
building_dic['bldg:Building']['bldg:yearOfConstruction'] = building.year_of_construction building_dic['bldg:Building']['bldg:yearOfConstruction'] = building.year_of_construction
building_dic['bldg:Building']['bldg:roofType'] = building.roof_type building_dic['bldg:Building']['bldg:roofType'] = building.roof_type
building_dic['bldg:Building']['bldg:measuredHeight'] = { building_dic['bldg:Building']['bldg:measuredHeight'] = {

View File

@ -116,7 +116,7 @@ class Idf:
def _add_heating_system(self, building): def _add_heating_system(self, building):
for usage_zone in building.usage_zones: for usage_zone in building.usage_zones:
thermostat_name = f'Thermostat {building.name}' thermostat_name = f'Thermostat {building.name}'
# todo: this will fail for more than one usages zone # todo: this will fail for more than one usage zone
static_thermostat = self._idf.newidfobject(self._THERMOSTAT, static_thermostat = self._idf.newidfobject(self._THERMOSTAT,
Name=thermostat_name, Name=thermostat_name,
Constant_Heating_Setpoint=usage_zone.heating_setpoint, Constant_Heating_Setpoint=usage_zone.heating_setpoint,

View File

@ -5,8 +5,8 @@ Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es
""" """
import sys import sys
from imports.constructions.nrel_physics_interface import NrelPhysicsInterface from imports.construction.nrel_physics_interface import NrelPhysicsInterface
from imports.constructions.helpers.construction_helper import ConstructionHelper from imports.construction.helpers.construction_helper import ConstructionHelper
class CaPhysicsParameters(NrelPhysicsInterface): class CaPhysicsParameters(NrelPhysicsInterface):

View File

@ -4,7 +4,7 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es
""" """
from typing import List from typing import List
from imports.constructions.data_classes.nrel_thermal_boundary_archetype import NrelThermalBoundaryArchetype from imports.construction.data_classes.nrel_thermal_boundary_archetype import NrelThermalBoundaryArchetype
class NrelBuildingArchetype: class NrelBuildingArchetype:

View File

@ -5,8 +5,8 @@ Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es
""" """
from typing import List from typing import List
from imports.constructions.data_classes.nrel_layer_archetype import NrelLayerArchetype from imports.construction.data_classes.nrel_layer_archetype import NrelLayerArchetype
from imports.constructions.data_classes.nrel_thermal_opening_archetype import NrelThermalOpeningArchetype from imports.construction.data_classes.nrel_thermal_opening_archetype import NrelThermalOpeningArchetype
class NrelThermalBoundaryArchetype: class NrelThermalBoundaryArchetype:

View File

@ -6,10 +6,10 @@ Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es
""" """
import xmltodict import xmltodict
from imports.constructions.data_classes.nrel_building_achetype import NrelBuildingArchetype as nba from imports.construction.data_classes.nrel_building_achetype import NrelBuildingArchetype as nba
from imports.constructions.data_classes.nrel_thermal_boundary_archetype import NrelThermalBoundaryArchetype as ntba from imports.construction.data_classes.nrel_thermal_boundary_archetype import NrelThermalBoundaryArchetype as ntba
from imports.constructions.data_classes.nrel_thermal_opening_archetype import NrelThermalOpeningArchetype as ntoa from imports.construction.data_classes.nrel_thermal_opening_archetype import NrelThermalOpeningArchetype as ntoa
from imports.constructions.data_classes.nrel_layer_archetype import NrelLayerArchetype as nla from imports.construction.data_classes.nrel_layer_archetype import NrelLayerArchetype as nla
class NrelPhysicsInterface: class NrelPhysicsInterface:
@ -59,7 +59,7 @@ class NrelPhysicsInterface:
raise Exception(f'infiltration rate for ventilation when system on units = {units}, expected ACH') raise Exception(f'infiltration rate for ventilation when system on units = {units}, expected ACH')
thermal_boundary_archetypes = [] thermal_boundary_archetypes = []
for construction in archetype['constructions']['construction']: for construction in archetype['construction']['construction']:
construction_type = construction['@type'] construction_type = construction['@type']
construction_id = construction['@id'] construction_id = construction['@id']

View File

@ -6,8 +6,8 @@ Contributors Pilar Monsalvete pilar_monsalvete@yahoo.es
""" """
import sys import sys
from imports.constructions.nrel_physics_interface import NrelPhysicsInterface from imports.construction.nrel_physics_interface import NrelPhysicsInterface
from imports.constructions.helpers.construction_helper import ConstructionHelper from imports.construction.helpers.construction_helper import ConstructionHelper
from city_model_structure.attributes.layer import Layer from city_model_structure.attributes.layer import Layer
from city_model_structure.attributes.material import Material from city_model_structure.attributes.material import Material

View File

@ -3,8 +3,8 @@ ConstructionFactory (before PhysicsFactory) retrieve the specific construction m
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
from imports.constructions.us_physics_parameters import UsPhysicsParameters from imports.construction.us_physics_parameters import UsPhysicsParameters
from imports.constructions.ca_physics_parameters import CaPhysicsParameters from imports.construction.ca_physics_parameters import CaPhysicsParameters
from pathlib import Path from pathlib import Path

View File

@ -245,7 +245,7 @@ class GeometryHelper:
'large office': 'large office' 'large office': 'large office'
} }
# usages # usage
fuction_to_usage = { fuction_to_usage = {
'full service restaurant': 'restaurant', 'full service restaurant': 'restaurant',
'highrise apartment': 'residential', 'highrise apartment': 'residential',
@ -288,7 +288,7 @@ class GeometryHelper:
@staticmethod @staticmethod
def usage_from_function(building_function): def usage_from_function(building_function):
""" """
Get the internal usages for the given internal building function Get the internal usage for the given internal building function
:param building_function: str :param building_function: str
:return: str :return: str
""" """

View File

@ -1,5 +1,5 @@
""" """
Schedules retrieve the specific usages schedules module for the given standard Schedules retrieve the specific usage schedules module for the given standard
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
contributors Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca contributors Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca

View File

@ -24,7 +24,7 @@ class SchedulesHelper:
@staticmethod @staticmethod
def comnet_from_usage(usage): def comnet_from_usage(usage):
""" """
Get Comnet usages from the given internal usages key Get Comnet usage from the given internal usage key
:param usage: str :param usage: str
:return: str :return: str
""" """

View File

@ -14,8 +14,6 @@ class ConcordiaEnergyConsumption(ConcordiaFileReport):
super().__init__(city, end_point, base_path, 'concordia_energy_db.json') super().__init__(city, end_point, base_path, 'concordia_energy_db.json')
for city_object in city.city_objects: for city_object in city.city_objects:
self._assign_sensor_to_object(city_object) self._assign_sensor_to_object(city_object)
for city_object_cluster in city.city_objects_cluster:
self._assign_sensor_to_object(city_object_cluster)
def _assign_sensor_to_object(self, obj): def _assign_sensor_to_object(self, obj):
for i in range(len(self._city_object)): for i in range(len(self._city_object)):
@ -25,7 +23,7 @@ class ConcordiaEnergyConsumption(ConcordiaFileReport):
building_energy_consumption = pd.concat(building_measures, keys=building_headers, axis=1) building_energy_consumption = pd.concat(building_measures, keys=building_headers, axis=1)
sensor = ConcordiaEnergySensor(self._sensors[i]) sensor = ConcordiaEnergySensor(self._sensors[i])
sensor_exist = False sensor_exist = False
for j in range(len(object.sensors)): for j in range(len(obj.sensors)):
if obj.sensors[j].name is sensor.name: if obj.sensors[j].name is sensor.name:
obj.sensors[j].add_period(building_energy_consumption) obj.sensors[j].add_period(building_energy_consumption)
sensor_exist = True sensor_exist = True

View File

@ -10,10 +10,12 @@ from pathlib import Path
import pandas as pd import pandas as pd
from city_model_structure.attributes.concordia_energy_sensor import ConcordiaEnergySensor from city_model_structure.attributes.concordia_energy_sensor import ConcordiaEnergySensor
class ConcordiaFileReport: class ConcordiaFileReport:
def __init__(self, city, end_point, base_path, db_file): def __init__(self, city, end_point, base_path, db_file):
self._city_object = [] self._city_object = []
self._city_objects_cluster = []
self._sensors = [] self._sensors = []
self._sensor_point = {} self._sensor_point = {}
self._city = city self._city = city

View File

@ -13,19 +13,21 @@ class ConcordiaGasFlow(ConcordiaFileReport):
def __init__(self, city, end_point, base_path): def __init__(self, city, end_point, base_path):
super().__init__(city, end_point, base_path, 'concordia_gas_flow_db.json') super().__init__(city, end_point, base_path, 'concordia_gas_flow_db.json')
for city_object in city.city_objects: for city_object in city.city_objects:
self._assign_sensor_to_object(city_object)
def _assign_sensor_to_object(self, obj):
for i in range(len(self._city_object)): for i in range(len(self._city_object)):
if self._city_object[i] == city_object.name and self._sensors[i] in self._sensor_point: if self._city_object[i] == obj.name and self._sensors[i] in self._sensor_point:
building_measures = [self._measures["Date time"], self._measures[self._sensor_point[self._sensors[i]]]] building_measures = [self._measures["Date time"], self._measures[self._sensor_point[self._sensors[i]]]]
building_headers = ["Date time", "Gas Flow Cumulative Monthly"] building_headers = ["Date time", "Gas Flow Cumulative Monthly"]
building_gas_flow = pd.concat(building_measures, keys=building_headers, axis=1) building_energy_consumption = pd.concat(building_measures, keys=building_headers, axis=1)
sensor = ConcordiaGasFlowSensor(self._sensors[i]) sensor = ConcordiaGasFlowSensor(self._sensors[i])
sensor_exist = False sensor_exist = False
for j in range(len(city_object.sensors)): for j in range(len(obj.sensors)):
if city_object.sensors[j].name is sensor.name: if obj.sensors[j].name is sensor.name:
city_object.sensors[j].add_period(building_gas_flow) obj.sensors[j].add_period(building_energy_consumption)
sensor_exist = True sensor_exist = True
break break
if not sensor_exist: if not sensor_exist:
sensor.add_period(building_gas_flow) sensor.add_period(building_energy_consumption)
city_object.sensors.append(sensor) obj.sensors.append(sensor)

View File

@ -13,19 +13,21 @@ class ConcordiaTemperature(ConcordiaFileReport):
def __init__(self, city, end_point, base_path): def __init__(self, city, end_point, base_path):
super().__init__(city, end_point, base_path, 'concordia_temperature_db.json') super().__init__(city, end_point, base_path, 'concordia_temperature_db.json')
for city_object in city.city_objects: for city_object in city.city_objects:
self._assign_sensor_to_object(city_object)
def _assign_sensor_to_object(self, obj):
for i in range(len(self._city_object)): for i in range(len(self._city_object)):
if self._city_object[i] == city_object.name and self._sensors[i] in self._sensor_point: if self._city_object[i] == obj.name and self._sensors[i] in self._sensor_point:
building_measures = [self._measures["Date time"], self._measures[self._sensor_point[self._sensors[i]]]] building_measures = [self._measures["Date time"], self._measures[self._sensor_point[self._sensors[i]]]]
building_headers = ["Date time", "Temperature"] building_headers = ["Date time", "Temperature"]
building_temperature = pd.concat(building_measures, keys=building_headers, axis=1) building_energy_consumption = pd.concat(building_measures, keys=building_headers, axis=1)
sensor = ConcordiaTemperatureSensor(self._sensors[i]) sensor = ConcordiaTemperatureSensor(self._sensors[i])
sensor_exist = False sensor_exist = False
for j in range(len(city_object.sensors)): for j in range(len(obj.sensors)):
if city_object.sensors[j].name is sensor.name: if obj.sensors[j].name is sensor.name:
city_object.sensors[j].add_period(building_temperature) obj.sensors[j].add_period(building_energy_consumption)
sensor_exist = True sensor_exist = True
break break
if not sensor_exist: if not sensor_exist:
sensor.add_period(building_temperature) sensor.add_period(building_energy_consumption)
city_object.sensors.append(sensor) obj.sensors.append(sensor)

View File

@ -31,7 +31,7 @@ class SensorsFactory:
def enrich(self): def enrich(self):
""" """
Enrich the city with the usages information Enrich the city with the usage information
:return: None :return: None
""" """
getattr(self, self._handler, lambda: None)() getattr(self, self._handler, lambda: None)()

View File

@ -1,10 +1,10 @@
""" """
HftUsageZoneArchetype stores usages information by building archetypes HftUsageZoneArchetype stores usage information by building archetypes
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es Copyright © 2020 Project Author Pilar Monsalvete pilar_monsalvete@yahoo.es
""" """
from typing import List from typing import List
from imports.usages.data_classes.hft_internal_gains_archetype import HftInternalGainsArchetype from imports.usage.data_classes.hft_internal_gains_archetype import HftInternalGainsArchetype
class HftUsageZoneArchetype: class HftUsageZoneArchetype:
@ -34,7 +34,7 @@ class HftUsageZoneArchetype:
@property @property
def internal_gains(self) -> List[HftInternalGainsArchetype]: def internal_gains(self) -> List[HftInternalGainsArchetype]:
""" """
Get usages zone internal gains Get usage zone internal gains
:return: [InternalGains] :return: [InternalGains]
""" """
return self._internal_gains return self._internal_gains
@ -42,7 +42,7 @@ class HftUsageZoneArchetype:
@property @property
def heating_setpoint(self): def heating_setpoint(self):
""" """
Get usages zone heating set point in celsius grads Get usage zone heating set point in celsius grads
:return: float :return: float
""" """
return self._heating_setpoint return self._heating_setpoint
@ -50,7 +50,7 @@ class HftUsageZoneArchetype:
@property @property
def heating_setback(self): def heating_setback(self):
""" """
Get usages zone heating setback in celsius grads Get usage zone heating setback in celsius grads
:return: float :return: float
""" """
return self._heating_setback return self._heating_setback
@ -58,7 +58,7 @@ class HftUsageZoneArchetype:
@property @property
def cooling_setpoint(self): def cooling_setpoint(self):
""" """
Get usages zone cooling setpoint in celsius grads Get usage zone cooling setpoint in celsius grads
:return: float :return: float
""" """
return self._cooling_setpoint return self._cooling_setpoint
@ -66,7 +66,7 @@ class HftUsageZoneArchetype:
@property @property
def hours_day(self): def hours_day(self):
""" """
Get usages zone usages hours per day Get usage zone usage hours per day
:return: float :return: float
""" """
return self._hours_day return self._hours_day
@ -74,7 +74,7 @@ class HftUsageZoneArchetype:
@property @property
def days_year(self): def days_year(self):
""" """
Get usages zone usages days per year Get usage zone usage days per year
:return: float :return: float
""" """
return self._days_year return self._days_year
@ -82,7 +82,7 @@ class HftUsageZoneArchetype:
@property @property
def mechanical_air_change(self): def mechanical_air_change(self):
""" """
Set usages zone mechanical air change in air change per hour (ACH) Set usage zone mechanical air change in air change per hour (ACH)
:return: float :return: float
""" """
return self._mechanical_air_change return self._mechanical_air_change
@ -90,7 +90,7 @@ class HftUsageZoneArchetype:
@property @property
def usage(self): def usage(self):
""" """
Get usages zone usages Get usage zone usage
:return: str :return: str
""" """
return self._usage return self._usage

View File

@ -23,12 +23,12 @@ class UsageHelper:
@staticmethod @staticmethod
def hft_from_usage(usage): def hft_from_usage(usage):
""" """
Get HfT usages from the given internal usages key Get HfT usage from the given internal usage key
:param usage: str :param usage: str
:return: str :return: str
""" """
try: try:
return UsageHelper.usage_to_hft[usage] return UsageHelper.usage_to_hft[usage]
except KeyError: except KeyError:
sys.stderr.write('Error: keyword not found. Returned default HfT usages "residential"\n') sys.stderr.write('Error: keyword not found. Returned default HfT usage "residential"\n')
return UsageHelper.hft_default_value return UsageHelper.hft_default_value

View File

@ -1,12 +1,12 @@
""" """
Hft-based interface, it reads format defined within the CERC team based on that one used in SimStadt and developed by Hft-based interface, it reads format defined within the CERC team based on that one used in SimStadt and developed by
the IAF team at hft-Stuttgart and enriches the city with usages parameters the IAF team at hft-Stuttgart and enriches the city with usage parameters
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
import xmltodict import xmltodict
from imports.usages.data_classes.hft_usage_zone_archetype import HftUsageZoneArchetype as huza from imports.usage.data_classes.hft_usage_zone_archetype import HftUsageZoneArchetype as huza
from imports.usages.data_classes.hft_internal_gains_archetype import HftInternalGainsArchetype as higa from imports.usage.data_classes.hft_internal_gains_archetype import HftInternalGainsArchetype as higa
class HftUsageInterface: class HftUsageInterface:

View File

@ -1,12 +1,12 @@
""" """
HftUsageParameters model the usages properties HftUsageParameters model the usage properties
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
import sys import sys
from imports.geometry.helpers.geometry_helper import GeometryHelper as gh from imports.geometry.helpers.geometry_helper import GeometryHelper as gh
from imports.usages.hft_usage_interface import HftUsageInterface from imports.usage.hft_usage_interface import HftUsageInterface
from city_model_structure.attributes.usage_zone import UsageZone from city_model_structure.attributes.usage_zone import UsageZone
from city_model_structure.attributes.internal_gains import InternalGains from city_model_structure.attributes.internal_gains import InternalGains
@ -25,7 +25,7 @@ class HftUsageParameters(HftUsageInterface):
def enrich_buildings(self): def enrich_buildings(self):
""" """
Returns the city with the usages parameters assigned to the buildings Returns the city with the usage parameters assigned to the buildings
:return: :return:
""" """
city = self._city city = self._city
@ -33,10 +33,10 @@ class HftUsageParameters(HftUsageInterface):
archetype = self._search_archetype(gh.usage_from_function(building.function)) archetype = self._search_archetype(gh.usage_from_function(building.function))
if archetype is None: if archetype is None:
sys.stderr.write(f'Building {building.name} has unknown archetype for building function:' sys.stderr.write(f'Building {building.name} has unknown archetype for building function:'
f' {building.function}, that assigns building usages as ' f' {building.function}, that assigns building usage as '
f'{gh.usage_from_function(building.function)}\n') f'{gh.usage_from_function(building.function)}\n')
continue continue
# todo: what to do with mix-usages usages from gml? # todo: what to do with mix-usage usage from gml?
mix_usage = False mix_usage = False
if not mix_usage: if not mix_usage:
# just one usage_zone # just one usage_zone

View File

@ -1,10 +1,10 @@
""" """
UsageFactory retrieve the specific usages module for the given region UsageFactory retrieve the specific usage module for the given region
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
from pathlib import Path from pathlib import Path
from imports.usages.hft_usage_parameters import HftUsageParameters from imports.usage.hft_usage_parameters import HftUsageParameters
class UsageFactory: class UsageFactory:
@ -24,7 +24,7 @@ class UsageFactory:
def enrich(self): def enrich(self):
""" """
Enrich the city with the usages information Enrich the city with the usage information
:return: None :return: None
""" """
getattr(self, self._handler, lambda: None)() getattr(self, self._handler, lambda: None)()

View File

@ -39,7 +39,7 @@ class WeatherFactory:
def enrich(self): def enrich(self):
""" """
Enrich the city with the usages information Enrich the city with the usage information
:return: None :return: None
""" """
getattr(self, self._handler, lambda: None)() getattr(self, self._handler, lambda: None)()

View File

@ -8,7 +8,7 @@ from unittest import TestCase
import pandas as pd import pandas as pd
from city_model_structure.city import City from city_model_structure.city import City
from city_model_structure.building import Building from city_model_structure.building import Building
from city_model_structure.city_object import CityObject from city_model_structure.buildings_cluster import BuildingsCluster
from imports.sensors_factory import SensorsFactory from imports.sensors_factory import SensorsFactory
@ -39,23 +39,18 @@ class TestSensorsFactory(TestCase):
city = City(lower_corner, upper_corner, srs_name) city = City(lower_corner, upper_corner, srs_name)
buildings.append(Building("EV", lod, surfaces, year_of_construction, function, lower_corner)) buildings.append(Building("EV", lod, surfaces, year_of_construction, function, lower_corner))
buildings.append(Building("GM", lod, surfaces, year_of_construction, function, lower_corner)) buildings.append(Building("GM", lod, surfaces, year_of_construction, function, lower_corner))
buildings.append(Building("MB", lod, surfaces, year_of_construction, function, lower_corner))
for building in buildings: for building in buildings:
city.add_city_object(building) city.add_city_object(building)
buildings_cluster = BuildingsCluster("GM_MB_EV", buildings)
city.add_city_objects_cluster(buildings_cluster)
return city return city
#virtual_building = CityObject("GM_MB_EV", lod, surfaces, lower_corner)
#virtual_building.type = 'Virtual'
#city.add_city_object(virtual_building)
def test_city_with_sensors(self): def test_city_with_sensors(self):
SensorsFactory('cec', self._city, self._end_point).enrich() SensorsFactory('cec', self._city, self._end_point).enrich()
SensorsFactory('cgf', self._city, self._end_point).enrich() SensorsFactory('cgf', self._city, self._end_point).enrich()
SensorsFactory('ct', self._city, self._end_point).enrich() SensorsFactory('ct', self._city, self._end_point).enrich()
for city_object in self._city.city_objects: for city_object in self._city.city_objects:
print(city_object.name, len(city_object.sensors))
for sensor in city_object.sensors: for sensor in city_object.sensors:
# force update last row print(sensor.name)
update = pd.DataFrame([['2020-01-19 23:55:00', '12345.0']], columns=["Date time", "Energy consumption"])
update = update.astype({"Date time": 'datetime64', "Energy consumption": 'float64'})
sensor.add_period(update)
row = sensor.measures.loc[sensor.measures["Date time"] == '2020-01-19 23:55:00']['Energy consumption'].iloc[0]
self.assertTrue(f'{row}' == '12345.0')

View File

@ -1,5 +1,5 @@
""" """
TestUsageFactory test and validate the city model structure usages parameters TestUsageFactory test and validate the city model structure usage parameters
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
@ -31,7 +31,7 @@ class TestUsageFactory(TestCase):
def test_city_with_usage(self): def test_city_with_usage(self):
""" """
Enrich the city with the usages information and verify it Enrich the city with the usage information and verify it
:return: None :return: None
""" """
file = 'pluto_building.gml' file = 'pluto_building.gml'
@ -44,14 +44,14 @@ class TestUsageFactory(TestCase):
for building in city.buildings: for building in city.buildings:
self.assertIsNotNone(building.usage_zones, 'usage_zones not created') self.assertIsNotNone(building.usage_zones, 'usage_zones not created')
for usage_zone in building.usage_zones: for usage_zone in building.usage_zones:
self.assertIsNotNone(usage_zone.usage, 'usages is none') self.assertIsNotNone(usage_zone.usage, 'usage is none')
self.assertIsNotNone(usage_zone.internal_gains, 'usages is none') self.assertIsNotNone(usage_zone.internal_gains, 'usage is none')
self.assertIsNotNone(usage_zone.cooling_setpoint, 'usages is none') self.assertIsNotNone(usage_zone.cooling_setpoint, 'usage is none')
self.assertIsNotNone(usage_zone.heating_setback, 'usages is none') self.assertIsNotNone(usage_zone.heating_setback, 'usage is none')
self.assertIsNotNone(usage_zone.heating_setpoint, 'usages is none') self.assertIsNotNone(usage_zone.heating_setpoint, 'usage is none')
self.assertIsNotNone(usage_zone.occupancy_density, 'usages is none') self.assertIsNotNone(usage_zone.occupancy_density, 'usage is none')
self.assertIsNotNone(usage_zone.hours_day, 'usages is none') self.assertIsNotNone(usage_zone.hours_day, 'usage is none')
self.assertIsNotNone(usage_zone.days_year, 'usages is none') self.assertIsNotNone(usage_zone.days_year, 'usage is none')
self.assertIsNotNone(usage_zone.dhw_average_volume_pers_day, 'usages is none') self.assertIsNotNone(usage_zone.dhw_average_volume_pers_day, 'usage is none')
self.assertIsNotNone(usage_zone.dhw_preparation_temperature, 'usages is none') self.assertIsNotNone(usage_zone.dhw_preparation_temperature, 'usage is none')
self.assertIsNotNone(usage_zone.electrical_app_average_consumption_sqm_year, 'usages is none') self.assertIsNotNone(usage_zone.electrical_app_average_consumption_sqm_year, 'usage is none')