Home Assistant database size tricks

Я не так давно пользуюсь Home Assistant. Наше знакомство состоялось где-то год назад. К тому времени, как я дошёл до регулярных снэпшотов (snapshots) средствами Home Assistant, обнаружил, что размер базы данных близок к 1 Гб. У меня зародились подозрения, что это не совсем нормально и я потихоньку начал изучать вопрос.

Тогда я использовал стандартный тип базы данных Home Assistant — sqlite (файл home-assistant_v2.db). Использую его и сейчас. За сохранение информации в базе данных Home Assistant отвечает интеграция Recorder. У неё есть разные настройки, которые можно указать в configuration.yaml. Мои настройки приведены ниже. Названия некоторых персональных сущностей (entities) изменены.

Я руководствовался следующим принципом: если мне не нужна информация о чём-либо в базе данных, я не включаю запись этой информации.

ВНИМАНИЕ! Вышеуказанный принцип применялся без фанатизма. :-)

recorder:
  auto_purge: false
  purge_keep_days: 10
  commit_interval: 15
  exclude:
    domains:
      - sun
      - device_tracker
    event_types:
      - call_service
    entity_globs:
      - binary_sensor.*_battery_low
      - binary_sensor.*_tamper
      - sensor.*_battery
      - sensor.*_linkquality
      - sensor.*_consumption
      - sensor.*_energy
      - sensor.*_pressure
      - sensor.*_illuminance
      - sensor.*_voltage
      - sensor.*_current
      - sensor.*_zigbee
      - sensor.*_ble
      - sensor.*_gateway
    entities:
      - binary_sensor.updater
      - sensor.hacs
      - sensor.relay1_power
      - sensor.relay2_power
  include:
    entities:
      - sensor.air_pressure
      - device_tracker.homekit_myiphone
      - device_tracker.router_myiphone

Честно говоря, так и не смог понять, зачем разработчики Home Assistant установили настройку commit_interval по умолчанию в 1 секунду. Если в этом и есть смысл, то он ускользнул от меня. Я у себя сделал 15 секунд.

Сейчас на вспомню, почему отключил автоматическую очистку базы данных в конфиге: auto_purge: false. Вместо неё я создал автоматизацию, которая запускается каждую ночь ровно в 3:21. Как видно из кода автоматизации, в базе данных хранится информация за последние 10 суток.

alias: Recorder Purge
description: ''
trigger:
  - platform: time
    at: '03:21:00'
condition: []
action:
  - service: recorder.purge
    data:
      keep_days: 10
      repack: true
mode: single

Какое-то время назад я перестал использовать Zigbee2MQTT. Может это тоже сказалось положительно на размере базы данных. По умолчанию, Zigbee2MQTT создаёт в Home Assistant сущности с кучей атрибутов (attributes) и эти атрибуты дублируются во всех сущностях устройства (device). Таким образом, изменение хотя бы одного атрибута приводит к записи в базу данных информации об изменениях всех сущностей устройства. В версии 1.20.0 у Zigbee2MQTT появилась настройка, позволяющая отключить атрибуты в сущностях. Думаю, они уже стали лишними в Home Assistant.

…
advanced:
  homeassistant_legacy_entity_attributes: false
…

Тем, кто использует add-on Zigbee2MQTT в Home Assistant, эта настройка доступна начиная с версии 1.21.0-4.

Ну и какой же результат? Размер моей базы данных колеблется от 70 до 80 Мб. При этом, в Home Assistant сейчас порядка 400 сущностей.

Осознаю, что можно сделать ещё оптимальнее. Никого ни к чему не призываю, ничего не навязываю. Просто делюсь тем, как реализовал у себя. Если есть желание поделиться своими решениями или появились вопросы, заходите обсудить.

Vladimir Turekhanov ・ July 18, 2021

вернуться