HomeAssistant从零开始折腾(二) - 使用TimeScaleDB替换默认数据库

背景

HomeAssistant默认使用SQLite作为数据库,虽然对于小规模的家庭智能系统来说,SQLite已经足够了,但是随着设备数量的增加,SQLite的性能会逐渐变差,所以有必要考虑使用其他数据库来承载这些日益增长的数据。

HA支持多种数据库,包括:

  • SQLite
  • MariaDB
  • MySQL
  • PostgreSQL

默认情况下,HA使用SQLite,文件存储在config目录下的home-assistant_v2.db文件中,如果你的系统已经运行了一段时间,这个文件可能会变得很大,而且SQLite的性能也会逐渐变差。

TimeScaleDB

本着折腾的原则(不是),我们考虑替换默认的数据库,HA的数据存储服务由recorder集成提供,我们可以通过修改configuration.yaml来指定使用其他数据库,这里我选择了TimeScaleDB。

在官方论坛翻了很久,想找找看有没有人测试过各种数据库之间的性能,最后发现他们好多人会推荐TimeScaleDB。

TimeScaleDB是一个基于PostgreSQL的时序数据库,专门用于存储时间序列数据,它的性能和扩展性都非常好,还是挺适合用来存储HA的数据的。

安装

这里假设你在合适的地方有Docker环境,执行以下命令运行一个新的timescaledb容器:

1
2
3
4
5
docker run -d \
--name timescaledb \
-p 5432:5432 \
-e POSTGRES_PASSWORD=数据库的密码 \
timescale/timescaledb:latest-pg16

默认的用户名和数据库名都是postgres

配置

首先连接到数据库,进入到docker容器中执行:

1
psql -d "postgres://postgres:PASSWORD@localhost:5432"

创建新的数据库

1
2
CREATE DATABASE hassdb
WITH ENCODING = 'UTF-8';

然后输入\q退出即可

接下来回到HomeAssistant,在configuration.yaml中添加如下配置:

1
2
3
4
recorder:
db_url: postgresql://postgres:PASSWORD@数据库的IP:5432/hassdb
purge_keep_days: 30
# 上面一行表示数据库中存储的最大天数,默认是10,我把它改成了30

另外,可以添加一个sql类型的Sensor,可以用来查询数据库的总大小

1
2
3
4
5
6
7
8
9
sql:
- name: Database Size
query: "SELECT pg_database_size('hassdb');"
column: "pg_database_size"
unique_id: "sensor.sql.dbsize"
device_class: "data_size"
unit_of_measurement: "B"
state_class: "total"
icon: "mdi:database"

注意事项

由于HA并不支持现有数据库的迁移,所以在配置了新的数据库后,之前的历史数据会丢失,所以最好在刚安装好HA的时候就选好想要的数据库。