Wo ist der Fehler in meinem Python Code (MQTT)?

1 Antwort

Der Hauptunterschied zwischen den beiden Skripten liegt darin, wie die Temperaturschleife (

Temperature_loop()

) gesteuert wird. Im ersten Skript (

Openhab_Mqtt.py

) wird die Schleife innerhalb der

Temp_sensor()

-Funktion gestartet, die durch eine MQTT-Nachricht aktiviert wird. Im zweiten Skript (

Openhab_Mqttv2.py

) wird die Schleife innerhalb einer separaten Funktion (

Temperature_loop()

) gestartet, die durch die Funktionen

start_TempLoop()

und

stop_TempLoop()

gesteuert wird.

Hier ist der Fehler in deinem zweiten Skript (

Openhab_Mqttv2.py

):

Du hast vergessen, die

on_subscribe

-Funktion zu verwenden, um die Abonnements für die MQTT-Nachrichten zu verarbeiten. Da du keine explizite Funktion dafür definiert hast, wird die Standardfunktion von Paho MQTT verwendet, die nichts tut. Daher wird die "Temp_Start"-Nachricht nicht abonniert, und die Temperaturschleife wird nicht gestartet.

Um das Problem zu lösen, füge einfach eine

on_subscribe

-Funktion hinzu, die die Abonnements für die MQTT-Nachrichten verarbeitet. Hier ist eine überarbeitete Version deines zweiten Skripts (

Openhab_Mqttv2.py

), das die

on_subscribe

-Funktion enthält:

import paho.mqtt.client as mqtt
import time
import smbus2
import bme280
import threading


# Getting information
def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed to topic : " + str(mid) +" with QoS" + str(granted_qos))
                                                                 
def on_connect(client, userdata, flags, rc):
    print("Connected to MQTT broker")




# Damit loops nicht am anfang durchstarten 
TempLoop_running = False




# Checking for messages to execute code
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
    print("Payload: " + msg.payload.decode())
    if msg.payload.decode() == "Temp_Start":
        start_TempLoop()
    if msg.payload.decode() == "Temp_Stop":
        stop_TempLoop()
    if msg.payload.decode() == "test":
        print("TESTING...")
        client.publish("main/messager", "START", qos=0, retain=True)
    else:
        pass


# Execute things here ->


# Getting Temperature
address = 0x76
bus = smbus2.SMBus(1)
# Load calibration parameters
calibration_params = bme280.load_calibration_params(bus, address)
def Temperature_loop():
    global TempLoop_running
    while TempLoop_running:
        data = bme280.sample(bus, address, calibration_params)
        #Extract temperature, pressure, and humidity
        temperature_celsius = data.temperature      
        #Print the readings
        print("Temperature: {:.2f} °C".format(temperature_celsius))
        # Nachricht an das entsprechende Topic senden
        client.publish("Temp/Loop", "Temperature: {:.2f} °C".format(temperature_celsius))
        # Wartezeit, um die Ausgabe zu verlangsamen
        time.sleep(2)
# Funktion zum Starten der Temperatur Schleife
def start_TempLoop():
    global TempLoop_running
    TempLoop_running = True
    threading.Thread(target=Temperature_loop).start()
# Funktion zum Stoppen der Temperatur Schleife
def stop_TempLoop():
    global TempLoop_running
    TempLoop_running = False


# Set general data
client = mqtt.Client()
client.on_message = on_message 
client.on_connect = on_connect
client.on_subscribe = on_subscribe  # Subscribe-Funktion hinzufügen
client.connect( "192.x.x.x", 1883, 60)
client.username_pw_set( "xx", "xx" )
client.subscribe( "main/messager", qos=0)




# Loop forever
client.loop_forever()