HomeBridge – MQTT Auto Start

As I’m testing my new build Homekit accesoires I need to manually start my Apple Homebridge based on MQTT every time I boot. So the question is: How can I automatically start Apple Homebridge based on MQTT after rebooting the Raspberry Pi Zero W. There are many directions out there that don’t work on Raspbian. Specifically the “upstart” scripts, as Raspbian doesn’t come with upstart, and will mess things up greatly if you install it. Raspbian uses init.d. It’s fairly simple to get things going.

MQTT Auto Start

To create a new script we have to create one first. You do so by typing:

sudo nano /etc/init.d/<your script>

The following is an example based on starting up the homekit2mqtt service, but change the name of the script and the command to start and stop it and it would work for any command.

#!/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
# Description:       Enable service provided by daemon.
### END INIT INFO

dir="/home/pi"
cmd="DEBUG=* /usr/local/bin/homekit2mqtt
"
user="pi"

name=`basename $0`
pid_file="/var/run/$name.pid"
stdout_log="/var/log/$name.log"
stderr_log="/var/log/$name.err"

get_pid() {
    cat "$pid_file"
}

is_running() {
    [ -f "$pid_file" ] && ps -p `get_pid` > /dev/null 2>&1
}

case "$1" in
    start)
    if is_running; then
        echo "Already started"
    else
        echo "Starting $name"
        cd "$dir"
        if [ -z "$user" ]; then
            sudo $cmd >> "$stdout_log" 2>> "$stderr_log" &
        else
            sudo -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" &
        fi
        echo $! > "$pid_file"
        if ! is_running; then
            echo "Unable to start, see $stdout_log and $stderr_log"
            exit 1
        fi
    fi
    ;;
    stop)
    if is_running; then
        echo -n "Stopping $name.."
        kill `get_pid`
        for i in 1 2 3 4 5 6 7 8 9 10
        # for i in `seq 10`
        do
            if ! is_running; then
                break
            fi

            echo -n "."
            sleep 1
        done
        echo

        if is_running; then
            echo "Not stopped; may still be shutting down or shutdown may have failed"
            exit 1
        else
            echo "Stopped"
            if [ -f "$pid_file" ]; then
                rm "$pid_file"
            fi
        fi
    else
        echo "Not running"
    fi
    ;;
    restart)
    $0 stop
    if is_running; then
        echo "Unable to stop, will not attempt to start"
        exit 1
    fi
    $0 start
    ;;
    status)
    if is_running; then
        echo "Running"
    else
        echo "Stopped"
        exit 1
    fi
    ;;
    *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

exit 0

Make script executable

sudo chmod 755 /etc/init.d/<your script>

Register script to be run at start-up To register your script to be run at start-up and shutdown, run the following command:

sudo update-rc.d /etc/init.d/<your script> defaults

Note: The header at the start is to make the script LSB compliant and provides details about the start up script and you should only need to change the name. If you want to know more about creating LSB scripts for managing services, see http://wiki.debian.org/LSBInitScripts

t should now run when your Pi reboots. You can also start it up manually like this:

sudo /etc/init.d/homebridge start

To view the running logs, you can tail the output log or error log:

tail -f /var/log/homebridge.log

and:

tail -f /var/log/homebridge.err

If you ever want to remove the script from start-up, run the following command:

sudo update-rc.d -f <your script> remove

The Raspberry Pi Zero W will automatically start Apple Homebridge based on MQTT after a restart. It is hereby no longer necessary to have connected a mouse, keyboard or monitor. The Apple Homebridge based on MQTT server can be placed anywhere this way.

SaveSave

SaveSave