honeybee-schema 1.59.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. honeybee_schema/__init__.py +1 -0
  2. honeybee_schema/__main__.py +4 -0
  3. honeybee_schema/_base.py +42 -0
  4. honeybee_schema/altnumber.py +18 -0
  5. honeybee_schema/boundarycondition.py +81 -0
  6. honeybee_schema/cli.py +115 -0
  7. honeybee_schema/comparison.py +208 -0
  8. honeybee_schema/doe2/__init__.py +0 -0
  9. honeybee_schema/doe2/properties.py +75 -0
  10. honeybee_schema/energy/__init__.py +0 -0
  11. honeybee_schema/energy/_base.py +64 -0
  12. honeybee_schema/energy/construction.py +324 -0
  13. honeybee_schema/energy/constructionset.py +359 -0
  14. honeybee_schema/energy/daylight.py +62 -0
  15. honeybee_schema/energy/designday.py +212 -0
  16. honeybee_schema/energy/generator.py +140 -0
  17. honeybee_schema/energy/global_constructionset.py +129 -0
  18. honeybee_schema/energy/hvac/__init__.py +0 -0
  19. honeybee_schema/energy/hvac/_template.py +38 -0
  20. honeybee_schema/energy/hvac/allair.py +257 -0
  21. honeybee_schema/energy/hvac/detailed.py +20 -0
  22. honeybee_schema/energy/hvac/doas.py +248 -0
  23. honeybee_schema/energy/hvac/heatcool.py +309 -0
  24. honeybee_schema/energy/hvac/idealair.py +107 -0
  25. honeybee_schema/energy/internalmass.py +25 -0
  26. honeybee_schema/energy/load.py +627 -0
  27. honeybee_schema/energy/material.py +949 -0
  28. honeybee_schema/energy/programtype.py +117 -0
  29. honeybee_schema/energy/properties.py +382 -0
  30. honeybee_schema/energy/schedule.py +350 -0
  31. honeybee_schema/energy/shw.py +53 -0
  32. honeybee_schema/energy/simulation.py +440 -0
  33. honeybee_schema/energy/ventcool.py +337 -0
  34. honeybee_schema/geometry.py +161 -0
  35. honeybee_schema/model.py +473 -0
  36. honeybee_schema/projectinfo.py +94 -0
  37. honeybee_schema/radiance/__init__.py +0 -0
  38. honeybee_schema/radiance/_base.py +22 -0
  39. honeybee_schema/radiance/asset.py +191 -0
  40. honeybee_schema/radiance/global_modifierset.py +92 -0
  41. honeybee_schema/radiance/modifier.py +373 -0
  42. honeybee_schema/radiance/modifierset.py +296 -0
  43. honeybee_schema/radiance/properties.py +149 -0
  44. honeybee_schema/radiance/state.py +69 -0
  45. honeybee_schema/updater/__init__.py +0 -0
  46. honeybee_schema/updater/version_1_39_12.py +14 -0
  47. honeybee_schema/updater/version_1_40_1.py +153 -0
  48. honeybee_schema/updater/version_1_43_1.py +18 -0
  49. honeybee_schema/updater/version_1_43_2.py +12 -0
  50. honeybee_schema/updater/version_1_43_5.py +11 -0
  51. honeybee_schema/validation.py +205 -0
  52. honeybee_schema-1.59.1.dist-info/METADATA +108 -0
  53. honeybee_schema-1.59.1.dist-info/RECORD +57 -0
  54. honeybee_schema-1.59.1.dist-info/WHEEL +5 -0
  55. honeybee_schema-1.59.1.dist-info/entry_points.txt +2 -0
  56. honeybee_schema-1.59.1.dist-info/licenses/LICENSE +23 -0
  57. honeybee_schema-1.59.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,62 @@
1
+ from pydantic import Field, constr
2
+ from typing import List
3
+
4
+ from .._base import NoExtraBaseModel
5
+
6
+
7
+ class DaylightingControl(NoExtraBaseModel):
8
+
9
+ type: constr(regex='^DaylightingControl$') = 'DaylightingControl'
10
+
11
+ sensor_position: List[float] = Field(
12
+ ...,
13
+ description='A point as 3 (x, y, z) values for the position of the daylight '
14
+ 'sensor within the parent Room. This point should lie within the Room '
15
+ 'volume in order for the results to be meaningful.',
16
+ min_items=3,
17
+ max_items=3
18
+ )
19
+
20
+ illuminance_setpoint: float = Field(
21
+ 300,
22
+ gt=0,
23
+ description='A number for the illuminance setpoint in lux beyond '
24
+ 'which electric lights are dimmed if there is sufficient daylight.'
25
+ )
26
+
27
+ control_fraction: float = Field(
28
+ 1,
29
+ ge=0,
30
+ le=1,
31
+ description='A number between 0 and 1 that represents the fraction of '
32
+ 'the Room lights that are dimmed when the illuminance at the sensor '
33
+ 'position is at the specified illuminance. 1 indicates that all lights are '
34
+ 'dim-able while 0 indicates that no lights are dim-able. Deeper rooms '
35
+ 'should have lower control fractions to account for the face that the '
36
+ 'lights in the back of the space do not dim in response to suitable '
37
+ 'daylight at the front of the room.'
38
+ )
39
+
40
+ min_power_input: float = Field(
41
+ 0.3,
42
+ ge=0,
43
+ le=1,
44
+ description='A number between 0 and 1 for the the lowest power the '
45
+ 'lighting system can dim down to, expressed as a fraction of maximum '
46
+ 'input power.'
47
+ )
48
+
49
+ min_light_output: float = Field(
50
+ 0.2,
51
+ ge=0,
52
+ le=1,
53
+ description='A number between 0 and 1 the lowest lighting output the '
54
+ 'lighting system can dim down to, expressed as a fraction of maximum '
55
+ 'light output.'
56
+ )
57
+
58
+ off_at_minimum: bool = Field(
59
+ default=False,
60
+ description='Boolean to note whether lights should switch off completely '
61
+ 'when they get to the minimum power input.'
62
+ )
@@ -0,0 +1,212 @@
1
+ """Design Day Schema"""
2
+ from pydantic import Field, constr, validator
3
+ from typing import Union, List
4
+ from enum import Enum
5
+ import datetime
6
+
7
+ from .._base import NoExtraBaseModel
8
+
9
+
10
+ class DryBulbCondition(NoExtraBaseModel):
11
+ """Used to specify dry bulb conditions on a design day."""
12
+
13
+ type: constr(regex='^DryBulbCondition$') = 'DryBulbCondition'
14
+
15
+ dry_bulb_max: float = Field(
16
+ ...,
17
+ ge=-90,
18
+ le=70,
19
+ description='The maximum dry bulb temperature on the design day [C].'
20
+ )
21
+
22
+ dry_bulb_range: float = Field(
23
+ ...,
24
+ ge=0,
25
+ description='The difference between min and max temperatures on the '
26
+ 'design day [C].'
27
+ )
28
+
29
+
30
+ class HumidityTypes(str, Enum):
31
+ wetbulb = 'Wetbulb'
32
+ dewpoint = 'Dewpoint'
33
+ humidity_ratio = 'HumidityRatio'
34
+ enthalpy = 'Enthalpy'
35
+
36
+
37
+ class HumidityCondition(NoExtraBaseModel):
38
+ """Used to specify humidity conditions on a design day."""
39
+
40
+ type: constr(regex='^HumidityCondition$') = 'HumidityCondition'
41
+
42
+ humidity_type: HumidityTypes
43
+
44
+ humidity_value: float = Field(
45
+ ...,
46
+ description='The value correcponding to the humidity_type.'
47
+ )
48
+
49
+ barometric_pressure: float = Field(
50
+ 101325,
51
+ ge=31000,
52
+ le=120000,
53
+ description='Barometric air pressure on the design day [Pa].'
54
+ )
55
+
56
+ rain: bool = Field(
57
+ default=False,
58
+ description='Boolean to indicate rain on the design day.'
59
+ )
60
+
61
+ snow_on_ground: bool = Field(
62
+ default=False,
63
+ description='Boolean to indicate snow on the ground during the design day.'
64
+ )
65
+
66
+
67
+ class WindCondition(NoExtraBaseModel):
68
+ """Used to specify wind conditions on a design day."""
69
+
70
+ type: constr(regex='^WindCondition$') = 'WindCondition'
71
+
72
+ wind_speed: float = Field(
73
+ ...,
74
+ ge=0,
75
+ le=40,
76
+ description='Wind speed on the design day [m/s].'
77
+ )
78
+
79
+ wind_direction: float = Field(
80
+ 0,
81
+ ge=0,
82
+ le=360,
83
+ description='Wind direction on the design day [degrees].'
84
+ )
85
+
86
+
87
+ class _SkyCondition(NoExtraBaseModel):
88
+ """Used to specify sky conditions on a design day."""
89
+
90
+ date: List[int] = Field(
91
+ ...,
92
+ min_items=2,
93
+ max_items=3,
94
+ description='A list of two integers for [month, day], representing the date '
95
+ 'for the day of the year on which the design day occurs. '
96
+ 'A third integer may be added to denote whether the date should be '
97
+ 're-serialized for a leap year (it should be a 1 in this case).'
98
+ )
99
+
100
+ @validator('date')
101
+ def check_date(cls, v):
102
+ "Ensure valid date."
103
+ if len(v) == 3 and v[2]:
104
+ try:
105
+ datetime.date(2016, v[0], v[1])
106
+ except ValueError:
107
+ raise ValueError('{}/{} is not a valid date.'.format(v[0], v[1]))
108
+ else:
109
+ try:
110
+ datetime.date(2017, v[0], v[1])
111
+ except ValueError:
112
+ raise ValueError('{}/{} is not a valid date.'.format(v[0], v[1]))
113
+ return v
114
+
115
+ daylight_savings: bool = Field(
116
+ default=False,
117
+ description='Boolean to indicate whether daylight savings time is active '
118
+ 'on the design day.'
119
+ )
120
+
121
+
122
+ class ASHRAEClearSky(_SkyCondition):
123
+ """Used to specify sky conditions on a design day."""
124
+
125
+ type: constr(regex='^ASHRAEClearSky$') = 'ASHRAEClearSky'
126
+
127
+ clearness: float = Field(
128
+ ...,
129
+ ge=0,
130
+ le=1.2,
131
+ description='Value between 0 and 1.2 that will get multiplied by the '
132
+ 'irradiance to correct for factors like elevation above sea level.'
133
+ )
134
+
135
+
136
+ class ASHRAETau(_SkyCondition):
137
+ """Used to specify sky conditions on a design day."""
138
+
139
+ type: constr(regex='^ASHRAETau$') = 'ASHRAETau'
140
+
141
+ tau_b: float = Field(
142
+ ...,
143
+ ge=0,
144
+ le=1.2,
145
+ description='Value for the beam optical depth. Typically found in .stat files.'
146
+ )
147
+
148
+ tau_d: float = Field(
149
+ ...,
150
+ ge=0,
151
+ le=3,
152
+ description='Value for the diffuse optical depth. Typically found in .stat files.'
153
+ )
154
+
155
+
156
+ class DesignDayTypes(str, Enum):
157
+ summer_design_day = 'SummerDesignDay'
158
+ winter_design_day = 'WinterDesignDay'
159
+ sunday = 'Sunday'
160
+ monday = 'Monday'
161
+ tuesday = 'Tuesday'
162
+ wednesday = 'Wednesday'
163
+ thursday = 'Thursday'
164
+ friday = 'Friday'
165
+ holiday = 'Holiday'
166
+ custom_day1 = 'CustomDay1'
167
+ custom_day2 = 'CustomDay2'
168
+
169
+
170
+ class DesignDay(NoExtraBaseModel):
171
+ """An object representing design day conditions."""
172
+
173
+ type: constr(regex='^DesignDay$') = 'DesignDay'
174
+
175
+ name: str = Field(
176
+ ...,
177
+ min_length=1,
178
+ max_length=100,
179
+ description='Text string for a unique design day name. This name remains '
180
+ 'constant as the object is mutated, copied, and serialized to different '
181
+ 'formats (eg. dict, idf, osm). It is also used to reference the object '
182
+ 'within SimulationParameters. It must be < 100 characters, use only '
183
+ 'ASCII characters and exclude (, ; ! \\n \\t).'
184
+ )
185
+
186
+ @validator('name')
187
+ def check_identifier(cls, v):
188
+ assert all(ord(i) < 128 for i in v), 'Name contains non ASCII characters.'
189
+ assert all(char not in v for char in (',', ';', '!', '\n', '\t')), \
190
+ 'Name contains an invalid character for EnergyPlus (, ; ! \\n \\t).'
191
+ return v
192
+
193
+ day_type: DesignDayTypes
194
+
195
+ dry_bulb_condition: DryBulbCondition = Field(
196
+ ...,
197
+ description='A DryBulbCondition describing temperature conditions on '
198
+ 'the design day.'
199
+ )
200
+
201
+ humidity_condition: HumidityCondition = Field(
202
+ ...,
203
+ description='A HumidityCondition describing humidity and precipitation '
204
+ 'conditions on the design day.'
205
+ )
206
+
207
+ wind_condition: WindCondition = Field(
208
+ ...,
209
+ description='A WindCondition describing wind conditions on the design day.'
210
+ )
211
+
212
+ sky_condition: Union[ASHRAEClearSky, ASHRAETau]
@@ -0,0 +1,140 @@
1
+ """Schemas for objects that generate electricity."""
2
+ from pydantic import Field, constr
3
+
4
+ from .._base import NoExtraBaseModel
5
+ from ._base import EnergyBaseModel
6
+ from enum import Enum
7
+
8
+
9
+ class ElectricLoadCenter(NoExtraBaseModel):
10
+
11
+ type: constr(regex='^ElectricLoadCenter$') = 'ElectricLoadCenter'
12
+
13
+ inverter_efficiency: float = Field(
14
+ 0.96,
15
+ gt=0,
16
+ le=1,
17
+ description='A number between 0 and 1 for the load center inverter nominal '
18
+ 'rated DC-to-AC conversion efficiency. An inverter converts DC power, such '
19
+ 'as that output by photovoltaic panels, to AC power, such as that distributed '
20
+ 'by the electrical grid and is available from standard electrical outlets. '
21
+ 'Inverter efficiency is defined as the inverter rated AC power output divided '
22
+ 'by its rated DC power output.'
23
+ )
24
+
25
+ inverter_dc_to_ac_size_ratio: float = Field(
26
+ 1.1,
27
+ gt=0,
28
+ description='A positive number (typically greater than 1) for the ratio of '
29
+ 'the inverter DC rated size to its AC rated size. Typically, inverters are '
30
+ 'not sized to convert the full DC output under standard test conditions (STC) '
31
+ 'as such conditions rarely occur in reality and therefore unnecessarily add '
32
+ 'to the size/cost of the inverter. For a system with a high DC to AC size '
33
+ 'ratio, during times when the DC power output exceeds the inverter rated '
34
+ 'DC input size, the inverter limits the power output by increasing the '
35
+ 'DC operating voltage, which moves the arrays operating point down its '
36
+ 'current-voltage (I-V) curve. In EnergyPlus, this is accomplished by simply '
37
+ 'limiting the system output to the AC size as dictated by the ratio. The '
38
+ 'default value of 1.1 is reasonable for most systems. A typical range is '
39
+ '1.1 to 1.25, although some large-scale systems have ratios of as high '
40
+ 'as 1.5. The optimal value depends on the system location, array '
41
+ 'orientation, and module cost.'
42
+ )
43
+
44
+
45
+ class ModuleType(str, Enum):
46
+ standard = 'Standard'
47
+ premium = 'Premium'
48
+ thin_film = 'ThinFilm'
49
+
50
+
51
+ class MountingType(str, Enum):
52
+ fixed_open_rack = 'FixedOpenRack'
53
+ fixed_roof_mounted = 'FixedRoofMounted'
54
+ one_axis = 'OneAxis'
55
+ one_axis_backtracking = 'OneAxisBacktracking'
56
+ two_axis = 'TwoAxis'
57
+
58
+
59
+ class PVProperties(EnergyBaseModel):
60
+
61
+ type: constr(regex='^PVProperties$') = 'PVProperties'
62
+
63
+ rated_efficiency: float = Field(
64
+ 0.15,
65
+ gt=0,
66
+ lt=1,
67
+ description='A number between 0 and 1 for the rated nameplate efficiency '
68
+ 'of the photovoltaic solar cells under standard test conditions (STC). '
69
+ 'Standard test conditions are 1,000 Watts per square meter solar '
70
+ 'irradiance, 25 degrees C cell temperature, and ASTM G173-03 standard '
71
+ 'spectrum. Nameplate efficiencies reported by manufacturers are typically '
72
+ 'under STC. Standard poly- or mono-crystalline silicon modules tend to have '
73
+ 'rated efficiencies in the range of 14-17%. Premium high efficiency '
74
+ 'mono-crystalline silicon modules with anti-reflective coatings can have '
75
+ 'efficiencies in the range of 18-20%. Thin film photovoltaic modules '
76
+ 'typically have efficiencies of 11% or less. (Default: 0.15 for standard '
77
+ 'silicon solar cells).'
78
+ )
79
+
80
+ active_area_fraction: float = Field(
81
+ 0.9,
82
+ gt=0,
83
+ le=1,
84
+ description='The fraction of the parent Shade geometry that is '
85
+ 'covered in active solar cells. This fraction includes the difference '
86
+ 'between the PV panel (aka. PV module) area and the active cells within '
87
+ 'the panel as well as any losses for how the (typically rectangular) panels '
88
+ 'can be arranged on the Shade geometry. When the parent Shade geometry '
89
+ 'represents just the solar panels, this fraction is typically around 0.9 '
90
+ 'given that the framing elements of the panel reduce the overall '
91
+ 'active area. (Default: 0.9, assuming parent Shade geometry represents '
92
+ 'only the PV panel geometry).'
93
+ )
94
+
95
+ module_type: ModuleType = Field(
96
+ default=ModuleType.standard,
97
+ description='Text to indicate the type of solar module. This is used to '
98
+ 'determine the temperature coefficients used in the simulation of the '
99
+ 'photovoltaic modules. When the rated_efficiency is between 12-18%, the '
100
+ 'Standard type is typically most appropriate. When the rated_efficiency is '
101
+ 'greater than 18%, the Premium type is likely more appropriate. When '
102
+ 'the rated_efficiency is less than 12%, this likely refers to a case where '
103
+ 'the ThinFilm module type is most appropriate.'
104
+ )
105
+
106
+ mounting_type: MountingType = Field(
107
+ default=MountingType.fixed_open_rack,
108
+ description='Text to indicate the type of mounting and/or tracking used '
109
+ 'for the photovoltaic array. Note that the OneAxis options have an axis '
110
+ 'of rotation that is determined by the azimuth of the parent Shade '
111
+ 'geometry. Also note that, in the case of one or two axis tracking, '
112
+ 'shadows on the (static) parent Shade geometry still reduce the '
113
+ 'electrical output, enabling the simulation to account for large '
114
+ 'context geometry casting shadows on the array. However, the effects '
115
+ 'of smaller detailed shading may be improperly accounted for and self '
116
+ 'shading of the dynamic panel geometry is only accounted for via the '
117
+ 'tracking_ground_coverage_ratio property on this object. FixedOpenRack '
118
+ 'refers to ground or roof mounting where the air flows freely. FixedRoofMounted '
119
+ 'refers to mounting flush with the roof with limited air flow. OneAxis '
120
+ 'refers to a fixed tilt and azimuth, which define an axis of rotation. '
121
+ 'OneAxisBacktracking is the same as OneAxis but with controls to reduce '
122
+ 'self-shade at low sun angles. TwoAxis refers to a dynamic tilt and '
123
+ 'azimuth that track the sun.'
124
+ )
125
+
126
+ system_loss_fraction: float = Field(
127
+ 0.14,
128
+ ge=0,
129
+ le=1,
130
+ description='A number between 0 and 1 for the fraction of the electricity '
131
+ 'output lost due to factors other than EPW weather conditions, '
132
+ 'panel efficiency/type, active area, mounting, and inverter conversion from '
133
+ 'DC to AC. Factors that should be accounted for in this input include '
134
+ 'soiling, snow, wiring losses, electrical connection losses, manufacturer '
135
+ 'defects/tolerances/mismatch in cell characteristics, losses from power '
136
+ 'grid availability, and losses due to age or light-induced degradation. '
137
+ 'Losses from these factors tend to be between 10-20% but can vary widely '
138
+ 'depending on the installation, maintenance and the grid to which the '
139
+ 'panels are connected..'
140
+ )
@@ -0,0 +1,129 @@
1
+ """Global construction-set for Model."""
2
+ import pathlib
3
+ import json
4
+
5
+ from typing import List, Union
6
+ from pydantic import constr, Field
7
+
8
+ from honeybee_standards import energy_default
9
+
10
+ from .._base import NoExtraBaseModel
11
+ from .constructionset import WallConstructionSetAbridged, FloorConstructionSetAbridged, \
12
+ RoofCeilingConstructionSetAbridged, ApertureConstructionSetAbridged, \
13
+ DoorConstructionSetAbridged
14
+ from .construction import OpaqueConstructionAbridged, WindowConstructionAbridged, \
15
+ ShadeConstruction, AirBoundaryConstructionAbridged
16
+ from .material import EnergyMaterial, EnergyMaterialNoMass, \
17
+ EnergyWindowMaterialGlazing, EnergyWindowMaterialGas
18
+
19
+
20
+ # import constructionset default values from honeybee standards
21
+ _DEFAULTS = json.loads(pathlib.Path(energy_default).read_text())
22
+ _CSET = [
23
+ ms for ms in _DEFAULTS['construction_sets']
24
+ if ms['identifier'] == 'Default Generic Construction Set'][0]
25
+ _CONSTRUCTION_NAMES = [
26
+ 'Generic Exterior Wall', 'Generic Interior Wall', 'Generic Underground Wall',
27
+ 'Generic Exposed Floor', 'Generic Interior Floor', 'Generic Ground Slab',
28
+ 'Generic Roof', 'Generic Interior Ceiling', 'Generic Underground Roof',
29
+ 'Generic Double Pane', 'Generic Single Pane', 'Generic Exterior Door',
30
+ 'Generic Interior Door', 'Generic Shade', 'Generic Context', 'Generic Air Boundary'
31
+ ]
32
+ _CONSTRUCTIONS = [
33
+ OpaqueConstructionAbridged.parse_obj(m)
34
+ if m['type'] == 'OpaqueConstructionAbridged'
35
+ else WindowConstructionAbridged.parse_obj(m)
36
+ if m['type'] == 'WindowConstructionAbridged'
37
+ else ShadeConstruction.parse_obj(m)
38
+ if m['type'] == 'ShadeConstruction'
39
+ else AirBoundaryConstructionAbridged.parse_obj(m)
40
+ for m in _DEFAULTS['constructions'] if m['identifier'] in _CONSTRUCTION_NAMES
41
+ ]
42
+ _MATERIAL_NAMES = [
43
+ 'Generic 25mm Wood', 'Generic Clear Glass', 'Generic LW Concrete',
44
+ 'Generic Ceiling Air Gap', 'Generic Acoustic Tile', 'Generic Gypsum Board',
45
+ 'Generic Wall Air Gap', 'Generic Painted Metal', 'Generic 50mm Insulation',
46
+ 'Generic Roof Membrane', 'Generic Brick', 'Generic HW Concrete',
47
+ 'Generic Low-e Glass', 'Generic Window Air Gap', 'Generic 25mm Insulation'
48
+ ]
49
+ _MATERIALS = [
50
+ EnergyMaterial.parse_obj(m)
51
+ if m['type'] == 'EnergyMaterial'
52
+ else EnergyMaterialNoMass.parse_obj(m)
53
+ if m['type'] == 'EnergyMaterialNoMass'
54
+ else EnergyWindowMaterialGlazing.parse_obj(m)
55
+ if m['type'] == 'EnergyWindowMaterialGlazing'
56
+ else EnergyWindowMaterialGas.parse_obj(m)
57
+ for m in _DEFAULTS['materials'] if m['identifier'] in _MATERIAL_NAMES
58
+ ]
59
+
60
+
61
+ class GlobalConstructionSet(NoExtraBaseModel):
62
+
63
+ type: constr(regex='^GlobalConstructionSet$') = 'GlobalConstructionSet'
64
+
65
+ materials: List[Union[
66
+ EnergyMaterial, EnergyMaterialNoMass,
67
+ EnergyWindowMaterialGlazing, EnergyWindowMaterialGas
68
+ ]] = Field(
69
+ default=_MATERIALS,
70
+ description='Global Honeybee Energy materials.',
71
+ readOnly=True
72
+ )
73
+
74
+ constructions: List[Union[
75
+ OpaqueConstructionAbridged, WindowConstructionAbridged,
76
+ ShadeConstruction, AirBoundaryConstructionAbridged
77
+ ]] = Field(
78
+ default=_CONSTRUCTIONS,
79
+ description='Global Honeybee Energy constructions.',
80
+ readOnly=True
81
+ )
82
+
83
+ wall_set: WallConstructionSetAbridged = Field(
84
+ default=WallConstructionSetAbridged.parse_obj(_CSET['wall_set']),
85
+ description='Global Honeybee WallConstructionSet.',
86
+ readOnly=True
87
+ )
88
+
89
+ floor_set: FloorConstructionSetAbridged = Field(
90
+ default=FloorConstructionSetAbridged.parse_obj(_CSET['floor_set']),
91
+ description='Global Honeybee FloorConstructionSet.',
92
+ readOnly=True
93
+ )
94
+
95
+ roof_ceiling_set: RoofCeilingConstructionSetAbridged = Field(
96
+ default=RoofCeilingConstructionSetAbridged.parse_obj(_CSET['roof_ceiling_set']),
97
+ description='Global Honeybee RoofCeilingConstructionSet.',
98
+ readOnly=True
99
+ )
100
+
101
+ aperture_set: ApertureConstructionSetAbridged = Field(
102
+ default=ApertureConstructionSetAbridged.parse_obj(_CSET['aperture_set']),
103
+ description='Global Honeybee ApertureConstructionSet.',
104
+ readOnly=True
105
+ )
106
+
107
+ door_set: DoorConstructionSetAbridged = Field(
108
+ default=DoorConstructionSetAbridged.parse_obj(_CSET['door_set']),
109
+ description='Global Honeybee DoorConstructionSet.',
110
+ readOnly=True
111
+ )
112
+
113
+ shade_construction: str = Field(
114
+ default=_CSET['shade_construction'],
115
+ description='Global Honeybee Construction for building-attached Shades.',
116
+ readOnly=True
117
+ )
118
+
119
+ context_construction: str = Field(
120
+ default='Generic Context',
121
+ description='Global Honeybee Construction for context Shades.',
122
+ readOnly=True
123
+ )
124
+
125
+ air_boundary_construction: str = Field(
126
+ default=_CSET['air_boundary_construction'],
127
+ description='Global Honeybee Construction for AirBoundary Faces.',
128
+ readOnly=True
129
+ )
File without changes
@@ -0,0 +1,38 @@
1
+ """Base class for HVAC systems following a standards template."""
2
+ from pydantic import Field
3
+ from enum import Enum
4
+
5
+ from .._base import IDdEnergyBaseModel
6
+
7
+
8
+ class Vintages(str, Enum):
9
+ ashrae_2019 = 'ASHRAE_2019'
10
+ ashrae_2016 = 'ASHRAE_2016'
11
+ ashrae_2013 = 'ASHRAE_2013'
12
+ ashrae_2010 = 'ASHRAE_2010'
13
+ ashrae_2007 = 'ASHRAE_2007'
14
+ ashrae_2004 = 'ASHRAE_2004'
15
+ doe_ref_1980_2004 = 'DOE_Ref_1980_2004'
16
+ doe_ref_pre_1980 = 'DOE_Ref_Pre_1980'
17
+
18
+
19
+ class _TemplateSystem(IDdEnergyBaseModel):
20
+ """Base class for HVAC systems following a standards template."""
21
+
22
+ vintage: Vintages = Field(
23
+ Vintages.ashrae_2019,
24
+ description='Text for the vintage of the template system. This will be used '
25
+ 'to set efficiencies for various pieces of equipment within the system. '
26
+ 'Further information about these defaults can be found in the version of '
27
+ 'ASHRAE 90.1 corresponding to the selected vintage. Read-only versions '
28
+ 'of the standard can be found at: https://www.ashrae.org/technical-resources/'
29
+ 'standards-and-guidelines/read-only-versions-of-ashrae-standards'
30
+ )
31
+
32
+
33
+ class RadiantFaceTypes(str, Enum):
34
+ floor = 'Floor'
35
+ ceiling = 'Ceiling'
36
+ floor_with_carpet = 'FloorWithCarpet'
37
+ ceiling_metal_panel = 'CeilingMetalPanel'
38
+ floor_with_hardwood = 'FloorWithHardwood'