没有树莓派?没关系,手机也行!闲置安卓设备打造智能家庭中枢
起因
在大妈上闲逛,看到这个智能家庭的文章。虽然租住的小地方里一件智能家居设备都没有,不过看了下感兴趣的人还是挺多的。
首先声明,本文并不能教会一个小白如何安装使用 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 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://home-assistant.io/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.nodesource.com/setup_7.x | sudo -E bash -
修改安装源
sudo nano /etc/apt/sources.list.d/nodesource.list
这次用的是清华大学的 NodeSource 源。这里需要注意,如果是树莓派,请不要修改 xenial main 这段,保留原来的值。
deb https://mirrors.tuna.tsinghua.edu.cn/nodesource/deb_7.x xenial main
deb-src https://mirrors.tuna.tsinghua.edu.cn/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.taobao.org
我这里是可以直接安装 HomeBridge 的,如果安装失败的话,就按原贴的步骤操作一下,应该也能解决。
继续安装那个打通 HomeAssistant 的插件
sudo npm install -g homebridge-homeassistant --registry=https://registry.npm.taobao.org
在运行 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 安装就是了,没必要自己手动安装.。
Q:你这贴没讲怎么设置啊?而且没看到你有什么灯,传感器之类的,是不是来骗积分的啊?
A:讲道理基于 TCP/IP 协议的话应该是都没问题的。至于其他外部设备购买的话投入比较大,加上我自己本身并没这方面的需求,所以懒得弄。
Q:稳定性怎么样?
A:稳定性还是取决与设备本身的稳定性,目前看,除了因为操作配置不当引起直接手机挂掉之外,没有遇到正常运行中出现问题的情况。不过以上仅代表我手上的机器以及系统的情况,总的来说还是推荐刷成 CM 之类的原生 ROM。
Q:还能干嘛?
A:由于基本上就是一台运行 Linux 的服务器,抛开内核版本限制,软件方面基本上树莓派这些能做的都能做到。不过树莓派的优势在于 GPIO,这点无法替代,虽然手机的感应器也是能被识别的,不过继续折腾需要有 Linux 的技术能力。

用户名不予显示
校验提示文案
没有人和没有人
校验提示文案
xuyifu
校验提示文案
汗宝
校验提示文案
fcnk123
校验提示文案
fanpest
校验提示文案
值友7353375990
校验提示文案
没有宝可梦
校验提示文案
菊花叁弄
校验提示文案
JustBuylt
source ./homeassistant/bin/activate
提示bash: ./homeassistant/bin/activate:No such file or directory
怎么弄啊
校验提示文案
混日子的猴子
执行到source这条命令的时候会报错,提示权限不足,经过反复确认,命令没有复制错误,而权限不足的原因是第二条命令的问题,查看文件系统后发现执行第二条命令所需的文件夹并不在根目录,而是在/srv目录中,如果直接输入./homeassistant,会无法找到目录。更改為source srv/homeassistant/bin/activate后命令得以顺利执行,并会返回(homeassistant) homeassistant@localhost:/$
校验提示文案
混日子的猴子
中途碰到不少坑。。最坑的就是因为py版本太低导致重装做了一次环境。。第二次直接下3.6.5的py的tgr,解包,编译,安装。然后才没什么问题了。
目前的状况是yeelight的吸顶灯正常工作。iphone自动发现了网关,自动发现了yeelight的吸顶灯。支持亮度控制和颜色控制,但支持不太好。亮度控制无法切换到月光模式。
设置了自动启动。开始之后会加载rc.local,服务应该也是启动了的,但还是必须要用一个ssh连接上去之后手动打开homebridge,否则就是配件无响应。。。还好家里有一台WIN的NAS常年开机。。挂了个ssh常驻了。叫siri开关灯没问题。几个小时不用的话,会卡一会。。要过一分钟左右才能重新连接上配件。。
yeelight的开放协议有点问题。。偶尔会失效,要在软件里重新开关一次。
校验提示文案
寡寡寡寡人
校验提示文案
晚安先生
校验提示文案
kisssssss
校验提示文案
戏命
校验提示文案
费舍奥特曼
校验提示文案
买到就是赚到i
校验提示文案
James1111
校验提示文案
exiamin
校验提示文案
有木有先生
校验提示文案
winoverone
校验提示文案
Jonasub
校验提示文案
知不知道买
校验提示文案
买到就是赚到i
校验提示文案
szsdwf
校验提示文案
yjhz
校验提示文案
混日子的猴子
中途碰到不少坑。。最坑的就是因为py版本太低导致重装做了一次环境。。第二次直接下3.6.5的py的tgr,解包,编译,安装。然后才没什么问题了。
目前的状况是yeelight的吸顶灯正常工作。iphone自动发现了网关,自动发现了yeelight的吸顶灯。支持亮度控制和颜色控制,但支持不太好。亮度控制无法切换到月光模式。
设置了自动启动。开始之后会加载rc.local,服务应该也是启动了的,但还是必须要用一个ssh连接上去之后手动打开homebridge,否则就是配件无响应。。。还好家里有一台WIN的NAS常年开机。。挂了个ssh常驻了。叫siri开关灯没问题。几个小时不用的话,会卡一会。。要过一分钟左右才能重新连接上配件。。
yeelight的开放协议有点问题。。偶尔会失效,要在软件里重新开关一次。
校验提示文案
混日子的猴子
执行到source这条命令的时候会报错,提示权限不足,经过反复确认,命令没有复制错误,而权限不足的原因是第二条命令的问题,查看文件系统后发现执行第二条命令所需的文件夹并不在根目录,而是在/srv目录中,如果直接输入./homeassistant,会无法找到目录。更改為source srv/homeassistant/bin/activate后命令得以顺利执行,并会返回(homeassistant) homeassistant@localhost:/$
校验提示文案
柖华
校验提示文案
akuelin
ubuntu下跑sudo apt-get install tofrodos
fromdos hass-daemon hass-daemon
就好了
校验提示文案
akuelin
换一个ubuntu源看看,我也是这个问题
换成清华的源就好了 源地址:去看看
校验提示文案
akuelin
换了清华的源就好了
去看看
校验提示文案
marinecn
校验提示文案
墨澜酱
校验提示文案
嗳逗趣
校验提示文案
嗳逗趣
校验提示文案
NiFFF
校验提示文案
Dontsing
>>>deploy
校验提示文案
八千里路云和月_
校验提示文案