Інструкція, як підвищити відмовостійкість 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 для підрозділу зенітно-ракетної бригади ППО!

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось10
До обраногоВ обраному10
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Старі 64 розрядні 12дюймові нетбуки. Ціна менше 100 доларів. Home-Assistant з зоопарком на близько 40 кінцевих пристроїв літає вже 3 роки. Завантаження процесора в середньому 10%.

Есть ещё вариант — дешевый компьютер. За долларов 500 можно собрать что-то на Ryzen 7 5700G и забыть о всех этих проблемах. Плюс на нем можно поднять намного больше полезных штук. У меня на таком висит больше 20 сервисов — Calibre-Web, Audiobookshelf, Plex, Nextcloud, Paperless, Bitwarden, Pi-Hole, Home-Assistant и много другого по мелочи. Собираешь коробку, кидаешь в шкаф, подключаешься по RDP, монитор нужен при первом запуске или если нужен биос.

imgur.com/a/47j8zyk

Home Assistant постійно пише та читає дані історії (history), журналу (logbook) та реєстратора (recorder). Не всі карти призначені для подібного навантаження.

Невже не можна задіяти якусь кільцеву файлову систему, щоб при кожному запису не протирало диру в одному й тому ж секторі карти?

із корисного можна додати інформацію про swap. дуже допомагає якщо є ssd . в мене з купкою доповнень без свопу ледве шевелиться.

А чи є поняття swap в Home Assistant OS?

Home Assistant OS 10 тепер використовує нову файлову систему zswap замість zram. Це дозволяє краще працювати на 1 ГБ оперативки та використовувати простір пам‘яті як підкачку.

ага , дякую. бачив . але своп залишу. з ним норм працює, а експериментувати часу і бажання немає зараз

Багато корисного є для початківців)
UPS у мене є)
Додав моніторинг)
Колись купив замість MicroSD карти SSD Samsung з SATA інтерфейсом і якісь неякісні і не сумісні з Raspbery Pi перехідники з Aliexpress SATA-USB 3.0. Довго з бубном їх налаштовував, якось воно працювало у мене десь рік. А зараз ніяк не вдається, один зовсім помер, один живе, але своїм життям, і завантажуватися з нього малінка не хоче зовсім. Тому шукаю зараз такий що сумісний і з якого без проблем буде працювати.

А чому перехідник поганий? І що ви налаштовували? З того, що читав, швидкість USB RPI 3 65 MByte/s і ділиться між усіма портами. У RPI 4 620 MByte/s.

www.aliexpress.com/...​t_main.267.63d01802FlhSCs — ось такі 2 штуки брав разом з блоком живлення на 12В та 2А.
Ну один взагалі перестав працювати, хоча це не точно. Глючні вони якісь, мены так здалося. Або руки криві у мене. Так то з Windows вони працюють, з додатковим живленням і HDD 3.5 працюють. Я багато чого пробував, і boot device, прошивки та різні налаштування Raspberry Pi. Якось воно у мене працювало, але я довго мучився. А зараз все наново став налаштовувати і знову проблеми. Там ще і режим це перехідний якийсь не підтримує. Для сервера розумного будинку велика швидкість не особливо і потрібна, якось тестив, але вже не пам’ятаю. В більш ранніх версіях Raspberry Pi USB та LAN ще між собою швидкість ділили, так як були забезпечені одним мікроконтролером.

jamesachambers.com/...​ide-for-ssd-flash-drives — ось тут багато про це. Поки що передумав шукати перехідник новий, є декілька карточок. Спробую зробити завантаження з microSD, а далі вона вказує на SSD і все працює вже на ньому — запис\читання, тому так карта сподіваюсь довго прослужить.

Нещодавно прочитав тут, перехідник має підтримувати UAS

У мене така штука wiki.geekworm.com/X883. Перший працював погано, китайці поміняли і тепер все вогонь.

Це плата для HDD? Підкажіть вартість. Модуль зверху на 12v? Він в наборі?

Додаєш NAS hat, ставиш ПіОС на нього (росте швидкість і надійність), ставиш Плекс і ОвнКлауд.

Замість мікро СД стає хдд/ссд в залежності від хету, вони надійніші за мікросд. Бонусом отримуємо швидкість роботи системи і тону стореджу. У мене на распберрі висить 2 двохтерабайтних хдд, система працює швидше. Мінусом є те, що потрібен 4А блок живлення, бо хдд також хотять трошки енергії.

А як вам живеться з HDD з відключеннями світла? Вони " не помирають через кілька відключень?

Зараз хдд на столі, відключені, а я в армії. Тому не помирають. Але мій сетап продумувався на мирне життя, де відключення рідкість, а карта помирає від постійного запису хоум ассістансом всяких штук.

У вас встановлений Owncloud на Home Assistant? Можете дати відгук про нього.

Я давно думаю встановити Nextcloud, але спочатку потрібно зробити резервне живлення і поставити hdd.

У мене провайдери-геї з CG-NAT. Тобто нема зовнішнього айпішнику, а без цього ОвнКлауд не має сенсу. Тому, на жаль, не дам відгуку. Але свій клауд в планах.

А чи не можна все те ж саме через безкоштовний домен і Cloudflared, або duckdns організувати. Домен буде один, а порти різні.

DuckDNS не спрацює. То просто шелл скрип, який каже коммюніті ДНС серверу, що айпі-адреса за цим доменом буде тепер така. Якщо за адресою знаходиться не домашній роутер, а роутер провайдера — магії не буде. Про Арго тунель рік назад я не знав, як доберуся — протестую.

Для DuckDNS не потрібна зовнішня ip адреса. Він працює з переадресацію портів. djajafer.medium.com/...​assistant-io-14c23316fcff

Переадресація портів — то щоб щось з локального роутера перекинулося далі на вузол в локальній мережі, безпосередньо на рпі, а у мене саме роутер недоступний з зовнішнього інтернету. forums.tomshardware.com/...​rk-through-cgnat.3696849 Магії не буває, маж бути або зовнішній айпі у роутера (не з моїм провайдером), або постійно відкритий сокет ініціований з рпі (підозрюю Cloudflared так і працює, але наразі протестити не можу)

Також можна використати підтримуваний роутером сервіс динамічного DNS — DynDNS, NO-IP, TZO та подібні.

HDD вже десятки років як навчилися нормально хендлити непередбачувані відключення живлення і паркувати головки. Інше діло, що я не впевен щодо їх швидкості, бо в теоріі в зчитуванні сучасна SD-карта його обійде.

А ще на RPI3 usb 3.0 не настільки швидкий як у 4 версії. Яку приблизно швидкість видають HDD через плату розширення (hat)?

У мене РПі 4, хдд дані ганяє по юсб, хет з пінів бере тільки живлення. При тестах видавало ап ту 350 мб/с (послідовне). Карта давала 150.

А чи порівнювали Home Assistant з openHAB, коли обирали платформу для smart home?

Вам не потрібно усе що тут написано. Якщо у вас немає проблем з Home Assistant вам взагалі вона не потрібна. Насправді в Home Assistant дуже багато всього можна зробити за допомогою графічного інтерфейсу.

Підписатись на коментарі