14
2018
03

群晖非docker下安装homeassistant

笔者手头的群晖是216j,没有Docker,所以在非Docker模式下安装homeassistant费了不少事,主要参考的是官方的文档

https://home-assistant.io/docs/installation/synology/

  1. 使用admin登录Web界面

    1.1. 安装python3,版本是3.5.1

    1.2. 创建homeassistant用户,并添加到users组

  2. 用admin用户登录ssh

    2.1. 切换到root用户:sudo -i

    2.2. 切换到python3目录:cd /volume1/@appstore/py3k/usr/local/bin

    2.3. 安装PIP:./python3 -m ensurepip

    2.4. 升级PIP:./python3 -m pip install --upgrade pip

    2.5. 升级setuptools: ./python3 -m pip install --upgrade setuptools

    2.6. 安装Homeassistant: ./python3 -m pip install homeassistant

    在这一步中安装某些依赖库会提示没有gcc编译器,目前发现的有问题依赖库有pycryptodome、cffi、cryptography、netifaces等

    刚开始试图找gcc编译器,发现不好找,而且群晖的系统缺少很多的头文件,所以换了个思路,如下

  3. 使用admin用户登录web界面

    3.1. 安装python2.7及debian chroot

    3.2. 用命令/var/packages/debian-chroot/scripts/start-stop-status chroot进入debian系统

    3.3. 由于debian自带的python3的版本是3.4,和3.5.1还有些差别,所以我们在debian下卸载3.4版本,下载3.5.1的源代码并编译,编译的过程中需要在debian系统中安装openssl的开发包,群晖系统的/usr/lib/libssl.so和libcrypto.so和debian中的完全不兼容,会导致在debian下编译出来的python库的so文件不能在群晖系统下运行,所以要找能兼容两个系统的so文件,经测试群晖系统的python2.7可以做到,在/volume1/@appstore/python/lib/下,把/volume1/@appstore/python/lib/下的libssl.so和libcrypto.so复制到debian系统的/usr/lib/arm-linux-gnueabihf/目录下,同时这两个文件也要放到/volume1/@appstore/py3k/usr/local/lib/目录下

  4. 把在debian系统中编译出来的python3库放到群晖系统python3的目录中,目录是site-packages,同时这个目录下的所有so文件都要建立软连接,比如netifaces.so -> netifaces.cpython-35m-arm-linux-gnueabihf.so

  5. 这样就可以用./python3 -m pip install homeassistant安装homeassistant了

  6. mkdir /volume1/homeassistant

  7. chown homeassistant /volume1/homeassistant

  8. chmod 755 /volume1/homeassistant

  9. cd /volume1/homeassistant

  10. 在/volume1/homeassistant目录下新建hass-daemon文件,内容如下


  11. #!/bin/sh
    
    # Package
    PACKAGE="homeassistant"
    DNAME="Home Assistant"
    
    # Others
    USER="homeassistant"
    PYTHON_DIR="/volume1/@appstore/py3k/usr/local/bin"
    PYTHON="$PYTHON_DIR/python3"
    HASS="$PYTHON_DIR/hass"
    INSTALL_DIR="/volume1/homeassistant"
    PID_FILE="$INSTALL_DIR/home-assistant.pid"
    FLAGS="-v --config $INSTALL_DIR --pid-file $PID_FILE --daemon"
    REDIRECT="> $INSTALL_DIR/home-assistant.log 2>&1"
    
    start_daemon ()
    {
        sudo -u ${USER} /bin/sh -c "export LD_LIBRARY_PATH=/volume1/@appstore/py3k/usr/local/lib;$PYTHON $HASS $FLAGS $REDIRECT;"
    }
    
    stop_daemon ()
    {
        kill `cat ${PID_FILE}`
        wait_for_status 1 20 || kill -9 `cat ${PID_FILE}`
        rm -f ${PID_FILE}
    }
    
    daemon_status ()
    {
        if [ -f ${PID_FILE} ] && kill -0 `cat ${PID_FILE}` > /dev/null 2>&1; then
            return
        fi
        rm -f ${PID_FILE}
        return 1
    }
    
    wait_for_status ()
    {
        counter=$2
        while [ ${counter} -gt 0 ]; do
            daemon_status
            [ $? -eq $1 ] && return
            let counter=counter-1
            sleep 1
        done
        return 1
    }
    
    case $1 in
        start)
            if daemon_status; then
                echo ${DNAME} is already running
                exit 0
            else
                echo Starting ${DNAME} ...
                start_daemon
                exit $?
            fi
            ;;
        stop)
            if daemon_status; then
                echo Stopping ${DNAME} ...
                stop_daemon
                exit $?
            else
                echo ${DNAME} is not running
                exit 0
            fi
            ;;
            restart)
            if daemon_status; then
                echo Stopping ${DNAME} ...
                stop_daemon
                echo Starting ${DNAME} ...
                start_daemon
                exit $?
            else
                echo ${DNAME} is not running
                echo Starting ${DNAME} ...
                start_daemon
                exit $?
            fi
            ;;
        status)
            if daemon_status; then
                echo ${DNAME} is running
                exit 0
            else
                echo ${DNAME} is not running
                exit 1
            fi
            ;;
        log)
            echo ${LOG_FILE}
            exit 0
            ;;
        *)
            exit 1
            ;;
    esac
  12. 注意,里面用了export LD_LIBRARY_PATH=/volume1/@appstore/py3k/usr/local/lib;和官方的相比是新加的,就是因为libssl.so和libcrypto.so的版本问题,千万不能用群晖系统自带的这两个库,也不能修改群晖系统的这两个文件(在/usr/lib目录),修改了会变砖的哦

  13. ln -s /volume1/@appstore/py3k/usr/local/bin/python3 python3

  14. ln -s /volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/homeassistant homeassistant

  15. chmod 755 /volume1/homeassistant/hass-daemon

  16. 启动homeassistant: sudo /volume1/homeassistant/hass-daemon start

  17. 停止homeassistant: sudo /volume1/homeassistant/hass-daemon stop

    附:用ldd和objdump命令查看libssl.so和libcrypto.so,会发现,群晖系统和群晖python2.7的版本是空,debian用apt-get安装的ssl的版本是openssl_1_0_0,不兼容,而群晖python2.7的导出函数比群晖系统的多,所以我们在debian下编译和运行homeassistant都使用群晖python2.7的版本,幸好debian的这两个so是可以覆盖的

« 上一篇 下一篇 »