Skip to content
Advertisement

Doing something after running a function n times

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))
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement