Dienstag, 1. August 2017

Raspberry ausschalten mit FHEM

Man kann den Raspberry einfach so vom Strom ziehen - aber schön ist das nicht!
Wenn man schon FHEM drauf hat, kann man sich auch einen Ausschaltknopf auf der Oberfläche machen.

Achtung: Der Raspberry kann kein WOL oder ähnliches. Aus ist Aus. Baut man das mit dem "halt"
wirklich auf die Weboberfläche muss man sich auch über einen Neustart Gedanken machen!

Als erstes muss der User fhem (der User unter dem FHEM läuft) ein reboot oder halt des Systems auch dürfen. Im raspbian kann man dafür einfach eine Textdatei im Pfad /etc/sudoers.d/ ablegen, man braucht die eigentliche sudoers Datei nicht mit visudo zu editieren (ist mittlerweile in vielen anderen Systemen Standard).
Hinweis:
Der Benutzer Pi bekommt über genau diesen Weg seine sudo Rechte, einfach mal anschauen:
sudo cat /etc/sudoers.d/010_pi-nopasswd

Rechte für User fhem setzen

Wie immer mache ich das gern mit einem Script (welches mit sudo ausgeführt werden muss):
#!/bin/bash
# ergänze eine Datei zum sudoers Script Verzeichnis /etc/sudoers.d/
File="011_fhem-nopasswd"
echo "fhem ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/halt" >/etc/sudoers.d/$File
chmod 0440 /etc/sudoers.d/$File
Man kann den Erfolg sofort testen, aber vorher save nicht vergessen, falls man gerade in FHEM etwas geändert hat!
Wenn man in der FHEM Befehlszeile "sudo /sbin/reboot" eingibt, sollte der Raspberry jetzt neu starten. Ein umfangreiches Manual zum Syntax in der Datei findet man hier.

Bedienelemente in FHEM

Damit man einen Knopf in der Oberfläche von FHEM bekommt, kann man es analog zu diesem Beitrag machen. Dazu braucht man allerdings erstmal einen FHEM Befehl:
define s1 cmdalias reboot AS "sudo /sbin/reboot"
Das kann man wieder sofort testen, in dem man reboot in der Kommandozeile von FHEM eingibt - man muss nur aufpassen, dass dem Raspberry nicht schwindelig wird.
define Systembefehle weblink cmdList Restart:Restart-Fhem:shutdown+restart Restart:Restart-System:reboot Update:Update-Check:update+check Update:Update-Now:update Shutdown:Shutdown-System:halt
Der aufmerksame Leser hat gemerkt: hier fehlt noch etwas! Der alias für halt:
define s2 cmdalias halt AS "sudo /sbin/halt"
Optisch sieht das Ganze so aus:
Mit diesem Befehl kann man den Ausschalter auch links ins Menü packen:
attr WEB menuEntries System-Halt,/fhem?cmd=halt

Ein Script zum Einrichten

Für den ganz Eiligen habe ich hier noch alles in einem Script. Damit man das nicht erst noch ausführbar machen muss, kann man es einfach mit sudo bash <scriptname> starten
#!/bin/bash
# System Befehle für FHEM
File="011_fhem-nopasswd"
echo "fhem ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/halt" >/etc/sudoers.d/$File
chmod 0440 /etc/sudoers.d/$File
perl /opt/fhem/fhem.pl 7072 '
define s1 cmdalias reboot AS "sudo /sbin/reboot"
define s2 cmdalias halt AS "sudo /sbin/halt"
define Systembefehle weblink cmdList Restart:Restart-Fhem:shutdown+restart Restart:Restart-System:reboot Update:Update-Check:update+check Update:Update-Now:update Shutdown:Shutdown-System:halt
attr WEB menuEntries System-Befehle,/fhem?detail=Systembefehle
save
'

Kleiner Makel

Beim Restart von FHEM (und damit auch beim Restart System) ist danach der csrf Token vom Link nicht mehr gültig. Der Kontakt von FHEM kehrt also nicht allein zurück. Mit der zurück taste im Browser geht es wieder ins Menü.

Inhalt der sudoers Datei

Die durch Komma getrennten Werte in der Datei haben folgende Bedeutung und benötigen immer den vollen Pfad!

/usr/sbin -> für alles im Verzeichnis
/usr/sbin/service * -> für alle Parameter
/usr/sbin/service apache2 * -> für alle weiteren Parameter
/usr/sbin/service apache2 reload -> genau nur hierfür

Der Aufruf in FHEM muss dann genau dem Schema entsprechen:
"sudo /usr/sbin/service apache2 reload"

22 Kommentare:

  1. gefällt mir sehr gut ich habe es noch erweitert um den befehl backup aber wie bekomme ich ein icon davor bei mir steht dort nur backup
    danke

    AntwortenLöschen
    Antworten
    1. Die Icons stehen im Weblink:
      define ... weblink cmdList Restart:Restart-Fhem:shutdown+restart ...
      quasi iconName:Beschriftung:Befehl

      Löschen
  2. Hi,

    warum wird der halt Befehl genutzt und nicht der shutdown Befehl?

    Wenn das File angelegt werden sollte, gab es einen "Permission denied" Fehler.
    Ich habe den Ordner /etc/sudoers.d deshalb die Rechte 777 gegeben. Dann das File erstellt und danach dierechte wieder auf 755 gestellt (755 hatte der Ordner per Default).
    Nun bekomme ich fast bei jeder Eingabe im Terminal die Meldung "sudo: /etc/sudoers.d/011_fhem-nopasswd is owned by uid 1000, should be 0".
    Was habe ich falsch gemacht und sollte ich jetzt machen?
    Bitte für einen Linux Anfänger erklären.
    Danke!

    AntwortenLöschen
    Antworten
    1. Hi, halt / shutdown viele Wege führen zum ausschalten. Hängt auch von der Implementierung vom System ab. Halt schaltet mW nicht aus, das kann der Pi aber sowieso nicht.
      Das angegeben Script für die Erzeugung der Datei 011_fhem-nopasswd muss muss im sudo Kontext ausgeführt werden. Also bei Eingabe der einzel Befehle erst sudo su ausführen. Ich habe das oben ergänzt.
      Also bitte den Versuch löschen und neu machen.
      Gruß Otto

      Löschen
  3. Hi,

    sudo su hat funktioniert.
    Ich habe das File gelöscht und nach sudo su die Befehle nochmal ausgeführt.
    Datei ist erstellt und die Fehlermeldung ist weg.
    Danke!

    AntwortenLöschen
  4. Hallo ich habe das gemacht, nun habe ich keine rechte mehr, also sudo, nur noch mal pi, was tue ich jetzt?

    AntwortenLöschen
    Antworten
    1. Ich weiß nicht was Du gemacht hast. So ist es schwer dazu etwas zu sagen.

      Löschen
  5. Hallo Otto,
    wir haben oft im FHEM Board miteinander zu tun gehabt, glaube aber das meine Frage hier besser passt. Heute bin ich hier über deinen Blog gestolpert, weil ich ein Programm aus FHEM starten möchte und FHEM dabei hängen bleibt. Reboot, shutdown alles funktioniert aus FHEM heraus.
    Ich möchte mit folgendem Befehl die Abfrage meiner Fahrzeugdaten bei weconnect starten:
    { system ('sudo weconnect-mqtt --mqttbroker 192.168.###.## --netrc .netrc')}
    Danach hängt FHEM und läßt sich nur noch über Putty rebooten. Die direkte Eingabe im Putty Terminal unter /home/pi/ mit dem Befehl funktioniert und FHEM läuft weiter.
    Wie bekomme ich das hin, das ich über FHEM den Befehl, ohne das FHEM hängen bleibt, abgesetzt bekomme?
    Gruß
    Norbert aus Köln

    AntwortenLöschen
    Antworten
    1. Hallo Norbert, wobei diese Plattform hier schwer für Support zu gebrauchen ist. Zu Deiner Frage habe ich zwei Idee, wobei ein system() Aufruf FHEM eigentlich nicht blockieren sollte.
      1. verwende anstatt {system()} direkt einen FHEM Aufruf "sudo weconnect-mqtt --mqttbroker 192.168.###.## --netrc .netrc" - mit den Anführungszeichen so direkt als FHEM Befehl.
      2. Kann Dein User fhem denn sudo?
      Gruß Otto

      Löschen
  6. Als Antwort erhalte ich:
    Unknown command sudo, try help.

    AntwortenLöschen
    Antworten
    1. Dann hast Du die Anführungszeichen weggelassen.

      Löschen
    2. siehe auch https://fhem.de/commandref_modular_DE.html#command

      Löschen
  7. Ja, du hast recht, wenn ich das mit Anführungszeichen mache geht es. Wenn ich das aber in mein notify packe, gehts nicht mehr
    { if (Value("Raspi_weconnect_remote_dummy") eq "Ein") { fhem ("sudo weconnect-mqtt --mqttbroker 192.168.###.## --netrc .netrc")}}
    Auch wenn ich die inneren Klammern weglasse oder statt Anführungszeichen das -> ' <- verwende, gehts auch nicht.

    AntwortenLöschen
    Antworten
    1. Im Perl musst Du die Anführungszeichen vom FHEM Befehl schützen. { fhem ("\"sudo weconnect-mqtt --mqttbroker 192.168.###.## --netrc .netrc\"")}

      Löschen
  8. Funktioniert 100%ig, macht kein Error, weconnect geht und vor Allem, FHEM hängt nicht mehr. Ich bin begeistert. Das du sowas weiß ist genial, erst habe ich gedacht es sei ein Schreibfehler mit den "\" vorne und hinten so \"" , aber das ist so richtig. Ich finde das klasse, das du sowas auch weitergibst. Ich hätte das Projekt nicht gelöst bekommen ohne dein Unterstützung.
    Danke aus "Kölle"
    Norbert

    AntwortenLöschen
    Antworten
    1. Auf dem "Test Raspi" läuft es wie oben erwähnt wunderbar. Jetzt habe ich das weconnect Projekt, wie beim Test Raspi auf dem "Haupt Raspi", der die gesamte haussteuerung bewerkstelligt, 1zu1 installiert.
      Alles funktioniert solange ich die Eingabe im /home/pi/ Verzeichniss mache, aber FHEM will wieder nicht. In der Eingabezeile von FHEM die System Variante und die Gänsefüsschen Variante probiert. keine Fehlermeldung, keine Reaktion. Sudoers und sudoers.d müssen ok sein, da shutdown und reboot einwandfrei funktionieren. Wie kann man anhand eines LOGs vielleicht feststellen wo es hängt? oder hast du eine Idee wie man dahinter kommt?
      Gruß
      Nobbi

      Löschen
    2. Nachtrag:
      wenn ich den Aufruf mit sudo starte steht folgendes im Fhem LOG File:
      weconnect-mqtt: Kein Prozess gefunden
      sudo: weconnect-mqtt: Befehl nicht gefunden

      Lasse ich sudo weg, steht das im Fhem LOG:
      sh: 1: weconnect-mqtt: Permission denied
      weconnect-mqtt: Kein Prozess gefunden

      Vielleicht hilft das weiter.

      Löschen
    3. Ich würde es mit dem kompletten Pfad zum weconnect-mqtt versuchen, scheinbar hat root keine Umgebung.

      Löschen
    4. die Datei steht unter /usr/local/bin und ich bin versuchsweise ins Verzeichnis /fhem und auch in /pi gegangen und habe folgendes probiert:
      in: /opt/fhem $ und in: /home/pi $
      /usr/local/bin/weconnect-mqtt --mqttbroker 192.168.###.## --netrc /home/pi/.netrc
      Es funktioniert in beiden Verzeichnissen, aber nur wenn ich die Rechte von weconnect-mqtt vorher auf 777 setze. Dann habe ich probiert, das umzusetzen in FHEM, mit und ohne Pfad, mit und ohne sudo.
      Keine Reaktion.

      Löschen
    5. was tut weconnect-mqtt ? So wie Du es beschreibst liegt es nicht an dem Aufruf sondern an dem was danach passiert. Ist das ein Script?

      Löschen
  9. Es handelt sich dabei um ein Script welches noch einige Dateien lädt.
    sieht so aus:
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    import re
    import sys
    from weconnect_mqtt.weconnect_mqtt_base import main
    if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
    Da fast alle Dateien die geladen werden im Ordner \usr\local\lib\python3.9\dist-packages/ stehen, werde ich heute abend mal nachsehen, ob da ein Unterschied bei den beiden Raspis besteht.

    AntwortenLöschen
    Antworten
    1. mit sudo -u fhem - Deinem Befehl - kannst Du auch jederzeit von der Konsole als User fhem arbeiten. Eventuell siehst Du da mehr. Noch als Idee: phyton aktualisiert aber nicht für alle user den neuen Programm Pfad gesetzt?

      Löschen