Python Skript mit FHEM ausführen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen

    Ich versuche schon sehr lange, mit FHEM ein Python Skript auszuführen, hat aber bisher nicht funktioniert.
    Hat das jemand von euch schon mal geschafft?

    Auch mit diesem Tutorial hats nicht funktioniert:
    http://www.fhemwiki.de/wiki/Raspberry_Pi:_GPIOs_schalten

    Code
    define act_door notify door:open  { system("sudo test.sh&") }


    Auch nicht wenn ich /home/pi/test.sh angebe. Und habe es noch nach /usr/sbin/.. kopiert und probiert. Zudem habe ich noch alle mögliche Syntax versucht, unter anderem eine, die ich in einem Forum gesehen habe und bei der gesagt wurde, dass es funktioniert hat:

    Code
    define act_door notify door:open {system('sudo /opt/fhem/elro_1_off.sh&');;}


    http://forum.fhem.de/index.php/topic,17613.0.html

    Das hat aber alles nicht geklappt.. :-/
    Kann mir da jemand weiter helfen? Ich wäre sehr dankbar

    Das einzige was funktioniert hat war:

    Code
    define act_door notify door:open  {Log 1, "Test"}
  • Ich weiss jetzt ehrlich gesagt nicht, was du genau willst. Warum willst du ein Perl Programm mit Python aufrufen und nicht mir ``perl blabla.pl``? Ansonsten schau dir das ``subprocess`` Modul in der Standardbibliothek von Python an.

    Edit:

    hab's geschnallt. Das ist aber eigentlich eine Perl Frage. ggf. gibt es in Perl auch so was wie ``subprocess.call()``

    vielleicht hilft dir das weiter:
    http://stackoverflow.com/questions/6340…cript-from-perl
    http://stackoverflow.com/questions/8659…-script-in-perl

  • Code
    system("sudo /opt/fhem/elro_1_off.sh &")}

    So geht es!

    Aber noch 2 Fragen:

    1. Wieso heißt dein Programm elro_1_off.sh Zur Ordnung solltest du ein py als Dateiendung nehmen, damit du auch in zwei Jahren noch erkennst, dass es sich um ein Pythonprogramm handelt, .sh nimmt man für Bash-Skripte :)

    2. Hast du beim Skript eine SheBang-Zeile eingetragen? Das ist wichtig, damit dein Terminal erkennt, mit welchem Compiler das Programm ausgeführt werden muss

  • Super, vielen Dank für eure Hilfe, bootsmann und DeadRabbit.:danke_ATDE:

    Die Seite mit dem Stack overflow hat mir leider nicht weiter geholfen, aber danke für diesen Hinweis!

    Also ich habe das von DeadRabbit versucht, aber mit

    Code
    system("sudo /home/pi/test.sh &")}


    und auch

    Code
    system("sudo /home/pi/test.py &")}


    weil ich die Datei nicht abspeichern kann unter /opt/fhem/test.sh.
    Hat aber beides leider nicht funktioniert..

    Beim Versuch, es Abzuspeichern in /opt/fhem/... bekomme ich den error:
    Permission denied!
    Wäre das wichtig dass es dort rein kommt?

    Und ja ich habe die Shebang Zeile habe eingefügt

    Python
    #!/usr/bin/python


    Ich habe das Bash-Skrpit verwendet, weil ich gedacht habe dass es nur mit dem funktioniet, und nicht mit einem Python Skript.. Das Python Skript wird dann in diesem Bash Skript aufgerufen.

  • Hallo,


    Beim Versuch, es Abzuspeichern in /opt/fhem/... bekomme ich den error:
    Permission denied!
    Wäre das wichtig dass es dort rein kommt?


    In `opt` brauchst du es eigentlich nur legen, wenn das Skript systemweit (=für alle Benutzer) verfügbar sein soll. Sonst kannst du es auch in Homeverzeichnis speichern, zum Beispiel.

    Zitat

    Ich habe das Bash-Skrpit verwendet, weil ich gedacht habe dass es nur mit dem funktioniet, und nicht mit einem Python Skript.. Das Python Skript wird dann in diesem Bash Skript aufgerufen.


    Das wäre aber ziemlich kompliziert ;)

    Wenn die (das?) Shebang gesetzt ist und die Datei das Dateiattribut "ausführbar" hat, kann du jedes Skript-Datei (Python, Perl, Ruby usw.) direkt ausführen. Und selbst ohne Shebang und ausführbar kannst du jede (lesbare) Python-Datei mit `python mein_skript.py` ausführen.

    Gruß, noisefloor

    Einmal editiert, zuletzt von noisefloor (30. März 2015 um 19:30)

  • Danke für die Tipps noisefloor! Ich hab gedacht vom notify des FHEM aus lassen sich nur Bash skripte ausführen, weil sonst alle versuche gescheitert sind ein Python skript auszuführen.. Ja wäre wirklich kompliziert :)

    Also ich kann das Skript in der Konsole ausführen und es funktioniert. Aber wenn ich das folgende im FHEM WebInterface in die Kommandozeile eingebe

    Code
    {system("sudo /home/pi/test.py &")}


    wird nur eine -1 angezeigt..

    Das Skript sieht so aus:

  • Die test.py lässt sich nicht ausführen, und das sollte auch eigentlich nicht in der Konsole gehen.

    mach mal ein

    Code
    sudo chmod +x /home/pi/test.py


    Die "-1" ist richtig so, damit bekommst du angezeigt, dass der Code ausgeführt wird!
    Das sagt aber halt noch nichts darüber aus, dass der Code auch ausgeführt werden kann ;)

    Wenn die Datei ausführbar gemacht wurde, sollte es dann endlich gehen ;)

  • Danke noisefloor, wenn ich das ohne sudo eingebe, kommt folgender error

    Traceback (most recent call last):
    File "test.py", line 16, in <module>
    write()
    File "test.py", line 12, in write
    file = open("/home/pi/testing.pkl","wb")
    IOError: [Errno 13] Permission denied: '/home/pi/testing.pkl'

    :(

    Also könnte das der Fehler sein?
    Aber wenn ich doch im Perl code "sudo" auch eingebe, sollte das doch funktionieren?

    ok habe das

    Code
    sudo chmod +x /home/pi/test.py


    eingegeben im Terminal, danach nochmals

    Code
    define act_door notify door:open  { system("sudo /home/pi/test.py &")}


    eingegeben im der FHEM Kommandozeile..

    bisher funktioniert aber nichts.. ich kann die testing.pkl datei auslesen, aber es steht nie die neue zeit drin.. :s

    Einmal editiert, zuletzt von Virginia (30. März 2015 um 20:29)

  • Hallo,

    DeadRabbit: `python test.py` braucht kein `x`, da reicht `r` völlig aus.

    @Virgina: du bist doch als Benutzer `pi` am Raspi angemeldet, oder?

    Weil
    [code=php]-rw-r--r-- 1 fhem pi 284 Mar 30 08:53 /home/pi/test.py[/php]
    sagt, dass die Datei Benutzer `fhem` gehört - und der hat in `/home/pi` wahrscheinlich keine Schreibrechte...

    `file = open("/home/pi/testing.pkl","wb")` löscht übrigens eine vorhandene Datei und legt diese neu an (Link). Wenn du neue Daten an die Datei anhängen willst, dann musst du `"wb+"` schreibe.

    Gruß, noisefloor

  • Wirklich nochmals vielen Dank für eure Geduld, ich wüsste mir sonst nicht mehr zu helfen..

    Ja ich bin über den PC am Raspberry als Benutzer pi angemeldet..
    Das soll schon so sein oder?
    Also muss ich irgendwie noch die Schreibrechte bearbeiten dass FHEM das ausführen darf?

    Und danke noch noisefloor für den Tipp mit dem wb+

  • Hast recht, noisefloor, aber da er im Skript mit SheBang arbeitet, wird das python als Befehl ja nicht benötigt ;)
    Daher die Rechte zum Ausführen.

    Aber nun nochmal Stück für Stück...

    Wenn du

    Code
    sudo /home/pi/test.py

    eingibst, schreibt er die Werte in die Datei?
    Die Pickle-Datei ist im pi-Ordner, also darf nur root(sudo) bzw pi in dieser Datei schreiben. Daher die Fehlermeldung oben.
    Darum würde ich mich kümmern, wenn es funktioniert.
    Zum Testen ist sudo meiner Meinung nach voll ok, Sicherheit ist nachher ein Klacks ;)

    Mach doch erstmal, um zu Testen, einen Dummy-Eintrag in deiner fhem.cfg:

    Code
    define Test dummy
    attr Test setList on off
    
    
    define off_Test notify Test:off {system("sudo /home/pi/test.py &")}
    
    
    define on_Test notify Test:on {system("sudo /home/pi/test.py &")}

    Damit kannst du dann wenigstens mal Testen ob der Aufruf funktioniert.
    Wenn das geht, hast du einen Fehler bei deinem Türschalter drinne

  • Danke noisefloor, das war ein sehr nützlicher Link! :)

    DeadRabbit: Danke auch erstmal.
    Ja die Eingabe sudo /home/pi/test.py funktioniert. Da werden die Werte rein geschrieben.

    Ich habe den Test dummy eingegeben und getestet, aber das Skript wird nicht aufgerufen..
    Das wäre vom Testzweck her das gleich wie:

    Code
    define act_door notify door:open  {Log 1, "Test"}


    oder? Das hat nämlich einwandfrei funktioniert. Also das notify erkennt den Sensor..

    Hast du noch eine Idee was ich noch testen könnte? Die Syntax stimmt deiner Meinung nach auch oder? Ich hab da schon etliche Varianten durch probiert..


    @ noisefloor: Also die Ausgabe sieht nun so aus:

    Code
    1342 4 -rwxr-xr-x 1 fhem pi 284 Mar 30 08:53 /home/pi/test.py

    Somit sollten alle die Datei ausführen dürfen, wenn ich das richtig sehe.

    Mein Skript reagiert aber leider immer noch nicht auf das notify door:open.. :wallbash:


    Habt ihr eine Idee was ich noch überprüfen könnte?
    Es ist grad zum Mäuse melken..

    Einmal editiert, zuletzt von Virginia (30. März 2015 um 22:58)

  • Sodele, hast du den Dummy mal eingetragen und getestet, ob du damit dein Skript starten kannst?

    Außerdem würde ich ganz gerne mal den ganzen Teil deiner Config sehen....
    Diese eine Zeile macht ja nun nicht wirklich was, sondern wird von dem door Event aufgerufen...

    Aber bitte mal als Erstes jetzt den Dummy testen

  • Hallo und willkommen zurück DeadRabbit :)

    Ja ich habe den Dummy eingetragen und getestet, aber der konnte das Skript nicht ausführen..


    also ich hab dir hier mal meine fhem.cfg:


    attr global autoload_undefined_devices 1
    attr global logfile ./log/fhem-%Y-%m.log
    attr global modpath .
    attr global motd SecurityCheck:\
    \
    WEB,WEBphone,WEBtablet has no basicAuth attribute.\
    telnetPort has no password/globalpassword attribute.\
    \
    Restart fhem for a new check if the problem is fixed,\
    or set the global attribute motd to none to supress this message.\

    attr global statefile ./log/fhem.save
    attr global updateInBackground 1
    attr global userattr devStateIcon devStateStyle icon sortby webCmd
    attr global verbose 3

    define telnetPort telnet 7072 global

    define WEB FHEMWEB 8083 global
    attr WEB stylesheetPrefix darksmallscreen

    define WEBphone FHEMWEB 8084 global
    attr WEBphone stylesheetPrefix smallscreen

    define WEBtablet FHEMWEB 8085 global
    attr WEBtablet stylesheetPrefix touchpad

    # Fake FileLog entry, to access the fhem log from FHEMWEB
    define Logfile FileLog ./log/fhem-%Y-%m.log fakelog

    define autocreate autocreate
    attr autocreate filelog ./log/%NAME-%Y.log

    define eventTypes eventTypes ./log/eventTypes.txt

    # Disable this to avoid looking for new USB devices on startup
    define initialUsbCheck notify global:INITIALIZED usb create
    define TCM310_0 TCM 310 /dev/ttyUSB0@57600
    define FileLog_door1 FileLog ./log/door1-%Y.log door1
    attr FileLog_door1 logtype text
    attr FileLog_door1 room EnOcean
    define window1 EnOcean 018EF3C9
    attr window1 room EnOcean
    attr window1 subType contact
    define FileLog_window1 FileLog ./log/window1-%Y.log window1
    attr FileLog_window1 logtype text
    attr FileLog_window1 room EnOcean
    define act_on_door1 notify door1:open { if ("$EVENT" eq "open") { system("sudo python test.py") }
    define door1 EnOcean 018C5FE1
    attr door1 room EnOcean
    attr door1 subType contact
    define FileLog_EnO_contact_018C5FE1 FileLog ./log/EnO_contact_018C5FE1-%Y.log EnO_contact_018C5FE1
    attr FileLog_EnO_contact_018C5FE1 logtype text
    attr FileLog_EnO_contact_018C5FE1 room EnOcean


    Ich hab eigentlich mehrmals act_on_door1 gelöscht mit delete act_on_door1

    Aber die steht immer noch im der Configdatei drin? sollte die nicht gelöscht werden?
    Und wenn ich neue eingebe, werden die nicht da drin gespeichert?
    Könnte das der Fehler am ganzen sein?

    Einmal editiert, zuletzt von Virginia (31. März 2015 um 14:09)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!