沒有樹莓派?沒關(guān)系,手機也行!閑置安卓設(shè)備打造智能家庭中樞
起因
在大媽上閑逛,看到這個智能家庭的文章。雖然租住的小地方里一件智能家居設(shè)備都沒有


首先聲明,本文并不能教會一個小白如何安裝使用 HomeAssistant,內(nèi)容方面也僅僅是如何在安卓設(shè)備上安裝,沒有詳細的配置方法。選擇 DIY 就要有足夠的技能和細心來解決問題,吐槽難度的話,大可鼠標右上角點 x,然后掏錢買買買就行了。
雖然手上有樹莓派,不過考慮到很多有興趣的值友手上是沒有的,所以弄個利用閑置安卓設(shè)備的解決方法分享出來。本篇涉及的命令還是比較多的,不過按照步驟一步一步來應(yīng)該沒有問題。
大概吧

準備工作
條件是必須已經(jīng) root,手機,平板,安卓盒子都是可行的。不過考慮到運行內(nèi)存的問題,最好是單獨運行,不要兼用其他用途。
我使用的設(shè)備是刷了 LineageOS 14 的 ZUK Z2,但基本只要 Linux Deploy 支持都是可以的。Linux Deploy 對硬件的要求是最小 512MB 運行內(nèi)存,推薦 1GB。
另外,由于Linux Deploy 實現(xiàn)功能的方式,不當(dāng)操作可能會損壞手機本身系統(tǒng),造成無法正常進入系統(tǒng),可能需要重新刷機才能正常工作,所以一定要做好好重新刷機的準備。
推薦刷成 CM,LineageOS,魔趣等原生系統(tǒng) ROM,如果使用原廠 ROM 最好重置一下出廠設(shè)置,避免運存不足殺死關(guān)鍵進程造成不穩(wěn)定。如果 ROM 里面有各種清理內(nèi)存或省電的功能,請設(shè)置好白名單,避免 Linux Deploy 被殺掉進程。
供電方面,只要不是比較老的設(shè)備,電源供電足夠的話是不會經(jīng)過電池的,所以這方面還是可以放心的。
理論上x86的安卓設(shè)備也行,不過手頭上并沒有設(shè)備可以測試,所以不保證按本教程操作可以正常運行,還請見諒。
首先需要需要下載以下兩個 APP :

部署Linux系統(tǒng):Linux Deploy(ru.meefik.linuxdeploy)_2.0.2_Android應(yīng)用_酷安網(wǎng)部署Linux系統(tǒng):Linux Deploy(ru.meefik.linuxdeploy) 2.0.2:部署Linux系統(tǒng)是個在安卓上安裝其他Linux發(fā)行版的工具,對于喜歡折騰的酷友來說這自然又是一個不可多得的好物。需要注意有時候有的稍微冷門一點的發(fā)行版可能沒有國內(nèi)的鏡像,安裝起來會耗費更多的時間coolapk.com去看看

BusyBox installer(ru.meefik.busybox)_1.26.2_Android應(yīng)用_酷安網(wǎng)BusyBox installer(ru.meefik.busybox) 1.26.2:BusyBox installer酷友說是很好,漂亮穩(wěn)定,需要busybox的可以試試,咱一般的用戶貌似都用不上這個。coolapk.com去看看
基本環(huán)境
Linux Deploy 使用了類似容器的技術(shù),可以在安卓設(shè)備上運行 linux 發(fā)行版,比如:Ubuntu、Debian。不過由于內(nèi)核還是要看宿主設(shè)備的內(nèi)核,所以有些應(yīng)用如果需要最新內(nèi)核就沒法用了(比如 Docker),Android 7.1.1 使用的 Linux 內(nèi)核還是 3.18 版本。
HomeAssistant 是基于 Python 開發(fā)的,而 Homebridge 是基于Nodejs,兩者都是可以跨平臺運行的。所以只需要先使用 Linux Deploy 安裝好 Linux ,然后再安裝它們就能解決掉問題了

本文還附帶了修改安裝源來提高安裝速度的方法,在樹莓派上安裝慢的問題也可以用一樣的方法解決,希望能幫助有興趣的同學(xué)。
安裝 BusyBox
這里也可以選擇自己喜歡的 BusyBox,沒有特別要求。安裝好BusyBox 之后需要打開 APP,再點擊一下 Install 安裝,安裝路徑默認為 /system/xbin 即可。
然后在 Linux Deploy 的 設(shè)置 中點擊一下 更新環(huán)境, 這樣準備工作就完成了。
如何確認環(huán)境是否滿足條件?
這里需要確定 su 是可用的,由于需要準備刷機,所以 adb 肯定是有的,而且驅(qū)動也是安裝好的。至于 adb 和 驅(qū)動問題請自行解決,如果這些都解決不了的話建議還是別繼續(xù)了,因為后面的更復(fù)雜

按圖所示,如果最后執(zhí)行 su 命令之后命令行那里變成 # 就說明滿足繼續(xù)的條件了,如果報錯,請自行百度解決,畢竟怎么刷機這個估計都可以單獨寫一篇了

安裝 Linux Deploy
首先必須給 Root 權(quán)限,而且已經(jīng)安裝了 BusyBox。對于 Android 6.0以上的設(shè)備,需要在應(yīng)用權(quán)限設(shè)置中給 Linux Deploy 訪問存儲設(shè)備的權(quán)限。
打開 Linux Deploy 后就會有個默認配置,這里需要修改一下配置。點擊右下角那個看起來像下載的按鈕

首先是發(fā)行版,這里為了后面省事將默認的 Debian 改為 Ubuntu。(Debian 的 Python 版本過低,HomeAssistant 使用了異步庫需要 Python3.5+才支持。)
架構(gòu)默認就行,也可以像我這樣改成 arm64。這個需要根據(jù)實際設(shè)備來設(shè)置,建議默認即可(再次重申——手頭沒有x86的安卓設(shè)備測試)。
源地址可以修改為國內(nèi)鏡像源,這里我用了中科大的源。
往下的需要注意的是用戶名和密碼,默認即可,后面如果忘記用戶和密碼還可以來這里查看。
勾選 "允許 SSH 服務(wù)器啟動"。
設(shè)置完成之后回到主界面,點擊右上角的三個點,選擇 安裝,剩下的就是等待了。
如果一切順利,可以看到 <<< deploy 字樣,說明鏡像已經(jīng)構(gòu)建完成了。這個時間會稍久一些,大概10-30分鐘。
點擊 啟動 按鈕,看到 <<< start 字樣就說明 OK 了。如果 Starting extra/ssh 那里有 找不到 su 命令的字樣,請先回到上面的 BusyBox 安裝部分,更新一下 環(huán)境設(shè)置,用 adb 測試一下 su 是否存在。
剩下的操作就需要用到終端了,雖然也可以安裝一個 APP 解決,不過還是建議在電腦上操作,復(fù)制粘貼命令比較方便。

終端軟件
Windows 上的話我用的是 XShell 和 XFtp,對于家庭和學(xué)校授權(quán)是免費的。另外推薦安裝一個文本編輯器 Notepad++,因為 Windows 上的默認文件編碼與 Linux 不同,如果使用自帶的記事本很可能會造成 Linux 下識別不正常。以上軟件的下載地址請自行搜索,或者使用熟悉的工具替代。
鏈接的地址在 Linux Deploy 上有顯示,就是頂端顯示的 IP。這里接受保存密鑰繼續(xù),然后就是用屬性里面的用戶名和密碼登陸就可以了,如果忘記的話,就在 App 上查看一下。
使用 XFTP 可以直接管理文件,不過鏈接地址那里需要指明一下協(xié)議 sftp,完整示例:
連接成功之后就對有權(quán)限的文件就可以直接編輯了。
其他
這里提供一下三個配置文件,可以使用 SFTP 上傳到 /home/android 目錄,方便后面使用
https://pan.baidu.com/s/1slVplDF
由于發(fā)行版默認沒有安裝 nano 所以需要手動安裝一下
sudo apt-get install nano
nano 的基本操作就是 Ctrl+O 是保存,會提示是否寫入,回車確認即可,Ctrl+X 是退出
HomeAssistant
運行環(huán)境
前面說過需要安裝的 Python3 已經(jīng)自帶了,版本是 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 虛擬環(huán)境工具
sudo pip3 install virtualenv
安裝 HomeAssistant
首先要添加一個用戶
sudo useradd -rm homeassistant
在 /srv 目錄下面添加 python 運行環(huán)境,
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"
需要把新建的文件權(quán)限給 homeassistant 用戶
sudo chown -R homeassistant:homeassistant /home/homeassistant/.pip
然后切換到新建的用戶
sudo su -s /bin/bash homeassistant
創(chuàng)建 Python 虛擬運行環(huán)境并切換
virtualenv -p python3 /srv/homeassistant
source ./homeassistant/bin/activate
成功的話終端命令行應(yīng)該會顯示為:
(homeassistant) homeassistant@localhost:/$
終于可以安裝 homeassistant 了

pip3 install -U homeassistant
啟動 homeassistant 之前還需要在 Linux Deploy 上設(shè)置一下,否則會因為用戶沒有網(wǎng)絡(luò)訪權(quán)限而啟動失敗。
在配置中 Privileged users 里添加 homeassistant,需要用空格和默認的 root 隔開(英文半角空格)
然后到主界面的右上角菜單里點擊一下配置,等待完成后就可以繼續(xù)了。
嘗試啟動 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
如果是從文檔中復(fù)制的話,則需要自己創(chuàng)建文件后編輯
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;"
保存配置文件之后接著執(zhí)行下面的命令
sudo chmod +x /etc/init.d/hass-daemon
sudo update-rc.d hass-daemon defaults
sudo service hass-daemon install
最后可以手動嘗試啟動服務(wù)
sudo /etc/init.d/hass-daemon start
啟動腳本中定義了日志輸出,可以通過下面的命令查看日志
tail /var/opt/homeassistant/home-assistant.log
另外需要注意的是,官方文檔中的啟動腳本是指定了配置文件的路徑的
CONFIG_DIR="/var/opt/homeassistant"
如果需要編輯配置文件需要到該目錄下編輯。
當(dāng)然也可以修改會默認的目錄下面
CONFIG_DIR="/home/homeassistant/.homeassistant
接著需要在 Linux Deploy 中設(shè)置一下,點擊右下角那個像下載圖標的按鈕。
啟用 INIT 下的自定義腳本執(zhí)行,然后確認 Init setting 里的 init path 是 /etc/rc.local
接著在終端中編輯這個文件
sudo nano /etc/rc.local
在 exit 0 上面添加一行
sudo /etc/init.d/hass-daemon start
這樣鏡像啟動時就會啟動 homeassistant 了。
由于手上沒有任何智能家居設(shè)備,所以后續(xù)就沒法測試了

理論上講是可行的,當(dāng)然如果有好心人捐贈個燈泡什么的給我測試就最好不過了

Homebridge
運行環(huán)境
默認是沒有安裝 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
這次用的是清華大學(xué)的 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 安裝一樣是慢如蝸牛。也可以通過修改源來解決。老是擼大學(xué)的羊毛不好意思

sudo npm install -g --unsafe-perm homebridge --registry=https://registry.npm.taobao.org
我這里是可以直接安裝 HomeBridge 的,如果安裝失敗的話,就按原貼的步驟操作一下,應(yīng)該也能解決。
繼續(xù)安裝那個打通 HomeAssistant 的插件
sudo npm install -g homebridge-homeassistant --registry=https://registry.npm.taobao.org
在運行 HomeBridge 之前還需要解決一個問題,簡單來說就是由于 Linux Deploy 的運行方式,有個依賴的服務(wù)無法正常啟動,會造成 HomeBridge 無法啟動

編輯一下這個服務(wù)的配置文件
sudo nano /etc/avahi/avahi-daemon.conf
需要將 publish 中的所有參數(shù)都注釋掉,在對應(yīng)的配置項之前加 # 號即可(.....表示省略的內(nèi)容,實際是沒有的)。
......
[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
......
然后需要修改服務(wù)的啟動參數(shù)
sudo nano /etc/init.d/avahi-daemon
找到啟動服務(wù)的地方 d_start() 這一段,在 $DAEMON 后面添加上 --no-drop-root 參數(shù)
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
}
這里首先試試手動啟動相關(guān)服務(wù)
sudo /etc/init.d/dbus start
sudo /etc/init.d/avahi-daemon start
兩個服務(wù)都啟動成功的話,就可以嘗試手動啟動 HomeBridge 了
Homebridge is running on port 51826.
如果看到上面的字樣就表示 HomeBridge 在運行了,可以到 ios 家庭應(yīng)用中查看是否能找到了。
同樣的,由于手上沒有任何智能家居設(shè)備,所以后面的功能無法測試

開機啟動
仍然只能以 init.d 腳本的方式啟動,而且這次需要先啟動兩個依賴的服務(wù)

跟 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
同樣的,服務(wù)文件也指定了配置文件的路徑,配置需要到在 /var/opt/homebridge 中修改。
修改完配置需要重啟 homebridge 生效
sudo /etc/init.d/homebridge restart
需要再次編輯 /etc/rc.local 文件添加啟動命令,最終的文件內(nèi)容如下(.....表示省略的內(nèi)容,實際是沒有的)
......
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
應(yīng)該是 wlan0 網(wǎng)卡的 MAC 地址,就是HWaddr 后面那一段
wlan0 Link encap:Ethernet HWaddr d8:9a:34:0d:89:95
要注意,在配置文件中填寫時字母部分必須是大寫。
MQTT
說實話,看不明白這個 MQTT 安裝的目的是什么


這里使用包管理器直接安裝,版本是 1.4.8 與腳本中的 1.4.11 很接近應(yīng)該沒有什么問題。
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 應(yīng)該是沒有隨鏡像啟動的,照著前面的方式到 rc.local 中添加就可以了。
SMB
從引用的幾個教程并沒有提到必須安裝共享功能,原帖里也僅僅是用來修改配置文件。由于上傳修改文件可以使用 XFtp 來解決,所以這里就省去了。
如果確實要安裝的話步驟是和原帖一致的,唯一需要注意的就是啟動服務(wù)要用 /etc/init.d 中的腳本啟動。看大家反饋情況,如果確實是必須安裝的話,就后續(xù)補充起來。(不排除挖坑不填

FAQ
Q:為啥不安裝 KODI?
A:運行內(nèi)存不足的時候系統(tǒng)會自動殺后臺,如果 Linux Deploy 被殺掉就都掛了。而且 KODI 有 android 版本,直接下載 apk 安裝就是了,沒必要自己手動安裝.。

Kodi(原XBMC)(org.xbmc.kodi)_17.1_Android應(yīng)用_酷安網(wǎng)Kodi(原XBMC)(org.xbmc.kodi) 17.1:小編一直不明白為啥有這么好燒包的播放器,看兩個毛片也不至于啊,一般的播放器都看的清楚,也有聲音,這XBMC小編之前是真沒怎么接觸過,看樣子是個狠貨,而且這體積夠大,看樣子解碼器很強大。coolapk.com去看看
Q:你這貼沒講怎么設(shè)置???而且沒看到你有什么燈,傳感器之類的,是不是來騙積分的???
A:講道理基于 TCP/IP 協(xié)議的話應(yīng)該是都沒問題的。至于其他外部設(shè)備購買的話投入比較大,加上我自己本身并沒這方面的需求,所以懶得弄

Q:穩(wěn)定性怎么樣?
A:穩(wěn)定性還是取決與設(shè)備本身的穩(wěn)定性,目前看,除了因為操作配置不當(dāng)引起直接手機掛掉之外,沒有遇到正常運行中出現(xiàn)問題的情況。不過以上僅代表我手上的機器以及系統(tǒng)的情況,總的來說還是推薦刷成 CM 之類的原生 ROM。
Q:還能干嘛?
A:由于基本上就是一臺運行 Linux 的服務(wù)器,拋開內(nèi)核版本限制,軟件方面基本上樹莓派這些能做的都能做到。不過樹莓派的優(yōu)勢在于 GPIO,這點無法替代,雖然手機的感應(yīng)器也是能被識別的,不過繼續(xù)折騰需要有 Linux 的技術(shù)能力。