Stupid House

Установка Home Assistant на FreeBSD


В FreeBSD установка программ может происходить из пакетов и из портов. Установка из портов - это теплый ламповый метод построения своего внутреннего мира, но этот метод требует гораздо больше времени.

 

Установка Home Assistant

Первым делом, при установке программ из портов, обновляем порты. Про использование и обновление портов хорошо расписано в документации на сайте FreeBSD.

Обновление портов:

# svn update /usr/ports
или
# portsnap fetch update

На сайте Home Assistant рекомендован python версии 3.8, работу на версии 3.7 обещали выпилить после 07.12.2020. Устанавливаем необходимые программы, при сборке py-sqlite3 указываем версию python. В процессе первого запуска выяснилось, что для работы frontend'а необходим компонент py-pillow, для версии 3.8 его нет, но есть для версии 3.7 и с ним всё работает, единственное, что py37-pillow притаскивает за собой в систему и python 3.7.

# cd /usr/ports/security/ca_root_nss && make install clean
# cd /usr/ports/shells/bash && make install clean
# cd /usr/ports/databases/sqlite3 && make install clean
# cd /usr/ports/lang/python38 && make install clean
# cd /usr/ports/databases/py-sqlite3 && make FLAVOR=py38 install clean
# cd /usr/ports/graphics/py-pillow && make install clean

Альтернативный вариант для тех кто предпочитает ставить из пакетов и дорожит временем и нервами:

# pkg install ca_root_nss bash python38 py38-sqlite3 py37-pillow sqlite3

 

Создание нового пользователя homeassistant от имени которого будет работать сервис, основным командным интерпритатором указываем Bash, не зря же ждали его сборки из пакетов :). У пользователя будет домашний каталог и отключен парольный доступ, для взаимодействия с устройствами Z-Wave и ZigBee добавляем его в группу dialer.

# pw useradd -n homeassistant -G dialer <span class="enlighter-text">-s /usr/local/bin/bash </span>-m -w no

Создаем папку для ядра Home Assistant и устанавливаем пользователя homeassistant для неё владельцем.

# mkdir /usr/local/homeassistant
# chown homeassistant:homeassistant /usr/local/homeassistant/

Теперь создаем виртуальное окружение для ядра Home Assistant, делаем это для учетной записи homeassistant.

# su homeassistant
$ cd /usr/local/homeassistant/
$ python3.8 -m venv .
$ source ./bin/activate
$ pip install --upgrade pip wheel
$ pip install homeassistant --use-feature=2020-resolver

Создаем начальную конфигурацию в домашнем каталоге /home/homeassistant

$ hass --script ensure_config

Запускаем наш Home Assistant в первый раз.

$ hass

Проверяем доступность установленной системы через браузер, первый запуск может занять какое то время.

http://ha_ip_address:8123

Прерываем работу запущенной системы.

Ctrl+C

Выходим из учетной записи пользователя homeassistant.

$ deactivate && exit

Создаем файл для запуска сервиса при старте системы.

# touch /usr/local/etc/rc.d/homeassistant

Заполняем созданный файл. Оригинал скрипта и последние его изменения лежат здесь. При использовании оригинального скрита необходимо подправить в переменной homeassistant_venv путь к папке с установленным ядром Home Assistant

#!/bin/sh
#
# https://github.com/tprelog/iocage-homeassistant/blob/master/overlay/usr/local/etc/rc.d/homeassistant
#
# PROVIDE: homeassistant
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# homeassistant_enable: Set to YES to enable the homeassistant service.
#       Default: NO
#
# homeassistant_user: The user account used to run the homeassistant daemon.
#       This is optional, however do not specifically set this to an
#       empty string as this will cause the daemon to run as root.
#       Default:  "homeassistant"
#
# homeassistant_group: The group account used to run the homeassistant daemon.
#       Default:  "homeassistant"
#
# homeassistant_config_dir: Directory where the homeassistant `configuration.yaml` is located.
#       Default:   "$HOME/.homeassistant"
#       Change:    `sysrc homeassistant_config_dir="/usr/local/etc/homeassistant"`
#       Reset to default: `sysrc -x homeassistant_config_dir`
#
# homeassistant_venv: Directory where the homeassistant virtualenv is located.
#       Default:  "/usr/local/share/homeassistant"
#       Change:    `sysrc homeassistant_venv="/srv/homeassistant"`
#       Reset to default: `sysrc -x homeassistant_venv`

# -------------------------------------------------------
# Copy this file to '/usr/local/etc/rc.d/homeassistant'
# `chmod +x /usr/local/etc/rc.d/homeassistant`
# `sysrc homeassistant_enable=yes`
# `service homeassistant start`
# -------------------------------------------------------

. /etc/rc.subr
name=homeassistant
rcvar=${name}_enable

pidfile_child="/var/run/${name}.pid"
pidfile="/var/run/${name}_daemon.pid"
logfile="/var/log/${name}.log"

load_rc_config ${name}
: ${homeassistant_enable:="NO"}
: ${homeassistant_user:="homeassistant"}
: ${homeassistant_group:="homeassistant"}
: ${homeassistant_config_dir:="/home/homeassistant/.homeassistant"}
: ${homeassistant_venv:="/usr/local/homeassistant"}

command="/usr/sbin/daemon"

start_precmd=${name}_prestart
homeassistant_prestart() {
 
  install -g ${homeassistant_group} -m 664 -o ${homeassistant_user} -- /dev/null "${logfile}" \
  && install -g ${homeassistant_group} -m 664 -o ${homeassistant_user} -- /dev/null "${pidfile}" \
  && install -g ${homeassistant_group} -m 664 -o ${homeassistant_user} -- /dev/null "${pidfile_child}" \
  || return 1

  if [ ! -d "${homeassistant_config_dir}" ]; then
    install -d -g ${homeassistant_group} -m 775 -o ${homeassistant_user} -- "${homeassistant_config_dir}" \
    || return 1
  fi
 
  HA_CMD="${homeassistant_venv}/bin/hass"
  HA_ARGS="--config ${homeassistant_config_dir}"
 
  if [ -n "${homeassistant_log_file}" ]; then
    install -g ${homeassistant_group} -m 664 -o ${homeassistant_user} -- /dev/null "${homeassistant_log_file}" \
    && HA_ARGS="${HA_ARGS} --log-file ${homeassistant_log_file}"
  fi
 
  if [ -n "${homeassistant_log_rotate_days}" ]; then
    HA_ARGS="${HA_ARGS} --log-rotate-days ${homeassistant_log_rotate_days}"
  fi
 
  rc_flags="-f -o ${logfile} -P ${pidfile} -p ${pidfile_child} ${HA_CMD} ${HA_ARGS}"
}

start_postcmd=${name}_poststart
homeassistant_poststart() {
  sleep 1
  run_rc_command status
}

restart_precmd="${name}_prerestart"
homeassistant_prerestart() {
  eval "${homeassistant_venv}/bin/hass" --config "${homeassistant_config_dir}" --script check_config
}

status_cmd=${name}_status
homeassistant_status() {
  if [ -n "$rc_pid" ]; then
    echo "${name} is running as pid $rc_pid."
    echo "http://`ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'`:8123"
  else
    echo "${name} is not running."
    return 1
  fi
}

stop_postcmd=${name}_postcmd
homeassistant_postcmd() {
    rm -f -- "${pidfile}"
    rm -f -- "${pidfile_child}"
}

run_rc_command "$1"

Устанавливаем права на запуск скрипта:

# chmod 755 /usr/local/etc/rc.d/homeassistant

Добавляем скрипт в автозапуск и стартуем сервис:

# sysrc homeassistant_enable="YES"
# service homeassistant start

Через Web браузер проверяем работу Home Assistant.

http://ha_ip_address:8123

 

Обновление Home Assistant

Для обновления до последней версии необходимо выполнить следующие команды.

# su homeassistant
$ cd /usr/local/homeassistant/
$ source ./bin/activate
$ pip install --upgrade homeassistant
$ deactivate && exit
# service homeassistant restart

Обратите внимание, что первый запуск Home Assistant после обновления может занять некоторое время.

Автор: muxa, 19.10.2020
Войдите или зарегистрируйтесь, чтобы иметь возможность оставлять комментарии

Комментарии


Я, как новичок в HomeAssistant по данной статье смог установить и настроить HASS. Спасибо автору.

Буду признателен, если автор порекомендует под FreeBSD координатор в USB :)

Не прошло и под года :) Перелистывая комменты наткнулся. У меня уже года два как без проблем работает СС2538. СС2531 не тестировал, но он тоже должен работать.

А как можно установить на FreeBSD HA c Supervisorом?

На сколько я понимаю Supervisor это фишка Docker контейнеров, вам надо копать в эту сторону.