Homebridge Start und Status in FHEM: Unterschied zwischen den Versionen

Aus FHEMWiki
Zeile 34: Zeile 34:
Wenn die Homebridge nicht auf dem selben System läuft wie FHEM muss dieser Schritt auf dem Homebridge System ausgeführt werden.
Wenn die Homebridge nicht auf dem selben System läuft wie FHEM muss dieser Schritt auf dem Homebridge System ausgeführt werden.


== Start Script befüllen ==
Das nun folgende Script kann in die homebridge Datei die im Nano Editor geöffnet ist rein kopiert werden.
Achtung: Damit das Script auch seine Arbeit richtig erledigen kann, muss zwingend der User unter dem Homebridge arbeiten soll eingetragen werden.
 
Diese Stelle ist durch "User hier" gekennzeichnet. Die Anführungszeichen werden an der Stelle nicht benötigt.
'''Achtung''': die Variabeln ''homeBridgeUser'', ''fhemHost'' und ''fhemHostTelnetPort'' sind ggf. auf die eigenen Gegebenheiten anzupassen.


<source lang="bash" style="width:100%;">
<source lang="bash" style="width:100%;">
Zeile 51: Zeile 51:
export PATH=$PATH:/usr/local/bin
export PATH=$PATH:/usr/local/bin
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules
PID=`pidof homebridge`
PID=`pidof homebridge`
homeBridgeUser="fhem"
fhemHost=127.0.0.1          #FHEM Server (Masterinstanz)
fhemHostTelnetPort=7072    #TelnetPort der FHEM Instanz
fhemDefine="SYS_Homebridge"
case "$1" in
case "$1" in
start)
start)
if ps -p $PID > /dev/null 2>&1; then
if ps -p $PID > /dev/null 2>&1; then
         echo "Homebridge is already running"
         echo "Homebridge is already running"
         perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Homebridge.Status info Homebridge is already running"
         perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge is already running"
        perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge.Status on"
#      perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "set $fhemDefine on"
        perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge off"
else
else
         su - "User hier" -c "homebridge > /dev/null 2>&1 &"
         su - $homeBridgeUser -c "homebridge > /dev/null 2>&1 &"
         echo "Homebridge starting"
         echo "Homebridge starting"
        perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge starting"
perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "set $fhemDefine on"
         sleep 2
         sleep 2
$0 status
$0 status
Zeile 69: Zeile 76:
if ! ps -p $PID > /dev/null 2>&1; then
if ! ps -p $PID > /dev/null 2>&1; then
         echo "Homebridge is not running"
         echo "Homebridge is not running"
         perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Homebridge.Status info Homebridge is not running"
         perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge is not running"
         perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge.Status off"
         #perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "set $fhemDefine off"
        perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge off"
else
else
         kill $PID
         kill $PID
         echo "Homebridge closed"
         echo "Homebridge stopping"
         perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Homebridge.Status info Homebridge closed"
         perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge stopping"
         perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge.Status off"
         perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "set $fhemDefine off"
         perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge off"
         sleep 2
$0 status
fi
fi
;;
;;
Zeile 91: Zeile 98:
if ps -p $PID > /dev/null 2>&1; then
if ps -p $PID > /dev/null 2>&1; then
         echo "Homebridge is running PID $PID"
         echo "Homebridge is running PID $PID"
         perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Homebridge.Status info Homebridge running as PID $PID"
         perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge running as PID $PID"
        perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge.Status on"
        perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge off"
else
else
         echo "Homebridge is not running"
         echo "Homebridge is not running"
         perl /opt/fhem/fhem.pl 7072 "setreading FHEM.Homebridge.Status info Homebridge is not running"
         perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge is not running"
        perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge.Status off"
        perl /opt/fhem/fhem.pl 7072 "set FHEM.Homebridge off"
fi
fi
;;
;;
Zeile 107: Zeile 110:
esac
esac
exit 0
exit 0
</source>
</source>
Das Script setzt in dem bereits angelegten Dummy ein Reading ''info'' in dem der Ausführungsstatus des Scripts wieder gegeben wird. Das Reading ''state'' wir auf on oder off gesetzt. ''On'' bedeutet das Homebridge gestartet ist, ''off'' das die Homebridge nicht ausgeführt wird.


== Start Script Autostart einrichten==
== Start Script Autostart einrichten==

Version vom 8. Februar 2017, 21:11 Uhr

Der Artikel befindet sich noch im Aufbau. Der Code ist noch nicht 100% getestet, es muss also noch mit Fehler gerechnet werden.

Um nicht bei jeder Änderung, welche die Homebridge betrifft, diese über die Console manuell neustarten zu müssen zeigt diese Lösung wie dies bequem aus FHEMWEB erfolgen kann. In den nachfolgenden Abschnitten sind die einzelnen Schritte dazu erläutert.

Vorwort

Die im weitern genutzten Bezeichnungen von Dummys, Scriptdateinamen o.ä. können geändert werden. Die Änderungen müssen jedoch auch an allen entsprechenden Stellen vorgenommen werden. Genannte IP Adressen, Benutzernamen und Passwörter sind auf die eigenen Gegebenheiten anzupassen. Die Berechtigungen des Benutzers müssen zur Ausführung der Scripte geprüft und ggf. angepasst werden. Entprechende Linux Kentnisse sollten vorhanden sein.

Umsetzung

Status- und Kontroll-Dummy

Es wird ein Dummy benötigt, welcher den Status des Homebridge-Dienstes anzeigt und über den dieser Dienst gesteuert werden kann. Das nötige Script um die Homebridge als Dienst zu starten wird weiter unten in diesem Artikel erstellt.

define SYS_Homebridge dummy
attr SYS_Homebridge devStateIcon .*on:general_an .*off:general_aus .*:audio_rec
attr SYS_Homebridge eventMap status:status start:start stop:stop restart:restart
attr SYS_Homebridge icon it_router
attr SYS_Homebridge room System
attr SYS_Homebridge userReadings OnStateChange:(start|stop|restart|status) {  system ("sudo service homebridge ".ReadingsVal($NAME,"state","restart")." &" );;  }
attr SYS_Homebridge webCmd status:start:stop:restart

Der Dummy wird durch setzen von "start", "stop", "restart" oder "status" jeweils das userReading ausführen und somit letztendlich den homebridge Dienst steuert.

Start Script anlegen

Nun ist das Startscript für die Homebridge anzulegen. Mittels dem folgenden Befehl wird (wenn noch nicht vorhanden) das homebridge Script angelegt und im Editor geöffnet.

sudo nano /etc/init.d/homebridge

Wenn die Homebridge nicht auf dem selben System läuft wie FHEM muss dieser Schritt auf dem Homebridge System ausgeführt werden.

Das nun folgende Script kann in die homebridge Datei die im Nano Editor geöffnet ist rein kopiert werden.

Achtung: die Variabeln homeBridgeUser, fhemHost und fhemHostTelnetPort sind ggf. auf die eigenen Gegebenheiten anzupassen.

#!/bin/sh
### BEGIN INIT INFO
# Provides: homebridge
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time for homebridge
# Description: Enable service provided by daemon.
### END INIT INFO
export PATH=$PATH:/usr/local/bin
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules

PID=`pidof homebridge`
homeBridgeUser="fhem"
fhemHost=127.0.0.1          #FHEM Server (Masterinstanz)
fhemHostTelnetPort=7072     #TelnetPort der FHEM Instanz
fhemDefine="SYS_Homebridge"

case "$1" in
start)
if ps -p $PID > /dev/null 2>&1; then
        echo "Homebridge is already running"
        perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge is already running"			
 #       perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "set $fhemDefine on"
else
        su - $homeBridgeUser -c "homebridge > /dev/null 2>&1 &"
        echo "Homebridge starting"
        perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge starting"	
		perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "set $fhemDefine on"
        sleep 2
	$0 status
fi
;;
stop)
if ! ps -p $PID > /dev/null 2>&1; then
        echo "Homebridge is not running"
        perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge is not running"
        #perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "set $fhemDefine off"
else
        kill $PID
        echo "Homebridge stopping"
        perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge stopping"
        perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "set $fhemDefine off"
        sleep 2
	$0 status		
fi
;;
restart)
if ! ps -p $PID > /dev/null 2>&1; then
        $0 start
else
        $0 stop
        $0 start
fi
;;
status)
if ps -p $PID > /dev/null 2>&1; then
        echo "Homebridge is running PID $PID"
        perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge running as PID $PID"
else
        echo "Homebridge is not running"
        perl /opt/fhem/fhem.pl $fhemHost:$fhemHostTelnetPort "setreading $fhemDefine info Homebridge is not running"
fi
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
;;
esac
exit 0

Das Script setzt in dem bereits angelegten Dummy ein Reading info in dem der Ausführungsstatus des Scripts wieder gegeben wird. Das Reading state wir auf on oder off gesetzt. On bedeutet das Homebridge gestartet ist, off das die Homebridge nicht ausgeführt wird.

Start Script Autostart einrichten

Autostart aktivieren:

sudo chmod 755 /etc/init.d/homebridge

sudo update-rc.d homebridge defaults

Homebridge Start per Konsole

Nun kann man mit

sudo service homebridge start

bzw.

sudo /etc/init.d/homebridge start

den Dienst starten. Da in dem Script versucht wird, den Status für den Dummy "FHEM.Homebridge" zu setzen, gibt's erstmal eine Fehlermeldung - also am Besten gleich den Dummy anlegen, wie im nächsten Abschnitt beschrieben.

Homebridge Start per FHEM

Homebridge Start Dummy einrichten

define FHEM.Homebridge dummy
attr FHEM.Homebridge event-on-change-reading state
attr FHEM.Homebridge room 9.03_Tech
attr FHEM.Homebridge webCmd status:start:stop:restart
attr FHEM.Homebridge devStateIcon .*on:general_an .*off:general_aus .*:audio_rec
attr FHEM.Homebridge eventMap status:status start:start stop:stop restart:restart
attr FHEM.Homebridge icon it_router

Homebridge Start DOIF einrichten

define FHEM.Homebridge.DOIF DOIF ([FHEM.Homebridge] eq "start") (set FHEM.Homebridge on, {system ("sudo /etc/init.d/homebridge start")})\
DOELSEIF ([FHEM.Homebridge] eq "stop") (set FHEM.Homebridge on, {system ("sudo /etc/init.d/homebridge stop")})\
DOELSEIF ([FHEM.Homebridge] eq "restart") (set FHEM.Homebridge on, {system ("sudo /etc/init.d/homebridge restart")})\
DOELSEIF ([FHEM.Homebridge] eq "status") (set FHEM.Homebridge on, {system ("sudo /etc/init.d/homebridge status")})
attr FHEM.Homebridge.DOIF room 9.03_Tech

Homebridge FHEM Zugriff auf Script gewähren

sudo nano /etc/sudoers

Beispiel Zeile

fhem ALL=(ALL) NOPASSWD:/etc/init.d/homebridge

Beispiel Datei:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root	ALL=(ALL:ALL) ALL
fhem ALL=(ALL) NOPASSWD:/opt/fhem/FHEM/backup.sh, /etc/init.d/homebridge

# Members of the admin group may gain root privileges
%admin  ALL = (ALL) NOPASSWD: ALL

# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d