Systemd: Homebridge Status und Neustart in FHEM?

Begonnen von maddhin, 14 Oktober 2017, 06:53:02

Vorheriges Thema - Nächstes Thema

maddhin

Hi,

im Wiki gibts ja ne gute Anleitung wie man Homebridge mit FHEM starten/stoppen und den Status sehen kann: https://wiki.fhem.de/wiki/Homebridge_Start_und_Status_in_FHEM

Nun habe ich (als Noob) FHEM&Co auf ArchLinux und Homebridge (schon) als Service laufen ("systemctl status/start/stop/restart homebridge.service").

Da ich mich weder mit Linux noch mit Programmieren noch Fhem wirklich auskenne: hat das jemand am laufen und kann mir etwas Hilfestellung geben, wie die Skripte hier zu ändern sind? Vielleicht kann jemand mal sein Skript posten, dann müsste man ja nur die Pfade anpassen:)

Lieben Dank im Voraus!

yc2k17

Hi,

das ist auch ein Punkt der mich aktuell brennend interessiert. Bei mir geht es allerdings um alexa-fhem, dass ich als Service am laufen habe. Macht ja im Prinzip keinen Unterschied.

Es scheitert auch daran, dass ich nicht weiß wie ich die systemctl Befehle in FHEM bzw. in den Alexa-FHEM dummy integriert bekomme damit ich über die Weboberfläche starten/stoppen/neustarten oder den Service abfragen kann.

Geht sicherlich irgendwie, hab nur keine Ahnung wie ich es umsetzen muss.

Gruß

DeeSPe

#2
Habe da was für homebridge gebastelt.

Nötig sind 2 Dinge:
ein dummy:
defmod Homebridge dummy
attr Homebridge cmdIcon restart:rc_REPEAT stop:rc_STOP status:rc_INFO start:rc_PLAY
attr Homebridge devStateIcon running:audio_play:stop stopped:audio_stop:start stopping:audio_stop .*starting:audio_repeat
attr Homebridge icon it_router
attr Homebridge setList start:noArg stop:noArg restart:noArg status:noArg
attr Homebridge userReadings status:(start|stop|restart|status) {\
  my $cmd = ReadingsVal($NAME,"state","");;\
  my $hb = $NAME;;\
  my @qx = `sudo systemctl $cmd homebridge`;;\
  my $set;;\
  if ($cmd eq "status" && @qx)\
  {\
    my $s = $qx[2];;\
    chomp $s;;\
    $s =~ s/[\r\n\t;;]/ /g;;\
    $set = "status $s";;\
    if ($s =~ /running|active/)\
    {\
      $set .= ";;setreading $hb state running";;\
    }\
    elsif ($s =~ /failed|stopped/)\
    {\
      $set .= ";;setreading $hb state stopped";;\
    }\
  }\
  elsif ($cmd eq "start" && !@qx)\
  {\
    $set = "state starting;;sleep 1;;set $hb status";;\
  }\
  elsif ($cmd eq "stop" && !@qx)\
  {\
    $set = "state stopping;;sleep 1;;set $hb status";;\
  }\
  elsif ($cmd eq "restart" && !@qx)\
  {\
    $set = "state restarting;;sleep 1;;set $hb status";;\
  }\
  elsif (@qx)\
  {\
    my $e = join " - ",@qx;;\
    chomp $e;;\
    $e =~ s/[\r\n\t;;]/ /g;;\
    $set = "error $e";;\
  }\
  fhem "setreading $hb $set" if ($set);;\
  return;;\
}
attr Homebridge webCmd start:restart:stop:status


und per "sudo visudo" im System die sudo-Rechte für den User fhem auf systemctl geben, z.B. das an das Ende schreiben oder wenn es bereits eine Zeile beginnend mit fhem gibt, diese entsprechend erweitern:
fhem    ALL=(ALL) NOPASSWD:/bin/systemctl

Nun sollte alles wie gewünscht über den Homebridge dummy zu steuern gehen.

Gruß
Dan

EDIT:
Die FILTER sind sinnlos gewesen und ich habe sie deshalb aus dem Code entfernt.

EDIT2:
Hab noch eine Veränderung vorgenommen. Nun wird der Status direkt nach start/stop/restart direkt nochmal abgefragt und dann entsprechend der aktuelle Status (stopped/running) ausgegeben.

EDIT3:
Da war noch ein Fehler im devStateIcon.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

yc2k17


DeeSPe

Zitat von: yc2k17 am 15 November 2017, 23:30:52
Funktioniert einwandfrei, danke!!!  :)

Das freut mich, so soll es sein. ;)

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Sascha_F

Hi yc2k17,

ich bin mit systemctl auch noch nicht sooo richtig gut drauf, aber habe heute zumindest meine vpnc.service und etherwake.service zum Laufen bekommen - aber darum geht's ja hier nicht direkt ;)
Es geht Dir ja darum, Alexa aus FHEM starten, etc. zu können.

Ich habe dieses bei mir in ein DOIF (mit DropDown für die Web-Oberfläche) gepackt (start/stop/restart/status):

define Alexa.DOIF DOIF ([$SELF:Aktion] eq "start") (setreading Alexa.DOIF Aktion auswählen, {system ("sudo /etc/init.d/alexa start > /dev/null 2>&1 &")})
DOELSEIF ([$SELF:Aktion] eq "stop") (setreading Alexa.DOIF Aktion auswählen, {system ("sudo /etc/init.d/alexa stop > /dev/null 2>&1 &")})
DOELSEIF ([$SELF:Aktion] eq "restart") (setreading Alexa.DOIF Aktion auswählen, {system ("sudo /etc/init.d/alexa restart > /dev/null 2>&1 &")})
DOELSEIF ([$SELF:Aktion] eq "status") (setreading Alexa.DOIF Aktion auswählen, {system ("sudo /etc/init.d/alexa status > /dev/null 2>&1 &")})
attr Alexa.DOIF do always
attr Alexa.DOIF readingList Aktion
attr Alexa.DOIF setList Aktion:auswählen,start,stop,restart,status
attr Alexa.DOIF webCmd Aktion

Status und PID (READING 'info') werden dann ja "automatisch" durch alexa-fhem in den Alexa-Dummy geschrieben.

Vielleicht hilfts Dir ja - viele Grüße
Sascha

DeeSPe

Zitat von: Sascha_F am 16 November 2017, 01:43:11
Hi yc2k17,

ich bin mit systemctl auch noch nicht sooo richtig gut drauf, aber habe heute zumindest meine vpnc.service und etherwake.service zum Laufen bekommen - aber darum geht's ja hier nicht direkt ;)
Es geht Dir ja darum, Alexa aus FHEM starten, etc. zu können.

Ich habe dieses bei mir in ein DOIF (mit DropDown für die Web-Oberfläche) gepackt (start/stop/restart/status):

define Alexa.DOIF DOIF ([$SELF:Aktion] eq "start") (setreading Alexa.DOIF Aktion auswählen, {system ("sudo /etc/init.d/alexa start > /dev/null 2>&1 &")})
DOELSEIF ([$SELF:Aktion] eq "stop") (setreading Alexa.DOIF Aktion auswählen, {system ("sudo /etc/init.d/alexa stop > /dev/null 2>&1 &")})
DOELSEIF ([$SELF:Aktion] eq "restart") (setreading Alexa.DOIF Aktion auswählen, {system ("sudo /etc/init.d/alexa restart > /dev/null 2>&1 &")})
DOELSEIF ([$SELF:Aktion] eq "status") (setreading Alexa.DOIF Aktion auswählen, {system ("sudo /etc/init.d/alexa status > /dev/null 2>&1 &")})
attr Alexa.DOIF do always
attr Alexa.DOIF readingList Aktion
attr Alexa.DOIF setList Aktion:auswählen,start,stop,restart,status
attr Alexa.DOIF webCmd Aktion

Status und PID (READING 'info') werden dann ja "automatisch" durch alexa-fhem in den Alexa-Dummy geschrieben.

Vielleicht hilfts Dir ja - viele Grüße
Sascha

Danke für den Beitrag Deines Codes.
Allerdings wurde im Titel des Beitrags ausdrücklich nach systemd und nicht nach initd gefragt. ;)

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

maddhin

Genial, genau das habe ich gesucht!! Herzlichen Dank!

Zwei Tipps:

   1. Wer den Code nicht direkt in die fhem.cfg kopiert muss etwas aufpassen: Ich hatte die Sachen manuell eingegeben, dann muss man aber die ";;\" am Ende der Zeile bei UserReadings entfernen. Sonst geht es nicht (Fehler: Error evaluating Homebridge userReading status: Experimental aliasing via reference not enabled at (eval 456) line 2.).
   2. Ich habe die devStateIcon zu running:rc_dot@green:stop stopped:rc_dot@red:start stopping:audio_stop .*starting:audio_repeat geändert. Das gibt einen fetten grünen Punkt für "running" und einen fetten roten, wenn HB "stop" ist. Geschmackssache, aber ich will das Ganze auch noch für MQTT & Co machen, dann hat man eine schöne Übersicht.


Nochmal: super Anleitung, hat mir sehr geholfen und hätte ich selbst nicht hinbekommen! Sollte ins Wiki!

DeeSPe

Zitat von: maddhin am 17 November 2017, 08:11:25
   1. Wer den Code nicht direkt in die fhem.cfg kopiert muss etwas aufpassen: Ich hatte die Sachen manuell eingegeben, dann muss man aber die ";;\" am Ende der Zeile bei UserReadings entfernen. Sonst geht es nicht (Fehler: Error evaluating Homebridge userReading status: Experimental aliasing via reference not enabled at (eval 456) line 2.).

Der Code ist nicht für die fhem.cfg, denn darin sollte niemand manuell herumfuhrwerken, sondern für einen Code-Import über eine "Raw Definition".

Die devStateIcon sind natürlich Geschmackssache.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

maddhin

Zitat von: DeeSPe am 17 November 2017, 10:46:09
Der Code ist nicht für die fhem.cfg, denn darin sollte niemand manuell herumfuhrwerken, sondern für einen Code-Import über eine "Raw Definition".

Ups! Wieder was gelernt, "Raw Definition" kannte ich noch nicht!

Hatte das alles - wegen "nicht in fhem.cfg werkeln!" - manuell gemacht. Raw Definition ist natürlich wesentlich einfacher. Vielleicht noch ein EDIT4 in deinem Beitrag?  ;D

maddhin

hierzu nochmal eine weiterführende Frage:

Ich plane FHEM, Homebridge, Mosquitto, etc. in eigene Docker Container zu packen. Könnte bzw. wie könnte ich das UserReading so umbauen, dass das dann immernoch funktioniert?

DeeSPe

Zitat von: maddhin am 17 November 2017, 13:49:30
hierzu nochmal eine weiterführende Frage:

Ich plane FHEM, Homebridge, Mosquitto, etc. in eigene Docker Container zu packen. Könnte bzw. wie könnte ich das UserReading so umbauen, dass das dann immernoch funktioniert?

Passwordless SSH wäre dann das Zauberwort!
Und dann:
my @qx = `sudo systemctl $cmd homebridge`;
ändern in:
my @qx = `ssh user@deine.ip.local 'sudo systemctl $cmd homebridge'`;

Wenn Du Dich als root per SSH anmeldest, dann kannst Du das sudo auch weglassen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Wernieman

1. wenn docker auf dem gleichen Server liegt, könntest Du fhem in die Docker-Gruppe legen und den Container "rebooten" ....

2. Ihr kennt /etc/sudoers.d ?
Es ist besser, Ergänzungen zu sudoers dort hineinzulegen anstatt die soders selber zu editieren. Ist "updatefester" ;o)

- 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

maddhin

Zitat von: DeeSPe am 17 November 2017, 14:00:24
Passwordless SSH wäre dann das Zauberwort!
Und dann:
my @qx = `sudo systemctl $cmd homebridge`;
ändern in:
my @qx = `ssh user@deine.ip.local 'sudo systemctl $cmd homebridge'`;


Super & lieben Dank, Dan, werde das in den nächsten Tagen probieren!!

DeeSPe

Zitat von: Wernieman am 17 November 2017, 14:03:01
2. Ihr kennt /etc/sudoers.d ?
Es ist besser, Ergänzungen zu sudoers dort hineinzulegen anstatt die soders selber zu editieren. Ist "updatefester" ;o)

Ich dachte "visudo" wäre auch "updatefest"... ???

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

maddhin

Zitat von: Wernieman am 17 November 2017, 14:03:01
1. wenn docker auf dem gleichen Server liegt, könntest Du fhem in die Docker-Gruppe legen und den Container "rebooten" ....

ist für mich im Moment noch Chinesisch :) Im Grunde will ich ja Homebridge, MQTT, etc. in getrennten Containern haben, so dass ich sie auf getrennten Servern laufen lassen kann aber insbesondere auch damit ich das System schnell wiederherstellen kann. D.h. eigentlich sind dann alle "Teile" nur über separate IPs zu erreichen, oder?

Praktisch gesehen, werden alle Container auf dem gleiche RPI laufen. Muss mich aber erst in Docker reinfuchsen, kenne mich praktisch noch 0 damit aus - daher ja auch die Frage hier, wie das am Geschicktesten anzustellen ist;)

Wernieman

a) Bezüglich visudo und updatefster:
vusido macht eine Syntaxprüfung. Mit updatefster meinte ich aber ein update des Systemes. (z.B. apt-get upgrade)
Mit visudo kannst Du auch Dateien unter /etc/sudoers.d/xxx bearbeiten:
visudo -f  /etc/sudoers.d/xxx[/code

b) bezüglich docker auf Pi:
Läuft super und Doku ist richtig einfach (finde ich). Docker hat selber relativ gute Tutorials .... allerdings auf English.
- 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

maddhin

Zitat von: Wernieman am 17 November 2017, 14:25:23
b) bezüglich docker auf Pi:
Läuft super und Doku ist richtig einfach (finde ich). Docker hat selber relativ gute Tutorials .... allerdings auf English.

klingt sehr gut und so denke ich mir das;) Nur der Umzug von FHEM in den Container wird ggf. noch etwas tricky. Aber im Grund ist das ja nur copy & paste. Mit etwas Glück lauft die Sache am Sonntagabend!

Wernieman

Wenn Du auf docherhub guckst, gibt es sogar schon viele fertige Container ... ;o)
- 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

maddhin

Zitat von: Wernieman am 17 November 2017, 15:58:15
Wenn Du auf docherhub guckst, gibt es sogar schon viele fertige Container ... ;o)

Ja, ich bin nur wegen Calibre (deb Pakete immer veraltet) und Mosquitto (Probleme mit Stretch) auf ArchLinux umgestiegen und bin nun am Überlegen, die jeweiligen Container selbst zu basteln (wenn es kein Arch Container gibt) - nach dem Motto: wieso einfach, wenn es auch kompliziert geht... :)

Ob das wirklich Sinn macht, weiß ich (noch) nicht. Werde mich Stück für Stück da reinarbeiten bis FHEM & Co in die neuen Container umgezogen ist... Fange am WE mal mit Homebridge und Mosquitto an.

Wernieman

Zitat(wenn es kein Arch Container gibt)

Das ist eigentlich der falsche Ansatz. Die Idee von Containern ist eigentlich die Betriebsystemunabhängigkeit. Warum sollte aucgh der Container einem Bestimmten Betriebsystem zugehörig sein, wenn er nur dazu dient, einen (1!) Dienst zu starten?
- 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

rohlande

Hallo Zusammen,

ich Starte / Stoppe / Restarte meinen PLEX Media Server auf einem Debian so:

dummy list:
Internals:
   NAME       SW_PlexMediaServer
   NR         611
   STATE      stop
   TYPE       dummy
   READINGS:
     2017-11-17 19:10:16   state           stop
Attributes:
   group      Schalten_Dienste
   icon       rc_BACK
   room       Wohnzimmer
   setList    start stop restart
   webCmd     start:stop:restart


DOIF:
Internals:
   DEF        ([SW_PlexMediaServer:state] eq "start")
({ system("sudo service plexmediaserver start ") })
DOELSEIF
([SW_PlexMediaServer:state] eq "stop")
({ system("sudo service plexmediaserver stop ") })
DOELSE
([SW_PlexMediaServer:state] eq "restart")
({ system("sudo service plexmediaserver restart ") })
   NAME       SW_PlexMediaServer_doif
   NR         612
   NTFY_ORDER 50-SW_PlexMediaServer_doif
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2017-11-17 19:10:16   Device          SW_PlexMediaServer
     2017-11-17 19:10:17   cmd             2
     2017-11-17 19:10:17   cmd_event       SW_PlexMediaServer
     2017-11-17 19:10:17   cmd_nr          2
     2017-11-17 19:10:16   e_SW_PlexMediaServer_state stop
     2017-11-17 19:10:17   error           { system("sudo service plexmediaserver stop ") }: -1
     2017-11-17 19:10:17   state           cmd_2
   condition:
     0          ReadingValDoIf($hash,'SW_PlexMediaServer','state') eq "start"
     1          ReadingValDoIf($hash,'SW_PlexMediaServer','state') eq "stop"
   devices:
     0           SW_PlexMediaServer
     1           SW_PlexMediaServer
     all         SW_PlexMediaServer
   do:
     0:
       0          { system("sudo service plexmediaserver start ") }
     1:
       0          { system("sudo service plexmediaserver stop ") }
     2:
       0          [SW_PlexMediaServer:state] eq "restart"
       1          { system("sudo service plexmediaserver restart ") }
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   itimer:
   readings:
     0           SW_PlexMediaServer:state
     1           SW_PlexMediaServer:state
     all         SW_PlexMediaServer:state
   regexp:
     all:
   state:
     STATE:
Attributes:
   group      FKT_Schalten
   room       Zentrale


Rechte für FHEM auf dem Host vorausgesetzt!
Dafür folgendes befolgen: http://www.ueberueck.com/index.php/fhem-hausautomatisierung/fhem-how-to-s/raspberry-aus-fhem-neu-starten
Das sollte auch für andere Dienste gehen!

VG Denny
HostSystem: Synology DS918 | FHEM im Docker Version: 6.0-s22528_v2.2.4 (dedizierte IP Adresse) | MQTT_Broker auf DS918 NAS | MQTT_FHEM | TASMOTA_DEVICE | SSChatBot | SSCam | LaMetric | FBAHAHTTP | CUL | SONOS | HUEBridge (deCONZ) Zigbee | FB_CALLMONITOR | InfluxDBLogger

DeeSPe

Weil's vielleicht auch für die Steuerung anderer Dienste interessant sein kann, habe ich das mal in ein Modul gegossen.
Vielleicht mag's ja mal jemand testen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe