@roliver: Eine `publish()`-*Funktion* gibt es in dem Modul doch auch überhaupt gar nicht. Wie kommst Du also darauf so etwas wie ``mqtt.publish(…)`` zu schreiben? Es ist also auch falsch zu behaupten da passiere gar nichts – das gibt eindeutig einen `AttributeError` und das folgende `print()` wird nicht ausgeführt. 'fertig' erscheint da also sicher nicht. Die Fehlerbeschreibung passt also nicht zum gezeigten Quelltext.
Den Verdacht erhärtet auch das `time.sleep()` das mysteriöserweise verwendet wird ohne das Modul importiert zu haben.
``global`` ist schlecht – schmeiss das raus und programmiere das ordentlich. Alles was in einer Funktion oder Methode ausser Konstanten verwendet wird, sollte als Argument(e) übergeben werden. Auf Modulebene hat ``global`` zudem überhaupt gar keinen Effekt. Vergiss das Schlüsselwort am besten sofort wieder.
Eingerückt wird in Python mit vier Leerzeichen pro Ebene. Bring das Deinem Editor bei.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
`decode()` liefert bereits eine Zeichenkette, es macht keinen Sinn da noch mal `str()` mit aufzurufen. Bevor man `payload` dekodiert sollte man vielleicht auch *erst* prüfen ob das überhaupt das `topic` ist was einen interessiert, denn andere können da ja etwas ganz anderes kodiert haben als Zeichenketten in UTF-8.
Da sich die Kommandos gegenseitig ausschliessen ist nur im ersten Fall ein ``if`` sinnvoll und ab da ``elif``. Und zum Schluss noch ein ``else`` das dafür sorgt das unbekannte oder vielleicht falsch geschriebene Kommandos nicht einfach ohne irgendeine Meldung ignoriert werden. So zum Beispiel das irgendwer statt "pumpon" etwas wie "pumpan" in den Quelltext schreibt.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3.5
import paho.mqtt.client as mqtt
def on_connect(client, _userdata, _flags, return_code):
print("Connected with Code:", return_code)
client.subscribe("/abstand/#")
def on_message(client, _userdata, message):
if message.topic == "/abstand/pumpe":
command = message.payload.decode("utf-8")
if command == "STOP":
print("STOPen")
client.publish("/wassertonne/relay/", "0")
client.publish("/abstand/set", "pumpoff")
elif command == "START":
print("STARTEN")
client.publish("/wassertonne/relay/", "1")
client.publish("/abstand/set", "pumpon")
else:
print("Unbekanntes Kommando {!r}!".format(command))
def main():
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set("agent", "geheim")
client.connect("localhost", 1883, 60)
try:
client.loop_forever()
except KeyboardInterrupt:
pass # Ignored intentionally.
finally:
client.loop_stop()
client.disconnect()
if __name__ == "__main__":
main()