open-fdd 0.1.3__py3-none-any.whl → 0.1.4__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 (38) hide show
  1. open_fdd/air_handling_unit/faults/__init__.py +2253 -0
  2. open_fdd/air_handling_unit/faults/fault_condition.py +12 -10
  3. open_fdd/air_handling_unit/faults/fault_condition_eight.py +38 -2
  4. open_fdd/air_handling_unit/faults/fault_condition_eleven.py +38 -2
  5. open_fdd/air_handling_unit/faults/fault_condition_fifteen.py +38 -2
  6. open_fdd/air_handling_unit/faults/fault_condition_five.py +38 -2
  7. open_fdd/air_handling_unit/faults/fault_condition_four.py +34 -2
  8. open_fdd/air_handling_unit/faults/fault_condition_fourteen.py +38 -2
  9. open_fdd/air_handling_unit/faults/fault_condition_nine.py +38 -2
  10. open_fdd/air_handling_unit/faults/fault_condition_one.py +37 -6
  11. open_fdd/air_handling_unit/faults/fault_condition_seven.py +38 -2
  12. open_fdd/air_handling_unit/faults/fault_condition_six.py +39 -2
  13. open_fdd/air_handling_unit/faults/fault_condition_ten.py +39 -3
  14. open_fdd/air_handling_unit/faults/fault_condition_thirteen.py +38 -2
  15. open_fdd/air_handling_unit/faults/fault_condition_three.py +32 -2
  16. open_fdd/air_handling_unit/faults/fault_condition_twelve.py +40 -3
  17. open_fdd/air_handling_unit/faults/fault_condition_two.py +32 -2
  18. open_fdd/air_handling_unit/faults/helper_utils.py +1 -29
  19. open_fdd/tests/ahu/test_ahu_fc1.py +1 -1
  20. open_fdd/tests/ahu/test_ahu_fc10.py +1 -1
  21. open_fdd/tests/ahu/test_ahu_fc11.py +1 -1
  22. open_fdd/tests/ahu/test_ahu_fc12.py +1 -1
  23. open_fdd/tests/ahu/test_ahu_fc13.py +1 -1
  24. open_fdd/tests/ahu/test_ahu_fc14.py +1 -1
  25. open_fdd/tests/ahu/test_ahu_fc15.py +1 -1
  26. open_fdd/tests/ahu/test_ahu_fc2.py +1 -1
  27. open_fdd/tests/ahu/test_ahu_fc3.py +1 -1
  28. open_fdd/tests/ahu/test_ahu_fc4.py +199 -127
  29. open_fdd/tests/ahu/test_ahu_fc5.py +1 -1
  30. open_fdd/tests/ahu/test_ahu_fc6.py +2 -2
  31. open_fdd/tests/ahu/test_ahu_fc7.py +1 -1
  32. open_fdd/tests/ahu/test_ahu_fc8.py +1 -1
  33. open_fdd/tests/ahu/test_ahu_fc9.py +1 -1
  34. {open_fdd-0.1.3.dist-info → open_fdd-0.1.4.dist-info}/METADATA +2 -3
  35. {open_fdd-0.1.3.dist-info → open_fdd-0.1.4.dist-info}/RECORD +38 -38
  36. {open_fdd-0.1.3.dist-info → open_fdd-0.1.4.dist-info}/LICENSE +0 -0
  37. {open_fdd-0.1.3.dist-info → open_fdd-0.1.4.dist-info}/WHEEL +0 -0
  38. {open_fdd-0.1.3.dist-info → open_fdd-0.1.4.dist-info}/top_level.txt +0 -0
@@ -1,128 +1,200 @@
1
1
  import pandas as pd
2
- from open_fdd.air_handling_unit.faults.fault_condition import (
3
- FaultCondition,
4
- MissingColumnError,
5
- )
6
- import sys
7
-
8
-
9
- class FaultConditionFour(FaultCondition):
10
- """Class provides the definitions for Fault Condition 4.
11
-
12
- This fault flags excessive operating states on the AHU
13
- if it's hunting between heating, econ, econ+mech, and
14
- a mech clg modes. The code counts how many operating
15
- changes in an hour and will throw a fault if there is
16
- excessive OS changes to flag control sys hunting.
17
- """
18
-
19
- def __init__(self, dict_):
20
- super().__init__()
21
- self.delta_os_max = float
22
- self.ahu_min_oa_dpr = float
23
- self.economizer_sig_col = str
24
- self.heating_sig_col = str
25
- self.cooling_sig_col = str
26
- self.supply_vfd_speed_col = str
27
- self.troubleshoot_mode = bool # default to False
28
-
29
- self.set_attributes(dict_)
30
-
31
- # Set required columns, making heating and cooling optional
32
- self.required_columns = [
33
- self.economizer_sig_col,
34
- self.supply_vfd_speed_col,
35
- ]
36
-
37
- # If heating or cooling columns are provided, add them to the required columns
38
- if self.heating_sig_col:
39
- self.required_columns.append(self.heating_sig_col)
40
- if self.cooling_sig_col:
41
- self.required_columns.append(self.cooling_sig_col)
42
-
43
- def get_required_columns(self) -> str:
44
- """Returns a string representation of the required columns."""
45
- return f"Required columns for FaultConditionFour: {', '.join(self.required_columns)}"
46
-
47
- def apply(self, df: pd.DataFrame) -> pd.DataFrame:
48
- try:
49
- # Ensure all required columns are present
50
- self.check_required_columns(df)
51
-
52
- # If the optional columns are not present, create them with all values set to 0.0
53
- if self.heating_sig_col not in df.columns:
54
- df[self.heating_sig_col] = 0.0
55
- if self.cooling_sig_col not in df.columns:
56
- df[self.cooling_sig_col] = 0.0
57
-
58
- if self.troubleshoot_mode:
59
- self.troubleshoot_cols(df)
60
-
61
- # Check analog outputs [data with units of %] are floats only
62
- columns_to_check = [
63
- self.economizer_sig_col,
64
- self.heating_sig_col,
65
- self.cooling_sig_col,
66
- self.supply_vfd_speed_col,
67
- ]
68
-
69
- for col in columns_to_check:
70
- self.check_analog_pct(df, [col])
71
-
72
- print("=" * 50)
73
- print("Warning: The program is in FC4 and resampling the data")
74
- print("to compute AHU OS state changes per hour")
75
- print("to flag any hunting issue")
76
- print("and this usually takes a while to run...")
77
- print("=" * 50)
78
-
79
- sys.stdout.flush()
80
-
81
- # AHU htg only mode based on OA damper @ min oa and only htg pid/vlv modulating
82
- df["heating_mode"] = (
83
- (df[self.heating_sig_col] > 0)
84
- & (df[self.cooling_sig_col] == 0)
85
- & (df[self.supply_vfd_speed_col] > 0)
86
- & (df[self.economizer_sig_col] == self.ahu_min_oa_dpr)
87
- )
88
-
89
- # AHU econ only mode based on OA damper modulating and clg htg = zero
90
- df["econ_only_cooling_mode"] = (
91
- (df[self.heating_sig_col] == 0)
92
- & (df[self.cooling_sig_col] == 0)
93
- & (df[self.supply_vfd_speed_col] > 0)
94
- & (df[self.economizer_sig_col] > self.ahu_min_oa_dpr)
95
- )
96
-
97
- # AHU econ+mech clg mode based on OA damper modulating for cooling and clg pid/vlv modulating
98
- df["econ_plus_mech_cooling_mode"] = (
99
- (df[self.heating_sig_col] == 0)
100
- & (df[self.cooling_sig_col] > 0)
101
- & (df[self.supply_vfd_speed_col] > 0)
102
- & (df[self.economizer_sig_col] > self.ahu_min_oa_dpr)
103
- )
104
-
105
- # AHU mech mode based on OA damper @ min OA and clg pid/vlv modulating
106
- df["mech_cooling_only_mode"] = (
107
- (df[self.heating_sig_col] == 0)
108
- & (df[self.cooling_sig_col] > 0)
109
- & (df[self.supply_vfd_speed_col] > 0)
110
- & (df[self.economizer_sig_col] == self.ahu_min_oa_dpr)
111
- )
112
-
113
- # Fill non-finite values with zero or drop them
114
- df = df.fillna(0)
115
-
116
- df = df.astype(int)
117
- df = df.resample("60min").apply(lambda x: (x.eq(1) & x.shift().ne(1)).sum())
118
-
119
- df["fc4_flag"] = (
120
- df[df.columns].gt(self.delta_os_max).any(axis=1).astype(int)
121
- )
122
-
123
- return df
124
-
125
- except MissingColumnError as e:
126
- print(f"Error: {e.message}")
127
- sys.stdout.flush()
128
- raise e # Re-raise the exception so it can be caught by pytest
2
+ import pytest
3
+ from open_fdd.air_handling_unit.faults import FaultConditionFour
4
+ from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
+ from datetime import datetime, timezone
6
+
7
+ """
8
+ To see print statements in pytest run with:
9
+ $ py -3.12 -m pytest tests/ahu/test_ahu_fc4.py -rP -s
10
+
11
+ Too much hunting in control system
12
+ OS state changes greater than 7 in an hour
13
+ """
14
+
15
+ # Constants
16
+ DELTA_OS_MAX = 7
17
+ AHU_MIN_OA = 0.20
18
+ TEST_MIX_AIR_DAMPER_COL = "economizer_sig_col"
19
+ TEST_HEATING_COIL_SIG_COL = "heating_sig_col"
20
+ TEST_COOLING_COIL_SIG_COL = "cooling_sig_col"
21
+ TEST_SUPPLY_VFD_SPEED_COL = "fan_vfd_speed_col"
22
+ TEST_DATASET_ROWS = 60
23
+
24
+ # Initialize FaultConditionFour with a dictionary
25
+ fault_condition_params = {
26
+ "DELTA_OS_MAX": DELTA_OS_MAX,
27
+ "AHU_MIN_OA_DPR": AHU_MIN_OA,
28
+ "ECONOMIZER_SIG_COL": TEST_MIX_AIR_DAMPER_COL,
29
+ "HEATING_SIG_COL": TEST_HEATING_COIL_SIG_COL,
30
+ "COOLING_SIG_COL": TEST_COOLING_COIL_SIG_COL,
31
+ "SUPPLY_VFD_SPEED_COL": TEST_SUPPLY_VFD_SPEED_COL,
32
+ "TROUBLESHOOT_MODE": False, # default value
33
+ }
34
+
35
+ fc4 = FaultConditionFour(fault_condition_params)
36
+
37
+
38
+ def generate_timestamp() -> pd.Series:
39
+ df = pd.DataFrame()
40
+ date_range = pd.period_range(
41
+ # make a time stamp starting at top of
42
+ # the hour with one min intervals
43
+ start=datetime(2022, 6, 6, 14, 30, 0, 0, tzinfo=timezone.utc),
44
+ periods=TEST_DATASET_ROWS,
45
+ freq="min",
46
+ )
47
+ df["Date"] = [x.to_timestamp() for x in date_range]
48
+ return df["Date"]
49
+
50
+
51
+ def econ_plus_mech_clg_row() -> dict:
52
+ data = {
53
+ TEST_MIX_AIR_DAMPER_COL: 0.6,
54
+ TEST_HEATING_COIL_SIG_COL: 0.0,
55
+ TEST_COOLING_COIL_SIG_COL: 0.6,
56
+ TEST_SUPPLY_VFD_SPEED_COL: 0.8,
57
+ }
58
+ return data
59
+
60
+
61
+ def mech_clg_row() -> dict:
62
+ data = {
63
+ TEST_MIX_AIR_DAMPER_COL: 0.0,
64
+ TEST_HEATING_COIL_SIG_COL: 0.0,
65
+ TEST_COOLING_COIL_SIG_COL: 0.6,
66
+ TEST_SUPPLY_VFD_SPEED_COL: 0.8,
67
+ }
68
+ return data
69
+
70
+
71
+ def econ_plus_mech_clg_row_int() -> dict:
72
+ data = {
73
+ TEST_MIX_AIR_DAMPER_COL: 0.6,
74
+ TEST_HEATING_COIL_SIG_COL: 0.0,
75
+ TEST_COOLING_COIL_SIG_COL: 0.6,
76
+ TEST_SUPPLY_VFD_SPEED_COL: 88,
77
+ }
78
+ return data
79
+
80
+
81
+ def econ_plus_mech_clg_row_float_greater_than_one() -> dict:
82
+ data = {
83
+ TEST_MIX_AIR_DAMPER_COL: 0.6,
84
+ TEST_HEATING_COIL_SIG_COL: 0.0,
85
+ TEST_COOLING_COIL_SIG_COL: 0.6,
86
+ TEST_SUPPLY_VFD_SPEED_COL: 88.8,
87
+ }
88
+ return data
89
+
90
+
91
+ class TestFault(object):
92
+
93
+ def fault_df(self) -> pd.DataFrame:
94
+ data = []
95
+ counter = 0
96
+ for i in range(TEST_DATASET_ROWS):
97
+ if i % 2 == 0 and counter < 11:
98
+ data.append(econ_plus_mech_clg_row())
99
+ counter += 1 # only simulate 10 OS changes
100
+ else:
101
+ data.append(mech_clg_row())
102
+ return pd.DataFrame(data)
103
+
104
+ def test_fault(self):
105
+ fault_df = self.fault_df().set_index(generate_timestamp())
106
+ results = fc4.apply(fault_df)
107
+ actual = results["fc4_flag"].sum()
108
+ expected = 1
109
+ message = f"FC4 fault_df actual is {actual} and expected is {expected}"
110
+ assert actual == expected, message
111
+
112
+
113
+ class TestNoFault(object):
114
+
115
+ def no_fault_df(self) -> pd.DataFrame:
116
+ data = []
117
+ for i in range(TEST_DATASET_ROWS):
118
+ data.append(mech_clg_row())
119
+ return pd.DataFrame(data)
120
+
121
+ def test_no_fault(self):
122
+ no_fault_df = self.no_fault_df().set_index(generate_timestamp())
123
+ results = fc4.apply(no_fault_df)
124
+ actual = results["fc4_flag"].sum()
125
+ expected = 0
126
+ message = f"FC4 no_fault_df actual is {actual} and expected is {expected}"
127
+ assert actual == expected, message
128
+
129
+
130
+ class TestFaultOnInt(object):
131
+
132
+ def fault_df_on_output_int(self) -> pd.DataFrame:
133
+ data = []
134
+ for i in range(TEST_DATASET_ROWS):
135
+ if i % 2 == 0:
136
+ data.append(econ_plus_mech_clg_row_int())
137
+ else:
138
+ data.append(mech_clg_row())
139
+ return pd.DataFrame(data)
140
+
141
+ def test_fault_on_int(self):
142
+ fault_df_on_output_int = self.fault_df_on_output_int().set_index(
143
+ generate_timestamp()
144
+ )
145
+ with pytest.raises(
146
+ TypeError,
147
+ match=HelperUtils().float_int_check_err(TEST_SUPPLY_VFD_SPEED_COL),
148
+ ):
149
+ fc4.apply(fault_df_on_output_int)
150
+
151
+
152
+ class TestFaultOnFloatGreaterThanOne(object):
153
+
154
+ def fault_df_on_output_greater_than_one(self) -> pd.DataFrame:
155
+ data = []
156
+ for i in range(TEST_DATASET_ROWS):
157
+ if i % 2 == 0:
158
+ data.append(econ_plus_mech_clg_row_float_greater_than_one())
159
+ else:
160
+ data.append(mech_clg_row())
161
+ return pd.DataFrame(data)
162
+
163
+ def test_fault_on_float_greater_than_one(self):
164
+ fault_df_on_output_greater_than_one = (
165
+ self.fault_df_on_output_greater_than_one().set_index(generate_timestamp())
166
+ )
167
+ with pytest.raises(
168
+ TypeError,
169
+ match=HelperUtils().float_max_check_err(TEST_SUPPLY_VFD_SPEED_COL),
170
+ ):
171
+ fc4.apply(fault_df_on_output_greater_than_one)
172
+
173
+
174
+ class TestFaultOnMixedTypes(object):
175
+
176
+ def fault_df_on_mixed_types(self) -> pd.DataFrame:
177
+ data = []
178
+ for i in range(TEST_DATASET_ROWS):
179
+ if i % 2 == 0:
180
+ data.append(
181
+ {
182
+ TEST_MIX_AIR_DAMPER_COL: 0.6,
183
+ TEST_HEATING_COIL_SIG_COL: 0.0,
184
+ TEST_COOLING_COIL_SIG_COL: 0.6,
185
+ TEST_SUPPLY_VFD_SPEED_COL: 1.1,
186
+ }
187
+ )
188
+ else:
189
+ data.append(mech_clg_row())
190
+ return pd.DataFrame(data)
191
+
192
+ def test_fault_on_mixed_types(self):
193
+ fault_df_on_mixed_types = self.fault_df_on_mixed_types().set_index(
194
+ generate_timestamp()
195
+ )
196
+ with pytest.raises(
197
+ TypeError,
198
+ match=HelperUtils().float_max_check_err(TEST_SUPPLY_VFD_SPEED_COL),
199
+ ):
200
+ fc4.apply(fault_df_on_mixed_types)
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_five import FaultConditionFive
3
+ from open_fdd.air_handling_unit.faults import FaultConditionFive
4
4
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
5
 
6
6
  """
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_six import FaultConditionSix
3
+ from open_fdd.air_handling_unit.faults import FaultConditionSix
4
4
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
5
 
6
6
  """
@@ -12,7 +12,7 @@ OA FRACTION TOO LOW OR TOO HIGH; SHOULD BE EQUAL TO %OAmin
12
12
 
13
13
  # Constants
14
14
  TEST_AIRFLOW_ERR_THRES = 0.3
15
- TEST_AHU_MIN_CFM_DESIGN = 3000
15
+ TEST_AHU_MIN_CFM_DESIGN = 3000.0
16
16
  TEST_OAT_DEGF_ERR_THRES = 5.0
17
17
  TEST_RAT_DEGF_ERR_THRES = 2.0
18
18
  TEST_DELTA_TEMP_MIN = 10.0
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_seven import FaultConditionSeven
3
+ from open_fdd.air_handling_unit.faults import FaultConditionSeven
4
4
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
5
 
6
6
  """
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_eight import FaultConditionEight
3
+ from open_fdd.air_handling_unit.faults import FaultConditionEight
4
4
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
5
 
6
6
  """
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_nine import FaultConditionNine
3
+ from open_fdd.air_handling_unit.faults import FaultConditionNine
4
4
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
5
 
6
6
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: open_fdd
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: A package for fault detection and diagnosis in HVAC systems
5
5
  Home-page: https://github.com/bbartling/open-fdd
6
6
  Author: Ben Bartling
@@ -48,9 +48,8 @@ These are some basic project goals to make this into an interactive FDD applicat
48
48
  - [ ] make `energy_efficiency` faults, IPython reports, and examples to `optimize` in reducing energy consumption.
49
49
  - [ ] make `metering`, faults, IPython reports, and examples to possibly model utility metering data.
50
50
  - [ ] create SQL example to read data from time series db and write back to SQL to then read faults in Grafana.
51
- - [ ] other?
51
+ - [ ] other? Certainly! As ChatGPT would eagerly say!
52
52
 
53
- Certainly! Here's a revised version of your contribution guidelines:
54
53
 
55
54
  ## Contribute
56
55
 
@@ -1,23 +1,23 @@
1
1
  open_fdd/__init__.py,sha256=iGj8QTOZJUTE4nNnBiCHXEXsOdV6YvKcGiLrnOusJCg,1411
2
2
  open_fdd/air_handling_unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- open_fdd/air_handling_unit/faults/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- open_fdd/air_handling_unit/faults/fault_condition.py,sha256=laq9s2KnLwez5obRaO0j_6Fpiph6usY7pZ_bOEloPRU,2185
5
- open_fdd/air_handling_unit/faults/fault_condition_eight.py,sha256=OlPXWDhaZ6T-pL0VQhfqTEHm5Q5fSLig1Uj8AIHHuZg,3210
6
- open_fdd/air_handling_unit/faults/fault_condition_eleven.py,sha256=HW83_Mx3gwPImJBfKHWoSl9nK1wc7LzvpBpmMvS_B6U,3280
7
- open_fdd/air_handling_unit/faults/fault_condition_fifteen.py,sha256=N6OiVE8aEKS5RNEuz1C7mBvmZ_YEkClPM99pM3AMGfg,4365
8
- open_fdd/air_handling_unit/faults/fault_condition_five.py,sha256=F7sGFIU48hSravtqoYDf6pMHM5IDAoSoYJKChGkQnMo,3150
9
- open_fdd/air_handling_unit/faults/fault_condition_four.py,sha256=ZyilsVp_fkZGioXb03TnyN_wenzA_z2qJJ-5v_COO-I,5374
10
- open_fdd/air_handling_unit/faults/fault_condition_fourteen.py,sha256=LQT7RExG2jsgLVJy9JkHdwq_Sj6tHJ7R5UJL4B2Bf2w,4005
11
- open_fdd/air_handling_unit/faults/fault_condition_nine.py,sha256=mCNAOVFC0KybY8JTwYxBirYff9hkzqx2X8_fsD6NuPw,3375
12
- open_fdd/air_handling_unit/faults/fault_condition_one.py,sha256=fxVOgqYhJrrAwKtE0AOo0RgcLiIR5FFpMWRbpb_p7ns,3003
13
- open_fdd/air_handling_unit/faults/fault_condition_seven.py,sha256=xnlLf9teERfTTiUiISynBWhke3eIuEM-2gROOYoi53c,2847
14
- open_fdd/air_handling_unit/faults/fault_condition_six.py,sha256=3wD9UGx_-vXaqwZZVs2uyBhenECjb3CqL5ProrUgfoc,5513
15
- open_fdd/air_handling_unit/faults/fault_condition_ten.py,sha256=1l76_hS1FtnTIWsU01D0s5eWzeRRM7fgVyPmTUyUnq8,3153
16
- open_fdd/air_handling_unit/faults/fault_condition_thirteen.py,sha256=IWbCqChHa5hjnKQ_1dyS7lrpiAg3Y5ICuoe7OyjEX6E,3333
17
- open_fdd/air_handling_unit/faults/fault_condition_three.py,sha256=TTGe1vScZof0DZJ1jZYla6V8xeHdvDc_uuldS2pODCI,3024
18
- open_fdd/air_handling_unit/faults/fault_condition_twelve.py,sha256=gaRg75Mq3RIJSBY8XpLdLd_Nzi7cKZ3o4dnW7w1NYsM,3645
19
- open_fdd/air_handling_unit/faults/fault_condition_two.py,sha256=JdlZVXI4Fkb-YCaj44BrGATYHZ-jtysWGU3JOZA7ePs,3019
20
- open_fdd/air_handling_unit/faults/helper_utils.py,sha256=9FBPNfOsd_BqP95u4hWelnKeUu_IvSUFhYBfPHtXIZE,13861
3
+ open_fdd/air_handling_unit/faults/__init__.py,sha256=Rq7AfQ7sRWneAfqr4v8R7OwNmLifmmfOH1UaA2iZbRM,90291
4
+ open_fdd/air_handling_unit/faults/fault_condition.py,sha256=UN2_k2AZWMDoO4oPAnJW3fvhkHlMkLXZikzU2lXAOuQ,2364
5
+ open_fdd/air_handling_unit/faults/fault_condition_eight.py,sha256=nfL66m5toN0fvIjUu02T7AErsTV0rR8kVIErfaqIeic,4603
6
+ open_fdd/air_handling_unit/faults/fault_condition_eleven.py,sha256=AgQnxP46-KGI-4Hk55gKfPGhauoxpFppdmrrBv-1kto,4699
7
+ open_fdd/air_handling_unit/faults/fault_condition_fifteen.py,sha256=QCn_9FF1p7tqm7qdkyIDOqozP988IeuHzOx0LsmyHAU,5841
8
+ open_fdd/air_handling_unit/faults/fault_condition_five.py,sha256=Dy6HlvCnM5-BN0LvFLoQFk8BHyKSxBWMCFC_6Yd0K4I,4574
9
+ open_fdd/air_handling_unit/faults/fault_condition_four.py,sha256=os-LIW1Hc1xl6Auna6IJXJFd6CUNboVFwG_A3VWFC8o,6710
10
+ open_fdd/air_handling_unit/faults/fault_condition_fourteen.py,sha256=AzcKiK2h3bV5vkbd8ZvqqoaOD372I2CYZHRL1wjHDTo,5480
11
+ open_fdd/air_handling_unit/faults/fault_condition_nine.py,sha256=atXgzyHuy0Rf4RAA2EAM_qTnlgERtIEDoXvJzulJ08E,4780
12
+ open_fdd/air_handling_unit/faults/fault_condition_one.py,sha256=V2hnTb6FdGTR1Z0IowsR2UdUVzI1nD5EFnaSIADBaEc,4240
13
+ open_fdd/air_handling_unit/faults/fault_condition_seven.py,sha256=SKczqGhIkDgyaT5NyyalF5lrc9WFISOQfWh7-PdmVO8,4232
14
+ open_fdd/air_handling_unit/faults/fault_condition_six.py,sha256=Ot0SZJIAShs9U5e495n5hvtWvelF4Ycx0SDDsQUviQE,7045
15
+ open_fdd/air_handling_unit/faults/fault_condition_ten.py,sha256=Q-EBH6_IuVHespev7NTF2QxbYTFOV8GmfvKVpDj2gQY,4581
16
+ open_fdd/air_handling_unit/faults/fault_condition_thirteen.py,sha256=NL_q7fEbTqGoYmvOZocLxHgbc6iCfoBMUvCRNpPVpgs,4718
17
+ open_fdd/air_handling_unit/faults/fault_condition_three.py,sha256=cmcIA_QEUjiz5FIYlx9CqnBp7phU4ZopRBkfZpzqGQg,4309
18
+ open_fdd/air_handling_unit/faults/fault_condition_twelve.py,sha256=QujZrpRPp-58BL4iTJWmexSrp0WiisInKJIHKe9luyk,5066
19
+ open_fdd/air_handling_unit/faults/fault_condition_two.py,sha256=h_psJQHPYBkc8hAK-CbdFx7ySbaJv_XQFS_GxvfM9KE,4305
20
+ open_fdd/air_handling_unit/faults/helper_utils.py,sha256=-Bd1mMMLnFmpNPe7eC23kMJxPtazsIyz5P7W6Yqlu4w,12580
21
21
  open_fdd/air_handling_unit/faults/shared_utils.py,sha256=Kp8ZUBhtrh-jU2Q_bbXTpnbVVUAyacp41tDMknY50i4,2252
22
22
  open_fdd/air_handling_unit/images/ahu1_fc1_2024-06_1.jpg,sha256=3dHZyEm_nS4p7-acZprIpZyuU65_IJKk2sixJBf7Ans,444019
23
23
  open_fdd/air_handling_unit/images/ahu1_fc1_2024-06_2.jpg,sha256=kjWCDhRkpxiigl9VJnnMBlETA_FWHZtAn9oqKuQl1M4,392583
@@ -60,23 +60,23 @@ open_fdd/air_handling_unit/reports/report_fc8.py,sha256=3jZPq2piethtqly1faSc8hk0
60
60
  open_fdd/air_handling_unit/reports/report_fc9.py,sha256=hJbYMYnwptVSEI2NVdnV3Ads-h_9Hl4oFD1HDDLZWHQ,4909
61
61
  open_fdd/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  open_fdd/tests/ahu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
- open_fdd/tests/ahu/test_ahu_fc1.py,sha256=bBi3PLAqlHmLngox23Co-Q9uBK515g2rUVYLGrJ2nSY,5457
64
- open_fdd/tests/ahu/test_ahu_fc10.py,sha256=eJ3msPdgkXwYRJOb6mGDaIZBDJfXhyVFAyr27DVwagY,4597
65
- open_fdd/tests/ahu/test_ahu_fc11.py,sha256=uMLAQ2o-m8czAh7q6xzKlrmGd9m6SGjIfvd4hswOD9E,4746
66
- open_fdd/tests/ahu/test_ahu_fc12.py,sha256=KedYWmVSwb8b-0TZYdC16ysELGHOIsI_xd2va-SqBgg,5871
67
- open_fdd/tests/ahu/test_ahu_fc13.py,sha256=qz_dol4W6M3cIvunkHyFDfqEkB8TA9r9UnoycS2x37I,5750
68
- open_fdd/tests/ahu/test_ahu_fc14.py,sha256=SlnQF37K73tgfUtp1bQl0nH46YV5aByzonUNXJ50CGE,8077
69
- open_fdd/tests/ahu/test_ahu_fc15.py,sha256=jQGgZPbh83q3_oJJVYhobC7KdD-2InbA1zdbsQBlhuc,7685
70
- open_fdd/tests/ahu/test_ahu_fc2.py,sha256=3njwLWjzIT6B6RCMgEGqdPvP3kykYwzQTZ9IOgx_BSE,4756
71
- open_fdd/tests/ahu/test_ahu_fc3.py,sha256=iFHLdTzyMvDw7lFwl5J4I7omXXwrDh7kIyoXTI1YxmM,4680
72
- open_fdd/tests/ahu/test_ahu_fc4.py,sha256=a8B3MuFfdxJkWbcz0PtXXk9gnT1dsmBg3N0uG7Rz2KQ,5009
73
- open_fdd/tests/ahu/test_ahu_fc5.py,sha256=mEbhX5IlDkMwXPv3jPMlE_v3QJH47qsZIL99_KzV7_U,6559
74
- open_fdd/tests/ahu/test_ahu_fc6.py,sha256=M7eHdQexcSDN0CGjnR3bcwk_wbjDxqhJwqg_VjsoGB0,10369
75
- open_fdd/tests/ahu/test_ahu_fc7.py,sha256=ughSBHwrergnFsI5ayVaBoWRUMEetFcYQ59CNBNIS1k,2491
76
- open_fdd/tests/ahu/test_ahu_fc8.py,sha256=KKnDyclhzxppC4bk2Kj9cguqg53sZ7I7CSqqWexpWdE,4685
77
- open_fdd/tests/ahu/test_ahu_fc9.py,sha256=YbO1jZSZD6eAXjQkidjp3TEVCcaL7ADhUsTyKy_jmL0,4817
78
- open_fdd-0.1.3.dist-info/LICENSE,sha256=eghao_GGx_0gB2Sll3x2vV29knONEzUQKrkaXpX1F7w,1087
79
- open_fdd-0.1.3.dist-info/METADATA,sha256=Pb4MNzK2oSGfARayKjTmvInLOxpPWKdhzONJYcyeFEo,6449
80
- open_fdd-0.1.3.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
81
- open_fdd-0.1.3.dist-info/top_level.txt,sha256=Q7sB6UB2d8Ch1v_xIsTiNegmgcCXPkwkrxK3ug6VEOs,9
82
- open_fdd-0.1.3.dist-info/RECORD,,
63
+ open_fdd/tests/ahu/test_ahu_fc1.py,sha256=ojpdYGZtuIYAKnZ4W9KhxQuoyXnGEI5N7braQXh3kAw,5437
64
+ open_fdd/tests/ahu/test_ahu_fc10.py,sha256=niYL7fi6OlgP0wnF8hNh9A07PLzHiRZkyRkrA1zoL2s,4577
65
+ open_fdd/tests/ahu/test_ahu_fc11.py,sha256=mdXlGiEMPkPfshf3NN_nJavL74e4HCmkJQMu86aZc6Q,4723
66
+ open_fdd/tests/ahu/test_ahu_fc12.py,sha256=5T-XcM6xm9KHrc121uPGC9JWLCYehrAYk0KcbmGgYjw,5848
67
+ open_fdd/tests/ahu/test_ahu_fc13.py,sha256=vJlSy4e2WV9hx02P0SiJ75I1DWL2lZ0p7-AWlw97pks,5725
68
+ open_fdd/tests/ahu/test_ahu_fc14.py,sha256=MU0LKqIuoQ_dJ0Kij8_A0YyimCMvUwL6IlMwpQhDbqI,8052
69
+ open_fdd/tests/ahu/test_ahu_fc15.py,sha256=SIolJ9vnJwnpKfRW2ALugYWySuIiZ9_repWP9fdb5H4,7661
70
+ open_fdd/tests/ahu/test_ahu_fc2.py,sha256=CjmO_WUyaSHs17ifCCew3GBJ43nYG55uGL0vHDZpAq8,4736
71
+ open_fdd/tests/ahu/test_ahu_fc3.py,sha256=NB6pOXDS-R4P0LNoRN8ItAqhhLnGnGuAHZha32Qw-hE,4658
72
+ open_fdd/tests/ahu/test_ahu_fc4.py,sha256=vV8jEnFuNGLfhCoTVz29RsIcoDpDOMWg722G0aBEXaE,6304
73
+ open_fdd/tests/ahu/test_ahu_fc5.py,sha256=TpSQTBIF591Q3mVaBeJ6HyqPWhVHmD_gSZNEIFT6yyg,6538
74
+ open_fdd/tests/ahu/test_ahu_fc6.py,sha256=66dwv0EBU_ujZK-J9Ki5a3fnXlk17nOwmtKDiQOHdbM,10351
75
+ open_fdd/tests/ahu/test_ahu_fc7.py,sha256=sABbw2m7WlAXbsqfDD323vfEfg606ThI0QzQyB-OjFo,2469
76
+ open_fdd/tests/ahu/test_ahu_fc8.py,sha256=UZy6BP2PgV1FROUPqMORTx8YnT5ZvqVDhut_Ar81494,4663
77
+ open_fdd/tests/ahu/test_ahu_fc9.py,sha256=b-eIzhNzjZUjVNsP0JAHkOgZu-BtDuPeNnblVVm-jU8,4796
78
+ open_fdd-0.1.4.dist-info/LICENSE,sha256=eghao_GGx_0gB2Sll3x2vV29knONEzUQKrkaXpX1F7w,1087
79
+ open_fdd-0.1.4.dist-info/METADATA,sha256=mnTD5a5-ob9hYjWMbcfxHdB8RAIJ-GOWC33kWtc_JJw,6420
80
+ open_fdd-0.1.4.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
81
+ open_fdd-0.1.4.dist-info/top_level.txt,sha256=Q7sB6UB2d8Ch1v_xIsTiNegmgcCXPkwkrxK3ug6VEOs,9
82
+ open_fdd-0.1.4.dist-info/RECORD,,