Установка 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
Комментарии
Сам не поборол этот глюк, если такое происходит, то восстанавливаю данные из backup.
Можно скрипт сделать, который перед запуском восстанавливал папку из резервной копии, а копии делать раз в день по cron.