Установка Hass.io на Virtual Box: пошаговая инструкция

Обновление 16.10.2018 Описание ручной установки Hass.io на Raspberry Pi и другие одноплатные компьютеры было вынесено в отдельную заметку и доступно здесь.

Данная инструкция призвана помочь быстро установить Home Assistant (в варианте Hass.io, об этом ниже) на виртуальную машину Virtual Box, чтобы ознакомиться с его возможностями и решить, двигаться ли дальше. Эта же последовательность шагов должна работать на любом сервере или рабочей станции под управлением Ubuntu 18.04.

В конце мы получим работающий Home Assistant, доступный по выделенному IP адресу в домашней сети или даже через интернет, если захочется.

Терминология

  • Home Assistant (HA) - быстро развивающаяся система домашней автоматизации, написанная на языке Python, с огромным списком поддерживаемого оборудования и сервисов
  • Гостевая машина - виртуальная Linux машина с Home Assistant
  • Хост - физический компьютер с Microsoft Windows (или другой ОС), на которой установлен VirtualBox
  • Hass.io - набор docker контейнеров, позволяющий упростить установку и эксплуатацию HA, а также позволяющий расширить его функции с помощью большого количества готовых Hass.io аддонов, поддерживаемых коммьюнити.

Варианты установки Home Assistant:

  • Установка Home Assistant в виде python приложения в окружение virtualenv (для тех, кому по каким-то причинам не подходит docker)
  • Установка официального образа Home Assistant в контейнер на собственном docker-е (для тех, кто считает, что они сделают собственную копию Hass.io лучше, чем огромное комьюнити опытных разработчиков)
  • Установка Hass.io в виде образа SD карты для Raspberry Pi. Ранее этот образ был построен на базе ResinOS, которая недавно была заменена новой операционной системой HassOS, специально оптимизированной для запуска Hass.io (официально рекомендуется для установки на Raspberry Pi)
  • Установка Hass.io на любую линукс-машину, где предварительно установлен docker (ниже мы подробно опишем этот способ)

Шаг 1: Установка VirtualBox для Microsoft Windows 10 и подключение образа

Тут всё просто как железная дорога: скачиваем установочный пакет VirtualBox по ссылке, устанавливаем. Скачиваем любой образ виртуальной машины с линуксом по желанию, в моём случае это Ubuntu Server 18.04, скачанный отсюда, распаковываем в папку на хосте.

Создаём виртуальную машину в VirtualBox, количество памяти указываем по вкусу, для улучшения проворности лучше указать 4 или 8 гигабайт, если есть возможность:

1538596255338

В свойствах виртуальной машины в настройках жесткого диска указываем скачанный образ:

1538596417364

Запускаем машину, логинимся под пользователем osboxes и паролем osboxes.org, убеждаемся, что всё работает.

1538596590821

Шаг 2: Обеспечиваем доступность виртуальной машины с хоста

Работа напрямую с гостевой машиной в окне VirtualBox неудобна как минимум по двум причинам:

  1. Невозможно открыть UI Home Assistant в браузере на хосте
  2. Неудобно работать в консоли гостевой машины с терминалом

Чтобы сделать её доступной в домашней сети, поменяем тип сетевого адаптера в гостевой машине с NAT на Bridged Adapter и перезагрузим её:

1538596938595

После рестарта пробуем выполнить на гостевой машине команду (пароль для sudo - osboxes.org):

$ sudo ifconfig

[sudo] password for osboxes:
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.60  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::a00:27ff:fe00:b708  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:00:b7:08  txqueuelen 1000  (Ethernet)
        RX packets 709  bytes 66421 (66.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 268  bytes 29862 (29.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 56  bytes 4408 (4.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 56  bytes 4408 (4.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

В списке сетевых адаптеров мы должны увидеть что-то типа:

inet 192.168.1.60  netmask 255.255.255.0  broadcast 192.168.1.255

Это IP адрес, по которому гостевая машина доступна извне. Далее по тексту предполагаем, что адрес нашей виртуалки 192.168.1.60. Проверим её доступность запустив команду ping на хосте:

C:\VM\ubuntu_server_1804>ping 192.168.1.60
Обмен пакетами с 192.168.1.60 по с 32 байтами данных:
Ответ от 192.168.1.60: число байт=32 время<1мс TTL=64
Ответ от 192.168.1.60: число байт=32 время<1мс TTL=64
Ответ от 192.168.1.60: число байт=32 время<1мс TTL=64
Ответ от 192.168.1.60: число байт=32 время<1мс TTL=64

Статистика Ping для 192.168.1.60:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек

Если пинг успешен как на картинке выше, можно двигаться дальше. Для нетерпеливых можно перейти к шагу 7 и скачать образ с становленным и работающим Hass.io. Далее мы займёмся самостоятельной установкой Hass.io на любой компьютер под управлением Linux.

Шаг 3: Установка SSH клиента для работы с командной строкой

Скачиваем и устанавливаем на хост Putty или любой другой альтернативный SSH клиент для Windows, например, KiTTY или git bash. Можно обойтись одним исполняемым файлом, не требующим установки.

Пробуем запустить putty и присоединиться к костевой машине:

1538597542225

Соглашаемся принять ключ сервера:

1538597584277

Вводим в приглашение уже известную комбинацию логина и пароля osboxes/osboxes.org и убеждаемся, что мы внутри:

1538597846216

Шаг 4: Установка зависимостей

Пора заняться установкой софта. На странице Hass.io есть список дополнительных пакетов, которые требуются для успешной инсталляции Hass.io. Но если вы используете Ubuntu Server, то из них, фактически, нужно доустановить только два: avahi-daemon и jq. В других дистрибутивах может понадобиться установка дополнительных пакетов, скрипт установки Hass.io заботливо проверит зависимости и скажет вам, чего не хватает.

Чтобы иметь возможность установить пакеты avahi-daemon и jq, нужно подключить дополнительный репозиторий Ubuntu:

$ sudo add-apt-repository universe && sudo apt-get update

'universe' distribution component enabled for all sources.
Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic/main Translation-en [516 kB]
Get:5 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [8,570 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic/universe Translation-en [4,941 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [394 kB]
Get:8 http://archive.ubuntu.com/ubuntu bionic-updates/main Translation-en [146 kB]
Get:9 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [556 kB]
Get:10 http://archive.ubuntu.com/ubuntu bionic-updates/universe Translation-en [143 kB]
Get:11 http://archive.ubuntu.com/ubuntu bionic-security/main amd64 Packages [177 kB]
Get:12 http://archive.ubuntu.com/ubuntu bionic-security/main Translation-en [68.7 kB]
Get:13 http://archive.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [84.5 kB]
Get:14 http://archive.ubuntu.com/ubuntu bionic-security/universe Translation-en [46.4 kB]
Fetched 15.8 MB in 2min 40s (99.1 kB/s)
Reading package lists... Done
Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
Hit:2 http://archive.ubuntu.com/ubuntu bionic-security InRelease
Hit:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
Reading package lists... Done

Если пакеты не устанавливаются, проверьте, что вашей новой виртуальной машине разрешен доступ в интернет, например, командой ping google.com. Мой роутер, например, требует обязательного подтверждения полномочий для всех новых устройств. Обновим все установленные пакеты до последней версии:

$ sudo apt upgrade

Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  linux-headers-4.15.0-36 linux-headers-4.15.0-36-generic linux-image-4.15.0-36-generic linux-modules-4.15.0-36-generic
  linux-modules-extra-4.15.0-36-generic
The following packages will be upgraded:
  amd64-microcode apport apt apt-utils base-files bind9-host cloud-init console-setup console-setup-linux cryptsetup cryptsetup-bin curl
  dnsutils gcc-8-base grub-common grub-pc grub-pc-bin grub2-common initramfs-tools initramfs-tools-bin initramfs-tools-core
  intel-microcode keyboard-configuration libapt-inst2.0 libapt-pkg5.0 libbind9-160 libcryptsetup12 libcurl3-gnutls libcurl4
  libdns-export1100 libdns1100 libgcc1 libglib2.0-0 libglib2.0-data libirs160 libisc-export169 libisc169 libisccc160 libisccfg160
  liblwres160 liblxc-common liblxc1 libmspack0 libplymouth4 libpython3.6 libpython3.6-minimal libpython3.6-stdlib libstdc++6 libx11-6
  libx11-data libxml2 linux-generic linux-headers-generic linux-image-generic linux-signed-generic lshw open-iscsi open-vm-tools
  plymouth plymouth-theme-ubuntu-text python3-apport python3-distupgrade python3-problem-report python3-software-properties
  python3-update-manager python3.6 python3.6-minimal software-properties-common tzdata ubuntu-release-upgrader-core update-manager-core
71 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 89.1 MB of archives.
After this operation, 336 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Соглашаемся и ждём, пока система закончит обновление пакетов, процесс может занять 10-20 минут в зависимости от производительности вашего компа.

Установим нужные для Hass.io зависимости, а заодно и докер:

$ sudo apt install avahi-daemon jq docker.io

[sudo] password for osboxes:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  linux-headers-4.15.0-29 linux-headers-4.15.0-29-generic linux-image-4.15.0-29-generic linux-modules-4.15.0-29-generic
  linux-modules-extra-4.15.0-29-generic
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  bridge-utils cgroupfs-mount libavahi-common-data libavahi-common3 libavahi-core7 libdaemon0 libjq1 libltdl7 libnss-mdns libonig4
  ubuntu-fan
Suggested packages:
  avahi-autoipd ifupdown aufs-tools debootstrap docker-doc rinse zfs-fuse | zfsutils avahi-autoipd | zeroconf
The following NEW packages will be installed:
  avahi-daemon bridge-utils cgroupfs-mount docker.io jq libavahi-common-data libavahi-common3 libavahi-core7 libdaemon0 libjq1 libltdl7
  libnss-mdns libonig4 ubuntu-fan
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 30.7 MB of archives.
After this operation, 139 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

Соглашаемся и терпеливо ждём окончания установки нужных пакетов.

Добавим текущего пользователя в группу docker, чтобы при вызове докера каждый раз не использовать sudo:

$ sudo usermod -aG docker osboxes

Чтобы изменения применились, нужно выйти из системы и зайти снова! Это можно сделать комбинацией клавиш Ctrl+D. Логинимся обратно и проверяем, что docker работает:

$ docker --version
Docker version 17.12.1-ce, build 7390fc6

Шаг 5: Установка Hass.io

В официальной инструкции указано, что скрипт надо запускать от имени root, многие это пропускают и получают ошибку permission denied при попытке запустить скрипт. Мы будем запускать его так:

$ curl -sL https://raw.githubusercontent.com/home-assistant/hassio-build/master/install/hassio_install | sudo bash -s

Ждём, пока скрипт отработает и вернёт нас в командную строку, это может занять продолжительное время.

Шаг 6: Проверка работоспособности

Убедимся, что контейнеры запущены и работают:

$ docker ps

CONTAINER ID IMAGE                                    COMMAND               CREATED       STATUS       NAMES
4b21032640b4 homeassistant/qemux86-64-homeassistant   "/usr/bin/entry.sh"   2 minutes ago Up 2 minutes homeassistant
9dc2af4a981d homeassistant/amd64-hassio-supervisor    "python3 -m hassio"   2 minutes ago Up 2 minutes hassio_supervisor

Данная команда должна показать нам довольно кривой список из двух контейнеров hassio_supervisor и homeassistant в статусе Up. Если вы счастливый обладатель очень широкого монитора, возможно вам удастся увидеть все данные в одну строку, как замышляли авторы docker. В конце статье (в полезностях) указано, как выводить только избранные колонки для команды ps, чтобы при чтении не вытекали глаза.

Если сейчас открыть страницу Home Assistant по адресу: http://192.168.1.60:8123, можно увидеть вот такой тизер:

1538600742052

Из логов hassio_supervisor в то же время видно, что он скачивает и устанавливает образ последней версии home assistant:

docker logs hassio_supervisor -f

[...]
18-10-03 21:18:38 INFO (MainThread) [hassio.addons] Startup application run 0 add-ons
18-10-03 21:18:38 INFO (MainThread) [hassio.tasks] All core tasks are scheduled
18-10-03 21:18:38 INFO (MainThread) [hassio.core] Hass.io is up and running
18-10-03 21:18:38 INFO (MainThread) [hassio.homeassistant] Setup Home Assistant
18-10-03 21:18:38 INFO (SyncWorker_4) [hassio.docker.interface] Pull image homeassistant/qemux86-64-homeassistant tag 0.79.3.

В зависимости от скорости соединения может потребоваться какое-то время, прежде чем Home Assistant будет скачан и запущен. Может даже показаться, что Hass.io завис. Дождитесь появления в логе строчек вида:

18-10-03 21:38:29 INFO (SyncWorker_4) [hassio.docker.interface] Tag image homeassistant/qemux86-64-homeassistant with version 0.79.3 as latest
18-10-03 21:38:29 INFO (MainThread) [hassio.homeassistant] Home Assistant docker now installed
18-10-03 21:38:29 INFO (MainThread) [hassio.homeassistant] Start Home Assistant
18-10-03 21:38:29 INFO (SyncWorker_2) [hassio.docker.interface] Stop homeassistant/qemux86-64-homeassistant Docker application
18-10-03 21:38:33 INFO (SyncWorker_2) [hassio.docker.interface] Clean homeassistant/qemux86-64-homeassistant Docker application
18-10-03 21:38:33 INFO (SyncWorker_2) [hassio.docker.homeassistant] Start homeassistant homeassistant/qemux86-64-homeassistant with version 0.79.3

Открываем URL: http://192.168.1.60:8123

1538602914072

Создаём аккаунт и логинимся в Home Assistant:

1538603064911

Мы это сделали!

Шаг 7: Использование готового образа Virtual Box

Для тех, кто не хочет вникать в тонкости установки Hass.io, я подготовил образ (1.6Гб), который можно подключить к VirtualBox и сразу получить работающий Hass.io, его можно скачать здесь. Учётные данные для входа в HA: user/password.

Образ на основе Ubuntu Server получился довольно увесистым (более 5Гб в распакованном виде), но его плюс в стандартизации, т.е. инструкция выше будет работать без изменений на настоящем сервере Ubuntu и с минимальными изменениями на других ОС. Возможно, позже я сделаю ещё один образ на основе более компактного дистрибутива Linux.

Шаг 8: Несколько полезностей

Где хранится конфигурация Home Assistant и как её редактировать:
nano /usr/share/hassio/homeassistant/configuration.yaml

Выход из редактора nano командой Ctrl+X.

Можно также воспользоваться онлайн редактором конфигурации, доступном в виде аддона Hass.io: HASS Configurator.

Как перезапустить Home Assistant из докера:
docker restart homeassistant
Как удалить базу данных HA и начать “с чистого листа” (нужна перезагрузка Home Assistant):
rm /usr/share/hassio/homeassistant/home-assistant_v2.db
Укороченный вариант команды docker ps, удобный для нешироких экранов:
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"

Его можно добавить в алиасы и вызывать, например, командой dps.