Найти в Дзене
Smart Home 53

Настраиваем долговременное хранение данных в InfluxDB с помощью Retention Policy и Continuous Query

В статье о том, как установить influxDB для хранения в ней данных из Home Assistant, я не раз употреблял о Retention Policy. Пришло время объяснить, что это такое и как это может позволить хранить необходимые данные продолжительное количество времени.

Если просто, то Retention Policy - это правила, определяющие длительность хранения данных в базе данных. Причем для одной базы данных таких правил может быть несколько. Какие-то данные мы храним неделю, какие-то месяц, а какие-то вообще годы. И все в одной базе данных.

Приступим

Для начала создадим необходимое количество таких правил и установим необходимые сроки хранения. Открываем вэб-интерфейс аддона InfluxDB, в левом меню выбираем InfluxDB Admin и на вкладке Databases подводим курсор к нашей Базе данных и появляется кнопка Add Retention Policy. Нажимаем ее и задаем длительность хранения данных и наименование политики.

-2

Тут есть одна проблема, с которой я столкнулся, возможно, что-то не так понял или не нашел, но не могу задать длительность хранения 1 месяц или 1 год. Все потому что количество дней в месяце может быть разное, как и различие количества дней в високосном и невисокосном году, а все значения пересчитываются именно в дни. Я свыкся с этим, но кому-то это может оказаться критично.

Следующий шаг - создать необходимые Continuous Query

Continuous Query - это механизм автоматического создания запросов через указанные промежутки времени. При этом результаты такого запроса могут быть записаны в другой Retention Policy с другим временем хранения. Для чего это нужно? Например, можно создать запрос на показания датчика температуры за последний час и записываем его в новый Retention Policy с более длительным сроком хранения, например, месяц. Дневные данные с датчика можно хранить год, а недельные - вообще бесконечно. Тут вы сами должны решить, как именно и сколько хранить данные с определенных датчиков. Единственное, нужно понимать, что в БД они объединены по единицам измерения, поэтому если нужно конкретное правило для какого-то датчика, а не для всех датчиков температуры, то ему придется переписывать measurement, но это частный случай и мне такого делать не приходилось.

Как создать Continuous Query?

Я не знаю, возможно ли это сделать через вэб-интерфейс, вполне возможно, что да, но мне было удобнее сделать это через консоль. Для доступа к консоли InfluxDB необходимо подключиться к контейнеру с одноименным аддоном. Сделаем это через вэб-интерфейс Portainer.

-3

Находим искомый контейнер и нажимаем >_Console

-4

Нажимаем Connect

-5

И вот мы попадаем в консоль нашего аддона. Теперь необходимо подключиться к influxDB для этого вводим:

influx
-6

Далее необходимо авторизоваться:

auth
-7

Имя пользователя и пароль вводите те, которые задавали ранее для пользователя через вэб-интерфейс.

Далее подключаемся к интересующей нас базе данных.

use homeassistant
-8

Посмотрим, какие уже Continuous Query созданы на сервере

show continuous queries
-9

Как видно на скриншоте, у меня уже создано достаточно большое количество таких запросов, на скриншоте поместились далеко не все, ну что ж, создадим новый запрос.

Создание запроса

Для примера возьмем значения потребления электричества c единицей измерения KWt. Значения счетчика будем хранить в течение одного года, группируя данные в течение одной минуты. Это всего лишь пример - вы можете выбрать другие критерии.

Тогда наш запрос будет выглядеть следующим образом:

CREATE CONTINUOUS QUERY cq_year_KWt ON homeassistant BEGIN SELECT mean(value) INTO homeassistant.year.KWt FROM homeassistant.autogen.KWt GROUP BY time(1m), entity_id fill(previous) END

где cq_year_KWt - наименование запроса;

homeassistant - база данных;

homeassistant.year и homeassistant.autogen - наименование Retention Policy.

-10

При успехе вы сможете увидеть новый запрос по команде show continuous queries. Вот мой вывод этой команды, новый запрос отображается в самом низу.

-11

Если в единицах измерения есть символы вроде /, * и так далее, то необходимо заключить всю единицу измерения в кавычки, например так:

CREATE CONTINUOUS QUERY cq_infinity_KWth ON homeassistant BEGIN SELECT mean(value) INTO homeassistant.infinite. "KWt*h" FROM homeassistant.autogen. "KWt*h" GROUP BY time(1d), entity_id fill(previous) END

Далее нужно немного подождать, чтобы успели накопиться данные, а потом уже можно смотреть что получилось в вэб-интерфейсе influxdb на вкладке explorer.

-12

На скриншоте видно, что выбрана Retention Policy homeassistant.year, данные в которой хранятся год, и выбрана единица измерения KWt, что соответствует нашему запросу.

Немного фантазии и подобное можно сделать и с остальными важными данными, причем настроить можно довольно гибко.

В следующий раз я расскажу, как подключить Grafana к InfluxDB для отображения красивых графиков, в том числе в интерфейсе Home Assistant.

Подписывайтесь на мой канал, чтобы не пропустить обновления.

#умный дом #smart home #home assistant #influxdb #database #базы данных #метрики #интернет вещей #технологии