2013-09-08 3 views
0

Следующий скрипт для отправки уведомления по электронной почте, по какой-то причине он держит в обход флаг я поставил .. Сценарий держит поднимая флаг не удовлетворяет заданному условию

############################################################ 
##      MAIN        ## 
############################################################ 

Open_serial() 

while True: 

    line = ser.readline() 
    if line: 
     tmp = line.split() 
     if 'tank' in line: 
      tank_temp = tmp[1] 
      print 'Tank temperature:',tank_temp 
      if tank_temp >= 27: 
       flag = raise_flag() 
       if flag: 
        send_email('Tank temperature overheat',tank_temp) 
        flag = False 
      elif tank_temp <= 23: 
       flag = raise_flag() 
       if flag: 
        send_email('Tank temperature too low',tank_temp) 
        flag = False 

     if 'led' in line: 
      led_temp = tmp[1] 
      print 'Lights temperature:',led_temp 
      if led_temp >= 55: 
       flag = raise_flag() 
       if flag: 
        send_email('Lights temperature Overheat',led_temp) 
        flag = False 

     if 'White' in line: 

      white_pwm = tmp[1] 
      print 'White lights PWM value:',white_pwm 
      white_per = white_percent(white_pwm) 
      print 'White lights % value:',white_per 

     if 'Blue' in line: 
      blue_pwm = tmp[1] 
      print 'Blue lights PWM:',blue_pwm 
      blue_per = blue_percent(blue_pwm) 
      print 'Blue lights % value:',blue_per 

А вот функция флаг:

def raise_flag(): 
    global start 
    interval = 900 
    if start > interval: 
     start = 0 
     flag = True 
     return flag 
    else: 
     flag = False 
     start = start + 1 
     time.sleep(1) 
     return flag 

сценарий продолжает отправлять электронные письма, когда темп находится в диапазоне от 25 ° C, я не знаю, почему он продолжает отправлять электронные письма? Я поместил флаг так, что когда условие выполнено, оно не отправляет 1000 писем, только 1 каждые 15 минут ...

+0

Пример отправленного электронного письма: Произошла предупреждающая ошибка! Температура перегрева в цистернах: 25.31 ... Как вы можете видеть, темп был ОК, и он не должен был поднимать флаг для отправки электронной почты ... – celamb

ответ

1

readline(), переданный в line.split(), сгенерирует список строк. Таким образом, вы сравниваете строку (ваши данные) с целым числом (27). Это не очень хорошая идея. см. this explanation of how sting/int comparison works.

Чтобы исправить это, просто отбрасывать данные к поплавку, как это прежде, чем манипулировать:

tank_temp = float(tmp[1]) 

или сравнивать строки, как это:

if tank_temp >= '27': 

я выбрал бы бывший как ваши данные должны быть плавающими, поэтому имеет смысл преобразовать их в поплавки.

+0

Спасибо! Я изменил скрипт, сохранит его, но ваш ответ был ясен и имеет смысл ... Временная переменная является float, поэтому я пошел с вариантом 1, как вы заявили. Спасибо! – celamb

Смежные вопросы