笔者手头的群晖是216j,没有Docker,所以在非Docker模式下安装homeassistant费了不少事,主要参考的是官方的文档
https://home-assistant.io/docs/installation/synology/
使用admin登录Web界面
1.1. 安装python3,版本是3.5.1
1.2. 创建homeassistant用户,并添加到users组
用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编译器,发现不好找,而且群晖的系统缺少很多的头文件,所以换了个思路,如下
使用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/目录下
把在debian系统中编译出来的python3库放到群晖系统python3的目录中,目录是site-packages,同时这个目录下的所有so文件都要建立软连接,比如netifaces.so -> netifaces.cpython-35m-arm-linux-gnueabihf.so
这样就可以用./python3 -m pip install homeassistant安装homeassistant了
mkdir /volume1/homeassistant
chown homeassistant /volume1/homeassistant
chmod 755 /volume1/homeassistant
cd /volume1/homeassistant
在/volume1/homeassistant目录下新建hass-daemon文件,内容如下
#!/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
注意,里面用了export LD_LIBRARY_PATH=/volume1/@appstore/py3k/usr/local/lib;和官方的相比是新加的,就是因为libssl.so和libcrypto.so的版本问题,千万不能用群晖系统自带的这两个库,也不能修改群晖系统的这两个文件(在/usr/lib目录),修改了会变砖的哦
ln -s /volume1/@appstore/py3k/usr/local/bin/python3 python3
ln -s /volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/homeassistant homeassistant
chmod 755 /volume1/homeassistant/hass-daemon
启动homeassistant: sudo /volume1/homeassistant/hass-daemon start
停止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是可以覆盖的