智能家居系列之Home Assistant
智能家居话题本身就是一个技术领域,它的目的是让智能家居变得更加简单,更加实用。
系列定位
本系列的定位是智能家居入门系列。
背景
最近看了下家中的智能家居设备有一些,不能说太少,但也有几十个吧,买的时候就知道有Home Assistant可以整合各种品牌的设备,所以设备的牌子也不少,之前也体验过HA,当时通过Mac 体验的,体验并不是很好,因为电脑需要经常的携带,还是要用一个家中的常供电的设备;就找了找,发现加中国有一个坚果的安卓手机(16年的设备),那就用这个入门吧。
必要准备条件
-
一台可安装linux 系统的设备(如安卓手机、笔记本电脑、智能路由器) -
Linux Deploy -
BusyBox -
Tabby(SSH 客户端跨平台) -
Root 工具(King Root) -
一点点耐心
系统安装
- 发行版GNU/Linux选择debian;架构选择armhf;发行版本选择buster;用户名和用户密码自行设置,简单一些;初始化选择启用;ssh选择启用;源改为:https://mirrors.aliyun.com/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 homeassistant
sudo addgroup homeassistant
sudo usermod -G dialout -a homeassistant
这三条命令分别是新建用户(homeassistant)和用户组。
sudo usermod -aG aid_inet root
sudo usermod -aG aid_inet homeassitant
4)配置visudo
4)分别给root和homeassistant设置初始化密码
sudo passwd root
设定root用户的密码,方便以后用scp方式登录的时候使用。
5)安装高版本的python,按顺序输入以下命令
源码安装python,采用不覆盖现有环境的方式
wget https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz
tar xvf Python-3.9.13.tgz
cd Python-3.9.13/
sudo ./configure --prefix=/usr/lib/python3.9.13 --with-openssl=/usr/bin/openssl
make -j 2
sudo make altinstall
通过软连接配置python3.9.13为默认的python版本
sudo mv /usr/bin/python /usr/bin/python.bak
sudo mv /usr/bin/python3 /usr/bin/python3.bak
sudo ln -s /usr/lib/python3.9.13/bin/python3.9 /usr/bin/python3
配置环境
sudo mv /usr/bin/virtualenv /usr/bin/virtualenv.bak
sudo ln -s /usr/lib/python3.9.13/bin/virtualenv /usr/bin/virtualenv
sudo pip3 install --upgrade virtualenv
通过软连接配置pithon3.9.13的pip3 为默认的pip版本
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python3 get-pip.py
sudo ln -s /usr/lib/python3.9.13/bin/pip3.9 /usr/bin/pip3
sudo ln -s /usr/lib/python3.9.13/bin/pip3.9 /usr/bin/pip
验证pip3是否安装成功
pip3 -V
pip -V
- 安装sqlite3390100
wget https://www.sqlite.org/2022/sqlite-autoconf-3390100.tar.gz
tar zxvf sqlite-autoconf-3390100.tar.gz
cd sqlite-autoconf-3390100
./configure
make -j 2
sudo make install
验证sqllite安装后的位置
ls -l /usr/local/lib/*sqlite*
ls -l /usr/local/include/*sqlite*
重新编译python3.9.13 使用sqlite3
cd sqlite-autoconf-3390100
cp sqlite3 /usr/bin/sqlite3
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.13
LD_RUN_PATH=/usr/local/lib make
make -j 2
sudo make install
验证sqlite3是否安装成功
python3
import sqlite3
sqlite3.sqlite_version
- 建立虚拟环境
virtualenv -p python3 /srv/homeassistant
sudo mkdir /srv/homeassistant
sudo chmod 777 /srv/homeassistant
sudo 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.tsinghua.edu.cn/simple
安装homeassistant
pip3 install --upgrade pip
pip3 install --upgrade setuptools
pip3 install netdisco
pip3 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-daemon
sudo vim /etc/init.d/hass-daemon
PRE_EXEC="source /srv/homeassistant/bin/activate;"
HASS_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_piddir
if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE) 2> /dev/null; then
echo 'Service already running' >&2
return 1
fi
echo -n 'Starting service... ' >&2
local CMD="$PRE_EXEC $DAEMONIZE $HASS_BIN $FLAGS"
su -s /bin/bash -c "$CMD" $RUN_AS
if [ $? -ne 0 ]; then
echo "Failed" >&2
else
echo 'Done' >&2
fi
}
stop() {
if [ ! -f "$PID_FILE" ] || ! kill -0 $(cat "$PID_FILE") 2> /dev/null; then
echo 'Service not running' >&2
return 1
fi
echo -n 'Stopping service... ' >&2
kill $(cat "$PID_FILE")
while ps -p $(cat "$PID_FILE") > /dev/null 2>&1; do sleep 1;done;
rm -f $PID_FILE
echo 'Done' >&2
}
install() {
echo "Installing Home Assistant Daemon (hass-daemon)"
update-rc.d hass-daemon defaults
create_piddir
mkdir -p $CONFIG_DIR
chown $RUN_AS $CONFIG_DIR
mkdir -p $LOG_DIR
chown $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 SURE
read SURE
if [ "$SURE" = "yes" ]; then
stop
remove_piddir
echo "Notice: The config directory has not been removed"
echo $CONFIG_DIR
echo "Notice: The log directory has not been removed"
echo $LOG_DIR
update-rc.d -f hass-daemon remove
rm -fv "$0"
echo "Home Assistant Daemon has been removed. Home Assistant is still installed."
fi
}
create_piddir() {
if [ ! -d "$PID_DIR" ]; then
mkdir -p $PID_DIR
chown $RUN_AS "$PID_DIR"
fi
}
remove_piddir() {
if [ -d "$PID_DIR" ]; then
if [ -e "$PID_FILE" ]; then
rm -fv "$PID_FILE"
fi
rmdir -v "$PID_DIR"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
install)
install
;;
uninstall)
uninstall
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|install|uninstall}"
esac
保存配置文件之后接着执行下面的命令
sudo chmod +x /etc/init.d/hass-daemon
sudo update-rc.d hass-daemon defaults
sudo 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
这里字有点多,我把我的代码贴出来分享给大家。
sudo /etc/init.d/hass-daemon start
exit 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 root
sudo usermod -aG aid_inet homeassitant
- python版本过低
自带版本过低,用源码安装高版本的python
- sqlite3版本过低
自带版本过低,用源码安装高版本的sqlite3
- 无rust编译环境
cryptography rustc not found
apt 安装cargo
- 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访问网页的方式
|