open-fdd 0.1.1__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 (63) hide show
  1. open_fdd/air_handling_unit/faults/__init__.py +2253 -0
  2. open_fdd/air_handling_unit/faults/fault_condition.py +38 -18
  3. open_fdd/air_handling_unit/faults/fault_condition_eight.py +91 -31
  4. open_fdd/air_handling_unit/faults/fault_condition_eleven.py +93 -35
  5. open_fdd/air_handling_unit/faults/fault_condition_fifteen.py +111 -49
  6. open_fdd/air_handling_unit/faults/fault_condition_five.py +89 -34
  7. open_fdd/air_handling_unit/faults/fault_condition_four.py +136 -61
  8. open_fdd/air_handling_unit/faults/fault_condition_fourteen.py +103 -40
  9. open_fdd/air_handling_unit/faults/fault_condition_nine.py +95 -35
  10. open_fdd/air_handling_unit/faults/fault_condition_one.py +83 -31
  11. open_fdd/air_handling_unit/faults/fault_condition_seven.py +85 -26
  12. open_fdd/air_handling_unit/faults/fault_condition_six.py +134 -73
  13. open_fdd/air_handling_unit/faults/fault_condition_ten.py +91 -30
  14. open_fdd/air_handling_unit/faults/fault_condition_thirteen.py +95 -34
  15. open_fdd/air_handling_unit/faults/fault_condition_three.py +84 -29
  16. open_fdd/air_handling_unit/faults/fault_condition_twelve.py +98 -37
  17. open_fdd/air_handling_unit/faults/fault_condition_two.py +84 -32
  18. open_fdd/air_handling_unit/faults/helper_utils.py +295 -93
  19. open_fdd/air_handling_unit/images/ahu1_fc1_2024-06_1.jpg +0 -0
  20. open_fdd/air_handling_unit/images/ahu1_fc1_2024-06_2.jpg +0 -0
  21. open_fdd/air_handling_unit/images/example1.jpg +0 -0
  22. open_fdd/air_handling_unit/images/example2.jpg +0 -0
  23. open_fdd/air_handling_unit/images/fc10_definition.png +0 -0
  24. open_fdd/air_handling_unit/images/fc11_definition.png +0 -0
  25. open_fdd/air_handling_unit/images/fc12_definition.png +0 -0
  26. open_fdd/air_handling_unit/images/fc13_definition.png +0 -0
  27. open_fdd/air_handling_unit/images/fc1_definition.png +0 -0
  28. open_fdd/air_handling_unit/images/fc1_report_screenshot_all.png +0 -0
  29. open_fdd/air_handling_unit/images/fc2_definition.png +0 -0
  30. open_fdd/air_handling_unit/images/fc3_definition.png +0 -0
  31. open_fdd/air_handling_unit/images/fc4_definition.png +0 -0
  32. open_fdd/air_handling_unit/images/fc5_definition.png +0 -0
  33. open_fdd/air_handling_unit/images/fc6_definition.png +0 -0
  34. open_fdd/air_handling_unit/images/fc7_definition.png +0 -0
  35. open_fdd/air_handling_unit/images/fc8_definition.png +0 -0
  36. open_fdd/air_handling_unit/images/fc9_definition.png +0 -0
  37. open_fdd/air_handling_unit/images/latex_generator.py +175 -0
  38. open_fdd/air_handling_unit/images/params.docx +0 -0
  39. open_fdd/air_handling_unit/images/params.pdf +0 -0
  40. open_fdd/air_handling_unit/images/plot_for_repo.png +0 -0
  41. open_fdd/air_handling_unit/reports/base_report.py +47 -0
  42. open_fdd/air_handling_unit/reports/report_fc7.py +3 -1
  43. open_fdd/tests/ahu/test_ahu_fc1.py +18 -1
  44. open_fdd/tests/ahu/test_ahu_fc10.py +1 -1
  45. open_fdd/tests/ahu/test_ahu_fc11.py +1 -1
  46. open_fdd/tests/ahu/test_ahu_fc12.py +1 -1
  47. open_fdd/tests/ahu/test_ahu_fc13.py +1 -1
  48. open_fdd/tests/ahu/test_ahu_fc14.py +1 -1
  49. open_fdd/tests/ahu/test_ahu_fc15.py +1 -1
  50. open_fdd/tests/ahu/test_ahu_fc2.py +1 -1
  51. open_fdd/tests/ahu/test_ahu_fc3.py +1 -1
  52. open_fdd/tests/ahu/test_ahu_fc4.py +2 -2
  53. open_fdd/tests/ahu/test_ahu_fc5.py +1 -1
  54. open_fdd/tests/ahu/test_ahu_fc6.py +2 -2
  55. open_fdd/tests/ahu/test_ahu_fc7.py +1 -1
  56. open_fdd/tests/ahu/test_ahu_fc8.py +1 -1
  57. open_fdd/tests/ahu/test_ahu_fc9.py +1 -1
  58. {open_fdd-0.1.1.dist-info → open_fdd-0.1.4.dist-info}/METADATA +34 -5
  59. open_fdd-0.1.4.dist-info/RECORD +82 -0
  60. open_fdd-0.1.1.dist-info/RECORD +0 -59
  61. {open_fdd-0.1.1.dist-info → open_fdd-0.1.4.dist-info}/LICENSE +0 -0
  62. {open_fdd-0.1.1.dist-info → open_fdd-0.1.4.dist-info}/WHEEL +0 -0
  63. {open_fdd-0.1.1.dist-info → open_fdd-0.1.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,175 @@
1
+ import streamlit as st
2
+
3
+
4
+ # On windows 10 python 3.10.6
5
+ # py -3.10 -m streamlit run .\latex_generator.py
6
+
7
+ # display Fault Equation 1
8
+ st.title("Fault Equation 1")
9
+ st.caption("Duct static pressure too low with fan at full speed")
10
+ st.latex(
11
+ r"""
12
+ DSP < DPSP - eDSP \quad \text{and} \quad VFDSPD \geq 99\% - eVFDSPD
13
+ """
14
+ )
15
+
16
+ # Display legend
17
+ st.markdown("Legend:")
18
+ st.markdown("- DSP: Duct Static Pressure")
19
+ st.markdown("- DPSP: Duct Static Pressure Setpoint")
20
+ st.markdown("- VFDSPD: VFD Speed Reference in Percent")
21
+ st.markdown("- eVFDSPD: VFD Speed Reference Error Threshold")
22
+
23
+
24
+ # display Fault Equation 2
25
+ st.title("Fault Equation 2")
26
+ st.caption('Mix air temperature too low; should be between outside and return')
27
+ st.latex(r'''
28
+ MAT_{avg} + eMAT < \min[(RAT_{avg} - eRAT), - OAT_{avg} - eOAT)]
29
+ ''')
30
+
31
+
32
+ # display Fault Equation 3
33
+ st.title("Fault Equation 3")
34
+ st.caption('Mix air temperature too high; should be between outside and return')
35
+ st.latex(r'''
36
+ MAT_{avg} - eMAT > \min[(RAT_{avg} + eRAT), - OAT_{avg} + eOAT)]
37
+ ''')
38
+
39
+
40
+ # display Fault Equation 4
41
+ st.title("Fault Equation 4")
42
+ st.caption('Too many AHU operating state changes due to PID hunting and/or excessive cycling during low load conditions.')
43
+ st.latex(r'''
44
+ \Delta OS > \Delta OS_{max}
45
+ ''')
46
+
47
+
48
+ # display Fault Equation 5
49
+ st.title("Fault Equation 5")
50
+ st.caption('Supply air temperature too high')
51
+ st.latex(r'''
52
+ SAT_{avg} + eSAT \leq MAT_{avg} - eMAT + \Delta TSF
53
+ ''')
54
+
55
+
56
+ # display Fault Equation 6
57
+ st.title("Fault Equation 6")
58
+ st.caption('Temperature and outside air percentage deviation from setpoints')
59
+ st.latex(r'''
60
+ |\text{RAT}_{\text{avg}} - \text{OAT}_{\text{avg}}| \geq \Delta T_{\text{min}} \quad \text{and} \quad |\%OA - \%OA_{\text{min}}| > eF
61
+ ''')
62
+
63
+
64
+ # display Fault Equation 7
65
+ st.title("Fault Equation 7")
66
+ st.caption('Supply air temperature too low and heating coil status')
67
+ st.latex(r'''
68
+ \text{SAT}_{\text{avg}} < \text{SATSP} - eSAT \quad \text{and} \quad \text{HC} \geq 99\%
69
+ ''')
70
+
71
+ # display Fault Equation 8
72
+ st.title("Fault Equation 8")
73
+ st.caption('Deviation between supply air temperature and mixed air temperature')
74
+ st.latex(r'''
75
+ | \text{SAT}_{\text{avg}} - \Delta \text{TSF} - \text{MAT}_{\text{avg}} | > \sqrt{{eSAT}^2 + {eMAT}^2}
76
+ ''')
77
+
78
+
79
+ # display Fault Equation 9
80
+ st.title("Fault Equation 9")
81
+ st.caption('Outside air temperature deviation from setpoint')
82
+ st.latex(r'''
83
+ \text{OAT}_{\text{avg}} - eOAT > \text{SATSP} - \Delta \text{SF} + eSAT
84
+ ''')
85
+
86
+ # display Fault Equation 10
87
+ st.title("Fault Equation 10")
88
+ st.caption('Temperature difference between mixed air and outside air')
89
+ st.latex(r'''
90
+ | \text{MAT}_{\text{avg}} - \text{OAT}_{\text{avg}} | > \sqrt{eMAT^2 + eOAT^2}
91
+ ''')
92
+
93
+ # display Fault Equation 11
94
+ st.title("Fault Equation 11")
95
+ st.caption('Outside air temperature and supply air temperature deviation')
96
+ st.latex(r'''
97
+ \text{OAT}_{\text{avg}} + eOAT < \text{SATSP} - \Delta \text{TSF} - eSAT
98
+ ''')
99
+
100
+ # display Fault Equation 12
101
+ st.title("Fault Equation 12")
102
+ st.caption('Supply air temperature deviation from mixed air temperature')
103
+ st.latex(r'''
104
+ \text{SAT}_{\text{avg}} - eSAT - \Delta \text{TSF} \geq \text{MAT}_{\text{avg}} + eMAT
105
+ ''')
106
+
107
+ # display Fault Equation 13
108
+ st.title("Fault Equation 13")
109
+ st.caption('Supply air temperature too high')
110
+ st.latex(r'''
111
+ \text{SAT}_{\text{avg}} < \text{SATSP} + eSAT \quad \text{and} \quad \text{CC} \geq 99\%
112
+ ''')
113
+
114
+
115
+ st.title("find_closest_weather_dates Function")
116
+ st.caption('Finding closest weather dates based on given criteria')
117
+ st.latex(r'''
118
+ 1. A' = \{a \in A : a < d_{test}\} \\
119
+ 2. B' = \{b \in B : b < d_{test}\} \\
120
+ 3. C = \{a \in A' : a \notin B'\} \\
121
+ 4. \text{if } |C| < 10 \text{ then remove } \max(A') \text{ and repeat step 3} \\
122
+ 5. A = A \cap C, \text{calculate } \mu(A)
123
+ ''')
124
+ st.caption('''
125
+ In this notation:
126
+ - $A$ represents the "all_data" dataset.
127
+ - $B$ represents the "suitable_baseline_no" dataset.
128
+ - $d_{test}$ is the "test_case_date".
129
+ - $A'$ and $B'$ are subsets of $A$ and $B$ that only include dates prior to $d_{test}$.
130
+ - $C$ is a set of dates in $A'$ not found in $B'$.
131
+ - $|C|$ represents the count of elements in set $C$.
132
+ - $\max(A')$ is the latest date in $A'$.
133
+ - $\mu(A)$ is the mean of the remaining elements in $A$ after filtering by set $C$.
134
+ ''')
135
+
136
+
137
+ st.title("find_previous_10_days Function")
138
+ st.caption('Finding previous 10 weekdays based on given criteria')
139
+ st.latex(r'''
140
+ 1. A' = \{a \in A : a < d_{test}\} \\
141
+ 2. B' = \{b \in B : b < d_{test}\} \\
142
+ 3. C = \{a \in A' : a \notin B'\} \\
143
+ 4. \text{if } |C| < 10 \text{ then remove } \max(A') \text{ and repeat step 3} \\
144
+ 5. A = A \cap C
145
+ ''')
146
+ st.caption('''
147
+ In this notation:
148
+ - $A$ represents the "all_data" dataset.
149
+ - $B$ represents the "suitable_baseline_no" dataset.
150
+ - $d_{test}$ is the "test_case_date".
151
+ - $A'$ and $B'$ are subsets of $A$ and $B$ that only include dates prior to $d_{test}$.
152
+ - $C$ is a set of dates in $A'$ not found in $B'$.
153
+ - $|C|$ represents the count of elements in set $C$.
154
+ - $\max(A')$ is the latest date in $A'$.
155
+ ''')
156
+
157
+
158
+ st.title("calculate_power_averages Function")
159
+ st.caption('Calculating average power for each type and time step')
160
+ st.latex(r'''
161
+ 1. P_{type,i} = \{p : p \text{ is a power value at time step } t_i\} \quad \text{for each type and } i \in \{1,2,\dots,96\} \\
162
+ 2. A_{type,i} = \frac{1}{|P_{type,i}|}\sum_{p \in P_{type,i}} p \quad \text{for each type and } i \in \{1,2,\dots,96\}
163
+ ''')
164
+ st.caption('''
165
+ In this notation:
166
+ - $P_{type,i}$ represents the set of power values at time step $t_i$ for a specific power type (main, ahu, or solar).
167
+ - $p$ represents a power value in the set $P_{type,i}$.
168
+ - $|P_{type,i}|$ represents the count of elements in set $P_{type,i}$.
169
+ - $A_{type,i}$ represents the average power at time step $t_i$ for a specific power type.
170
+ ''')
171
+
172
+
173
+
174
+
175
+
@@ -0,0 +1,47 @@
1
+ import matplotlib.pyplot as plt
2
+ import pandas as pd
3
+ from io import BytesIO
4
+ import sys
5
+
6
+ class BaseReport:
7
+ def __init__(self, config):
8
+ self.config = config
9
+
10
+ def summarize_fault_times(self, df: pd.DataFrame, output_col: str) -> dict:
11
+ delta = df.index.to_series().diff().dt.total_seconds()
12
+ total_days = round(delta.sum() / 86400, 2)
13
+ total_hours = round(delta.sum() / 3600, 2)
14
+ hours_fault_mode = (delta * df[output_col]).sum() / 3600
15
+ percent_true = round(df[output_col].mean() * 100, 2)
16
+ percent_false = round((100 - percent_true), 2)
17
+
18
+ # Calculate motor runtime
19
+ motor_on = df[self.config['SUPPLY_VFD_SPEED_COL']].gt(.01).astype(int)
20
+ hours_motor_runtime = round((delta * motor_on).sum() / 3600, 2)
21
+
22
+ summary = {
23
+ 'total_days': total_days,
24
+ 'total_hours': total_hours,
25
+ 'hours_fault_mode': hours_fault_mode,
26
+ 'percent_true': percent_true,
27
+ 'percent_false': percent_false,
28
+ 'hours_motor_runtime': hours_motor_runtime
29
+ }
30
+ return summary
31
+
32
+ def create_hist_plot(self, df: pd.DataFrame, output_col: str):
33
+ df["hour_of_the_day"] = df.index.hour.where(df[output_col] == 1)
34
+ df = df.dropna(subset=["hour_of_the_day"])
35
+ print()
36
+ print("Time-of-day Histogram Data")
37
+ print(df["hour_of_the_day"])
38
+ print()
39
+ sys.stdout.flush()
40
+
41
+ fig, ax = plt.subplots(tight_layout=True, figsize=(25, 8))
42
+ ax.hist(df.hour_of_the_day.dropna(), bins=24)
43
+ ax.set_xlabel("Hour of the Day")
44
+ ax.set_ylabel("Frequency")
45
+ ax.set_title("Hour-Of-Day When Fault Flag is TRUE")
46
+ plt.show()
47
+ plt.close()
@@ -82,7 +82,9 @@ class FaultCodeSevenReport:
82
82
  plt.close()
83
83
 
84
84
  def display_report_in_ipython(self, df: pd.DataFrame, output_col: str = "fc7_flag"):
85
- print("Fault Condition 7: Supply air temperature too low in full heating mode")
85
+ print(
86
+ "Fault Condition 7: Supply air temperature too low its not making supply air temperature setpoint in full heating mode"
87
+ )
86
88
 
87
89
  self.create_plot(df, output_col)
88
90
 
@@ -1,7 +1,9 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_one import FaultConditionOne
3
+ from open_fdd.air_handling_unit.faults import FaultConditionOne
4
4
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
+ from open_fdd.air_handling_unit.faults.fault_condition import MissingColumnError
6
+
5
7
 
6
8
  # Constants
7
9
  TEST_VFD_ERR_THRESHOLD = 0.05
@@ -27,6 +29,21 @@ fault_condition_params = {
27
29
  fc1 = FaultConditionOne(fault_condition_params)
28
30
 
29
31
 
32
+ class TestMissingColumn:
33
+
34
+ def missing_col_df(self) -> pd.DataFrame:
35
+ data = {
36
+ TEST_DUCT_STATIC_COL: [0.99, 0.99, 0.99, 0.99, 0.99, 0.99],
37
+ # Missing TEST_SUPPLY_VFD_SPEED_COL
38
+ TEST_DUCT_STATIC_SETPOINT_COL: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
39
+ }
40
+ return pd.DataFrame(data)
41
+
42
+ def test_missing_column(self):
43
+ with pytest.raises(MissingColumnError):
44
+ fc1.apply(self.missing_col_df())
45
+
46
+
30
47
  class TestNoFault:
31
48
 
32
49
  def no_fault_df(self) -> pd.DataFrame:
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_ten import FaultConditionTen
3
+ from open_fdd.air_handling_unit.faults import FaultConditionTen
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_eleven import (
3
+ from open_fdd.air_handling_unit.faults import (
4
4
  FaultConditionEleven,
5
5
  )
6
6
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_twelve import (
3
+ from open_fdd.air_handling_unit.faults import (
4
4
  FaultConditionTwelve,
5
5
  )
6
6
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_thirteen import (
3
+ from open_fdd.air_handling_unit.faults import (
4
4
  FaultConditionThirteen,
5
5
  )
6
6
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_fourteen import (
3
+ from open_fdd.air_handling_unit.faults import (
4
4
  FaultConditionFourteen,
5
5
  )
6
6
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_fifteen import (
3
+ from open_fdd.air_handling_unit.faults import (
4
4
  FaultConditionFifteen,
5
5
  )
6
6
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_two import FaultConditionTwo
3
+ from open_fdd.air_handling_unit.faults import FaultConditionTwo
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_three import FaultConditionThree
3
+ from open_fdd.air_handling_unit.faults import FaultConditionThree
4
4
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
5
 
6
6
  """
@@ -1,12 +1,12 @@
1
1
  import pandas as pd
2
2
  import pytest
3
- from open_fdd.air_handling_unit.faults.fault_condition_four import FaultConditionFour
3
+ from open_fdd.air_handling_unit.faults import FaultConditionFour
4
4
  from open_fdd.air_handling_unit.faults.helper_utils import HelperUtils
5
5
  from datetime import datetime, timezone
6
6
 
7
7
  """
8
8
  To see print statements in pytest run with:
9
- $ py -3.12 -m pytest open_fdd/tests/ahu/test_ahu_fc4.py -rP -s
9
+ $ py -3.12 -m pytest tests/ahu/test_ahu_fc4.py -rP -s
10
10
 
11
11
  Too much hunting in control system
12
12
  OS state changes greater than 7 in an hour
@@ -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.1
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
@@ -20,6 +20,7 @@ Requires-Dist: pytest
20
20
  ![CI](https://github.com/bbartling/open-fdd/actions/workflows/ci.yml/badge.svg?branch=master)
21
21
  ![MIT License](https://img.shields.io/badge/license-MIT-green.svg)
22
22
  ![Black](https://img.shields.io/badge/code%20style-black-000000.svg)
23
+ ![PyPI](https://img.shields.io/pypi/v/open-fdd?color=blue&label=pypi%20version)
23
24
 
24
25
 
25
26
  ![Alt text](https://raw.githubusercontent.com/bbartling/open-fdd/master/open_fdd/air_handling_unit/images/plot_for_repo.png)
@@ -29,17 +30,45 @@ This is a Python-based Fault Detection and Diagnostics (FDD) tool for running fa
29
30
 
30
31
 
31
32
  ## Getting Setup
32
- * Some features may be broken or not work as expected while the project is undergoing a significant makeover to become installable from PyPI. The aim is to streamline the reporting processes and make them much easier to use. I appreciate your patience during this transition.
33
-
34
- This project is on PyPI now so get setup with this command using the Python package manager called pip.
33
+ This project is now available on PyPI, making it easy to set up with the Python package manager, pip. You can install the package using the following command:
35
34
 
36
35
  ```bash
37
36
  pip install open-fdd
38
37
  ```
39
38
 
40
- See the examples directory for Jupyter notebook tutorials as well as the `README` inside the `air_handling_unit` directory for parameter definitions. Coming soon more faults and reports for `vav_system` and `central_plants` and examples getting data from SQL databases.
39
+ For running Jupyter notebooks, I recommend using Visual Studio Code with the Jupyter notebook extension installed, which offers a seamless experience directly within the editor. Be sure to explore the `examples` directory for Jupyter notebook tutorials. If you have your own FDD experiences to share, feel free to contribute by creating a notebook (`.ipynb`). You’re welcome to reach out to me directly, and I can push your example to GitHub on your behalf, which might be a simpler process than submitting a pull request (PR), especially if you're just sharing an example rather than developing `open-fdd`.
40
+
41
+ ## Project goals
42
+ These are some basic project goals to make this into an interactive FDD application.
43
+ - [x] finish `air_handling_unit` faults and reports based on ASHRAE and NIST
44
+ - [x] publish to PyPI as Python library
45
+ - [ ] make a few IPython notebook tutorials AHU FDD examples with `BRICK` meta data integration.
46
+ - [ ] make a guide for fault `parameters` like error thresholds, etc.
47
+ - [ ] make `central_plant` faults, IPython reports, and examples.
48
+ - [ ] make `energy_efficiency` faults, IPython reports, and examples to `optimize` in reducing energy consumption.
49
+ - [ ] make `metering`, faults, IPython reports, and examples to possibly model utility metering data.
50
+ - [ ] create SQL example to read data from time series db and write back to SQL to then read faults in Grafana.
51
+ - [ ] other? Certainly! As ChatGPT would eagerly say!
52
+
41
53
 
42
54
  ## Contribute
55
+
56
+ If you have suggestions for improving developer best practices or solutions, please feel free to reach out to me directly using my contact information or Git issue/discussion. I primarily work on Windows with multiple versions of Python installed, with Python 3.12.x as my default version. You can download the latest version of Python here:
57
+ * https://www.python.org/downloads/
58
+
59
+ 1. **Adding New Faults and Reports:**
60
+ Developers will need to `> py -3.12 -m pip install black pytest`. When adding new faults and reports, I usually run `> py -3.12 -m pip install .` in the cloned project directory. I continuously uninstall with `> py -3.12 -m pip uninstall open-fdd` and reinstall locally until I'm satisfied with the changes.
61
+
62
+ 2. **Testing Fault Logic:**
63
+ All fault logic is rigorously tested using `pytest`. You can run the tests with `> py -m pytest`.
64
+
65
+ 3. **Formatting with Black:**
66
+ To ensure code consistency, I use Black for formatting. Run `> py -m black .` to format the code and check it with `> py -m black --check .`
67
+
68
+ 4. **Pushing to GitHub:**
69
+ After making changes, and the steps above are successful push them to GitHub in a pull request. The GitHub Actions workflow will automatically run `pytest` and `black` to ensure the build is successful.
70
+
71
+
43
72
  This project is a community-driven initiative, focusing on the development of free and open-source tools. I believe that Fault Detection and Diagnostics (FDD) should be free and accessible to anyone who wants to try it out, embodying the spirit of open-source philosophy. Additionally, this project aims to serve as an educational resource, empowering individuals to learn about and implement FDD in their own systems. As someone wisely said, `"Knowledge should be shared, not hoarded,"` and this project strives to put that wisdom into practice.
44
73
 
45
74
  Got any ideas or questions? Submit a Git issue or start a Discussion...
@@ -0,0 +1,82 @@
1
+ open_fdd/__init__.py,sha256=iGj8QTOZJUTE4nNnBiCHXEXsOdV6YvKcGiLrnOusJCg,1411
2
+ open_fdd/air_handling_unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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
+ open_fdd/air_handling_unit/faults/shared_utils.py,sha256=Kp8ZUBhtrh-jU2Q_bbXTpnbVVUAyacp41tDMknY50i4,2252
22
+ open_fdd/air_handling_unit/images/ahu1_fc1_2024-06_1.jpg,sha256=3dHZyEm_nS4p7-acZprIpZyuU65_IJKk2sixJBf7Ans,444019
23
+ open_fdd/air_handling_unit/images/ahu1_fc1_2024-06_2.jpg,sha256=kjWCDhRkpxiigl9VJnnMBlETA_FWHZtAn9oqKuQl1M4,392583
24
+ open_fdd/air_handling_unit/images/example1.jpg,sha256=3dHZyEm_nS4p7-acZprIpZyuU65_IJKk2sixJBf7Ans,444019
25
+ open_fdd/air_handling_unit/images/example2.jpg,sha256=kjWCDhRkpxiigl9VJnnMBlETA_FWHZtAn9oqKuQl1M4,392583
26
+ open_fdd/air_handling_unit/images/fc10_definition.png,sha256=wE4tg3BjUDnEfeM1XOYTHAcnl4yUJnkoUrVOipr4Ivo,16603
27
+ open_fdd/air_handling_unit/images/fc11_definition.png,sha256=Vp_mZxgPGsB0KsEeazwaI3NcgwvLDBBWzutUh8c2Kcg,14534
28
+ open_fdd/air_handling_unit/images/fc12_definition.png,sha256=CZUukCTaQ2DlDRMk-EdZyqXr_Wne-EKUYuYn_ly82Hc,14254
29
+ open_fdd/air_handling_unit/images/fc13_definition.png,sha256=qcYnTHtnUwfAaLYFVebcbYtjVSgxSQKqZTi_VwHymgo,16733
30
+ open_fdd/air_handling_unit/images/fc1_definition.png,sha256=htGaVcaem2CI47bSq_Y6mBdmwbpUHeaQW2oTm4EREbc,8164
31
+ open_fdd/air_handling_unit/images/fc1_report_screenshot_all.png,sha256=U3IhLL2nJ3k-UF-smPd1FPAGnznBxsrbBkj8B3ZtwyM,184473
32
+ open_fdd/air_handling_unit/images/fc2_definition.png,sha256=qnFzSrXsj_mwhTq4Zi-NT7kwCTz91HKPGHsh77ov5Fs,9124
33
+ open_fdd/air_handling_unit/images/fc3_definition.png,sha256=AE0cecNhMiHHsMBQAPWF-cMnLAWK1A27SASeoNoe76w,9118
34
+ open_fdd/air_handling_unit/images/fc4_definition.png,sha256=66NztKUPH0R3nhNgVnxzN3UgMLhE-6mUKxhnwtkRN90,4245
35
+ open_fdd/air_handling_unit/images/fc5_definition.png,sha256=xQMxDnStccm8f0KIFL-BpG3yQv4fnl4M9t_9VMVOpWg,14634
36
+ open_fdd/air_handling_unit/images/fc6_definition.png,sha256=MPV8QcnSnRRNq465dee5Q0Uw5e2ZV_WoIFBVAvYLCVc,20777
37
+ open_fdd/air_handling_unit/images/fc7_definition.png,sha256=O6bsh0kG4sHeWCDSZuBHjDZ3xDFesSY42yifqhWXMMo,15849
38
+ open_fdd/air_handling_unit/images/fc8_definition.png,sha256=Cce-_mmZA0QbsbWETwOCr45CJiJLR1vHPQNmB9dQZ6g,19702
39
+ open_fdd/air_handling_unit/images/fc9_definition.png,sha256=9r7QPViCQ0LItI4NdJsD7VfZjdA4RUZuh08BzxVUnfU,14913
40
+ open_fdd/air_handling_unit/images/latex_generator.py,sha256=9kotpUZjQrECXiB8ewcvYBLMEVvy9-r1-HnbpPb-Xr0,5976
41
+ open_fdd/air_handling_unit/images/params.docx,sha256=_mh1G-avi-lsssaW_qH33vGVaYwS_XL_IOQweYpQvAo,157634
42
+ open_fdd/air_handling_unit/images/params.pdf,sha256=2rmxh2yxuB7x3Q2Jyq0MnFoTJAQqxwIoxGvzzJirWkU,175678
43
+ open_fdd/air_handling_unit/images/plot_for_repo.png,sha256=u4OIzZUyGk6G4o1AusEERUU6aen4vVX-CGPl14P3qkA,651969
44
+ open_fdd/air_handling_unit/reports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ open_fdd/air_handling_unit/reports/base_report.py,sha256=oZX6_qXUjuPEHKpF89DhgpPbAkhHeoo3jpDL30u4njs,1778
46
+ open_fdd/air_handling_unit/reports/report_fc1.py,sha256=ZlfTP4Pzv0l0hBHRWmTFMXKWPnuMNW38mHPPD8QW460,4565
47
+ open_fdd/air_handling_unit/reports/report_fc10.py,sha256=Dgh0L4A-D-VYqTfVcMwhxdw67R-31c24ydtrpJ-gLyU,5179
48
+ open_fdd/air_handling_unit/reports/report_fc11.py,sha256=fLb004y59i_2LegfGlpgEpEzQadqsCWrJPNLZ6obgqg,5197
49
+ open_fdd/air_handling_unit/reports/report_fc12.py,sha256=MVjoHul32K0hJCP4WL9bLd6g55HMcKLdxzvPN94AlDA,5090
50
+ open_fdd/air_handling_unit/reports/report_fc13.py,sha256=YjU6PBJl2ae_2WD2n-GoRGmwj6BtjQFClcCibHgcJmA,5026
51
+ open_fdd/air_handling_unit/reports/report_fc14.py,sha256=j_o3X6BFYhW7IBwGZATQ7afgiXlKmUMGbGY7UuSwfD4,4832
52
+ open_fdd/air_handling_unit/reports/report_fc15.py,sha256=Rg4NiheUsCmSxv42s7OFKRD7dweGZxtN83I5iDDzNoo,4831
53
+ open_fdd/air_handling_unit/reports/report_fc2.py,sha256=ao_2ZeY10BLJ0GEDMMGAuD-8FbHBCGnIvQg9rF6om_U,4840
54
+ open_fdd/air_handling_unit/reports/report_fc3.py,sha256=xyGjwYxJU2kveVJHLzAM3T_MLFlUZNQGBUyJ-YTjAsk,4843
55
+ open_fdd/air_handling_unit/reports/report_fc4.py,sha256=0PpPwPnzeUZZybad04IslroBoCcIseDGq5it389wx9s,6052
56
+ open_fdd/air_handling_unit/reports/report_fc5.py,sha256=welqsYh9TzIfpbdl3i9pvpaDWTsz_rnFbem6lXvz5K0,5699
57
+ open_fdd/air_handling_unit/reports/report_fc6.py,sha256=R-2OONOZS1ZFLkUBv0syrZ7XjrR0TSwI1Wu70opTVeM,6042
58
+ open_fdd/air_handling_unit/reports/report_fc7.py,sha256=5j9IAEgmjMqSbpQcStCJZB46TmRPtVSDKnGUutSeVxs,5327
59
+ open_fdd/air_handling_unit/reports/report_fc8.py,sha256=3jZPq2piethtqly1faSc8hk0aFCbQe2Y0RMNv3DFzpk,5057
60
+ open_fdd/air_handling_unit/reports/report_fc9.py,sha256=hJbYMYnwptVSEI2NVdnV3Ads-h_9Hl4oFD1HDDLZWHQ,4909
61
+ open_fdd/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
+ open_fdd/tests/ahu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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,,
@@ -1,59 +0,0 @@
1
- open_fdd/__init__.py,sha256=iGj8QTOZJUTE4nNnBiCHXEXsOdV6YvKcGiLrnOusJCg,1411
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=UHMnwTaMJkxsUP2h9NXyVeDvIR2c7d96xkiigwf0CmU,1674
5
- open_fdd/air_handling_unit/faults/fault_condition_eight.py,sha256=G1hhP6YOZSOK5su_LmZsumbaM4VGHwFXrkGbT-Tgx2Q,2326
6
- open_fdd/air_handling_unit/faults/fault_condition_eleven.py,sha256=gs_sA4CxE8wM8gn7qxd7ToCtOcvJDSH5PAqdkRghw6c,2404
7
- open_fdd/air_handling_unit/faults/fault_condition_fifteen.py,sha256=y_S-NbaQQTyqnQkUYF7MNS2NON2jgVnnzv0Qo7dHGLE,3287
8
- open_fdd/air_handling_unit/faults/fault_condition_five.py,sha256=_G2WqzElrftj09P3w_qcSnAPQprtjfB1axaLusRK6g8,2605
9
- open_fdd/air_handling_unit/faults/fault_condition_four.py,sha256=sHwCA0_aP49_ILL8tzjrHJdumIRalxplAmgh16nah9Q,3519
10
- open_fdd/air_handling_unit/faults/fault_condition_fourteen.py,sha256=NHYp43RROOTErhoDfxW01Aw_txfZOBd9PsgZzcdlwQw,2954
11
- open_fdd/air_handling_unit/faults/fault_condition_nine.py,sha256=QQwuNCAIJM8_1KYIaCsU3sZSxozb6cWPQEsij50drJE,2475
12
- open_fdd/air_handling_unit/faults/fault_condition_one.py,sha256=Ae5CXagUwlQCOUebLb4dfoY-4mqGv_xGOCpRAXRTnrY,2113
13
- open_fdd/air_handling_unit/faults/fault_condition_seven.py,sha256=s2yLhnn5Es_ECqG3BIlZgx1Vgt9ro0Pq9sqjKl7yFwU,2004
14
- open_fdd/air_handling_unit/faults/fault_condition_six.py,sha256=HuQrdZNjXXPDU_8EtWVBPF4JcRGWG6nrqAE2RKRxTiY,4757
15
- open_fdd/air_handling_unit/faults/fault_condition_ten.py,sha256=SOPUbMwGHYHcNxTc-0OPlL-rRAuINd9fB01IVF8JLjQ,2243
16
- open_fdd/air_handling_unit/faults/fault_condition_thirteen.py,sha256=5OnzbTILlqX_Rs7Fcla-FfxSfwh7z8H2cFE8BW8LB-U,2419
17
- open_fdd/air_handling_unit/faults/fault_condition_three.py,sha256=YWG1QJqimzxogY7K97RIeKWwctPDEDPnuYaEk7BCmcI,2094
18
- open_fdd/air_handling_unit/faults/fault_condition_twelve.py,sha256=EJOYgLPEKRF3UOHz5veZs6Do2_1YTNr0d3nL2k1k_qE,2747
19
- open_fdd/air_handling_unit/faults/fault_condition_two.py,sha256=Tth5OnXgeEC_wgct9F3tIBmgZmxDxOIuJoOLblaPcVA,2140
20
- open_fdd/air_handling_unit/faults/helper_utils.py,sha256=huHmhxtoE2Js8GOYHZ6yRupTbj4y13B2V7HLjtqe7CI,7253
21
- open_fdd/air_handling_unit/faults/shared_utils.py,sha256=Kp8ZUBhtrh-jU2Q_bbXTpnbVVUAyacp41tDMknY50i4,2252
22
- open_fdd/air_handling_unit/reports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- open_fdd/air_handling_unit/reports/report_fc1.py,sha256=ZlfTP4Pzv0l0hBHRWmTFMXKWPnuMNW38mHPPD8QW460,4565
24
- open_fdd/air_handling_unit/reports/report_fc10.py,sha256=Dgh0L4A-D-VYqTfVcMwhxdw67R-31c24ydtrpJ-gLyU,5179
25
- open_fdd/air_handling_unit/reports/report_fc11.py,sha256=fLb004y59i_2LegfGlpgEpEzQadqsCWrJPNLZ6obgqg,5197
26
- open_fdd/air_handling_unit/reports/report_fc12.py,sha256=MVjoHul32K0hJCP4WL9bLd6g55HMcKLdxzvPN94AlDA,5090
27
- open_fdd/air_handling_unit/reports/report_fc13.py,sha256=YjU6PBJl2ae_2WD2n-GoRGmwj6BtjQFClcCibHgcJmA,5026
28
- open_fdd/air_handling_unit/reports/report_fc14.py,sha256=j_o3X6BFYhW7IBwGZATQ7afgiXlKmUMGbGY7UuSwfD4,4832
29
- open_fdd/air_handling_unit/reports/report_fc15.py,sha256=Rg4NiheUsCmSxv42s7OFKRD7dweGZxtN83I5iDDzNoo,4831
30
- open_fdd/air_handling_unit/reports/report_fc2.py,sha256=ao_2ZeY10BLJ0GEDMMGAuD-8FbHBCGnIvQg9rF6om_U,4840
31
- open_fdd/air_handling_unit/reports/report_fc3.py,sha256=xyGjwYxJU2kveVJHLzAM3T_MLFlUZNQGBUyJ-YTjAsk,4843
32
- open_fdd/air_handling_unit/reports/report_fc4.py,sha256=0PpPwPnzeUZZybad04IslroBoCcIseDGq5it389wx9s,6052
33
- open_fdd/air_handling_unit/reports/report_fc5.py,sha256=welqsYh9TzIfpbdl3i9pvpaDWTsz_rnFbem6lXvz5K0,5699
34
- open_fdd/air_handling_unit/reports/report_fc6.py,sha256=R-2OONOZS1ZFLkUBv0syrZ7XjrR0TSwI1Wu70opTVeM,6042
35
- open_fdd/air_handling_unit/reports/report_fc7.py,sha256=_hlAvJvbDtLOOPlcCcPaCH8Hu2U5zL1l__xrbL80C20,5256
36
- open_fdd/air_handling_unit/reports/report_fc8.py,sha256=3jZPq2piethtqly1faSc8hk0aFCbQe2Y0RMNv3DFzpk,5057
37
- open_fdd/air_handling_unit/reports/report_fc9.py,sha256=hJbYMYnwptVSEI2NVdnV3Ads-h_9Hl4oFD1HDDLZWHQ,4909
38
- open_fdd/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- open_fdd/tests/ahu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- open_fdd/tests/ahu/test_ahu_fc1.py,sha256=IJTLAF87xHSyCgU0Ow-gzP8rP8z7TQb46nQHdirW-vs,4899
41
- open_fdd/tests/ahu/test_ahu_fc10.py,sha256=eJ3msPdgkXwYRJOb6mGDaIZBDJfXhyVFAyr27DVwagY,4597
42
- open_fdd/tests/ahu/test_ahu_fc11.py,sha256=uMLAQ2o-m8czAh7q6xzKlrmGd9m6SGjIfvd4hswOD9E,4746
43
- open_fdd/tests/ahu/test_ahu_fc12.py,sha256=KedYWmVSwb8b-0TZYdC16ysELGHOIsI_xd2va-SqBgg,5871
44
- open_fdd/tests/ahu/test_ahu_fc13.py,sha256=qz_dol4W6M3cIvunkHyFDfqEkB8TA9r9UnoycS2x37I,5750
45
- open_fdd/tests/ahu/test_ahu_fc14.py,sha256=SlnQF37K73tgfUtp1bQl0nH46YV5aByzonUNXJ50CGE,8077
46
- open_fdd/tests/ahu/test_ahu_fc15.py,sha256=jQGgZPbh83q3_oJJVYhobC7KdD-2InbA1zdbsQBlhuc,7685
47
- open_fdd/tests/ahu/test_ahu_fc2.py,sha256=3njwLWjzIT6B6RCMgEGqdPvP3kykYwzQTZ9IOgx_BSE,4756
48
- open_fdd/tests/ahu/test_ahu_fc3.py,sha256=iFHLdTzyMvDw7lFwl5J4I7omXXwrDh7kIyoXTI1YxmM,4680
49
- open_fdd/tests/ahu/test_ahu_fc4.py,sha256=gWquIQsBiF65RGUBLe741oj1Yqs-JDM4K0kmkPP7mOE,6334
50
- open_fdd/tests/ahu/test_ahu_fc5.py,sha256=mEbhX5IlDkMwXPv3jPMlE_v3QJH47qsZIL99_KzV7_U,6559
51
- open_fdd/tests/ahu/test_ahu_fc6.py,sha256=M7eHdQexcSDN0CGjnR3bcwk_wbjDxqhJwqg_VjsoGB0,10369
52
- open_fdd/tests/ahu/test_ahu_fc7.py,sha256=ughSBHwrergnFsI5ayVaBoWRUMEetFcYQ59CNBNIS1k,2491
53
- open_fdd/tests/ahu/test_ahu_fc8.py,sha256=KKnDyclhzxppC4bk2Kj9cguqg53sZ7I7CSqqWexpWdE,4685
54
- open_fdd/tests/ahu/test_ahu_fc9.py,sha256=YbO1jZSZD6eAXjQkidjp3TEVCcaL7ADhUsTyKy_jmL0,4817
55
- open_fdd-0.1.1.dist-info/LICENSE,sha256=eghao_GGx_0gB2Sll3x2vV29knONEzUQKrkaXpX1F7w,1087
56
- open_fdd-0.1.1.dist-info/METADATA,sha256=z1NUVLiquR8qcZ3hfvie1QDVZGxHrliUOMfmMFr3BjE,4070
57
- open_fdd-0.1.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
58
- open_fdd-0.1.1.dist-info/top_level.txt,sha256=Q7sB6UB2d8Ch1v_xIsTiNegmgcCXPkwkrxK3ug6VEOs,9
59
- open_fdd-0.1.1.dist-info/RECORD,,