[GELÖST]Shell/Python Script ausführen (via Dummy / system{})

Begonnen von thomka, 16 Dezember 2013, 22:05:47

Vorheriges Thema - Nächstes Thema

hellspawn0815

#30
Moin zusammen!

Hab mich hier extra registriert um mal Feedback zu geben ;D Danke zunächst mal an alle, mit euch habe ich es zum laufen bekommen.

Bei mir hat es mit folgenden Änderungen geklappt:


  • Den Benutzer fhem habe ich nicht der Gruppe root hinzugefügt, wie es thomka beschrieben hatte. Ich habe da ähnliche bedenken wie Wernieman. Ich habe stattdessen den Benutzer fhem der Gruppe gpio hinzugefügt. Dieser Gruppe muss man angehören wenn man unter /sys/class/gpio die Pins steuern will. Und da mit der fhem.cfg der Benutzer fhem versucht die GPIOs zu steuern, braucht der halt Zugriffsrechte. Dafür zum root werden, die Datei editieren, dort den bestehenden "gpio"-Eintrag suchen und dahinter ein ",fhem" ohne "") dranhängen
sudo nano /etc/group
   gpio:x:997:pi,fhem      << nur ",fhem" (ohne "") anhängen!! Dann speichern und schließen
reboot

  • Ich musste die /etc/sudoers verändern. Aber nicht so wie es thomka beschrieben hatte. Bei mir hat es gereicht den Benutzer fhem genauso einzurichten wie den Benutzer pi (Danach natürlich noch einen reboot). Bei mir sieht die Datei nun u.a. so aus:
pi ALL=(ALL) NOPASSWD: ALL
fhem ALL=(ALL) NOPASSWD: ALL

  • Meine fhem.cfg-coding sieht so aus (Man beachte: Für den Python-Aufruf benötige ich kein sudo):
# Muss einmal definiert werden, kA warum
attr global userattr webCmd

# Lichtleiste
define Lichtleiste dummy
attr Lichtleiste room Arbeitszimmer
attr Lichtleiste webCmd on:off
define sw_ll_off notify Lichtleiste:off {system('python /opt/fhem/relais.py&');;}
define sw_ll_on notify Lichtleiste:on {system('python /opt/fhem/relais.py&');;}


hellspawn0815

Ich nochmal.

Ich habe noch etwas herausgefunden. Ich habe auch ein wenig mit "echo" experimentiert und geguckt wieviele Parameter mitgegeben werden können.
define Lichtleiste dummy
attr Lichtleiste room Arbeitszimmer
attr Lichtleiste webCmd on:off
define sw_ll_off notify Lichtleiste:off {system('/opt/fhem/test.sh 1 2 3 4&');;}
define sw_ll_on notify Lichtleiste:on {system('/opt/fhem/test.sh 1 2 3 4&');;}


Die test.sh schreibt die übergebenen Parameter in eine Logdatei weg. Ergebnis: Es werden nur "1" und "2" übergeben. Ich bin der Meinung, dass die Funktion system() nur 3 Argumente aufnehmen kann. In diesem Fall wäre das erste Argument: /opt/fhem/test.sh, das zweite Argument wäre 1 und das dritte Argument 2.

Mein Script namens gpio.py benötigt um meine Pins anzusteuern 2 Parameter. Der Aufruf im Terminal läuft so:
python /opt/fhem/gpio.py 37 0
python /opt/fhem/gpio.py 37 1

In der fhem.cfg würde das so aussehen
define Lichtleiste dummy
attr Lichtleiste room Arbeitszimmer
attr Lichtleiste webCmd on:off
define sw_ll_off notify Lichtleiste:off {system('python /opt/fhem/gpio.py 37 0&');;}
define sw_ll_on notify Lichtleiste:on {system('python /opt/fhem/gpio.py 37 1&');;}

Das ist aber ein Problem, denn in der fhem.cfg bekommt die Methode system() nun insgesamt 4 Parameter übergeben.


Die Lösung ist denkbar einfach:

  • Mit dem nano in meine gpio.py rein und in der ersten Zeile dies hier eintragen:
#!/usr/bin/env python

  • Nun noch die Datei ausführbar machen:
chmod +x gpio.py
  • Jetzt kann im Terminal das Script ohne den "python"-Zusatz aufgerufen werden, nämlich so:
/opt/fhem/gpio.py 37 0
/opt/fhem/gpio.py 37 1


  • Daher kann der Aufruf in der fhem.cfg nun so aussehen:
define Lichtleiste dummy
attr Lichtleiste room Arbeitszimmer
attr Lichtleiste webCmd on:off
define sw_ll_off notify Lichtleiste:off {system('/opt/fhem/gpio.py 37 0&');;}
define sw_ll_on notify Lichtleiste:on {system('/opt/fhem/gpio.py 37 1&');;}


Jetzt klappt es auch mit dem Python-Script  ;D

sascha.m

Zitat von: hellspawn0815 am 19 Dezember 2015, 16:18:47

[/code]/opt/fhem/gpio.py 37 1[/code]

  • Daher kann der Aufruf in der fhem.cfg nun so aussehen:
define Lampe_Nepal dummy
attr Lampe_Nepal room Zimmer
attr Lampe_Nepal webCmd on:off
define sw_ll_off notify Lampe_Nepal:off {system('/opt/fhem/send_Int.py b_off&');;}
define sw_ll_on notify Lampe_Nepal:on {system('/opt/fhem/send_Int.py b_on&');;}


Hallo @hellspawn0815,
vielen Dank für deine ausführliche Beschreibgung. Ich habe mein eigenes Python Script mit den Parameteren "b_off" und "b_on" geschrieben. In Putty funktionieren die Befehle:
/opt/fhem/send_Int.py b_off
/opt/fhem/send_Int.py b_on

Leider nicht in FHEM:
FHEM_1.jpg: Der STATE steht auf "off", trotz schalten
FHEM_2.jpg: Nach dem Einfügen des define-commands in die Konsole wurden die ";;" in ein Simokilon geändert. Dieses habe ich händisch zurückgetragen Lampe_Nepal:on {system('/opt/fhem/send_Int.py b_on&');;}
Leider geht es trotzdem nicht. Der Log gibt nicht viel her:

2020.04.02 15:17:13 1: Including fhem.cfg
2020.04.02 15:17:15 3: WEB: port 8083 opened
2020.04.02 15:17:15 2: eventTypes: loaded 0 events from ./log/eventTypes.txt
2020.04.02 15:17:15 1: usb create starting
2020.04.02 15:17:15 3: Probing ZWDongle device /dev/serial1
2020.04.02 15:17:16 3: Probing CUL device /dev/ttyAMA0
2020.04.02 15:17:16 3: Probing TCM_ESP3 device /dev/ttyAMA0
2020.04.02 15:17:16 3: Probing ZWDongle device /dev/ttyAMA0
2020.04.02 15:17:16 3: Probing SIGNALDuino device /dev/ttyAMA0
2020.04.02 15:17:16 3: Probing MYSENSORS device /dev/ttyAMA0
2020.04.02 15:17:16 3: Probing ArduCounter device /dev/ttyAMA0
2020.04.02 15:17:17 3: Probing ElsnerWS device /dev/ttyAMA0
2020.04.02 15:17:18 3: Probing FRM device /dev/ttyAMA0
2020.04.02 15:17:23 1: usb create end
2020.04.02 15:17:23 0: Featurelevel: 6
2020.04.02 15:17:23 0: Server started with 6 defined entities (fhem.pl:21056/2020-01-26 perl:5.024001 os:linux user:fhem pid:630)

Hast du/habt ihr eine Idee an was das liegen könnte?

Otto123

Ich denke nur das Internal STATE wird in der Ansicht nicht aktualisiert. F5 im Browser gedrückt?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sascha.m

Hallo @Otto,
ich habe die FHEM-Seite mit f5 aktualisiert.

Leider gibt FHEM den Befehl nicht durch (oder ich habe irgendwo einen Fehler drin). Hast du noch eine Idee an was das liegen kann?

Otto123

#35
Mit der Frage kann ich wenig anfangen. Was ich sehe und glaube zu wissen:
Es ist ein Dummy
Das Reading state ist auf on, die Lampe ist on und leuchtet. Dahinter gibt es folgende Zusammenhänge:
Das Internal STATE wird von state übernommen, da kein stateFormat definiert.
Das devStateIcon wird vom Internal STATE gesetzt da nichts weiter definiert ist.

state -> STATE -> devStateIcon

Warum STATE in deinem Bild etwas anderes zeigt kann ich nicht erklären.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

@sascha:
Unabhängig davon:
Würde Dir empfehlen, als Usernamen NICHT Deine EMail zu nehmen ... das lockt Spammer an ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

sascha.m

Zitat von: Otto123 am 13 April 2020, 19:29:02
Mit der Frage kann ich wenig anfangen. Was ich sehe und glaube zu wissen:
Es ist ein Dummy
Das Reading state ist auf on, die Lampe ist on und leuchtet. Dahinter gibt es folgende Zusammenhänge:
Das Internal STATE wird von state übernommen, da kein stateFormat definiert.
Das devStateIcon wird vom Internal STATE gesetzt da nichts weiter definiert ist.

state -> STATE -> devStateIcon

Warum STATE in deinem Bild etwas anderes zeigt kann ich nicht erklären.

Gruß Otto

Hallo Otto,
der "internal state" kann mit f5 aktualisiert werden.

Mein Problem ist, dass das Pythonscript mit dem Befehl nicht funktioniert. FHEM schickt es entweder den Pythonbefehl nicht weiter ans System (im System funktioniert dieser ja) oder es fehlen noch Abhängigkeiten.

Kannst du mir da weiterhelfen?

(@werniman, danke für den Hinweis. Habe ich natürlich gleich geändert)

Otto123

Also das Problem liegt hier?:
{system('/opt/fhem/send_Int.py b_on&');;}
Das Script funktioniert, aber der Aufruf unter FHEM klappt nicht - richtig?

Der user fhem hat typischerweise keine Umgebung. Also wird er wohl das py Script gar nicht erst ausführen? Steht dazu nichts im Log?
Ich würde den Aufruf so machen:
"/usr/bin/python /opt/fhem/send_Int.py b_on"
Also ohne {system()}! Es ist wichtig die Anführungszeichen nicht wegzulassen oder so: Also deine Zeile durch meine Zeile ersetzen. So wird das Script auch nicht blockierend ausgeführt. Steht auch alles in der commandref :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

Naja .. wenn das Script in richtige Shebang Zeile hat, würde es auch ausgeführt werden ...
https://de.wikipedia.org/wiki/Shebang
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wernieman

Das und das FHEM es lesen kann, habe ich einfach mal vorrausgesetzt
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html