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