Інструкція, як підвищити відмовостійкість Home Assistant на Raspberry Pi
Привіт. На зв’язку Богдан Свердлюк. Я люблю «розумний будинок» і розповідаю про нього українською. У цій статті розглянемо, як підвищити відмовостійкість сервера Home Assistant на Raspberry Pi та зробити, щоб він працював максимально довго. російський військовий корабель, іди нах***!
Живлення
Блок живлення
Найрозповсюдженіша проблема, що виникає з усіма одноплатними комп’ютерами — неякісний блок живлення. Блок живлення має видавати 5v і 2A, краще 3. Проте не усі їх видають.
Для виявлення неякісних блоків на Raspberry Pi є окремий елемент, який працює з інтеграцією Raspberry Pi Power Supply Checker. Якщо з блоком усе гаразд, лінія в історії буде зелена, якщо з вольтажем проблеми — червона. Якщо живлення відсутнє, після перезапуску Raspberry не покаже червону лінію.
UPS та резервне живлення
Будь яке неочікуване вимкнення живлення шкодить пам’яті. Це також актуально при планових та аварійних відключеннях світла. Щоб вирішити цю проблему можна використовувати:
комп’ютерні UPS (деякі з них підтримують моніторинг);
— плати розширення Raspberry Pi UPS HAT, UPSHAT або скласти власноруч
— power bank з одночасною зарядкою та розрядкою (two-way);
— 5v модулі з aliexpress під 18650;
— Mini UPS 5/9/12v;
— акумулятор 12v для ДБЖ + UPS модуль + перетворювач на 5v, або HAT з 12 на 5v.
Останні два варіанти дозволяють додатково живити роутер. Діліться у коментарях, що ви використовуєте в якості резервного живлення.
Пам’ять та сховище
У одноплатниках диском є MicroSD. Home Assistant постійно пише та читає дані історії (history), журналу (logbook) та реєстратора (recorder). Не всі карти призначені для подібного навантаження. Така робота призводить до її зносу, сервер може не завантажуватись. Є кілька способів покращення.
За можливості використовуйте SSD замість MicroSD. Він швидший, має більшу стійкість до запису та меншу ймовірність пошкодження. Інструкція з міграції.
Також можна використовувати витривалу карту пам’яті, оптимізовану для частого запису та зчитування:
- Samsung PRO Endurance;
- SanDisk MAX ENDURANCE;
- карти класу A2;
Щодо місткості, то є сенс брати від 32 Гб і більше. Якщо проблеми продуктивності уже виникають, не зайвим буде відформатувати карту, наприклад, за допомогою SD Memory Card Formatter. Не забудьте зробити резервну копію та зберегти її в іншому місці.
Оптимізація бази даних
Home Assistant використовує базу даних SQLite для зберігання подій та історії. Вона знаходиться за адресою config/home-assistant_v2.db. Після кількох місяців роботи додавання інтеграцій та пристроїв база сильно збільшується. SQLite читає та записує більше даних. Це сповільнює роботу Home Assistant.
Перегляд загального розміру бази даних
Переглянути розмір бази даних можна за допомогою
— додатку Samba;
— ввести в терміналі команду:
du -h /config/home-assistant_v2.db;
— додати інтеграцію File Size, вказавши шлях /config/home-assistant_v2.db;
Після того додати сенсор до Lovelace. Якщо отримуєте помилку Filepath /config/home-assistant_v2.db is not valid or allowed, дозвольте використання директорії, додавши такі рядки до configuration.yaml:
homeassistant: allowlist_external_dirs: - /config
Пошук найважчих сутностей
Щоб дізнатись, які сутності займають найбільше місця, потрібно виконати SQL-запит. Для цього необхідно встановити додаток SQLite Web.
В інтерфейсі SQLite зліва є багато таблиць, з яких дві актуальні:
- states журнал усіх станів для всіх сутностей.;
- events журнал усіх подій.
Щоб побачити, який тип подій найбільше використовується, у вкладці Query виконайте запит:
SELECT COUNT(*) as cnt, SUM(LENGTH(event_data)) as bytes, event_type FROM events GROUP BY event_type ORDER BY cnt DESC
Стовпчик cnt покаже кількість подій в порядку спадання.
Щоб побачити, який тип сенсора найбільше використовується, виконайте запит:
SELECT COUNT(*) AS cnt, COUNT(*) * 100 / (SELECT COUNT(*) FROM states) AS cnt_pct, SUM(LENGTH(attributes)) AS bytes, SUM(LENGTH(attributes)) * 100 / (SELECT SUM(LENGTH(attributes)) FROM states) AS bytes_pct, entity_id FROM states GROUP BY entity_id ORDER BY cnt DESC
Проаналізуйте результати. Швидше за все, перші кілька сутностей становитимуть чверть розміру таблиці. Подумайте, чи вони потрібні.
Фільтрування сутностей
Тепер, коли відомо, найбільші події та сутності, можна їх відфільтрувати, додавши таку конфігурацію у configuration.yaml:
recorder: exclude: domains: - device_tracker - media_player - worldclock entity_globs: - sensor.clock* - sensor.date* - sensor.glances* entities: - camera.front_door - sensor.home_assistant_v2_db - sensor.memory_free
За замовчуванням події записуються кожної секунди! Для зменшення навантаження на пам‘ять можна збільшити інтервал запису до 30 секунд і більше:
recorder: commit_interval: 30
За замовчуванням історія у БД зберігається 10 днів. Для зменшення цього часу використовуйте конфігурацію:
recorder: purge_keep_days: 5
Мережа
Home Assistant доступний за адресою homeassistant.local:8123/ До нього також можна звернутись за допомогою локальної адреси. Щоб адреса не змінювалась з часом, закріпіть її у вебінтерфейсі роутера.
Найвищої стабільності можна досягти, приєднавши Home Assistant по кабелю. Використання Wi-Fi можливе, але не рекомендується.
Резервне копіювання
Home Assistant має влаштований інструмент резервного копіювання. Проте копії мають бути створені вручну. Для зручного автоматичного створення можна використовувати Google Drive Backup (інструкція з встановлення).
Для відновлення стану системи можна завантажити копію з Google Диску та відновити у розділі Конфігурація >> Система >> Резервні копії >> Вивантажити резервну копію. Якщо маєте проблеми з вивантаженням, скористайтесь браузером Google Chrome.
Налаштування
Пристроям, що постійно працюють, буває корисним періодичне перезавантаження. Для цього у розділі Конфігурація >> Автоматизації та сцени можна створити таку автоматизацію. Вона перезапускає Home Assistant щодня опівночі:
alias: HA restart description: "" trigger: - platform: time at: "00:00:00" condition: - condition: time weekday: - mon - tue - wed - thu - fri - sat - sun action: - service: homeassistant.restart data: {} mode: parallel
Для надійності роботи встановлених додатків можна увімкнути запуск після увімкнення системи та Watchdog.
Моніторинг
Системний моніторинг
Інтеграція systemmonitor дозволяє контролювати використання диска, оперативної пам’яті, температуру та навантаження процесора, запущені процеси, навантаження мережі. На жаль, вона не може бути налаштована за допомогою графічного інтерфейсу, потрібно додати конфігурацію в configuration.yaml.
sensor: - platform: systemmonitor resources: - type: disk_use_percent arg: /config - type: memory_free - type: memory_use - type: processor_temperature - type: last_boot
Після треба перезавантажити Home Assistant та додати картку до Lovelace. Наприклад об’єкти (entities).
Моніторинг доступності Home Assistant
Для перевірки доступності сервера Home Assistant з налаштованим додатком Cloudflared можна використовувати інформаційну панель Zero Trust розділ Access >>Tunnels
Якщо використовувати ping, домен завжди буде доступним. Можна отримувати статус, за допомогою запиту GET в форматі:
https://api.cloudflare.com/client/v4/accounts/{{account_id}}/cfd_tunnel/{{tunnel_id}}
Також обов’язково потрібно вказати два заголовки (header):
- X-Auth-Email — email, що використовується для входу в Cloudflare;
- X-Auth-Key — Global API Key. Знайти його можна у розділі Api Tokens.
В моєму випадку запит виглядає так:
https://api.cloudflare.com/client/v4/accounts/d53e57f7dfc47ec54f67ed3d09967a6f/cfd_tunnel/fff3ee88-9f2c-421d-8011-2f4a02122390
Документація. Розділ List Cloudflare Tunnels.
Запити можна надсилати будь-яким зручним інструментом — Postman, Zapier, n8n, Apps Script. Ось приклад запиту в Postman Online.
Можна до прикладу надсилати запити щогодини та записувати до Google Таблиці за допомогою доповнення Apipheny.io.
Статус підключення показує колонка result.connections.is_pending_reconnect. Якщо тунель активний — статус FALSE, якщо неактивний — inactive. Колонки result.conns_inactive_at і result.conns_active_at показують час падіння та відновлення :
А після на основі цих даних можна створити зведену таблицю, діаграму доступності, створювати функції для підрахунку % часу роботи (uptime), фізично перезапускати сервер за допомогою ESP та багато іншого.
Ось ще один приклад коду Apps Script, що кожні 5 хвилин перевіряє доступність тунелю, вносить статус та час в Google таблицю та сповіщає поштою, коли тунель недоступний
function checkTunnelAvailability() { var url = "https://api.cloudflare.com/client/v4/accounts/d53e57f7dfc47ec54f67ed3d09967a6f/cfd_tunnel/1668a6f5-708e-4189-9623-13b1f1cd6bd9"; var options = { "async": true, "crossDomain": true, "method" : "GET", "headers" : { "X-Auth-Email" : "[email protected]", "X-Auth-Key": "543abed92128fb7f3036a76b1ebb61f21d3tf" } }; var response = UrlFetchApp.fetch(url, options); var data = JSON.parse(response.getContentText()); var status = data.result.status; var sheet = SpreadsheetApp.getActiveSheet(); var date = new Date(); var dateString = Utilities.formatDate(date, "GMT+2", "dd-MM-yyyy"); var timestamp = Utilities.formatDate(date, "GMT+2", "dd-MM-yyyy HH:mm:ss"); var sheetName = dateString; var sheetExists = false; var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); for (var i = 0; i < sheets.length; i++) { if (sheets[i].getSheetName() == sheetName) { sheet = sheets[i]; sheetExists = true; break; } } if (!sheetExists) { sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName); } var row = sheet.getLastRow() + 1; sheet.appendRow([timestamp, status]); var cell = sheet.getRange(row, 2); if (status === "healthy") { cell.setBackground("#b7e1cd"); } else { cell.setBackground("#ea9999"); } }
Якщо таблиці — ваша сильна сторона, поділіться порадами в коментарях.
Сподобалась стаття? Подякуй донатом на збір DOU для підрозділу зенітно-ракетної бригади ППО!
33 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів