Seite 1 von 3

Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 3. Mär 2021 11:50
von tobi_openHAB_newbie
Hallo zusammen,

das ist mein allererster Post hier. Bitte seht mir deshalb Unzulänglichkeiten nach.

[PROLOG]
Ich muss voranstellen, dass ich absoluter Neuling im Bezug auf openHAB(3) auf dem raspberry Pi (3B) bin und auch mit diesem und Linux nur rudimentäre Erfahrung habe. Seit 4 Tagen durchsuche ich diverse openHAB Foren, aber komme einfach nicht weiter und hoffe deshalb auf Eure Hilfe.

[AUFGABENSTELLUNG]
Ich habe VELUX Rollläden für Dachfenster mit Fernbedienung. Um die Steuerung "smart" zu machen, habe ich die Fernbedienung "filetiert", Kabel an die Kontakte für UP | STOP | DOWN angelötet und diese mit den GPIO Pins des rasperry pi verbunden. Mit je einem simplen Python Skript (für UP | STOP | DOWN) kann ich so die Rollläden steuern. Das funktioniert auch problemlos, wenn ich das Skript auf dem raspi direkt starte.
Nachdem ich mit mit openHAB3 beschäftigt habe, würde ich jetzt gerne das openHAB rollershutter item nutzen, um meine 3 Skripte über die 3 Buttons des items starten zu lassen (Rückgabewerte und Statusabfragen brauche ich nicht!).
rollershutter.PNG
Ich habe dazu eine Rule angelegt, die wie folgt aussieht:
rule.PNG

[PROBLEM]
Mein Problem ist, dass ich das Skript aus openHAB3 heraqus nicht zum Laufen bekomme.
Meine bisherige Recherche hat mir 3 Optionen aufgezeigt, wie ich das Skript starten könnte:

1. Skript direkt in der Rule als "Python Skript" hinterlegt
Ergebnis:--> funktioniert nicht; es kommt auch kein Fehler

2. Skript liegt "irgendwo" auf dem raspi --> Aufruf über das EXEC Binding
Ergebnis: das erscheint für mich als Neuling so komplex, dass ich nicht durchblicke

3. Skript liegt "irgendwo" auf dem rapsi --> Aufruf des Skripts über den Befehl executeCommandLine
Hier habe ich den Thread viewtopic.php?t=4657 gefunden, mir ist aber unklar, wo ich den Befehl wie reinsetzen muss (in die Rule?) und wo das Skript mit welchen Rechten liegen muss.

Ich würde mich sehr über Eure Hilfestellung (möglichst unter Vermeidung des EXEC Bindings) sehr freuen!

[FACTS]
Ich nutze openHab 3.0.1 auf dem raspberry pi 3B.
Installierte Bindings u.a.: EXEC Binding 3.0.1
Mein Python Skript sieht so aus:

Code: Alles auswählen

#!/usr/bin/python3
import time
import RPi.GPIO as GPIO

# Es wird die BCM Nummerierung benutzt
GPIO.setmode(GPIO.BCM)

# Rollladen Pins vorbereiten
GPIO.setup(17, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(22, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(27, GPIO.OUT, initial=GPIO.LOW)

# Rolladen runterfahren
GPIO.output(27, GPIO.HIGH)
time.sleep(0.1)
GPIO.output(27, GPIO.LOW)
time.sleep(0.05)
GPIO.output(27, GPIO.HIGH)
time.sleep(0.1)
GPIO.output(27, GPIO.LOW)
time.sleep(0.05)
GPIO.output(27, GPIO.HIGH)
time.sleep(0.1)
GPIO.output(27, GPIO.LOW)
Danke und viele Grüße,
Tobias

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 3. Mär 2021 13:03
von udo1toni
Im zweifel wäre es sinnvoll, eine Rule auf received command triggern zu lassen. Innerhalb der Rule kannst Du über die Variable receivedCommand dann entscheiden, welcher Befehl ausgeführt werden soll. So sähe die Code-Ansicht aus:

Code: Alles auswählen

triggers:
  - id: "1"
    configuration:
      itemName: Rollladen1
    type: core.ItemCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/javascript
      script: |-
        switch(receivedCommand){
          case UP  : {executeCommandLine("python /pfad/zum/script/sendup.py")}
          case DOWN: {executeCommandLine("python /pfad/zum/script/senddown.py")}
          case STOP: {executeCommandLine("python /pfad/zum/script/sendstop.py")}
        }
    type: script.ScriptAction
Wobei ich empfehlen möchte, die Scripte komplett anders zu realisieren.

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 3. Mär 2021 16:51
von tobi_openHAB_newbie
Erstmal bin ich baff über die schnelle Antwort auf meine Frage! Schon mal vielen Dank dafür.
Dank des Hinweises habe ich gesehen, dass ich den Parameter (UP, DOWN, STOP) nicht zwingend in der Rule mit angeben muss, sondern die Fallunterscheidung später machen kann.

Sieht bei mir jetzt genau so aus:

Code: Alles auswählen

triggers:
  - id: "1"
    configuration:
      itemName: rollladen_linus
    type: core.ItemCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/javascript
      script: >-
        switch(receivedCommand){
          case UP  : {executeCommandLine("python /home/pi/Python_Projekte/Velux/hoch.py")}
          case DOWN: {executeCommandLine("python /home/pi/Python_Projekte/Velux/runter.py")}
          case STOP: {executeCommandLine("python /home/pi/Python_Projekte/Velux/runter.py")}
        }
    type: script.ScriptAction
Aber leider funktioniert es immer noch nicht. Es passiert nichts. :(
Passt denn mein Pfad bzw. was müsste ich tun, damit der user (ich denke, es ist "openhab"), die Skripte ausführen darf? Kann der user openhab so einfach auf die GPIO Pins zugreifen?

Nocheinmal herzlichen Dank für Deine/Eure Hilfe.

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 3. Mär 2021 19:48
von udo1toni
Ja, fehlende Rechte können gut das Problem sein. Das ist einer der Gründe, warum ich das anders gestalten würde. :)

Evtl. könntest Du zunächst in die Scripte ein Minilogging einbauen, ganz grob so:

Code: Alles auswählen

datei = open('/tmp/velux.log','a')
datei.write("Script für UP getriggert")
datei.close()
Das kannst Du zu Beginn der drei Dateien eintragen, natürlich mit unterschiedlichen Texten.
Dann kannst Du erst mal sehen, dass die Scripte überhaupt aufgerufen werden.

Der User openhab sollte eigentlich der Gruppe gpio angehören, es kann aber sein, dass das nicht ausreicht. Leider nutze ich keine GPIO, so dass ich da auch erst mal forschen müsste.

Das Script betreffend:
Gibt es einen Grund, warum Du die "Tasten" mehrfach hintereinander "drückst"?

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 3. Mär 2021 20:02
von sihui
tobi_openHAB_newbie hat geschrieben: 3. Mär 2021 11:50 Ich würde mich sehr über Eure Hilfestellung (möglichst unter Vermeidung des EXEC Bindings) sehr freuen!
Du könntest als Alternative, oder wenn der bisherige Weg zu beschwerlich wird, auch einmal über fertige Python Bibliotheken für die Ansteuerung der GPIO nachdenken, diese übersetzen dann die Steuerung in MQTT Befehle.

Um die GPIO per Python anzusteuern:
https://community.openhab.org/t/mqttany ... mqtt/81450
https://crazyivan359.github.io/mqttany/index.html

Du benötigst dann nur noch einen MQTT Broker und das MQTT Binding und kannst nach Lust und Laune schalten :-)

https://www.openhab.org/addons/bindings/mqtt.generic/
https://www.openhab.org/addons/bindings/mqtt/

Noch ein Weg: direkt über das neue GPIO Binding:
https://www.openhab.org/addons/bindings/gpio/

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 4. Mär 2021 17:21
von tobi_openHAB_newbie
udo1toni hat geschrieben: 3. Mär 2021 19:48 Das Script betreffend:
Gibt es einen Grund, warum Du die "Tasten" mehrfach hintereinander "drückst"?
Ich will damit erreichen, dass der Taster auch wirklich "gedrückt" wird. Ich weiß, das erscheint hemdsärmelig, aber ich wollte ein schnelles Ergebnis anstelle mit der richtigen sleep time herumzuexperimentieren.

Jetzt weiß ich - Dank Deines Logfile-Tipps - zumindest, dass es nicht am Skript selbst oder dem Ansprechen der GPIO Pins liegt: ich habe testweise einfach ein Python Skript, das nur das Logfile schreiben soll und auch dieses Skript wird erst gar nicht aufgerufen. :(

An den Rechten - denke ich kann es auch nicht mehr liegen (chmod 777)... Ich bin und bleibe ratlos.

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 4. Mär 2021 17:24
von tobi_openHAB_newbie
sihui hat geschrieben: 3. Mär 2021 20:02
tobi_openHAB_newbie hat geschrieben: 3. Mär 2021 11:50 Ich würde mich sehr über Eure Hilfestellung (möglichst unter Vermeidung des EXEC Bindings) sehr freuen!
Du könntest als Alternative, oder wenn der bisherige Weg zu beschwerlich wird, auch einmal über fertige Python Bibliotheken für die Ansteuerung der GPIO nachdenken, diese übersetzen dann die Steuerung in MQTT Befehle.
Vielen lieben Dank für Deine Anstöße! Leider scheint das Problem nicht (oder noch nicht) beim Ansprechen der GPIO Pins zu liegen. Nicht mal ein ganz plattes Python Skript, das nur ein Logfile ausgibt, kann ich über openHAB aufrufen. :(

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 4. Mär 2021 19:01
von udo1toni
Es ist jetzt halt die Frage, ob Du hier forschen willst, bis Du herausgefunden hast, warum das mit dem Aufruf des Scripts nicht funktioniert, oder ob Du lieber einen der anderen Wege ausprobieren willst (smart liefe es sicherlich über das GPIO Binding, aber auch die Variante über mqtt ist viel eleganter als ein zusammengestoppeltes Script).

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 4. Mär 2021 20:26
von sihui
tobi_openHAB_newbie hat geschrieben: 4. Mär 2021 17:24 Nicht mal ein ganz plattes Python Skript, das nur ein Logfile ausgibt, kann ich über openHAB aufrufen. :(
Es gibt viele kluge Köpfe die diese ganzen Probleme bereits gelöst haben. Siehe MQTTany als Beispiel.
Wie Udo schon schrieb: entweder Stunden damit verbringen deinen Fehler zu finden oder ganz einfach die bereits funktionierenden Lösungen installieren und schnell Erfolg haben.
Da musst du mal in dich gehen welcher Weg für dich der Bessere ist und dich mehr zufrieden stellt.

Re: Python Skript über openHAB3 triggern (rollershutter item)

Verfasst: 5. Mär 2021 18:12
von tobi_openHAB_newbie
Ich habe jetzt nochmal kurz Hoffnung aufkeimen sehen, als ich diesen Beitrag studiert habe: https://community.openhab.org/t/python- ... line/13175

Leider funktioniert das auch nicht. :( Der Beitrag ist von 2016. Vielleicht ging das mit der damaligen openHAB Version.

Wie dem auch sei. Vermutlich habt ihr beide Recht: ich werde mich mit den von Euch angesprochenen Varianten auseinandersetzen und hoffe, dass ich - so ich dort wieder ins Stocken komme - auf Euren Rat hoffen darf!

Vielen herzlichen Dank! ;)