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 <span class="enlighter-text">-s /sbin/nologin </span>-m -w no

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

# mkdir -p /opt/zigbee2mqtt

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

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

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

# chown -R <code>zigbee2mqtt</code>:<code>zigbee2mqtt</code> /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, приходится их добавлять заново, как это можно исправить?

Сам не поборол этот глюк, если такое происходит, то восстанавливаю данные из backup.

Можно скрипт сделать, который перед запуском восстанавливал папку из резервной копии, а копии делать раз в день по cron.