Stupid House

Установка mosquitto + ZigBee2MQTT на FreeBSD


 

FreeBSD выбрана по следующим причинам:

  • Менее требовательна к железным ресурсам.
  • В портах и репозиториях есть актуальные версии необходимого программного обеспечения, которое постоянно обновляется.
  • Мое теплое отношение к данной операционной системе :)

Расписывать что такое MQTT, mosquitto и ZigBee2MQTT не буду, кто не знает читаем: CC2531 + ZigBee2MQTT, отказываемся от шлюзов производителей. В качестве координатора использую USB железку CC2538, которая поддерживает ZigBee версии 3, покупалось здесь.

 

Подготовка

Необходимо установить git, node.js и npm. ZigBee2MQTT требует версии Node v10.x, v12.x, v14.x, v15.x или v16.x, на данный момент последняя версия Node в пакетах v16, а в портах v17, не будем отступать от документации и поставим 16 версию.

Для установки из пакетов:

# pkg install git node npm

Для установки из портов:

# cd /usr/ports/devel/git
# make install clean
# cd /usr/ports/www/node16/
# make install clean
# cd /usr/ports/www/npm/
# make install clean

 

Установка и настройка mosquitto

Устанавливаем MQTT брокер mosquitto.

 

Установка из пакетов:

# pkg install mosquitto

Установка из портов:

# cd /usr/ports/net/mosquitto
# make install clean

В файл /usr/local/etc/mosquitto/mosquitto.conf вносим следующие изменения:

listener 1883
retain_available true
autosave_interval 1800
persistence true
persistence_file mosquitto.db
persistence_location /var/lib/mosquitto
allow_anonymous false
password_file /usr/local/etc/mosquitto/passwd

Создаем нового пользователя usermosquitto с паролем passmosquitto для подключения к mosquitto:

# mosquitto_passwd -c /usr/local/etc/mosquitto/passwd usermosquitto

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

# service mosquitto enable
# service mosquitto start

 

Установка и настройка ZigBee2MQTT

Создаем пользователя zigbee2mqtt, от которого будет работать сервис.

pw useradd -n zigbee2mqtt -G dialer -s /sbin/nologin -m -w no

Создаем папку /opt/zigbee2mqtt

# mkdir -p /opt/zigbee2mqtt

Клонируем репозиторий ZigBee2MQTT:

# git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt

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

# chown -R zigbee2mqtt:zigbee2mqtt /opt/zigbee2mqtt

Устанавливаем зависимости:

# cd /opt/zigbee2mqtt
# npm ci

При корректной установке в ответ будет выведено сообщение вида:

node-pre-gyp info ok
added 456 packages in 123.456s

Сообщения уровня WARNING игнорируем.

Редактируем файл настроек /opt/zigbee2mqtt/data/configuration.yaml:

homeassistant: true
permit_join: false
mqtt:
  base_topic: zigbee2mqtt
  server: 'mqtt://localhost'
  user: mqttuser
  password: mqttpassword
serial:
  port: /dev/cuaU0
advanced:
  channel: 20
  log_level: debug
  network_key:
    - 11
    - 22
    - 33
    - 44
    - 55
    - 66
    - 77
    - 88
    - 99
    - 00
    - 99
    - 88
    - 77
    - 66
    - 55
    - 44
frontend:
  port: 8080

Здесь:

  • homeassistant: true - включение интеграции с Home Assistant.
  • permit_join: false - подключение новых устройств. Для подключения новых устройств необходимо выставить в true, рекомендуемое значение false во избежание подключения случайных устройств.
  • server: 'mqtt://localhost' - адрес сервера MQTT брокера.
  • user: mqttuser - пользователь с доступом к MQTT брокеру.
  • password: mqttpassword - пароль для доступа к MQTT брокеру.
  • port: /dev/cuaU0 - порт устройства (в моем случае CC2538). Для доступа к порту пользователь должен входить в группу dialer.
  • channel: 20 - ZigBee канал.
  • log_level: debug - уровень ведения логов. Уровень Debug рекомендуется включать только для отладки или возникновении проблем.
  • network_key: [ 11, 22, 33, 44, 55, 66, 77, 88, 99, 00, 99, 88, 77, 66, 55, 44 ] - ключ шифрования ZigBee сети.
  • port: 8080 - порт Web интерфейса.

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

Запускаем ZigBee2MQTT:

# cd /opt/zigbee2mqtt
# npm start

Если ошибок нет, то останавливаем программу комбинацией клавиш Ctrl+C.

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

# nano /usr/local/etc/rc.d/zigbee2mqt

Заполняем его:

#!/bin/sh
#
# PROVIDE: zigbee2mqtt
# REQUIRE: LOGIN
# KEYWORD: shutdown

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

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

: ${zigbee2mqtt_enable:="NO"}
: ${zigbee2mqtt_user:="zigbee2mqtt"}
: ${zigbee2mqtt_group:="zigbee2mqtt"}
: ${zigbee2mqtt_data_dir:="/opt/zigbee2mqtt/data"}

load_rc_config ${name}

command=/usr/sbin/daemon
extra_commands=upgrade

export ZIGBEE2MQTT_DATA=${zigbee2mqtt_data_dir}
ZIGBEE2MQTT_DIR=/opt/zigbee2mqtt

upgrade_cmd="${name}_upgrade"
zigbee2mqtt_upgrade() {
    run_rc_command stop 2>/dev/null; _rcstop_=$?
    (cd "$ZIGBEE2MQTT_DIR" && /usr/local/bin/npm ci)
    [ $? -eq 0 ] && [ ${_rcstop_} -eq 0 ] && run_rc_command start
}

start_precmd="${name}_prestart"
zigbee2mqtt_prestart() {
    NODE=/usr/local/bin/node

    [ ! -e "${pidfile_child}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${pidfile_child}"
    [ ! -e "${pidfile}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${pidfile}"
    [ ! -e "${logfile}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${logfile}"

    rc_flags="-f -o ${logfile} -P ${pidfile} -p ${pidfile_child} $NODE ${ZIGBEE2MQTT_DIR}/cli.js ${rc_flags}"
}

stop_postcmd="${name}_poststop"
zigbee2mqtt_poststop() {
    rm -f -- "${pidfile_child}"
}
run_rc_command "$1"

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

# chmod +x /etc/rc.d/zigbee2mqtt
# service zigbee2mqtt enable
# service zigbee2mqtt start

Запускаем браузер и проверяем что всё работает по адресу http://IP_ZigBee2MQTT_Server:8080

 

Обновление ZigBee2MQTT

Для обновления до последней версии необходимо остановить сервис ZigBee2MQTT, в каталоге программы сделать резервную копию папки data:

# service zigbee2mqtt stop
# cd /opt/zigbee2mqtt/
# cp -R data data-backup
# git checkout HEAD -- npm-shrinkwrap.json

Здесь может выдать ошибку:

fatal: detected dubious ownership in repository at '/opt/zigbee2mqtt'
To add an exception for this directory, call:

        git config --global --add safe.directory /opt/zigbee2mqtt

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

# git config --global --add safe.directory /opt/zigbee2mqtt
# git checkout HEAD -- npm-shrinkwrap.json

Обновляем:

# git pull
# npm ci

Восстанавливаем из резервной копии папку data и запускаем сервис:

# cp -R data-backup/* data
# rm -rf data-backup
# service zigbee2mqtt start

 

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

Комментарии


Спасибо за статью. Подскажите, при отключении электричества пропадают устройства из z2mqtt, приходится их добавлять заново, как это можно исправить?