Почему python сценарий случайно d ie на Pi Zero? - PullRequest
0 голосов
/ 18 февраля 2020

Редактировать: Для ясности: проблема не в MQTT, а в том, что скрипт python на Pi Zero просто умирает. Через некоторое время сценарий перестает существовать, и

sudo ps -ax | grep python 

больше не отображает процесс, выполняющий сценарий.

Оригинальный вопрос:

Я написал простой скрипт, который считывает датчик DHT22 с пи-нуля и публикует температуру и влажность раз в минуту по отдельным темам MQTT. В какой-то момент скрипт просто останавливается, так как в нем не читается и не публикуется sh больше чтений, даже если он выполняется некоторое время True l oop. В моем брокере пи затем отображается как «Offline», так как это последнее сообщение воли. Файлы журналов не содержат полезной информации, в том смысле, что, пока записываются файлы журналов, сценарий работает так, как задумано, и вдруг возникает пустота.

def on_connect(client, userdata, flags, rc):
    message = "connected with rc: " + str(rc)
    print(message)
    log(message, mqtt_log_file)
    mqttPub.publish(topicStatusBedroom, "Online", 1, True)
def on_publish(client, obj, mid):
    message = "published with mid: " + str(mid)
    print(message)
    log(message, mqtt_log_file)
def on_disconnect(client, userdata, rc):
    print("client disconnected ok")
    log("client disconnected\n", mqtt_log_file)
    while True:
        try:
            mqttPub.connect(url_str, url_port)
            break # break the while loop, if reconnect works
        except:
            time.sleep(2) # otherwise sleep and retry
def log(message, file):
    file = open(file, "a")
    file.write(message)
    file.close()  
mqttPub = mqtt.Client()
mqttPub.on_connect = on_connect
mqttPub.on_publish = on_publish
mqttPub.on_disconnect = on_disconnect
mqttPub.username_pw_set(username, givenPassword)
mqttPub.will_set(topicStatusBedroom, 'Offline', 1, True)
mqttPub.connect(url_str, url_port)
mqttPub.loop_start() # loop_start handles reconnects automatically

if __name__ == "__main__":
    pin = 22
    sensor = Adafruit_DHT.DHT22
    log_file = 'dht_22_logging.txt'

    while True:
        humidity, temperature = readDHT(sensor, pin)
        if humidity is not None and temperature is not None:
            print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity))
            message = time.strftime("%Y-%m-%dT%H:%M:%S") + "," + str(round(temperature, 1)) + "," + str(int(humidity)) + "\n"
            mqttPub.publish(topicStatusTemp, str(round(temperature, 1)), 1, True)
            mqttPub.publish(topicStatusHumidity, str(round(humidity, 0)), 1, True)
            log(message, log_file)    
        else:
            message = 'Failed to get reading. Try again!'
            print(message)
            log(message, log_file)
        time.sleep(60)

1 Ответ

0 голосов
/ 27 февраля 2020

Ответ : Сценарий умер с подключением S SH. То, что работало, состояло в том, чтобы создать сервис скрипта и запустить его с помощью systemd. Я следовал этому руководству, чтобы заставить его работать: https://learn.sparkfun.com/tutorials/how-to-run-a-raspberry-pi-program-on-startup/all

Скрипт работает уже неделю без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...