如何用Python结合MQTT实现数值状态切换时触发消息发布?
需求与实现思路咨询
我正在尝试对比通过MQTT接收的两个数值,并根据对比结果发布消息。目前已实现数值相等或不等时的判断逻辑,但实际需求是:程序接收一个数值(如230)后,若后续接收的数值仍处于同一状态(如250,仍小于300)则不执行任何动作,直到接收的数值状态发生切换(如大于300)才触发动作。希望获取实现思路或相关参考方向,不需要直接给出代码答案。
当前实现代码
import paho.mqtt.client as mqtt import time client = mqtt.Client() client.connect("test.mosquitto.org", 1883) def on_connect(client, userdata, flags, rc): client.subscribe("Medir") client.publish("Valve_OC", "Cerrar") print("cierre de la valvula") #initialize the new and last value new_value=0 last_value = 0 print("initial values: ", new_value, last_value) def on_message_medir(client, userdata, message): # The callback for when a PUBLISH message is received from topic MEDIR. global new_value global last_value new_value=int(float(str(message.payload.decode("utf-8")))) print("new_value:", new_value) compar_value(new_value, last_value) #function to compare the values def compar_value(new_value, last_value): if new_value != last_value: if new_value<300: client.publish("Valve_OC", "Abrir,100") last_value = new_value time.sleep(3) elif (new_value>300): client.publish("Valve_OC", "Abrir,60") last_value=new_value time.sleep(3) def on_publish(client, obj, mid): print("Mensaje: " + str(mid)) def on_subscribe(client, obj, mid, granted_qos): print("Subscribed: " + str(mid) + " " + str(granted_qos)) def on_log(client, obj, level, string): print(f"Log: {string}") client = mqtt.Client() client.on_connect = on_connect client.on_publish = on_publish client.message_callback_add("Medir", on_message_medir) client.on_subscribe = on_subscribe client.on_log = on_log client.connect("test.mosquitto.org", 1883) client.loop_forever()
实现思路方向
- 追踪状态而非具体数值:放弃记录上一次的数值,改为记录当前所处的状态(例如“低于300”“高于300”,需提前明确等于300时的状态归类)
- 状态切换触发逻辑:每次收到新数值后,先判断其所属状态,再与之前记录的状态对比,只有当状态发生变化时才执行发布动作,同时更新状态记录
- 初始化初始状态:程序启动时根据初始值设置对应的初始状态,确保第一次接收数值时逻辑正常
- 处理边界情况:明确数值等于300时的处理规则,避免出现逻辑遗漏
内容的提问来源于stack exchange,提问作者Abdel Essi
相关产品推荐
相关产品推荐

