Сценарий Python случайно падает по неизвестной причине - PullRequest
0 голосов
/ 30 декабря 2018

Я использую следующий скрипт в качестве основы для домашней системы мониторинга энергопотребления.Сценарий служит шлюзом между приемником на основе Arduino, подключенным к последовательному порту, и передает его через MQTT, а также через HTTP POST.Скрипт предназначен для запуска на неопределенный срок.Однако происходит сбой через произвольные промежутки времени, от часа до недели.Я не могу понять, почему.Любые указатели о том, как определить, почему и как регистрировать ошибку, будут оценены.Вот сценарий:

import time
import datetime
import requests
import paho.mqtt.publish as publish
#import csv
import logging

logging.basicConfig(level=logging.ERROR, filename='serial-read.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')

device = '/dev/ttyUSB0' #this will have to be changed to the serial port you are using
data = ""
pieces = ""

while True:
    while True:
        try:
            receiver = serial.Serial(device, 57600)
            receiver.flushInput()
        except serial.SerialException:
            print "cannot connect. will try again..."
            time.sleep(10)
        else:
            break
    try:
        data = receiver.readline()
        #print (data)
        #print repr(data)
        #with open ("data_log.csv","a") as f:
            #writer = csv.writer(f,delimiter=",")
            #writer.writerow([time.time(),data])
        pieces = data.split(" ")
        try:
            nodeid = int(pieces[0])
        except ValueError:
            pass
        try:
            data1 = int(pieces[1])
            data2 = int(pieces[2])
            data3 = int(pieces[3])
            data4 = int(pieces[4])
        except IndexError:
            pass
        #print nodeid
        if nodeid == 6:
            #print "Power:"
            Irms = data3 + data4
            print Irms
            localtime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            localtime = "'" + localtime + "'"
            #print localtime
            payload = {"timestamp" : localtime, "Irms" : Irms}
            r = requests.post('http://www.********.ca/*****.php', params=payload)
            #print(r.url)
            publish.single("myHome/energy/power", Irms, hostname="192.168.1.120")
        elif nodeid == 2:
            temp = float(data1)/10
            #print "temp:"
            #print temp
            hum = data3
            publish.single("myHome/garage/temperature", temp, hostname="192.168.1.120")
            publish.single("myHome/garage/humidity", hum, hostname="192.168.1.120")
            temphum = str(temp) + " " + str(hum)
            publish.single("myHome/garage/temphum", temphum, hostname="192.168.1.120")
            #print temphum
    except serial.serialutil.SerialException:
        print "no device connected. Please reconnect device..."
        receiver.close()
        time.sleep(5)

Спасибо!

Баобаб

1 Ответ

0 голосов
/ 30 декабря 2018

Ваш второй оператор try перехватывает следующее исключение:

except serial.serialutil.SerialException:

Но что, если блок кода генерирует другое исключение?Сценарий выйдет.Добавьте второй except, как в первом цикле try, чтобы перехватить любые другие исключения и распечатать их в своем журнале.

...