没有树莓派?没关系,手机也行!闲置安卓设备打造智能家庭中枢
起因
在大妈上闲逛,看到这个智能家庭的文章。虽然租住的小地方里一件智能家居设备都没有,不过看了下感兴趣的人还是挺多的。

首先声明,本文并不能教会一个小白如何安装使用 HomeAssistant,内容方面也仅仅是如何在安卓设备上安装,没有详细的配置方法。选择 DIY 就要有足够的技能和细心来解决问题,吐槽难度的话,大可鼠标右上角点 x,然后掏钱买买买就行了。
虽然手上有树莓派,不过考虑到很多有兴趣的值友手上是没有的,所以弄个利用闲置安卓设备的解决方法分享出来。本篇涉及的命令还是比较多的,不过按照步骤一步一步来应该没有问题。
大概吧 。
准备工作
条件是必须已经 root,手机,平板,安卓盒子都是可行的。不过考虑到运行内存的问题,最好是单独运行,不要兼用其他用途。
我使用的设备是刷了 LineageOS 14 的 ZUK Z2,但基本只要 Linux Deploy 支持都是可以的。Linux Deploy 对硬件的要求是最小 512MB 运行内存,推荐 1GB。
另外,由于Linux Deploy 实现功能的方式,不当操作可能会损坏手机本身系统,造成无法正常进入系统,可能需要重新刷机才能正常工作,所以一定要做好好重新刷机的准备。
推荐刷成 CM,LineageOS,魔趣等原生系统 ROM,如果使用原厂 ROM 最好重置一下出厂设置,避免运存不足杀死关键进程造成不稳定。如果 ROM 里面有各种清理内存或省电的功能,请设置好白名单,避免 Linux Deploy 被杀掉进程。
供电方面,只要不是比较老的设备,电源供电足够的话是不会经过电池的,所以这方面还是可以放心的。
理论上x86的安卓设备也行,不过手头上并没有设备可以测试,所以不保证按本教程操作可以正常运行,还请见谅。
首先需要需要下载以下两个 APP :

部署Linux系统:Linux Deploy(ru.meefik.linuxdeploy)_2.0.2_Android应用_酷安网部署Linux系统:Linux Deploy(ru.meefik.linuxdeploy) 2.0.2:部署Linux系统是个在安卓上安装其他Linux发行版的工具,对于喜欢折腾的酷友来说这自然又是一个不可多得的好物。需要注意有时候有的稍微冷门一点的发行版可能没有国内的镜像,安装起来会耗费更多的时间去看看

BusyBox installer(ru.meefik.busybox)_1.26.2_Android应用_酷安网BusyBox installer(ru.meefik.busybox) 1.26.2:BusyBox installer酷友说是很好,漂亮稳定,需要busybox的可以试试,咱一般的用户貌似都用不上这个。去看看
基本环境
Linux Deploy 使用了类似容器的技术,可以在安卓设备上运行 linux 发行版,比如:Ubuntu、Debian。不过由于内核还是要看宿主设备的内核,所以有些应用如果需要最新内核就没法用了(比如 Docker),Android 7.1.1 使用的 Linux 内核还是 3.18 版本。
HomeAssistant 是基于 Python 开发的,而 Homebridge 是基于Nodejs,两者都是可以跨平台运行的。所以只需要先使用 Linux Deploy 安装好 Linux ,然后再安装它们就能解决掉问题了。
本文还附带了修改安装源来提高安装速度的方法,在树莓派上安装慢的问题也可以用一样的方法解决,希望能帮助有兴趣的同学。
安装 BusyBox
这里也可以选择自己喜欢的 BusyBox,没有特别要求。安装好BusyBox 之后需要打开 APP,再点击一下 Install 安装,安装路径默认为 /system/xbin 即可。
然后在 Linux Deploy 的 设置 中点击一下 更新环境, 这样准备工作就完成了。
如何确认环境是否满足条件?
这里需要确定 su 是可用的,由于需要准备刷机,所以 adb 肯定是有的,而且驱动也是安装好的。至于 adb 和 驱动问题请自行解决,如果这些都解决不了的话建议还是别继续了,因为后面的更复杂。
按图所示,如果最后执行 su 命令之后命令行那里变成 # 就说明满足继续的条件了,如果报错,请自行百度解决,毕竟怎么刷机这个估计都可以单独写一篇了。
安装 Linux Deploy
首先必须给 Root 权限,而且已经安装了 BusyBox。对于 Android 6.0以上的设备,需要在应用权限设置中给 Linux Deploy 访问存储设备的权限。
打开 Linux Deploy 后就会有个默认配置,这里需要修改一下配置。点击右下角那个看起来像下载的按钮。
首先是发行版,这里为了后面省事将默认的 Debian 改为 Ubuntu。(Debian 的 Python 版本过低,HomeAssistant 使用了异步库需要 Python3.5+才支持。)
架构默认就行,也可以像我这样改成 arm64。这个需要根据实际设备来设置,建议默认即可(再次重申——手头没有x86的安卓设备测试)。
源地址可以修改为国内镜像源,这里我用了中科大的源。
往下的需要注意的是用户名和密码,默认即可,后面如果忘记用户和密码还可以来这里查看。
勾选 "允许 SSH 服务器启动"。
设置完成之后回到主界面,点击右上角的三个点,选择 安装,剩下的就是等待了。
如果一切顺利,可以看到 <<< deploy 字样,说明镜像已经构建完成了。这个时间会稍久一些,大概10-30分钟。
点击 启动 按钮,看到 <<< start 字样就说明 OK 了。如果 Starting extra/ssh 那里有 找不到 su 命令的字样,请先回到上面的 BusyBox 安装部分,更新一下 环境设置,用 adb 测试一下 su 是否存在。
剩下的操作就需要用到终端了,虽然也可以安装一个 APP 解决,不过还是建议在电脑上操作,复制粘贴命令比较方便。
终端软件
Windows 上的话我用的是 XShell 和 XFtp,对于家庭和学校授权是免费的。另外推荐安装一个文本编辑器 Notepad++,因为 Windows 上的默认文件编码与 Linux 不同,如果使用自带的记事本很可能会造成 Linux 下识别不正常。以上软件的下载地址请自行搜索,或者使用熟悉的工具替代。
链接的地址在 Linux Deploy 上有显示,就是顶端显示的 IP。这里接受保存密钥继续,然后就是用属性里面的用户名和密码登陆就可以了,如果忘记的话,就在 App 上查看一下。
使用 XFTP 可以直接管理文件,不过链接地址那里需要指明一下协议 sftp,完整示例:
连接成功之后就对有权限的文件就可以直接编辑了。
其他
这里提供一下三个配置文件,可以使用 SFTP 上传到 /home/android 目录,方便后面使用
https://pan.baidu.com/s/1slVplDF
由于发行版默认没有安装 nano 所以需要手动安装一下
sudo apt-get install nano
nano 的基本操作就是 Ctrl+O 是保存,会提示是否写入,回车确认即可,Ctrl+X 是退出
HomeAssistant
运行环境
前面说过需要安装的 Python3 已经自带了,版本是 3.5.1,可以输入下面的命令查看版本
python3 -V
需要安装一下Python 的包管理器
sudo apt-get install -y python3-pip
这里为了解决安装慢的问题,需要修改一下 Python 包管理器(pip)的安装源
sudo mkdir /root/.pip
sudo sh -c "echo '[global]nindex-url = https://mirrors.ustc.edu.cn/pypi/web/simple/' > /root/.pip/pip.conf"
更新一下 pip 试试安装速度
sudo pip3 install -U pip
安装需要用到的 python 虚拟环境工具
sudo pip3 install virtualenv
安装 HomeAssistant
首先要添加一个用户
sudo useradd -rm homeassistant
在 /srv 目录下面添加 python 运行环境,
sudo mkdir /srv/homeassistant
sudo chown homeassistant:homeassistant /srv/homeassistant
之前修改过的 pip 安装源是针对 root 用户的,由于要使用 homeassistant 这个用户运行,而首次运行过程中又需要安装一些 python 包,所以这里还得来一次。
sudo mkdir /home/homeassistant/.pip
sudo sh -c "echo '[global]nindex-url = https://mirrors.ustc.edu.cn/pypi/web/simple/' > /home/homeassistant/.pip/pip.conf"
需要把新建的文件权限给 homeassistant 用户
sudo chown -R homeassistant:homeassistant /home/homeassistant/.pip
然后切换到新建的用户
sudo su -s /bin/bash homeassistant
创建 Python 虚拟运行环境并切换
virtualenv -p python3 /srv/homeassistant
source ./homeassistant/bin/activate
成功的话终端命令行应该会显示为:
(homeassistant) homeassistant@localhost:/$
终于可以安装 homeassistant 了
pip3 install -U homeassistant
启动 homeassistant 之前还需要在 Linux Deploy 上设置一下,否则会因为用户没有网络访权限而启动失败。
在配置中 Privileged users 里添加 homeassistant,需要用空格和默认的 root 隔开(英文半角空格)
然后到主界面的右上角菜单里点击一下配置,等待完成后就可以继续了。
尝试启动 homeassistant,需要注意的是启动过程中其实也有安装一些 Python 包,所以需要等一下才可以.
hass
在终端中看到:
INFO:homeassistant.bootstrap:Home Assistant initialized in 108.88s
表示启动成功,然后就可以在浏览器中打开 https://ip_address:8123 来看看成果了
按 Ctrl+C 退出 homeassistant,方便下面的操作。
这里启动只是为了看一下是否能正常运行,配置好开机运行之后再进行 homeassistant 的配置。
开机运行
注意:如果是接着上面操作,请先用 exit 命令退出 homeassistant 用户
由于 Linux Deploy 运行的方式无法使用 systemctl 的方式来做开机运行。只能使用 init.d 脚本的方式添加。
先参考项目文档 https:///docs/autostart/init.d/ 添加好启动脚本。
或者直接下载我提供的配置文件 hass-daemon (注意,没有后缀,可以用 Notepad++ 打开编辑。)
如果是使用我提供的文件
sudo cp /home/android/hass-daemon /etc/init.d/hass-daemon
如果是从文档中复制的话,则需要自己创建文件后编辑
sudo touch /etc/init.d/hass-daemon
sudo nano /etc/init.d/hass-daemon
需要修改 RUN_AS 和 PRE_EXEC 这两个值
RUN_AS="homeassistant"
PRE_EXEC="source /srv/homeassistant/bin/activate;"
保存配置文件之后接着执行下面的命令
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
接着需要在 Linux Deploy 中设置一下,点击右下角那个像下载图标的按钮。
启用 INIT 下的自定义脚本执行,然后确认 Init setting 里的 init path 是 /etc/rc.local
接着在终端中编辑这个文件
sudo nano /etc/rc.local
在 exit 0 上面添加一行
sudo /etc/init.d/hass-daemon start
这样镜像启动时就会启动 homeassistant 了。
由于手上没有任何智能家居设备,所以后续就没法测试了。
理论上讲是可行的,当然如果有好心人捐赠个灯泡什么的给我测试就最好不过了。
Homebridge
运行环境
默认是没有安装 curl 的,手动安装一下
sudo apt-get install -y curl
使用官方脚本先添加好安装源
curl -sL https://deb./setup_7.x | sudo -E bash -
修改安装源
sudo nano /etc/apt/sources.list.d/nodesource.list
这次用的是清华大学的 NodeSource 源。这里需要注意,如果是树莓派,请不要修改 xenial main 这段,保留原来的值。
deb https://mirrors.tuna./nodesource/deb_7.x xenial main
deb-src https://mirrors.tuna./nodesource/deb_7.x xenial main
安装 nodejs
sudo apt-get update
sudo apt-get install -y nodejs
然后是几个编译用到的依赖包
sudo apt-get install -y python git libavahi-compat-libdnssd-dev
npm 安装一样是慢如蜗牛。也可以通过修改源来解决。老是撸大学的羊毛不好意思 ,这次换成阿里爸爸的。
sudo npm install -g --unsafe-perm homebridge --registry=https://registry.npm.
我这里是可以直接安装 HomeBridge 的,如果安装失败的话,就按原贴的步骤操作一下,应该也能解决。
继续安装那个打通 HomeAssistant 的插件
sudo npm install -g homebridge-homeassistant --registry=https://registry.npm.
在运行 HomeBridge 之前还需要解决一个问题,简单来说就是由于 Linux Deploy 的运行方式,有个依赖的服务无法正常启动,会造成 HomeBridge 无法启动 。
编辑一下这个服务的配置文件
sudo nano /etc/avahi/avahi-daemon.conf
需要将 publish 中的所有参数都注释掉,在对应的配置项之前加 # 号即可(.....表示省略的内容,实际是没有的)。
......
[publish]
#disable-publishing=yes
#disable-user-service-publishing=no
#add-service-cookie=no
#publish-addresses=yes
#publish-hinfo=no
#publish-workstation=no
#publish-domain=yes
#publish-dns-servers=192.168.50.1, 192.168.50.2
#publish-resolv-conf-dns-servers=yes
#publish-aaaa-on-ipv4=yes
#publish-a-on-ipv6=no
......
然后需要修改服务的启动参数
sudo nano /etc/init.d/avahi-daemon
找到启动服务的地方 d_start() 这一段,在 $DAEMON 后面添加上 --no-drop-root 参数
d_start() {
$DAEMON --no-drop-root -c && return 0
if [ -e $DISABLE_TAG -a "$AVAHI_DAEMON_DETECT_LOCAL" != "0" ]; then
# Disabled because of the existance of an unicast .local domain
log_warning_msg "avahi-daemon disabled because there is a unicast .local domain"
exit 0;
fi;
$DAEMON --no-drop-root -D
}
这里首先试试手动启动相关服务
sudo /etc/init.d/dbus start
sudo /etc/init.d/avahi-daemon start
两个服务都启动成功的话,就可以尝试手动启动 HomeBridge 了
Homebridge is running on port 51826.
如果看到上面的字样就表示 HomeBridge 在运行了,可以到 ios 家庭应用中查看是否能找到了。
同样的,由于手上没有任何智能家居设备,所以后面的功能无法测试。
开机启动
仍然只能以 init.d 脚本的方式启动,而且这次需要先启动两个依赖的服务。
跟 HomeAssistant 一样,需要在 Privileged users 中添加 homebridge,然后重新配置。
同样参考项目文档 https://github.com/nfarina/homebridge/wiki/Homebridge-autostart-at-boot-(init.d)-on-Ubuntu-(linux)
这次就不详细说明命令了,可以参考上面 HomeAssistant 中的说明,基本上意思差不多。
sudo useradd -r homebridge
sudo mkdir /var/opt/homebridge
sudo cp -R ~/.homebridge/* /var/opt/homebridge
sudo chown -R homebridge:homebridge /var/opt/homebridge
sudo chmod -R +x /var/opt/homebridge
sudo cp ~/homebridge /etc/init.d/homebridge
sudo chmod +x /etc/init.d/homebridge
sudo update-rc.d homebridge defaults
然后尝试手动启动 homebridge
sudo /etc/init.d/dbus start
sudo /etc/init.d/avahi-daemon start
sudo /etc/init.d/homebridge start
通过查看运行日志可以知道运行的情况
tail /var/log/homebridge.log
tail /var/log/homebridge.err
同样的,服务文件也指定了配置文件的路径,配置需要到在 /var/opt/homebridge 中修改。
修改完配置需要重启 homebridge 生效
sudo /etc/init.d/homebridge restart
需要再次编辑 /etc/rc.local 文件添加启动命令,最终的文件内容如下(.....表示省略的内容,实际是没有的)
......
sudo /etc/init.d/hass-daemon start
sudo /etc/init.d/dbus start
sudo /etc/init.d/avahi-daemon start
sudo /etc/init.d/homebridge start
exit 0
其他
查看 MAC 地址
直接用命令就可以看了
ifconfig
应该是 wlan0 网卡的 MAC 地址,就是HWaddr 后面那一段
wlan0 Link encap:Ethernet HWaddr d8:9a:34:0d:89:95
要注意,在配置文件中填写时字母部分必须是大写。
MQTT
说实话,看不明白这个 MQTT 安装的目的是什么,不过看了下安装脚本,应该是有用的
。
这里使用包管理器直接安装,版本是 1.4.8 与脚本中的 1.4.11 很接近应该没有什么问题。
sudo apt-get install -y mosquitto mosquitto-clients
安装好之后就是配置
cd /etc/mosquitto
sudo cp /home/android/mosquitto.conf /etc/mosquitto/mosquitto.conf
sudo chown mosquitto:mosquitto mosquitto.conf
sudo touch pwfile
sudo mosquitto_passwd -b pwfile "pi" "raspberry"
sudo chown mosquitto:mosquitto pwfile
sudo chmod 0600 pwfile
sudo /etc/init.d/mosquitto restart
配置文件、账号和密码使用了树莓派安装脚本的方式,另外 MQTT 应该是没有随镜像启动的,照着前面的方式到 rc.local 中添加就可以了。
SMB
从引用的几个教程并没有提到必须安装共享功能,原帖里也仅仅是用来修改配置文件。由于上传修改文件可以使用 XFtp 来解决,所以这里就省去了。
如果确实要安装的话步骤是和原帖一致的,唯一需要注意的就是启动服务要用 /etc/init.d 中的脚本启动。看大家反馈情况,如果确实是必须安装的话,就后续补充起来。(不排除挖坑不填 )
FAQ
Q:为啥不安装 KODI?
A:运行内存不足的时候系统会自动杀后台,如果 Linux Deploy 被杀掉就都挂了。而且 KODI 有 android 版本,直接下载 apk 安装就是了,没必要自己手动安装.。

Kodi(原XBMC)(org.xbmc.kodi)_17.1_Android应用_酷安网Kodi(原XBMC)(org.xbmc.kodi) 17.1:小编一直不明白为啥有这么好烧包的播放器,看两个毛片也不至于啊,一般的播放器都看的清楚,也有声音,这XBMC小编之前是真没怎么接触过,看样子是个狠货,而且这体积够大,看样子解码器很强大。去看看
Q:你这贴没讲怎么设置啊?而且没看到你有什么灯,传感器之类的,是不是来骗积分的啊?
A:讲道理基于 TCP/IP 协议的话应该是都没问题的。至于其他外部设备购买的话投入比较大,加上我自己本身并没这方面的需求,所以懒得弄。
Q:稳定性怎么样?
A:稳定性还是取决与设备本身的稳定性,目前看,除了因为操作配置不当引起直接手机挂掉之外,没有遇到正常运行中出现问题的情况。不过以上仅代表我手上的机器以及系统的情况,总的来说还是推荐刷成 CM 之类的原生 ROM。
Q:还能干嘛?
A:由于基本上就是一台运行 Linux 的服务器,抛开内核版本限制,软件方面基本上树莓派这些能做的都能做到。不过树莓派的优势在于 GPIO,这点无法替代,虽然手机的感应器也是能被识别的,不过继续折腾需要有 Linux 的技术能力。