Home Assistant або ще один «мозок» для проекту типу «Розумний Будинок»

Добрий день, шановний читач. Днями довелося мені погратися з багатьом вже відомої іграшкою від Google – Google Home. Штука хороша — огляд її я звичайно не буду. У комірці абсолютно випадково завалялися Raspberry PI 3 (RPi), Arduino Mega і ще їм подібна дрібниця, яку захотілося підключити Google Home (GH) з метою голосового управління. Простого API у GH немає, але є можливість з допомогою стороннього сервісу організувати голосове керування системою на RPi + Arduino з затримкою команд у кілька секунд.

Читаючи буржуйські форуми (справедливості заради, потрібно відзначити, людина я схиблений на автоматизації і IoT), звернув увагу на досі мені невідоме щось, що називають Assistant Home (HASS), цю систему умільці і прикручують до GH.

В двох словах про самій платформі:

Система написана на Phyton, останній реліз був 29 січня, поточна версія: 0.37.0

Підтримувані ОС:

  • Windows 10
  • Mac OS X
  • Ubuntu 14.04
  • Raspbian (Raspberry PI)
  • iOS App – beta
Підтримувані компоненти: 545 шт., включаючи майже всі TV/AV receivers, Broadlink, ZigBee, iCloud, Yandex TTS і багато, багато іншого.

Для запуску, підключення та налаштування компонентів, вимикачів, сценаріїв, груп, тригерів зовсім не обов'язково знати Phyton, але треба хоч трохи знати yaml.

«Чейта раптом?» — подумаєте ви.

Відповідаю: налаштування всього вищепереліченого (існуючих компонентів) здійснюється виключно через YAML файл (“configuration.yaml").

Установка проста – зупинятися на ній і розписувати всі кроки сенсу не має, до того ж у проекту є шикарне співтовариство, готове допомогти в скрутну хвилину (Eng). (всі посилання додатково поміщу в підвалі, як велить статут)

Будьте готові, що установка займає чимало часу, на моїй RPi 3 загальний час (без Raspbian) зайняло близько години.

Після завершення заповітного
wget
, я приступив до вивчення платформи. Установка HASS проводиться в директорію:
/home/homeassistant
. Нас же цікавить
/home/homeassistant/.homeassistant/configuration.yaml
.

За замовчуванням в конфіги присутній такий компонент:

# Автовизначення пристроїв
discovery:

Якщо у вас в мережі є такі пристрої:

  • Google Chromecast
  • Belkin WeMo switches
  • Philips Hue
  • Netgear routers
  • Plex media server
  • Panasonic Viera
  • Roku media player
  • Sonos Speakers
  • Yamaha media player
  • Logitech media server (Squeezebox)
  • DirecTV
Вони будуть виявлені автоматично і відображаються в основний (і поки єдиним) групі «Home».

Компонент «http»:

# Включення доступу до frontend
http:
# Прибрати тег коментар та виставити пароль (recommended!)
#api_password: YOUR_PASSWORD

Як абсолютно справедливо зазначено на порталі — HIGHLY recommended – з міркувань безпеки.

Після успішного зміни конфігураційного файлу, необхідно перезапустити сервіс. Для цього є два шляхи:

1) Використовувати shell команди:

~ $ sudo systemctl stop home-assistant.service
~ $ sudo systemctl start home-assistant.service 

або відразу

~ $ sudo systemctl restart home-assistant.service

2) Виконати перезапуск з GUI: Розгорнути гамбургер, в підвалі "Developer Tool" відкрити "Services", у випадаючому списку "Domain" вибрати "homeassistant", у випадаючому списку "Service" – "Restart" і натиснути кнопку «CALL SERVICE».
Зверну вашу увагу, що frontend використовує кеш, під час перезапуску або зупинки сервісу, сторінка повністю доступна для перегляду, проте ніяких дій здійснити не представляється можливим.
Як тільки запущений рестарт сервісу, або через shell або через GUI, в нижній частині екрану з'явиться поле показує поточний статус сервісу.

Як тільки сервіс підніметься, сторінка автоматично оновиться і поле зникне. Якщо в конфіг закралася помилка, сервіс так і не запуститься.

Що необхідно зробити в такому випадку:

1) Відкрити лог файл:
~/.homeassistant/ home-assistant.log

Записи в балці досить структуровані, з часто, вказаним номером рядка configuration.yaml в якій виникла помилка.
2) Вирішити проблему зазначену в протоколі
3) Запустити сервіс командою вище з консолі

Ми задали пароль, ми виставили (якщо з якоїсь причини не було за замовчуванням) автовизначення обладнання, прийшов час зайти на портал:

http://IP-Address:8123

8123 — порт за замовчуванням.

Перший запуск HASSimage

Що дозволяє зробити HASS з ресивером:

Нам доступні: Джерело, Гучність, Без Звуку (при прослуховуванні аудіо записи, доступні кнопки управління треками).

Тепер більш докладно розглянемо yaml-ку. Я наводжу декілька розширену версію, на базі якої буде простіше зрозуміти-які можливості у HASS є, а також, можливо, допоможе вам у налаштуванні власного оточення.

configuration.yaml
homeassistant:

# Назва оточення запущеного HASS
name: Будинок

# Координати для Зони Будинок*, а також для розрахунку світанку і заходу
latitude: _REDACTED_
longitude: _REDACTED_

# Висота над рівнем моря – для розрахунку світанку і заходу
elevation: 0

# 'metric' вимірювання в метричній, 'imperial' - імперською
unit_system: metric

# Часовий пояс: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
time_zone: Europe/Moscow

# До опису елемента customize повернемося пізніше. Тут - підключення файлу в якому описаний компонент
#customize: !include customize.yaml

# Включення GUI frontend. Щоб приховати, необхідно закоментувати
frontend:

# Перевірка оновлень
updater:
reporting: no

# Відстеження змін показників підключених пристроїв і компонентів
logbook:

# Відстеження заходів і світанків по гео-координатами і висотою над рівнем моря
sun:

# надиктовування команд з фронтенд GUI
conversation:

# відстеження історії показників
history:

# Автовизначення сумісних пристроїв
discovery:

# Налаштування доступу до ФронтЕнду:
http:
api_password: _REDACTED_
# ssl_certificate: _REDACTED_ # SSL опціонально
# ssl_key: _REDACTED_
# base_url: _REDACTED_
# trusted_networks:
# - 127.0.0.1
# - _REDACTED_/24
# ip_ban_enabled: True
# login_attempts_threshold: 5

Зона Будинок* — HASS дозволяє створювати зони (локації) по світі, країні, місті (де завгодно) на основі гео-координат, для використання їх в подальшому при створенні «автоматизаций» (automation) і оповіщень (notify).

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

Далі потрібно відредагувати конфіг файл, перезапустити сервіс HASS, перейти на Веб-сторінку і подивитися, що вийшло.

Тепер приступимо до першої автоматизації (далі automation). В якості першої automation, пропоную розглянути «Будильник». Для реалізації цього завдання нам не обов'язково мати аудіо або відео пристрою в мережі. Однак, у прикладі, я покажу використання ресивера в якості будильника.

Завдання

Пробуджувати в призначений час, включенням AV ресивера, з наростанням гучності. По закінченню певного часу, синтезувати текст в мову і оповіщати прокидаються про поточної погоду за вікном, щоб одяглися у відповідності з погодними умовами, також надсилання повідомлення Telegram, з інформацією про погоду.

Ресурси

  • Raspberry Pi
  • Assistant Home
  • Мережа (wired/wireless) з виходом в Internet
  • VLC
  • AV Ресивер (опціонально)
  • Telegram
  • Telegram Bot
  • Yandex SpeechKit Cloud
  • OpenWeatherMap
Реалізація

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

Отже, у нас є свій Бот. Для його підключення до HASS необхідно в
configuration.yaml
прописати наступне:

# Telegram Notifier
notify:
- name: NOTIFIER_NAME (ім'я яке згодом буде використовуватись для ідентифікації компонента 'notify' - eng)
platform: telegram
api_key: ABCDEFGHJKLMNOPQRSTUVXYZ
chat_id: YOUR_CHAT_ID

Однак якщо плануєте додати кілька сервісів оповіщення, краще використовувати вкладений файл. Значно спрощує читання конфігураційного файлу.

Про те як це зробити буде написано нижче.

Як видно з коментарів, нам необхідно API видане нам для Бота, а також, Chat ID. Для того, що б його отримати Chat ID, потрібно написати вашу Роботу хоча б одне повідомлення, після чого відкрити сторінку за адресою:

https://api.telegram.org/bot*API*/getUpdates.

Де *API* — API видане вам.

В результаті ви отримаєте якийсь JSON, в якому нас цікавить наступне:

{"<b>id</b>":<b>123456789 </b>...}

Значення ID нам і потрібно.

Далі, підключимо компонент відповідає за синтезування тексту SpeechKit Cloud Yandex.

Для цього нам необхідно зареєструватися і пройти кілька нескладних кроків налаштування.

Вибрати з підключаються сервісів API SpeechKit Cloud і отримати ключ.

В
configuration.yaml
внести такий запис:

tts:
- platform: yandextts # Визначення платформи по роботі з компонентом TTS
name: yandextts # Ім'я компонента, для використання в подальшому
api_key: 'API до SpeechKit'
language: 'uk-ua' # Мова виголошуваної фрази – за замовчуванням ru
codec: 'mp3' # Формат генерованого аудіо файлу
voice: 'jane' # Голос диктора
emotion: 'good' # Настрій диктора
speed: '1' # Швидкість мови

Пояснення і варіанти параметрів доступні на сайті Яндекс.

Тепер у нас є аж два сервісу по оповіщенню, але нам «замало буде», доведеться додати ще один: VLC.

Так як я спочатку використовував Raspberry PI, VLC я встановлював простою командою:

sudo apt-get install vlc

Далі потрібно налаштувати параметри звуку на Raspberry — пристрій відтворення і виконати нехитру маніпуляцію з правами доступу користувача, який був створений при установці HASS AIO (All-In-One).

sudo usermod -a -G audio homeassistant

Команда додає користувача в групу audio.

В
configuration.yaml
вносимо рядок:

media_player: !include media_player.yaml

У батьківській папці створюємо файл:
media_player.yaml
де будуть зберігатися всі налаштування для медіа пристроїв які ми будемо підключати.

Вносимо наступні параметри:

platform: yamaha
name: Yamaha_671
zone: 2
# Визначаємо кастомні елементи управління - опціонально
commands:
turn_on:
service: media_player.turn_on
turn_off:
service: media_player.turn_off
volume_up:
service: media_player.volume_up
volume_down:
service: media_player.volume_down
customize: # змінюємо відображення на frontend даного пристрою
media_player.yamaha_671:
hidden: true # приховуємо пристрій yamaha_671 - зона основна (Main)

- platform: vlc
name: vlcmp # назва нашого плеєра VLC

У мого ресивера є дві зони відтворення (Main, Zone 2). У прикладі я використовую другу.

Всі додаткові компоненти підключені. Можемо переходити до налаштування самого елемента будильника.

Додамо в конфігураційний файл рядок:

## Input Boolean
input_boolean: !include input_boolean.yaml

Створюємо файл батьківської папки:
input_boolean.yaml


Вносимо наступні рядки:

alarmweekday: #створюємо перемикач - Будити тільки в робочі дні
name: Робочий тиждень
initial: on # Значення за замовчуванням
icon: mdi:calendar

Як видно з назви yaml, ми підключаємо компонент типу «Вимикач». Єдине що мені здається додатково варто описати це icon. Ми можемо використовувати будь-які іконки з бібліотеки MDI.

Для виставлення часу можна використовувати компоненти:

input_slider 
input_select 

Один являє собою вибір із списку. Інший слайдер. Я скористався зручним у налаштуванні слайдером.

В
configuration.yaml
прописуємо:

## Input Slider
input_slider: !include input_slider.yaml

Як вже завелося в батьківській папці створюємо файл:
input_slider.yaml

Далі заповнюємо його:

alarmhour:
name: Годинник
icon: mdi:timer
initial: 8 # значення за замовчуванням
min: 0 #Мінімальне значення
max: 23 #Максимальне значення
step: 1 #Крок зміни
alarmminutes:
name: Хвилини
icon: mdi:timer
initial: 40
min: 0
max: 59
step: 1

І ще одну нехитру штуку нам належить зробити: сенсор.
В конфіги прописуємо:

sensor: !include_dir_merge_list sensors

Ця команда означає, що слід брати всі файли з папки sensors. У свою чергу, в папці sensors створюємо yaml файл з назвою:
alarmclock.yaml
. Налаштування
alarmclock.yaml
:

platform: template
sensors:
alarm_time:
friendly_name: 'Будильник '
value_template: '{{ states.input_slider.alarmhour.state | int }}:{% if states.input_slider.alarmminutes.state|length == 1 %}0{% endif %}{{ states.input_slider.alarmminutes.state | int }}'

Тут цікавіше. З'являється якийсь template. Цей компонент дозволяє всіляко управляти даними інших компонентів HASS. В даному прикладі, ми створюємо сенсор і заповнюємо його даними з слайдерів будильника, примусово наводячи значення к int і додаючи «0» якщо «довжина» хвилин == 1. Більш докладно про можливості можна дізнатися на порталі HASS.

Нам знадобиться ще один сенсор — погодні умови.

Серед всіх доступних компонентів типу weather мій вибір припав на OpenWeatherMap Sensor. В папці sensors необхідно створити файл
weather.yaml
і наповнити його наступним:

platform: openweathermap
api_key: *API*
latitude: *latitude*
longitude: *longitude*
monitored_conditions:
- weather
- temperature
- wind_speed
- humidity
- clouds
- rain
- snow

Як не важко помітити, що нам буде потрібно для інтеграції API від OWM. API безкоштовне, і отримати його можна зареєструвавшись на порталі. Зберігаємо, закриваємо, йдемо далі.

Вимикачі, слайдери і сенсори для будильника ми створили. Тільки чого ж включати, якщо самого будильника поки немає?

Приступимо до створення automation.

В
configuration.yaml
прописуємо:

## Automation for: alarmclock...
automation: !include_dir_merge_list automation

Це означає, що будуть завантажені всі файли з папки automation. Тепер створюємо батьківської директорії папку «automation».

Створюємо файл:
alarmclock.yaml


І приступаємо до заповнення.

Так як у мене використовується инкрементирование гучності кожну секунду — файл великий. Я наведу найбільш необхідні рядки, решта можна налаштувати за аналогією.

Automation для Будильника
alias: 'Будильник '
trigger:
platform: template
value_template: '{{ states.sensor.time.state == states.sensor.alarm_time.state }}' # Визначення тригера.
condition: # Умови
condition: or
conditions:
- condition: and
conditions:
- condition: state
entity_id: input_boolean.alarmweekday
state: 'on'
- condition: time
weekday:
- mon
- tue
- wed
- thu
- fri
- condition:state
entity_id: input_boolean.alarmweekday
state: 'off'
action: # Дії 
- service: notify.NOTIFIER_NAME
data_template:
title: Доброго ранку, Друже! =)
message: "Прокидайся, на роботу пора! За вікном зараз {{ states('sensor.owm_temperature')|int }} °C."
- service: media_player.turn_on # Включаємо медіа плеєр
entity_id: media_player.yamaha_671_zone_2 # Вказуємо, який саме медіа плеєр нас цікавить

- service: media_player.volume_set # Встановлюємо гучність
data:
entity_id: media_player.yamaha_671_zone_2# Вказуємо, який саме медіа плеєр нас цікавить
volume_level: '0.20' # Значення параметра Гучності

- service: media_player.select_source # Вибираємо джерело 
data:
entity_id: media_player.yamaha_671_zone_2
source: RADIO NET

- delay: 00:00:10 # Пауза
- service: media_player.volume_set # Встановлюємо гучність
data:
entity_id: media_player.yamaha_671_zone_2
volume_level: '0.25'

- delay: 00:00:01 # Пауза
- service: media_player.volume_set # Встановлюємо гучність
data:
entity_id: media_player.yamaha_671_zone_2
volume_level: '0.30'

# Тут було багато повторюваних блоків із зростаючим значенням гучності кожну секунду

- delay: 00:00:01
- service: media_player.turn_on # Включаємо знову, раптом вимкнений. (В ідеалі краще виносити в окремий automation)
entity_id: media_player.yamaha_671_zone_2

- service: media_player.select_source
data:
entity_id: media_player.yamaha_671_zone_2 # Вибираємо джерело - тепер це вхід Audio 2 - саме до нього підключений RPi
source: AUDIO2

- service: media_player.volume_set
data:
entity_id: media_player.yamaha_671_zone_2
volume_level: '0.70'

- delay: 00:00:01 
- service: tts.yandextts_say # Викликаємо Яндекс
data_template:
message: "Люб'язний пане! Звольте вислухати коротке зведення новин про погоду. За вікном зараз {{ states('sensor.owm_temperature')|int }} градусів." # Вказуємо який текст нам необхідно синтезувати
entity_id: media_player.vlcmp # Вказуємо, який медіа плеєр повинен відтворити потік
language: 'uk-ua'


«Ура! Запрацювало!». Але щоб все зробити красиво, пропоную зробити ще одне нескладне дію. Створити групи (вкладка на фронтенде).

Створюємо файл
group.yaml
батьківської папки. В конфіги посилаємося на нього:

group: !include group.yaml

І приступаємо до заповнення
group.yaml
.

Налаштування відображення створених елементів
# Визначаємо які вкладки і елементи будуть відображатися у frontend, а також, що буде відображатися на головній вкладці.
default_view:
view: yes
entities:
- group.AlarmClock
- sensor.alarm_time
- sensor.owm_cloud_coverage
- sensor.owm_condition
- sensor.owm_humidity
- sensor.owm_rain
- sensor.owm_snow
- sensor.owm_temperature
- sensor.owm_wind_speed

#Визначаємо які елементи входять до складу групи
alarmclock:
name: Будильник.
entities:
- sensor.alarm_time
- input_slider.alarmhour
- input_slider.alarmminutes
- input_boolean.alarmweekday

#Вкладка (tab) описуємо складу вкладки.
AlarmClock:
name: Будильник
view: yes
entities:
- group.alarmclock


Настала пора зберегти всі наші установки, перезапустити сервіс і подивитися, що вийшло!

На даний момент у мене підключені наступні компоненти:

TV, AV Ресивер, роутер TP-Link, ведеться відстеження пристроїв, оповіщення мене і дружини, коли хтось із нас прийшов\вийшов з дому, автовключення ресівера, коли хтось з'являється дому перший, вимкнення пристроїв при виході з будинку, тимчасово: Broadlink + Livolo Switch.

Розвиток

  • Підключитися до DIY вимикачів світла
  • Спробувати підключитися до кавомашині і чайнику
  • Зробити кнопки біля ліжка для більш простого вимкнення будильника!
  • Створити оптимальні «автоматизації»
Дорогий читачу, я вдячний тобі за твоє безцінний час! Якщо до HASS буде живий інтерес, опишу та інші можливості з прикладами. До нових зустрічей!

Список літературиОфіційний сайт HASS
Офіційне співтовариство HASS
YAML
Telegram Реєстрація Бота
Telegram як працювати з Ботом
Яндекс Технології
OpenWeatherMap
Управління телевізорами Philips по мережі
Raspberry Pi

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.