Türöffner per MQTT

  • Hallo Kunstflieger.

    Voraussetzung ist ein MQTT Broker in deinem Netz und ein Python Script (in dieser Art) als Service:

    Quelle: tutorials-raspberrypi.de



    Sinnvollerweise erstellst du einen neuen Event für einen Eingang vom Keyboard "File" und nennst ihn "dooropen":


    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:

    Code
    '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...

    • Offizieller Beitrag

    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:

    Code
    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.

    Code
    [EVENT_OnTimeSecondEvenNumber]
    10=statuswatchdog:/tmp/doorpi.watchdog


    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