I’ve asked questions regarding this project before. I’m almost done, but I need one more thing. It’s about water spillage in pipes. It reads from two temperature sensors, and calculate a temperature difference as well. It should notify by email after a certain number of measurements, if the difference is normal or you need to take action. So far I’ve managed to send an email after one measurement. But a tempdifference is not unusual in pipes, so I want to notify after a certain number of measurements. This is what I have so far:
def aflaes_raa_data(): f1 = open(fil1, "r") f2 = open(fil2, "r") linjer1 = f1.readlines() f1.close() linjer2 = f2.readlines() f2.close() return linjer1, linjer2 def udregn_temp(raw): equals_pos = raw[1].find("t=") if equals_pos != -1: temp_string = raw[1][equals_pos + 2:] temp_c = float(temp_string) / 1000.0 return temp_c def aflaes_temp(): linjer1, linjer2 = aflaes_raa_data() while linjer1[0].strip()[-3:] != "YES": time.sleep(0.2) linjer1, linjer2 = aflaes_raa_data() temp1 = udregn_temp(linjer1) temp2 = udregn_temp(linjer2) return "Sensor 1: %d" % temp1 + " grader", "Sensor 2: %d" % temp2 + " grader" def temp_diff(): linjer1, linjer2 = aflaes_raa_data() temp1, temp2 = udregn_temp(linjer1), udregn_temp(linjer2) print("Temperaturforskellen er: ") return abs(temp1-temp2) def send_mail(afsender, password, modtager, emne, email_tekst): if 0 < temp_diff() < 4: send_mail("something@gmail.com", "password", "something@gmail.com", "Besked fra din vandmåler", "Afløbsrør: Temperaturforskellen er lige nu %d, og er højere end grænsen . Handling påkrævet!" % ( temp_diff())) else: send_mail(EMAIL_FROM, PASSWORD, EMAIL_TO, "Besked fra din vandmåler", "Afløbsrør: " "Temperaturforskellen " "er lige nu " "%d, og er på tæt på 0" % (temp_diff())) while True: print(aflaes_temp()) print(temp_diff()) time.sleep(2)
I’ve tried with a for loop
for i in range(10): if 0 < temp_diff() < 4: send_mail("something@gmail.com", "password", "something@gmail.com", "Besked fra din vandmåler", "Afløbsrør: Temperaturforskellen er lige nu %d, og er højere end grænsen . Handling påkrævet!" % ( temp_diff())) else: send_mail("something@gmail.com", "password", "something@gmail.com", "Besked fra din vandmåler", "Afløbsrør: " "Temperaturforskellen " "er lige nu " "%d, og er på tæt på 0" % (temp_diff()))
And a nested loop
for i in range(10): aflaes_temp() for n in range(1): if 0 < temp_diff() < 4: send_mail("something@gmail.com", "password", "something@gmail.com", "Besked fra din vandmåler", "Afløbsrør: Temperaturforskellen er lige nu %d, og er højere end grænsen . Handling påkrævet!" % ( temp_diff())) else: send_mail("something@gmail.com", "password", "something@gmail.com", "Besked fra din vandmåler", "Afløbsrør: " "Temperaturforskellen " "er lige nu " "%d, og er på tæt på 0" % (temp_diff()))
But then I just get the output of temp_diff
a couple of times and then an email. I’ve looked around on the internet, but I can only find examples of running functions n times.
Advertisement
Answer
If I have understood your question correctly, instead of sending email instantly you want to observe 3-4 measurements. And based on that measurement, you want to take a decision.
There are many ways that can be achieved. I am providing a solution where you will monitor theSampleCount
number of measurements and take the median
of the sample. If the median value is within range then you can send email.
import statistics while True: theSampleCount = 10 # you will monitor 10 samples samples = [] while(theSampleCount>0): theSampleCount -= 1 temp_diff_var = temp_diff() samples.append(temp_diff_var) print(aflaes_temp()) print(temp_diff_var) time.sleep(2) # delay after which you want to measure # now you have 4 samples, you will take the median median_value = statistics.median(samples) # now apply your logic here on median_value. # based on that you can determine whether to send an email or not if 0 < median_value < 4: send_mail("something@gmail.com", "password", "something@gmail.com", "Besked fra din vandmåler", "Afløbsrør: Temperaturforskellen er lige nu %d, og er højere end grænsen . Handling påkrævet!" % ( median_value)) else: send_mail(EMAIL_FROM, PASSWORD, EMAIL_TO, "Besked fra din vandmåler", "Afløbsrør: " "Temperaturforskellen " "er lige nu " "%d, og er på tæt på 0" % (median_value))
Here is the full code
def aflaes_raa_data(): f1 = open(fil1, "r") f2 = open(fil2, "r") linjer1 = f1.readlines() f1.close() linjer2 = f2.readlines() f2.close() return linjer1, linjer2 def udregn_temp(raw): equals_pos = raw[1].find("t=") if equals_pos != -1: temp_string = raw[1][equals_pos + 2:] temp_c = float(temp_string) / 1000.0 return temp_c def aflaes_temp(): linjer1, linjer2 = aflaes_raa_data() while linjer1[0].strip()[-3:] != "YES": time.sleep(0.2) linjer1, linjer2 = aflaes_raa_data() temp1 = udregn_temp(linjer1) temp2 = udregn_temp(linjer2) return "Sensor 1: %d" % temp1 + " grader", "Sensor 2: %d" % temp2 + " grader" def temp_diff(): linjer1, linjer2 = aflaes_raa_data() temp1, temp2 = udregn_temp(linjer1), udregn_temp(linjer2) #print("Temperaturforskellen er: ") return abs(temp1-temp2) import statistics while True: theSampleCount = 10 # you will monitor 10 samples samples = [] while(theSampleCount>0): theSampleCount -= 1 temp_diff_var = temp_diff() samples.append(temp_diff_var) print(aflaes_temp()) print(f"Temperaturforskellen er: {temp_diff_var}") time.sleep(2) # delay after which you want to measure # now you have 4 samples, you will take the median median_value = statistics.median(samples) # now apply your logic here on median_value. # based on that you can determine whether to send an email or not if 0 < median_value < 4: send_mail("something@gmail.com", "password", "something@gmail.com", "Besked fra din vandmåler", "Afløbsrør: Temperaturforskellen er lige nu %d, og er højere end grænsen . Handling påkrævet!" % ( median_value)) else: send_mail(EMAIL_FROM, PASSWORD, EMAIL_TO, "Besked fra din vandmåler", "Afløbsrør: " "Temperaturforskellen " "er lige nu " "%d, og er på tæt på 0" % (median_value))