Hallo,
Ist es möglich Aktionen der DoorPi per MQTT auszulösen?
Ich würde gerne mein Relais vom Türöffner per MQTT ansteuern.
Die publisher Funktion ist mir bekannt.
Hallo,
Ist es möglich Aktionen der DoorPi per MQTT auszulösen?
Ich würde gerne mein Relais vom Türöffner per MQTT ansteuern.
Die publisher Funktion ist mir bekannt.
Hallo Kunstflieger.
Voraussetzung ist ein MQTT Broker in deinem Netz und ein Python Script (in dieser Art) als Service:
#!/ usr/bin/env python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import requests
MQTT_SERVER = "localhost"
MQTT_PATH = "test_channel"
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
if tuereoeffnen in str(rc):
r = requests get('http://localhost:8080/control/trigger_event?event_name=OnKeyPressed_file.dooropen&event_source=doorpi.keyboard.from_filesystem') # Hier wird die URL zum unten erwähnten Event getriggert.
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe(MQTT_PATH)
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
# more callbacks, etc
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_SERVER, 1883, 60)
# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()
Alles anzeigen
Quelle: tutorials-raspberrypi.de
Sinnvollerweise erstellst du einen neuen Event für einen Eingang vom Keyboard "File" und nennst ihn "dooropen":
[EVENT_OnKeyPressed_file.dooropen]
10 = out:Tueroeffner,1,0,3
[filesystem_Inputpins]
dooropen = sleep:0
[file_keyboard]
base_path_input = /var/DoorPI/file/inputs
base_path_output = /var/DoorPI/file/outputs
bouncetime = 200
polarity = 0
pressed_on_keydown = True
reset_input = True
[keyboards]
file = filesystem
Alles anzeigen
Da ich selber momentan kein MQTT in Betrieb habe, kann ich die Lösung nicht testen, aber grundsätzlich sollte sie dich zumindest auf die Fährte bringen
Gruss
Sven
Hallo Sven,
vielen Dank für deine Hilfe! Das hat mir vom Verständnis schon sehr weiter geholfen.
MQTT broker läuft schon und die DoorPi sendet auch schon fleißig Status an mein Dashboard. Daher meinte ich, dass die Publisher Funktion schon geht. Aber damit DoorPi als Subscriber auf Topics und Schlagwörter achtet, das muss ich noch rausfinden.
Mit etwas Anpassung (Topic, ports usw.) habe ich die Funktion ausprobiert, aber leider ist nichts passiert als ich unter diesem Topic das Payload "tuereoeffnen" gesendet habe.
Im generellen Python Script gibt es noch den Befehl 'event_source=doorpi.keyboard.from_filesystem' dieser ist aber nicht weiter in der DoorPi.ini aufgeführt. Muss er auch noch rein und muss da was passieren?
Gruß
Thomas
Hallo Kunstflieger.
Befehl 'event_source=doorpi.keyboard.from_filesystem'
Du hast recht, dieser wird un der Doorpi.ini nicht weiter aufgeführt. Dieser Teil der aufgerufenen URL gehört zum constructor der Api.
MQTT broker läuft schon und die DoorPi sendet auch schon fleißig Status an mein Dashboard. Daher meinte ich, dass die Publisher Funktion schon geht. Aber damit DoorPi als Subscriber auf Topics und Schlagwörter achtet, das muss ich noch rausfinden.
Aha demzufolge läuft der Broker auf deinem DoorPi?
Wie werden denn die Messages aufbereitet?
Ich glaube, dann kannst du den Subscriber dort irgendwo registrieren und einfach die URL aus meinem Python-Script aufrufen lassen.
Gruss Sven
Hallo Sven,
Du hast recht, dieser wird un der Doorpi.ini nicht weiter aufgeführt. Dieser Teil der aufgerufenen URL gehört zum constructor der Api.
das heißt also, ich kann das einfach drin lassen und ignorieren?
Wie werden denn die Messages aufbereitet?
das läuft unter einem bestimmten EVENT als os_execute:pfad/scriptname.sh welches dann den Befehl z.B. mosquitto_pub -h localhost -t doorpi -m "DoorPi wurde heruntergefahren", enthält
Hallo Kunstflieger.
Jetzt raffe ich, was du meinst... Da hat sich einen automatischen Zeilenumbruch reingeschmuggelt.
Das Ganze gehört auf die gleiche Linie (WoltLab stellt den Sorcecode selbst in der dafür vorgesehenen Box nicht richtig dar. das ist ärgerlich....).
Die korrekte URL in der Klammer heisst:
'http://localhost:8080/control/trigger_event?event_name=OnKeyPressed_file.dooropen&event_source=doorpi.keyboard.from_filesystem'
Kopiere ihn im Python Script einfach zwischen die Klammern, ohne Zeilenumbruch.
Danach wird wohl auch der Subscriptor funktionieren...
Hab mir jetzt nicht den ganzen Text durchgelesen sondern möchte eher was zu dem generellen Herangehen sagen.
Möglichkeit 1 "die externe Lösung":
Es läuft ein externes Script wie wie im #2 von sgaechter
Durch das client.loop_forever() am Ende wird der Thread für immer "gesperrt" und kann nicht sauber (als Action) in DoorPi integriert werden.
Es macht meines Erachtens dann keinen Sinn über das "virtuelle Keyboard" zu gehen - ich würde dann den Weg über den Webservice wählen. Das Script könnte dann eine URL aufrufen wie:
http://door:pi@doorpi_server/control/trigger_event?event_name=OnKeyPressed_file.dooropen&event_source=mqtt
Möglichkeit 2 "Action pollt über Event":
Eine Action erzeugen, die sich die MQTT Einträge abholt und darauf direkt reagiert. Diese Action wird dann an ein OnTime* Event gebunden und pollt am MQTT Broker. Beispielhaft ist hier die Action statuswatchdog Größter Nachteil, wenn es zu einem Timeout kommt (dauert i.d.R. mindestens 2 Sekunden) bleibt DoorPi solange stehen und wartet auf das Ergebnis.
Möglichkeit 3 "Keyboard MQTT":
Eine Anbindung kann auch mittels der Keyboard-Vorlagen erzeugt werden (auch wenn ich den Namen Keyboard dafür bis heute schlecht gewählt finde). Im Grunde genommen ist es genau diese Darstellung vom Script in #2 als Integration in DoorPi. Beispielhaft hier einfach die Integration von PN532 (NFC-Lesegerät)
Ich sehe häufig die Lösung 1, da google am meisten hilft ein fertiges Standalone-Script zu finden. Die Lösung klappt und ich finde es super, wie Ihr Euch Gedanken macht und gegenseitig helft. Aus Systemsicht / Programmiersicht würde ich Euch auf Dauer den Weg 3 empfehlen.
Hallo motom001.
Nur so zur Verfollständigung. Beim unter #2 beschreibenen Script ist die Idee, dieses als separater Service laufen zu lassen. Es "horcht" MQTT und nutzt den Webservice als "Interface" zu DoorPi. Somit wird dieses Script nicht als Action in DoorPi integriert.
Demzufolge ist das "client.loop_forever()" dort schon richtig, sonst beendet sich das Script nach dem ersten MQTT- Event selber und der Service (sofern er so konfiguriert wird) muss das Script wieder starten.
Aber nun zu deiner Anmerkung iS Keyboard: Ich bin ganz deiner Meinung. DoorPi bringt alle Voraussetzungen mit, solche Dienste per Keyboard abzubilden. Das wäre natürlich dann auch der konfortable Weg. und erst noch ressourcenschonender.
Leider fand ich bisher keine Dokumentation, wie ein solches Keyboard genau programmiert wird (sprich API Doku). Ich habe erfolglos versucht, die bestehenden Keyboards zu analysieren um das herauszufinden.
Ich bin gerne bereit, Keyboards für MQTT (und auch für Telegram und weitere wie z.B Fhem) zu erstellen. Doch leider sind meine Hilferufe im Forum bisher in der Tiefe verhallt. Wenn du mir auf die Sprünge hilfst, bin ich gerne Bereit, Zeit zu investieren. (check mal deine Pn's, auch von motom001_new)
Kunstflieger: Damit keine Unsicherheit entsteht: Wenn du das Script als "SERVICE" einrichtest und nicht aus DoorPi heraus anstupst (das ginge ja grundsätzlich über "os_execute:" auch), ist motom001 's Bemerkung für dich eine Randnotiz.
happy basteling.
Sven
Hallo Zusammen,
leider muss ich gerade aus Zeitgründen das MQTT Thema etwas nach hinten stellen. Aber sobald ich wieder Zeit habe habe, werde ich es aufnehmen.
Vielleicht hat sich das Thema ja dann schon weiterentwickelt und die Möglichkeit 3, welche motom001 angesprochen hat, etwas ausgereift.
Vielen Dank für eure großartige Unterstützung! Das finde ich toll an Foren, wie dieses!
Gruß
Thomas