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,473 @@
1
+ """Model schema and the 5 geometry objects that define it."""
2
+ from pydantic import BaseModel, Field, validator, root_validator, constr
3
+ from typing import List, Union
4
+ from enum import Enum
5
+
6
+ from ._base import IDdBaseModel
7
+ from .boundarycondition import Outdoors, Surface, Ground, Adiabatic, OtherSideTemperature
8
+
9
+ from .energy.properties import ShadeEnergyPropertiesAbridged, \
10
+ DoorEnergyPropertiesAbridged, ApertureEnergyPropertiesAbridged, \
11
+ FaceEnergyPropertiesAbridged, RoomEnergyPropertiesAbridged, \
12
+ ModelEnergyProperties, ShadeMeshEnergyPropertiesAbridged
13
+
14
+ from .radiance.properties import ShadeRadiancePropertiesAbridged, \
15
+ DoorRadiancePropertiesAbridged, ApertureRadiancePropertiesAbridged, \
16
+ FaceRadiancePropertiesAbridged, RoomRadiancePropertiesAbridged, \
17
+ ModelRadianceProperties, ShadeMeshRadiancePropertiesAbridged
18
+
19
+ from .doe2.properties import RoomDoe2Properties, ModelDoe2Properties
20
+
21
+ from .geometry import Face3D, Mesh3D
22
+
23
+
24
+ class ShadeMeshPropertiesAbridged(BaseModel):
25
+
26
+ type: constr(regex='^ShadeMeshPropertiesAbridged$') = 'ShadeMeshPropertiesAbridged'
27
+
28
+ energy: ShadeMeshEnergyPropertiesAbridged = Field(
29
+ default=None
30
+ )
31
+
32
+ radiance: ShadeMeshRadiancePropertiesAbridged = Field(
33
+ default=None
34
+ )
35
+
36
+
37
+ class ShadeMesh(IDdBaseModel):
38
+
39
+ type: constr(regex='^ShadeMesh$') = 'ShadeMesh'
40
+
41
+ geometry: Mesh3D = Field(
42
+ ...,
43
+ description='A Mesh3D for the geometry.'
44
+ )
45
+
46
+ properties: ShadeMeshPropertiesAbridged = Field(
47
+ ...,
48
+ description='Extension properties for particular simulation engines '
49
+ '(Radiance, EnergyPlus).'
50
+ )
51
+
52
+ is_detached: bool = Field(
53
+ True,
54
+ description='Boolean to note whether this shade is detached from any of '
55
+ 'the other geometry in the model. Cases where this should be True include '
56
+ 'shade representing surrounding buildings or context.'
57
+ )
58
+
59
+
60
+ class ShadePropertiesAbridged(BaseModel):
61
+
62
+ type: constr(regex='^ShadePropertiesAbridged$') = 'ShadePropertiesAbridged'
63
+
64
+ energy: ShadeEnergyPropertiesAbridged = Field(
65
+ default=None
66
+ )
67
+
68
+ radiance: ShadeRadiancePropertiesAbridged = Field(
69
+ default=None
70
+ )
71
+
72
+
73
+ class Shade(IDdBaseModel):
74
+
75
+ type: constr(regex='^Shade$') = 'Shade'
76
+
77
+ geometry: Face3D = Field(
78
+ ...,
79
+ description='Planar Face3D for the geometry.'
80
+ )
81
+
82
+ properties: ShadePropertiesAbridged = Field(
83
+ ...,
84
+ description='Extension properties for particular simulation engines '
85
+ '(Radiance, EnergyPlus).'
86
+ )
87
+
88
+ is_detached: bool = Field(
89
+ False,
90
+ description='Boolean to note whether this shade is detached from any of '
91
+ 'the other geometry in the model. Cases where this should be True include '
92
+ 'shade representing surrounding buildings or context. Note that this '
93
+ 'should always be False for shades assigned to parent objects.'
94
+ )
95
+
96
+
97
+ class DoorPropertiesAbridged(BaseModel):
98
+
99
+ type: constr(regex='^DoorPropertiesAbridged$') = 'DoorPropertiesAbridged'
100
+
101
+ energy: DoorEnergyPropertiesAbridged = Field(
102
+ default=None
103
+ )
104
+
105
+ radiance: DoorRadiancePropertiesAbridged = Field(
106
+ default=None
107
+ )
108
+
109
+
110
+ class Door(IDdBaseModel):
111
+
112
+ type: constr(regex='^Door$') = 'Door'
113
+
114
+ geometry: Face3D = Field(
115
+ ...,
116
+ description='Planar Face3D for the geometry.'
117
+ )
118
+
119
+ boundary_condition: Union[Outdoors, Surface]
120
+
121
+ @validator('boundary_condition')
122
+ def surface_bc_objects(cls, v):
123
+ if v.type == 'Surface':
124
+ assert len(v.boundary_condition_objects) == 3, 'Door Surface boundary ' \
125
+ 'condition must have 3 boundary_condition_objects.'
126
+ return v
127
+
128
+ is_glass: bool = Field(
129
+ False,
130
+ description='Boolean to note whether this object is a glass door as opposed '
131
+ 'to an opaque door.'
132
+ )
133
+
134
+ indoor_shades: List[Shade] = Field(
135
+ default=None,
136
+ description='Shades assigned to the interior side of this object.'
137
+ )
138
+
139
+ outdoor_shades: List[Shade] = Field(
140
+ default=None,
141
+ description='Shades assigned to the exterior side of this object '
142
+ '(eg. entryway awning).'
143
+ )
144
+
145
+ properties: DoorPropertiesAbridged = Field(
146
+ ...,
147
+ description='Extension properties for particular simulation engines '
148
+ '(Radiance, EnergyPlus).'
149
+ )
150
+
151
+
152
+ class AperturePropertiesAbridged(BaseModel):
153
+
154
+ type: constr(regex='^AperturePropertiesAbridged$') = 'AperturePropertiesAbridged'
155
+
156
+ energy: ApertureEnergyPropertiesAbridged = Field(
157
+ default=None
158
+ )
159
+
160
+ radiance: ApertureRadiancePropertiesAbridged = Field(
161
+ default=None
162
+ )
163
+
164
+
165
+ class Aperture(IDdBaseModel):
166
+
167
+ type: constr(regex='^Aperture$') = 'Aperture'
168
+
169
+ geometry: Face3D = Field(
170
+ ...,
171
+ description='Planar Face3D for the geometry.'
172
+ )
173
+
174
+ boundary_condition: Union[Outdoors, Surface]
175
+
176
+ @validator('boundary_condition')
177
+ def surface_bc_objects(cls, v):
178
+ if v.type == 'Surface':
179
+ assert len(v.boundary_condition_objects) == 3, 'Aperture Surface boundary ' \
180
+ 'condition must have 3 boundary_condition_objects.'
181
+ return v
182
+
183
+ is_operable: bool = Field(
184
+ False,
185
+ description='Boolean to note whether the Aperture can be opened for ventilation.'
186
+ )
187
+
188
+ indoor_shades: List[Shade] = Field(
189
+ default=None,
190
+ description='Shades assigned to the interior side of this object '
191
+ '(eg. window sill, light shelf).'
192
+ )
193
+
194
+ outdoor_shades: List[Shade] = Field(
195
+ default=None,
196
+ description='Shades assigned to the exterior side of this object '
197
+ '(eg. mullions, louvers).'
198
+ )
199
+
200
+ properties: AperturePropertiesAbridged = Field(
201
+ ...,
202
+ description='Extension properties for particular simulation engines '
203
+ '(Radiance, EnergyPlus).'
204
+ )
205
+
206
+
207
+ class FacePropertiesAbridged(BaseModel):
208
+
209
+ type: constr(regex='^FacePropertiesAbridged$') = 'FacePropertiesAbridged'
210
+
211
+ energy: FaceEnergyPropertiesAbridged = Field(
212
+ default=None
213
+ )
214
+
215
+ radiance: FaceRadiancePropertiesAbridged = Field(
216
+ default=None
217
+ )
218
+
219
+
220
+ class FaceType(str, Enum):
221
+
222
+ wall = 'Wall'
223
+ floor = 'Floor'
224
+ roof_ceiling = 'RoofCeiling'
225
+ air_boundary = 'AirBoundary'
226
+
227
+
228
+ class Face(IDdBaseModel):
229
+
230
+ type: constr(regex='^Face$') = 'Face'
231
+
232
+ geometry: Face3D = Field(
233
+ ...,
234
+ description='Planar Face3D for the geometry.'
235
+ )
236
+
237
+ face_type: FaceType
238
+
239
+ boundary_condition: Union[Ground, Outdoors, Adiabatic, Surface, OtherSideTemperature]
240
+
241
+ @validator('boundary_condition')
242
+ def surface_bc_objects(cls, v):
243
+ if v.type == 'Surface':
244
+ assert len(v.boundary_condition_objects) == 2, 'Face Surface boundary ' \
245
+ 'condition must have 2 boundary_condition_objects.'
246
+ return v
247
+
248
+ apertures: List[Aperture] = Field(
249
+ default=None,
250
+ description='Apertures assigned to this Face. Should be coplanar with this '
251
+ 'Face and completely within the boundary of the Face to be valid.'
252
+ )
253
+
254
+ doors: List[Door] = Field(
255
+ default=None,
256
+ description='Doors assigned to this Face. Should be coplanar with this '
257
+ 'Face and completely within the boundary of the Face to be valid.'
258
+ )
259
+
260
+ indoor_shades: List[Shade] = Field(
261
+ default=None,
262
+ description='Shades assigned to the interior side of this object.'
263
+ )
264
+
265
+ outdoor_shades: List[Shade] = Field(
266
+ default=None,
267
+ description='Shades assigned to the exterior side of this object '
268
+ '(eg. balcony, overhang).'
269
+ )
270
+
271
+ properties: FacePropertiesAbridged = Field(
272
+ ...,
273
+ description='Extension properties for particular simulation engines '
274
+ '(Radiance, EnergyPlus).'
275
+ )
276
+
277
+ @root_validator
278
+ def check_air_boundaries_are_interior(cls, values):
279
+ """Check that all air wall faces have a Surface boundary condition."""
280
+ face_type, bc = values.get('face_type'), values.get('boundary_condition')
281
+ if face_type == 'AirBoundary':
282
+ assert bc.type == 'Surface', \
283
+ 'AirBoundaries must have "Surface" boundary conditions.'
284
+ return values
285
+
286
+
287
+ class RoomPropertiesAbridged(BaseModel):
288
+
289
+ type: constr(regex='^RoomPropertiesAbridged$') = 'RoomPropertiesAbridged'
290
+
291
+ energy: RoomEnergyPropertiesAbridged = Field(
292
+ default=None
293
+ )
294
+
295
+ radiance: RoomRadiancePropertiesAbridged = Field(
296
+ default=None
297
+ )
298
+
299
+ doe2: RoomDoe2Properties = Field(
300
+ default=None
301
+ )
302
+
303
+
304
+ class Room(IDdBaseModel):
305
+
306
+ type: constr(regex='^Room$') = 'Room'
307
+
308
+ faces: List[Face] = Field(
309
+ ...,
310
+ min_items=4,
311
+ description='Faces that together form the closed volume of a room.'
312
+ )
313
+
314
+ indoor_shades: List[Shade] = Field(
315
+ default=None,
316
+ description='Shades assigned to the interior side of this object '
317
+ '(eg. partitions, tables).'
318
+ )
319
+
320
+ outdoor_shades: List[Shade] = Field(
321
+ default=None,
322
+ description='Shades assigned to the exterior side of this object '
323
+ '(eg. trees, landscaping).'
324
+ )
325
+
326
+ multiplier: int = Field(
327
+ 1,
328
+ ge=1,
329
+ description='An integer noting how many times this Room is repeated. '
330
+ 'Multipliers are used to speed up the calculation when similar Rooms are '
331
+ 'repeated more than once. Essentially, a given simulation with the '
332
+ 'Room is run once and then the result is multiplied by the multiplier.'
333
+ )
334
+
335
+ exclude_floor_area: bool = Field(
336
+ False,
337
+ description='A boolean for whether the Room floor area contributes to Models '
338
+ 'it is a part of. Note that this will not affect the floor_area property of '
339
+ 'this Room itself but it will ensure the Room floor area is excluded from '
340
+ 'any calculations when the Room is part of a Model, including EUI calculations.'
341
+ )
342
+
343
+ zone: str = Field(
344
+ default=None,
345
+ description='Text string for for the zone identifier to which this Room belongs. '
346
+ 'Rooms sharing the same zone identifier are considered part of the same zone '
347
+ 'in a Model. If the zone identifier has not been specified, it will be '
348
+ 'the same as the Room identifier in the destination engine. Note that this '
349
+ 'property has no character restrictions.'
350
+ )
351
+
352
+ story: str = Field(
353
+ default=None,
354
+ description='Text string for the story identifier to which this Room belongs. '
355
+ 'Rooms sharing the same story identifier are considered part of the same '
356
+ 'story in a Model. Note that this property has no character restrictions.'
357
+ )
358
+
359
+ properties: RoomPropertiesAbridged = Field(
360
+ ...,
361
+ description='Extension properties for particular simulation engines '
362
+ '(Radiance, EnergyPlus).'
363
+ )
364
+
365
+
366
+ class Units(str, Enum):
367
+ meters = 'Meters'
368
+ millimeters = 'Millimeters'
369
+ feet = 'Feet'
370
+ inches = 'Inches'
371
+ centimeters = 'Centimeters'
372
+
373
+
374
+ class ModelProperties(BaseModel):
375
+
376
+ type: constr(regex='^ModelProperties$') = 'ModelProperties'
377
+
378
+ energy: ModelEnergyProperties = Field(
379
+ default=None
380
+ )
381
+
382
+ radiance: ModelRadianceProperties = Field(
383
+ default=None
384
+ )
385
+
386
+ doe2: ModelDoe2Properties = Field(
387
+ default=None
388
+ )
389
+
390
+
391
+ class Model(IDdBaseModel):
392
+
393
+ type: constr(regex='^Model$') = 'Model'
394
+
395
+ version: str = Field(
396
+ default='0.0.0',
397
+ regex=r'([0-9]+)\.([0-9]+)\.([0-9]+)',
398
+ description='Text string for the current version of the schema.'
399
+ )
400
+
401
+ rooms: List[Room] = Field(
402
+ default=None,
403
+ description='A list of Rooms in the model.'
404
+ )
405
+
406
+ orphaned_faces: List[Face] = Field(
407
+ default=None,
408
+ description='A list of Faces in the model that lack a parent Room. Note that '
409
+ 'orphaned Faces are not acceptable for Models that are to be exported '
410
+ 'for energy simulation.'
411
+ )
412
+
413
+ orphaned_shades: List[Shade] = Field(
414
+ default=None,
415
+ description='A list of Shades in the model that lack a parent.'
416
+ )
417
+
418
+ orphaned_apertures: List[Aperture] = Field(
419
+ default=None,
420
+ description='A list of Apertures in the model that lack a parent Face. '
421
+ 'Note that orphaned Apertures are not acceptable for Models that are '
422
+ 'to be exported for energy simulation.'
423
+ )
424
+
425
+ orphaned_doors: List[Door] = Field(
426
+ default=None,
427
+ description='A list of Doors in the model that lack a parent Face. '
428
+ 'Note that orphaned Doors are not acceptable for Models that are '
429
+ 'to be exported for energy simulation.'
430
+ )
431
+
432
+ shade_meshes: List[ShadeMesh] = Field(
433
+ default=None,
434
+ description='A list of ShadeMesh in the model.'
435
+ )
436
+
437
+ units: Units = Field(
438
+ default=Units.meters,
439
+ description='Text indicating the units in which the model geometry exists. '
440
+ 'This is used to scale the geometry to the correct units for simulation '
441
+ 'engines like EnergyPlus, which requires all geometry be in meters.'
442
+ )
443
+
444
+ tolerance: float = Field(
445
+ default=0.01,
446
+ ge=0,
447
+ description='The maximum difference between x, y, and z values at which '
448
+ 'vertices are considered equivalent. This value should be in the Model '
449
+ 'units and it is used in a variety of checks, including checks for '
450
+ 'whether Room faces form a closed volume and subsequently correcting all '
451
+ 'face normals point outward from the Room. A value of 0 will result '
452
+ 'in bypassing all checks so it is recommended that this always be a positive '
453
+ 'number when such checks have not already been performed on a Model. '
454
+ 'The default of 0.01 is suitable for models in meters.'
455
+ )
456
+
457
+ angle_tolerance: float = Field(
458
+ default=1.0,
459
+ ge=0,
460
+ description='The max angle difference in degrees that vertices are '
461
+ 'allowed to differ from one another in order to consider them colinear. '
462
+ 'This value is used in a variety of checks, including checks for '
463
+ 'whether Room faces form a closed volume and subsequently correcting all '
464
+ 'face normals point outward from the Room. A value of 0 will result '
465
+ 'in bypassing all checks so it is recommended that this always be a positive '
466
+ 'number when such checks have not already been performed on a given Model.'
467
+ )
468
+
469
+ properties: ModelProperties = Field(
470
+ ...,
471
+ description='Extension properties for particular simulation engines '
472
+ '(Radiance, EnergyPlus).'
473
+ )
@@ -0,0 +1,94 @@
1
+ """Schema for project information."""
2
+ from pydantic import BaseModel, Field, constr, AnyUrl
3
+ from typing import List, Union
4
+
5
+ from .altnumber import Autocalculate
6
+ from .energy.simulation import EfficiencyStandards, ClimateZones, BuildingTypes
7
+
8
+
9
+ class Location(BaseModel):
10
+ """A Ladybug Location."""
11
+
12
+ type: constr(regex='^Location$') = 'Location'
13
+
14
+ city: str = Field(
15
+ '-',
16
+ description='Name of the city as a string.'
17
+ )
18
+
19
+ latitude: float = Field(
20
+ 0,
21
+ description='Location latitude between -90 and 90 (Default: 0).'
22
+ )
23
+
24
+ longitude: float = Field(
25
+ 0,
26
+ description='Location longitude between -180 (west) and 180 (east) (Default: 0).'
27
+ )
28
+
29
+ time_zone: Union[Autocalculate, int] = Field(
30
+ Autocalculate(),
31
+ ge=-12,
32
+ le=14,
33
+ description='Time zone between -12 hours (west) and +14 hours (east). '
34
+ 'If None, the time zone will be an estimated integer value derived from '
35
+ 'the longitude in accordance with solar time.'
36
+ )
37
+
38
+ elevation: float = Field(
39
+ 0,
40
+ description='A number for elevation of the location in meters. (Default: 0).'
41
+ )
42
+
43
+ station_id: str = Field(
44
+ None,
45
+ description='ID of the location if the location is representing a weather '
46
+ 'station.'
47
+ )
48
+
49
+ source: str = Field(
50
+ None, description='Source of data (e.g. TMY, TMY3).'
51
+ )
52
+
53
+
54
+ class ProjectInfo(BaseModel):
55
+ """Project information."""
56
+
57
+ type: constr(regex='^ProjectInfo$') = 'ProjectInfo'
58
+
59
+ north: float = Field(
60
+ 0,
61
+ description='A number between -360 to 360 where positive values rotate the '
62
+ 'compass counterclockwise (towards the West) and negative values rotate the '
63
+ 'compass clockwise (towards the East).',
64
+ le=360, ge=-360
65
+ )
66
+
67
+ weather_urls: List[AnyUrl] = Field(
68
+ None,
69
+ description='A list of URLs to zip files that includes EPW, DDY and STAT files. '
70
+ 'You can find these URLs from the EPWMAP. The first URL will be used as the '
71
+ 'primary weather file.'
72
+ )
73
+
74
+ location: Location = Field(
75
+ None,
76
+ description='Project location. This value is usually generated from the '
77
+ 'information in the weather files.'
78
+ )
79
+
80
+ ashrae_climate_zone: ClimateZones = Field(
81
+ None,
82
+ description='Project location climate zone.'
83
+ )
84
+
85
+ building_type: List[BuildingTypes] = Field(
86
+ None,
87
+ description='A list of building types for the project. The first building '
88
+ 'type is considered the primary type for the project.'
89
+ )
90
+
91
+ vintage: List[EfficiencyStandards] = Field(
92
+ None,
93
+ description='A list of building vintages (e.g. ASHRAE_2019, ASHRAE_2016).'
94
+ )
File without changes
@@ -0,0 +1,22 @@
1
+ """Base class used by radiance schema objects."""
2
+ from pydantic import Field, validator
3
+ import re
4
+ from .._base import NoExtraBaseModel
5
+
6
+
7
+ class IDdRadianceBaseModel(NoExtraBaseModel):
8
+ """Base class for all objects requiring a valid Radiance identifier."""
9
+
10
+ identifier: str = Field(
11
+ ...,
12
+ regex=r'^[.A-Za-z0-9_-]+$',
13
+ min_length=1,
14
+ description='Text string for a unique Radiance object. Must not contain spaces '
15
+ 'or special characters. This will be used to identify the object '
16
+ 'across a model and in the exported Radiance files.'
17
+ )
18
+
19
+ display_name: str = Field(
20
+ default=None,
21
+ description='Display name of the object with no character restrictions.'
22
+ )