『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 15933|回复: 11

[基础教程] 用Linux Deploy在Android设备(已ROOT)上安装 Home Assistant Core (HASS)

[复制链接]

1

主题

9

帖子

174

积分

注册会员

Rank: 2

积分
174
金钱
165
HASS币
10
发表于 2021-1-15 16:54:40 | 显示全部楼层 |阅读模式
本帖最后由 河伯 于 2021-1-16 09:45 编辑

用Linux Deploy在Android设备(已ROOT)上安装Home Assistant Core (HASS)

  (摘译自Luca Cesarano的文章,增加了一些我自己的安装体会,原文链接需要梯子。https://lucacesarano.medium.com/install-home-assistant-hass-on-android-with-linux-linux-deploy-chroot-root-48a520d6c2ff
  安装Home Assistant Core的路上巨坑无数,这篇文章我感觉报错最少。做这个摘译也是为了取几篇教程的优点,给自己理清思路。
  原作者有个一加3手机,已经ROOT,装了Lineage OS(Android10)。其实这个配置可以直接用Termux来安装了。我自己是一台Nubia Z9Max的手机,骁龙615的CPU,2G+16G,运行的是Nubia的原厂ROM,Android5.11。这个型号已经没人在做ROM了,刷了几个ROM想升到Android7都不太成功,只好刷回原厂ROM,简单用superSU#做了root。Root的过程自己找,android7之后大多使用Magisk Root。Linux deploy这个APP自己到主页下载安装,同一作者还有个busybox要先安装。下面主要说如何在已ROOT的Android设备上运行一个Chrooted容器中的Linux,并在此基础上安装debian和Python,最终运行HomeAssistant。

1.准备:

  一台已Root的Android设备,手机平板电视盒子都行。
  Linux Deploy (https://github.com/meefik/linuxdeploy)

2.LINUX DEPLOY配置:

  Linux Deploy可以在手机上运行一个完整的Linux,它使用chroot这个容器。
  这个过程还是比较容易的,它的UI也比较简陋。
  点击右下角像调音键那个按钮进入配置,我基本按照原作者的配置来做的:
  操作系统选Debian;
  指令集选Armhf,据说兼容性比arm64更好;
  版本号选Buster,这是Debian的最新版。个人感觉Linux deploy对Debian支持比较好,版本最多。原来我想装里面的DOCKER的,一直不成功,可能是网络的问题,会缺失很多东西;
  选择镜像文件,镜像大小选8000 (MB);
  钩选初始化系统,系统类型先SYSV;
  钩选装载文件系统,装载点设为 /sdcard/
  原作者选了图形界面来跑VNC,我感觉开销比较大,老手机可能跑不动,而且我没跑起来VNC,就不选了;
  自己定一个用户名和口令,这里都看得到,所以可以搞复杂点。

3.安装Debian

  配置选完了,点击右上角菜单里的“安装”。这个安装过程大概要20分钟,看网络了。对了,之前最好把网络搞成静态地址,DNS设为8.8.8.8,国内运营商的DNS经常被污染。
  等最底行出现“deploy”,并且没有报错,就可以开始运行Linux了。点底下的开始按键(像播放器那个键)。

4.SSH连接Linux

  如果手机上安装了juicessh,就可以ssh连接到localhost或者127.0.0.1。如果之前装过Termux,也可以用SSH username@localhost来访问Linux终端窗口。如果ssh报指纹错误,可以用SSH username@localhost -y -y命令来忽略不兼容的加密方式。我比较推荐用termux,主要是因为它的多会话模式很好用,当然juicessh的操作环境最友好。ios中也可以用webssh这个app。
  原文还说明了如何备份镜像文件和调整镜像文件大小的方法,我自己还没试过,就不安利了。有兴趣的自己看原文呗。

5.安装PYTHON

  原文用的是3.9.1最新版,但我安装homeassistant时遇到些.py文件的错误,我解决不了,个人感觉还有些bug。Python 3.8.7是3.8的第七次更新,感觉更成熟,我用了3.8.7来安装。

sudo apt-get update
sudo apt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev
curl -O https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tar.xz
tar -xf Python-3.8.7.tar.xz
cd Python-3.8.7
./configure --enable-optimizations
#查找CPU核数,Z9Max是6
nproc
make -j 6
sudo make altinstall

  这一步会花比较长时间,屏幕显示会比较多,注意看看有没有报错。

6.创建虚拟环境并安装hass

  hass的官方网站也比较推荐使用虚拟环境来安装,原文使用了一个较简单的方法,没有创建专用用户,我本来想用官方教程,但后面apt安装和pip安装死活不行。最后还是用原文创建目录和虚拟环境的方法。

mkdir hass_venv
cd hass_venv
python3.9 -m venv .
cd hass_venv
. bin/activate

  创建目录,生成虚拟环境,激活虚拟环境。注意上面有2条命令中的小数点,别漏了。原文吐槽说官方教程要求建立一个专门用户来运行虚拟环境,他照做时总有问题难以解决,所以他跳过了这一步,但看起来运行得也不错。
  退出虚拟环境,直接输入exit就行了。重新进入虚拟环境用这2条命令:

cd /srv/hass_venv
. bin/activate

   安装依赖包,这步操作要在虚拟环境中做,不然pip是安装不了的:

apt-get install libjpeg62-turbo-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev libharfbuzz-dev libfribidi-dev tcl8.6-dev tk8.6-dev #这些包是安装Pillow必须的
pip install wheel
pip install pillow==7.2.0 #version may vary, check hass log
pip install PyNaCl==1.3.0 #requires some time, version may vary
pip install homeassistant # 如果需要mosquitto: pip install mosquitto

7.运行hass

hass -v

  第一次运行时间比较长,会创建一些文件、安装一些依赖包。注意观察屏幕输出,如果有Error,一般是安装依赖包出错,可以按Ctrl-C退出,再按提示使用pip安装相应的包。我遇到安装numpy的安装错误,numpy现在是1.19.5的版本,在产生wheel时会出错,试了很多办法都解决不了。最后安装1.18.5的版本成功。

pip install numpy==1.18.5

  可以用浏览器来访问hass了,本机访问http://localhost:8123,其他局域网设备访问http://your ip:8123。然后看官方教程来设置你的homeassistant。

8.使用https来访问hass

  按照官方教程https://community.home-assistant.io/t/certificate-authority-and-self-signed-certificate-for-ssl-tls/196970,使用自签名来做https通讯。

1)确认已经安装了OpenSSL

进入HomeAssistant配置目录,本例是在/root/.homeassistant,这样能方便备份签名文件。

2)生成签名文件,运行如下命令:

openssl req -sha256 -addext "subjectAltName = IP:X.X.X.X" -newkey rsa:4096 -nodes -keyout privkey.pem -x509 -days 730 -out fullchain.pem

  这里的X.X.X.X是运行HomeAssistant的机器的局域网IP,手机可以进入WIFI设置看,一般是192.168.X.X这样的。命令执行中会问一堆国家、省、市、组织、姓名之类的问题。命令会生成两个文件privkey.pem和fullchain.pem。

3)编辑配置文件

nano configuration.yaml

  在文件末尾添加如下配置:

http:
  ssl_certificate: /root/.homeassistant/fullchain.pem
  ssl_key: /root/.homeassistant/privkey.pem

  重启hass。按ctrl-c重启hass。访问hass,本机用https://localhost:8123,局域网用https://192.168.x.x:8123。
  内网穿透正在研究,目前还不完美,以后再说。目前自签名的https是可以用frp内网穿透访问了,但ios14的设备还不行。

9.自启动HASS

  Linuxdeploy部署的初始系统是sysv,可以用init.d来做hass的自启动。这里我参考了https://community.home-assistant.io/t/autostart-using-init-d/199494这个教程。

1)脚本创建

  用文本编辑器创建并打开脚本文件

nano /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="cd /srv/hass_venv; . bin/activate;"
# Typically /usr/bin/hass
HASS_BIN="/srv/hass_venv/bin/hass"
RUN_AS="root"
PID_DIR="/var/run/hass"
PID_FILE="$PID_DIR/hass.pid"
CONFIG_DIR="/$RUN_AS/.homeassistant"
LOG_DIR="/var/log/homeassistant"
LOG_FILE="$LOG_DIR/home-assistant.log"
FLAGS="-v --config $CONFIG_DIR --pid-file $PID_FILE --log-file $LOG_FILE --daemon"

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 $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  

  注意RUN_AS和 HASS_BIN两个变量,分别指向运行的用户和HASS所在的目录。

2)使脚本可执行

sudo chmod +x /etc/init.d/hass-daemon

3)安装服务

sudo service hass-daemon install

用markdown重新编辑。排版强迫症



评分

参与人数 2金钱 +40 HASS币 +10 收起 理由
27hh + 20 论坛有你更精彩!
+ 20 + 10 感谢楼主分享!

查看全部评分

回复

使用道具 举报

1

主题

9

帖子

174

积分

注册会员

Rank: 2

积分
174
金钱
165
HASS币
10
 楼主| 发表于 2021-1-15 17:05:48 | 显示全部楼层
这帖子咋修改啊?
第8步后面两条命令chown和chmod我没试过!!本来想删除的,发帖前忘记了。
第8步做完后,访问hass,本机用https://localhost,局域网用https://192.168.x.x
内网穿透正在研究,目前还不完美,以后再说。目前自签名的https是可以用frp内网穿透访问了,但ios14的设备还不行。
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2021-1-15 17:26:57 | 显示全部楼层
本论坛支持 markdown语法

[md]

# 一级标题

## 二级标题

[/md]
Nero
回复

使用道具 举报

1

主题

9

帖子

174

积分

注册会员

Rank: 2

积分
174
金钱
165
HASS币
10
 楼主| 发表于 2021-1-15 17:29:45 | 显示全部楼层
neroxps 发表于 2021-1-15 17:26
本论坛支持 markdown语法

回头再整整。
回复

使用道具 举报

123

主题

4626

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16009
金钱
11298
HASS币
45
发表于 2021-1-15 19:21:54 | 显示全部楼层
河伯 发表于 2021-1-15 17:05
这帖子咋修改啊?
第8步后面两条命令chown和chmod我没试过!!本来想删除的,发帖前忘记了。
第8步做完后, ...

作者可以自己编辑帖子的,帖子左下角有编辑按钮。
回复

使用道具 举报

2

主题

31

帖子

467

积分

中级会员

Rank: 3Rank: 3

积分
467
金钱
436
HASS币
0
发表于 2021-1-16 19:26:41 | 显示全部楼层
LINUX DEPLOY创建用户要加到网络用户组里才可以上网的,不然没权限,楼主自己看一下,AID开头的用户组,要加进去才可以上网。
回复

使用道具 举报

1

主题

9

帖子

174

积分

注册会员

Rank: 2

积分
174
金钱
165
HASS币
10
 楼主| 发表于 2021-1-16 19:50:42 | 显示全部楼层
本帖最后由 河伯 于 2021-1-16 19:52 编辑
xjboss 发表于 2021-1-16 19:26
LINUX DEPLOY创建用户要加到网络用户组里才可以上网的,不然没权限,楼主自己看一下,AID开头的用户组, ...

你是指用于运行hass的专门用户?以后试试
回复

使用道具 举报

32

主题

986

帖子

4233

积分

论坛元老

Rank: 8Rank: 8

积分
4233
金钱
3207
HASS币
110

教程狂人论坛风云人物

发表于 2021-1-16 23:19:20 | 显示全部楼层
哎呀,这不是我梦开始的地方吗。我的第一次安装hass就是在安卓手机上安装的。12年上市的手机。折腾了一下午,还真装成了……当时还没啥设备,于是TTS,快递,天气也玩得不亦乐乎……啊…………
回复

使用道具 举报

0

主题

11

帖子

214

积分

中级会员

Rank: 3Rank: 3

积分
214
金钱
203
HASS币
0
发表于 2021-2-12 15:21:17 | 显示全部楼层
Termux手机一息屏HOMEKIT就没反应了家庭里显示未响应....试试deploy的方法
回复

使用道具 举报

0

主题

25

帖子

488

积分

中级会员

Rank: 3Rank: 3

积分
488
金钱
463
HASS币
0
发表于 2021-4-15 22:42:46 | 显示全部楼层
卡在第六步了,这是什么问题?
$ mkdir hass_venv
mkdir: cannot create directory 'hass_venv': File exists
812A5B52-76F5-43CC-9C04-51B10AA547BB.jpeg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-20 14:47 , Processed in 0.060817 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表