You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:03:44