-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathG36ReturnAirDamperPositionForReliefDamperOrFan.py
149 lines (124 loc) · 4.57 KB
/
G36ReturnAirDamperPositionForReliefDamperOrFan.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
"""
### Description
Section 5.16.2.3
- Supply air temperature shall be controlled to setpoint using a control loop whose output is mapped to sequence the heating coil (if applicable), outdoor air damper, return air damper, and cooling coil
### Code requirement
- Code Name: ASHRAE Guideline 36
- Code Year: 2021
- Code Section: 5.16.2 Supply Air Temperature Control
- Code Subsection: 5.16.2.3 Return Air Damper Control with Relief Damper/Fan
### Verification Approach
The verification checks return air damper position under four conditions:
1. During heating: damper should be at maximum position
2. During cooling: damper should be fully closed
3. When outdoor air damper is below maximum: return damper should be at maximum
4. When outdoor air damper is at maximum: return damper should be below maximum
### Verification Applicability
- Building Type(s): any
- Space Type(s): any
- System(s): Air handling units with relief dampers or fans
- Climate Zone(s): any
- Component(s): return air dampers, relief dampers/fans, outdoor air dampers
### Verification Algorithm Pseudo Code
```python
if output_coil_heating > 0:
if abs(position_damper_air_return - position_damper_air_return_max) = 0:
pass
else:
fail
elif output_coil_cooling > 0:
if abs(position_damper_air_return - 0) = 0:
pass
else:
fail
elif position_damper_air_outdoor < position_damper_air_outdoor_max:
if abs(position_damper_air_return - position_damper_air_return_max) = 0:
pass
else:
fail
elif abs(position_damper_air_outdoor - position_damper_air_outdoor_max) = 0:
if position_damper_air_return < position_damper_air_return_max:
pass
else:
fail
```
### Data requirements
- output_coil_heating: Heating signal
- Data Value Unit: percent
- Data Point Affiliation: System control
- output_coil_cooling: Cooling signal
- Data Value Unit: percent
- Data Point Affiliation: System control
- position_damper_air_return: Return air damper position
- Data Value Unit: percent
- Data Point Affiliation: Air handling unit
- position_damper_air_return_max: Maximum return air damper position
- Data Value Unit: percent
- Data Point Affiliation: Air handling unit
- position_damper_air_outdoor: Outdoor air damper position
- Data Value Unit: percent
- Data Point Affiliation: Air handling unit
- position_damper_air_outdoor_max: Maximum outdoor air damper position
- Data Value Unit: percent
- Data Point Affiliation: Air handling unit
"""
from constrain.checklib import RuleCheckBase
class G36ReturnAirDamperPositionForReliefDamperOrFan(RuleCheckBase):
points = [
"output_coil_heating",
"output_coil_cooling",
"position_damper_air_return",
"position_damper_air_return_max",
"position_damper_air_outdoor",
"position_damper_air_outdoor_max",
]
def return_air_damper(self, data):
if data["output_coil_heating"] > 0:
if abs(
data["position_damper_air_return"]
- data["position_damper_air_return_max"]
) < self.get_tolerance("damper", "position"):
return True
else:
return False
elif data["output_coil_cooling"] > 0:
if data["position_damper_air_return"] < self.get_tolerance(
"damper", "position"
):
return True
else:
return False
elif (
data["position_damper_air_outdoor"]
< data["position_damper_air_outdoor_max"]
):
if abs(
data["position_damper_air_return"]
- data["position_damper_air_return_max"]
) < self.get_tolerance("damper", "position"):
return True
else:
return False
elif abs(
data["position_damper_air_outdoor"]
- data["position_damper_air_outdoor_max"]
) < self.get_tolerance("damper", "position"):
if (
data["position_damper_air_return"]
< data["position_damper_air_return_max"]
):
return True
else:
return False
else:
return "Untested"
def verify(self):
self.result = self.df.apply(lambda d: self.return_air_damper(d), axis=1)
def check_bool(self):
if len(self.result[self.result == False] > 0):
return False
else:
if len(self.result[self.result == "Untested"] > 0):
return "Untested"
else:
return True