Обновление текста GUIZERO с помощью показаний датчика MQTT. Пока не обновляется должным образом

#python-3.x #user-interface #logic #mqtt

Вопрос:

Итак, я работаю над проектом пользовательского интерфейса для собственного личного обучения и обогащения. Пользовательский интерфейс должен иметь возможность обновлять свой текст с учетом последних показаний датчиков, публикуемых MQTT. Я написал простой тестовый скрипт, чтобы ознакомиться с инструментами, которые я буду использовать, но прямо сейчас мой текст не обновляется с новыми поступающими показаниями. Чтобы добавить к этому, я даже не уверен, что сообщения принимаются, при публикации сообщения на ту же тему в консоли ничего не отображается.

Вот мой код:

 from guizero import App, Text, TextBox, PushButton, Window, Box, Picture, Slider
import paho.mqtt.client as mqtt 

sensorReading = ''
#######################################
def on_connect(client, userdata):
    print("Connected with result code " str(rc))
    
    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe("room/temperature")
#######################################


#######################################
def on_message(client, userdata, message):
    global sensorReading
    sensorReading = str(message.payload)  
    print("message received " ,str(message.payload.decode("utf-8")))
    print("message topic=",message.topic)
    print("message qos=",message.qos)
    print("message retain flag=",message.retain)
########################################

########################################
def updateReading():
    
    client.publish('room/temperature','84')
    reading.value = sensorReading
    reading.after(1000,updateReading)
    
########################################

brokerAddress = 'redacted'
client = mqtt.Client('GG1')

print("connecting to broker")
try:
    client.connect(brokerAddress, port=1883)
    print('Connection Successful!')
except:
    print('Connection Failed')
    exit(1)

client.on_message=on_message #attach function to callback

print("Subscribing to topic","room/temperature")

app = App(title='Admin Page Test', layout='auto', height=480,width=640)
app.bg = 'white'

client.loop_start()
welcomeText = Text(app, text='Welcome!', size=40, font='Times New Roman', color='darkgreen', align='top')
clientReading = Text(app,text='Latest Reading is: ')
reading=Text(app,text='****')
reading.after(1000, updateReading)

client.loop_stop()
app.display()
 

Я знаю, что это ошибка в моем понимании логики, лежащей в основе этой системы, я просто не знаю, в какой части я ошибся. Спасибо за ваше время.

Комментарии:

1. Что происходит, когда вы запускаете это (т. Е. Выводится ли «полученное сообщение» на консоль?). Предоставление дополнительной информации облегчит помощь (это помогает узнать, связана ли проблема с MQTT или как-то связана с кодом обновления guizero). Я предполагаю, что проблема связана с client.loop_stop() (библиотека mqtt не будет обрабатывать никаких дальнейших сообщений после этого вызова — лучше всего вызвать это on_disconnect ).

2. Отличный вопрос. Извините, я забыл добавить эту часть. При запуске этой программы ничего не выдается. При отправке сообщений ничего не распечатывается. Я даже не уверен, получает ли он его.

3. ХОРОШО — тогда проблема будет в соответствии с моим предыдущим комментарием ( client.loop_stop() вызывается почти сразу после client.loop_start() и никакие сообщения не обрабатываются, если цикл не запущен). Для тестирования просто удалите client.loop_stop() .

4. Спасибо. Я сделал это только сейчас, однако сообщения по-прежнему не проходят. Похоже, что функция on_message никогда не вызывается. ничего не выводится из терминала. Я могу подтвердить, что сообщения отправляются. Я запускаю это на Raspberry pi 4, и при выполнении команды подписки MQTT с mosquitto через терминал принимаются сообщения.

5. Поскольку вы указываете, что вообще ничего не распечатывается, кажется, что on_connect это не вызывается. Это будет связано с тем, что вы не устанавливаете обратный вызов ( client.on_connect = on_connect ). Этот пример может быть полезен.