openepd 2.0.0__py3-none-any.whl → 3.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.
- openepd/__init__.py +1 -1
- openepd/__version__.py +2 -2
- openepd/api/__init__.py +19 -0
- openepd/api/base_sync_client.py +550 -0
- openepd/api/category/__init__.py +19 -0
- openepd/api/category/dto.py +25 -0
- openepd/api/category/sync_api.py +44 -0
- openepd/api/common.py +239 -0
- openepd/api/dto/__init__.py +19 -0
- openepd/api/dto/base.py +41 -0
- openepd/api/dto/common.py +115 -0
- openepd/api/dto/meta.py +69 -0
- openepd/api/dto/mf.py +59 -0
- openepd/api/dto/params.py +19 -0
- openepd/api/epd/__init__.py +19 -0
- openepd/api/epd/dto.py +121 -0
- openepd/api/epd/sync_api.py +105 -0
- openepd/api/errors.py +86 -0
- openepd/api/pcr/__init__.py +19 -0
- openepd/api/pcr/dto.py +41 -0
- openepd/api/pcr/sync_api.py +49 -0
- openepd/api/sync_client.py +67 -0
- openepd/api/test/__init__.py +19 -0
- openepd/bundle/__init__.py +1 -1
- openepd/bundle/base.py +1 -1
- openepd/bundle/model.py +5 -6
- openepd/bundle/reader.py +5 -5
- openepd/bundle/writer.py +5 -4
- openepd/compat/__init__.py +19 -0
- openepd/compat/pydantic.py +29 -0
- openepd/model/__init__.py +1 -1
- openepd/model/base.py +114 -15
- openepd/model/category.py +39 -0
- openepd/model/common.py +33 -25
- openepd/model/epd.py +97 -78
- openepd/model/factory.py +48 -0
- openepd/model/lcia.py +24 -13
- openepd/model/org.py +28 -18
- openepd/model/pcr.py +42 -14
- openepd/model/specs/README.md +19 -0
- openepd/model/specs/__init__.py +72 -4
- openepd/model/specs/aluminium.py +67 -0
- openepd/model/specs/asphalt.py +87 -0
- openepd/model/specs/base.py +60 -0
- openepd/model/specs/concrete.py +288 -24
- openepd/model/specs/generated/accessories.py +63 -0
- openepd/model/specs/generated/aggregates.py +71 -0
- openepd/model/specs/generated/aluminium.py +66 -0
- openepd/model/specs/generated/asphalt.py +86 -0
- openepd/model/specs/generated/bulk_materials.py +26 -0
- openepd/model/specs/generated/cast_decks_and_underlayment.py +26 -0
- openepd/model/specs/generated/cladding.py +214 -0
- openepd/model/specs/generated/cmu.py +46 -0
- openepd/model/specs/generated/common.py +27 -0
- openepd/model/specs/generated/concrete.py +151 -0
- openepd/model/specs/generated/conveying_equipment.py +57 -0
- openepd/model/specs/generated/electrical.py +297 -0
- openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py +63 -0
- openepd/model/specs/generated/electricity.py +26 -0
- openepd/model/specs/generated/enums.py +2420 -0
- openepd/model/specs/generated/finishes.py +519 -0
- openepd/model/specs/generated/fire_and_smoke_protection.py +79 -0
- openepd/model/specs/generated/furnishings.py +95 -0
- openepd/model/specs/generated/grouting.py +26 -0
- openepd/model/specs/generated/manufacturing_inputs.py +131 -0
- openepd/model/specs/generated/masonry.py +77 -0
- openepd/model/specs/generated/material_handling.py +35 -0
- openepd/model/specs/generated/mechanical.py +271 -0
- openepd/model/specs/generated/mechanical_insulation.py +41 -0
- openepd/model/specs/generated/network_infrastructure.py +181 -0
- openepd/model/specs/generated/openings.py +423 -0
- openepd/model/specs/generated/other_electrical_equipment.py +26 -0
- openepd/model/specs/generated/other_materials.py +123 -0
- openepd/model/specs/generated/plumbing.py +153 -0
- openepd/model/specs/generated/precast_concrete.py +68 -0
- openepd/model/specs/generated/sheathing.py +74 -0
- openepd/model/specs/generated/steel.py +224 -0
- openepd/model/specs/generated/thermal_moisture_protection.py +233 -0
- openepd/model/specs/generated/utility_piping.py +65 -0
- openepd/model/specs/generated/wood.py +167 -0
- openepd/model/specs/generated/wood_joists.py +38 -0
- openepd/model/specs/glass.py +360 -0
- openepd/model/specs/steel.py +184 -0
- openepd/model/specs/wood.py +130 -0
- openepd/model/standard.py +2 -3
- openepd/model/validation/__init__.py +19 -0
- openepd/model/validation/common.py +59 -0
- openepd/model/validation/numbers.py +26 -0
- openepd/model/validation/quantity.py +132 -0
- openepd/model/versioning.py +129 -0
- {openepd-2.0.0.dist-info → openepd-3.1.0.dist-info}/METADATA +36 -5
- openepd-3.1.0.dist-info/RECORD +95 -0
- openepd-2.0.0.dist-info/RECORD +0 -22
- {openepd-2.0.0.dist-info → openepd-3.1.0.dist-info}/LICENSE +0 -0
- {openepd-2.0.0.dist-info → openepd-3.1.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,181 @@
|
|
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
|
+
# This software was developed with support from the Skanska USA,
|
17
|
+
# Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
|
18
|
+
# Find out more at www.BuildingTransparency.org
|
19
|
+
#
|
20
|
+
from openepd.compat.pydantic import pyd
|
21
|
+
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
22
|
+
from openepd.model.specs.generated.enums import (
|
23
|
+
CableTraysMaterial,
|
24
|
+
CablingCategory,
|
25
|
+
CablingFireRating,
|
26
|
+
CablingJacketMaterial,
|
27
|
+
FloorBoxCoverMaterial,
|
28
|
+
FloorBoxFloorMaterial,
|
29
|
+
FloorBoxMaterial,
|
30
|
+
PduTechnology,
|
31
|
+
RacewaysMaterial,
|
32
|
+
RackType,
|
33
|
+
)
|
34
|
+
from openepd.model.validation.quantity import LengthMmStr, MassKgStr, validate_unit_factory
|
35
|
+
|
36
|
+
|
37
|
+
class PDUV1(BaseOpenEpdHierarchicalSpec):
|
38
|
+
"""P d u performance specification."""
|
39
|
+
|
40
|
+
_EXT_VERSION = "1.0"
|
41
|
+
|
42
|
+
# Own fields:
|
43
|
+
amperage: str | None = pyd.Field(default=None, description="", example="1 A")
|
44
|
+
outlet_level_metering: bool | None = pyd.Field(default=None, description="", example=True)
|
45
|
+
outlet_level_switching: bool | None = pyd.Field(default=None, description="", example=True)
|
46
|
+
pdu_technology: PduTechnology | None = pyd.Field(default=None, description="", example="Basic")
|
47
|
+
pdu_outlets: int | None = pyd.Field(default=None, description="", example=3, le=200)
|
48
|
+
|
49
|
+
_amperage_is_quantity_validator = pyd.validator("amperage", allow_reuse=True)(validate_unit_factory("A"))
|
50
|
+
|
51
|
+
|
52
|
+
class CabinetsRacksAndEnclosuresV1(BaseOpenEpdHierarchicalSpec):
|
53
|
+
"""Cabinets racks and enclosures performance specification."""
|
54
|
+
|
55
|
+
_EXT_VERSION = "1.0"
|
56
|
+
|
57
|
+
# Own fields:
|
58
|
+
static_load: MassKgStr | None = pyd.Field(default=None, description="", example="1 kg")
|
59
|
+
total_racking_units: int | None = pyd.Field(default=None, description="", example=3)
|
60
|
+
rack_type: RackType | None = pyd.Field(default=None, description="", example="Cabinet")
|
61
|
+
|
62
|
+
_static_load_is_quantity_validator = pyd.validator("static_load", allow_reuse=True)(validate_unit_factory("kg"))
|
63
|
+
|
64
|
+
|
65
|
+
class DataCablingV1(BaseOpenEpdHierarchicalSpec):
|
66
|
+
"""Data cabling performance specification."""
|
67
|
+
|
68
|
+
_EXT_VERSION = "1.0"
|
69
|
+
|
70
|
+
# Own fields:
|
71
|
+
outdoor: bool | None = pyd.Field(default=None, description="", example=True)
|
72
|
+
cabling_category: CablingCategory | None = pyd.Field(default=None, description="", example="Cat7")
|
73
|
+
fire_rating: CablingFireRating | None = pyd.Field(default=None, description="", example="CMP")
|
74
|
+
jacket_material: CablingJacketMaterial | None = pyd.Field(default=None, description="", example="PVC")
|
75
|
+
shielded: bool | None = pyd.Field(
|
76
|
+
default=None, description="Foil or similar electromagnetic shielding", example=True
|
77
|
+
)
|
78
|
+
armored: bool | None = pyd.Field(default=None, description="Steel or similar physical armor jacket", example=True)
|
79
|
+
rohs: bool | None = pyd.Field(default=None, description="Certified ROHS Compliant", example=True)
|
80
|
+
reach: bool | None = pyd.Field(default=None, description="Certified REACH compliant", example=True)
|
81
|
+
zwtl: bool | None = pyd.Field(default=None, description="Certified ZWTL compliant", example=True)
|
82
|
+
connectorized: bool | None = pyd.Field(
|
83
|
+
default=None,
|
84
|
+
description="This cable is shipped as a specific length with integrated connectors. Impacts include the "
|
85
|
+
"connectors for the specific cable length. Connectors add impact similar to 0.1-0.5 additional "
|
86
|
+
"meters of cable",
|
87
|
+
example=True,
|
88
|
+
)
|
89
|
+
thin_ethernet: bool | None = pyd.Field(
|
90
|
+
default=None,
|
91
|
+
description="At least part of this cable has a reduced outer diameter and thinner wires. Thin ethernet cables "
|
92
|
+
"have handling advantages and tend to have a reduced impact, but also reduced channel length. "
|
93
|
+
"See TIA 568.2-D Annex G.",
|
94
|
+
example=True,
|
95
|
+
)
|
96
|
+
|
97
|
+
|
98
|
+
class FloorBoxesAndAccessoriesV1(BaseOpenEpdHierarchicalSpec):
|
99
|
+
"""Floor boxes and accessories performance specification."""
|
100
|
+
|
101
|
+
_EXT_VERSION = "1.0"
|
102
|
+
|
103
|
+
# Own fields:
|
104
|
+
painted: bool | None = pyd.Field(default=None, description="", example=True)
|
105
|
+
fire_classified: bool | None = pyd.Field(
|
106
|
+
default=None, description="Includes hardware to maintain fire rating of the floor", example=True
|
107
|
+
)
|
108
|
+
outdoor: bool | None = pyd.Field(default=None, description="Floor boxes installed in the ground", example=True)
|
109
|
+
raised: bool | None = pyd.Field(default=None, description="Used in raised or computer style flooring", example=True)
|
110
|
+
poke_through: bool | None = pyd.Field(
|
111
|
+
default=None,
|
112
|
+
description="Used primarily in retrofit or renovation and will maintain fire rating of the floor",
|
113
|
+
example=True,
|
114
|
+
)
|
115
|
+
cover: bool | None = pyd.Field(
|
116
|
+
default=None, description="Floor box cover or lid for use with a separate floor box", example=True
|
117
|
+
)
|
118
|
+
outlets: int | None = pyd.Field(
|
119
|
+
default=None,
|
120
|
+
description="Number of outlet ports from floor box, including power, data, video, and other connections",
|
121
|
+
example=3,
|
122
|
+
le=16,
|
123
|
+
)
|
124
|
+
material: FloorBoxMaterial | None = pyd.Field(default=None, description="", example="Metallic Box")
|
125
|
+
cover_material: FloorBoxCoverMaterial | None = pyd.Field(default=None, description="", example="Brass")
|
126
|
+
floor_material: FloorBoxFloorMaterial | None = pyd.Field(default=None, description="", example="Concrete")
|
127
|
+
|
128
|
+
|
129
|
+
class NetworkingCableTraysV1(BaseOpenEpdHierarchicalSpec):
|
130
|
+
"""Networking cable trays performance specification."""
|
131
|
+
|
132
|
+
_EXT_VERSION = "1.0"
|
133
|
+
|
134
|
+
# Own fields:
|
135
|
+
height: LengthMmStr | None = pyd.Field(default=None, description="", example="100 mm")
|
136
|
+
width: LengthMmStr | None = pyd.Field(default=None, description="", example="100 mm")
|
137
|
+
depth: LengthMmStr | None = pyd.Field(default=None, description="Depth of enclosure system", example="1 m")
|
138
|
+
static_load: MassKgStr | None = pyd.Field(default=None, description="Mass that the unit can hold", example="1 kg")
|
139
|
+
ventilated: bool | None = pyd.Field(
|
140
|
+
default=None, description="At least 40% of the tray base is open to air flow", example=True
|
141
|
+
)
|
142
|
+
material: CableTraysMaterial | None = pyd.Field(default=None, description="", example="Stainless Steel")
|
143
|
+
|
144
|
+
_height_is_quantity_validator = pyd.validator("height", allow_reuse=True)(validate_unit_factory("m"))
|
145
|
+
_width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
|
146
|
+
_depth_is_quantity_validator = pyd.validator("depth", allow_reuse=True)(validate_unit_factory("m"))
|
147
|
+
_static_load_is_quantity_validator = pyd.validator("static_load", allow_reuse=True)(validate_unit_factory("kg"))
|
148
|
+
|
149
|
+
|
150
|
+
class NetworkingRacewaysV1(BaseOpenEpdHierarchicalSpec):
|
151
|
+
"""Networking raceways performance specification."""
|
152
|
+
|
153
|
+
_EXT_VERSION = "1.0"
|
154
|
+
|
155
|
+
# Own fields:
|
156
|
+
width: LengthMmStr | None = pyd.Field(default=None, description="", example="100 mm")
|
157
|
+
depth: LengthMmStr | None = pyd.Field(default=None, description="Depth of enclosure system", example="100 mm")
|
158
|
+
painted: bool | None = pyd.Field(default=None, description="", example=True)
|
159
|
+
divided: bool | None = pyd.Field(
|
160
|
+
default=None,
|
161
|
+
description="Dual service raceway for high and low voltage data and power applications",
|
162
|
+
example=True,
|
163
|
+
)
|
164
|
+
raceways_material: RacewaysMaterial | None = pyd.Field(default=None, description="", example="Aluminum")
|
165
|
+
|
166
|
+
_width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
|
167
|
+
_depth_is_quantity_validator = pyd.validator("depth", allow_reuse=True)(validate_unit_factory("m"))
|
168
|
+
|
169
|
+
|
170
|
+
class NetworkInfrastructureV1(BaseOpenEpdHierarchicalSpec):
|
171
|
+
"""Network infrastructure performance specification."""
|
172
|
+
|
173
|
+
_EXT_VERSION = "1.0"
|
174
|
+
|
175
|
+
# Nested specs:
|
176
|
+
PDU: PDUV1 | None = None
|
177
|
+
CabinetsRacksAndEnclosures: CabinetsRacksAndEnclosuresV1 | None = None
|
178
|
+
DataCabling: DataCablingV1 | None = None
|
179
|
+
FloorBoxesAndAccessories: FloorBoxesAndAccessoriesV1 | None = None
|
180
|
+
NetworkingCableTrays: NetworkingCableTraysV1 | None = None
|
181
|
+
NetworkingRaceways: NetworkingRacewaysV1 | None = None
|
@@ -0,0 +1,423 @@
|
|
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
|
+
# This software was developed with support from the Skanska USA,
|
17
|
+
# Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
|
18
|
+
# Find out more at www.BuildingTransparency.org
|
19
|
+
#
|
20
|
+
|
21
|
+
from openepd.compat.pydantic import pyd
|
22
|
+
from openepd.model.base import BaseOpenEpdSchema
|
23
|
+
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
24
|
+
from openepd.model.specs.generated.enums import (
|
25
|
+
FlatGlassPanesThickness,
|
26
|
+
FrameMaterial,
|
27
|
+
HardwareFunction,
|
28
|
+
NAFSPerformanceGrade,
|
29
|
+
Spacer,
|
30
|
+
ThermalSeparation,
|
31
|
+
)
|
32
|
+
from openepd.model.validation.numbers import RatioFloat
|
33
|
+
from openepd.model.validation.quantity import LengthMmStr, PressureMPaStr, validate_unit_factory
|
34
|
+
|
35
|
+
|
36
|
+
class GlazingIntendedApplication(BaseOpenEpdSchema):
|
37
|
+
"""Glass intended application mixin."""
|
38
|
+
|
39
|
+
curtain_wall: bool | None = pyd.Field(default=None, description="Intended for curtain walls. Relevant for IGUs.")
|
40
|
+
r_windows: bool | None = pyd.Field(
|
41
|
+
default=None,
|
42
|
+
description="Intended for residential (NAFS 'R') and similar windows, doors, or skylights. Relevant for IGUs.",
|
43
|
+
)
|
44
|
+
lc_windows: bool | None = pyd.Field(
|
45
|
+
default=None, description="Intended for light commercial (NAFS 'LC') and similar windows. Relevant for IGUs."
|
46
|
+
)
|
47
|
+
cw_windows: bool | None = pyd.Field(
|
48
|
+
default=None, description="Intended for commercial (NAFS 'CW') and similar windows. Relevant for IGUs."
|
49
|
+
)
|
50
|
+
aw_windows: bool | None = pyd.Field(
|
51
|
+
default=None, description="Intended for architectural (NAFS 'AW') and similar windows. Relevant for IGUs."
|
52
|
+
)
|
53
|
+
storefronts: bool | None = pyd.Field(
|
54
|
+
default=None, description="Intended for Storefronts and similar applications. Relevant for IGUs."
|
55
|
+
)
|
56
|
+
glazed_doors: bool | None = pyd.Field(
|
57
|
+
default=None, description="Intended for Glazed Doors and similar applications. Relevant for IGUs."
|
58
|
+
)
|
59
|
+
unit_skylights: bool | None = pyd.Field(
|
60
|
+
default=None, description="Intended for Unit Skylights and similar applications. Relevant for IGUs."
|
61
|
+
)
|
62
|
+
sloped_skylights: bool | None = pyd.Field(
|
63
|
+
default=None,
|
64
|
+
description="Intended for sloped glazing, and architectural skylights, and similar. Relevant for IGUs.",
|
65
|
+
)
|
66
|
+
other: bool | None = pyd.Field(
|
67
|
+
default=None, description="Intended for other application not listed. Relevant for IGUs."
|
68
|
+
)
|
69
|
+
|
70
|
+
|
71
|
+
class PanelDoorsV1(BaseOpenEpdHierarchicalSpec):
|
72
|
+
"""Panel doors performance specification."""
|
73
|
+
|
74
|
+
_EXT_VERSION = "1.0"
|
75
|
+
|
76
|
+
|
77
|
+
class PressureResistantDoorsV1(BaseOpenEpdHierarchicalSpec):
|
78
|
+
"""Pressure resistant doors performance specification."""
|
79
|
+
|
80
|
+
_EXT_VERSION = "1.0"
|
81
|
+
|
82
|
+
|
83
|
+
class SpecialFunctionDoorsV1(BaseOpenEpdHierarchicalSpec):
|
84
|
+
"""Special function doors performance specification."""
|
85
|
+
|
86
|
+
_EXT_VERSION = "1.0"
|
87
|
+
|
88
|
+
# Nested specs:
|
89
|
+
PanelDoors: PanelDoorsV1 | None = None
|
90
|
+
PressureResistantDoors: PressureResistantDoorsV1 | None = None
|
91
|
+
|
92
|
+
|
93
|
+
class SlidingGlassDoorsV1(BaseOpenEpdHierarchicalSpec):
|
94
|
+
"""Sliding glass doors performance specification."""
|
95
|
+
|
96
|
+
_EXT_VERSION = "1.0"
|
97
|
+
|
98
|
+
|
99
|
+
class FenestrationAccessoriesV1(BaseOpenEpdHierarchicalSpec):
|
100
|
+
"""Fenestration accessories performance specification."""
|
101
|
+
|
102
|
+
_EXT_VERSION = "1.0"
|
103
|
+
|
104
|
+
|
105
|
+
class FenestrationFramingV1(BaseOpenEpdHierarchicalSpec):
|
106
|
+
"""Fenestration framing performance specification."""
|
107
|
+
|
108
|
+
_EXT_VERSION = "1.0"
|
109
|
+
|
110
|
+
# Own fields:
|
111
|
+
thermal_separation: ThermalSeparation | None = pyd.Field(default=None, description="", example="Aluminium")
|
112
|
+
material: FrameMaterial | None = pyd.Field(default=None, description="", example="Vinyl")
|
113
|
+
|
114
|
+
|
115
|
+
class FenestrationHardwareV1(BaseOpenEpdHierarchicalSpec):
|
116
|
+
"""Fenestration hardware performance specification."""
|
117
|
+
|
118
|
+
_EXT_VERSION = "1.0"
|
119
|
+
|
120
|
+
# Own fields:
|
121
|
+
function: HardwareFunction | None = pyd.Field(default=None, description="", example="Lock")
|
122
|
+
|
123
|
+
|
124
|
+
class FlatGlassPanesV1(BaseOpenEpdHierarchicalSpec):
|
125
|
+
"""Flat glass panes performance specification."""
|
126
|
+
|
127
|
+
_EXT_VERSION = "1.0"
|
128
|
+
|
129
|
+
# Own fields:
|
130
|
+
thickness: FlatGlassPanesThickness | None = pyd.Field(default=None, description="", example="12 mm")
|
131
|
+
|
132
|
+
_flat_glass_panes_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(
|
133
|
+
validate_unit_factory("m")
|
134
|
+
)
|
135
|
+
|
136
|
+
|
137
|
+
class ProcessedNonInsulatingGlassPanesV1(BaseOpenEpdHierarchicalSpec):
|
138
|
+
"""Processed non insulating glass panes performance specification."""
|
139
|
+
|
140
|
+
_EXT_VERSION = "1.0"
|
141
|
+
|
142
|
+
# Own fields:
|
143
|
+
low_emissivity: bool | None = pyd.Field(default=None, description="", example=True)
|
144
|
+
electrochromic: bool | None = pyd.Field(default=None, description="", example=True)
|
145
|
+
acid_etched: bool | None = pyd.Field(default=None, description="", example=True)
|
146
|
+
tempered: bool | None = pyd.Field(default=None, description="", example=True)
|
147
|
+
toughened: bool | None = pyd.Field(default=None, description="", example=True)
|
148
|
+
laminated: bool | None = pyd.Field(default=None, description="", example=True)
|
149
|
+
fire_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
150
|
+
fire_protection: bool | None = pyd.Field(default=None, description="", example=True)
|
151
|
+
pyrolytic_coated: bool | None = pyd.Field(default=None, description="", example=True)
|
152
|
+
sputter_coat: bool | None = pyd.Field(default=None, description="", example=True)
|
153
|
+
solar_heat_gain: RatioFloat | None = pyd.Field(default=None, description="", example=0.5, ge=0, le=1)
|
154
|
+
|
155
|
+
|
156
|
+
class GlazedDoorsV1(BaseOpenEpdHierarchicalSpec):
|
157
|
+
"""Glazed doors performance specification."""
|
158
|
+
|
159
|
+
_EXT_VERSION = "1.0"
|
160
|
+
|
161
|
+
|
162
|
+
class UnitSkylightsV1(BaseOpenEpdHierarchicalSpec):
|
163
|
+
"""Unit skylights performance specification."""
|
164
|
+
|
165
|
+
_EXT_VERSION = "1.0"
|
166
|
+
|
167
|
+
|
168
|
+
class WindowsV1(BaseOpenEpdHierarchicalSpec):
|
169
|
+
"""Windows performance specification."""
|
170
|
+
|
171
|
+
_EXT_VERSION = "1.0"
|
172
|
+
|
173
|
+
|
174
|
+
class IntegratedDoorsOpeningAssembliesV1(BaseOpenEpdHierarchicalSpec):
|
175
|
+
"""Integrated doors opening assemblies performance specification."""
|
176
|
+
|
177
|
+
_EXT_VERSION = "1.0"
|
178
|
+
|
179
|
+
|
180
|
+
class MetalDoorAndFramesV1(BaseOpenEpdHierarchicalSpec):
|
181
|
+
"""Metal door and frames performance specification."""
|
182
|
+
|
183
|
+
_EXT_VERSION = "1.0"
|
184
|
+
|
185
|
+
|
186
|
+
class SpecialtyDoorsAndFramesV1(BaseOpenEpdHierarchicalSpec):
|
187
|
+
"""Specialty doors and frames performance specification."""
|
188
|
+
|
189
|
+
_EXT_VERSION = "1.0"
|
190
|
+
|
191
|
+
# Nested specs:
|
192
|
+
SpecialFunctionDoors: SpecialFunctionDoorsV1 | None = None
|
193
|
+
SlidingGlassDoors: SlidingGlassDoorsV1 | None = None
|
194
|
+
|
195
|
+
|
196
|
+
class WoodDoorsV1(BaseOpenEpdHierarchicalSpec):
|
197
|
+
"""Wood doors performance specification."""
|
198
|
+
|
199
|
+
_EXT_VERSION = "1.0"
|
200
|
+
|
201
|
+
|
202
|
+
class FenestrationPartsV1(BaseOpenEpdHierarchicalSpec):
|
203
|
+
"""Fenestration parts performance specification."""
|
204
|
+
|
205
|
+
_EXT_VERSION = "1.0"
|
206
|
+
|
207
|
+
# Own fields:
|
208
|
+
intended_application: GlazingIntendedApplication | None = pyd.Field(
|
209
|
+
default=None, description="Intended application."
|
210
|
+
)
|
211
|
+
|
212
|
+
# Nested specs:
|
213
|
+
FenestrationAccessories: FenestrationAccessoriesV1 | None = None
|
214
|
+
FenestrationFraming: FenestrationFramingV1 | None = None
|
215
|
+
FenestrationHardware: FenestrationHardwareV1 | None = None
|
216
|
+
|
217
|
+
|
218
|
+
class GlassPanesV1(BaseOpenEpdHierarchicalSpec):
|
219
|
+
"""Glass panes performance specification."""
|
220
|
+
|
221
|
+
_EXT_VERSION = "1.0"
|
222
|
+
|
223
|
+
# Nested specs:
|
224
|
+
FlatGlassPanes: FlatGlassPanesV1 | None = None
|
225
|
+
ProcessedNonInsulatingGlassPanes: ProcessedNonInsulatingGlassPanesV1 | None = None
|
226
|
+
|
227
|
+
|
228
|
+
class NAFSPerformanceClass(BaseOpenEpdSchema):
|
229
|
+
"""NAFS Performance class."""
|
230
|
+
|
231
|
+
r: bool | None = pyd.Field(
|
232
|
+
default=None, description="Residential; commonly used in one- and two-family dwellings.", example=True
|
233
|
+
)
|
234
|
+
lc: bool | None = pyd.Field(
|
235
|
+
default=None,
|
236
|
+
description="Light Commercial: commonly used in low-rise and mid-rise multi-family dwellings and other "
|
237
|
+
"buildings where larger sizes and higher loading requirements are expected.",
|
238
|
+
example=True,
|
239
|
+
)
|
240
|
+
cw: bool | None = pyd.Field(
|
241
|
+
default=None,
|
242
|
+
description="Commercial Window: commonly used in low-rise and mid-rise buildings where larger sizes, higher "
|
243
|
+
"loading requirements, limits on deflection, and heavy use are expected.",
|
244
|
+
example=True,
|
245
|
+
)
|
246
|
+
aw: bool | None = pyd.Field(
|
247
|
+
default=None,
|
248
|
+
description="Architectural Window: commonly used in high-rise and mid-rise buildings to meet increased "
|
249
|
+
"loading requirements and limits on deflection, and in buildings where frequent and extreme use "
|
250
|
+
"of the fenestration products is expected.",
|
251
|
+
example=True,
|
252
|
+
)
|
253
|
+
|
254
|
+
|
255
|
+
class NAFSFenestrationV1(BaseOpenEpdHierarchicalSpec):
|
256
|
+
"""NAFS fenestration performance specification."""
|
257
|
+
|
258
|
+
_EXT_VERSION = "1.0"
|
259
|
+
|
260
|
+
# Own fields:
|
261
|
+
hurricane_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
262
|
+
low_emissivity: bool | None = pyd.Field(default=None, description="", example=True)
|
263
|
+
electrochromic: bool | None = pyd.Field(default=None, description="", example=True)
|
264
|
+
acid_etched: bool | None = pyd.Field(default=None, description="", example=True)
|
265
|
+
tempered: bool | None = pyd.Field(default=None, description="", example=True)
|
266
|
+
toughened: bool | None = pyd.Field(default=None, description="", example=True)
|
267
|
+
laminated: bool | None = pyd.Field(default=None, description="", example=True)
|
268
|
+
fire_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
269
|
+
fire_protection: bool | None = pyd.Field(default=None, description="", example=True)
|
270
|
+
pyrolytic_coated: bool | None = pyd.Field(default=None, description="", example=True)
|
271
|
+
sputter_coat: bool | None = pyd.Field(default=None, description="", example=True)
|
272
|
+
thermal_separation: ThermalSeparation | None = pyd.Field(default=None, description="", example="Aluminium")
|
273
|
+
assembly_u_factor: str | None = pyd.Field(default=None, description="", example="1 USI")
|
274
|
+
solar_heat_gain: RatioFloat | None = pyd.Field(default=None, description="", example=0.5, ge=0, le=1)
|
275
|
+
air_infiltration: str | None = pyd.Field(default=None, description="", example="1 m / s")
|
276
|
+
dp_rating: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
|
277
|
+
glass_panes: int | None = pyd.Field(default=None, description="", example=3)
|
278
|
+
|
279
|
+
performance_class: NAFSPerformanceClass | None = pyd.Field(
|
280
|
+
default=None, description="Performance class according to NAFS."
|
281
|
+
)
|
282
|
+
|
283
|
+
performance_grade: NAFSPerformanceGrade | None = pyd.Field(
|
284
|
+
default=None,
|
285
|
+
description="NAFS Performance Grade. The NAFS Performance Grade is a number that represents the performance "
|
286
|
+
"of the glazing product. The higher the number, the better the performance. The NAFS Performance "
|
287
|
+
"Grade is calculated using the NAFS Performance Class, the NAFS Performance Index, and the NAFS "
|
288
|
+
"Performance Factor. While it is expressed as pressure, there are specific values which are "
|
289
|
+
"allowed. The values are listed in the enum.",
|
290
|
+
example="95 psf",
|
291
|
+
)
|
292
|
+
|
293
|
+
_assembly_u_factor_is_quantity_validator = pyd.validator("assembly_u_factor", allow_reuse=True)(
|
294
|
+
validate_unit_factory("USI")
|
295
|
+
)
|
296
|
+
_air_infiltration_is_quantity_validator = pyd.validator("air_infiltration", allow_reuse=True)(
|
297
|
+
validate_unit_factory("m / s")
|
298
|
+
)
|
299
|
+
_dp_rating_is_quantity_validator = pyd.validator("dp_rating", allow_reuse=True)(validate_unit_factory("MPa"))
|
300
|
+
_nafs_performance_grade_is_quantity_validator = pyd.validator("performance_grade", allow_reuse=True)(
|
301
|
+
validate_unit_factory("psf")
|
302
|
+
)
|
303
|
+
|
304
|
+
# Nested specs:
|
305
|
+
GlazedDoors: GlazedDoorsV1 | None = None
|
306
|
+
UnitSkylights: UnitSkylightsV1 | None = None
|
307
|
+
Windows: WindowsV1 | None = None
|
308
|
+
|
309
|
+
|
310
|
+
class InsulatingGlazingUnitsV1(BaseOpenEpdHierarchicalSpec):
|
311
|
+
"""Insulating glazing units performance specification."""
|
312
|
+
|
313
|
+
_EXT_VERSION = "1.0"
|
314
|
+
|
315
|
+
# Own fields:
|
316
|
+
intended_application: GlazingIntendedApplication | None = pyd.Field(
|
317
|
+
default=None, description="Intended application for IGUs."
|
318
|
+
)
|
319
|
+
|
320
|
+
hurricane_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
321
|
+
low_emissivity: bool | None = pyd.Field(default=None, description="", example=True)
|
322
|
+
electrochromic: bool | None = pyd.Field(default=None, description="", example=True)
|
323
|
+
acid_etched: bool | None = pyd.Field(default=None, description="", example=True)
|
324
|
+
tempered: bool | None = pyd.Field(default=None, description="", example=True)
|
325
|
+
toughened: bool | None = pyd.Field(default=None, description="", example=True)
|
326
|
+
laminated: bool | None = pyd.Field(default=None, description="", example=True)
|
327
|
+
fire_resistant: bool | None = pyd.Field(default=None, description="", example=True)
|
328
|
+
fire_protection: bool | None = pyd.Field(default=None, description="", example=True)
|
329
|
+
pyrolytic_coated: bool | None = pyd.Field(default=None, description="", example=True)
|
330
|
+
sputter_coat: bool | None = pyd.Field(default=None, description="", example=True)
|
331
|
+
solar_heat_gain: RatioFloat | None = pyd.Field(default=None, description="", example=0.5, ge=0, le=1)
|
332
|
+
air_infiltration: str | None = pyd.Field(default=None, description="", example="1 m / s")
|
333
|
+
dp_rating: PressureMPaStr | None = pyd.Field(default=None, description="", example="1 MPa")
|
334
|
+
glass_panes: int | None = pyd.Field(default=None, description="", example=3)
|
335
|
+
cog_u_factor: str | None = pyd.Field(default=None, description="", example="1 USI")
|
336
|
+
spacer: Spacer | None = pyd.Field(default=None, description="", example="Aluminium")
|
337
|
+
|
338
|
+
_air_infiltration_is_quantity_validator = pyd.validator("air_infiltration", allow_reuse=True)(
|
339
|
+
validate_unit_factory("m / s")
|
340
|
+
)
|
341
|
+
_dp_rating_is_quantity_validator = pyd.validator("dp_rating", allow_reuse=True)(validate_unit_factory("MPa"))
|
342
|
+
_cog_u_factor_is_quantity_validator = pyd.validator("cog_u_factor", allow_reuse=True)(validate_unit_factory("USI"))
|
343
|
+
|
344
|
+
|
345
|
+
class CurtainWallsV1(BaseOpenEpdHierarchicalSpec):
|
346
|
+
"""Curtain walls performance specification."""
|
347
|
+
|
348
|
+
_EXT_VERSION = "1.0"
|
349
|
+
|
350
|
+
|
351
|
+
class DoorsAndFramesV1(BaseOpenEpdHierarchicalSpec):
|
352
|
+
"""Doors and frames performance specification."""
|
353
|
+
|
354
|
+
_EXT_VERSION = "1.0"
|
355
|
+
|
356
|
+
# Own fields:
|
357
|
+
height: LengthMmStr | None = pyd.Field(default=None, description="", example="1200 mm")
|
358
|
+
width: LengthMmStr | None = pyd.Field(default=None, description="", example="600 mm")
|
359
|
+
|
360
|
+
_height_is_quantity_validator = pyd.validator("height", allow_reuse=True)(validate_unit_factory("m"))
|
361
|
+
_width_is_quantity_validator = pyd.validator("width", allow_reuse=True)(validate_unit_factory("m"))
|
362
|
+
|
363
|
+
# Nested specs:
|
364
|
+
IntegratedDoorsOpeningAssemblies: IntegratedDoorsOpeningAssembliesV1 | None = None
|
365
|
+
MetalDoorAndFrames: MetalDoorAndFramesV1 | None = None
|
366
|
+
SpecialtyDoorsAndFrames: SpecialtyDoorsAndFramesV1 | None = None
|
367
|
+
WoodDoors: WoodDoorsV1 | None = None
|
368
|
+
|
369
|
+
|
370
|
+
class EntrancesV1(BaseOpenEpdHierarchicalSpec):
|
371
|
+
"""Entrances performance specification."""
|
372
|
+
|
373
|
+
_EXT_VERSION = "1.0"
|
374
|
+
|
375
|
+
|
376
|
+
class GlazingV1(BaseOpenEpdHierarchicalSpec):
|
377
|
+
"""Glazing performance specification."""
|
378
|
+
|
379
|
+
_EXT_VERSION = "1.0"
|
380
|
+
|
381
|
+
# Nested specs:
|
382
|
+
FenestrationParts: FenestrationPartsV1 | None = None
|
383
|
+
GlassPanes: GlassPanesV1 | None = None
|
384
|
+
NAFSFenestration: NAFSFenestrationV1 | None = None
|
385
|
+
InsulatingGlazingUnits: InsulatingGlazingUnitsV1 | None = None
|
386
|
+
|
387
|
+
|
388
|
+
class StorefrontsV1(BaseOpenEpdHierarchicalSpec):
|
389
|
+
"""Storefronts performance specification."""
|
390
|
+
|
391
|
+
_EXT_VERSION = "1.0"
|
392
|
+
|
393
|
+
|
394
|
+
class TranslucentWallAndRoofAssembliesV1(BaseOpenEpdHierarchicalSpec):
|
395
|
+
"""Translucent wall and roof assemblies performance specification."""
|
396
|
+
|
397
|
+
_EXT_VERSION = "1.0"
|
398
|
+
|
399
|
+
|
400
|
+
class WindowWallAssembliesV1(BaseOpenEpdHierarchicalSpec):
|
401
|
+
"""Window wall assemblies performance specification."""
|
402
|
+
|
403
|
+
_EXT_VERSION = "1.0"
|
404
|
+
|
405
|
+
|
406
|
+
class OpeningsV1(BaseOpenEpdHierarchicalSpec):
|
407
|
+
"""Openings performance specification."""
|
408
|
+
|
409
|
+
_EXT_VERSION = "1.0"
|
410
|
+
|
411
|
+
# Own fields:
|
412
|
+
thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="80 mm")
|
413
|
+
|
414
|
+
_thickness_is_quantity_validator = pyd.validator("thickness", allow_reuse=True)(validate_unit_factory("m"))
|
415
|
+
|
416
|
+
# Nested specs:
|
417
|
+
CurtainWalls: CurtainWallsV1 | None = None
|
418
|
+
DoorsAndFrames: DoorsAndFramesV1 | None = None
|
419
|
+
Entrances: EntrancesV1 | None = None
|
420
|
+
Glazing: GlazingV1 | None = None
|
421
|
+
Storefronts: StorefrontsV1 | None = None
|
422
|
+
TranslucentWallAndRoofAssemblies: TranslucentWallAndRoofAssembliesV1 | None = None
|
423
|
+
WindowWallAssemblies: WindowWallAssembliesV1 | None = None
|
@@ -0,0 +1,26 @@
|
|
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
|
+
# This software was developed with support from the Skanska USA,
|
17
|
+
# Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
|
18
|
+
# Find out more at www.BuildingTransparency.org
|
19
|
+
#
|
20
|
+
from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
|
21
|
+
|
22
|
+
|
23
|
+
class OtherElectricalEquipmentV1(BaseOpenEpdHierarchicalSpec):
|
24
|
+
"""Other electrical equipment performance specification."""
|
25
|
+
|
26
|
+
_EXT_VERSION = "1.0"
|