openepd 4.13.1__py3-none-any.whl → 5.1.0__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 (60) hide show
  1. openepd/__version__.py +1 -1
  2. openepd/model/common.py +40 -1
  3. openepd/model/declaration.py +7 -2
  4. openepd/model/geography.py +1 -1
  5. openepd/model/lcia.py +191 -19
  6. openepd/model/pcr.py +2 -2
  7. openepd/model/specs/README.md +34 -8
  8. openepd/model/specs/asphalt.py +2 -2
  9. openepd/model/specs/base.py +15 -5
  10. openepd/model/specs/generated/__init__.py +80 -0
  11. openepd/model/specs/generated/cladding.py +4 -4
  12. openepd/model/specs/generated/concrete.py +8 -7
  13. openepd/model/specs/generated/electrical.py +2 -2
  14. openepd/model/specs/generated/finishes.py +10 -6
  15. openepd/model/specs/generated/masonry.py +6 -2
  16. openepd/model/specs/generated/network_infrastructure.py +7 -2
  17. openepd/model/specs/generated/openings.py +10 -6
  18. openepd/model/specs/generated/sheathing.py +8 -4
  19. openepd/model/specs/generated/steel.py +10 -5
  20. openepd/model/specs/range/__init__.py +101 -0
  21. openepd/model/specs/range/accessories.py +97 -0
  22. openepd/model/specs/range/aggregates.py +57 -0
  23. openepd/model/specs/range/aluminium.py +92 -0
  24. openepd/model/specs/range/asphalt.py +61 -0
  25. openepd/model/specs/range/bulk_materials.py +31 -0
  26. openepd/model/specs/range/cast_decks_and_underlayment.py +34 -0
  27. openepd/model/specs/range/cladding.py +275 -0
  28. openepd/model/specs/range/cmu.py +44 -0
  29. openepd/model/specs/range/concrete.py +179 -0
  30. openepd/model/specs/range/conveying_equipment.py +86 -0
  31. openepd/model/specs/range/electrical.py +422 -0
  32. openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py +96 -0
  33. openepd/model/specs/range/electricity.py +31 -0
  34. openepd/model/specs/range/finishes.py +585 -0
  35. openepd/model/specs/range/fire_and_smoke_protection.py +108 -0
  36. openepd/model/specs/range/furnishings.py +137 -0
  37. openepd/model/specs/range/grouting.py +34 -0
  38. openepd/model/specs/range/manufacturing_inputs.py +190 -0
  39. openepd/model/specs/range/masonry.py +87 -0
  40. openepd/model/specs/range/material_handling.py +50 -0
  41. openepd/model/specs/range/mechanical.py +307 -0
  42. openepd/model/specs/range/mechanical_insulation.py +42 -0
  43. openepd/model/specs/range/network_infrastructure.py +208 -0
  44. openepd/model/specs/range/openings.py +512 -0
  45. openepd/model/specs/range/other_electrical_equipment.py +31 -0
  46. openepd/model/specs/range/other_materials.py +194 -0
  47. openepd/model/specs/range/plumbing.py +200 -0
  48. openepd/model/specs/range/precast_concrete.py +115 -0
  49. openepd/model/specs/range/sheathing.py +86 -0
  50. openepd/model/specs/range/steel.py +332 -0
  51. openepd/model/specs/range/thermal_moisture_protection.py +336 -0
  52. openepd/model/specs/range/utility_piping.py +75 -0
  53. openepd/model/specs/range/wood.py +228 -0
  54. openepd/model/specs/range/wood_joists.py +44 -0
  55. openepd/model/validation/numbers.py +11 -5
  56. openepd/model/validation/quantity.py +469 -58
  57. {openepd-4.13.1.dist-info → openepd-5.1.0.dist-info}/METADATA +6 -1
  58. {openepd-4.13.1.dist-info → openepd-5.1.0.dist-info}/RECORD +60 -25
  59. {openepd-4.13.1.dist-info → openepd-5.1.0.dist-info}/LICENSE +0 -0
  60. {openepd-4.13.1.dist-info → openepd-5.1.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,307 @@
1
+ #
2
+ # Copyright 2024 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ __all__ = (
17
+ "HvacVrfControlRangeV1",
18
+ "HvacVrfIndoorRangeV1",
19
+ "HvacVrfOutdoorRangeV1",
20
+ "HvacAirDiffusersRangeV1",
21
+ "HvacAirFiltersRangeV1",
22
+ "HvacAHUsRangeV1",
23
+ "HvacBoilersRangeV1",
24
+ "HvacChillersRangeV1",
25
+ "HvacFansRangeV1",
26
+ "HvacHeatPumpsRangeV1",
27
+ "HvacHeatExRangeV1",
28
+ "HvacPumpsRangeV1",
29
+ "HvacRTUsRangeV1",
30
+ "HvacVrfSystemsRangeV1",
31
+ "HvacDuctsRangeV1",
32
+ "MechanicalRangeV1",
33
+ )
34
+
35
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
36
+
37
+
38
+ from openepd.compat.pydantic import pyd
39
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
40
+ from openepd.model.specs.generated.enums import (
41
+ AhuAirflowControl,
42
+ AhuZoneControl,
43
+ AirFiltersMediaType,
44
+ AirFiltersMervRating,
45
+ BoilerConfiguration,
46
+ BoilerEquipmentFuelType,
47
+ HeatPumpType,
48
+ HvacDuctMaterial,
49
+ HvacDuctShape,
50
+ HvacDuctType,
51
+ HvacHeatExchangersType,
52
+ MechanicalInstallation,
53
+ MechanicalRefrigerants,
54
+ )
55
+ from openepd.model.validation.quantity import (
56
+ AmountRangeAirflow,
57
+ AmountRangeAreaPerVolume,
58
+ AmountRangePower,
59
+ AmountRangePressureMpa,
60
+ AmountRangeVolume,
61
+ )
62
+
63
+
64
+ class HvacVrfControlRangeV1(BaseOpenEpdHierarchicalSpec):
65
+ """
66
+ Controller for adjusting airflow across the VRF system.
67
+
68
+ Range version.
69
+ """
70
+
71
+ _EXT_VERSION = "1.0"
72
+
73
+
74
+ class HvacVrfIndoorRangeV1(BaseOpenEpdHierarchicalSpec):
75
+ """
76
+ Heating and cooling unit located on the inside of a building and supplies air to specific indoor zones.
77
+
78
+ Range version.
79
+ """
80
+
81
+ _EXT_VERSION = "1.0"
82
+
83
+ refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
84
+ heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
85
+ cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
86
+ airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
87
+ air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
88
+
89
+
90
+ class HvacVrfOutdoorRangeV1(BaseOpenEpdHierarchicalSpec):
91
+ """
92
+ Heating and cooling unit that is on the outside of a building and distributes air to the indoor units.
93
+
94
+ Range version.
95
+ """
96
+
97
+ _EXT_VERSION = "1.0"
98
+
99
+ refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
100
+ heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
101
+ cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
102
+ airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
103
+ air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
104
+
105
+
106
+ class HvacAirDiffusersRangeV1(BaseOpenEpdHierarchicalSpec):
107
+ """
108
+ Room-side terminals for air distribution. This is different from Terminal Heating & Cooling Units.
109
+
110
+ Range version.
111
+ """
112
+
113
+ _EXT_VERSION = "1.0"
114
+
115
+
116
+ class HvacAirFiltersRangeV1(BaseOpenEpdHierarchicalSpec):
117
+ """
118
+ Device for filtering particles of dust, soot, etc., from the air passing through it.
119
+
120
+ Range version.
121
+ """
122
+
123
+ _EXT_VERSION = "1.0"
124
+
125
+ merv_rating: list[AirFiltersMervRating] | None = pyd.Field(default=None, description="")
126
+ media_type: list[AirFiltersMediaType] | None = pyd.Field(default=None, description="")
127
+
128
+
129
+ class HvacAHUsRangeV1(BaseOpenEpdHierarchicalSpec):
130
+ """
131
+ Device which provides healthy, dust free air to buildings with a good energy efficiency.
132
+
133
+ Usually a large metal box containing a blower, heating or cooling elements, filter racks or chambers, sound
134
+ attenuators, and dampers.
135
+
136
+ Range version.
137
+ """
138
+
139
+ _EXT_VERSION = "1.0"
140
+
141
+ refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
142
+ installation: list[MechanicalInstallation] | None = pyd.Field(default=None, description="")
143
+ airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
144
+ air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
145
+ cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
146
+ heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
147
+ airflow_control: list[AhuAirflowControl] | None = pyd.Field(default=None, description="")
148
+ zone_control: list[AhuZoneControl] | None = pyd.Field(default=None, description="")
149
+
150
+
151
+ class HvacBoilersRangeV1(BaseOpenEpdHierarchicalSpec):
152
+ """
153
+ Closed vessel for heating fluid.
154
+
155
+ Range version.
156
+ """
157
+
158
+ _EXT_VERSION = "1.0"
159
+
160
+ flow_rate: AmountRangeAreaPerVolume | None = pyd.Field(default=None, description="")
161
+ heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
162
+ configuration: list[BoilerConfiguration] | None = pyd.Field(default=None, description="")
163
+ fuel_type: list[BoilerEquipmentFuelType] | None = pyd.Field(default=None, description="")
164
+
165
+
166
+ class HvacChillersRangeV1(BaseOpenEpdHierarchicalSpec):
167
+ """
168
+ Machine that removes heat from a liquid coolant.
169
+
170
+ Uses a vapor-compression, adsorption refrigeration, or absorption refrigeration cycles. Incldues centrifugal,
171
+ water-cooled chillers, etc.
172
+
173
+ Range version.
174
+ """
175
+
176
+ _EXT_VERSION = "1.0"
177
+
178
+ refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
179
+ installation: list[MechanicalInstallation] | None = pyd.Field(default=None, description="")
180
+ heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
181
+ cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
182
+ air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
183
+ airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
184
+
185
+
186
+ class HvacFansRangeV1(BaseOpenEpdHierarchicalSpec):
187
+ """
188
+ Apparatus with rotating blades that creates a current of air for cooling or ventilation.
189
+
190
+ Range version.
191
+ """
192
+
193
+ _EXT_VERSION = "1.0"
194
+
195
+
196
+ class HvacHeatPumpsRangeV1(BaseOpenEpdHierarchicalSpec):
197
+ """
198
+ Device that transfers thermal energy between spaces, including ground and air source heat pumps.
199
+
200
+ Range version.
201
+ """
202
+
203
+ _EXT_VERSION = "1.0"
204
+
205
+ refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
206
+ cooling_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
207
+ heating_capacity: AmountRangePower | None = pyd.Field(default=None, description="")
208
+ air_volume: AmountRangeVolume | None = pyd.Field(default=None, description="")
209
+ airflow_rate: AmountRangeAirflow | None = pyd.Field(default=None, description="")
210
+ heat_pumps_type: list[HeatPumpType] | None = pyd.Field(default=None, description="")
211
+
212
+
213
+ class HvacHeatExRangeV1(BaseOpenEpdHierarchicalSpec):
214
+ """
215
+ HVAC heat exchangers.
216
+
217
+ Systems that with heat exchange cell which recovers and retains the heat that would otherwise be lost from the
218
+ extracted air.
219
+
220
+ Range version.
221
+ """
222
+
223
+ _EXT_VERSION = "1.0"
224
+
225
+ refrigerants: list[MechanicalRefrigerants] | None = pyd.Field(default=None, description="")
226
+ heat_exchangers_type: list[HvacHeatExchangersType] | None = pyd.Field(default=None, description="")
227
+
228
+
229
+ class HvacPumpsRangeV1(BaseOpenEpdHierarchicalSpec):
230
+ """
231
+ Pumps.
232
+
233
+ Mechanical device using suction or pressure to raise or move liquids, compress gases, or force air into
234
+ inflatable objects such as tires.
235
+
236
+ Range version.
237
+ """
238
+
239
+ _EXT_VERSION = "1.0"
240
+
241
+ flow_rate: AmountRangeAreaPerVolume | None = pyd.Field(default=None, description="")
242
+ pump_discharge_pressure: AmountRangePressureMpa | None = pyd.Field(default=None, description="")
243
+ pump_horsepower: AmountRangePower | None = pyd.Field(default=None, description="")
244
+
245
+
246
+ class HvacRTUsRangeV1(BaseOpenEpdHierarchicalSpec):
247
+ """
248
+ An air handler designed for outdoor use, typically on roofs.
249
+
250
+ Range version.
251
+ """
252
+
253
+ _EXT_VERSION = "1.0"
254
+
255
+
256
+ class HvacVrfSystemsRangeV1(BaseOpenEpdHierarchicalSpec):
257
+ """
258
+ Variable refrigerant flow (VRF).
259
+
260
+ Also known as variable refrigerant volume (VRV), is an HVAC technology that allows for varying degrees of cooling
261
+ in more specific areas.
262
+
263
+ Range version.
264
+ """
265
+
266
+ _EXT_VERSION = "1.0"
267
+
268
+ HvacVrfControl: HvacVrfControlRangeV1 | None = None
269
+ HvacVrfIndoor: HvacVrfIndoorRangeV1 | None = None
270
+ HvacVrfOutdoor: HvacVrfOutdoorRangeV1 | None = None
271
+
272
+
273
+ class HvacDuctsRangeV1(BaseOpenEpdHierarchicalSpec):
274
+ """
275
+ Ducts for HVAC systems performance specification.
276
+
277
+ Range version.
278
+ """
279
+
280
+ _EXT_VERSION = "1.0"
281
+
282
+ shape: list[HvacDuctShape] | None = pyd.Field(default=None, description="Hvac duct shape")
283
+ material: list[HvacDuctMaterial] | None = pyd.Field(default=None, description="Hvac duct material")
284
+ type: list[HvacDuctType] | None = pyd.Field(default=None, description="Hvac duct type")
285
+
286
+
287
+ class MechanicalRangeV1(BaseOpenEpdHierarchicalSpec):
288
+ """
289
+ Mechanical performance specification.
290
+
291
+ Range version.
292
+ """
293
+
294
+ _EXT_VERSION = "1.1"
295
+
296
+ HvacAirDiffusers: HvacAirDiffusersRangeV1 | None = None
297
+ HvacAirFilters: HvacAirFiltersRangeV1 | None = None
298
+ HvacAHUs: HvacAHUsRangeV1 | None = None
299
+ HvacBoilers: HvacBoilersRangeV1 | None = None
300
+ HvacChillers: HvacChillersRangeV1 | None = None
301
+ HvacFans: HvacFansRangeV1 | None = None
302
+ HvacHeatPumps: HvacHeatPumpsRangeV1 | None = None
303
+ HvacHeatEx: HvacHeatExRangeV1 | None = None
304
+ HvacPumps: HvacPumpsRangeV1 | None = None
305
+ HvacRTUs: HvacRTUsRangeV1 | None = None
306
+ HvacVrfSystems: HvacVrfSystemsRangeV1 | None = None
307
+ HvacDucts: HvacDuctsRangeV1 | None = None
@@ -0,0 +1,42 @@
1
+ #
2
+ # Copyright 2024 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ __all__ = ("MechanicalInsulationRangeV1",)
17
+
18
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
19
+
20
+
21
+ from openepd.compat.pydantic import pyd
22
+ from openepd.model.common import RangeFloat
23
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
+ from openepd.model.specs.generated.enums import InsulatingMaterial, InsulationIntendedApplication
25
+ from openepd.model.validation.quantity import AmountRangeLengthMm
26
+
27
+
28
+ class MechanicalInsulationRangeV1(BaseOpenEpdHierarchicalSpec):
29
+ """
30
+ Insulation products whose primary purpose is for mechanical systems rather than for building envelope.
31
+
32
+ Includes HVAC, plumbing, and acoustic insulations.
33
+
34
+ Range version.
35
+ """
36
+
37
+ _EXT_VERSION = "1.0"
38
+
39
+ r_value: RangeFloat | None = pyd.Field(default=None, description="")
40
+ material: list[InsulatingMaterial] | None = pyd.Field(default=None, description="")
41
+ intended_application: list[InsulationIntendedApplication] | None = pyd.Field(default=None, description="")
42
+ thickness_per_declared_unit: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
@@ -0,0 +1,208 @@
1
+ #
2
+ # Copyright 2024 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ __all__ = (
17
+ "PDURangeV1",
18
+ "CabinetsRacksAndEnclosuresRangeV1",
19
+ "DataCablingRangeV1",
20
+ "FloorBoxesAndAccessoriesRangeV1",
21
+ "NetworkingCableTraysRangeV1",
22
+ "NetworkingRacewaysRangeV1",
23
+ "CommunicationsConduitRangeV1",
24
+ "NetworkInfrastructureRangeV1",
25
+ )
26
+
27
+ # NB! This is a generated code. Do not edit it manually. Please see src/openepd/model/specs/README.md
28
+
29
+
30
+ from openepd.compat.pydantic import pyd
31
+ from openepd.model.common import RangeInt
32
+ from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
33
+ from openepd.model.specs.generated.enums import (
34
+ CableTraysMaterial,
35
+ CablingCategory,
36
+ CablingFireRating,
37
+ CablingJacketMaterial,
38
+ ConduitMaterial,
39
+ FloorBoxCoverMaterial,
40
+ FloorBoxFloorMaterial,
41
+ FloorBoxMaterial,
42
+ PduTechnology,
43
+ RacewaysMaterial,
44
+ RackType,
45
+ )
46
+ from openepd.model.validation.quantity import AmountRangeElectricalCurrent, AmountRangeLengthMm, AmountRangeMass
47
+
48
+
49
+ class PDURangeV1(BaseOpenEpdHierarchicalSpec):
50
+ """
51
+ Devices with multiple outputs designed to distribute power, often in a data center cabinet.
52
+
53
+ Range version.
54
+ """
55
+
56
+ _EXT_VERSION = "1.0"
57
+
58
+ amperage: AmountRangeElectricalCurrent | None = pyd.Field(default=None, description="")
59
+ outlet_level_metering: bool | None = pyd.Field(default=None, description="")
60
+ outlet_level_switching: bool | None = pyd.Field(default=None, description="")
61
+ pdu_technology: list[PduTechnology] | None = pyd.Field(default=None, description="")
62
+ pdu_outlets: RangeInt | None = pyd.Field(default=None, description="")
63
+
64
+
65
+ class CabinetsRacksAndEnclosuresRangeV1(BaseOpenEpdHierarchicalSpec):
66
+ """
67
+ Physical support upon which network equipment is mounted. Includes cabinets, racks, frames, and enclosures.
68
+
69
+ Range version.
70
+ """
71
+
72
+ _EXT_VERSION = "1.0"
73
+
74
+ static_load: AmountRangeMass | None = pyd.Field(default=None, description="")
75
+ total_racking_units: RangeInt | None = pyd.Field(default=None, description="")
76
+ rack_type: list[RackType] | None = pyd.Field(default=None, description="")
77
+
78
+
79
+ class DataCablingRangeV1(BaseOpenEpdHierarchicalSpec):
80
+ """
81
+ Telecommunications cabling for buildings.
82
+
83
+ Range version.
84
+ """
85
+
86
+ _EXT_VERSION = "1.0"
87
+
88
+ outdoor: bool | None = pyd.Field(default=None, description="")
89
+ cabling_category: list[CablingCategory] | None = pyd.Field(default=None, description="")
90
+ fire_rating: list[CablingFireRating] | None = pyd.Field(default=None, description="")
91
+ jacket_material: list[CablingJacketMaterial] | None = pyd.Field(default=None, description="")
92
+ shielded: bool | None = pyd.Field(default=None, description="Foil or similar electromagnetic shielding")
93
+ armored: bool | None = pyd.Field(default=None, description="Steel or similar physical armor jacket")
94
+ rohs: bool | None = pyd.Field(default=None, description="Certified ROHS Compliant")
95
+ reach: bool | None = pyd.Field(default=None, description="Certified REACH compliant")
96
+ zwtl: bool | None = pyd.Field(default=None, description="Certified ZWTL compliant")
97
+ connectorized: bool | None = pyd.Field(
98
+ default=None,
99
+ description="This cable is shipped as a specific length with integrated connectors. Impacts include the connectors for the specific cable length. Connectors add impact similar to 0.1-0.5 additional meters of cable",
100
+ )
101
+ thin_ethernet: bool | None = pyd.Field(
102
+ default=None,
103
+ description="At least part of this cable has a reduced outer diameter and thinner wires. Thin ethernet cables have handling advantages and tend to have a reduced impact, but also reduced channel length. See TIA 568.2-D Annex G.",
104
+ )
105
+
106
+
107
+ class FloorBoxesAndAccessoriesRangeV1(BaseOpenEpdHierarchicalSpec):
108
+ """
109
+ Electrical boxes that are installed in the floor.
110
+
111
+ Used to provide power and/or data connections to devices in a room or space.
112
+
113
+ Range version.
114
+ """
115
+
116
+ _EXT_VERSION = "1.0"
117
+
118
+ painted: bool | None = pyd.Field(default=None, description="")
119
+ fire_classified: bool | None = pyd.Field(
120
+ default=None, description="Includes hardware to maintain fire rating of the floor"
121
+ )
122
+ outdoor: bool | None = pyd.Field(default=None, description="Floor boxes installed in the ground")
123
+ raised: bool | None = pyd.Field(default=None, description="Used in raised or computer style flooring")
124
+ poke_through: bool | None = pyd.Field(
125
+ default=None, description="Used primarily in retrofit or renovation and will maintain fire rating of the floor"
126
+ )
127
+ cover: bool | None = pyd.Field(default=None, description="Floor box cover or lid for use with a separate floor box")
128
+ outlets: RangeInt | None = pyd.Field(
129
+ default=None,
130
+ description="Number of outlet ports from floor box, including power, data, video, and other connections",
131
+ )
132
+ material: list[FloorBoxMaterial] | None = pyd.Field(default=None, description="")
133
+ cover_material: list[FloorBoxCoverMaterial] | None = pyd.Field(default=None, description="")
134
+ floor_material: list[FloorBoxFloorMaterial] | None = pyd.Field(default=None, description="")
135
+
136
+
137
+ class NetworkingCableTraysRangeV1(BaseOpenEpdHierarchicalSpec):
138
+ """
139
+ Cable trays.
140
+
141
+ Mechanical support systems that provide a rigid structural system for cables used for communication and
142
+ power distribution.
143
+
144
+ Range version.
145
+ """
146
+
147
+ _EXT_VERSION = "1.0"
148
+
149
+ height: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
150
+ width: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
151
+ depth: AmountRangeLengthMm | None = pyd.Field(default=None, description="Depth of enclosure system")
152
+ static_load: AmountRangeMass | None = pyd.Field(default=None, description="Mass that the unit can hold")
153
+ ventilated: bool | None = pyd.Field(default=None, description="At least 40% of the tray base is open to air flow")
154
+ material: list[CableTraysMaterial] | None = pyd.Field(default=None, description="")
155
+
156
+
157
+ class NetworkingRacewaysRangeV1(BaseOpenEpdHierarchicalSpec):
158
+ """
159
+ Surface-mounted systems along the perimeter of walls to route, conceal, and protect cables.
160
+
161
+ Often called trunking.
162
+
163
+ Range version.
164
+ """
165
+
166
+ _EXT_VERSION = "1.0"
167
+
168
+ width: AmountRangeLengthMm | None = pyd.Field(default=None, description="")
169
+ depth: AmountRangeLengthMm | None = pyd.Field(default=None, description="Depth of enclosure system")
170
+ painted: bool | None = pyd.Field(default=None, description="")
171
+ divided: bool | None = pyd.Field(
172
+ default=None, description="Dual service raceway for high and low voltage data and power applications"
173
+ )
174
+ raceways_material: list[RacewaysMaterial] | None = pyd.Field(default=None, description="")
175
+
176
+
177
+ class CommunicationsConduitRangeV1(BaseOpenEpdHierarchicalSpec):
178
+ """
179
+ Tubing used to protect and route communications wiring in a building or structure.
180
+
181
+ Range version.
182
+ """
183
+
184
+ _EXT_VERSION = "1.1"
185
+
186
+ nominal_diameter: AmountRangeLengthMm | None = None
187
+ outer_diameter: AmountRangeLengthMm | None = None
188
+ inner_diameter: AmountRangeLengthMm | None = None
189
+ wall_thickness: AmountRangeLengthMm | None = None
190
+ material: list[ConduitMaterial] | None = None
191
+
192
+
193
+ class NetworkInfrastructureRangeV1(BaseOpenEpdHierarchicalSpec):
194
+ """
195
+ General category for network infrastructure products for data centers and commercial and residential buildings.
196
+
197
+ Range version.
198
+ """
199
+
200
+ _EXT_VERSION = "1.1"
201
+
202
+ PDU: PDURangeV1 | None = None
203
+ CabinetsRacksAndEnclosures: CabinetsRacksAndEnclosuresRangeV1 | None = None
204
+ DataCabling: DataCablingRangeV1 | None = None
205
+ FloorBoxesAndAccessories: FloorBoxesAndAccessoriesRangeV1 | None = None
206
+ NetworkingCableTrays: NetworkingCableTraysRangeV1 | None = None
207
+ NetworkingRaceways: NetworkingRacewaysRangeV1 | None = None
208
+ CommunicationsConduit: CommunicationsConduitRangeV1 | None = None