Hallo,
ich versuche einen GPIO des Raspberrys zu schalten. Ich habe das skript gemäß wiki erstellt und kann als Benutzer "pi" von der Konsole aus schalten. Aus Fhem bzw. der Fhem Kommandozeile scheitern die System-Aufrufe leider noch. Der Rückgabewert ist immer -1.
Um es bezüglich der Rechte erst einmal zu vereinfachen, habe ich versucht einfach das Datum
{system("date" &)}
abzufragen. Hier bekomme ich auch nur den Wert -1 zurück.
Muss ich noch etwas einstellen, um einen Systembefehl absetzen zu können?
Vielen Dank
exec
executes a command and never returns. It's like a return statement in a function.
If the command is not found exec returns false. It never returns true, because if the command is found it never returns at all. There is also no point in returning STDOUT, STDERR or exit status of the command. You can find documentation about it in perlfunc, because it is a function.
system
executes a command and your Perl script is continued after the command has finished.
The return value is the exit status of the command. You can find documentation about it in perlfunc.
backticks
like system executes a command and your perl script is continued after the command has finished.
In contrary to system the return value is STDOUT of the command. qx// is equivalent to backticks. You can find documentation about it in perlop, because unlike system and execit is an operator.
____
Was du willst ist also z.B.
{ `date` }
Ah okay, danke.
Dann liegt mein Problem evtl wohl doch bei den Rechten? Eigentlich will ich ja ein
{system("sudo /usr/sbin/fhem-gpio.sh 17 1 &")}
absetzen.
Ein ls -l auf der Kommandozeile gibt folgendes aus:
pi@raspberrypi /usr/sbin $ ls -l |grep fhem
-rwxr-xr-x 1 root root 255 Nov 6 20:37 fhem-gpio.sh
Hast du den fhem User in die sudoers eingetragen?
ja...
pi@raspberrypi /usr/sbin $ sudo adduser fhem sudo
Der Benutzer »fhem« ist bereits ein Mitglied der Gruppe »sudo«.
Gerade habe ich diese Meldung im Logfile gefunden:
sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben
2015.11.07 08:06:56 3: Heizung_on return value: -1
2015.11.07 08:06:56 3: act_on_Heizung2 return value: -1
http://forum.fhem.de/index.php/topic,36120.msg313007.html#msg313007 (http://forum.fhem.de/index.php/topic,36120.msg313007.html#msg313007)
Gruß
Hans
...habe es geändert, aber geholfen hat es nicht :(
pi@raspberrypi ~ $ less /etc/passwd | grep fhem
fhem:x:999:20::/opt/fhem:/bin/bash
Hallo,
fhem neu anmelden. Vlt. einfach reboot.
Gruß
Hans
..habe schon neu gebootet...sogar mehrmals!
Das bash hat mir insofern doch geholfen, dass ich jetzt auf der Konsole zum benutzer fhem wechseln kann. Also habe ich den Befehl mal als fhem abgesetzt. Es kommt folgende Meldung in Verbindung mit einer Passwortabfrage:
fhem@raspberrypi:/home/pi$ sudo /usr/sbin/fhem-gpio.sh 17 0
Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat. Normalerweise läuft es auf drei Regeln hinaus:
#1) Resprektieren Sie die Privatsphäre anderer.
#2) Denken Sie nach bevor Sie tippen.
#3) Mit großer Macht kommt große Verantwortung.
[sudo] password for fhem:
fhem@raspberrypi:/home/pi$ gpio readall
..gebe ich das Passwort ein, wird auch den Pin geschaltet
..ich habe es. Ich hatte gestern beim probieren dem Benutzer fhem ein Passwort vergeben. Das Passwort braucht man wohl auch um auf der Konsole zum Benutzer fhem zu wechseln. Nachdem ich jetzt das Passwort gelöscht habe,
pi@raspberrypi ~ $ sudo passwd --delete fhem
passwd: Passwortablauf-Informationen geändert.
kann ich jetzt auch aus fhem heraus schalten.
Vielen Dank für die Hilfe
Ein alter Thread aber das richtige Thema...
Folgender geplanter Ablauf:
- Türklingel extern wird gedrückt (Sensor/Notify funktioniert)
- im Notify:
- Klingelsound auf Mi Spartspeaker abspielen (via system() mit castnow; funktioniert)
- Text "es klingelt" wiedergeben (via Modul fhempy googlecast auf demselben Mi Smartspeaker; funktioniert NICHT)
Im Einzeltest funktioniert die Textausgabe.
Ein weiterer Befehl nach der Textausgabe wird abgearbeitet.
sub testSpeak()
{
my $mesg = "es klingelt";
my $fName = "/opt/fhem/sounds/doorbell_10.mp3";
`castnow "$fName" --address 192.168.178.102 --quiet`;
fhem "msg audio $mesg"; # keine Ausgabe
fhem "msg push $mesg"; # Wird ausgegeben
}
Ich vermute, dass das Ausgabegerät (Mi Smartspeaker) noch irgendwie blockiert ist - aber das ist geraten...
Ein "sleep 5 ;" for
fhem "msg audio $mesg"; hat nichts gebracht.
Vielleicht hat jemand eine Idee?
Grüße,
Carsten
Hallo Carsten,
es ist immer besser einen neuen Thread mit seinem Problem aufzumachen!
Das hier `castnow "$fName" --address 192.168.178.102 --quiet`
ist nicht system() sondern qx(). https://perldoc.perl.org/perlop#Quote-Like-Operators
Der Aufruf blockiert FHEM solange bis der Aufruf zu Ende ist. system() könnte man so aufrufen, dass es nicht blockiert, qx() blockiert immer.
Ein FHEM Aufruf "castnow \"$fName\" --address 192.168.178.102 --quiet"
würde nicht blockieren. https://fhem.de/commandref_DE.html#command
Hat aber sicher nichts mit deinem eigentlichen Problem zu tun.
Gruß Otto
Zitat von: Otto123 am 12 Januar 2022, 09:47:16
Hallo Carsten,
es ist immer besser einen neuen Thread mit seinem Problem aufzumachen!
Hallo Otto,
ich hatte gehofft, dass Du dich meldest, da ich den ausführlichen Artikel in Deinem Technik-Blog gelesen hatte ;)
Dann werde ich den Beitrag noch mal neu einstellen => https://forum.fhem.de/index.php/topic,125377.0.html
Vielen Dank soweit,
Carsten
Hallo zusammen,
funktioniert System() auch, wenn FHEM im Docker Container läuft?
Ich wollte ebenfalls über SSH ohne Passwort mit Public/Private Key einen Befehl auf einem Remote Raspberry absetzen.
Die Erzeugung der Keys etc. müsste dann im Container vorgenommen werden, oder?
Ja und Ja - wobei es egal ist wo die Keys erzeugt werden, sie müssen vom user fhem im Container verwendbar sein.
Ok, dann teste ich das mal.
Danke
vielleicht hilft Dir meine Notiz (https://heinz-otto.blogspot.com/2020/09/ssh-mit-public-key.html).
Zitat von: ReneR1986 am 30 Januar 2022, 20:13:12
Hallo zusammen,
funktioniert System() auch, wenn FHEM im Docker Container läuft?
Ich wollte ebenfalls über SSH ohne Passwort mit Public/Private Key einen Befehl auf einem Remote Raspberry absetzen.
Die Erzeugung der Keys etc. müsste dann im Container vorgenommen werden, oder?
Du kannst auch SSH vom Host verwenden und dich dann auf den Docker Container verbinden. Dann sparst du dir das ssh Geraffel im Container.
Beispiel findest du hier:
https://github.com/stormmurdoc/fhemdocker/blob/master/fcmd.sh
Hallo zusammen,
ich konnte es mit SSH zum laufen bringen.
Danke für deine Notiz Otto.
Im Docker Container war schon alles vorhanden.
Folgendes musste ich noch machen:
#Remote Rechner
Benutzer anlegen:
sudo useradd -m -g users -s /bin/bash <Neuer Benutzer>
sudo passwd <Neuer Benutzer>
#Lokaler Rechner (Im Docker Container)
In den Container springen:
sudo docker exec -it <containerID> /bin/bash
Public Key des FHEM users auf das Zielsystem kopieren (hier kommt zunächst noch eine Passwortabfrage):
ssh-copy-id -i /opt/fhem/.ssh/id_rsa.pub <Neuer Benutzer>@<IP des Remote Rechners>
Testen der passwortlosen SSH Verbindung (immer noch im Docker Container):
ssh '<Neuer Benutzer>@<IP des Remote Rechners>'
Jetzt kam bei mir wieder die Passwortabfrage. Das lag aber daran, dass ich im Container als root angemeldet war.
Wenn man mit su fhem zum fhem user wechselt und den Befehl erneut ausführt, geht es ohne Passwort.
Zitat von: P.A.Trick am 31 Januar 2022, 07:02:37
Du kannst auch SSH vom Host verwenden und dich dann auf den Docker Container verbinden. Dann sparst du dir das ssh Geraffel im Container.
Beispiel findest du hier:
Interessante Info, aber ReneR1986 ging es doch um die andere Richtung? Also nicht rein per ssh in den Container, sondern raus aus dem Container :)
Ja genau,
per SSH raus aus dem Container in dem FHEM läuft.