问题描述
我使用具有HA作为代理的python创建了一个Mqtt订阅...进行第一次连接时,即使我没有激活它们,因为我的订阅是“ house /点击/#“。列表完成后…如果您按一个按钮,我会开始收到我需要的消息…是否有办法删除它给我的第一个列表。
这是我使用的代码:
import paho.mqtt.client as paho
import pandas as pd
import pyautogui
import os
import platform
def on_subscribe(client,userdata,mid,granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))
def on_message(client,msg):
pyautogui.FAILSAFE=False
os_system=platform.system()
# Selezione area dello screenshot
if os_system == 'Darwin':
region=(10,80,850,100) #MAC
else:
region=(60,130,900,250) #RASP
tab_pos=pd.read_csv('table_position.csv')
print(msg.topic+" "+str(msg.payload)+" "+str(msg.qos))
mqtt_name=str(msg.topic).split("click/")[0]+str(msg.topic).split("click/")[1]
mqtt_payload=msg.payload.decode('utf-8')
index_loc=tab_pos.index[tab_pos['mqtt_topic'] == mqtt_name].tolist()
x_loc=tab_pos.iloc[index_loc[0]][0]
y_loc=tab_pos.iloc[index_loc[0]][1]
new_xloc=x_loc+region[0]
new_yloc=y_loc+region[1]
if tab_pos.iloc[index_loc[0]][5] == "cover":
if str(mqtt_payload) == "OPEN":
if str(mqtt_payload) == "STOP":
pyautogui.click(new_xloc+8,new_yloc+2)
pyautogui.moveTo(region[0],region[1])
print(str(new_xloc)+","+str(new_yloc))
else:
pyautogui.click(new_xloc+8,"+str(new_yloc))
if str(mqtt_payload) == "CLOSE":
if str(mqtt_payload) == "STOP":
pyautogui.click(new_xloc+8,new_yloc+25)
pyautogui.moveTo(region[0],"+str(new_yloc))
else:
pyautogui.click(new_xloc+10,new_yloc+10)
pyautogui.moveTo(region[0],region[1])
print(str(new_xloc)+","+str(new_yloc))
client = paho.Client(client_id = "atena_mqtt_click")
client.on_subscribe = on_subscribe
client.on_message = on_message
client.username_pw_set("xxxx","xxxxx")
client.connect("XXX.XXX.XXX.XXX",1883)
client.subscribe("house/click/#",qos=1)
client.loop_forever()
这是输出
Subscribed: 1 (1,)
house/click/xxxxxx/light b’OFF’ 0
711,104
house/click/xxxxxx/alarm b’OFF’ 0
454,134
house/click/xxxxxx/light b’OFF’ 0
795,104
house/click/xxxxxxx/cover b’STOP’ 0
这些消息全部组合在一起后,由于我对按钮的操作,我可以开始接收消息
有人可以告诉我如何在没有这些第一行的情况下进行干净的会话?
谢谢
解决方法
检查您的MQTT Publisher标志。如果您的发布商使用的是“保留标志”,则需要将其设为false。
并从主题中删除保留的消息,客户端必须用保留标记设置为True的另一条消息替换它,或者客户端必须在该主题上发布保留标记设置为True的空白消息。这是删除保留邮件的唯一方法。
“保留的消息是将保留标志设置为true的常规MQTT消息。代理存储该主题的最后一个保留的消息和相应的QoS。每个客户端都订阅与保留的主题匹配的主题模式消息在订阅后立即收到保留的消息。代理程序每个主题仅存储一条保留的消息。” 来源:https://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages/