# 安卓手机变身智能家居中枢:AidLux+Python3.10搭建HomeAssistant避坑指南
家里总有那么一两台旧安卓手机,性能尚可,但食之无味,弃之可惜。与其让它们在抽屉里积灰,不如赋予它们新的使命——成为你智能家居系统的“大脑”。想象一下,一台旧手机,24小时不间断运行,默默协调着家里的灯光、空调、传感器,甚至是你自制的各种智能小玩意儿。这听起来像是极客的专属玩具,但今天,我想分享的,正是一条让普通爱好者也能轻松上手的路径。
核心工具是 **AidLux** 和 **HomeAssistant**。AidLux 让安卓手机拥有了一个完整的 Linux 环境,而 HomeAssistant 则是目前最强大、最灵活的开源智能家居平台。但这条路并非一帆风顺,尤其是在追求新版本 HomeAssistant 时,你会遇到 Python 版本、依赖缺失等一系列“坑”。网上教程不少,但要么版本过时,要么语焉不详,照着做总差那么几步。我折腾了好几台旧手机,从红米到一加,踩遍了几乎所有常见的坑,终于梳理出一套稳定、可复现的流程。
这篇文章,就是为你准备的“避坑”地图。我们不只讲“怎么做”,更会深入解释“为什么”,让你在遇到新问题时也能举一反三。我们将从环境准备开始,一步步完成 Python 3.10 的编译安装、HomeAssistant Core 的部署、HACS 商店的集成,并重点解决那些令人头疼的依赖问题,比如经典的 `No module named ‘_sqlite3‘` 错误。最终,你将拥有一台由旧手机驱动的、功能强大且高度可定制的智能家居控制中心。
## 1. 环境准备与AidLux基础配置
在开始编译和安装之前,我们需要一个稳定、干净的“地基”。AidLux 是这个项目的基石,它本质上是一个在安卓系统上运行的 Linux 容器环境,提供了完整的终端、包管理器和文件系统访问能力。这意味着,我们可以在手机上运行几乎任何 Linux 软件。
首先,从官方渠道下载并安装 AidLux。这个过程很简单,就像安装任何一个普通应用一样。安装完成后首次启动,它会进行初始化,并请求一些必要的权限(如存储、网络访问),请务必全部允许。初始化完成后,你会看到一个类似电脑桌面的界面,底部有终端、文件管理器等图标。
> 提示:建议将手机连接到稳定的 Wi-Fi 网络,并设置为“永不睡眠”或“充电时保持唤醒”,避免在长时间编译或运行 HomeAssistant 时被系统休眠打断。
AidLux 默认提供了 `apt` 包管理器,但为了后续编译顺利,我们需要先更新软件源并安装一些基础编译工具。打开终端,执行以下命令:
```bash
apt update && apt upgrade -y
```
这个命令会更新可用的软件包列表并升级已安装的包,确保系统环境是最新的。
接下来,安装编译 Python 和后续可能用到的核心开发工具链。这是一组必不可少的依赖,缺少它们,后续的编译步骤几乎肯定会失败。
```bash
apt install -y gcc make build-essential libssl-dev libffi-dev zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libreadline-dev libbz2-dev curl
```
这里简单解释几个关键包的作用:
* **gcc, make, build-essential**: C/C++ 编译器的核心套件,编译任何源码都离不开它们。
* **libssl-dev, libffi-dev**: 提供加密和安全功能支持的开发库,Python 的 `pip` 和许多网络相关的模块需要它们。
* **zlib1g-dev**: 压缩库的开发文件,Python 处理压缩包时需要。
* **libsqlite3-dev**: **这是重中之重!** 它提供了 SQLite 数据库的开发文件。HomeAssistant 严重依赖 SQLite 来存储配置、历史和状态信息。如果系统自带的 SQLite 版本太低或开发文件缺失,就会导致后续 Python 模块编译失败,出现 `_sqlite3` 模块找不到的错误。虽然 AidLux 可能预装了 sqlite3 运行时,但开发头文件(`-dev` 包)是编译时必须的。
安装完这些,我们的基础系统环境就准备好了。你可以通过 `gcc --version` 和 `make --version` 来验证编译器是否安装成功。
## 2. 源码编译安装 Python 3.10
这是整个过程中最具挑战性但也最关键的一步。AidLux 应用中心提供的 Python 版本最高只到 3.9,而 HomeAssistant 的新版本(2023.2 以后)对 Python 3.10 或更高版本有硬性要求。因此,我们必须手动从源码编译安装 Python 3.10。
为什么非要编译,而不是直接下载二进制包?主要原因是为了**与系统自带的 Python 共存**。AidLux 系统本身可能依赖特定版本的 Python(如 3.7 或 3.9),直接替换会导致系统功能异常。编译安装可以指定独立的安装路径,做到互不干扰。
### 2.1 下载源码与配置
首先,我们选择一个临时目录来操作,比如 `/tmp`。
```bash
cd /tmp
```
接着,从 Python 官网下载 3.10.12 的源码包。我选择这个版本是因为它在稳定性和对新版 HomeAssistant 的兼容性上取得了很好的平衡。
```bash
wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
```
下载完成后,解压源码包并进入目录:
```bash
tar xzf Python-3.10.12.tgz
cd Python-3.10.12
```
现在,进行编译前的配置。`./configure` 脚本会检查系统环境,并生成适合当前系统的 Makefile。我们这里使用两个关键参数:
```bash
./configure --enable-optimizations --prefix=/usr/local/python3.10
```
* `--enable-optimizations`: 启用优化选项,编译出的 Python 解释器性能会有小幅提升。这会使编译时间显著加长,但对于长期运行的服务来说是值得的。
* `--prefix=/usr/local/python3.10`: 指定安装目录。所有编译好的文件都将安装到这个路径下,不会污染 `/usr/bin` 等系统目录。
配置过程会输出大量检查信息,只要最后没有报错(error)即可。
### 2.2 编译与安装
配置成功后,开始编译。为了充分利用手机的多核处理器(如果有的话),我们可以使用 `-j` 参数指定并行编译的作业数。例如,对于四核处理器,可以使用 `-j4`。
```bash
make -j4
```
编译过程会持续较长时间,具体取决于手机的性能(可能从十几分钟到半小时以上)。期间 CPU 使用率会很高,手机发热是正常现象。
编译完成后,进行安装。这里使用 `make altinstall` 而不是 `make install`。`altinstall` 会避免覆盖系统默认的 `python` 和 `python3` 命令链接,只安装 `python3.10` 到指定位置。
```bash
make altinstall
```
安装完成后,为了方便使用,我们为 `python3.10` 和 `pip3.10` 创建一个软链接到 `/usr/local/bin`(这个目录通常已在 PATH 环境变量中)。
```bash
ln -sf /usr/local/python3.10/bin/python3.10 /usr/local/bin/python3.10
ln -sf /usr/local/python3.10/bin/pip3.10 /usr/local/bin/pip3.10
```
现在,验证安装是否成功:
```bash
python3.10 --version
pip3.10 --version
```
如果正确显示版本号,恭喜你,Python 3.10 已经成功入驻你的旧手机。
## 3. 部署 HomeAssistant Core
有了 Python 3.10,我们就可以安装 HomeAssistant 的核心(Core)版本了。Core 版本不包含操作系统级的封装,更轻量,也更能体现我们在 Linux 环境下 DIY 的乐趣。
### 3.1 创建专用用户与虚拟环境
首先,出于安全考虑,我们不建议使用 root 用户直接运行 HomeAssistant。创建一个专用的系统用户:
```bash
useradd -rm homeassistant -G dialout
```
* `-r`: 创建系统用户。
* `-m`: 创建用户主目录。
* `-G dialout`: 将用户加入 `dialout` 组,这通常是为了授予其访问串口(如 USB 转串口设备)的权限,对于连接某些 Zigbee 网关或直接控制硬件很有用。
接下来,为 HomeAssistant 创建一个工作目录并设置权限:
```bash
mkdir -p /srv/homeassistant
chown -R homeassistant:homeassistant /srv/homeassistant
```
切换到 `homeassistant` 用户,并进入工作目录:
```bash
su - homeassistant -s /bin/bash
cd /srv/homeassistant
```
现在,使用我们刚安装的 Python 3.10 创建一个虚拟环境。虚拟环境是一个独立的 Python 运行空间,可以隔离项目依赖,避免与系统或其他项目的包发生冲突。
```bash
python3.10 -m venv .
```
命令中的点 `.` 表示在当前目录(`/srv/homeassistant`)创建虚拟环境。创建完成后,激活这个虚拟环境:
```bash
source bin/activate
```
激活后,你的命令行提示符前通常会显示 `(homeassistant)` 字样,表示你正处在这个虚拟环境中。此后所有 `pip` 安装的包都将只存在于这个环境中。
### 3.2 安装与启动 HomeAssistant
在虚拟环境中,首先升级 `pip` 并安装 `wheel`(一个用于加速二进制包安装的工具):
```bash
python3.10 -m pip install --upgrade pip
python3.10 -m pip install wheel
```
然后,安装 HomeAssistant。为了确保稳定性,我们可以指定一个具体的版本。例如,安装 2023.6.3 版本:
```bash
python3.10 -m pip install homeassistant==2023.6.3
```
你也可以安装最新版本(`homeassistant`),但新版本可能引入未知问题。安装过程需要下载大量依赖,请保持网络通畅。
安装完成后,可以直接启动 HomeAssistant:
```bash
hass
```
首次启动会进行初始化,包括创建配置文件目录(`~/.homeassistant`)、下载前端资源等。这个过程可能需要几分钟。当你看到日志中频繁出现 `Home Assistant initialized in X.XXs` 之类的信息,并且最后出现 `Started frontend` 时,就表示启动成功了。
此时,在同一局域网内的任何设备(电脑、手机)的浏览器中,输入 `http://<你的安卓手机IP地址>:8123`,就能看到 HomeAssistant 的初始化引导界面了。按照提示创建账户、设置位置等信息,你的智能家居中枢就初具雏形了。
## 4. 根治依赖顽疾:解决 `_sqlite3` 模块缺失问题
如果你严格遵循了第二章的步骤,安装了 `libsqlite3-dev`,那么在编译 Python 时,`_sqlite3` 模块通常会自动编译并包含在内。但世事难料,有时因为系统库版本、路径等问题,这个模块可能会“缺席”。当 HomeAssistant 启动时,如果遇到类似 `ModuleNotFoundError: No module named ‘_sqlite3‘` 的错误,整个服务将无法运行。
这个问题根源在于 Python 在编译时没有找到正确版本的 SQLite 开发头文件,或者找到的头文件与运行时库不匹配。下面提供一套根治方案。
### 4.1 编译安装新版 SQLite3
首先,我们需要一个足够新(>=3.31.0)且独立的 SQLite3 版本。去 SQLite 官网下载最新的自动配置源码包。
```bash
cd /tmp
wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz
tar -xvzf sqlite-autoconf-3420000.tar.gz
cd sqlite-autoconf-3420000
```
配置并编译安装到 `/usr/local/sqlite`,与系统自带的 SQLite 隔离:
```bash
./configure --prefix=/usr/local/sqlite
make -j4
sudo make install
```
安装完成后,可以验证一下:
```bash
/usr/local/sqlite/bin/sqlite3 --version
```
### 4.2 重新编译 Python 3.10 并链接新 SQLite
关键步骤是让 Python 的编译系统知道我们新安装的 SQLite 在哪里。我们需要修改 Python 源码目录下的 `setup.py` 文件。
首先,确保你回到了 Python 源码目录(假设还在 `/tmp/Python-3.10.12`)。使用 `vi` 或 `nano` 编辑器打开 `setup.py`:
```bash
cd /tmp/Python-3.10.12
vi setup.py
```
在文件中搜索 `sqlite_inc_paths`。你会看到一个列表变量,定义了 Python 查找 SQLite 头文件的可能路径。我们需要将我们自定义的路径添加进去。找到类似下面的部分:
```python
# Include directories for the SQLite interface for the ‘sqlite3‘ module
sqlite_inc_paths = [ ‘/usr/include‘,
‘/usr/include/sqlite‘,
‘/usr/include/sqlite3‘,
‘/usr/local/include‘,
‘/usr/local/include/sqlite‘,
‘/usr/local/include/sqlite3‘,
]
```
在这个列表的开头添加我们自定义的路径:
```python
sqlite_inc_paths = [ ‘/usr/local/sqlite/include‘, # 新增
‘/usr/local/sqlite/include/sqlite3‘, # 新增
‘/usr/include‘,
‘/usr/include/sqlite‘,
‘/usr/include/sqlite3‘,
‘/usr/local/include‘,
‘/usr/local/include/sqlite‘,
‘/usr/local/include/sqlite3‘,
]
```
保存并退出编辑器。
现在,我们需要**重新配置** Python,确保它使用我们新编译的 SQLite 库。在配置时,通过环境变量 `LD_LIBRARY_PATH` 和 `CPPFLAGS` 来指定库和头文件路径。
```bash
# 清理之前的编译结果
make clean
# 设置环境变量并重新配置、编译
export LD_LIBRARY_PATH=/usr/local/sqlite/lib:$LD_LIBRARY_PATH
export CPPFLAGS=“-I/usr/local/sqlite/include“
./configure --enable-optimizations --prefix=/usr/local/python3.10
make -j4
sudo make altinstall
```
重新安装后,再次验证 `_sqlite3` 模块。进入 Python 交互环境测试:
```bash
python3.10 -c “import sqlite3; print(sqlite3.sqlite_version)“
```
如果成功输出版本号(应该是 3.42.0 或更高),则表明问题已彻底解决。之后 HomeAssistant 启动时就不会再报这个错了。
## 5. 拓展生态:安装 HACS 并优化运行
HomeAssistant 本身已经很强大了,但 **HACS** 才是打开其真正潜力的钥匙。HACS 是一个第三方集成商店,提供了海量官方商店里没有的集成、主题和插件,比如对众多国内智能家电品牌的支持、更美观的界面主题、以及各种自动化增强工具。
### 5.1 安装 HACS
安装 HACS 需要在 HomeAssistant 运行的情况下进行。首先,确保 HomeAssistant 已经停止运行(在运行 `hass` 的终端按 `Ctrl+C`)。然后,以 `homeassistant` 用户身份,进入其虚拟环境。
```bash
su - homeassistant -s /bin/bash
cd /srv/homeassistant
source bin/activate
```
执行 HACS 的一键安装脚本。由于网络原因,我们使用一个国内的镜像地址来加速下载。
```bash
wget -O - https://ghproxy.com/raw.githubusercontent.com/hasscc/get/main/get | HUB_DOMAIN=ghproxy.com/github.com DOMAIN=hacs REPO_PATH=hacs-china/integration ARCHIVE_TAG=china bash -
```
这个命令会下载安装脚本并执行。完成后,重新启动 HomeAssistant:
```bash
hass
```
等待 HomeAssistant 完全启动后,在浏览器中打开其管理界面。依次点击:**配置** -> **设备与服务** -> **集成**。在集成页面右下角,点击 **“添加集成”** 按钮,在搜索框中输入 **HACS** 并选择它。后续步骤按照屏幕提示操作即可,主要是授权 HACS 访问你的 GitHub 账户(用于管理自定义仓库)。
### 5.2 性能优化与后台运行
让 HomeAssistant 在手机后台稳定运行,需要一些优化。
**1. 创建系统服务(推荐)**
这是最稳定的方式,可以让 HomeAssistant 在 AidLux 启动时自动运行,并在崩溃后自动重启。在 AidLux 的 root 用户下,创建一个 systemd 服务文件(AidLux 基于 Ubuntu/Debian,支持 systemd)。
```bash
sudo vi /etc/systemd/system/homeassistant.service
```
将以下内容粘贴进去,注意修改 `User`、`WorkingDirectory` 和 `ExecStart` 的路径为你自己的设置:
```ini
[Unit]
Description=Home Assistant
After=network-online.target
[Service]
Type=simple
User=homeassistant
WorkingDirectory=/srv/homeassistant
ExecStart=/srv/homeassistant/bin/hass
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
```
保存后,启用并启动这个服务:
```bash
sudo systemctl daemon-reload
sudo systemctl enable homeassistant.service
sudo systemctl start homeassistant.service
```
你可以使用 `sudo systemctl status homeassistant.service` 来查看运行状态。
**2. 基础优化配置**
在 HomeAssistant 的配置文件 `~/.homeassistant/configuration.yaml` 中,可以添加一些优化项:
```yaml
# 示例配置片段
default_config:
# 减少日志量,提升性能
logger:
default: warning
logs:
homeassistant.components: info
custom_components.hacs: error # 如果你安装了HACS
# 调整历史数据保留时间,减轻数据库压力
recorder:
purge_keep_days: 7
commit_interval: 30
```
每次修改配置文件后,需要在前端 **配置** -> **系统** -> **检查配置** 来验证无误,然后重启 HomeAssistant 服务使其生效。
经过以上步骤,你的旧安卓手机已经成功转型为一台功能完备、扩展性极强的智能家居中枢。它不仅能够管理市面上主流的智能设备,通过 HACS 还能接入无数小众产品,更为你 DIY 智能硬件提供了无限可能。整个系统运行在 Linux 容器中,相对独立且安全,资源占用也远低于在安卓层直接运行模拟器。