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,627 @@
1
+ """Load Schemas"""
2
+ from pydantic import Field, root_validator, constr
3
+ from typing import Union
4
+ from enum import Enum
5
+
6
+ from ._base import IDdEnergyBaseModel
7
+ from .schedule import ScheduleRuleset, ScheduleFixedInterval
8
+ from ..altnumber import Autocalculate
9
+
10
+
11
+ class PeopleAbridged(IDdEnergyBaseModel):
12
+
13
+ type: constr(regex='^PeopleAbridged$') = 'PeopleAbridged'
14
+
15
+ people_per_area: float = Field(
16
+ ...,
17
+ ge=0,
18
+ description='People per floor area expressed as [people/m2]'
19
+ )
20
+
21
+ occupancy_schedule: str = Field(
22
+ ...,
23
+ min_length=1,
24
+ max_length=100,
25
+ description='Identifier of a schedule for the occupancy over the course of the '
26
+ 'year. The type of this schedule should be Fractional and the fractional '
27
+ 'values will get multiplied by the people_per_area to yield a complete '
28
+ 'occupancy profile.'
29
+ )
30
+
31
+ activity_schedule: str = Field(
32
+ default=None,
33
+ min_length=1,
34
+ max_length=100,
35
+ description='Identifier of a schedule for the activity of the occupants over '
36
+ 'the course of the year. The type of this schedule should be ActivityLevel '
37
+ 'and the values of the schedule equal to the number of Watts given off by an '
38
+ 'individual person in the room. If None, a default constant schedule with '
39
+ '120 Watts per person will be used, which is typical of awake, adult humans '
40
+ 'who are seated.'
41
+ )
42
+
43
+ radiant_fraction: float = Field(
44
+ 0.3,
45
+ ge=0,
46
+ le=1,
47
+ description='The radiant fraction of sensible heat released by people. '
48
+ '(Default: 0.3).'
49
+ )
50
+
51
+ latent_fraction: Union[Autocalculate, float] = Field(
52
+ Autocalculate(),
53
+ ge=0,
54
+ le=1,
55
+ description='Number for the latent fraction of heat gain due to people or '
56
+ 'an Autocalculate object.'
57
+ )
58
+
59
+ @root_validator
60
+ def check_sum_fractions(cls, values):
61
+ "Ensure sum is less than 1."
62
+ rad = values.get('radiant_fraction')
63
+ latent = values.get('latent_fraction')
64
+ if latent is not None and isinstance(latent, float):
65
+ assert rad + latent <= 1, \
66
+ 'Sum of radiant and latent fractions cannot be greater than 1.'
67
+ return values
68
+
69
+
70
+ class People(PeopleAbridged):
71
+
72
+ type: constr(regex='^People$') = 'People'
73
+
74
+ occupancy_schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
75
+ ...,
76
+ description='A schedule for the occupancy over the course of the '
77
+ 'year. The type of this schedule should be Fractional and the fractional '
78
+ 'values will get multiplied by the people_per_area to yield a complete '
79
+ 'occupancy profile.'
80
+ )
81
+
82
+ activity_schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
83
+ default=None,
84
+ description='A schedule for the activity of the occupants over the '
85
+ 'course of the year. The type of this schedule should be ActivityLevel '
86
+ 'and the values of the schedule equal to the number of Watts given off by an '
87
+ 'individual person in the room. If None, a default constant schedule with '
88
+ '120 Watts per person will be used, which is typical of awake, adult humans '
89
+ 'who are seated.'
90
+ )
91
+
92
+
93
+ class LightingAbridged(IDdEnergyBaseModel):
94
+
95
+ type: constr(regex='^LightingAbridged$') = 'LightingAbridged'
96
+
97
+ watts_per_area: float = Field(
98
+ ...,
99
+ ge=0,
100
+ description='Lighting per floor area as [W/m2].'
101
+ )
102
+
103
+ schedule: str = Field(
104
+ ...,
105
+ min_length=1,
106
+ max_length=100,
107
+ description='Identifier of the schedule for the use of lights over the course '
108
+ 'of the year. The type of this schedule should be Fractional and the '
109
+ 'fractional values will get multiplied by the watts_per_area to yield a '
110
+ 'complete lighting profile.'
111
+ )
112
+
113
+ visible_fraction: float = Field(
114
+ 0.25,
115
+ ge=0,
116
+ le=1,
117
+ description='The fraction of heat from lights that goes into the zone as '
118
+ 'visible (short-wave) radiation. (Default: 0.25).'
119
+ )
120
+
121
+ radiant_fraction: float = Field(
122
+ 0.32,
123
+ ge=0,
124
+ le=1,
125
+ description='The fraction of heat from lights that is long-wave radiation. '
126
+ '(Default: 0.32).'
127
+ )
128
+
129
+ return_air_fraction: float = Field(
130
+ 0.0,
131
+ ge=0,
132
+ le=1,
133
+ description='The fraction of the heat from lights that goes into the zone '
134
+ 'return air. (Default: 0).'
135
+ )
136
+
137
+ baseline_watts_per_area: float = Field(
138
+ 11.84029,
139
+ ge=0,
140
+ description='The baseline lighting power density in [W/m2] of floor area. '
141
+ 'This baseline is useful to track how much better the installed lights are '
142
+ 'in comparison to a standard like ASHRAE 90.1. If set to None, it will '
143
+ 'default to 11.84029 W/m2, which is that ASHRAE 90.1-2004 baseline for '
144
+ 'an office.'
145
+ )
146
+
147
+ @root_validator
148
+ def check_sum_fractions(cls, values):
149
+ "Ensure sum is less than 1."
150
+ return_air = values.get('return_air_fraction')
151
+ vis = values.get('visible_fraction')
152
+ rad = values.get('radiant_fraction')
153
+ assert sum((return_air, vis, rad)) <= 1, \
154
+ 'Sum of visible, radiant, and return air fractions cannot be greater than 1.'
155
+ return values
156
+
157
+
158
+ class Lighting(LightingAbridged):
159
+
160
+ type: constr(regex='^Lighting$') = 'Lighting'
161
+
162
+ schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
163
+ ...,
164
+ description='The schedule for the use of lights over the course of '
165
+ 'the year. The type of this schedule should be Fractional and the '
166
+ 'fractional values will get multiplied by the watts_per_area to yield a '
167
+ 'complete lighting profile.'
168
+ )
169
+
170
+
171
+ class _EquipmentBase(IDdEnergyBaseModel):
172
+
173
+ watts_per_area: float = Field(
174
+ ...,
175
+ ge=0,
176
+ description='Equipment level per floor area as [W/m2].'
177
+ )
178
+
179
+ schedule: str = Field(
180
+ ...,
181
+ min_length=1,
182
+ max_length=100,
183
+ description='Identifier of the schedule for the use of equipment over the '
184
+ 'course of the year. The type of this schedule should be Fractional and the '
185
+ 'fractional values will get multiplied by the watts_per_area to yield '
186
+ 'a complete equipment profile.'
187
+ )
188
+
189
+ radiant_fraction: float = Field(
190
+ 0,
191
+ ge=0,
192
+ le=1,
193
+ description='Number for the amount of long-wave radiation heat given off'
194
+ ' by equipment. Default value is 0.'
195
+ )
196
+
197
+ latent_fraction: float = Field(
198
+ 0,
199
+ ge=0,
200
+ le=1,
201
+ description='Number for the amount of latent heat given off by '
202
+ 'equipment. Default value is 0.'
203
+
204
+ )
205
+
206
+ lost_fraction: float = Field(
207
+ 0,
208
+ ge=0,
209
+ le=1,
210
+ description='Number for the amount of “lost” heat being given off by '
211
+ 'equipment. The default value is 0.'
212
+ )
213
+
214
+ @root_validator
215
+ def check_sum_fractions(cls, values):
216
+ "Ensure sum is less than 1."
217
+ rad = values.get('radiant_fraction')
218
+ latent = values.get('latent_fraction')
219
+ lost = values.get('lost_fraction')
220
+ assert sum((rad, latent, lost)) <= 1, \
221
+ 'Sum of radiant, latent, and lost fractions cannot be greater than 1.'
222
+ return values
223
+
224
+
225
+ class ElectricEquipmentAbridged(_EquipmentBase):
226
+
227
+ type: constr(regex='^ElectricEquipmentAbridged$') = 'ElectricEquipmentAbridged'
228
+
229
+
230
+ class ElectricEquipment(ElectricEquipmentAbridged):
231
+
232
+ type: constr(regex='^ElectricEquipment$') = 'ElectricEquipment'
233
+
234
+ schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
235
+ ...,
236
+ description='The schedule for the use of equipment over the course '
237
+ 'of the year. The type of this schedule should be Fractional and the '
238
+ 'fractional values will get multiplied by the watts_per_area to yield '
239
+ 'a complete equipment profile.'
240
+ )
241
+
242
+
243
+ class GasEquipmentAbridged(_EquipmentBase):
244
+
245
+ type: constr(regex='^GasEquipmentAbridged$') = 'GasEquipmentAbridged'
246
+
247
+
248
+ class GasEquipment(GasEquipmentAbridged):
249
+
250
+ type: constr(regex='^GasEquipment$') = 'GasEquipment'
251
+
252
+ schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
253
+ ...,
254
+ description='The schedule for the use of equipment over the course '
255
+ 'of the year. The type of this schedule should be Fractional and the '
256
+ 'fractional values will get multiplied by the watts_per_area to yield '
257
+ 'a complete equipment profile.'
258
+ )
259
+
260
+
261
+ class ServiceHotWaterAbridged(IDdEnergyBaseModel):
262
+
263
+ type: constr(regex='^ServiceHotWaterAbridged$') = 'ServiceHotWaterAbridged'
264
+
265
+ flow_per_area: float = Field(
266
+ ...,
267
+ ge=0,
268
+ description='Number for the total volume flow rate of water per unit area '
269
+ 'of floor [L/h-m2].'
270
+ )
271
+
272
+ schedule: str = Field(
273
+ ...,
274
+ min_length=1,
275
+ max_length=100,
276
+ description='Identifier of the schedule for the hot water use over the course '
277
+ 'of the year. The type of this schedule should be Fractional and the '
278
+ 'fractional values will get multiplied by the flow_per_area to yield a '
279
+ 'complete water usage profile.'
280
+ )
281
+
282
+ target_temperature: float = Field(
283
+ 60,
284
+ gt=0,
285
+ description='Number for the target temperature of water out of the tap (C). '
286
+ 'This the temperature after hot water has been mixed with cold water '
287
+ 'from the water mains. The default is 60C, which essentially assumes that the '
288
+ 'flow_per_area on this object is only for water straight out of the '
289
+ 'water heater.'
290
+ )
291
+
292
+ sensible_fraction: float = Field(
293
+ 0.2,
294
+ ge=0,
295
+ le=1,
296
+ description='A number between 0 and 1 for the fraction of the total hot water '
297
+ 'load given off as sensible heat in the zone.'
298
+ )
299
+
300
+ latent_fraction: float = Field(
301
+ 0.05,
302
+ ge=0,
303
+ le=1,
304
+ description='A number between 0 and 1 for the fraction of the total hot '
305
+ 'water load that is latent.'
306
+ )
307
+
308
+ @root_validator
309
+ def check_sum_fractions(cls, values):
310
+ "Ensure sum is less than 1."
311
+ sens = values.get('sensible_fraction')
312
+ lat = values.get('latent_fraction')
313
+ assert sum((sens, lat)) <= 1, \
314
+ 'Sum of sensible and latent fractions cannot be greater than 1.'
315
+ return values
316
+
317
+
318
+ class ServiceHotWater(ServiceHotWaterAbridged):
319
+
320
+ type: constr(regex='^ServiceHotWater$') = 'ServiceHotWater'
321
+
322
+ schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
323
+ ...,
324
+ description='The schedule for the use of hot water over the course of '
325
+ 'the year. The type of this schedule should be Fractional and the '
326
+ 'fractional values will get multiplied by the flow_per_area to yield a '
327
+ 'complete water usage profile.'
328
+ )
329
+
330
+
331
+ class InfiltrationAbridged(IDdEnergyBaseModel):
332
+
333
+ type: constr(regex='^InfiltrationAbridged$') = 'InfiltrationAbridged'
334
+
335
+ flow_per_exterior_area: float = Field(
336
+ ...,
337
+ ge=0,
338
+ description='Number for the infiltration per exterior surface area in m3/s-m2.'
339
+ )
340
+
341
+ schedule: str = Field(
342
+ ...,
343
+ min_length=1,
344
+ max_length=100,
345
+ description='Identifier of the schedule for the infiltration over the course of '
346
+ 'the year. The type of this schedule should be Fractional and the '
347
+ 'fractional values will get multiplied by the flow_per_exterior_area '
348
+ 'to yield a complete infiltration profile.'
349
+ )
350
+
351
+ constant_coefficient: float = Field(
352
+ 1,
353
+ ge=0
354
+ )
355
+
356
+ temperature_coefficient: float = Field(
357
+ 0,
358
+ ge=0
359
+ )
360
+
361
+ velocity_coefficient: float = Field(
362
+ 0,
363
+ ge=0
364
+ )
365
+
366
+
367
+ class Infiltration(InfiltrationAbridged):
368
+
369
+ type: constr(regex='^Infiltration$') = 'Infiltration'
370
+
371
+ schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
372
+ ...,
373
+ description='The schedule for the infiltration over the course of '
374
+ 'the year. The type of this schedule should be Fractional and the '
375
+ 'fractional values will get multiplied by the flow_per_exterior_area '
376
+ 'to yield a complete infiltration profile.'
377
+ )
378
+
379
+
380
+ class VentilationAbridged(IDdEnergyBaseModel):
381
+
382
+ type: constr(regex='^VentilationAbridged$') = 'VentilationAbridged'
383
+
384
+ flow_per_person: float = Field(
385
+ 0,
386
+ ge=0,
387
+ description='Intensity of ventilation in[] m3/s per person]. Note that '
388
+ 'setting this value does not mean that ventilation is varied based on '
389
+ 'real-time occupancy but rather that the design level of ventilation '
390
+ 'is determined using this value and the People object of the Room.'
391
+ )
392
+
393
+ flow_per_area: float = Field(
394
+ 0,
395
+ ge=0,
396
+ description='Intensity of ventilation in [m3/s per m2 of floor area].'
397
+ )
398
+
399
+ air_changes_per_hour: float = Field(
400
+ 0,
401
+ ge=0,
402
+ description='Intensity of ventilation in air changes per hour (ACH) for '
403
+ 'the entire Room.'
404
+ )
405
+
406
+ flow_per_zone: float = Field(
407
+ 0,
408
+ ge=0,
409
+ description='Intensity of ventilation in m3/s for the entire Room.'
410
+ )
411
+
412
+ schedule: str = Field(
413
+ default=None,
414
+ min_length=1,
415
+ max_length=100,
416
+ description='Identifier of the schedule for the ventilation over the course of '
417
+ 'the year. The type of this schedule should be Fractional and the '
418
+ 'fractional values will get multiplied by the total design flow rate '
419
+ '(determined from the sum of the other 4 fields) to yield a complete '
420
+ 'ventilation profile.'
421
+ )
422
+
423
+
424
+ class Ventilation(VentilationAbridged):
425
+
426
+ type: constr(regex='^Ventilation$') = 'Ventilation'
427
+
428
+ schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
429
+ default=None,
430
+ description='Schedule for the ventilation over the course of '
431
+ 'the year. The type of this schedule should be Fractional and the '
432
+ 'fractional values will get multiplied by the total design flow rate '
433
+ '(determined from the sum of the other 4 fields) to yield a complete '
434
+ 'ventilation profile.'
435
+ )
436
+
437
+
438
+ class SetpointAbridged(IDdEnergyBaseModel):
439
+ """Used to specify information about the setpoint schedule."""
440
+
441
+ type: constr(regex='^SetpointAbridged$') = 'SetpointAbridged'
442
+
443
+ cooling_schedule: str = Field(
444
+ ...,
445
+ min_length=1,
446
+ max_length=100,
447
+ description='Identifier of the schedule for the cooling setpoint. The values in '
448
+ 'this schedule should be temperature in [C].'
449
+ )
450
+
451
+ heating_schedule: str = Field(
452
+ ...,
453
+ min_length=1,
454
+ max_length=100,
455
+ description='Identifier of the schedule for the heating setpoint. The values in '
456
+ 'this schedule should be temperature in [C].'
457
+ )
458
+
459
+ humidifying_schedule: str = Field(
460
+ default=None,
461
+ min_length=1,
462
+ max_length=100,
463
+ description='Identifier of the schedule for the humidification setpoint. '
464
+ 'The values in this schedule should be in [%].'
465
+ )
466
+
467
+ dehumidifying_schedule: str = Field(
468
+ default=None,
469
+ min_length=1,
470
+ max_length=100,
471
+ description='Identifier of the schedule for the dehumidification setpoint. '
472
+ 'The values in this schedule should be in [%].'
473
+ )
474
+
475
+ setpoint_cutout_difference: float = Field(
476
+ 0,
477
+ ge=0,
478
+ description='An optional positive number for the temperature '
479
+ 'difference between the cutout temperature and the setpoint temperature. '
480
+ 'Specifying a non-zero number here is useful for modeling the throttling '
481
+ 'range associated with a given setup of setpoint controls and HVAC equipment. '
482
+ 'Throttling ranges describe the range where a zone is slightly over-cooled '
483
+ 'or over-heated beyond the thermostat setpoint. They are used to avoid '
484
+ 'situations where HVAC systems turn on only to turn off a few minutes later, '
485
+ 'thereby wearing out the parts of mechanical systems faster. They can '
486
+ 'have a minor impact on energy consumption and can often have significant '
487
+ 'impacts on occupant thermal comfort, though using the default value '
488
+ 'of zero will often yield results that are close enough when trying '
489
+ 'to estimate the annual heating/cooling energy use. Specifying a value '
490
+ 'of zero effectively assumes that the system will turn on whenever '
491
+ 'conditions are outside the setpoint range and will cut out as soon '
492
+ 'as the setpoint is reached.'
493
+ )
494
+
495
+ @root_validator
496
+ def check_both_humid_sch(cls, values):
497
+ "Ensure that the other humidity schedule is included when one is."
498
+ humid = values.get('humidifying_schedule')
499
+ dehumid = values.get('dehumidifying_schedule')
500
+ if humid is not None:
501
+ assert dehumid is not None, 'When humidifying_schedule is specified, ' \
502
+ 'dehumidifying_schedule must also be specified.'
503
+ if dehumid is not None:
504
+ assert humid is not None, 'When dehumidifying_schedule is specified, ' \
505
+ 'humidifying_schedule must also be specified.'
506
+ return values
507
+
508
+
509
+ class Setpoint(SetpointAbridged):
510
+ """Used to specify information about the setpoint schedule."""
511
+
512
+ type: constr(regex='^Setpoint$') = 'Setpoint'
513
+
514
+ cooling_schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
515
+ ...,
516
+ description='Schedule for the cooling setpoint. The values in '
517
+ 'this schedule should be temperature in [C].'
518
+ )
519
+
520
+ heating_schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
521
+ ...,
522
+ description='Schedule for the heating setpoint. The values in '
523
+ 'this schedule should be temperature in [C].'
524
+ )
525
+
526
+ humidifying_schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
527
+ default=None,
528
+ description='Schedule for the humidification setpoint. The values '
529
+ 'in this schedule should be in [%].'
530
+ )
531
+
532
+ dehumidifying_schedule: Union[ScheduleRuleset, ScheduleFixedInterval] = Field(
533
+ default=None,
534
+ description='Schedule for the dehumidification setpoint. The values '
535
+ 'in this schedule should be in [%].'
536
+ )
537
+
538
+
539
+ class FuelTypes (str, Enum):
540
+ """Designates the acceptable fuel types for process loads."""
541
+ electricity = 'Electricity'
542
+ natural_gas = 'NaturalGas'
543
+ propane = 'Propane'
544
+ fuel_oil_no_1 = 'FuelOilNo1'
545
+ fuel_oil_no_2 = 'FuelOilNo2'
546
+ diesel = 'Diesel'
547
+ gasoline = 'Gasoline'
548
+ coal = 'Coal'
549
+ steam = 'Steam'
550
+ district_heating = 'DistrictHeating'
551
+ district_cooling = 'DistrictCooling'
552
+ other_fuel_1 = 'OtherFuel1'
553
+ other_fuel_2 = 'OtherFuel2'
554
+ none = 'None'
555
+
556
+
557
+ class ProcessAbridged(IDdEnergyBaseModel):
558
+
559
+ type: constr(regex='^ProcessAbridged$') = 'ProcessAbridged'
560
+
561
+ watts: float = Field(
562
+ ...,
563
+ ge=0,
564
+ description='A number for the process load power in Watts.'
565
+ )
566
+
567
+ schedule: str = Field(
568
+ ...,
569
+ min_length=1,
570
+ max_length=100,
571
+ description='Identifier of the schedule for the use of the process over the '
572
+ 'course of the year. The type of this schedule should be Fractional and the '
573
+ 'fractional values will get multiplied by the watts to yield a complete '
574
+ 'equipment profile.'
575
+ )
576
+
577
+ fuel_type: FuelTypes = Field(
578
+ ...,
579
+ description='Text to denote the type of fuel consumed by the process. '
580
+ 'Using the "None" type indicates that no end uses will be associated '
581
+ 'with the process, only the zone gains.'
582
+ )
583
+
584
+ end_use_category: str = Field(
585
+ 'Process',
586
+ min_length=1,
587
+ max_length=100,
588
+ description='Text to indicate the end-use subcategory, which will identify '
589
+ 'the process load in the end use output. For example, “Cooking”, '
590
+ '“Clothes Drying”, etc. A new meter for reporting is created for each '
591
+ 'unique subcategory.'
592
+ )
593
+
594
+ radiant_fraction: float = Field(
595
+ 0,
596
+ ge=0,
597
+ le=1,
598
+ description='Number for the amount of long-wave radiation heat given off'
599
+ ' by the process load. Default value is 0.'
600
+ )
601
+
602
+ latent_fraction: float = Field(
603
+ 0,
604
+ ge=0,
605
+ le=1,
606
+ description='Number for the amount of latent heat given off by the process '
607
+ 'load. Default value is 0.'
608
+
609
+ )
610
+
611
+ lost_fraction: float = Field(
612
+ 0,
613
+ ge=0,
614
+ le=1,
615
+ description='Number for the amount of “lost” heat being given off by '
616
+ 'the process load. The default value is 0.'
617
+ )
618
+
619
+ @root_validator
620
+ def check_sum_fractions(cls, values):
621
+ "Ensure sum is less than 1."
622
+ rad = values.get('radiant_fraction')
623
+ latent = values.get('latent_fraction')
624
+ lost = values.get('lost_fraction')
625
+ assert sum((rad, latent, lost)) <= 1, \
626
+ 'Sum of radiant, latent, and lost fractions cannot be greater than 1.'
627
+ return values