/
error_status.py
228 lines (187 loc) · 6.11 KB
/
error_status.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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
import time
import math
from sensors import *
#Import the firmware code for the Adafruit MAX31855 Amplifier for the Thermocouple
import Adafruit_MAX31855.MAX31855 as MAX31855
max_sensor = MAX31855.MAX31855(21, 20, 16)
#import smbus for use with the DHT20 sensor and setting up the bus with the address
import smbus
import numpy as np
bus = smbus.SMBus(1)
#SHT20 address, 0x40(64)
#import MCP3008 (ADC) Library
import Adafruit_MCP3008
mcp = Adafruit_MCP3008.MCP3008(clk=22, cs=25, miso=23, mosi=24)
#importing the DHT11 sensor library
import Adafruit_DHT
# a function that returns a string with the system status and stores that in the Store/status.csv file
def statusUpdate():
try:
while True:
statusString = 0
sensorString = 0
#check for tank leaks
tankLeak = checkTankLeak()
if tankLeak["status"] == 1:
statusString += 1
#check for compressor overheat
overHeat = compressorOverHeat()
if overHeat["status"] == 1:
statusString += 10
#check for compressor current overload
overLoad = compressorCurrentOverload()
if overLoad["status"] == 1:
statusString += 100
#check for dryer failure
dryerFailureState = dryerFailure()
if dryerFailureState["status"] == 1:
statusString += 1000
#check for radiator failure
radiatorFailureState = radiatorFailure()
if radiatorFailureState["status"] == 1:
statusString += 10000
#check if AM2302 sensor is online
if am2302Offline() == 1:
sensorString += 1
#check if SHT20 sensor is online
if sht20Offline() == 1:
sensorString += 10
#check if Thermocouple is online
if thermocoupleOffline() == 1:
sensorString += 100
#check if current sensor is online
if currentSensorOffline() == 1:
sensorString += 1000
#check if pressure transducer is online
if pressureTransducerOffline() == 1:
sensorString += 10000
with open("Store/status.csv", "w") as csvFile:
fieldnames = ["status", "sensor"]
writer = csv.DictWriter(csvFile, dialect='excel', fieldnames=fieldnames)
writer.writerow({"status": statusString, "sensor": sensorString})
except KeyboardInterrupt:
print("we stopped")
return
def checkTankLeak():
array = readerCSV("pressure.csv",10)
deltaArray = []
for i in range(len(array)):
try:
deltaArray.append(abs(array[i+1]-array[i]))
except LookupError:
break
avgRate = round(sum(deltaArray)/len(deltaArray),3)
if avgRate > 0.5 and checkCompressorState() == 0:
return {"status":1, "value":avgRate}
elif avgRate < 0.5 and checkCompressorState() != 0:
return {"status":1, "value":avgRate}
else:
return {"status":0, "value":avgRate}
def compressorOverHeat():
array = readerCSV("thermocouple.csv", 10)
avgTemp = round(sum(array)/len(array),3)
if avgTemp > 40:
return {"status":1, "value":avgTemp}
else:
return {"status":0, "value":avgTemp}
def compressorCurrentOverload():
array = readerCSV("current.csv", 50)
avg = round(sum(array)/len(array),3)
if avg > 6.8:
return {"status":1, "value":avg}
else:
return {"status":0, "value":avg}
# formula for dewpoint
def dewPoint(T, RH):
d = 234.5
if T < 0:
b = 17.966
c = 247.15
else:
b = 17.368
c = 238.88
val = (b-(T/d))*(T/(c+T))
if val<= 0:
ardBuck = RH/100
else:
ardBuck = math.log((RH/100)*(math.exp(val)))
dp = (c*ardBuck)/(b-ardBuck)
return dp
def dryerFailure():
#Read last 1000 values from CSV file
tankRH = readerCSV("sht20Humidity.csv", 1000)
tankTemp = readerCSV("sht20Temperature.csv", 1000)
avgTankRH = sum(tankRH)/len(tankRH)
if avgTankRH > 40:
data = 1
else:
data = 0
dpArray = []
for i in range(len(tankTemp)):
dpArray.append(dewPoint(tankTemp[i], tankRH[i]))
dp = round(sum(dpArray)/len(dpArray),3)
return {"status":data, "value":dp}
def radiatorFailure():
ambientTemp = readerCSV("am2302Temperature.csv",25)
tankTemp = readerCSV("sht20Temperature.csv", 25)
avgAmbientTemp = sum(ambientTemp)/len(ambientTemp)
avgTankTemp = round(sum(tankTemp)/len(tankTemp),3)
if avgTankTemp > avgAmbientTemp:
data = 1
else:
data = 0
return {"status":data, "value":avgTankTemp}
def am2302Offline():
DHTsensor = Adafruit_DHT.DHT22
am2302Humidity,am2302Temperature = Adafruit_DHT.read_retry(DHTsensor,18)
try:
if am2302Humidity is None or am2302Temperature is None:
data = 1
else:
data = 0
except:
data = 1
finally:
return data
def sht20Offline():
try:
if GetShtTemp_c() is None or GetShtHumid() is None:
data = 1
else:
data = 0
except:
data = 1
finally:
return data
def thermocoupleOffline():
try:
if np.isnan(max_sensor.readTempC()) or max_sensor.readTempC() is None or not max_sensor.readTempC():
data = 1
else:
data = 0
except:
data = 1
finally:
return data
def currentSensorOffline():
try:
if mcp.read_adc(4) == 0:
data = 1
else:
data = 0
except:
data = 1
finally:
return data
def pressureTransducerOffline():
try:
if (mcp.read_adc(3)-73)*150.0/595.2 <= 0:
data = 1
else:
data = 0
except:
data = 1
finally:
return data
if __name__ == "__main__":
statusUpdate()