智能家居系列之Home Assistant
智能家居话题本身就是一个技术领域,它的目的是让智能家居变得更加简单,更加实用。
系列定位
本系列的定位是智能家居入门系列。
背景
最近看了下家中的智能家居设备有一些,不能说太少,但也有几十个吧,买的时候就知道有Home Assistant可以整合各种品牌的设备,所以设备的牌子也不少,之前也体验过HA,当时通过Mac 体验的,体验并不是很好,因为电脑需要经常的携带,还是要用一个家中的常供电的设备;就找了找,发现加中国有一个坚果的安卓手机(的设备),那就用这个入门吧。
必要准备条件
一台可安装linux 系统的设备(如安卓手机、笔记本电脑、智能路由器)
Linux Deploy
BusyBox
Tabby(SSH 客户端跨平台)
Root 工具(King Root)
一点点耐心
系统安装
发行版GNU/Linux选择debian;架构选择armhf;发行版本选择buster;用户名和用户密码自行设置,简单一些;初始化选择启用;ssh选择启用;源改为:/debian;空间大一点设置成8192MB。2.之后点击左上角,选择“设置”,关闭“屏幕常亮”,钩选锁定wifi和CPU唤醒;在“环境”一栏点击“更新环境”,更新一下deploy运行的环境。
3.点击右上角,选择“安装”,之后就是耐心等待,安装完成之后会显示"<<deploy",之后点击右上角的“配置”。
4.运行完成之后点击最下面的“启动”,看到starting extra/ssh … done,以及下一行的<<< start就是启动成功了。
软件安装
用ssh方式登录到手机。windows下可以用Tabby软件,win10可以直接用shell终端,macos下可以用自带的终端terminal,或者下载一个terminus。
使用操作自带的终端应用的话,可以直接使用命令ssh 用户名@ip地址:端口号(端口一般默认都是22,所以也可以不输入)。
登录之后用命令:
sudo su -
直接使用超级用户权限,方便操作。
3.安装python,按顺序输入以下命令
1)先更新一下apt-get组件
sudo apt-get update
sudo apt-get upgrade
上面这两条命令是更新一下系统的相关组件。
2)安装依赖库
sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev virtualenv curl wget cargo libjpeg-dev zlib1g-dev daemonize vim -y
这一条命令是安装一些必要的依赖环境,-y的意思是直接点yes确认,免得每个包都来一遍。
3)创建用户及给用户分配网络权限(独立执行软件)
sudo adduser --system homeassistantsudo addgroup homeassistantsudo usermod -G dialout -a homeassistant
这三条命令分别是新建用户(homeassistant)和用户组。
sudo usermod -aG aid_inet rootsudo usermod -aG aid_inet homeassitant
4)配置visudo
4)分别给root和homeassistant设置初始化密码
sudo passwd root
设定root用户的密码,方便以后用scp方式登录的时候使用。
5)安装高版本的python,按顺序输入以下命令
源码安装python,采用不覆盖现有环境的方式
wget /ftp/python/3.9.13/Python-3.9.13.tgztar xvf Python-3.9.13.tgzcd Python-3.9.13/sudo ./configure --prefix=/usr/lib/python3.9.13 --with-openssl=/usr/bin/openssl make -j 2sudo make altinstall
通过软连接配置python3.9.13为默认的python版本
sudo mv /usr/bin/python /usr/bin/python.baksudo mv /usr/bin/python3 /usr/bin/python3.baksudo ln -s /usr/lib/python3.9.13/bin/python3.9 /usr/bin/python3
配置环境
sudo mv /usr/bin/virtualenv /usr/bin/virtualenv.baksudo ln -s /usr/lib/python3.9.13/bin/virtualenv /usr/bin/virtualenvsudo pip3 install --upgrade virtualenv
通过软连接配置pithon3.9.13的pip3 为默认的pip版本
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.pysudo python3 get-pip.pysudo ln -s /usr/lib/python3.9.13/bin/pip3.9 /usr/bin/pip3sudo ln -s /usr/lib/python3.9.13/bin/pip3.9 /usr/bin/pip
验证pip3是否安装成功
pip3 -Vpip -V
安装sqlite3390100
wget //sqlite-autoconf-3390100.tar.gztar zxvf sqlite-autoconf-3390100.tar.gzcd sqlite-autoconf-3390100./configuremake -j 2sudo make install
验证sqllite安装后的位置
ls -l /usr/local/lib/*sqlite*ls -l /usr/local/include/*sqlite*
重新编译python3.9.13 使用sqlite3
cd sqlite-autoconf-3390100cp sqlite3 /usr/bin/sqlite3# 并且由于sqlite3的版本可能与高版本python有所不同,为了不产生不必要冲突,对python3.9重新编译cd Python-3.9.13/LD_RUN_PATH=/usr/local/lib ./configure LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include" --prefix=/usr/lib/python3.9.13LD_RUN_PATH=/usr/local/lib makemake -j 2sudo make install
验证sqlite3是否安装成功
python3import sqlite3sqlite3.sqlite_version
建立虚拟环境
virtualenv -p python3 /srv/homeassistantsudo mkdir /srv/homeassistantsudo chmod 777 /srv/homeassistantsudo chown homeassistant:homeassistant /srv/homeassistant/source /srv/homeassistant/bin/activate
8)在设置好后的来环境下安装homeassistant,在(homeassistant) root@ localhost:~#后边的复制下面的代码
pip3安装器的源更换为清华的国内源,这样安装会快一些。
pip3 config set global.index-url https://pypi.tuna./simple
安装homeassistant
pip3 install --upgrade pippip3 install --upgrade setuptoolspip3 install netdiscopip3 install --upgrade homeassistant
运行的最后一条就是安装homeassistant,然后就是漫长的等待。等再次看到(homeassistant) root@ localhost:~#就是安装好了。
启动homeassistant
1.第一次启动使用命令:
hass
就会启动homeassistant系统。第一次启动的时间比较久,所以需要耐心等待。过个5到10分钟,就可以在浏览器中输入手机的IP地址加端口8123(默认端口),如:
http://192.168.1.24:8123
看看能否进入到系统页面。
能进入页面的话,第一步就是创建用户名和密码,进行下一步的设置。
2.在后台开启homeassistant用户进程
因为deploy是一种chroot容器,与真正在计算机不太一样,无法用常规方式做开机启动,这也是我在一开始的设置里就说要勾选INIT enable的原因。
先参考项目文档,往下找找到python environment的脚本,备用。从文档中复制,自己创建文件后编辑。
sudo touch /etc/init.d/hass-daemonsudo vim /etc/init.d/hass-daemon
#!/bin/sh### BEGIN INIT INFO# Provides:hass# Required-Start: $local_fs $network $named $time $syslog# Required-Stop:$local_fs $network $named $time $syslog# Default-Start:2 3 4 5# Default-Stop:0 1 6# Description: Home\ Assistant### END INIT INFO# /etc/init.d Service Script for Home Assistant# Created with: /naholyr/4275302#file-new-service-shPRE_EXEC="source /srv/homeassistant/bin/activate;"# Typically /usr/bin/hassHASS_BIN="/srv/homeassistant/bin/hass"RUN_AS="homeassistant"PID_DIR="/var/run/hass"PID_FILE="$PID_DIR/hass.pid"CONFIG_DIR="/home/$RUN_AS/.homeassistant"LOG_DIR="/var/log/homeassistant"LOG_FILE="$LOG_DIR/home-assistant.log"FLAGS="-v --config $CONFIG_DIR --log-file $LOG_FILE --log-rotate-days 7"DAEMONIZE="daemonize -c /srv/homeassistant -e $LOG_FILE.stderr -o $LOG_FILE.stdout -p $PID_FILE -l $PID_FILE -v"start() {create_piddirif [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE) 2> /dev/null; thenecho 'Service already running' >&2return 1fiecho -n 'Starting service... ' >&2local CMD="$PRE_EXEC $DAEMONIZE $HASS_BIN $FLAGS"su -s /bin/bash -c "$CMD" $RUN_ASif [ $? -ne 0 ]; thenecho "Failed" >&2elseecho 'Done' >&2fi}stop() {if [ ! -f "$PID_FILE" ] || ! kill -0 $(cat "$PID_FILE") 2> /dev/null; thenecho 'Service not running' >&2return 1fiecho -n 'Stopping service... ' >&2kill $(cat "$PID_FILE")while ps -p $(cat "$PID_FILE") > /dev/null 2>&1; do sleep 1;done;rm -f $PID_FILEecho 'Done' >&2}install() {echo "Installing Home Assistant Daemon (hass-daemon)"update-rc.d hass-daemon defaultscreate_piddirmkdir -p $CONFIG_DIRchown $RUN_AS $CONFIG_DIRmkdir -p $LOG_DIRchown $RUN_AS $LOG_DIR}uninstall() {echo "Are you really sure you want to uninstall this service? The INIT script will"echo -n "also be deleted! That cannot be undone. [yes|No] "local SUREread SUREif [ "$SURE" = "yes" ]; thenstopremove_piddirecho "Notice: The config directory has not been removed"echo $CONFIG_DIRecho "Notice: The log directory has not been removed"echo $LOG_DIRupdate-rc.d -f hass-daemon removerm -fv "$0"echo "Home Assistant Daemon has been removed. Home Assistant is still installed."fi}create_piddir() {if [ ! -d "$PID_DIR" ]; thenmkdir -p $PID_DIRchown $RUN_AS "$PID_DIR"fi}remove_piddir() {if [ -d "$PID_DIR" ]; thenif [ -e "$PID_FILE" ]; thenrm -fv "$PID_FILE"firmdir -v "$PID_DIR"fi}case "$1" instart)start;;stop)stop;;install)install;;uninstall)uninstall;;restart)stopstart;;*)echo "Usage: $0 {start|stop|restart|install|uninstall}"esac
保存配置文件之后接着执行下面的命令
sudo chmod +x /etc/init.d/hass-daemonsudo update-rc.d hass-daemon defaultssudo service hass-daemon install
最后可以手动尝试启动服务
sudo /etc/init.d/hass-daemon start
启动脚本中定义了日志输出,可以通过下面的命令查看日志
tail /var/opt/homeassistant/home-assistant.log
另外需要注意的是,官方文档中的启动脚本是指定了配置文件的路径的
CONFIG_DIR=“/var/opt/homeassistant”
如果需要编辑配置文件需要到该目录下编辑。
当然也可以修改会默认的目录下面
CONFIG_DIR="/home/homeassistant/.homeassistant
如果,到这里hass能正常启动说明服务安装成功了,现在添加到开机启动项。
首先在设置里面确认INIT的设置是/etc/rc.local目录。
然后继续在Tabby中输入命令
sudo vim /etc/rc.local
这里字有点多,我把我的代码贴出来分享给大家。
#!/bin/sh -e## rc.local## This script is executed at the end of each multiuser runlevel.# Make sure that the script will "exit 0" on success or any other value on error.# In order to enable or disable this script just change the execution bits.## By default this script does nothing.sudo /etc/init.d/hass-daemon startexit 0
然后ctrl+x保存退出就可以了。
这里可能要注意一下,rc.local可能是新建的文件,那需要赋予可执行权限
sudo chmod +x /etc/rc.local
在手机的deploy软件下点停止再启动,看下rc.local是不是正常启动,过一会就能通过浏览器访问到homeassistant了。
一般用户到这里就可以结束了,对于喜欢折腾的朋友可以继续看,我要做微信访问和内网穿透访问以及远控手机。
本片作为一个入门的到这里,后续看情况继续新增篇幅。
常见问题
ssh 无法启动Arch Linux extra/ssh start failed
解决办法:设置镜像源为aliyun,然后重新安装。
网络不通
可以用apt下载却不能用ping wget curl之类的
给用户分配网络权限
sudo usermod -aG aid_inet rootsudo usermod -aG aid_inet homeassitant
python版本过低
自带版本过低,用源码安装高版本的python
sqlite3版本过低
自带版本过低,用源码安装高版本的sqlite3
无rust编译环境
cryptography rustc not found
这个有两种解决方式,1. 系统包管理工具安装,2.rust官方推荐方式处理rustup
sudo apt install cargo
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
建议用rustup方式,这样安装的rust版本更可控,且不受操作系统的安装源限制
rc.local 无法自动启动
linuxdeploy rc.local faild permission denied
缺少执行权限
无法安装Pillow
The headers or library files could not be found for jpeg,
apt 安装 libjpeg-dev
参考资料
linux-deploy
busybox
linuxdeploy
ha对python版本要求
armel armhf arm64 armv7l 区别
同一wifi环境手机电脑不能互相ping通
同一wifi环境手机电脑不能互相ping通
Arch Linux extra/ssh start failed
域名解析
域名解析问题
linux 快捷指令
域名解析排查
pypi 清华镜像源配置
pip 软件源配置
python 设置
docker 安装homeassistant 不推荐
安装 rust
python3.7 升级 python3.9
安装python3.9 sqlite3
installsqlite3
pillow
接入天猫精灵和小爱同学
电信申请公网的办法
中国移动公网ipv6
ipV6访问网页的方式
如何在 Ubuntu 和其它的 Linux 发行版安装 Rust 和 Cargo