Seite 1 von 1

Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 3. Feb 2022 11:03
von cupra6
Hallo zusammen,

ich bekomme es leider nicht hin, die 433 Mhz Steckdosen ins OH3 einzubinden.

Was ich nach langen Versuchen hinbekommen habe, ist das Script manuel über die command line auszuführen in, das klappt auch.
z.B.: im Ordner:
/opt/433Utils/RPi_utils/raspberry-remote/

wenn ich eingebe:

Code: Alles auswählen

./steckdose1.sh
klappt das auch, ohne Probleme, die Steckdose schaltet, was allerdings nicht klappt, ist dieses Script dann per Rule einzubinden.

So sieht mein mein "steckdose1.sh" Script aus:

Code: Alles auswählen

sudo ./send 00000 2 1
In der Rule versuche ich im Menü "THEN, execute a given script" folgeden code auszuführen (über den PLAY Button in der Rule):

Code: Alles auswählen

executeCommandLine("/etc/openhab/scripts/steckdose1.sh")
Leider passiert da nichts, nicht einmal ein Eintrag im Frontail.
Habt ihr ´ne Ahnung woran das liegen könnte bwz. ist das so überhaupt möglich?

Re: Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 3. Feb 2022 12:23
von peter-pan
...wie wär's mit executeCommandLine("/bin/bash", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh") oder nur executeCommandLine("/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh"). ( Evtl. muss es auch noch in der Whitelist eingetragen werden, bin mir aber nicht sicher.

Schau auch mal hier oder hier.

Re: Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 3. Feb 2022 12:45
von merlindata
...vielleicht ist es ja auch ein Problem mit der Ordner-Berechtigung.
Peter-Pan hat mich da schon einmal auf den richtigen Weg gebracht viewtopic.php?t=6075

Re: Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 5. Feb 2022 13:10
von cupra6
Erstmal vielen Dank an peter-pan und merlindata,
ich habe alles umgesetzt aber irgendwie bekomme ich die .sh Scripte nicht zum LAUFEN.

Zum Testen ob es überhaupt funktioniert, hab ich ein anderes Script (python) eingefügt, sogar an verschiedenen Orten, mit Erfolg. So sieht das Script aus:

Code: Alles auswählen

executeCommandLine(Duration.ofSeconds(4), "python3", "/opt/433Utils/RPi_utils/raspberry-remote/buzzer.py")
executeCommandLine(Duration.ofSeconds(4), "python3", "/home/openhabian/python/buzzer.py")


Der Zusatz "python3" ist übrigens ein MUSS, lass ich es weg, funktioniert es NICHT!
Zum Glück wirft er aber dementsprechend eine Fehlermeldung:

Code: Alles auswählen

executeCommandLine(Duration.ofSeconds(4), "python3", "/opt/433Utils/RPi_utils/raspberry-remote/buzzer.py")
executeCommandLine(Duration.ofSeconds(4), "/home/openhabian/python/buzzer.py")

2022-02-05 12:24:02.172 [WARN ] [rg.openhab.core.io.net.exec.ExecUtil] - Failed to execute commandLine '[/opt/433Utils/RPi_utils/raspberry-remote/buzzer.py]'
2022-02-05 12:27:11.594 [WARN ] [rg.openhab.core.io.net.exec.ExecUtil] - Failed to execute commandLine '[//home/openhabian/python/buzzer.py]'



Dieses Beispiel hier wirft auch Fehlermeldung !!!

Code: Alles auswählen

executeCommandLine(Duration.ofSeconds(10), "/usr/bin/", "sudo /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

2022-02-05 13:00:39.021 [WARN ] [rg.openhab.core.io.net.exec.ExecUtil] - Failed to execute commandLine '[/usr/bin/, sudo /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh]'



Die Beispiele hier werfen zwar KEINE Fehlermeldungen, funtkionieren aber trotzdem NICHT !!!

Code: Alles auswählen

executeCommandLine(Duration.ofSeconds(10), "/usr/bin/sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")
executeCommandLine(Duration.ofSeconds(10), "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")



Also was ich so herausgefunden habe, der Interpreter ist zwingend erforderlich (z.B. "python").
Aber wie gesagt, die .sh Scripte wollen einfach nicht funktionieren, trotzdem es keinerlei Fehlermeldungen gibt.


Vlt. wäre es eine Alternative den Inhalt vom .sh Script nach "python" umzuschreiben, aber dafür fehlt mir leider die Kenntnis.

Wie müsste diese LINE im "python" aussehen:

Code: Alles auswählen

sudo ./send 00000 2 1

Re: Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 5. Feb 2022 13:25
von oh73
ich hab auch lange gekämpt bis meine bash Script´s funktioniert haben!

sind aber in erster Linie Rechte Probleme.

ich hab dann mit der Holzhammer Methode das ganze Script Verzeichnis die Rechte auf ausführbar für alle gesetzt.
chmod -R +x *
vielleicht hilft es aber auch das Passwort für sudo in das sh Script mit ein zu bauen,

python_starten.sh

Code: Alles auswählen

#!/bin/bash
PW="Passwort"
## nur zum testen !
echo "Test 1"  >> /etc/openhab/scripts/test.txt

echo $PW | sudo /usr/bin/python3 /etc/openhab/scripts/python_script.py
wichtig ist noch das die Befehlszeile bei exec.whitelist eingetragen wird!

Edit:
die Python Scripts führe ich mit einen bash Script aus

Code: Alles auswählen

executeCommandLine("/etc/openhab/scripts/python_starten.sh")

Re: Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 5. Feb 2022 13:41
von udo1toni
Also, das sieht mir sehr nach stochern im Nebel aus...

1. python: Damit der Interpreter automatisch geladen wird, müssen verschiedene Voraussetzungen erfüllt sein, der Interpreter muss z.B. zu Beginn der Datei angeben sein. das reicht aber nicht, er muss sich auch im Suchpfad befinden und der User muss eine default Konsole haben. Und genau dieser letzte Punkt ist für den user openhab nicht gegeben. Kann sein, dass man da noch irgendwo was konfigurieren kann, dass das nicht nötig ist, aber es ist ja nicht so schlimm, den Interpreter mit anzugeben.

2. executeCommandLine() erwartet statt Leerzeichen getrennte Parameter.
Also statt "sudo /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh" muss man
"sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh" schreiben. Aber Achtung, es kommt auf ide Version von openHAB an, welche Schreibweise korrekt ist. Eine Zeit lang mussten Leerzeichen stattdessen mit @@ ersetzt werden...

3. sudo... erwartet gewöhnlich die Eingabe eines Passworts. Hast Du das System so eingerichtet, dass dies für den User openhab nicht der Fall ist? Gewöhnlich wird man über visudo in der entsprechenden Datei jeden einzelnen Befehl listen, für den dies erlaubt ist, und zwar exakt so, wie er ausgeführt wird. Man kann das auch global erlauben (vgl. auch den User pi in Raspberry Pi OS), aber das ist keine gute Idee, schon gar nicht für einen Systemuser wie openhab. Es gibt gute Gründe, warum openhab nicht alles darf...

4. Die Zeile

Code: Alles auswählen

sudo ./send 00000 2 1
ist unsicher. In welchem Verzeichnis befindest Du Dich denn? Du musst immer absolute Pfade angeben, insbesondere, wenn Du direkt aus openHAB heraus Befehle in der Bash ausführen lässt.

Re: Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 5. Feb 2022 14:30
von cupra6
Oh Mann!!! Ich bin soo happy !!! Es funktioniert!!

Und warum? Tatsächlich gab es ein Problem mit den "Rechten" bzw. Passwörtern.

Das Problem lag daran, dass im Hintergrund (was ich ja nie mitbekomme) beim Script-Aufruf nach dem Password gefragt wurde.

-------- Hier die LÖSUNG !!! --------- "ABSCHALTUNG der Password Abfrage"

Drauf gekommen bin ich durch den Tipp, es in der CLI mal als "openhab" User auszuführen, z.B. so:

Code: Alles auswählen

sudo -u openhab /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh
bzw. so, wenn man sich im selben Verzeichnis wie das Script befindet:

Code: Alles auswählen

sudo -u openhab ./steckdose1.sh
und siehe da, ich wurde nach einem Passwort gefragt,
und genau das passierte die ganze Zeit wenn die Rule getriggert hat, aber ohne Password natürlich keine funktionierende Rule.
(ich wusste nicht einmal wie das Password für den User "openhab" hiess, "habopen" hab ich probiert, aber leider ohne Erfolg.

Bild

Dies war die Lösung --> Anpassung der "sodoers" Datei:

"sudo visudo /etc/sudoers", folgender Eintrag fragt nicht mehr nach Password:

%openhab ALL=NOPASSWD: ALL

Bild

Und siehe da, die RULE funktioniert !!!

Nochmal vielen Dank an alle, für all die Tipps die letztendlich zu dieser Lösung geführt haben, juhuu!

Re: Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 5. Feb 2022 15:22
von cupra6
udo1toni hat geschrieben: 5. Feb 2022 13:41 Also, das sieht mir sehr nach stochern im Nebel aus...

1. python: Damit der Interpreter automatisch geladen wird, müssen verschiedene Voraussetzungen erfüllt sein, der Interpreter muss z.B. zu Beginn der Datei angeben sein. das reicht aber nicht, er muss sich auch im Suchpfad befinden und der User muss eine default Konsole haben. Und genau dieser letzte Punkt ist für den user openhab nicht gegeben. Kann sein, dass man da noch irgendwo was konfigurieren kann, dass das nicht nötig ist, aber es ist ja nicht so schlimm, den Interpreter mit anzugeben.

2. executeCommandLine() erwartet statt Leerzeichen getrennte Parameter.
Also statt "sudo /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh" muss man
"sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh" schreiben. Aber Achtung, es kommt auf ide Version von openHAB an, welche Schreibweise korrekt ist. Eine Zeit lang mussten Leerzeichen stattdessen mit @@ ersetzt werden...

3. sudo... erwartet gewöhnlich die Eingabe eines Passworts. Hast Du das System so eingerichtet, dass dies für den User openhab nicht der Fall ist? Gewöhnlich wird man über visudo in der entsprechenden Datei jeden einzelnen Befehl listen, für den dies erlaubt ist, und zwar exakt so, wie er ausgeführt wird. Man kann das auch global erlauben (vgl. auch den User pi in Raspberry Pi OS), aber das ist keine gute Idee, schon gar nicht für einen Systemuser wie openhab. Es gibt gute Gründe, warum openhab nicht alles darf...

4. Die Zeile

Code: Alles auswählen

sudo ./send 00000 2 1
ist unsicher. In welchem Verzeichnis befindest Du Dich denn? Du musst immer absolute Pfade angeben, insbesondere, wenn Du direkt aus openHAB heraus Befehle in der Bash ausführen lässt.

Oh, hab Udo´s Nachricht erst garnicht gelesen, bevor ich meine Antwort geschrieben habe, sorry :roll:


zur Nummer 1:
ok, habe verstanden, ich gebe jetzt den .sh Dateien den "'!/bin/bash" mit, das funktioniert auch, suppi, danke für den Tipp



zur Nummer 2:

ALL diese Möglichkeiten funktionieren bei mir (openHAB 3.2.0):

Code: Alles auswählen

executeCommandLine(Duration.ofSeconds(10), "/bin/bash", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

executeCommandLine("/bin/bash", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

executeCommandLine("/usr/bin/sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

executeCommandLine("sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

executeCommandLine("/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

ich werde wohl in der Zukunft den letzten Eintrag benutzen, wie du empfohlen hast, und den Interpreter jeweils im Script mit angeben

der passende Script dazu: (steckdose1.sh):

Code: Alles auswählen

#!/bin/bash
sudo /opt/433Utils/RPi_utils/raspberry-remote/send 00000 1 1
jetzt weiß ich allerdings nicht, ob das nicht doppelt gemoppelt ist mit dem Pfad,
der wird 1. in der Rule komplett übergeben und 2. im Script nochmal. Wird schon passen.



diese Möglichkeiten funktionieren NICHT:

Code: Alles auswählen

executeCommandLine("/bin/bash", "sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")
executeCommandLine("/bin/bash/", "sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

executeCommandLine("/usr/bin", "sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")
executeCommandLine("/usr/bin/", "sudo", "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

executeCommandLine("/bin/bash", "sudo /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")
executeCommandLine("/bin/bash/", "sudo /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")

executeCommandLine("/usr/bin", "sudo /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")
executeCommandLine("/usr/bin/", "sudo /opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh")


zur Nummer 3 und 4:

Der absolute Pfad lautet: "/opt/433Utils/RPi_utils/raspberry-remote/steckdose1.sh".
Für mich war es wichtig, dass es erstmal funktioniert. Ich werde die "sudoers" Datei wieder anpassen, und diesen Befehl einzeln eintragen, dann ist es "sicherer", so wie du geschrieben hast.

Vielen Dank nochmal !!!

Re: Openhab 3, 433 MHz Funksteckdosen per Script schalten

Verfasst: 5. Feb 2022 16:19
von udo1toni
cupra6 hat geschrieben: 5. Feb 2022 15:22 diese Möglichkeiten funktionieren NICHT:
Ja, das ist ja auch kein Wunder. sudo liegt im Verzeichnis /usr/bin. Der Aufruf lautet also /usr/bin/sudo, nicht usr/bin sudo oder irgendwie anders "ähnlich". Entweder man gibt den kompletten Pfad an, oder man schreibt nur den Befehl hin (dann muss der Pfad aber, wie erwähnt, im Suchpfad enthalten sein...)
cupra6 hat geschrieben: 5. Feb 2022 14:30 (ich wusste nicht einmal wie das Password für den User "openhab" hiess, "habopen" hab ich probiert, aber leider ohne Erfolg.
habopen ist das default Passwort für die Karaf Konsole (die erreichst Du mit openhab-cli console).

Der User openhab hat aber überhaupt kein Passwort. Er braucht auch keines, denn er darf sich ja nirgendwo anmelden. Das ist Teil des Sicherheitskonzepts von GNU/Linux. Systemuser (also solche, die nur dafür angelegt werden, um eine bestimmte Software z.B. als Dienst mit geringen Rechten zu starten) haben allgemein keine default Konsole, es ist statt /bin/bash oder /bin/sh einfach /bin/false eingetragen. Außerdem wird kein Passwort gesetzt, so dass sich ein solcher User erst gar nicht authentifizieren kann.

Selbstverständlich gibt es aber für einen Superuser dennoch die Möglichkeit, sich gezielt im Kontext des Users anzumelden:

Code: Alles auswählen

sudo su - openhab -s /bin/bash
Dieser Befehl führt das Kommando su aus. Da es als Superuser gestartet wird (sudo) entfällt die Passwortabfrage. Das - bewirkt, dass beim Anmelden ins home-Verzeichnis des Users gewechselt wird. openhab ist der User, in dessen Kontext gewechselt wird, -s schließlich gibt an, welche Shell (abweichend von der für den User festgelegten Shell) verwendet werden soll.
Im Anschluss befindet man sich also als User openhab in einer angemeldeten Shell und kann prima ausprobieren, wie sich Befehle im entsprechenden Kontext verhalten.