Сервер Home Assistant работает на orange pi zero2: http://alii.pub/68uelr
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Проблема заключается в следующем. Иногда например когда я занимался отладкой показаний датчика TVOC, мне было не очень удобно это делать. Так-как например он показывал в среднем 10-20 ppb и график строился довольно интересно. Но как только я поднес к нему спирт, то показания зашкалили до уровня 99999 ppb и следовательно график весь мой очень сильно уменьшил свою амплитуду. Так как сначала он строился на по шкале 20ppb и отклонения в 10 ppb были явно выражены и динамика прослеживалась хорошо. Но как только график стал с самой высокой точкой в 99999 ppb. Заметить глазом разницу 20-10 ppb между собой практически перестало быть возможным. Вот пример большого разброса:
А вот показания какие хотелось бы видеть, пример:
Вот из-за этой проблемы я и стал думать, как можно обнулить все значения, чтоб график снова был удобочитаемый.
Для очистки графика нам нужно знать. Все действия и все показания датчиков записываются в базу данных sqlite . И нам нужно очистить таблицу показаний датчика который нам нужен.
Для этого сначала для удобства надо скачать addon под названием SQLite Web. Он находится в магазине стандартных addonов. Просто находим его, устанавливаем и запускаем.
Далее, после запуска аддона в нем же появится кнопка “ВЭБ интерфейс” жмякаем ее и попадаем в новое окно.
В открывшемся окне выбираем “events”
Далее выбираем вкладку “Query”
Ну и здесь уже непосредственно идут запросы для БД.
Например мы хотим удалить значения у датчика “sensor.sgp30_tvoc”. То делаем такой запрос:
SELECT *
FROM “states”
where entity_id=’sensor.sgp30_tvoc’
Ну и после написания запроса нажимаем кнопочку “Execute” и нам должно выдать Results. Собственно мы там видим табличку со значениями.
Эта команда просто выводит значения таблицы с датчика sensor.sgp30_tvoc.
Это нам нужно для того, чтоб убедиться, что данные действительно имеются в таблице и мы все делаем правильно.
Только теперь так не работает. Сейчас в таблице states в столбце entity_id пусто. Так как сейчас entity_id находятся в таблице states_meta
Следовательно, чтоб найти сейчас данные по entity_id нужно сделать запрос вот такой:
SELECT *
FROM “states”
where entity_id=’sensor.sgp30_tvoc’
Здесь можем увидеть, что у entity_id столбец metadata_id с значением 1077. Вот 1077 у нас и будет цифра по которой мы будем в таблице states искать и удалять данные.
Ну а теперь приступаем к удалению. Чтоб удалить, нужно ввести следующую команду:
DELETE
FROM “states”
where metadata_id=’1077′
Видим, что удалилось 27536 данных.
Я оставил старую картинку, так как удалять этот сенсор сейчас не хочу. но принцип тот же как на скрине, только по другому полю удаляется.
Ну и собственно вот результат, так было:
А так, стало:
Ну и если подождать минут 10, данные снова начнут заполняться потихонечку.
Только смотрите, с базой данных работать нужно аккуратно, и не удалять там все подряд. Иначе можете вообще все поломать.
Добавлю ещё пару команд.
Команда, которая выводит размер таблиц в Базе данных Home Assistant.
SELECT SUM(pgsize) bytes, name FROM dbstat GROUP BY name ORDER BY bytes DESC;
Так-же есть полезная команда, которая показывает какие entity_id сколько занимают места в Базе данных Home Assistant. Эта команда весьма полезна, чтоб определить, какой датчик больше всего “забивает базу данными”. И с него можно начать в чистке.
Запрос выглядит так:
SELECT
COUNT(*) AS cnt,
COUNT(*) * 100 / (SELECT COUNT(*) FROM states) AS cnt_pct,
states_meta.entity_id
FROM states
INNER JOIN states_meta ON states.metadata_id=states_meta.metadata_id
GROUP BY states_meta.entity_id
ORDER BY cnt ASC;
Тут смотрим на поле cnt. Чем оно выше, тем датчик больше места занимает. По этому нужно листать в самый низ и на последнюю страницу, чтоб понять какой датчик больше места занимает.
Ну а после того, как Вы определили, какие датчики нужно почистить, так как они много места занимают. Можно использовать вот эту команду, в которой через запятую указываются entity_id, которые удалятся одним запросом. Запрос выглядит следующим образом:
DELETE FROM states
WHERE metadata_id IN (
SELECT metadata_id
FROM states_meta
WHERE entity_id IN (‘switch.otoplenie_relay_board_l1’, ‘switch.otoplenie_relay_board_l2’)
);
Где ‘switch.otoplenie_relay_board_l1’, ‘switch.otoplenie_relay_board_l2’ в ковычках перечисляются entity_id.
Вот мой запрос на удаление самых больших entity_id выглядит так:
DELETE FROM states
WHERE metadata_id IN (
SELECT metadata_id
FROM states_meta
WHERE entity_id IN (‘sensor.co2_effekta_temperature_1’, ‘sensor.co2_effekta_temperature_2’, ‘switch.0x00124b00256605bf_auto_brightness’, ‘switch.0x00124b00256605bf_factory_reset_co2’, ‘switch.0x00124b00256605bf_forced_recalibration’, ‘switch.0x00124b00256605bf_long_chart_period’, ‘switch.co2_effekta_automatic_scal’, ‘switch.co2_effekta_enable_gas’, ‘switch.co2_effekta_invert_logic_gas’, ‘switch.co2_effekta_onoff_brightness’, ‘number.0x00124b00272c81e3_high_pm25’, ‘number.0x00124b00272c81e3_humidity_offset’, ‘number.0x00124b00272c81e3_low_pm25’, ‘number.0x00124b00272c81e3_reading_interval’, ‘number.0x00124b00272c81e3_set_altitude’, ‘number.0x00124b00272c81e3_temperature_offset’, ‘sensor.0x00124b00272c81e3_co2’, ‘sensor.0x00124b00272c81e3_humidity’, ‘sensor.0x00124b00272c81e3_pm1’, ‘sensor.0x00124b00272c81e3_pm10’, ‘sensor.0x00124b00272c81e3_pm25’, ‘sensor.0x00124b00272c81e3_temperature’, ‘sensor.0x00124b00272c81e3_voc_index’, ‘sensor.0x00124b00272c81e3_voc_raw_data’, ‘switch.0x00124b00272c81e3_automatic_scal’, ‘switch.0x00124b00272c81e3_enable_pm25’, ‘switch.0x00124b00272c81e3_factory_reset_co2’, ‘switch.0x00124b00272c81e3_forced_recalibration’, ‘switch.0x00124b00272c81e3_invert_logic_pm25’, ‘sensor.energomonitor_ac_frequency’, ‘sensor.energomonitor_current’, ‘sensor.energomonitor_energy’, ‘sensor.energomonitor_power’, ‘sensor.energomonitor_power_factor’, ‘sensor.energomonitor_produced_energy’, ‘sensor.energomonitor_voltage’)
);
Но кстати, после их удаления, место по прежнему останется. Да, новые данные будут записываться в те места, откуда удалили старые данные и место занимаемое увеличиваться не будет, пока предела не дойдёт. Но это же все равно не правильно.
По этому есть команда VACUUM, которая высвободит свободное место.
Команда выглядит очень просто:
VACUUM;
После чего нужно немного подождать пока процесс закончится. И идём проверять место.
Было до ввода команды VACUUM:
6.7 ГБ. БЫло, я очистил:
Помимо освобождения места (Вам может показаться что это не много). Но представьте, ведь одна строчка практически ничего не весит с данными, а чтоб гигабайты данных очистить, там строчек будет миллион. По этому после очистки Home Assistsant прям стал гораздо легче себя чувствовать.
Но так-же существует Кнопка, которая делает “Зашибись” при нажатии на неё БД чистится. Об этом можно почитать тут:
Очистка места в Home Assistant путём удаления данных из Базы данных.
P.S. С сайта команды копируются как-то не правильно. По этому пишите эти строчки от руки. Тогда все заработает.