Редактировать: Для ясности: проблема не в 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)