Source code for uwg.schdef

"""Class for Schedule Definition."""

from .utilities import float_positive, REF_BUILTERA_SET, REF_BUILTERA


try:
    str = basestring
except NameError:
    pass


[docs]class SchDef(object): """Schedule definition class. The internal load weekly schedules consists of three lists of 24 values representing hours in weekday, Saturday, and Sunday. Args: elec: Weekly schedule of fractional electricity plug process loads. gas: Weekly schedule of fractional gas process loads. light: Weekly schedule of fractional light process loads. occ: Weekly schedule of fractional occupant number. cool: Weekly schedule of cooling temperatures. heat: Weekly schedule of heating temperatures. q_elec: Maximum electrical plug process load [W/m2]. q_gas: Maximum gas process load per unit area [W/m2]. q_light: Maximum light process load per unit area [W/m2]. n_occ: Maximum number of occupants per unit area [person/m2]. vent: Maximum ventilation rate per unit area [m3/s/m2]. swh: Optional property for weekly schedule of fractional hot water rate. This property will be a weekly schedule of zero values, as default. v_swh: Optional property for maximum volumetric hot water rate per unit area [L/hr/m2]. (Default: 0). bldtype: Text referring to a building type. By default, 16 building types are defined in the UWG according to models from the Department of Energy (DOE). Custom building types can also be defined with a new name. Note that this value along with the BEMDef builtera must exactly match the identifiers in the UWG bld list in order to specify the fraction of total built stock the building occupies in the UWG simulation. Choose from the following to reference or overwrite a BEM associated with a DOE reference building type: 'fullservicerestaurant', 'hospital', 'largehotel', 'largeoffice', 'mediumoffice', 'midriseapartment', 'outpatient', 'primaryschool', 'quickservicerestaurant', 'secondaryschool', 'smallhotel', 'smalloffice', 'standaloneretail', 'stripmall', 'supermarket', or 'warehouse'. builtera: Text defining building built era. Must be one of the following: "pre80" (pre-1980s), "pst80" (post-1980s), or "new" (new construction). This value along with the bldtype must exactly match the identifiers in the bld array in order to specify the fraction of total built stock the building occupies in the UWG simulation. Properties: * elec * gas * light * occ * cool * heat * swh * q_elec * q_gas * q_light * n_occ * vent * v_swh * bldtype * builtera * zonetype """ DEFAULT_SWH = [[0 for j in range(24)] for i in range(3)] def __init__(self, elec, gas, light, occ, cool, heat, q_elec, q_gas, q_light, n_occ, vent, bldtype, builtera, swh=DEFAULT_SWH, v_swh=0): self.elec = elec self.gas = gas self.light = light self.occ = occ self.cool = cool self.heat = heat self.q_elec = q_elec self.q_gas = q_gas self.q_light = q_light self.n_occ = n_occ self.vent = vent self.v_swh = v_swh self.swh = swh # Properties to be set in readDOE self.bldtype = bldtype # DOE reference building type self.builtera = builtera # pre80, pst80, new self.zonetype = None # climate zone number (only used in testing). @property def elec(self): """Get or set weekly schedule of fractional electricity plug process loads. Weekly schedule consists of three lists of 24 values representing hours in weekday, Saturday, and Sunday. """ return self._elec @elec.setter def elec(self, value): self._elec = SchDef.check_week_validity(value, 'elec') @property def gas(self): """Get or set weekly schedule of fractional gas process loads. Weekly schedule consists of three lists of 24 values representing hours in weekday, Saturday, and Sunday. """ return self._gas @gas.setter def gas(self, value): self._gas = SchDef.check_week_validity(value, 'gas') @property def light(self): """Get or set weekly schedule of fractional light process loads. Weekly schedule consists of three lists of 24 values representing hours in weekday, Saturday, and Sunday. """ return self._light @light.setter def light(self, value): self._light = SchDef.check_week_validity(value, 'light') @property def occ(self): """Get or set weekly schedule of occupant number. Weekly schedule consists of three lists of 24 values representing hours in weekday, Saturday, and Sunday. """ return self._occ @occ.setter def occ(self, value): self._occ = SchDef.check_week_validity(value, 'occ') @property def cool(self): """Get or set weekly schedule of cooling temperatures. Weekly schedule consists of three lists of 24 values representing hours in weekday, Saturday, and Sunday. """ return self._cool @cool.setter def cool(self, value): self._cool = SchDef.check_week_validity(value, 'cool') @property def heat(self): """Get or set weekly schedule of heating temperatures. Weekly schedule consists of three lists of 24 values representing hours in weekday, Saturday, and Sunday. """ return self._heat @heat.setter def heat(self, value): self._heat = SchDef.check_week_validity(value, 'heat') @property def swh(self): """Get or set weekly schedule of fractional hot water rate. Weekly schedule consists of three lists of 24 values representing hours in weekday, Saturday, and Sunday. """ return self._swh @swh.setter def swh(self, value): self._swh = SchDef.check_week_validity(value, 'swh') @property def q_elec(self): """Get or set maximum electrical plug process load [W/m2].""" return self._q_elec @q_elec.setter def q_elec(self, value): self._q_elec = float_positive(value, 'q_elec') @property def q_gas(self): """Get or set maximum gas process load per unit area [W/m2].""" return self._q_gas @q_gas.setter def q_gas(self, value): self._q_gas = float_positive(value, 'q_gas') @property def q_light(self): """Get or set maximum light process load per unit area [W/m2].""" return self._q_light @q_light.setter def q_light(self, value): self._q_light = float_positive(value, 'q_light') @property def n_occ(self): """Get or set maximum number of occupants per unit area [person/m2].""" return self._n_occ @n_occ.setter def n_occ(self, value): self._n_occ = float_positive(value, 'n_occ') @property def vent(self): """Get or set maximum ventilation rate per unit area [m3/s/m2].""" return self._vent @vent.setter def vent(self, value): self._vent = float_positive(value, 'vent') @property def v_swh(self): """Get or set maximum volumetric hot water rate per unit area [L/hr/m2].""" return self._v_swh @v_swh.setter def v_swh(self, value): self._v_swh = float_positive(value, 'v_swh') @property def bldtype(self): """Get or set text for building type. By default, 16 building types are defined in the UWG according to models from the Department of Energy (DOE). Choose from the following to reference or overwrite a schedule associated with a DOE reference building type: * 'fullservicerestaurant' * 'hospital' * 'largehotel' * 'largeoffice' * 'medoffice' * 'midriseapartment' * 'outpatient' * 'primaryschool' * 'quickservicerestaurant' * 'secondaryschool' * 'smallhotel' * 'smalloffice' * 'standaloneretail' * 'stripmall' * 'supermarket' * 'warehouse' Custom building types can also be defined with a new name. If a custom SchDef is defined with the same name as a reference DOE building type from the list above, the reference SchDef will be overwritten by the custom SchDef. Note that this value along with the SchDef builtera must exactly match the identifiers in the UWG bld list in order to specify the fraction of total built stock the building occupies in the UWG simulation. """ return self._bldtype @bldtype.setter def bldtype(self, value): assert isinstance(value, str), 'The bldtype must be a string. ' \ 'Got: {}.'.format(value.lower()) self._bldtype = value @property def builtera(self): """Get or set text for built era. Must be one of the following: * 'pre80' - pre-1980s * 'pst80' - post-1980s * 'new' - new construction This value along with the bldtype must exactly match the identifiers in the bld array in order to specify the fraction of total built stock the building occupies in the UWG simulation. """ return self._builtera @builtera.setter def builtera(self, value): assert isinstance(value, str) and value in REF_BUILTERA_SET, \ 'The builtera must be one of {}.Got: {}.'.format( REF_BUILTERA, value.lower()) self._builtera = value
[docs] @classmethod def from_dict(cls, data): """Create a SchDef object from a dictionary. Args: data: A SchDef dictionary following the format below. .. code-block:: python _example_week = [ [0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.7, 0.9, 0.9, 0.6, 0.6, 0.6, 0.6, 0.6, 0.7, 0.8, 0.9, 0.9, 0.8, 0.8, 0.7, 0.3, 0.2, 0.2], # Weekday [0.2, 0.2, 0.2, 0.2, 0.2, 0.3, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.6, 0.7, 0.7, 0.7, 0.7, 0.5, 0.4, 0.3, 0.2, 0.2], # Saturday [0.2, 0.2, 0.2, 0.2, 0.2, 0.3, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.3, 0.3, 0.2, 0.2]] # Sunday { "elec": _example_week, "gas": _example_week, "light": _example_week, "occ": _example_week, "cool": _example_week, "heat": _example_week, "swh": _example_week, "q_elec" = q_elec, "q_gas" = q_gas, "q_light" = q_light, "n_occ" = n_occ, "vent" = vent, "v_swh" = v_swh, "bldtype": 0, "builtera": 1 } """ assert data['type'] == 'SchDef', 'Expected ' \ 'SchDef dictionary. Got {}.'.format(data['type']) return cls(elec=data['elec'], gas=data['gas'], light=data['light'], occ=data['occ'], cool=data['cool'], heat=data['heat'], swh=data['swh'], q_elec=data['q_elec'], q_gas=data['q_gas'], q_light=data['q_light'], n_occ=data['n_occ'], vent=data['vent'], v_swh=data['v_swh'], bldtype=data['bldtype'], builtera=data['builtera'])
[docs] def to_dict(self): """SchDef dictionary representation.""" base = {'type': 'SchDef'} base['elec'] = self.elec base['gas'] = self.gas base['light'] = self.light base['occ'] = self.occ base['cool'] = self.cool base['heat'] = self.heat base['swh'] = self.swh base['q_elec'] = self.q_elec base['q_gas'] = self.q_gas base['q_light'] = self.q_light base['n_occ'] = self.n_occ base['vent'] = self.vent base['v_swh'] = self.v_swh base['bldtype'] = self.bldtype base['builtera'] = self.builtera return base
[docs] @staticmethod def check_week_validity(week, name): assert isinstance(week, (list, tuple)), 'The {} property must be a ' \ 'list or tuple. Got {}.'.format(name, week) assert len(week) == 3, 'The {} property must be a 3 x 24 matrix. Got ' \ '{} rows.'.format(name, len(week)) for i, day in enumerate(week): assert len(day) == 24, 'The {} property must be a 3 x 24 ' \ 'matrix. Got {} columns for row {}.'.format(name, len(day), i) for val in day: assert isinstance(val, (float, int)), 'The {} property ' \ 'must contain 3 lists of numbers. Got : {}.'.format( name, val) return week
def __repr__(self): return 'Schedule, bldtype: {}\n builtera: {}\n q_elec: {}\n q_gas: {}\n ' \ 'q_light: {}\n n_occ: {}\n vent: {}\n v_swh: {}\n elec: {}\n ' \ 'gas: {}\n light: {}\n occ: {}\n cool: {}\n heat: {}\n swh: {}\n'.format( self.bldtype, self.builtera, self.q_elec, self.q_gas, self.q_light, self.n_occ, self.vent, self.v_swh, self.elec, self.gas, self.light, self.occ, self.cool, self.heat, self.swh)