智能家居系列之Home Assistant

智能家居系列之Home Assistant

智能家居话题本身就是一个技术领域,它的目的是让智能家居变得更加简单,更加实用。

系列定位

本系列的定位是智能家居入门系列。

背景

最近看了下家中的智能家居设备有一些,不能说太少,但也有几十个吧,买的时候就知道有Home Assistant可以整合各种品牌的设备,所以设备的牌子也不少,之前也体验过HA,当时通过Mac 体验的,体验并不是很好,因为电脑需要经常的携带,还是要用一个家中的常供电的设备;就找了找,发现加中国有一个坚果的安卓手机(16年的设备),那就用这个入门吧。

必要准备条件

  1. 一台可安装linux 系统的设备(如安卓手机、笔记本电脑、智能路由器)

  2. Linux Deploy

  3. BusyBox

  4. Tabby(SSH 客户端跨平台)

  5. Root 工具(King Root)

  6. 一点点耐心

系统安装

  1. 发行版GNU/Linux选择debian;架构选择armhf;发行版本选择buster;用户名和用户密码自行设置,简单一些;初始化选择启用;ssh选择启用;源改为:https://mirrors.aliyun.com/debian;空间大一点设置成8192MB。

2.之后点击左上角,选择“设置”,关闭“屏幕常亮”,钩选锁定wifi和CPU唤醒;在“环境”一栏点击“更新环境”,更新一下deploy运行的环境。

3.点击右上角,选择“安装”,之后就是耐心等待,安装完成之后会显示"<<deploy",之后点击右上角的“配置”。

4.运行完成之后点击最下面的“启动”,看到starting extra/ssh … done,以及下一行的<<< start就是启动成功了。

软件安装

  1. 用ssh方式登录到手机。

windows下可以用Tabby软件,win10可以直接用shell终端,macos下可以用自带的终端terminal,或者下载一个terminus。

使用操作自带的终端应用的话,可以直接使用命令ssh 用户名@ip地址:端口号(端口一般默认都是22,所以也可以不输入)。

  1. 登录之后用命令:

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 
  1. 安装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

# 并且由于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.13

LD_RUN_PATH=/usr/local/lib make

make -j 2

sudo make install

验证sqlite3是否安装成功

python3
import sqlite3
sqlite3.sqlite_version
  1. 建立虚拟环境
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:~#就是安装好了。

  1. 启动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

#!/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: https://gist.github.com/naholyr/4275302#file-new-service-sh
PRE_EXEC="source /srv/homeassistant/bin/activate;"
# Typically /usr/bin/hass
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

这里字有点多,我把我的代码贴出来分享给大家。


#!/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 start

exit 0

然后ctrl+x保存退出就可以了。
这里可能要注意一下,rc.local可能是新建的文件,那需要赋予可执行权限

sudo chmod +x /etc/rc.local

在手机的deploy软件下点停止再启动,看下rc.local是不是正常启动,过一会就能通过浏览器访问到homeassistant了。

一般用户到这里就可以结束了,对于喜欢折腾的朋友可以继续看,我要做微信访问和内网穿透访问以及远控手机。

本片作为一个入门的到这里,后续看情况继续新增篇幅。

常见问题

  1. ssh 无法启动
Arch Linux extra/ssh start failed

解决办法:设置镜像源为aliyun,然后重新安装。

  1. 网络不通

可以用apt下载却不能用ping wget curl之类的
给用户分配网络权限

sudo usermod -aG aid_inet root

sudo usermod -aG aid_inet homeassitant
  1. python版本过低

自带版本过低,用源码安装高版本的python

  1. sqlite3版本过低

自带版本过低,用源码安装高版本的sqlite3

  1. 无rust编译环境
cryptography rustc not found

这个有两种解决方式,1. 系统包管理工具安装,2.rust官方推荐方式处理rustup

  1. sudo apt install cargo
  2. curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

建议用rustup方式,这样安装的rust版本更可控,且不受操作系统的安装源限制

  1. rc.local 无法自动启动
linuxdeploy rc.local faild permission denied

缺少执行权限

  1. 无法安装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

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值